@netnodeag/kraftwerk 0.51.0 → 0.53.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.
- package/README.md +29 -1
- package/dist/cli/doctor.js +8 -1
- package/dist/config.d.ts +29 -0
- package/dist/config.js +55 -1
- package/dist/inspector/cloud.d.ts +45 -0
- package/dist/inspector/cloud.js +191 -0
- package/dist/inspector/server.js +6 -1
- package/inspector/dist/assets/{dist-QUGfjozI.js → dist-B8oWIJzY.js} +1 -1
- package/inspector/dist/assets/{dist-xXRJJEtT.js → dist-BFcHuOQz.js} +1 -1
- package/inspector/dist/assets/{dist-DpHNewhn.js → dist-BPLs6c7j.js} +1 -1
- package/inspector/dist/assets/{dist-BmB5tbY_.js → dist-BgcWJvOL.js} +1 -1
- package/inspector/dist/assets/{dist-D6lF-sHL.js → dist-By0TNvts.js} +1 -1
- package/inspector/dist/assets/{dist-DyfOMt5O.js → dist-CDBaQWyS.js} +1 -1
- package/inspector/dist/assets/{dist-XR4wyT4h.js → dist-ClX91uZD.js} +1 -1
- package/inspector/dist/assets/{dist-BblpiJH0.js → dist-D1XgLlkD.js} +1 -1
- package/inspector/dist/assets/dist-DL3AQXWU.js +1 -0
- package/inspector/dist/assets/{dist-W4qk28_7.js → dist-EWUvYLmo.js} +1 -1
- package/inspector/dist/assets/{dist-CrD_DXSI.js → dist-I5HyrrNc.js} +1 -1
- package/inspector/dist/assets/{editor-BGH3gz0m.js → editor-CejzV7Jx.js} +3 -3
- package/inspector/dist/assets/{index-CV1NZH2q.js → index-CCaRDcUF.js} +13 -13
- package/inspector/dist/assets/{index-hdTxeK_1.css → index-bMLixiwm.css} +1 -1
- package/inspector/dist/index.html +2 -2
- package/package.json +1 -1
- package/schema/kraftwerk.schema.json +29 -0
- package/inspector/dist/assets/dist-BlWgVXiH.js +0 -1
package/README.md
CHANGED
|
@@ -192,7 +192,9 @@ run-artifact directory (default `output/`), `knowledge:` the OKF bundle root
|
|
|
192
192
|
(default `knowledge/`), and `agents:` the agent-definition root (default
|
|
193
193
|
`agents/`). `repos:` turns on the [repositories](#repositories) folder.
|
|
194
194
|
`public:` and `tunnel:` expose the inspector through a
|
|
195
|
-
[Cloudflare Tunnel](#inspector-through-a-cloudflare-tunnel).
|
|
195
|
+
[Cloudflare Tunnel](#inspector-through-a-cloudflare-tunnel). `cloud:`
|
|
196
|
+
registers the instance with the
|
|
197
|
+
[kraftwerk cloud](#inspector-in-the-kraftwerk-cloud).
|
|
196
198
|
|
|
197
199
|
A `.env` next to kraftwerk.yml (`KEY=value` lines, `#` comments, quotes)
|
|
198
200
|
is loaded into every kraftwerk process at start: `kraftwerk ui` and the
|
|
@@ -404,6 +406,32 @@ Quick tunnels (`trycloudflare.com`) are deliberately not supported: Access
|
|
|
404
406
|
cannot be attached to them, which would leave the UI open to anyone with
|
|
405
407
|
the URL.
|
|
406
408
|
|
|
409
|
+
### Inspector in the kraftwerk cloud
|
|
410
|
+
|
|
411
|
+
The kraftwerk cloud is the `~/.kraftwerk` registry made reachable over the internet: every
|
|
412
|
+
instance that carries a `cloud:` block registers there when `kraftwerk ui`
|
|
413
|
+
starts and sends a heartbeat while it runs, so an admin sees every running
|
|
414
|
+
instance across machines, and a signed-in user sees their own.
|
|
415
|
+
|
|
416
|
+
```yaml
|
|
417
|
+
cloud:
|
|
418
|
+
url: https://kraftwerk.start # default
|
|
419
|
+
token: kwc_… # optional: account token from the cloud UI
|
|
420
|
+
interval: 60 # seconds between heartbeats (default 60)
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
Without a token the instance registers anonymously and is visible to cloud
|
|
424
|
+
admins only. With one (minted under "My instances" in the cloud UI; the
|
|
425
|
+
`KRAFTWERK_CLOUD_TOKEN` environment variable or `.env` keeps it out of git)
|
|
426
|
+
it shows up under that kraftwerk account. The record carries the workspace
|
|
427
|
+
name, icon and colour, the machine, the root, the version, the public URL
|
|
428
|
+
if there is one, and the agent and channel roster. The identity the cloud
|
|
429
|
+
hands out lives under `~/.kraftwerk/cloud/`, so a restart updates the record
|
|
430
|
+
rather than creating a new one; a cloud that lost its data hands out a fresh
|
|
431
|
+
identity on the next heartbeat. Registration is best-effort: a cloud that is
|
|
432
|
+
down never affects the UI, and `/api/meta` reports the connection state.
|
|
433
|
+
`kraftwerk doctor` prints what the block will do.
|
|
434
|
+
|
|
407
435
|
## Projects
|
|
408
436
|
|
|
409
437
|
Turn on `projects:` in `kraftwerk.yml` (or the checkbox in settings) and
|
package/dist/cli/doctor.js
CHANGED
|
@@ -2,7 +2,7 @@ import { spawnSync } from "node:child_process";
|
|
|
2
2
|
import { readFile } from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import chalk from "chalk";
|
|
5
|
-
import { ignoreEntryFor, isDir, publicHostFor, reposRootFor, resolveProject, tunnelFor } from "../config.js";
|
|
5
|
+
import { cloudFor, ignoreEntryFor, isDir, publicHostFor, reposRootFor, resolveProject, tunnelFor } from "../config.js";
|
|
6
6
|
import { discoverWorkflows } from "../discover.js";
|
|
7
7
|
import { missingEnv } from "../yaml.js";
|
|
8
8
|
import { applyDotenv, DOTENV_FILE } from "../dotenv.js";
|
|
@@ -167,6 +167,13 @@ export async function runDoctor(cwd) {
|
|
|
167
167
|
else
|
|
168
168
|
report("warn", "tunnel without access", "the UI has no login of its own — put a Cloudflare Access policy on the hostname and set tunnel.access so a removed policy fails closed");
|
|
169
169
|
}
|
|
170
|
+
// Cloud manager: registration is best-effort at runtime, so doctor only says what would happen.
|
|
171
|
+
const cloud = cloudFor(project);
|
|
172
|
+
if (cloud) {
|
|
173
|
+
report("ok", `cloud: ${cloud.url}`, cloud.token
|
|
174
|
+
? `registers under your kraftwerk account (${process.env.KRAFTWERK_CLOUD_TOKEN ? "KRAFTWERK_CLOUD_TOKEN" : "cloud.token"}), heartbeat every ${cloud.interval}s`
|
|
175
|
+
: `registers anonymously — visible to cloud admins only; add cloud.token (or KRAFTWERK_CLOUD_TOKEN) to see it under your account`);
|
|
176
|
+
}
|
|
170
177
|
const found = project.workflowsRoot ? await discoverWorkflows(cwd) : [];
|
|
171
178
|
if (!project.workflowsRoot) {
|
|
172
179
|
report("warn", "no workflows root", "expected src/workflows/ or workflows/ — `kraftwerk init` scaffolds one");
|
package/dist/config.d.ts
CHANGED
|
@@ -38,6 +38,10 @@
|
|
|
38
38
|
* access: # verify the Cloudflare Access login on every request that arrives via `public`
|
|
39
39
|
* team: acme # Zero Trust team name (https://<team>.cloudflareaccess.com)
|
|
40
40
|
* aud: 4714c135… # Application Audience tag of the Access application
|
|
41
|
+
* cloud: # kraftwerk cloud manager this instance registers with (absent = off, bare key = on)
|
|
42
|
+
* url: https://kraftwerk.start # where the cloud answers. Default: https://kraftwerk.start
|
|
43
|
+
* token: kwc_… # account token → the instance shows up under that kraftwerk account (or KRAFTWERK_CLOUD_TOKEN env)
|
|
44
|
+
* interval: 60 # seconds between heartbeats. Default: 60
|
|
41
45
|
*/
|
|
42
46
|
/** Stable, versionless URL of the workflow JSON schema (editor validation). */
|
|
43
47
|
export declare const SCHEMA_URL = "https://raw.githubusercontent.com/NETNODEAG/kraftwerk/main/kraftwerk/schema/workflow.schema.json";
|
|
@@ -154,6 +158,29 @@ export interface TunnelConfig {
|
|
|
154
158
|
/** Verify the Cloudflare Access token on every request that arrives via `public`. */
|
|
155
159
|
access?: AccessConfig;
|
|
156
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* Cloud manager: the kraftwerk cloud is ~/.kraftwerk made reachable over
|
|
163
|
+
* the internet — a registry of instances across machines. With this block
|
|
164
|
+
* the inspector registers on start and heartbeats while it runs, so the
|
|
165
|
+
* cloud's global view (and, with a token, the user's own account) shows
|
|
166
|
+
* this workspace, where it runs, and whether it is live.
|
|
167
|
+
*/
|
|
168
|
+
export interface CloudConfig {
|
|
169
|
+
/** false keeps the block but turns the feature off. Default: true. */
|
|
170
|
+
enabled?: boolean;
|
|
171
|
+
/** Origin of the cloud manager. Default: https://kraftwerk.start */
|
|
172
|
+
url?: string;
|
|
173
|
+
/** Account token minted in the cloud UI; links the instance to that account. KRAFTWERK_CLOUD_TOKEN wins over it. */
|
|
174
|
+
token?: string;
|
|
175
|
+
/** Seconds between heartbeats. Default: 60 (the cloud may raise it). */
|
|
176
|
+
interval?: number;
|
|
177
|
+
}
|
|
178
|
+
export declare const CLOUD_DEFAULT_URL = "https://kraftwerk.start";
|
|
179
|
+
export declare const CLOUD_DEFAULT_INTERVAL = 60;
|
|
180
|
+
/** The cloud block, defaults applied, when the feature is on; undefined otherwise. */
|
|
181
|
+
export declare function cloudFor(project: Project): (Required<Pick<CloudConfig, "url" | "interval">> & {
|
|
182
|
+
token?: string;
|
|
183
|
+
}) | undefined;
|
|
157
184
|
/** The public hostname (lowercase, no port) when `public` is set, undefined otherwise. */
|
|
158
185
|
export declare function publicHostFor(project: Project): string | undefined;
|
|
159
186
|
/** The public origin ("https://kw.example.com") when `public` is set, undefined otherwise. */
|
|
@@ -212,6 +239,8 @@ export interface ProjectConfig {
|
|
|
212
239
|
public?: string;
|
|
213
240
|
/** Cloudflare Tunnel run alongside the inspector. Absent = off. */
|
|
214
241
|
tunnel?: TunnelConfig;
|
|
242
|
+
/** kraftwerk cloud manager this instance registers with. Absent = off. */
|
|
243
|
+
cloud?: CloudConfig;
|
|
215
244
|
}
|
|
216
245
|
export interface Project {
|
|
217
246
|
/** Absolute project root the CLI operates on. */
|
package/dist/config.js
CHANGED
|
@@ -42,6 +42,10 @@ import { parse } from "yaml";
|
|
|
42
42
|
* access: # verify the Cloudflare Access login on every request that arrives via `public`
|
|
43
43
|
* team: acme # Zero Trust team name (https://<team>.cloudflareaccess.com)
|
|
44
44
|
* aud: 4714c135… # Application Audience tag of the Access application
|
|
45
|
+
* cloud: # kraftwerk cloud manager this instance registers with (absent = off, bare key = on)
|
|
46
|
+
* url: https://kraftwerk.start # where the cloud answers. Default: https://kraftwerk.start
|
|
47
|
+
* token: kwc_… # account token → the instance shows up under that kraftwerk account (or KRAFTWERK_CLOUD_TOKEN env)
|
|
48
|
+
* interval: 60 # seconds between heartbeats. Default: 60
|
|
45
49
|
*/
|
|
46
50
|
/** Stable, versionless URL of the workflow JSON schema (editor validation). */
|
|
47
51
|
export const SCHEMA_URL = "https://raw.githubusercontent.com/NETNODEAG/kraftwerk/main/kraftwerk/schema/workflow.schema.json";
|
|
@@ -95,6 +99,19 @@ export function projectsRootFor(project) {
|
|
|
95
99
|
return undefined;
|
|
96
100
|
return path.resolve(project.root, p.root ?? PROJECTS_DEFAULT_ROOT);
|
|
97
101
|
}
|
|
102
|
+
export const CLOUD_DEFAULT_URL = "https://kraftwerk.start";
|
|
103
|
+
export const CLOUD_DEFAULT_INTERVAL = 60;
|
|
104
|
+
/** The cloud block, defaults applied, when the feature is on; undefined otherwise. */
|
|
105
|
+
export function cloudFor(project) {
|
|
106
|
+
const c = project.config.cloud;
|
|
107
|
+
if (!c || c.enabled === false)
|
|
108
|
+
return undefined;
|
|
109
|
+
return {
|
|
110
|
+
url: (c.url ?? CLOUD_DEFAULT_URL).replace(/\/+$/, ""),
|
|
111
|
+
interval: c.interval ?? CLOUD_DEFAULT_INTERVAL,
|
|
112
|
+
token: process.env.KRAFTWERK_CLOUD_TOKEN || c.token || undefined,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
98
115
|
/** The public hostname (lowercase, no port) when `public` is set, undefined otherwise. */
|
|
99
116
|
export function publicHostFor(project) {
|
|
100
117
|
return project.config.public ? parsePublic(project.config.public)?.hostname : undefined;
|
|
@@ -198,7 +215,7 @@ export async function resolveProject(cwd) {
|
|
|
198
215
|
const root = gitFallback ?? start;
|
|
199
216
|
return { root, config: {}, outputDir: path.join(root, "output") };
|
|
200
217
|
}
|
|
201
|
-
const KNOWN_KEYS = ["name", "icon", "color", "port", "workflows", "output", "knowledge", "agents", "skills", "switcher", "git", "repos", "vibeables", "projects", "public", "tunnel"];
|
|
218
|
+
const KNOWN_KEYS = ["name", "icon", "color", "port", "workflows", "output", "knowledge", "agents", "skills", "switcher", "git", "repos", "vibeables", "projects", "public", "tunnel", "cloud"];
|
|
202
219
|
async function loadConfig(configPath) {
|
|
203
220
|
let raw;
|
|
204
221
|
try {
|
|
@@ -264,6 +281,11 @@ async function loadConfig(configPath) {
|
|
|
264
281
|
config[key] = {};
|
|
265
282
|
validateTunnel(configPath, config[key]);
|
|
266
283
|
}
|
|
284
|
+
else if (key === "cloud") {
|
|
285
|
+
if (config[key] === null)
|
|
286
|
+
config[key] = {};
|
|
287
|
+
validateCloud(configPath, config[key]);
|
|
288
|
+
}
|
|
267
289
|
else if (typeof config[key] !== "string") {
|
|
268
290
|
throw new Error(`${path.basename(configPath)}: ${key} must be a string`);
|
|
269
291
|
}
|
|
@@ -312,6 +334,38 @@ function validateTunnel(configPath, value) {
|
|
|
312
334
|
}
|
|
313
335
|
}
|
|
314
336
|
}
|
|
337
|
+
/** cloud: { enabled?, url?, token?, interval? } */
|
|
338
|
+
function validateCloud(configPath, value) {
|
|
339
|
+
const file = path.basename(configPath);
|
|
340
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
341
|
+
throw new Error(`${file}: cloud must be a mapping (enabled, url, token, interval)`);
|
|
342
|
+
}
|
|
343
|
+
const c = value;
|
|
344
|
+
for (const key of Object.keys(c)) {
|
|
345
|
+
if (!["enabled", "url", "token", "interval"].includes(key)) {
|
|
346
|
+
throw new Error(`${file}: cloud.${key} is unknown (allowed: enabled, url, token, interval)`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (c.enabled !== undefined && typeof c.enabled !== "boolean") {
|
|
350
|
+
throw new Error(`${file}: cloud.enabled must be true or false`);
|
|
351
|
+
}
|
|
352
|
+
if (c.url !== undefined) {
|
|
353
|
+
let ok = false;
|
|
354
|
+
try {
|
|
355
|
+
const u = new URL(String(c.url));
|
|
356
|
+
ok = typeof c.url === "string" && /^https?:$/.test(u.protocol) && !u.search && !u.hash && !u.username;
|
|
357
|
+
}
|
|
358
|
+
catch { }
|
|
359
|
+
if (!ok)
|
|
360
|
+
throw new Error(`${file}: cloud.url must be an http(s) origin like "https://kraftwerk.start"`);
|
|
361
|
+
}
|
|
362
|
+
if (c.token !== undefined && (typeof c.token !== "string" || !/^\S+$/.test(c.token))) {
|
|
363
|
+
throw new Error(`${file}: cloud.token must be the account token from the cloud UI (no whitespace)`);
|
|
364
|
+
}
|
|
365
|
+
if (c.interval !== undefined && (typeof c.interval !== "number" || !Number.isInteger(c.interval) || c.interval < 1)) {
|
|
366
|
+
throw new Error(`${file}: cloud.interval must be a positive integer (seconds between heartbeats)`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
315
369
|
function validateSwitcher(configPath, value) {
|
|
316
370
|
const file = path.basename(configPath);
|
|
317
371
|
if (!Array.isArray(value)) {
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The cloud manager client: kraftwerk.yml `cloud:` makes this instance
|
|
3
|
+
* register with the kraftwerk cloud when the inspector starts and heartbeat
|
|
4
|
+
* while it runs — the same record ~/.kraftwerk/instances holds locally,
|
|
5
|
+
* kept on a server so an admin (and, with an account token, the user)
|
|
6
|
+
* sees every instance across machines.
|
|
7
|
+
*
|
|
8
|
+
* Identity: the first registration hands out an id + secret, stored under
|
|
9
|
+
* ~/.kraftwerk/cloud/<hash(url, root)>.json and presented on every later
|
|
10
|
+
* call, so a restart updates the record instead of creating a new one.
|
|
11
|
+
* When the cloud does not recognise the id (data reset) it hands out a
|
|
12
|
+
* fresh one and the file is rewritten.
|
|
13
|
+
*
|
|
14
|
+
* Everything is best-effort: a cloud that is down never affects the UI.
|
|
15
|
+
* The status is reported in /api/meta so the UI can show it.
|
|
16
|
+
*/
|
|
17
|
+
export type CloudState = "off" | "connecting" | "connected" | "error";
|
|
18
|
+
export interface CloudStatus {
|
|
19
|
+
url: string;
|
|
20
|
+
state: CloudState;
|
|
21
|
+
/** Last error message while connecting or heartbeating. */
|
|
22
|
+
error?: string;
|
|
23
|
+
/** Instance id in the cloud once registered. */
|
|
24
|
+
id?: string;
|
|
25
|
+
/** Email of the linked kraftwerk account, when a token was presented and accepted. */
|
|
26
|
+
account?: string | null;
|
|
27
|
+
/** Effective seconds between heartbeats (the cloud may raise the configured one). */
|
|
28
|
+
interval?: number;
|
|
29
|
+
lastSeen?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare const cloudStatus: () => CloudStatus;
|
|
32
|
+
/**
|
|
33
|
+
* Start the client once the inspector listens. Resolves after the first
|
|
34
|
+
* registration attempt (success or not); the heartbeat loop runs on its
|
|
35
|
+
* own afterwards.
|
|
36
|
+
*/
|
|
37
|
+
export declare function startCloudSync(port: number, version: string): Promise<void>;
|
|
38
|
+
/** Stop the heartbeat loop (server close, tests). */
|
|
39
|
+
export declare function stopCloudSync(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Tell the cloud we are going away, so the record flips to "stopped" now
|
|
42
|
+
* instead of after the grace period. Bounded: an exit handler waits for
|
|
43
|
+
* this, and a slow cloud must not hold the process.
|
|
44
|
+
*/
|
|
45
|
+
export declare function cloudGoodbye(): Promise<void>;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { cloudFor, publicUrlFor, resolveProject } from "../config.js";
|
|
6
|
+
import { getProjectRoot } from "./context.js";
|
|
7
|
+
import { listAgents, toSummary } from "./agents.js";
|
|
8
|
+
import { listChannels, toChannelSummary } from "./channels.js";
|
|
9
|
+
import { tildify } from "./instances.js";
|
|
10
|
+
const REQUEST_TIMEOUT_MS = 8_000;
|
|
11
|
+
const GOODBYE_TIMEOUT_MS = 800;
|
|
12
|
+
let status = { url: "", state: "off" };
|
|
13
|
+
let identity = null;
|
|
14
|
+
let timer = null;
|
|
15
|
+
let stopped = false;
|
|
16
|
+
let lastRoster = "";
|
|
17
|
+
let selfPort = 0;
|
|
18
|
+
let selfVersion = "";
|
|
19
|
+
const startedAt = new Date().toISOString();
|
|
20
|
+
export const cloudStatus = () => status;
|
|
21
|
+
const cloudDir = () => path.join(os.homedir(), ".kraftwerk", "cloud");
|
|
22
|
+
const identityFile = (url, root) => path.join(cloudDir(), `${createHash("sha1").update(`${url}\n${root}`).digest("hex").slice(0, 16)}.json`);
|
|
23
|
+
async function readIdentity(file) {
|
|
24
|
+
try {
|
|
25
|
+
const rec = JSON.parse(await fs.readFile(file, "utf8"));
|
|
26
|
+
return typeof rec.id === "string" && typeof rec.secret === "string" ? { id: rec.id, secret: rec.secret } : null;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function writeIdentity(file, url, root, id) {
|
|
33
|
+
try {
|
|
34
|
+
await fs.mkdir(cloudDir(), { recursive: true });
|
|
35
|
+
await fs.writeFile(file, JSON.stringify({ ...id, url, root, updatedAt: new Date().toISOString() }), { mode: 0o600 });
|
|
36
|
+
}
|
|
37
|
+
catch { } // best-effort — the next start registers again
|
|
38
|
+
}
|
|
39
|
+
/** The agents and channels of this workspace, as the cloud lists them. */
|
|
40
|
+
async function roster() {
|
|
41
|
+
const [agents, channels] = await Promise.all([
|
|
42
|
+
listAgents().then((l) => l.map(toSummary)).catch(() => []),
|
|
43
|
+
listChannels().then((l) => l.map(toChannelSummary)).catch(() => []),
|
|
44
|
+
]);
|
|
45
|
+
return { agents, channels };
|
|
46
|
+
}
|
|
47
|
+
async function post(url, body, timeout = REQUEST_TIMEOUT_MS) {
|
|
48
|
+
const r = await fetch(url, {
|
|
49
|
+
method: "POST",
|
|
50
|
+
headers: { "content-type": "application/json", "user-agent": `kraftwerk/${selfVersion}` },
|
|
51
|
+
body: JSON.stringify(body),
|
|
52
|
+
signal: AbortSignal.timeout(timeout),
|
|
53
|
+
});
|
|
54
|
+
const text = await r.text();
|
|
55
|
+
let data;
|
|
56
|
+
try {
|
|
57
|
+
data = text ? JSON.parse(text) : {};
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
throw new Error(`${r.status} from ${url}: not JSON`);
|
|
61
|
+
}
|
|
62
|
+
if (!r.ok)
|
|
63
|
+
throw new Error(data.error ?? `${r.status} from ${url}`);
|
|
64
|
+
return data;
|
|
65
|
+
}
|
|
66
|
+
/** Register (or re-register) this instance. Returns false when the cloud refused or is unreachable. */
|
|
67
|
+
async function register() {
|
|
68
|
+
const project = await resolveProject(getProjectRoot()).catch(() => null);
|
|
69
|
+
const cloud = project ? cloudFor(project) : undefined;
|
|
70
|
+
if (!project || !cloud)
|
|
71
|
+
return false;
|
|
72
|
+
const file = identityFile(cloud.url, project.root);
|
|
73
|
+
identity ??= await readIdentity(file);
|
|
74
|
+
const { agents, channels } = await roster();
|
|
75
|
+
lastRoster = JSON.stringify({ agents, channels });
|
|
76
|
+
const body = {
|
|
77
|
+
...(identity ?? {}),
|
|
78
|
+
name: project.config.name ?? path.basename(project.root),
|
|
79
|
+
icon: project.config.icon ?? "",
|
|
80
|
+
color: project.config.color ?? "",
|
|
81
|
+
root: project.root,
|
|
82
|
+
rootLabel: tildify(project.root),
|
|
83
|
+
hostname: os.hostname(),
|
|
84
|
+
platform: `${process.platform}-${process.arch}`,
|
|
85
|
+
version: selfVersion,
|
|
86
|
+
url: `http://localhost:${selfPort}`,
|
|
87
|
+
publicUrl: publicUrlFor(project) ?? "",
|
|
88
|
+
agents,
|
|
89
|
+
channels,
|
|
90
|
+
interval: cloud.interval,
|
|
91
|
+
startedAt,
|
|
92
|
+
...(cloud.token ? { accountToken: cloud.token } : {}),
|
|
93
|
+
};
|
|
94
|
+
try {
|
|
95
|
+
const r = await post(`${cloud.url}/api/instances/register`, body);
|
|
96
|
+
if (!identity || identity.id !== r.id || identity.secret !== r.secret) {
|
|
97
|
+
identity = { id: r.id, secret: r.secret };
|
|
98
|
+
await writeIdentity(file, cloud.url, project.root, identity);
|
|
99
|
+
}
|
|
100
|
+
status = { url: cloud.url, state: "connected", id: r.id, account: r.account, interval: r.interval, lastSeen: new Date().toISOString() };
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
status = { url: cloud.url, state: "error", error: err.message, ...(identity ? { id: identity.id } : {}) };
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function heartbeat() {
|
|
109
|
+
if (!identity || status.state === "off")
|
|
110
|
+
return;
|
|
111
|
+
const { agents, channels } = await roster();
|
|
112
|
+
const rosterNow = JSON.stringify({ agents, channels });
|
|
113
|
+
const body = {
|
|
114
|
+
...identity,
|
|
115
|
+
version: selfVersion,
|
|
116
|
+
...(rosterNow !== lastRoster ? { agents, channels } : {}),
|
|
117
|
+
};
|
|
118
|
+
try {
|
|
119
|
+
const r = await post(`${status.url}/api/instances/heartbeat`, body);
|
|
120
|
+
lastRoster = rosterNow;
|
|
121
|
+
status = { ...status, state: "connected", error: undefined, interval: r.interval, lastSeen: new Date().toISOString() };
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
const message = err.message;
|
|
125
|
+
status = { ...status, state: "error", error: message };
|
|
126
|
+
// An unknown identity (the cloud lost it) is fixed by registering again, which hands out a new one.
|
|
127
|
+
if (/unknown instance|wrong instance secret|id and secret required/.test(message)) {
|
|
128
|
+
identity = null;
|
|
129
|
+
await register();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Schedule the next tick after the effective interval; a failed cloud is retried at the same cadence. */
|
|
134
|
+
function schedule() {
|
|
135
|
+
if (stopped)
|
|
136
|
+
return;
|
|
137
|
+
const seconds = status.interval && status.interval > 0 ? status.interval : 60;
|
|
138
|
+
timer = setTimeout(async () => {
|
|
139
|
+
if (status.state === "connected" || status.state === "error") {
|
|
140
|
+
if (identity)
|
|
141
|
+
await heartbeat();
|
|
142
|
+
else
|
|
143
|
+
await register();
|
|
144
|
+
}
|
|
145
|
+
schedule();
|
|
146
|
+
}, seconds * 1000);
|
|
147
|
+
timer.unref();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Start the client once the inspector listens. Resolves after the first
|
|
151
|
+
* registration attempt (success or not); the heartbeat loop runs on its
|
|
152
|
+
* own afterwards.
|
|
153
|
+
*/
|
|
154
|
+
export async function startCloudSync(port, version) {
|
|
155
|
+
selfPort = port;
|
|
156
|
+
selfVersion = version;
|
|
157
|
+
stopped = false;
|
|
158
|
+
const project = await resolveProject(getProjectRoot()).catch(() => null);
|
|
159
|
+
const cloud = project ? cloudFor(project) : undefined;
|
|
160
|
+
if (!cloud) {
|
|
161
|
+
status = { url: "", state: "off" };
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
status = { url: cloud.url, state: "connecting", interval: cloud.interval };
|
|
165
|
+
await register();
|
|
166
|
+
// Until the cloud answers, retry at the configured cadence; once it does, at what it asked for.
|
|
167
|
+
if (status.state !== "connected")
|
|
168
|
+
status.interval = cloud.interval;
|
|
169
|
+
schedule();
|
|
170
|
+
}
|
|
171
|
+
/** Stop the heartbeat loop (server close, tests). */
|
|
172
|
+
export function stopCloudSync() {
|
|
173
|
+
stopped = true;
|
|
174
|
+
if (timer)
|
|
175
|
+
clearTimeout(timer);
|
|
176
|
+
timer = null;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Tell the cloud we are going away, so the record flips to "stopped" now
|
|
180
|
+
* instead of after the grace period. Bounded: an exit handler waits for
|
|
181
|
+
* this, and a slow cloud must not hold the process.
|
|
182
|
+
*/
|
|
183
|
+
export async function cloudGoodbye() {
|
|
184
|
+
stopCloudSync();
|
|
185
|
+
if (!identity || status.state === "off" || !status.url)
|
|
186
|
+
return;
|
|
187
|
+
try {
|
|
188
|
+
await post(`${status.url}/api/instances/goodbye`, identity, GOODBYE_TIMEOUT_MS);
|
|
189
|
+
}
|
|
190
|
+
catch { }
|
|
191
|
+
}
|
package/dist/inspector/server.js
CHANGED
|
@@ -5,6 +5,7 @@ import { attachmentPath, readMeta, saveAttachment } from "./chat/store.js";
|
|
|
5
5
|
import { setOutputDir, setProjectRoot, getOutputDir, getProjectRoot } from "./context.js";
|
|
6
6
|
import { publicHostFor, publicUrlFor, resolveProject, tunnelFor } from "../config.js";
|
|
7
7
|
import { ACCESS_HEADER, verifyAccessToken } from "./access.js";
|
|
8
|
+
import { cloudGoodbye, cloudStatus, startCloudSync, stopCloudSync } from "./cloud.js";
|
|
8
9
|
import { listRuns, getRun, readRunFile, deleteRun, safeRunDir } from "./runs.js";
|
|
9
10
|
import { decide } from "./decisions.js";
|
|
10
11
|
import { canSelfUpdate, startUpdate, updateStatus } from "./update.js";
|
|
@@ -396,6 +397,7 @@ async function handleApi(req, res, url) {
|
|
|
396
397
|
vibeables: (project?.config.vibeables && project.config.vibeables.enabled !== false) === true,
|
|
397
398
|
projects: (project?.config.projects && project.config.projects.enabled !== false) === true,
|
|
398
399
|
publicUrl: (project && publicUrlFor(project)) ?? "",
|
|
400
|
+
cloud: cloudStatus(),
|
|
399
401
|
switcher,
|
|
400
402
|
});
|
|
401
403
|
}
|
|
@@ -1380,7 +1382,8 @@ export async function startInspector(opts) {
|
|
|
1380
1382
|
disposeAllDevs();
|
|
1381
1383
|
unregisterInstance();
|
|
1382
1384
|
markWorkspaceStopped();
|
|
1383
|
-
|
|
1385
|
+
// The cloud goodbye is bounded (cloudGoodbye) and a no-op without cloud:, so the exit stays prompt.
|
|
1386
|
+
void cloudGoodbye().finally(() => process.exit(sig === "SIGINT" ? 130 : 143));
|
|
1384
1387
|
});
|
|
1385
1388
|
}
|
|
1386
1389
|
process.once("exit", (code) => {
|
|
@@ -1419,11 +1422,13 @@ export async function startInspector(opts) {
|
|
|
1419
1422
|
});
|
|
1420
1423
|
return new Promise((resolve, reject) => {
|
|
1421
1424
|
server.once("error", reject);
|
|
1425
|
+
server.once("close", stopCloudSync);
|
|
1422
1426
|
server.listen(opts.port, INSPECTOR_HOST, () => {
|
|
1423
1427
|
const addr = server.address();
|
|
1424
1428
|
const port = typeof addr === "object" && addr ? addr.port : opts.port;
|
|
1425
1429
|
void registerInstance(port, getProjectRoot());
|
|
1426
1430
|
void registerWorkspace(getProjectRoot());
|
|
1431
|
+
void getPkgVersion().then((v) => startCloudSync(port, v));
|
|
1427
1432
|
resolve(server);
|
|
1428
1433
|
});
|
|
1429
1434
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e}from"./index-CV1NZH2q.js";import{C as t,D as n,F as r,L as i,R as a,Ut as o,V as s,m as c,n as l,r as ee,s as te,t as ne,u as re,vt as ie}from"./dist-H3rerbMg.js";import{n as u,t as ae}from"./dist-xXRJJEtT.js";import{a as oe,i as se,n as ce,o as le,r as d}from"./dist-CrD_DXSI.js";var ue=55,de=1,fe=56,pe=2,me=57,he=3,f=4,ge=5,p=6,m=7,h=8,g=9,_=10,_e=11,ve=12,ye=13,v=58,be=14,xe=15,y=59,b=21,Se=23,x=24,Ce=25,S=27,C=28,we=29,Te=32,Ee=35,De=37,Oe=38,ke=0,Ae=1,je={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},Me={dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},w={dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}};function Ne(e){return e==45||e==46||e==58||e>=65&&e<=90||e==95||e>=97&&e<=122||e>=161}var T=null,E=null,D=0;function O(e,t){let n=e.pos+t;if(D==n&&E==e)return T;let r=e.peek(t),i=``;for(;Ne(r);)i+=String.fromCharCode(r),r=e.peek(++t);return E=e,D=n,T=i?i.toLowerCase():r==Pe||r==Fe?void 0:null}var k=60,A=62,j=47,Pe=63,Fe=33,Ie=45;function M(e,t){this.name=e,this.parent=t}var Le=[p,_,m,h,g],Re=new ne({start:null,shift(e,t,n,r){return Le.indexOf(t)>-1?new M(O(r,1)||``,e):e},reduce(e,t){return t==b&&e?e.parent:e},reuse(e,t,n,r){let i=t.type.id;return i==p||i==De?new M(O(r,1)||``,e):e},strict:!1}),ze=new l((e,t)=>{if(e.next!=k){e.next<0&&t.context&&e.acceptToken(v);return}e.advance();let n=e.next==j;n&&e.advance();let r=O(e,0);if(r===void 0)return;if(!r)return e.acceptToken(n?xe:be);let i=t.context?t.context.name:null;if(n){if(r==i)return e.acceptToken(_e);if(i&&Me[i])return e.acceptToken(v,-2);if(t.dialectEnabled(ke))return e.acceptToken(ve);for(let e=t.context;e;e=e.parent)if(e.name==r)return;e.acceptToken(ye)}else{if(r==`script`)return e.acceptToken(m);if(r==`style`)return e.acceptToken(h);if(r==`textarea`)return e.acceptToken(g);if(je.hasOwnProperty(r))return e.acceptToken(_);i&&w[i]&&w[i][r]?e.acceptToken(v,-1):e.acceptToken(p)}},{contextual:!0}),Be=new l(e=>{for(let t=0,n=0;;n++){if(e.next<0){n&&e.acceptToken(y);break}if(e.next==Ie)t++;else if(e.next==A&&t>=2){n>=3&&e.acceptToken(y,-2);break}else t=0;e.advance()}});function Ve(e){for(;e;e=e.parent)if(e.name==`svg`||e.name==`math`)return!0;return!1}var He=new l((e,t)=>{if(e.next==j&&e.peek(1)==A){let n=t.dialectEnabled(Ae)||Ve(t.context);e.acceptToken(n?ge:f,2)}else e.next==A&&e.acceptToken(f,1)});function N(e,t,n){let r=2+e.length;return new l(i=>{for(let a=0,o=0,s=0;;s++){if(i.next<0){s&&i.acceptToken(t);break}if(a==0&&i.next==k||a==1&&i.next==j||a>=2&&a<r&&i.next==e.charCodeAt(a-2))a++,o++;else if(a==r&&i.next==A){s>o?i.acceptToken(t,-o):i.acceptToken(n,-(o-2));break}else if((i.next==10||i.next==13)&&s){i.acceptToken(t,1);break}else a=o=0;i.advance()}})}var Ue=N(`script`,ue,de),We=N(`style`,fe,pe),Ge=N(`textarea`,me,he),Ke=i({"Text RawText IncompleteTag IncompleteCloseTag":a.content,"StartTag StartCloseTag SelfClosingEndTag EndTag":a.angleBracket,TagName:a.tagName,"MismatchedCloseTag/TagName":[a.tagName,a.invalid],AttributeName:a.attributeName,"AttributeValue UnquotedAttributeValue":a.attributeValue,Is:a.definitionOperator,"EntityReference CharacterReference":a.character,Comment:a.blockComment,ProcessingInst:a.processingInstruction,DoctypeDecl:a.documentMeta}),qe=ee.deserialize({version:14,states:",xOVO!rOOO!ZQ#tO'#CrO!`Q#tO'#C{O!eQ#tO'#DOO!jQ#tO'#DRO!oQ#tO'#DTO!tOaO'#CqO#PObO'#CqO#[OdO'#CqO$kO!rO'#CqOOO`'#Cq'#CqO$rO$fO'#DUO$zQ#tO'#DWO%PQ#tO'#DXOOO`'#Dl'#DlOOO`'#DZ'#DZQVO!rOOO%UQ&rO,59^O%aQ&rO,59gO%lQ&rO,59jO%wQ&rO,59mO&SQ&rO,59oOOOa'#D_'#D_O&_OaO'#CyO&jOaO,59]OOOb'#D`'#D`O&rObO'#C|O&}ObO,59]OOOd'#Da'#DaO'VOdO'#DPO'bOdO,59]OOO`'#Db'#DbO'jO!rO,59]O'qQ#tO'#DSOOO`,59],59]OOOp'#Dc'#DcO'vO$fO,59pOOO`,59p,59pO(OQ#|O,59rO(TQ#|O,59sOOO`-E7X-E7XO(YQ&rO'#CtOOQW'#D['#D[O(hQ&rO1G.xOOOa1G.x1G.xOOO`1G/Z1G/ZO(sQ&rO1G/ROOOb1G/R1G/RO)OQ&rO1G/UOOOd1G/U1G/UO)ZQ&rO1G/XOOO`1G/X1G/XO)fQ&rO1G/ZOOOa-E7]-E7]O)qQ#tO'#CzOOO`1G.w1G.wOOOb-E7^-E7^O)vQ#tO'#C}OOOd-E7_-E7_O){Q#tO'#DQOOO`-E7`-E7`O*QQ#|O,59nOOOp-E7a-E7aOOO`1G/[1G/[OOO`1G/^1G/^OOO`1G/_1G/_O*VQ,UO,59`OOQW-E7Y-E7YOOOa7+$d7+$dOOO`7+$u7+$uOOOb7+$m7+$mOOOd7+$p7+$pOOO`7+$s7+$sO*bQ#|O,59fO*gQ#|O,59iO*lQ#|O,59lOOO`1G/Y1G/YO*qO7[O'#CwO+SOMhO'#CwOOQW1G.z1G.zOOO`1G/Q1G/QOOO`1G/T1G/TOOO`1G/W1G/WOOOO'#D]'#D]O+eO7[O,59cOOQW,59c,59cOOOO'#D^'#D^O+vOMhO,59cOOOO-E7Z-E7ZOOQW1G.}1G.}OOOO-E7[-E7[",stateData:`,c~O!_OS~OUSOVPOWQOXROYTO[]O][O^^O_^Oa^Ob^Oc^Od^Oy^O|_O!eZO~OgaO~OgbO~OgcO~OgdO~OgeO~O!XfOPmP![mP~O!YiOQpP![pP~O!ZlORsP![sP~OUSOVPOWQOXROYTOZqO[]O][O^^O_^Oa^Ob^Oc^Od^Oy^O!eZO~O![rO~P#gO!]sO!fuO~OgvO~OgwO~OS|OT}OiyO~OS!POT}OiyO~OS!ROT}OiyO~OS!TOT}OiyO~OS}OT}OiyO~O!XfOPmX![mX~OP!WO![!XO~O!YiOQpX![pX~OQ!ZO![!XO~O!ZlORsX![sX~OR!]O![!XO~O![!XO~P#gOg!_O~O!]sO!f!aO~OS!bO~OS!cO~Oj!dOShXThXihX~OS!fOT!gOiyO~OS!hOT!gOiyO~OS!iOT!gOiyO~OS!jOT!gOiyO~OS!gOT!gOiyO~Og!kO~Og!lO~Og!mO~OS!nO~Ol!qO!a!oO!c!pO~OS!rO~OS!sO~OS!tO~Ob!uOc!uOd!uO!a!wO!b!uO~Ob!xOc!xOd!xO!c!wO!d!xO~Ob!uOc!uOd!uO!a!{O!b!uO~Ob!xOc!xOd!xO!c!{O!d!xO~OT~cbd!ey|!e~`,goto:"%q!aPPPPPPPPPPPPPPPPPPPPP!b!hP!nPP!zP!}#Q#T#Z#^#a#g#j#m#s#y!bP!b!bP$P$V$m$s$y%P%V%]%cPPPPPPPP%iX^OX`pXUOX`pezabcde{!O!Q!S!UR!q!dRhUR!XhXVOX`pRkVR!XkXWOX`pRnWR!XnXXOX`pQrXR!XpXYOX`pQ`ORx`Q{aQ!ObQ!QcQ!SdQ!UeZ!e{!O!Q!S!UQ!v!oR!z!vQ!y!pR!|!yQgUR!VgQjVR!YjQmWR![mQpXR!^pQtZR!`tS_O`ToXp",nodeNames:`⚠ StartCloseTag StartCloseTag StartCloseTag EndTag SelfClosingEndTag StartTag StartTag StartTag StartTag StartTag StartCloseTag StartCloseTag StartCloseTag IncompleteTag IncompleteCloseTag Document Text EntityReference CharacterReference InvalidEntity Element OpenTag TagName Attribute AttributeName Is AttributeValue UnquotedAttributeValue ScriptText CloseTag OpenTag StyleText CloseTag OpenTag TextareaText CloseTag OpenTag CloseTag SelfClosingTag Comment ProcessingInst MismatchedCloseTag CloseTag DoctypeDecl`,maxTerm:68,context:Re,nodeProps:[[`closedBy`,-10,1,2,3,7,8,9,10,11,12,13,`EndTag`,6,`EndTag SelfClosingEndTag`,-4,22,31,34,37,`CloseTag`],[`openedBy`,4,`StartTag StartCloseTag`,5,`StartTag`,-4,30,33,36,38,`OpenTag`],[`group`,-10,14,15,18,19,20,21,40,41,42,43,`Entity`,17,`Entity TextContent`,-3,29,32,35,`TextContent Entity`],[`isolate`,-11,22,30,31,33,34,36,37,38,39,42,43,`ltr`,-3,27,28,40,``]],propSources:[Ke],skippedNodes:[0],repeatNodeCount:9,tokenData:"!<p!aR!YOX$qXY,QYZ,QZ[$q[]&X]^,Q^p$qpq,Qqr-_rs3_sv-_vw3}wxHYx}-_}!OH{!O!P-_!P!Q$q!Q![-_![!]Mz!]!^-_!^!_!$S!_!`!;x!`!a&X!a!c-_!c!}Mz!}#R-_#R#SMz#S#T1k#T#oMz#o#s-_#s$f$q$f%W-_%W%oMz%o%p-_%p&aMz&a&b-_&b1pMz1p4U-_4U4dMz4d4e-_4e$ISMz$IS$I`-_$I`$IbMz$Ib$Kh-_$Kh%#tMz%#t&/x-_&/x&EtMz&Et&FV-_&FV;'SMz;'S;:j!#|;:j;=`3X<%l?&r-_?&r?AhMz?Ah?BY$q?BY?MnMz?MnO$q!Z$|caPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr$qrs&}sv$qvw+Pwx(tx!^$q!^!_*V!_!a&X!a#S$q#S#T&X#T;'S$q;'S;=`+z<%lO$q!R&bXaP!b`!dpOr&Xrs&}sv&Xwx(tx!^&X!^!_*V!_;'S&X;'S;=`*y<%lO&Xq'UVaP!dpOv&}wx'kx!^&}!^!_(V!_;'S&};'S;=`(n<%lO&}P'pTaPOv'kw!^'k!_;'S'k;'S;=`(P<%lO'kP(SP;=`<%l'kp([S!dpOv(Vx;'S(V;'S;=`(h<%lO(Vp(kP;=`<%l(Vq(qP;=`<%l&}a({WaP!b`Or(trs'ksv(tw!^(t!^!_)e!_;'S(t;'S;=`*P<%lO(t`)jT!b`Or)esv)ew;'S)e;'S;=`)y<%lO)e`)|P;=`<%l)ea*SP;=`<%l(t!Q*^V!b`!dpOr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!Q*vP;=`<%l*V!R*|P;=`<%l&XW+UYlWOX+PZ[+P^p+Pqr+Psw+Px!^+P!a#S+P#T;'S+P;'S;=`+t<%lO+PW+wP;=`<%l+P!Z+}P;=`<%l$q!a,]`aP!b`!dp!_^OX&XXY,QYZ,QZ]&X]^,Q^p&Xpq,Qqr&Xrs&}sv&Xwx(tx!^&X!^!_*V!_;'S&X;'S;=`*y<%lO&X!_-ljiSaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx!P-_!P!Q$q!Q!^-_!^!_*V!_!a&X!a#S-_#S#T1k#T#s-_#s$f$q$f;'S-_;'S;=`3X<%l?Ah-_?Ah?BY$q?BY?Mn-_?MnO$q[/ebiSlWOX+PZ[+P^p+Pqr/^sw/^x!P/^!P!Q+P!Q!^/^!a#S/^#S#T0m#T#s/^#s$f+P$f;'S/^;'S;=`1e<%l?Ah/^?Ah?BY+P?BY?Mn/^?MnO+PS0rXiSqr0msw0mx!P0m!Q!^0m!a#s0m$f;'S0m;'S;=`1_<%l?Ah0m?BY?Mn0mS1bP;=`<%l0m[1hP;=`<%l/^!V1vciSaP!b`!dpOq&Xqr1krs&}sv1kvw0mwx(tx!P1k!P!Q&X!Q!^1k!^!_*V!_!a&X!a#s1k#s$f&X$f;'S1k;'S;=`3R<%l?Ah1k?Ah?BY&X?BY?Mn1k?MnO&X!V3UP;=`<%l1k!_3[P;=`<%l-_!Z3hV!ahaP!dpOv&}wx'kx!^&}!^!_(V!_;'S&};'S;=`(n<%lO&}!_4WiiSlWd!ROX5uXZ7SZ[5u[^7S^p5uqr8trs7Sst>]tw8twx7Sx!P8t!P!Q5u!Q!]8t!]!^/^!^!a7S!a#S8t#S#T;{#T#s8t#s$f5u$f;'S8t;'S;=`>V<%l?Ah8t?Ah?BY5u?BY?Mn8t?MnO5u!Z5zblWOX5uXZ7SZ[5u[^7S^p5uqr5urs7Sst+Ptw5uwx7Sx!]5u!]!^7w!^!a7S!a#S5u#S#T7S#T;'S5u;'S;=`8n<%lO5u!R7VVOp7Sqs7St!]7S!]!^7l!^;'S7S;'S;=`7q<%lO7S!R7qOb!R!R7tP;=`<%l7S!Z8OYlWb!ROX+PZ[+P^p+Pqr+Psw+Px!^+P!a#S+P#T;'S+P;'S;=`+t<%lO+P!Z8qP;=`<%l5u!_8{iiSlWOX5uXZ7SZ[5u[^7S^p5uqr8trs7Sst/^tw8twx7Sx!P8t!P!Q5u!Q!]8t!]!^:j!^!a7S!a#S8t#S#T;{#T#s8t#s$f5u$f;'S8t;'S;=`>V<%l?Ah8t?Ah?BY5u?BY?Mn8t?MnO5u!_:sbiSlWb!ROX+PZ[+P^p+Pqr/^sw/^x!P/^!P!Q+P!Q!^/^!a#S/^#S#T0m#T#s/^#s$f+P$f;'S/^;'S;=`1e<%l?Ah/^?Ah?BY+P?BY?Mn/^?MnO+P!V<QciSOp7Sqr;{rs7Sst0mtw;{wx7Sx!P;{!P!Q7S!Q!];{!]!^=]!^!a7S!a#s;{#s$f7S$f;'S;{;'S;=`>P<%l?Ah;{?Ah?BY7S?BY?Mn;{?MnO7S!V=dXiSb!Rqr0msw0mx!P0m!Q!^0m!a#s0m$f;'S0m;'S;=`1_<%l?Ah0m?BY?Mn0m!V>SP;=`<%l;{!_>YP;=`<%l8t!_>dhiSlWOX@OXZAYZ[@O[^AY^p@OqrBwrsAYswBwwxAYx!PBw!P!Q@O!Q!]Bw!]!^/^!^!aAY!a#SBw#S#TE{#T#sBw#s$f@O$f;'SBw;'S;=`HS<%l?AhBw?Ah?BY@O?BY?MnBw?MnO@O!Z@TalWOX@OXZAYZ[@O[^AY^p@Oqr@OrsAYsw@OwxAYx!]@O!]!^Az!^!aAY!a#S@O#S#TAY#T;'S@O;'S;=`Bq<%lO@O!RA]UOpAYq!]AY!]!^Ao!^;'SAY;'S;=`At<%lOAY!RAtOc!R!RAwP;=`<%lAY!ZBRYlWc!ROX+PZ[+P^p+Pqr+Psw+Px!^+P!a#S+P#T;'S+P;'S;=`+t<%lO+P!ZBtP;=`<%l@O!_COhiSlWOX@OXZAYZ[@O[^AY^p@OqrBwrsAYswBwwxAYx!PBw!P!Q@O!Q!]Bw!]!^Dj!^!aAY!a#SBw#S#TE{#T#sBw#s$f@O$f;'SBw;'S;=`HS<%l?AhBw?Ah?BY@O?BY?MnBw?MnO@O!_DsbiSlWc!ROX+PZ[+P^p+Pqr/^sw/^x!P/^!P!Q+P!Q!^/^!a#S/^#S#T0m#T#s/^#s$f+P$f;'S/^;'S;=`1e<%l?Ah/^?Ah?BY+P?BY?Mn/^?MnO+P!VFQbiSOpAYqrE{rsAYswE{wxAYx!PE{!P!QAY!Q!]E{!]!^GY!^!aAY!a#sE{#s$fAY$f;'SE{;'S;=`G|<%l?AhE{?Ah?BYAY?BY?MnE{?MnOAY!VGaXiSc!Rqr0msw0mx!P0m!Q!^0m!a#s0m$f;'S0m;'S;=`1_<%l?Ah0m?BY?Mn0m!VHPP;=`<%lE{!_HVP;=`<%lBw!ZHcW!cxaP!b`Or(trs'ksv(tw!^(t!^!_)e!_;'S(t;'S;=`*P<%lO(t!aIYliSaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx}-_}!OKQ!O!P-_!P!Q$q!Q!^-_!^!_*V!_!a&X!a#S-_#S#T1k#T#s-_#s$f$q$f;'S-_;'S;=`3X<%l?Ah-_?Ah?BY$q?BY?Mn-_?MnO$q!aK_kiSaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx!P-_!P!Q$q!Q!^-_!^!_*V!_!`&X!`!aMS!a#S-_#S#T1k#T#s-_#s$f$q$f;'S-_;'S;=`3X<%l?Ah-_?Ah?BY$q?BY?Mn-_?MnO$q!TM_XaP!b`!dp!fQOr&Xrs&}sv&Xwx(tx!^&X!^!_*V!_;'S&X;'S;=`*y<%lO&X!aNZ!ZiSgQaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx}-_}!OMz!O!PMz!P!Q$q!Q![Mz![!]Mz!]!^-_!^!_*V!_!a&X!a!c-_!c!}Mz!}#R-_#R#SMz#S#T1k#T#oMz#o#s-_#s$f$q$f$}-_$}%OMz%O%W-_%W%oMz%o%p-_%p&aMz&a&b-_&b1pMz1p4UMz4U4dMz4d4e-_4e$ISMz$IS$I`-_$I`$IbMz$Ib$Je-_$Je$JgMz$Jg$Kh-_$Kh%#tMz%#t&/x-_&/x&EtMz&Et&FV-_&FV;'SMz;'S;:j!#|;:j;=`3X<%l?&r-_?&r?AhMz?Ah?BY$q?BY?MnMz?MnO$q!a!$PP;=`<%lMz!R!$ZY!b`!dpOq*Vqr!$yrs(Vsv*Vwx)ex!a*V!a!b!4t!b;'S*V;'S;=`*s<%lO*V!R!%Q]!b`!dpOr*Vrs(Vsv*Vwx)ex}*V}!O!%y!O!f*V!f!g!']!g#W*V#W#X!0`#X;'S*V;'S;=`*s<%lO*V!R!&QX!b`!dpOr*Vrs(Vsv*Vwx)ex}*V}!O!&m!O;'S*V;'S;=`*s<%lO*V!R!&vV!b`!dp!ePOr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!R!'dX!b`!dpOr*Vrs(Vsv*Vwx)ex!q*V!q!r!(P!r;'S*V;'S;=`*s<%lO*V!R!(WX!b`!dpOr*Vrs(Vsv*Vwx)ex!e*V!e!f!(s!f;'S*V;'S;=`*s<%lO*V!R!(zX!b`!dpOr*Vrs(Vsv*Vwx)ex!v*V!v!w!)g!w;'S*V;'S;=`*s<%lO*V!R!)nX!b`!dpOr*Vrs(Vsv*Vwx)ex!{*V!{!|!*Z!|;'S*V;'S;=`*s<%lO*V!R!*bX!b`!dpOr*Vrs(Vsv*Vwx)ex!r*V!r!s!*}!s;'S*V;'S;=`*s<%lO*V!R!+UX!b`!dpOr*Vrs(Vsv*Vwx)ex!g*V!g!h!+q!h;'S*V;'S;=`*s<%lO*V!R!+xY!b`!dpOr!+qrs!,hsv!+qvw!-Swx!.[x!`!+q!`!a!/j!a;'S!+q;'S;=`!0Y<%lO!+qq!,mV!dpOv!,hvx!-Sx!`!,h!`!a!-q!a;'S!,h;'S;=`!.U<%lO!,hP!-VTO!`!-S!`!a!-f!a;'S!-S;'S;=`!-k<%lO!-SP!-kO|PP!-nP;=`<%l!-Sq!-xS!dp|POv(Vx;'S(V;'S;=`(h<%lO(Vq!.XP;=`<%l!,ha!.aX!b`Or!.[rs!-Ssv!.[vw!-Sw!`!.[!`!a!.|!a;'S!.[;'S;=`!/d<%lO!.[a!/TT!b`|POr)esv)ew;'S)e;'S;=`)y<%lO)ea!/gP;=`<%l!.[!R!/sV!b`!dp|POr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!R!0]P;=`<%l!+q!R!0gX!b`!dpOr*Vrs(Vsv*Vwx)ex#c*V#c#d!1S#d;'S*V;'S;=`*s<%lO*V!R!1ZX!b`!dpOr*Vrs(Vsv*Vwx)ex#V*V#V#W!1v#W;'S*V;'S;=`*s<%lO*V!R!1}X!b`!dpOr*Vrs(Vsv*Vwx)ex#h*V#h#i!2j#i;'S*V;'S;=`*s<%lO*V!R!2qX!b`!dpOr*Vrs(Vsv*Vwx)ex#m*V#m#n!3^#n;'S*V;'S;=`*s<%lO*V!R!3eX!b`!dpOr*Vrs(Vsv*Vwx)ex#d*V#d#e!4Q#e;'S*V;'S;=`*s<%lO*V!R!4XX!b`!dpOr*Vrs(Vsv*Vwx)ex#X*V#X#Y!+q#Y;'S*V;'S;=`*s<%lO*V!R!4{Y!b`!dpOr!4trs!5ksv!4tvw!6Vwx!8]x!a!4t!a!b!:]!b;'S!4t;'S;=`!;r<%lO!4tq!5pV!dpOv!5kvx!6Vx!a!5k!a!b!7W!b;'S!5k;'S;=`!8V<%lO!5kP!6YTO!a!6V!a!b!6i!b;'S!6V;'S;=`!7Q<%lO!6VP!6lTO!`!6V!`!a!6{!a;'S!6V;'S;=`!7Q<%lO!6VP!7QOyPP!7TP;=`<%l!6Vq!7]V!dpOv!5kvx!6Vx!`!5k!`!a!7r!a;'S!5k;'S;=`!8V<%lO!5kq!7yS!dpyPOv(Vx;'S(V;'S;=`(h<%lO(Vq!8YP;=`<%l!5ka!8bX!b`Or!8]rs!6Vsv!8]vw!6Vw!a!8]!a!b!8}!b;'S!8];'S;=`!:V<%lO!8]a!9SX!b`Or!8]rs!6Vsv!8]vw!6Vw!`!8]!`!a!9o!a;'S!8];'S;=`!:V<%lO!8]a!9vT!b`yPOr)esv)ew;'S)e;'S;=`)y<%lO)ea!:YP;=`<%l!8]!R!:dY!b`!dpOr!4trs!5ksv!4tvw!6Vwx!8]x!`!4t!`!a!;S!a;'S!4t;'S;=`!;r<%lO!4t!R!;]V!b`!dpyPOr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!R!;uP;=`<%l!4t!V!<TXjSaP!b`!dpOr&Xrs&}sv&Xwx(tx!^&X!^!_*V!_;'S&X;'S;=`*y<%lO&X",tokenizers:[Ue,We,Ge,He,ze,Be,0,1,2,3,4,5],topRules:{Document:[0,16]},dialects:{noMatch:0,selfClosing:515},tokenPrec:517});function P(e,t){let n=Object.create(null);for(let r of e.getChildren(x)){let e=r.getChild(Ce),i=r.getChild(S)||r.getChild(C);e&&(n[t.read(e.from,e.to)]=i?i.type.id==S?t.read(i.from+1,i.to-1):t.read(i.from,i.to):``)}return n}function Je(e,t){let n=e.getChild(Se);return n?t.read(n.from,n.to):` `}function F(e,t,n){let r;for(let i of n)if(!i.attrs||i.attrs(r||=P(e.node.parent.firstChild,t)))return{parser:i.parser,bracketed:!0};return null}function I(e=[],t=[]){let n=[],r=[],i=[],a=[];for(let t of e)(t.tag==`script`?n:t.tag==`style`?r:t.tag==`textarea`?i:a).push(t);let s=t.length?Object.create(null):null;for(let e of t)(s[e.name]||(s[e.name]=[])).push(e);return o((e,t)=>{let o=e.type.id;if(o==we)return F(e,t,n);if(o==Te)return F(e,t,r);if(o==Ee)return F(e,t,i);if(o==b&&a.length){let n=e.node,r=n.firstChild,i=r&&Je(r,t),o;if(i){for(let e of a)if(e.tag==i&&(!e.attrs||e.attrs(o||=P(r,t)))){let t=n.lastChild,i=t.type.id==Oe?t.from:n.to;if(i>r.to)return{parser:e.parser,overlay:[{from:r.to,to:i}]}}}}if(s&&o==x){let n=e.node,r;if(r=n.firstChild){let e=s[t.read(r.from,r.to)];if(e)for(let r of e){if(r.tagName&&r.tagName!=Je(n.parent,t))continue;let e=n.lastChild;if(e.type.id==S){let t=e.from+1,n=e.lastChild,i=e.to-(n&&n.isError?0:1);if(i>t)return{parser:r.parser,overlay:[{from:t,to:i}],bracketed:!0}}else if(e.type.id==C)return{parser:r.parser,overlay:[{from:e.from,to:e.to}]}}}}return null})}var Ye=e({autoCloseTags:()=>ut,html:()=>st,htmlCompletionSource:()=>tt,htmlCompletionSourceWith:()=>nt,htmlLanguage:()=>$}),L=[`_blank`,`_self`,`_top`,`_parent`],R=[`ascii`,`utf-8`,`utf-16`,`latin1`,`latin1`],z=[`get`,`post`,`put`,`delete`],B=[`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`],V=[`true`,`false`],H={},Xe={a:{attrs:{href:null,ping:null,type:null,media:null,target:L,hreflang:null}},abbr:H,address:H,area:{attrs:{alt:null,coords:null,href:null,target:null,ping:null,media:null,hreflang:null,type:null,shape:[`default`,`rect`,`circle`,`poly`]}},article:H,aside:H,audio:{attrs:{src:null,mediagroup:null,crossorigin:[`anonymous`,`use-credentials`],preload:[`none`,`metadata`,`auto`],autoplay:[`autoplay`],loop:[`loop`],controls:[`controls`]}},b:H,base:{attrs:{href:null,target:L}},bdi:H,bdo:H,blockquote:{attrs:{cite:null}},body:H,br:H,button:{attrs:{form:null,formaction:null,name:null,value:null,autofocus:[`autofocus`],disabled:[`autofocus`],formenctype:B,formmethod:z,formnovalidate:[`novalidate`],formtarget:L,type:[`submit`,`reset`,`button`]}},canvas:{attrs:{width:null,height:null}},caption:H,center:H,cite:H,code:H,col:{attrs:{span:null}},colgroup:{attrs:{span:null}},command:{attrs:{type:[`command`,`checkbox`,`radio`],label:null,icon:null,radiogroup:null,command:null,title:null,disabled:[`disabled`],checked:[`checked`]}},data:{attrs:{value:null}},datagrid:{attrs:{disabled:[`disabled`],multiple:[`multiple`]}},datalist:{attrs:{data:null}},dd:H,del:{attrs:{cite:null,datetime:null}},details:{attrs:{open:[`open`]}},dfn:H,div:H,dl:H,dt:H,em:H,embed:{attrs:{src:null,type:null,width:null,height:null}},eventsource:{attrs:{src:null}},fieldset:{attrs:{disabled:[`disabled`],form:null,name:null}},figcaption:H,figure:H,footer:H,form:{attrs:{action:null,name:null,"accept-charset":R,autocomplete:[`on`,`off`],enctype:B,method:z,novalidate:[`novalidate`],target:L}},h1:H,h2:H,h3:H,h4:H,h5:H,h6:H,head:{children:[`title`,`base`,`link`,`style`,`meta`,`script`,`noscript`,`command`]},header:H,hgroup:H,hr:H,html:{attrs:{manifest:null}},i:H,iframe:{attrs:{src:null,srcdoc:null,name:null,width:null,height:null,sandbox:[`allow-top-navigation`,`allow-same-origin`,`allow-forms`,`allow-scripts`],seamless:[`seamless`]}},img:{attrs:{alt:null,src:null,ismap:null,usemap:null,width:null,height:null,crossorigin:[`anonymous`,`use-credentials`]}},input:{attrs:{alt:null,dirname:null,form:null,formaction:null,height:null,list:null,max:null,maxlength:null,min:null,name:null,pattern:null,placeholder:null,size:null,src:null,step:null,value:null,width:null,accept:[`audio/*`,`video/*`,`image/*`],autocomplete:[`on`,`off`],autofocus:[`autofocus`],checked:[`checked`],disabled:[`disabled`],formenctype:B,formmethod:z,formnovalidate:[`novalidate`],formtarget:L,multiple:[`multiple`],readonly:[`readonly`],required:[`required`],type:[`hidden`,`text`,`search`,`tel`,`url`,`email`,`password`,`datetime`,`date`,`month`,`week`,`time`,`datetime-local`,`number`,`range`,`color`,`checkbox`,`radio`,`file`,`submit`,`image`,`reset`,`button`]}},ins:{attrs:{cite:null,datetime:null}},kbd:H,keygen:{attrs:{challenge:null,form:null,name:null,autofocus:[`autofocus`],disabled:[`disabled`],keytype:[`RSA`]}},label:{attrs:{for:null,form:null}},legend:H,li:{attrs:{value:null}},link:{attrs:{href:null,type:null,hreflang:null,media:null,sizes:[`all`,`16x16`,`16x16 32x32`,`16x16 32x32 64x64`]}},map:{attrs:{name:null}},mark:H,menu:{attrs:{label:null,type:[`list`,`context`,`toolbar`]}},meta:{attrs:{content:null,charset:R,name:[`viewport`,`application-name`,`author`,`description`,`generator`,`keywords`],"http-equiv":[`content-language`,`content-type`,`default-style`,`refresh`]}},meter:{attrs:{value:null,min:null,low:null,high:null,max:null,optimum:null}},nav:H,noscript:H,object:{attrs:{data:null,type:null,name:null,usemap:null,form:null,width:null,height:null,typemustmatch:[`typemustmatch`]}},ol:{attrs:{reversed:[`reversed`],start:null,type:[`1`,`a`,`A`,`i`,`I`]},children:[`li`,`script`,`template`,`ul`,`ol`]},optgroup:{attrs:{disabled:[`disabled`],label:null}},option:{attrs:{disabled:[`disabled`],label:null,selected:[`selected`],value:null}},output:{attrs:{for:null,form:null,name:null}},p:H,param:{attrs:{name:null,value:null}},pre:H,progress:{attrs:{value:null,max:null}},q:{attrs:{cite:null}},rp:H,rt:H,ruby:H,samp:H,script:{attrs:{type:[`text/javascript`],src:null,async:[`async`],defer:[`defer`],charset:R}},section:H,select:{attrs:{form:null,name:null,size:null,autofocus:[`autofocus`],disabled:[`disabled`],multiple:[`multiple`]}},slot:{attrs:{name:null}},small:H,source:{attrs:{src:null,type:null,media:null}},span:H,strong:H,style:{attrs:{type:[`text/css`],media:null,scoped:null}},sub:H,summary:H,sup:H,table:H,tbody:H,td:{attrs:{colspan:null,rowspan:null,headers:null}},template:H,textarea:{attrs:{dirname:null,form:null,maxlength:null,name:null,placeholder:null,rows:null,cols:null,autofocus:[`autofocus`],disabled:[`disabled`],readonly:[`readonly`],required:[`required`],wrap:[`soft`,`hard`]}},tfoot:H,th:{attrs:{colspan:null,rowspan:null,headers:null,scope:[`row`,`col`,`rowgroup`,`colgroup`]}},thead:H,time:{attrs:{datetime:null}},title:H,tr:H,track:{attrs:{src:null,label:null,default:null,kind:[`subtitles`,`captions`,`descriptions`,`chapters`,`metadata`],srclang:null}},ul:{children:[`li`,`script`,`template`,`ul`,`ol`]},var:H,video:{attrs:{src:null,poster:null,width:null,height:null,crossorigin:[`anonymous`,`use-credentials`],preload:[`auto`,`metadata`,`none`],autoplay:[`autoplay`],mediagroup:[`movie`],muted:[`muted`],controls:[`controls`]}},wbr:H},U={accesskey:null,class:null,contenteditable:V,contextmenu:null,dir:[`ltr`,`rtl`,`auto`],draggable:[`true`,`false`,`auto`],dropzone:[`copy`,`move`,`link`,`string:`,`file:`],hidden:[`hidden`],id:null,inert:[`inert`],itemid:null,itemprop:null,itemref:null,itemscope:[`itemscope`],itemtype:null,lang:[`ar`,`bn`,`de`,`en-GB`,`en-US`,`es`,`fr`,`hi`,`id`,`ja`,`pa`,`pt`,`ru`,`tr`,`zh`],spellcheck:V,autocorrect:V,autocapitalize:V,style:null,tabindex:null,title:null,translate:[`yes`,`no`],rel:[`stylesheet`,`alternate`,`author`,`bookmark`,`help`,`license`,`next`,`nofollow`,`noreferrer`,`prefetch`,`prev`,`search`,`tag`],role:`alert application article banner button cell checkbox complementary contentinfo dialog document feed figure form grid gridcell heading img list listbox listitem main navigation region row rowgroup search switch tab table tabpanel textbox timer`.split(` `),"aria-activedescendant":null,"aria-atomic":V,"aria-autocomplete":[`inline`,`list`,`both`,`none`],"aria-busy":V,"aria-checked":[`true`,`false`,`mixed`,`undefined`],"aria-controls":null,"aria-describedby":null,"aria-disabled":V,"aria-dropeffect":null,"aria-expanded":[`true`,`false`,`undefined`],"aria-flowto":null,"aria-grabbed":[`true`,`false`,`undefined`],"aria-haspopup":V,"aria-hidden":V,"aria-invalid":[`true`,`false`,`grammar`,`spelling`],"aria-label":null,"aria-labelledby":null,"aria-level":null,"aria-live":[`off`,`polite`,`assertive`],"aria-multiline":V,"aria-multiselectable":V,"aria-owns":null,"aria-posinset":null,"aria-pressed":[`true`,`false`,`mixed`,`undefined`],"aria-readonly":V,"aria-relevant":null,"aria-required":V,"aria-selected":[`true`,`false`,`undefined`],"aria-setsize":null,"aria-sort":[`ascending`,`descending`,`none`,`other`],"aria-valuemax":null,"aria-valuemin":null,"aria-valuenow":null,"aria-valuetext":null},W=`beforeunload copy cut dragstart dragover dragleave dragenter dragend drag paste focus blur change click load mousedown mouseenter mouseleave mouseup keydown keyup resize scroll unload`.split(` `).map(e=>`on`+e);for(let e of W)U[e]=null;var G=class{constructor(e,t){this.tags={...Xe,...e},this.globalAttrs={...U,...t},this.allTags=Object.keys(this.tags),this.globalAttrNames=Object.keys(this.globalAttrs)}};G.default=new G;function K(e,t,n=e.length){if(!t)return``;let r=t.firstChild,i=r&&r.getChild(`TagName`);return i?e.sliceString(i.from,Math.min(i.to,n)):``}function q(e,t=!1){for(;e;e=e.parent)if(e.name==`Element`){if(t)t=!1;else return e}return null}function J(e,t,n){return n.tags[K(e,q(t))]?.children||n.allTags}function Y(e,t){let n=[];for(let r=q(t);r&&!r.type.isTop;r=q(r.parent)){let i=K(e,r);if(i&&r.lastChild.name==`CloseTag`)break;i&&n.indexOf(i)<0&&(t.name==`EndTag`||t.from>=r.firstChild.to)&&n.push(i)}return n}var X=/^[:\-\.\w\u00b7-\uffff]*$/;function Z(e,t,n,r,i){let a=/\s*>/.test(e.sliceDoc(i,i+5))?``:`>`,o=q(n,n.name==`StartTag`||n.name==`TagName`);return{from:r,to:i,options:J(e.doc,o,t).map(e=>({label:e,type:`type`})).concat(Y(e.doc,n).map((e,t)=>({label:`/`+e,apply:`/`+e+a,type:`type`,boost:99-t}))),validFor:/^\/?[:\-\.\w\u00b7-\uffff]*$/}}function Q(e,t,n,r){let i=/\s*>/.test(e.sliceDoc(r,r+5))?``:`>`;return{from:n,to:r,options:Y(e.doc,t).map((e,t)=>({label:e,apply:e+i,type:`type`,boost:99-t})),validFor:X}}function Ze(e,t,n,r){let i=[],a=0;for(let r of J(e.doc,n,t))i.push({label:`<`+r,type:`type`});for(let t of Y(e.doc,n))i.push({label:`</`+t+`>`,type:`type`,boost:99-a++});return{from:r,to:r,options:i,validFor:/^<\/?[:\-\.\w\u00b7-\uffff]*$/}}function Qe(e,t,n,r,i){let a=q(n),o=a?t.tags[K(e.doc,a)]:null,s=o&&o.attrs?Object.keys(o.attrs):[];return{from:r,to:i,options:(o&&o.globalAttrs===!1?s:s.length?s.concat(t.globalAttrNames):t.globalAttrNames).map(e=>({label:e,type:`property`})),validFor:X}}function $e(e,t,n,r,i){let a=n.parent?.getChild(`AttributeName`),o=[],s;if(a){let c=e.sliceDoc(a.from,a.to),l=t.globalAttrs[c];if(!l){let r=q(n),i=r?t.tags[K(e.doc,r)]:null;l=i?.attrs&&i.attrs[c]}if(l){let t=e.sliceDoc(r,i).toLowerCase(),n=`"`,a=`"`;/^['"]/.test(t)?(s=t[0]==`"`?/^[^"]*$/:/^[^']*$/,n=``,a=e.sliceDoc(i,i+1)==t[0]?``:t[0],t=t.slice(1),r++):s=/^[^\s<>='"]*$/;for(let e of l)o.push({label:e,apply:n+e+a,type:`constant`})}}return{from:r,to:i,options:o,validFor:s}}function et(e,t){let{state:n,pos:i}=t,a=r(n).resolveInner(i,-1),o=a.resolve(i);for(let e=i,t;o==a&&(t=a.childBefore(e));){let n=t.lastChild;if(!n||!n.type.isError||n.from<n.to)break;o=a=t,e=n.from}return a.name==`TagName`?a.parent&&/CloseTag$/.test(a.parent.name)?Q(n,a,a.from,i):Z(n,e,a,a.from,i):a.name==`StartTag`||a.name==`IncompleteTag`?Z(n,e,a,i,i):a.name==`StartCloseTag`||a.name==`IncompleteCloseTag`?Q(n,a,i,i):a.name==`OpenTag`||a.name==`SelfClosingTag`||a.name==`AttributeName`?Qe(n,e,a,a.name==`AttributeName`?a.from:i,i):a.name==`Is`||a.name==`AttributeValue`||a.name==`UnquotedAttributeValue`?$e(n,e,a,a.name==`Is`?i:a.from,i):t.explicit&&(o.name==`Element`||o.name==`Text`||o.name==`Document`)?Ze(n,e,a,i):null}function tt(e){return et(G.default,e)}function nt(e){let{extraTags:t,extraGlobalAttributes:n}=e,r=n||t?new G(t,n):G.default;return e=>et(r,e)}var rt=d.parser.configure({top:`SingleExpression`}),it=[{tag:`script`,attrs:e=>e.type==`text/typescript`||e.lang==`ts`,parser:le.parser},{tag:`script`,attrs:e=>e.type==`text/babel`||e.type==`text/jsx`,parser:se.parser},{tag:`script`,attrs:e=>e.type==`text/typescript-jsx`,parser:oe.parser},{tag:`script`,attrs(e){return/^(importmap|speculationrules|application\/(.+\+)?json)$/i.test(e.type)},parser:rt},{tag:`script`,attrs(e){return!e.type||/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(e.type)},parser:d.parser},{tag:`style`,attrs(e){return(!e.lang||e.lang==`css`)&&(!e.type||/^(text\/)?(x-)?(stylesheet|css)$/i.test(e.type))},parser:u.parser}],at=[{name:`style`,parser:u.parser.configure({top:`Styles`})}].concat(W.map(e=>({name:e,parser:d.parser}))),ot=te.define({name:`html`,parser:qe.configure({props:[n.add({Element(e){let t=/^(\s*)(<\/)?/.exec(e.textAfter);return e.node.to<=e.pos+t[0].length?e.continue():e.lineIndent(e.node.from)+(t[2]?0:e.unit)},"OpenTag CloseTag SelfClosingTag"(e){return e.column(e.node.from)+e.unit},Document(e){if(e.pos+/\s*/.exec(e.textAfter)[0].length<e.node.to)return e.continue();let t=null,n;for(let n=e.node;;){let e=n.lastChild;if(!e||e.name!=`Element`||e.to!=n.to)break;t=n=e}return t&&!((n=t.lastChild)&&(n.name==`CloseTag`||n.name==`SelfClosingTag`))?e.lineIndent(t.from)+e.unit:null}}),t.add({Element(e){let t=e.firstChild,n=e.lastChild;return!t||t.name!=`OpenTag`?null:{from:t.to,to:n.name==`CloseTag`?n.from:e.to}}}),c.add({"OpenTag CloseTag":e=>e.getChild(`TagName`)})]}),languageData:{commentTokens:{block:{open:`<!--`,close:`-->`}},indentOnInput:/^\s*<\/\w+\W$/,wordChars:`-_`}}),$=ot.configure({wrap:I(it,at)});function st(e={}){let t=``,n;e.matchClosingTags===!1&&(t=`noMatch`),e.selfClosingTags===!0&&(t=(t?t+` `:``)+`selfClosing`),(e.nestedLanguages&&e.nestedLanguages.length||e.nestedAttributes&&e.nestedAttributes.length)&&(n=I((e.nestedLanguages||[]).concat(it),(e.nestedAttributes||[]).concat(at)));let r=n?ot.configure({wrap:n,dialect:t}):t?$.configure({dialect:t}):$;return new re(r,[$.data.of({autocomplete:nt(e)}),e.autoCloseTags===!1?[]:ut,ce().support,ae().support])}var ct=new Set(`area base br col command embed frame hr img input keygen link meta param source track wbr menuitem`.split(` `));function lt(e,t,n){for(;;){if(t.lastChild?.name!=`CloseTag`)return!1;let r=t.parent;if(!r||K(e,r)!=n)return!0;t=r}}var ut=s.inputHandler.of((e,t,n,i,a)=>{if(e.composing||e.state.readOnly||t!=n||i!=`>`&&i!=`/`||!$.isActiveAt(e.state,t,-1))return!1;let o=a(),{state:s}=o,c=s.changeByRange(e=>{let t=s.doc.sliceString(e.from-1,e.to)==i,{head:n}=e,a=r(s).resolveInner(n,-1),o;if(t&&i==`>`&&a.name==`EndTag`){let t=a.parent;if((o=K(s.doc,t.parent,n))&&!ct.has(o)&&!lt(s.doc,t.parent,o))return{range:e,changes:{from:n,to:n+ +(s.doc.sliceString(n,n+1)===`>`),insert:`</${o}>`}}}else if(t&&i==`/`&&a.name==`IncompleteCloseTag`){let e=a.parent;if(a.from==n-2&&e.lastChild?.name!=`CloseTag`&&(o=K(s.doc,e,n))&&!ct.has(o)){let e=n+ +(s.doc.sliceString(n,n+1)===`>`),t=`${o}>`;return{range:ie.cursor(n+t.length,-1),changes:{from:n,to:e,insert:t}}}}return{range:e}});return!c.changes.empty&&(e.dispatch([o,s.update(c,{userEvent:`input.complete`,scrollIntoView:!0})]),!0)});export{st as n,tt as r,Ye as t};
|
|
1
|
+
import{l as e}from"./index-CCaRDcUF.js";import{C as t,D as n,F as r,L as i,R as a,Ut as o,V as s,m as c,n as l,r as ee,s as te,t as ne,u as re,vt as ie}from"./dist-H3rerbMg.js";import{n as u,t as ae}from"./dist-BFcHuOQz.js";import{a as oe,i as se,n as ce,o as le,r as d}from"./dist-I5HyrrNc.js";var ue=55,de=1,fe=56,pe=2,me=57,he=3,f=4,ge=5,p=6,m=7,h=8,g=9,_=10,_e=11,ve=12,ye=13,v=58,be=14,xe=15,y=59,b=21,Se=23,x=24,Ce=25,S=27,C=28,we=29,Te=32,Ee=35,De=37,Oe=38,ke=0,Ae=1,je={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},Me={dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},w={dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}};function Ne(e){return e==45||e==46||e==58||e>=65&&e<=90||e==95||e>=97&&e<=122||e>=161}var T=null,E=null,D=0;function O(e,t){let n=e.pos+t;if(D==n&&E==e)return T;let r=e.peek(t),i=``;for(;Ne(r);)i+=String.fromCharCode(r),r=e.peek(++t);return E=e,D=n,T=i?i.toLowerCase():r==Pe||r==Fe?void 0:null}var k=60,A=62,j=47,Pe=63,Fe=33,Ie=45;function M(e,t){this.name=e,this.parent=t}var Le=[p,_,m,h,g],Re=new ne({start:null,shift(e,t,n,r){return Le.indexOf(t)>-1?new M(O(r,1)||``,e):e},reduce(e,t){return t==b&&e?e.parent:e},reuse(e,t,n,r){let i=t.type.id;return i==p||i==De?new M(O(r,1)||``,e):e},strict:!1}),ze=new l((e,t)=>{if(e.next!=k){e.next<0&&t.context&&e.acceptToken(v);return}e.advance();let n=e.next==j;n&&e.advance();let r=O(e,0);if(r===void 0)return;if(!r)return e.acceptToken(n?xe:be);let i=t.context?t.context.name:null;if(n){if(r==i)return e.acceptToken(_e);if(i&&Me[i])return e.acceptToken(v,-2);if(t.dialectEnabled(ke))return e.acceptToken(ve);for(let e=t.context;e;e=e.parent)if(e.name==r)return;e.acceptToken(ye)}else{if(r==`script`)return e.acceptToken(m);if(r==`style`)return e.acceptToken(h);if(r==`textarea`)return e.acceptToken(g);if(je.hasOwnProperty(r))return e.acceptToken(_);i&&w[i]&&w[i][r]?e.acceptToken(v,-1):e.acceptToken(p)}},{contextual:!0}),Be=new l(e=>{for(let t=0,n=0;;n++){if(e.next<0){n&&e.acceptToken(y);break}if(e.next==Ie)t++;else if(e.next==A&&t>=2){n>=3&&e.acceptToken(y,-2);break}else t=0;e.advance()}});function Ve(e){for(;e;e=e.parent)if(e.name==`svg`||e.name==`math`)return!0;return!1}var He=new l((e,t)=>{if(e.next==j&&e.peek(1)==A){let n=t.dialectEnabled(Ae)||Ve(t.context);e.acceptToken(n?ge:f,2)}else e.next==A&&e.acceptToken(f,1)});function N(e,t,n){let r=2+e.length;return new l(i=>{for(let a=0,o=0,s=0;;s++){if(i.next<0){s&&i.acceptToken(t);break}if(a==0&&i.next==k||a==1&&i.next==j||a>=2&&a<r&&i.next==e.charCodeAt(a-2))a++,o++;else if(a==r&&i.next==A){s>o?i.acceptToken(t,-o):i.acceptToken(n,-(o-2));break}else if((i.next==10||i.next==13)&&s){i.acceptToken(t,1);break}else a=o=0;i.advance()}})}var Ue=N(`script`,ue,de),We=N(`style`,fe,pe),Ge=N(`textarea`,me,he),Ke=i({"Text RawText IncompleteTag IncompleteCloseTag":a.content,"StartTag StartCloseTag SelfClosingEndTag EndTag":a.angleBracket,TagName:a.tagName,"MismatchedCloseTag/TagName":[a.tagName,a.invalid],AttributeName:a.attributeName,"AttributeValue UnquotedAttributeValue":a.attributeValue,Is:a.definitionOperator,"EntityReference CharacterReference":a.character,Comment:a.blockComment,ProcessingInst:a.processingInstruction,DoctypeDecl:a.documentMeta}),qe=ee.deserialize({version:14,states:",xOVO!rOOO!ZQ#tO'#CrO!`Q#tO'#C{O!eQ#tO'#DOO!jQ#tO'#DRO!oQ#tO'#DTO!tOaO'#CqO#PObO'#CqO#[OdO'#CqO$kO!rO'#CqOOO`'#Cq'#CqO$rO$fO'#DUO$zQ#tO'#DWO%PQ#tO'#DXOOO`'#Dl'#DlOOO`'#DZ'#DZQVO!rOOO%UQ&rO,59^O%aQ&rO,59gO%lQ&rO,59jO%wQ&rO,59mO&SQ&rO,59oOOOa'#D_'#D_O&_OaO'#CyO&jOaO,59]OOOb'#D`'#D`O&rObO'#C|O&}ObO,59]OOOd'#Da'#DaO'VOdO'#DPO'bOdO,59]OOO`'#Db'#DbO'jO!rO,59]O'qQ#tO'#DSOOO`,59],59]OOOp'#Dc'#DcO'vO$fO,59pOOO`,59p,59pO(OQ#|O,59rO(TQ#|O,59sOOO`-E7X-E7XO(YQ&rO'#CtOOQW'#D['#D[O(hQ&rO1G.xOOOa1G.x1G.xOOO`1G/Z1G/ZO(sQ&rO1G/ROOOb1G/R1G/RO)OQ&rO1G/UOOOd1G/U1G/UO)ZQ&rO1G/XOOO`1G/X1G/XO)fQ&rO1G/ZOOOa-E7]-E7]O)qQ#tO'#CzOOO`1G.w1G.wOOOb-E7^-E7^O)vQ#tO'#C}OOOd-E7_-E7_O){Q#tO'#DQOOO`-E7`-E7`O*QQ#|O,59nOOOp-E7a-E7aOOO`1G/[1G/[OOO`1G/^1G/^OOO`1G/_1G/_O*VQ,UO,59`OOQW-E7Y-E7YOOOa7+$d7+$dOOO`7+$u7+$uOOOb7+$m7+$mOOOd7+$p7+$pOOO`7+$s7+$sO*bQ#|O,59fO*gQ#|O,59iO*lQ#|O,59lOOO`1G/Y1G/YO*qO7[O'#CwO+SOMhO'#CwOOQW1G.z1G.zOOO`1G/Q1G/QOOO`1G/T1G/TOOO`1G/W1G/WOOOO'#D]'#D]O+eO7[O,59cOOQW,59c,59cOOOO'#D^'#D^O+vOMhO,59cOOOO-E7Z-E7ZOOQW1G.}1G.}OOOO-E7[-E7[",stateData:`,c~O!_OS~OUSOVPOWQOXROYTO[]O][O^^O_^Oa^Ob^Oc^Od^Oy^O|_O!eZO~OgaO~OgbO~OgcO~OgdO~OgeO~O!XfOPmP![mP~O!YiOQpP![pP~O!ZlORsP![sP~OUSOVPOWQOXROYTOZqO[]O][O^^O_^Oa^Ob^Oc^Od^Oy^O!eZO~O![rO~P#gO!]sO!fuO~OgvO~OgwO~OS|OT}OiyO~OS!POT}OiyO~OS!ROT}OiyO~OS!TOT}OiyO~OS}OT}OiyO~O!XfOPmX![mX~OP!WO![!XO~O!YiOQpX![pX~OQ!ZO![!XO~O!ZlORsX![sX~OR!]O![!XO~O![!XO~P#gOg!_O~O!]sO!f!aO~OS!bO~OS!cO~Oj!dOShXThXihX~OS!fOT!gOiyO~OS!hOT!gOiyO~OS!iOT!gOiyO~OS!jOT!gOiyO~OS!gOT!gOiyO~Og!kO~Og!lO~Og!mO~OS!nO~Ol!qO!a!oO!c!pO~OS!rO~OS!sO~OS!tO~Ob!uOc!uOd!uO!a!wO!b!uO~Ob!xOc!xOd!xO!c!wO!d!xO~Ob!uOc!uOd!uO!a!{O!b!uO~Ob!xOc!xOd!xO!c!{O!d!xO~OT~cbd!ey|!e~`,goto:"%q!aPPPPPPPPPPPPPPPPPPPPP!b!hP!nPP!zP!}#Q#T#Z#^#a#g#j#m#s#y!bP!b!bP$P$V$m$s$y%P%V%]%cPPPPPPPP%iX^OX`pXUOX`pezabcde{!O!Q!S!UR!q!dRhUR!XhXVOX`pRkVR!XkXWOX`pRnWR!XnXXOX`pQrXR!XpXYOX`pQ`ORx`Q{aQ!ObQ!QcQ!SdQ!UeZ!e{!O!Q!S!UQ!v!oR!z!vQ!y!pR!|!yQgUR!VgQjVR!YjQmWR![mQpXR!^pQtZR!`tS_O`ToXp",nodeNames:`⚠ StartCloseTag StartCloseTag StartCloseTag EndTag SelfClosingEndTag StartTag StartTag StartTag StartTag StartTag StartCloseTag StartCloseTag StartCloseTag IncompleteTag IncompleteCloseTag Document Text EntityReference CharacterReference InvalidEntity Element OpenTag TagName Attribute AttributeName Is AttributeValue UnquotedAttributeValue ScriptText CloseTag OpenTag StyleText CloseTag OpenTag TextareaText CloseTag OpenTag CloseTag SelfClosingTag Comment ProcessingInst MismatchedCloseTag CloseTag DoctypeDecl`,maxTerm:68,context:Re,nodeProps:[[`closedBy`,-10,1,2,3,7,8,9,10,11,12,13,`EndTag`,6,`EndTag SelfClosingEndTag`,-4,22,31,34,37,`CloseTag`],[`openedBy`,4,`StartTag StartCloseTag`,5,`StartTag`,-4,30,33,36,38,`OpenTag`],[`group`,-10,14,15,18,19,20,21,40,41,42,43,`Entity`,17,`Entity TextContent`,-3,29,32,35,`TextContent Entity`],[`isolate`,-11,22,30,31,33,34,36,37,38,39,42,43,`ltr`,-3,27,28,40,``]],propSources:[Ke],skippedNodes:[0],repeatNodeCount:9,tokenData:"!<p!aR!YOX$qXY,QYZ,QZ[$q[]&X]^,Q^p$qpq,Qqr-_rs3_sv-_vw3}wxHYx}-_}!OH{!O!P-_!P!Q$q!Q![-_![!]Mz!]!^-_!^!_!$S!_!`!;x!`!a&X!a!c-_!c!}Mz!}#R-_#R#SMz#S#T1k#T#oMz#o#s-_#s$f$q$f%W-_%W%oMz%o%p-_%p&aMz&a&b-_&b1pMz1p4U-_4U4dMz4d4e-_4e$ISMz$IS$I`-_$I`$IbMz$Ib$Kh-_$Kh%#tMz%#t&/x-_&/x&EtMz&Et&FV-_&FV;'SMz;'S;:j!#|;:j;=`3X<%l?&r-_?&r?AhMz?Ah?BY$q?BY?MnMz?MnO$q!Z$|caPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr$qrs&}sv$qvw+Pwx(tx!^$q!^!_*V!_!a&X!a#S$q#S#T&X#T;'S$q;'S;=`+z<%lO$q!R&bXaP!b`!dpOr&Xrs&}sv&Xwx(tx!^&X!^!_*V!_;'S&X;'S;=`*y<%lO&Xq'UVaP!dpOv&}wx'kx!^&}!^!_(V!_;'S&};'S;=`(n<%lO&}P'pTaPOv'kw!^'k!_;'S'k;'S;=`(P<%lO'kP(SP;=`<%l'kp([S!dpOv(Vx;'S(V;'S;=`(h<%lO(Vp(kP;=`<%l(Vq(qP;=`<%l&}a({WaP!b`Or(trs'ksv(tw!^(t!^!_)e!_;'S(t;'S;=`*P<%lO(t`)jT!b`Or)esv)ew;'S)e;'S;=`)y<%lO)e`)|P;=`<%l)ea*SP;=`<%l(t!Q*^V!b`!dpOr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!Q*vP;=`<%l*V!R*|P;=`<%l&XW+UYlWOX+PZ[+P^p+Pqr+Psw+Px!^+P!a#S+P#T;'S+P;'S;=`+t<%lO+PW+wP;=`<%l+P!Z+}P;=`<%l$q!a,]`aP!b`!dp!_^OX&XXY,QYZ,QZ]&X]^,Q^p&Xpq,Qqr&Xrs&}sv&Xwx(tx!^&X!^!_*V!_;'S&X;'S;=`*y<%lO&X!_-ljiSaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx!P-_!P!Q$q!Q!^-_!^!_*V!_!a&X!a#S-_#S#T1k#T#s-_#s$f$q$f;'S-_;'S;=`3X<%l?Ah-_?Ah?BY$q?BY?Mn-_?MnO$q[/ebiSlWOX+PZ[+P^p+Pqr/^sw/^x!P/^!P!Q+P!Q!^/^!a#S/^#S#T0m#T#s/^#s$f+P$f;'S/^;'S;=`1e<%l?Ah/^?Ah?BY+P?BY?Mn/^?MnO+PS0rXiSqr0msw0mx!P0m!Q!^0m!a#s0m$f;'S0m;'S;=`1_<%l?Ah0m?BY?Mn0mS1bP;=`<%l0m[1hP;=`<%l/^!V1vciSaP!b`!dpOq&Xqr1krs&}sv1kvw0mwx(tx!P1k!P!Q&X!Q!^1k!^!_*V!_!a&X!a#s1k#s$f&X$f;'S1k;'S;=`3R<%l?Ah1k?Ah?BY&X?BY?Mn1k?MnO&X!V3UP;=`<%l1k!_3[P;=`<%l-_!Z3hV!ahaP!dpOv&}wx'kx!^&}!^!_(V!_;'S&};'S;=`(n<%lO&}!_4WiiSlWd!ROX5uXZ7SZ[5u[^7S^p5uqr8trs7Sst>]tw8twx7Sx!P8t!P!Q5u!Q!]8t!]!^/^!^!a7S!a#S8t#S#T;{#T#s8t#s$f5u$f;'S8t;'S;=`>V<%l?Ah8t?Ah?BY5u?BY?Mn8t?MnO5u!Z5zblWOX5uXZ7SZ[5u[^7S^p5uqr5urs7Sst+Ptw5uwx7Sx!]5u!]!^7w!^!a7S!a#S5u#S#T7S#T;'S5u;'S;=`8n<%lO5u!R7VVOp7Sqs7St!]7S!]!^7l!^;'S7S;'S;=`7q<%lO7S!R7qOb!R!R7tP;=`<%l7S!Z8OYlWb!ROX+PZ[+P^p+Pqr+Psw+Px!^+P!a#S+P#T;'S+P;'S;=`+t<%lO+P!Z8qP;=`<%l5u!_8{iiSlWOX5uXZ7SZ[5u[^7S^p5uqr8trs7Sst/^tw8twx7Sx!P8t!P!Q5u!Q!]8t!]!^:j!^!a7S!a#S8t#S#T;{#T#s8t#s$f5u$f;'S8t;'S;=`>V<%l?Ah8t?Ah?BY5u?BY?Mn8t?MnO5u!_:sbiSlWb!ROX+PZ[+P^p+Pqr/^sw/^x!P/^!P!Q+P!Q!^/^!a#S/^#S#T0m#T#s/^#s$f+P$f;'S/^;'S;=`1e<%l?Ah/^?Ah?BY+P?BY?Mn/^?MnO+P!V<QciSOp7Sqr;{rs7Sst0mtw;{wx7Sx!P;{!P!Q7S!Q!];{!]!^=]!^!a7S!a#s;{#s$f7S$f;'S;{;'S;=`>P<%l?Ah;{?Ah?BY7S?BY?Mn;{?MnO7S!V=dXiSb!Rqr0msw0mx!P0m!Q!^0m!a#s0m$f;'S0m;'S;=`1_<%l?Ah0m?BY?Mn0m!V>SP;=`<%l;{!_>YP;=`<%l8t!_>dhiSlWOX@OXZAYZ[@O[^AY^p@OqrBwrsAYswBwwxAYx!PBw!P!Q@O!Q!]Bw!]!^/^!^!aAY!a#SBw#S#TE{#T#sBw#s$f@O$f;'SBw;'S;=`HS<%l?AhBw?Ah?BY@O?BY?MnBw?MnO@O!Z@TalWOX@OXZAYZ[@O[^AY^p@Oqr@OrsAYsw@OwxAYx!]@O!]!^Az!^!aAY!a#S@O#S#TAY#T;'S@O;'S;=`Bq<%lO@O!RA]UOpAYq!]AY!]!^Ao!^;'SAY;'S;=`At<%lOAY!RAtOc!R!RAwP;=`<%lAY!ZBRYlWc!ROX+PZ[+P^p+Pqr+Psw+Px!^+P!a#S+P#T;'S+P;'S;=`+t<%lO+P!ZBtP;=`<%l@O!_COhiSlWOX@OXZAYZ[@O[^AY^p@OqrBwrsAYswBwwxAYx!PBw!P!Q@O!Q!]Bw!]!^Dj!^!aAY!a#SBw#S#TE{#T#sBw#s$f@O$f;'SBw;'S;=`HS<%l?AhBw?Ah?BY@O?BY?MnBw?MnO@O!_DsbiSlWc!ROX+PZ[+P^p+Pqr/^sw/^x!P/^!P!Q+P!Q!^/^!a#S/^#S#T0m#T#s/^#s$f+P$f;'S/^;'S;=`1e<%l?Ah/^?Ah?BY+P?BY?Mn/^?MnO+P!VFQbiSOpAYqrE{rsAYswE{wxAYx!PE{!P!QAY!Q!]E{!]!^GY!^!aAY!a#sE{#s$fAY$f;'SE{;'S;=`G|<%l?AhE{?Ah?BYAY?BY?MnE{?MnOAY!VGaXiSc!Rqr0msw0mx!P0m!Q!^0m!a#s0m$f;'S0m;'S;=`1_<%l?Ah0m?BY?Mn0m!VHPP;=`<%lE{!_HVP;=`<%lBw!ZHcW!cxaP!b`Or(trs'ksv(tw!^(t!^!_)e!_;'S(t;'S;=`*P<%lO(t!aIYliSaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx}-_}!OKQ!O!P-_!P!Q$q!Q!^-_!^!_*V!_!a&X!a#S-_#S#T1k#T#s-_#s$f$q$f;'S-_;'S;=`3X<%l?Ah-_?Ah?BY$q?BY?Mn-_?MnO$q!aK_kiSaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx!P-_!P!Q$q!Q!^-_!^!_*V!_!`&X!`!aMS!a#S-_#S#T1k#T#s-_#s$f$q$f;'S-_;'S;=`3X<%l?Ah-_?Ah?BY$q?BY?Mn-_?MnO$q!TM_XaP!b`!dp!fQOr&Xrs&}sv&Xwx(tx!^&X!^!_*V!_;'S&X;'S;=`*y<%lO&X!aNZ!ZiSgQaPlW!b`!dpOX$qXZ&XZ[$q[^&X^p$qpq&Xqr-_rs&}sv-_vw/^wx(tx}-_}!OMz!O!PMz!P!Q$q!Q![Mz![!]Mz!]!^-_!^!_*V!_!a&X!a!c-_!c!}Mz!}#R-_#R#SMz#S#T1k#T#oMz#o#s-_#s$f$q$f$}-_$}%OMz%O%W-_%W%oMz%o%p-_%p&aMz&a&b-_&b1pMz1p4UMz4U4dMz4d4e-_4e$ISMz$IS$I`-_$I`$IbMz$Ib$Je-_$Je$JgMz$Jg$Kh-_$Kh%#tMz%#t&/x-_&/x&EtMz&Et&FV-_&FV;'SMz;'S;:j!#|;:j;=`3X<%l?&r-_?&r?AhMz?Ah?BY$q?BY?MnMz?MnO$q!a!$PP;=`<%lMz!R!$ZY!b`!dpOq*Vqr!$yrs(Vsv*Vwx)ex!a*V!a!b!4t!b;'S*V;'S;=`*s<%lO*V!R!%Q]!b`!dpOr*Vrs(Vsv*Vwx)ex}*V}!O!%y!O!f*V!f!g!']!g#W*V#W#X!0`#X;'S*V;'S;=`*s<%lO*V!R!&QX!b`!dpOr*Vrs(Vsv*Vwx)ex}*V}!O!&m!O;'S*V;'S;=`*s<%lO*V!R!&vV!b`!dp!ePOr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!R!'dX!b`!dpOr*Vrs(Vsv*Vwx)ex!q*V!q!r!(P!r;'S*V;'S;=`*s<%lO*V!R!(WX!b`!dpOr*Vrs(Vsv*Vwx)ex!e*V!e!f!(s!f;'S*V;'S;=`*s<%lO*V!R!(zX!b`!dpOr*Vrs(Vsv*Vwx)ex!v*V!v!w!)g!w;'S*V;'S;=`*s<%lO*V!R!)nX!b`!dpOr*Vrs(Vsv*Vwx)ex!{*V!{!|!*Z!|;'S*V;'S;=`*s<%lO*V!R!*bX!b`!dpOr*Vrs(Vsv*Vwx)ex!r*V!r!s!*}!s;'S*V;'S;=`*s<%lO*V!R!+UX!b`!dpOr*Vrs(Vsv*Vwx)ex!g*V!g!h!+q!h;'S*V;'S;=`*s<%lO*V!R!+xY!b`!dpOr!+qrs!,hsv!+qvw!-Swx!.[x!`!+q!`!a!/j!a;'S!+q;'S;=`!0Y<%lO!+qq!,mV!dpOv!,hvx!-Sx!`!,h!`!a!-q!a;'S!,h;'S;=`!.U<%lO!,hP!-VTO!`!-S!`!a!-f!a;'S!-S;'S;=`!-k<%lO!-SP!-kO|PP!-nP;=`<%l!-Sq!-xS!dp|POv(Vx;'S(V;'S;=`(h<%lO(Vq!.XP;=`<%l!,ha!.aX!b`Or!.[rs!-Ssv!.[vw!-Sw!`!.[!`!a!.|!a;'S!.[;'S;=`!/d<%lO!.[a!/TT!b`|POr)esv)ew;'S)e;'S;=`)y<%lO)ea!/gP;=`<%l!.[!R!/sV!b`!dp|POr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!R!0]P;=`<%l!+q!R!0gX!b`!dpOr*Vrs(Vsv*Vwx)ex#c*V#c#d!1S#d;'S*V;'S;=`*s<%lO*V!R!1ZX!b`!dpOr*Vrs(Vsv*Vwx)ex#V*V#V#W!1v#W;'S*V;'S;=`*s<%lO*V!R!1}X!b`!dpOr*Vrs(Vsv*Vwx)ex#h*V#h#i!2j#i;'S*V;'S;=`*s<%lO*V!R!2qX!b`!dpOr*Vrs(Vsv*Vwx)ex#m*V#m#n!3^#n;'S*V;'S;=`*s<%lO*V!R!3eX!b`!dpOr*Vrs(Vsv*Vwx)ex#d*V#d#e!4Q#e;'S*V;'S;=`*s<%lO*V!R!4XX!b`!dpOr*Vrs(Vsv*Vwx)ex#X*V#X#Y!+q#Y;'S*V;'S;=`*s<%lO*V!R!4{Y!b`!dpOr!4trs!5ksv!4tvw!6Vwx!8]x!a!4t!a!b!:]!b;'S!4t;'S;=`!;r<%lO!4tq!5pV!dpOv!5kvx!6Vx!a!5k!a!b!7W!b;'S!5k;'S;=`!8V<%lO!5kP!6YTO!a!6V!a!b!6i!b;'S!6V;'S;=`!7Q<%lO!6VP!6lTO!`!6V!`!a!6{!a;'S!6V;'S;=`!7Q<%lO!6VP!7QOyPP!7TP;=`<%l!6Vq!7]V!dpOv!5kvx!6Vx!`!5k!`!a!7r!a;'S!5k;'S;=`!8V<%lO!5kq!7yS!dpyPOv(Vx;'S(V;'S;=`(h<%lO(Vq!8YP;=`<%l!5ka!8bX!b`Or!8]rs!6Vsv!8]vw!6Vw!a!8]!a!b!8}!b;'S!8];'S;=`!:V<%lO!8]a!9SX!b`Or!8]rs!6Vsv!8]vw!6Vw!`!8]!`!a!9o!a;'S!8];'S;=`!:V<%lO!8]a!9vT!b`yPOr)esv)ew;'S)e;'S;=`)y<%lO)ea!:YP;=`<%l!8]!R!:dY!b`!dpOr!4trs!5ksv!4tvw!6Vwx!8]x!`!4t!`!a!;S!a;'S!4t;'S;=`!;r<%lO!4t!R!;]V!b`!dpyPOr*Vrs(Vsv*Vwx)ex;'S*V;'S;=`*s<%lO*V!R!;uP;=`<%l!4t!V!<TXjSaP!b`!dpOr&Xrs&}sv&Xwx(tx!^&X!^!_*V!_;'S&X;'S;=`*y<%lO&X",tokenizers:[Ue,We,Ge,He,ze,Be,0,1,2,3,4,5],topRules:{Document:[0,16]},dialects:{noMatch:0,selfClosing:515},tokenPrec:517});function P(e,t){let n=Object.create(null);for(let r of e.getChildren(x)){let e=r.getChild(Ce),i=r.getChild(S)||r.getChild(C);e&&(n[t.read(e.from,e.to)]=i?i.type.id==S?t.read(i.from+1,i.to-1):t.read(i.from,i.to):``)}return n}function Je(e,t){let n=e.getChild(Se);return n?t.read(n.from,n.to):` `}function F(e,t,n){let r;for(let i of n)if(!i.attrs||i.attrs(r||=P(e.node.parent.firstChild,t)))return{parser:i.parser,bracketed:!0};return null}function I(e=[],t=[]){let n=[],r=[],i=[],a=[];for(let t of e)(t.tag==`script`?n:t.tag==`style`?r:t.tag==`textarea`?i:a).push(t);let s=t.length?Object.create(null):null;for(let e of t)(s[e.name]||(s[e.name]=[])).push(e);return o((e,t)=>{let o=e.type.id;if(o==we)return F(e,t,n);if(o==Te)return F(e,t,r);if(o==Ee)return F(e,t,i);if(o==b&&a.length){let n=e.node,r=n.firstChild,i=r&&Je(r,t),o;if(i){for(let e of a)if(e.tag==i&&(!e.attrs||e.attrs(o||=P(r,t)))){let t=n.lastChild,i=t.type.id==Oe?t.from:n.to;if(i>r.to)return{parser:e.parser,overlay:[{from:r.to,to:i}]}}}}if(s&&o==x){let n=e.node,r;if(r=n.firstChild){let e=s[t.read(r.from,r.to)];if(e)for(let r of e){if(r.tagName&&r.tagName!=Je(n.parent,t))continue;let e=n.lastChild;if(e.type.id==S){let t=e.from+1,n=e.lastChild,i=e.to-(n&&n.isError?0:1);if(i>t)return{parser:r.parser,overlay:[{from:t,to:i}],bracketed:!0}}else if(e.type.id==C)return{parser:r.parser,overlay:[{from:e.from,to:e.to}]}}}}return null})}var Ye=e({autoCloseTags:()=>ut,html:()=>st,htmlCompletionSource:()=>tt,htmlCompletionSourceWith:()=>nt,htmlLanguage:()=>$}),L=[`_blank`,`_self`,`_top`,`_parent`],R=[`ascii`,`utf-8`,`utf-16`,`latin1`,`latin1`],z=[`get`,`post`,`put`,`delete`],B=[`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`],V=[`true`,`false`],H={},Xe={a:{attrs:{href:null,ping:null,type:null,media:null,target:L,hreflang:null}},abbr:H,address:H,area:{attrs:{alt:null,coords:null,href:null,target:null,ping:null,media:null,hreflang:null,type:null,shape:[`default`,`rect`,`circle`,`poly`]}},article:H,aside:H,audio:{attrs:{src:null,mediagroup:null,crossorigin:[`anonymous`,`use-credentials`],preload:[`none`,`metadata`,`auto`],autoplay:[`autoplay`],loop:[`loop`],controls:[`controls`]}},b:H,base:{attrs:{href:null,target:L}},bdi:H,bdo:H,blockquote:{attrs:{cite:null}},body:H,br:H,button:{attrs:{form:null,formaction:null,name:null,value:null,autofocus:[`autofocus`],disabled:[`autofocus`],formenctype:B,formmethod:z,formnovalidate:[`novalidate`],formtarget:L,type:[`submit`,`reset`,`button`]}},canvas:{attrs:{width:null,height:null}},caption:H,center:H,cite:H,code:H,col:{attrs:{span:null}},colgroup:{attrs:{span:null}},command:{attrs:{type:[`command`,`checkbox`,`radio`],label:null,icon:null,radiogroup:null,command:null,title:null,disabled:[`disabled`],checked:[`checked`]}},data:{attrs:{value:null}},datagrid:{attrs:{disabled:[`disabled`],multiple:[`multiple`]}},datalist:{attrs:{data:null}},dd:H,del:{attrs:{cite:null,datetime:null}},details:{attrs:{open:[`open`]}},dfn:H,div:H,dl:H,dt:H,em:H,embed:{attrs:{src:null,type:null,width:null,height:null}},eventsource:{attrs:{src:null}},fieldset:{attrs:{disabled:[`disabled`],form:null,name:null}},figcaption:H,figure:H,footer:H,form:{attrs:{action:null,name:null,"accept-charset":R,autocomplete:[`on`,`off`],enctype:B,method:z,novalidate:[`novalidate`],target:L}},h1:H,h2:H,h3:H,h4:H,h5:H,h6:H,head:{children:[`title`,`base`,`link`,`style`,`meta`,`script`,`noscript`,`command`]},header:H,hgroup:H,hr:H,html:{attrs:{manifest:null}},i:H,iframe:{attrs:{src:null,srcdoc:null,name:null,width:null,height:null,sandbox:[`allow-top-navigation`,`allow-same-origin`,`allow-forms`,`allow-scripts`],seamless:[`seamless`]}},img:{attrs:{alt:null,src:null,ismap:null,usemap:null,width:null,height:null,crossorigin:[`anonymous`,`use-credentials`]}},input:{attrs:{alt:null,dirname:null,form:null,formaction:null,height:null,list:null,max:null,maxlength:null,min:null,name:null,pattern:null,placeholder:null,size:null,src:null,step:null,value:null,width:null,accept:[`audio/*`,`video/*`,`image/*`],autocomplete:[`on`,`off`],autofocus:[`autofocus`],checked:[`checked`],disabled:[`disabled`],formenctype:B,formmethod:z,formnovalidate:[`novalidate`],formtarget:L,multiple:[`multiple`],readonly:[`readonly`],required:[`required`],type:[`hidden`,`text`,`search`,`tel`,`url`,`email`,`password`,`datetime`,`date`,`month`,`week`,`time`,`datetime-local`,`number`,`range`,`color`,`checkbox`,`radio`,`file`,`submit`,`image`,`reset`,`button`]}},ins:{attrs:{cite:null,datetime:null}},kbd:H,keygen:{attrs:{challenge:null,form:null,name:null,autofocus:[`autofocus`],disabled:[`disabled`],keytype:[`RSA`]}},label:{attrs:{for:null,form:null}},legend:H,li:{attrs:{value:null}},link:{attrs:{href:null,type:null,hreflang:null,media:null,sizes:[`all`,`16x16`,`16x16 32x32`,`16x16 32x32 64x64`]}},map:{attrs:{name:null}},mark:H,menu:{attrs:{label:null,type:[`list`,`context`,`toolbar`]}},meta:{attrs:{content:null,charset:R,name:[`viewport`,`application-name`,`author`,`description`,`generator`,`keywords`],"http-equiv":[`content-language`,`content-type`,`default-style`,`refresh`]}},meter:{attrs:{value:null,min:null,low:null,high:null,max:null,optimum:null}},nav:H,noscript:H,object:{attrs:{data:null,type:null,name:null,usemap:null,form:null,width:null,height:null,typemustmatch:[`typemustmatch`]}},ol:{attrs:{reversed:[`reversed`],start:null,type:[`1`,`a`,`A`,`i`,`I`]},children:[`li`,`script`,`template`,`ul`,`ol`]},optgroup:{attrs:{disabled:[`disabled`],label:null}},option:{attrs:{disabled:[`disabled`],label:null,selected:[`selected`],value:null}},output:{attrs:{for:null,form:null,name:null}},p:H,param:{attrs:{name:null,value:null}},pre:H,progress:{attrs:{value:null,max:null}},q:{attrs:{cite:null}},rp:H,rt:H,ruby:H,samp:H,script:{attrs:{type:[`text/javascript`],src:null,async:[`async`],defer:[`defer`],charset:R}},section:H,select:{attrs:{form:null,name:null,size:null,autofocus:[`autofocus`],disabled:[`disabled`],multiple:[`multiple`]}},slot:{attrs:{name:null}},small:H,source:{attrs:{src:null,type:null,media:null}},span:H,strong:H,style:{attrs:{type:[`text/css`],media:null,scoped:null}},sub:H,summary:H,sup:H,table:H,tbody:H,td:{attrs:{colspan:null,rowspan:null,headers:null}},template:H,textarea:{attrs:{dirname:null,form:null,maxlength:null,name:null,placeholder:null,rows:null,cols:null,autofocus:[`autofocus`],disabled:[`disabled`],readonly:[`readonly`],required:[`required`],wrap:[`soft`,`hard`]}},tfoot:H,th:{attrs:{colspan:null,rowspan:null,headers:null,scope:[`row`,`col`,`rowgroup`,`colgroup`]}},thead:H,time:{attrs:{datetime:null}},title:H,tr:H,track:{attrs:{src:null,label:null,default:null,kind:[`subtitles`,`captions`,`descriptions`,`chapters`,`metadata`],srclang:null}},ul:{children:[`li`,`script`,`template`,`ul`,`ol`]},var:H,video:{attrs:{src:null,poster:null,width:null,height:null,crossorigin:[`anonymous`,`use-credentials`],preload:[`auto`,`metadata`,`none`],autoplay:[`autoplay`],mediagroup:[`movie`],muted:[`muted`],controls:[`controls`]}},wbr:H},U={accesskey:null,class:null,contenteditable:V,contextmenu:null,dir:[`ltr`,`rtl`,`auto`],draggable:[`true`,`false`,`auto`],dropzone:[`copy`,`move`,`link`,`string:`,`file:`],hidden:[`hidden`],id:null,inert:[`inert`],itemid:null,itemprop:null,itemref:null,itemscope:[`itemscope`],itemtype:null,lang:[`ar`,`bn`,`de`,`en-GB`,`en-US`,`es`,`fr`,`hi`,`id`,`ja`,`pa`,`pt`,`ru`,`tr`,`zh`],spellcheck:V,autocorrect:V,autocapitalize:V,style:null,tabindex:null,title:null,translate:[`yes`,`no`],rel:[`stylesheet`,`alternate`,`author`,`bookmark`,`help`,`license`,`next`,`nofollow`,`noreferrer`,`prefetch`,`prev`,`search`,`tag`],role:`alert application article banner button cell checkbox complementary contentinfo dialog document feed figure form grid gridcell heading img list listbox listitem main navigation region row rowgroup search switch tab table tabpanel textbox timer`.split(` `),"aria-activedescendant":null,"aria-atomic":V,"aria-autocomplete":[`inline`,`list`,`both`,`none`],"aria-busy":V,"aria-checked":[`true`,`false`,`mixed`,`undefined`],"aria-controls":null,"aria-describedby":null,"aria-disabled":V,"aria-dropeffect":null,"aria-expanded":[`true`,`false`,`undefined`],"aria-flowto":null,"aria-grabbed":[`true`,`false`,`undefined`],"aria-haspopup":V,"aria-hidden":V,"aria-invalid":[`true`,`false`,`grammar`,`spelling`],"aria-label":null,"aria-labelledby":null,"aria-level":null,"aria-live":[`off`,`polite`,`assertive`],"aria-multiline":V,"aria-multiselectable":V,"aria-owns":null,"aria-posinset":null,"aria-pressed":[`true`,`false`,`mixed`,`undefined`],"aria-readonly":V,"aria-relevant":null,"aria-required":V,"aria-selected":[`true`,`false`,`undefined`],"aria-setsize":null,"aria-sort":[`ascending`,`descending`,`none`,`other`],"aria-valuemax":null,"aria-valuemin":null,"aria-valuenow":null,"aria-valuetext":null},W=`beforeunload copy cut dragstart dragover dragleave dragenter dragend drag paste focus blur change click load mousedown mouseenter mouseleave mouseup keydown keyup resize scroll unload`.split(` `).map(e=>`on`+e);for(let e of W)U[e]=null;var G=class{constructor(e,t){this.tags={...Xe,...e},this.globalAttrs={...U,...t},this.allTags=Object.keys(this.tags),this.globalAttrNames=Object.keys(this.globalAttrs)}};G.default=new G;function K(e,t,n=e.length){if(!t)return``;let r=t.firstChild,i=r&&r.getChild(`TagName`);return i?e.sliceString(i.from,Math.min(i.to,n)):``}function q(e,t=!1){for(;e;e=e.parent)if(e.name==`Element`){if(t)t=!1;else return e}return null}function J(e,t,n){return n.tags[K(e,q(t))]?.children||n.allTags}function Y(e,t){let n=[];for(let r=q(t);r&&!r.type.isTop;r=q(r.parent)){let i=K(e,r);if(i&&r.lastChild.name==`CloseTag`)break;i&&n.indexOf(i)<0&&(t.name==`EndTag`||t.from>=r.firstChild.to)&&n.push(i)}return n}var X=/^[:\-\.\w\u00b7-\uffff]*$/;function Z(e,t,n,r,i){let a=/\s*>/.test(e.sliceDoc(i,i+5))?``:`>`,o=q(n,n.name==`StartTag`||n.name==`TagName`);return{from:r,to:i,options:J(e.doc,o,t).map(e=>({label:e,type:`type`})).concat(Y(e.doc,n).map((e,t)=>({label:`/`+e,apply:`/`+e+a,type:`type`,boost:99-t}))),validFor:/^\/?[:\-\.\w\u00b7-\uffff]*$/}}function Q(e,t,n,r){let i=/\s*>/.test(e.sliceDoc(r,r+5))?``:`>`;return{from:n,to:r,options:Y(e.doc,t).map((e,t)=>({label:e,apply:e+i,type:`type`,boost:99-t})),validFor:X}}function Ze(e,t,n,r){let i=[],a=0;for(let r of J(e.doc,n,t))i.push({label:`<`+r,type:`type`});for(let t of Y(e.doc,n))i.push({label:`</`+t+`>`,type:`type`,boost:99-a++});return{from:r,to:r,options:i,validFor:/^<\/?[:\-\.\w\u00b7-\uffff]*$/}}function Qe(e,t,n,r,i){let a=q(n),o=a?t.tags[K(e.doc,a)]:null,s=o&&o.attrs?Object.keys(o.attrs):[];return{from:r,to:i,options:(o&&o.globalAttrs===!1?s:s.length?s.concat(t.globalAttrNames):t.globalAttrNames).map(e=>({label:e,type:`property`})),validFor:X}}function $e(e,t,n,r,i){let a=n.parent?.getChild(`AttributeName`),o=[],s;if(a){let c=e.sliceDoc(a.from,a.to),l=t.globalAttrs[c];if(!l){let r=q(n),i=r?t.tags[K(e.doc,r)]:null;l=i?.attrs&&i.attrs[c]}if(l){let t=e.sliceDoc(r,i).toLowerCase(),n=`"`,a=`"`;/^['"]/.test(t)?(s=t[0]==`"`?/^[^"]*$/:/^[^']*$/,n=``,a=e.sliceDoc(i,i+1)==t[0]?``:t[0],t=t.slice(1),r++):s=/^[^\s<>='"]*$/;for(let e of l)o.push({label:e,apply:n+e+a,type:`constant`})}}return{from:r,to:i,options:o,validFor:s}}function et(e,t){let{state:n,pos:i}=t,a=r(n).resolveInner(i,-1),o=a.resolve(i);for(let e=i,t;o==a&&(t=a.childBefore(e));){let n=t.lastChild;if(!n||!n.type.isError||n.from<n.to)break;o=a=t,e=n.from}return a.name==`TagName`?a.parent&&/CloseTag$/.test(a.parent.name)?Q(n,a,a.from,i):Z(n,e,a,a.from,i):a.name==`StartTag`||a.name==`IncompleteTag`?Z(n,e,a,i,i):a.name==`StartCloseTag`||a.name==`IncompleteCloseTag`?Q(n,a,i,i):a.name==`OpenTag`||a.name==`SelfClosingTag`||a.name==`AttributeName`?Qe(n,e,a,a.name==`AttributeName`?a.from:i,i):a.name==`Is`||a.name==`AttributeValue`||a.name==`UnquotedAttributeValue`?$e(n,e,a,a.name==`Is`?i:a.from,i):t.explicit&&(o.name==`Element`||o.name==`Text`||o.name==`Document`)?Ze(n,e,a,i):null}function tt(e){return et(G.default,e)}function nt(e){let{extraTags:t,extraGlobalAttributes:n}=e,r=n||t?new G(t,n):G.default;return e=>et(r,e)}var rt=d.parser.configure({top:`SingleExpression`}),it=[{tag:`script`,attrs:e=>e.type==`text/typescript`||e.lang==`ts`,parser:le.parser},{tag:`script`,attrs:e=>e.type==`text/babel`||e.type==`text/jsx`,parser:se.parser},{tag:`script`,attrs:e=>e.type==`text/typescript-jsx`,parser:oe.parser},{tag:`script`,attrs(e){return/^(importmap|speculationrules|application\/(.+\+)?json)$/i.test(e.type)},parser:rt},{tag:`script`,attrs(e){return!e.type||/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(e.type)},parser:d.parser},{tag:`style`,attrs(e){return(!e.lang||e.lang==`css`)&&(!e.type||/^(text\/)?(x-)?(stylesheet|css)$/i.test(e.type))},parser:u.parser}],at=[{name:`style`,parser:u.parser.configure({top:`Styles`})}].concat(W.map(e=>({name:e,parser:d.parser}))),ot=te.define({name:`html`,parser:qe.configure({props:[n.add({Element(e){let t=/^(\s*)(<\/)?/.exec(e.textAfter);return e.node.to<=e.pos+t[0].length?e.continue():e.lineIndent(e.node.from)+(t[2]?0:e.unit)},"OpenTag CloseTag SelfClosingTag"(e){return e.column(e.node.from)+e.unit},Document(e){if(e.pos+/\s*/.exec(e.textAfter)[0].length<e.node.to)return e.continue();let t=null,n;for(let n=e.node;;){let e=n.lastChild;if(!e||e.name!=`Element`||e.to!=n.to)break;t=n=e}return t&&!((n=t.lastChild)&&(n.name==`CloseTag`||n.name==`SelfClosingTag`))?e.lineIndent(t.from)+e.unit:null}}),t.add({Element(e){let t=e.firstChild,n=e.lastChild;return!t||t.name!=`OpenTag`?null:{from:t.to,to:n.name==`CloseTag`?n.from:e.to}}}),c.add({"OpenTag CloseTag":e=>e.getChild(`TagName`)})]}),languageData:{commentTokens:{block:{open:`<!--`,close:`-->`}},indentOnInput:/^\s*<\/\w+\W$/,wordChars:`-_`}}),$=ot.configure({wrap:I(it,at)});function st(e={}){let t=``,n;e.matchClosingTags===!1&&(t=`noMatch`),e.selfClosingTags===!0&&(t=(t?t+` `:``)+`selfClosing`),(e.nestedLanguages&&e.nestedLanguages.length||e.nestedAttributes&&e.nestedAttributes.length)&&(n=I((e.nestedLanguages||[]).concat(it),(e.nestedAttributes||[]).concat(at)));let r=n?ot.configure({wrap:n,dialect:t}):t?$.configure({dialect:t}):$;return new re(r,[$.data.of({autocomplete:nt(e)}),e.autoCloseTags===!1?[]:ut,ce().support,ae().support])}var ct=new Set(`area base br col command embed frame hr img input keygen link meta param source track wbr menuitem`.split(` `));function lt(e,t,n){for(;;){if(t.lastChild?.name!=`CloseTag`)return!1;let r=t.parent;if(!r||K(e,r)!=n)return!0;t=r}}var ut=s.inputHandler.of((e,t,n,i,a)=>{if(e.composing||e.state.readOnly||t!=n||i!=`>`&&i!=`/`||!$.isActiveAt(e.state,t,-1))return!1;let o=a(),{state:s}=o,c=s.changeByRange(e=>{let t=s.doc.sliceString(e.from-1,e.to)==i,{head:n}=e,a=r(s).resolveInner(n,-1),o;if(t&&i==`>`&&a.name==`EndTag`){let t=a.parent;if((o=K(s.doc,t.parent,n))&&!ct.has(o)&&!lt(s.doc,t.parent,o))return{range:e,changes:{from:n,to:n+ +(s.doc.sliceString(n,n+1)===`>`),insert:`</${o}>`}}}else if(t&&i==`/`&&a.name==`IncompleteCloseTag`){let e=a.parent;if(a.from==n-2&&e.lastChild?.name!=`CloseTag`&&(o=K(s.doc,e,n))&&!ct.has(o)){let e=n+ +(s.doc.sliceString(n,n+1)===`>`),t=`${o}>`;return{range:ie.cursor(n+t.length,-1),changes:{from:n,to:e,insert:t}}}}return{range:e}});return!c.changes.empty&&(e.dispatch([o,s.update(c,{userEvent:`input.complete`,scrollIntoView:!0})]),!0)});export{st as n,tt as r,Ye as t};
|