solid-mds 0.3.2

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Matthias Reis
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,476 @@
1
+ # solid-mds
2
+
3
+ A SolidJS library for parsing and rendering MDS (Markdown Steps) format — an
4
+ extended Markdown syntax designed for step-based content like slide decks,
5
+ tutorials, and wizards.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install solid-mds
11
+ # or
12
+ pnpm add solid-mds
13
+ ```
14
+
15
+ **Peer dependency:** This library requires SolidJS ^1.9.0
16
+
17
+ ## Quick Start
18
+
19
+ ```tsx
20
+ import { parse } from "solid-mds";
21
+
22
+ const markdown = `
23
+ # Hello World
24
+
25
+ This is **bold** and *italic* text.
26
+ `;
27
+
28
+ function App() {
29
+ const result = parse(markdown);
30
+ return <div>{result.steps.default.body}</div>;
31
+ }
32
+ ```
33
+
34
+ ## Opinionated Plugin Configuration
35
+
36
+ solid-mds comes pre-configured with an opinionated set of remark/rehype plugins:
37
+
38
+ - **[remark-gfm](https://github.com/remarkjs/remark-gfm)** — GitHub Flavored
39
+ Markdown (tables, strikethrough, autolinks, task lists)
40
+ - **[remark-math](https://github.com/remarkjs/remark-math)** +
41
+ **[rehype-katex](https://github.com/remarkjs/rehype-katex)** — LaTeX math
42
+ rendering
43
+
44
+ These plugins are always enabled and cannot be configured. This ensures
45
+ consistent rendering across all use cases.
46
+
47
+ **Note:** To display math properly, include the KaTeX CSS in your app:
48
+
49
+ ```html
50
+ <link
51
+ rel="stylesheet"
52
+ href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css"
53
+ />
54
+ ```
55
+
56
+ ## Supported Markdown Features
57
+
58
+ ### Standard Markdown
59
+
60
+ ```markdown
61
+ # Heading 1
62
+
63
+ ## Heading 2
64
+
65
+ ### Heading 3
66
+
67
+ **bold** and _italic_ and ~~strikethrough~~
68
+
69
+ - Unordered list
70
+ - Another item
71
+
72
+ 1. Ordered list
73
+ 2. Second item
74
+
75
+ > Blockquotes
76
+
77
+ `inline code`
78
+
79
+ [Links](https://example.com)
80
+
81
+ ![Images](image.png)
82
+ ```
83
+
84
+ ### GFM Extensions
85
+
86
+ #### Tables
87
+
88
+ ```markdown
89
+ | Header 1 | Header 2 |
90
+ | -------- | -------- |
91
+ | Cell 1 | Cell 2 |
92
+ | Cell 3 | Cell 4 |
93
+ ```
94
+
95
+ #### Task Lists
96
+
97
+ ```markdown
98
+ - [x] Completed task
99
+ - [ ] Incomplete task
100
+ ```
101
+
102
+ #### Autolinks
103
+
104
+ ```markdown
105
+ Visit https://example.com automatically linked.
106
+ ```
107
+
108
+ ### Math (LaTeX)
109
+
110
+ #### Inline Math
111
+
112
+ ```markdown
113
+ The equation $E = mc^2$ is famous.
114
+ ```
115
+
116
+ #### Block Math
117
+
118
+ ```markdown
119
+ $$
120
+ \int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
121
+ $$
122
+ ```
123
+
124
+ ## MDS Format: Steps
125
+
126
+ MDS extends Markdown with a step-based structure using `+++stepId` separators:
127
+
128
+ ```markdown
129
+ +++intro
130
+ # Welcome
131
+
132
+ This is the introduction step.
133
+
134
+ +++
135
+
136
+ main
137
+
138
+ # Main Content
139
+
140
+ This is the main step.
141
+
142
+ +++conclusion
143
+
144
+ # Summary
145
+
146
+ This is the conclusion.
147
+ ```
148
+
149
+ ### Parsing Steps
150
+
151
+ ```tsx
152
+ import { parse } from "solid-mds";
153
+
154
+ const result = parse(markdown);
155
+
156
+ // result.first → "intro" (first step ID)
157
+ // result.count → 3 (number of steps)
158
+ // result.steps.intro.body → JSX.Element
159
+ // result.steps.intro.next → "main"
160
+ // result.steps.main.prev → "intro"
161
+ // result.steps.main.next → "conclusion"
162
+ // result.steps.conclusion.prev → "main"
163
+ // result.steps.conclusion.next → null
164
+ ```
165
+
166
+ ### Step Object Structure
167
+
168
+ Each step contains:
169
+
170
+ ```ts
171
+ interface Step {
172
+ id: string; // Step identifier
173
+ body: JSX.Element; // Rendered markdown content
174
+ local: object; // Local metadata (see below)
175
+ prev: string | null; // Previous step ID
176
+ next: string | null; // Next step ID
177
+ current: number; // 1-based position
178
+ }
179
+ ```
180
+
181
+ ## Metadata Blocks
182
+
183
+ ### Local Metadata (per step)
184
+
185
+ Use ` ```@| ` blocks to define key-value metadata for a step:
186
+
187
+ ````markdown
188
+ +++slide1
189
+
190
+ ```@|
191
+ title: Introduction
192
+ speaker: John Doe
193
+ ```
194
+
195
+ # Welcome to the Presentation
196
+ ````
197
+
198
+ Access via `result.steps.slide1.local.title`.
199
+
200
+ ### Local Markdown Blocks
201
+
202
+ Use ` ```@/name ` to define named markdown content within a step:
203
+
204
+ ````markdown
205
+ +++slide1
206
+
207
+ ```@/notes
208
+ These are speaker notes with **formatting**.
209
+ ```
210
+
211
+ # Main Slide Content
212
+ ````
213
+
214
+ Access via `result.steps.slide1.local.notes` (returns `JSX.Element`).
215
+
216
+ ### Global Metadata
217
+
218
+ Use ` ```@@| ` for document-wide metadata:
219
+
220
+ ````markdown
221
+ ```@@|
222
+ author: Jane Smith
223
+ version: 1.0
224
+ ```
225
+
226
+ +++first
227
+
228
+ # First Step
229
+ ````
230
+
231
+ Access via `result.global.author`.
232
+
233
+ ### Global Markdown Blocks
234
+
235
+ Use ` ```@@/name ` for global named markdown content:
236
+
237
+ ````markdown
238
+ ```@@/footer
239
+ Made with ❤️ by **Our Team**
240
+ ```
241
+
242
+ +++first
243
+
244
+ # Content
245
+ ````
246
+
247
+ Access via `result.global.footer` (returns `JSX.Element`).
248
+
249
+ ## Custom Components
250
+
251
+ Override default HTML elements or create custom block components:
252
+
253
+ ### Override Standard Elements
254
+
255
+ ```tsx
256
+ import {
257
+ parse,
258
+ ComponentMap,
259
+ StandardComponentProps,
260
+ } from "solid-mds";
261
+
262
+ const CustomHeading = (props: StandardComponentProps) => (
263
+ <h1 class="text-4xl font-bold text-blue-600">{props.children}</h1>
264
+ );
265
+
266
+ const components: ComponentMap = {
267
+ h1: CustomHeading,
268
+ };
269
+
270
+ const result = parse(markdown, components);
271
+ ```
272
+
273
+ ### Custom Blocks
274
+
275
+ Create custom components that receive special props from code blocks:
276
+
277
+ ```tsx
278
+ import { parse, ComponentMap, CustomBlockProps } from "solid-mds";
279
+
280
+ // Define a custom component
281
+ const Alert = (props: CustomBlockProps) => (
282
+ <div class={`alert alert-${props.payload[0] || "info"}`}>
283
+ {props.children}
284
+ </div>
285
+ );
286
+
287
+ const components: ComponentMap = {
288
+ alert: Alert,
289
+ };
290
+
291
+ const markdown = `
292
+ \`\`\`alert/warning
293
+ This is a **warning** message!
294
+ \`\`\`
295
+ `;
296
+
297
+ const result = parse(markdown, components);
298
+ ```
299
+
300
+ The code block ` ```slert/warning ` will render using your `Alert` component
301
+ with:
302
+
303
+ - `props.payload` → `["warning"]` (path segments after component name)
304
+ - `props.raw` → `"This is a **warning** message!"` (raw content as string if you
305
+ need it)
306
+ - `props.children` → Rendered markdown as JSX
307
+
308
+ ### Custom Blocks with Data
309
+
310
+ Use the `|` suffix for YAML data instead of markdown content:
311
+
312
+ ```tsx
313
+ const Card = (props: CustomBlockProps) => (
314
+ <div class="card">
315
+ <h2>{props.data?.title}</h2>
316
+ <p>{props.data?.description}</p>
317
+ </div>
318
+ );
319
+
320
+ const components: ComponentMap = { Card };
321
+
322
+ const markdown = `
323
+ \`\`\`Card|
324
+ title: My Card Title
325
+ description: This is the card description
326
+ \`\`\`
327
+ `;
328
+
329
+ const result = parse(markdown, components);
330
+ ```
331
+
332
+ With ` ```Card| `, the content is parsed as YAML and available via `props.data`.
333
+
334
+ ## Complete Example
335
+
336
+ ```tsx
337
+ import { createSignal, Show, For } from "solid-js";
338
+ import {
339
+ parse,
340
+ ComponentMap,
341
+ CustomBlockProps,
342
+ StandardComponentProps,
343
+ } from "solid-mds";
344
+
345
+ // Custom components
346
+ const Slide = (props: CustomBlockProps) => (
347
+ <div class="slide" data-layout={props.payload[0]}>
348
+ {props.children}
349
+ </div>
350
+ );
351
+
352
+ const Code = (props: StandardComponentProps) => (
353
+ <pre class="bg-gray-800 text-white p-4 rounded">
354
+ <code>{props.children}</code>
355
+ </pre>
356
+ );
357
+
358
+ const components: ComponentMap = {
359
+ Slide,
360
+ code: Code,
361
+ };
362
+
363
+ // Markdown content
364
+ const content = `
365
+ \`\`\`@@|
366
+ title: My Presentation
367
+ author: Developer
368
+ \`\`\`
369
+
370
+ +++intro
371
+ \`\`\`@|
372
+ transition: fade
373
+ \`\`\`
374
+
375
+ # Welcome
376
+
377
+ Introduction slide content.
378
+
379
+ +++demo
380
+ \`\`\`Slide/centered
381
+ # Demo Time
382
+
383
+ Check out this code:
384
+
385
+ \`\`\`js
386
+ console.log("Hello!");
387
+ \`\`\`
388
+ \`\`\`
389
+
390
+ +++end
391
+ # Thank You!
392
+
393
+ Questions?
394
+ `;
395
+
396
+ function Presentation() {
397
+ const result = parse(content, components);
398
+ const [currentId, setCurrentId] = createSignal(result.first);
399
+
400
+ const currentStep = () => result.steps[currentId()!];
401
+
402
+ const goNext = () => {
403
+ const next = currentStep()?.next;
404
+ if (next) setCurrentId(next);
405
+ };
406
+
407
+ const goPrev = () => {
408
+ const prev = currentStep()?.prev;
409
+ if (prev) setCurrentId(prev);
410
+ };
411
+
412
+ return (
413
+ <div class="presentation">
414
+ <header>
415
+ <h1>{result.global?.title}</h1>
416
+ <span>by {result.global?.author}</span>
417
+ </header>
418
+
419
+ <main>
420
+ <Show when={currentStep()}>{currentStep().body}</Show>
421
+ </main>
422
+
423
+ <footer>
424
+ <button onClick={goPrev} disabled={!currentStep()?.prev}>
425
+ Previous
426
+ </button>
427
+ <span>
428
+ {currentStep()?.current} / {result.count}
429
+ </span>
430
+ <button onClick={goNext} disabled={!currentStep()?.next}>
431
+ Next
432
+ </button>
433
+ </footer>
434
+ </div>
435
+ );
436
+ }
437
+ ```
438
+
439
+ ## API Reference
440
+
441
+ ### `parse<TGlobal, TLocal>(input: string, components?: ComponentMap): ParseResult`
442
+
443
+ Parses MDS content and returns a structured result. Please provide proper types
444
+ for your global and local scope to receive a properly typed result.
445
+
446
+ **Parameters:**
447
+
448
+ - `input` — The MDS/Markdown string to parse
449
+ - `components` — Optional map of custom components
450
+
451
+ **Returns:**
452
+
453
+ ```ts
454
+ interface ParseResult<TGlobal, TLocal> {
455
+ first: string | null; // First step ID
456
+ steps: Record<string, Step<TLocal>>; // All steps by ID
457
+ count: number; // Total number of steps
458
+ global: TGlobal | null; // Global metadata
459
+ }
460
+ ```
461
+
462
+ ### Type Exports
463
+
464
+ ```ts
465
+ import type {
466
+ ComponentMap,
467
+ CustomBlockProps,
468
+ StandardComponentProps,
469
+ ParseResult,
470
+ Step,
471
+ } from "solid-mds";
472
+ ```
473
+
474
+ ## License
475
+
476
+ MIT
@@ -0,0 +1,50 @@
1
+ import { Component, JSX } from 'solid-js';
2
+
3
+ /**
4
+ * Props for custom block components (code blocks with name/sub/path syntax)
5
+ */
6
+ interface CustomBlockProps {
7
+ /** The path segments after the component name, e.g. ['substructure', 'subsub'] */
8
+ payload: string[];
9
+ /** The raw content of the code block as plain text */
10
+ raw: string;
11
+ /** Parsed YAML data when using componentName| syntax */
12
+ data?: Record<string, string | string[]>;
13
+ /** The markdown-rendered content as children */
14
+ children?: JSX.Element;
15
+ }
16
+ /**
17
+ * Standard component props for regular HTML elements
18
+ */
19
+ interface StandardComponentProps {
20
+ children?: JSX.Element;
21
+ [key: string]: unknown;
22
+ }
23
+ type ComponentMap = {
24
+ [tagName: string]: Component<CustomBlockProps> | Component<StandardComponentProps>;
25
+ };
26
+
27
+ interface StepLocalBase {
28
+ [key: string]: unknown;
29
+ }
30
+ interface GlobalMetaBase {
31
+ [key: string]: unknown;
32
+ }
33
+ interface Step<TLocal = StepLocalBase> {
34
+ id: string;
35
+ local: TLocal;
36
+ /** Component function that renders the step body. Call it to get JSX: {step.Body()} */
37
+ Body: Component;
38
+ prev: string | null;
39
+ next: string | null;
40
+ current: number;
41
+ }
42
+ interface ParseResult<TGlobal = GlobalMetaBase, TLocal = StepLocalBase> {
43
+ first: string | null;
44
+ steps: Record<string, Step<TLocal>>;
45
+ count: number;
46
+ global: TGlobal | null;
47
+ }
48
+ declare function parse<TGlobal = GlobalMetaBase, TLocal = StepLocalBase>(input: string, components?: ComponentMap): ParseResult<TGlobal, TLocal>;
49
+
50
+ export { type ComponentMap, type CustomBlockProps, type GlobalMetaBase, type ParseResult, type StandardComponentProps, type Step, type StepLocalBase, parse };
package/dist/index.jsx ADDED
@@ -0,0 +1,402 @@
1
+ // src/index.tsx
2
+ import { unified } from "unified";
3
+ import remarkParse from "remark-parse";
4
+ import remarkGfm from "remark-gfm";
5
+ import remarkMath from "remark-math";
6
+ import remarkRehype from "remark-rehype";
7
+ import rehypeKatex from "rehype-katex";
8
+ import { parse as parseYaml2 } from "yaml";
9
+
10
+ // src/hast-to-solid.tsx
11
+ function convertProperties(properties) {
12
+ if (!properties) return {};
13
+ const result = {};
14
+ for (const [key, value] of Object.entries(properties)) {
15
+ if (key === "className") {
16
+ result.class = value;
17
+ } else if (key === "class") {
18
+ result.class = Array.isArray(value) ? value.join(" ") : value;
19
+ } else {
20
+ result[key] = value;
21
+ }
22
+ }
23
+ return result;
24
+ }
25
+ function renderElement(tagName, props, children) {
26
+ switch (tagName) {
27
+ case "p":
28
+ return <p {...props}>{children}</p>;
29
+ case "h1":
30
+ return <h1 {...props}>{children}</h1>;
31
+ case "h2":
32
+ return <h2 {...props}>{children}</h2>;
33
+ case "h3":
34
+ return <h3 {...props}>{children}</h3>;
35
+ case "h4":
36
+ return <h4 {...props}>{children}</h4>;
37
+ case "h5":
38
+ return <h5 {...props}>{children}</h5>;
39
+ case "h6":
40
+ return <h6 {...props}>{children}</h6>;
41
+ case "div":
42
+ return <div {...props}>{children}</div>;
43
+ case "span":
44
+ return <span {...props}>{children}</span>;
45
+ case "a":
46
+ return <a {...props}>{children}</a>;
47
+ case "strong":
48
+ return <strong {...props}>{children}</strong>;
49
+ case "b":
50
+ return <b {...props}>{children}</b>;
51
+ case "em":
52
+ return <em {...props}>{children}</em>;
53
+ case "i":
54
+ return <i {...props}>{children}</i>;
55
+ case "code":
56
+ return <code {...props}>{children}</code>;
57
+ case "pre":
58
+ return <pre {...props}>{children}</pre>;
59
+ case "blockquote":
60
+ return <blockquote {...props}>{children}</blockquote>;
61
+ case "ul":
62
+ return <ul {...props}>{children}</ul>;
63
+ case "ol":
64
+ return <ol {...props}>{children}</ol>;
65
+ case "li":
66
+ return <li {...props}>{children}</li>;
67
+ case "hr":
68
+ return <hr {...props} />;
69
+ case "br":
70
+ return <br {...props} />;
71
+ case "img":
72
+ return <img {...props} />;
73
+ case "table":
74
+ return <table {...props}>{children}</table>;
75
+ case "thead":
76
+ return <thead {...props}>{children}</thead>;
77
+ case "tbody":
78
+ return <tbody {...props}>{children}</tbody>;
79
+ case "tr":
80
+ return <tr {...props}>{children}</tr>;
81
+ case "th":
82
+ return <th {...props}>{children}</th>;
83
+ case "td":
84
+ return <td {...props}>{children}</td>;
85
+ case "del":
86
+ return <del {...props}>{children}</del>;
87
+ case "sup":
88
+ return <sup {...props}>{children}</sup>;
89
+ case "sub":
90
+ return <sub {...props}>{children}</sub>;
91
+ // GFM elements
92
+ case "input":
93
+ return <input {...props} />;
94
+ case "section":
95
+ return <section {...props}>{children}</section>;
96
+ // KaTeX math elements
97
+ case "math":
98
+ return <math {...props}>{children}</math>;
99
+ case "semantics":
100
+ return <semantics {...props}>{children}</semantics>;
101
+ case "mrow":
102
+ return <mrow {...props}>{children}</mrow>;
103
+ case "mi":
104
+ return <mi {...props}>{children}</mi>;
105
+ case "mo":
106
+ return <mo {...props}>{children}</mo>;
107
+ case "mn":
108
+ return <mn {...props}>{children}</mn>;
109
+ case "mfrac":
110
+ return <mfrac {...props}>{children}</mfrac>;
111
+ case "msup":
112
+ return <msup {...props}>{children}</msup>;
113
+ case "msub":
114
+ return <msub {...props}>{children}</msub>;
115
+ case "msubsup":
116
+ return <msubsup {...props}>{children}</msubsup>;
117
+ case "msqrt":
118
+ return <msqrt {...props}>{children}</msqrt>;
119
+ case "mroot":
120
+ return <mroot {...props}>{children}</mroot>;
121
+ case "munder":
122
+ return <munder {...props}>{children}</munder>;
123
+ case "mover":
124
+ return <mover {...props}>{children}</mover>;
125
+ case "munderover":
126
+ return <munderover {...props}>{children}</munderover>;
127
+ case "mtable":
128
+ return <mtable {...props}>{children}</mtable>;
129
+ case "mtr":
130
+ return <mtr {...props}>{children}</mtr>;
131
+ case "mtd":
132
+ return <mtd {...props}>{children}</mtd>;
133
+ case "mtext":
134
+ return <mtext {...props}>{children}</mtext>;
135
+ case "mspace":
136
+ return <mspace {...props}>{children}</mspace>;
137
+ case "annotation":
138
+ return <annotation {...props}>{children}</annotation>;
139
+ case "svg":
140
+ return <svg {...props}>{children}</svg>;
141
+ case "path":
142
+ return <path {...props} />;
143
+ case "line":
144
+ return <line {...props} />;
145
+ case "rect":
146
+ return <rect {...props} />;
147
+ case "circle":
148
+ return <circle {...props} />;
149
+ case "g":
150
+ return <g {...props}>{children}</g>;
151
+ case "defs":
152
+ return <defs {...props}>{children}</defs>;
153
+ case "clipPath":
154
+ return <clipPath {...props}>{children}</clipPath>;
155
+ case "use":
156
+ return <use {...props} />;
157
+ default:
158
+ return <div {...props}>{children}</div>;
159
+ }
160
+ }
161
+ function renderNode(node, components) {
162
+ if (node.type === "text") {
163
+ return node.value;
164
+ }
165
+ if (node.type === "element") {
166
+ const element = node;
167
+ const tagName = element.tagName;
168
+ const rawProps = convertProperties(element.properties);
169
+ const CustomComponent = components[tagName];
170
+ const childElements = element.children.length > 0 ? element.children.map((child) => renderNode(child, components)) : null;
171
+ if (CustomComponent) {
172
+ if (typeof rawProps.payload === "string" && typeof rawProps.raw === "string") {
173
+ const customBlockProps = {
174
+ payload: JSON.parse(rawProps.payload),
175
+ raw: rawProps.raw
176
+ };
177
+ if (typeof rawProps.data === "string") {
178
+ customBlockProps.data = JSON.parse(rawProps.data);
179
+ }
180
+ const Comp2 = CustomComponent;
181
+ return <Comp2 {...customBlockProps}>{childElements}</Comp2>;
182
+ }
183
+ const Comp = CustomComponent;
184
+ return <Comp {...rawProps}>{childElements}</Comp>;
185
+ }
186
+ return renderElement(tagName, rawProps, childElements);
187
+ }
188
+ return null;
189
+ }
190
+ function hastToSolidComponent(hastTree, components = {}) {
191
+ const treeData = hastTree;
192
+ const componentMap = components;
193
+ return function HastBody() {
194
+ const elements = treeData.children.map((node) => renderNode(node, componentMap));
195
+ return <>{elements}</>;
196
+ };
197
+ }
198
+
199
+ // src/remark-custom-blocks.ts
200
+ import { visit } from "unist-util-visit";
201
+ import { parse as parseYaml } from "yaml";
202
+ function remarkCustomBlocks(options) {
203
+ const { components, processor } = options;
204
+ return (tree) => {
205
+ visit(tree, "code", (node, index, parent) => {
206
+ if (!parent || index === void 0) return;
207
+ const lang = node.lang;
208
+ if (!lang) return;
209
+ const isDataBlock = lang.endsWith("|");
210
+ const cleanLang = isDataBlock ? lang.slice(0, -1) : lang;
211
+ const segments = cleanLang.split("/");
212
+ const componentName = segments[0];
213
+ const raw = node.value;
214
+ if (!components.has(componentName)) return;
215
+ const payload = segments.slice(1);
216
+ if (isDataBlock) {
217
+ const data = parseYaml(raw);
218
+ const customNode2 = {
219
+ type: "customBlock",
220
+ data: {
221
+ hName: componentName,
222
+ hProperties: {
223
+ payload: JSON.stringify(payload),
224
+ raw,
225
+ data: JSON.stringify(data)
226
+ }
227
+ },
228
+ children: []
229
+ };
230
+ parent.children[index] = customNode2;
231
+ return;
232
+ }
233
+ const contentMdast = processor.parse(raw);
234
+ const customNode = {
235
+ type: "customBlock",
236
+ data: {
237
+ hName: componentName,
238
+ hProperties: {
239
+ payload: JSON.stringify(payload),
240
+ raw
241
+ }
242
+ },
243
+ children: contentMdast.children
244
+ };
245
+ parent.children[index] = customNode;
246
+ });
247
+ };
248
+ }
249
+
250
+ // src/index.tsx
251
+ function parseLocalMeta(content, processor, components) {
252
+ const metaPattern = /```@\|\s*\n([\s\S]*?)```\s*\n?/g;
253
+ let match;
254
+ let local = {};
255
+ let body = content;
256
+ while ((match = metaPattern.exec(content)) !== null) {
257
+ const parsed = parseYaml2(match[1]);
258
+ local = { ...local, ...parsed };
259
+ }
260
+ body = content.replace(metaPattern, "").trim();
261
+ const localMdPattern = /```@\/(\w+)\s*\n([\s\S]*?)```\s*\n?/g;
262
+ const localMdBlocks = {};
263
+ while ((match = localMdPattern.exec(body)) !== null) {
264
+ const name = match[1];
265
+ const content2 = match[2].trim();
266
+ if (localMdBlocks[name]) {
267
+ localMdBlocks[name] += "\n\n" + content2;
268
+ } else {
269
+ localMdBlocks[name] = content2;
270
+ }
271
+ }
272
+ body = body.replace(localMdPattern, "").trim();
273
+ for (const [name, mdContent] of Object.entries(localMdBlocks)) {
274
+ const mdast = processor.parse(mdContent);
275
+ const hastTree = processor.runSync(mdast);
276
+ local[name] = hastToSolidComponent(hastTree, components);
277
+ }
278
+ return { local, body };
279
+ }
280
+ function parseGlobalMeta(input, processor, components) {
281
+ const globalDataPattern = /```@@\|\s*\n([\s\S]*?)```/g;
282
+ let match;
283
+ let global = {};
284
+ while ((match = globalDataPattern.exec(input)) !== null) {
285
+ const parsed = parseYaml2(match[1]);
286
+ global = { ...global, ...parsed };
287
+ }
288
+ const globalMdPattern = /```@@\/(\w+)\s*\n([\s\S]*?)```/g;
289
+ const globalMdBlocks = {};
290
+ while ((match = globalMdPattern.exec(input)) !== null) {
291
+ const name = match[1];
292
+ const content = match[2].trim();
293
+ if (globalMdBlocks[name]) {
294
+ globalMdBlocks[name] += "\n\n" + content;
295
+ } else {
296
+ globalMdBlocks[name] = content;
297
+ }
298
+ }
299
+ for (const [name, mdContent] of Object.entries(globalMdBlocks)) {
300
+ const mdast = processor.parse(mdContent);
301
+ const hastTree = processor.runSync(mdast);
302
+ global[name] = hastToSolidComponent(hastTree, components);
303
+ }
304
+ return Object.keys(global).length > 0 ? global : null;
305
+ }
306
+ function isInsideCodeBlock(input, position) {
307
+ const beforeText = input.slice(0, position);
308
+ const fencePattern = /^```/gm;
309
+ let fenceCount = 0;
310
+ let match;
311
+ while ((match = fencePattern.exec(beforeText)) !== null) {
312
+ fenceCount++;
313
+ }
314
+ return fenceCount % 2 === 1;
315
+ }
316
+ var VALID_ID_PATTERN = /^[a-z0-9-]+$/;
317
+ function validateStepId(id, lineNumber) {
318
+ if (!VALID_ID_PATTERN.test(id)) {
319
+ throw new Error(
320
+ `Invalid step ID "${id}" at line ${lineNumber}. Step IDs must only contain lowercase letters (a-z), numbers (0-9), and hyphens (-).`
321
+ );
322
+ }
323
+ }
324
+ function parse(input, components = {}) {
325
+ const stepPattern = /^\+\+\+(.+)$/gm;
326
+ const steps = {};
327
+ const componentNames = new Set(Object.keys(components));
328
+ const baseProcessor = unified().use(remarkParse).use(remarkGfm).use(remarkMath);
329
+ const processor = unified().use(remarkParse).use(remarkGfm).use(remarkMath).use(remarkCustomBlocks, {
330
+ components: componentNames,
331
+ processor: baseProcessor
332
+ }).use(remarkRehype, { allowDangerousHtml: true }).use(rehypeKatex);
333
+ const global = parseGlobalMeta(input, processor, components);
334
+ let match;
335
+ const matches = [];
336
+ while ((match = stepPattern.exec(input)) !== null) {
337
+ if (!isInsideCodeBlock(input, match.index)) {
338
+ const id = match[1].trim();
339
+ const lineNumber = input.slice(0, match.index).split("\n").length;
340
+ validateStepId(id, lineNumber);
341
+ matches.push({ id, index: match.index });
342
+ }
343
+ }
344
+ if (matches.length === 0) {
345
+ const { local, body: markdown } = parseLocalMeta(
346
+ input.trim(),
347
+ processor,
348
+ components
349
+ );
350
+ const mdast = processor.parse(markdown);
351
+ const hastTree = processor.runSync(mdast);
352
+ const Body = hastToSolidComponent(hastTree, components);
353
+ steps["default"] = {
354
+ id: "default",
355
+ local,
356
+ Body,
357
+ prev: null,
358
+ next: null,
359
+ current: 1
360
+ };
361
+ return {
362
+ first: "default",
363
+ steps,
364
+ count: 1,
365
+ global
366
+ };
367
+ }
368
+ for (let i = 0; i < matches.length; i++) {
369
+ const current = matches[i];
370
+ const nextMatch = matches[i + 1];
371
+ const prevMatch = matches[i - 1];
372
+ const startIndex = current.index + `+++${current.id}`.length;
373
+ const endIndex = nextMatch ? nextMatch.index : input.length;
374
+ const rawContent = input.slice(startIndex, endIndex).trim();
375
+ const { local, body: markdown } = parseLocalMeta(
376
+ rawContent,
377
+ processor,
378
+ components
379
+ );
380
+ const mdast = processor.parse(markdown);
381
+ const hastTree = processor.runSync(mdast);
382
+ const Body = hastToSolidComponent(hastTree, components);
383
+ steps[current.id] = {
384
+ id: current.id,
385
+ local,
386
+ Body,
387
+ prev: prevMatch ? prevMatch.id : null,
388
+ next: nextMatch ? nextMatch.id : null,
389
+ current: i + 1
390
+ };
391
+ }
392
+ return {
393
+ first: matches.length > 0 ? matches[0].id : null,
394
+ steps,
395
+ count: matches.length,
396
+ global
397
+ };
398
+ }
399
+ export {
400
+ parse
401
+ };
402
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzeCIsICIuLi9zcmMvaGFzdC10by1zb2xpZC50c3giLCAiLi4vc3JjL3JlbWFyay1jdXN0b20tYmxvY2tzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDb21wb25lbnQsIEpTWCB9IGZyb20gXCJzb2xpZC1qc1wiO1xuaW1wb3J0IHsgdW5pZmllZCwgdHlwZSBQcm9jZXNzb3IgfSBmcm9tIFwidW5pZmllZFwiO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gXCJyZW1hcmstcGFyc2VcIjtcbmltcG9ydCByZW1hcmtHZm0gZnJvbSBcInJlbWFyay1nZm1cIjtcbmltcG9ydCByZW1hcmtNYXRoIGZyb20gXCJyZW1hcmstbWF0aFwiO1xuaW1wb3J0IHJlbWFya1JlaHlwZSBmcm9tIFwicmVtYXJrLXJlaHlwZVwiO1xuaW1wb3J0IHJlaHlwZUthdGV4IGZyb20gXCJyZWh5cGUta2F0ZXhcIjtcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlWWFtbCB9IGZyb20gXCJ5YW1sXCI7XG5pbXBvcnQgdHlwZSB7IFJvb3QgfSBmcm9tIFwiaGFzdFwiO1xuaW1wb3J0IHtcbiAgaGFzdFRvU29saWRKc3gsXG4gIGhhc3RUb1NvbGlkQ29tcG9uZW50LFxuICBDb21wb25lbnRNYXAsXG59IGZyb20gXCIuL2hhc3QtdG8tc29saWRcIjtcbmltcG9ydCB7IHJlbWFya0N1c3RvbUJsb2NrcyB9IGZyb20gXCIuL3JlbWFyay1jdXN0b20tYmxvY2tzXCI7XG5cbmV4cG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50TWFwLFxuICBDdXN0b21CbG9ja1Byb3BzLFxuICBTdGFuZGFyZENvbXBvbmVudFByb3BzLFxufSBmcm9tIFwiLi9oYXN0LXRvLXNvbGlkXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcExvY2FsQmFzZSB7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2xvYmFsTWV0YUJhc2Uge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXA8VExvY2FsID0gU3RlcExvY2FsQmFzZT4ge1xuICBpZDogc3RyaW5nO1xuICBsb2NhbDogVExvY2FsO1xuICAvKiogQ29tcG9uZW50IGZ1bmN0aW9uIHRoYXQgcmVuZGVycyB0aGUgc3RlcCBib2R5LiBDYWxsIGl0IHRvIGdldCBKU1g6IHtzdGVwLkJvZHkoKX0gKi9cbiAgQm9keTogQ29tcG9uZW50O1xuICBwcmV2OiBzdHJpbmcgfCBudWxsO1xuICBuZXh0OiBzdHJpbmcgfCBudWxsO1xuICBjdXJyZW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VSZXN1bHQ8VEdsb2JhbCA9IEdsb2JhbE1ldGFCYXNlLCBUTG9jYWwgPSBTdGVwTG9jYWxCYXNlPiB7XG4gIGZpcnN0OiBzdHJpbmcgfCBudWxsO1xuICBzdGVwczogUmVjb3JkPHN0cmluZywgU3RlcDxUTG9jYWw+PjtcbiAgY291bnQ6IG51bWJlcjtcbiAgZ2xvYmFsOiBUR2xvYmFsIHwgbnVsbDtcbn1cblxuXG5mdW5jdGlvbiBwYXJzZUxvY2FsTWV0YShcbiAgY29udGVudDogc3RyaW5nLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcm9jZXNzb3I6IFByb2Nlc3NvcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4sXG4gIGNvbXBvbmVudHM6IENvbXBvbmVudE1hcCxcbik6IHsgbG9jYWw6IFN0ZXBMb2NhbEJhc2U7IGJvZHk6IHN0cmluZyB9IHtcbiAgLy8gTWF0Y2ggYWxsIGxvY2FsIG1ldGFkYXRhIGJsb2NrczogYGBgQHwgLi4uIGBgYFxuICAvLyBNdWx0aXBsZSBibG9ja3MgYXJlIG1lcmdlZCwgbGF0ZXIgdmFsdWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lc1xuICBjb25zdCBtZXRhUGF0dGVybiA9IC9gYGBAXFx8XFxzKlxcbihbXFxzXFxTXSo/KWBgYFxccypcXG4/L2c7XG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgbGV0IGxvY2FsOiBTdGVwTG9jYWxCYXNlID0ge307XG4gIGxldCBib2R5ID0gY29udGVudDtcblxuICB3aGlsZSAoKG1hdGNoID0gbWV0YVBhdHRlcm4uZXhlYyhjb250ZW50KSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVlhbWwobWF0Y2hbMV0pO1xuICAgIGxvY2FsID0geyAuLi5sb2NhbCwgLi4ucGFyc2VkIH07XG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIG1ldGFkYXRhIGJsb2NrcyBmcm9tIGJvZHlcbiAgYm9keSA9IGNvbnRlbnQucmVwbGFjZShtZXRhUGF0dGVybiwgXCJcIikudHJpbSgpO1xuXG4gIC8vIE1hdGNoIGxvY2FsIG1kIGJsb2NrczogYGBgQC9uYW1lIC4uLiBgYGBcbiAgLy8gVGhlc2UgYXJlIG1hcmtkb3duIGJsb2NrcyB0aGF0IGdldCByZW5kZXJlZCBhbmQgc3RvcmVkIGluIGxvY2FsW25hbWVdXG4gIGNvbnN0IGxvY2FsTWRQYXR0ZXJuID0gL2BgYEBcXC8oXFx3KylcXHMqXFxuKFtcXHNcXFNdKj8pYGBgXFxzKlxcbj8vZztcbiAgY29uc3QgbG9jYWxNZEJsb2NrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIHdoaWxlICgobWF0Y2ggPSBsb2NhbE1kUGF0dGVybi5leGVjKGJvZHkpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IG5hbWUgPSBtYXRjaFsxXTtcbiAgICBjb25zdCBjb250ZW50ID0gbWF0Y2hbMl0udHJpbSgpO1xuICAgIC8vIENvbmNhdGVuYXRlIGlmIG11bHRpcGxlIGJsb2NrcyB3aXRoIHNhbWUgbmFtZVxuICAgIGlmIChsb2NhbE1kQmxvY2tzW25hbWVdKSB7XG4gICAgICBsb2NhbE1kQmxvY2tzW25hbWVdICs9IFwiXFxuXFxuXCIgKyBjb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbE1kQmxvY2tzW25hbWVdID0gY29udGVudDtcbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIGxvY2FsIG1kIGJsb2NrcyBmcm9tIGJvZHlcbiAgYm9keSA9IGJvZHkucmVwbGFjZShsb2NhbE1kUGF0dGVybiwgXCJcIikudHJpbSgpO1xuXG4gIC8vIENvbnZlcnQgYWxsIGxvY2FsIG1kIGJsb2NrcyB0byBKU1hcbiAgZm9yIChjb25zdCBbbmFtZSwgbWRDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhsb2NhbE1kQmxvY2tzKSkge1xuICAgIGNvbnN0IG1kYXN0ID0gcHJvY2Vzc29yLnBhcnNlKG1kQ29udGVudCk7XG4gICAgY29uc3QgaGFzdFRyZWUgPSBwcm9jZXNzb3IucnVuU3luYyhtZGFzdCkgYXMgUm9vdDtcbiAgICBsb2NhbFtuYW1lXSA9IGhhc3RUb1NvbGlkQ29tcG9uZW50KGhhc3RUcmVlLCBjb21wb25lbnRzKTtcbiAgfVxuXG4gIHJldHVybiB7IGxvY2FsLCBib2R5IH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlR2xvYmFsTWV0YShcbiAgaW5wdXQ6IHN0cmluZyxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJvY2Vzc29yOiBQcm9jZXNzb3I8YW55LCBhbnksIGFueSwgYW55LCBhbnk+LFxuICBjb21wb25lbnRzOiBDb21wb25lbnRNYXAsXG4pOiBHbG9iYWxNZXRhQmFzZSB8IG51bGwge1xuICAvLyBNYXRjaCBnbG9iYWwgZGF0YSBibG9ja3M6IGBgYEBAfCAuLi4gYGBgXG4gIC8vIENhbiBhcHBlYXIgYW55d2hlcmUgaW4gdGhlIGRvY3VtZW50LCBtYXkgaGF2ZSBtdWx0aXBsZSBibG9ja3NcbiAgY29uc3QgZ2xvYmFsRGF0YVBhdHRlcm4gPSAvYGBgQEBcXHxcXHMqXFxuKFtcXHNcXFNdKj8pYGBgL2c7XG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgbGV0IGdsb2JhbDogR2xvYmFsTWV0YUJhc2UgPSB7fTtcblxuICB3aGlsZSAoKG1hdGNoID0gZ2xvYmFsRGF0YVBhdHRlcm4uZXhlYyhpbnB1dCkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VZYW1sKG1hdGNoWzFdKTtcbiAgICBnbG9iYWwgPSB7IC4uLmdsb2JhbCwgLi4ucGFyc2VkIH07XG4gIH1cblxuICAvLyBNYXRjaCBnbG9iYWwgbWQgYmxvY2tzOiBgYGBAQC9uYW1lIC4uLiBgYGBcbiAgLy8gVGhlc2UgYXJlIG1hcmtkb3duIGJsb2NrcyB0aGF0IGdldCByZW5kZXJlZCBhbmQgc3RvcmVkIGluIGdsb2JhbFtuYW1lXVxuICBjb25zdCBnbG9iYWxNZFBhdHRlcm4gPSAvYGBgQEBcXC8oXFx3KylcXHMqXFxuKFtcXHNcXFNdKj8pYGBgL2c7XG4gIGNvbnN0IGdsb2JhbE1kQmxvY2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgd2hpbGUgKChtYXRjaCA9IGdsb2JhbE1kUGF0dGVybi5leGVjKGlucHV0KSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBuYW1lID0gbWF0Y2hbMV07XG4gICAgY29uc3QgY29udGVudCA9IG1hdGNoWzJdLnRyaW0oKTtcbiAgICAvLyBDb25jYXRlbmF0ZSBpZiBtdWx0aXBsZSBibG9ja3Mgd2l0aCBzYW1lIG5hbWVcbiAgICBpZiAoZ2xvYmFsTWRCbG9ja3NbbmFtZV0pIHtcbiAgICAgIGdsb2JhbE1kQmxvY2tzW25hbWVdICs9IFwiXFxuXFxuXCIgKyBjb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iYWxNZEJsb2Nrc1tuYW1lXSA9IGNvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29udmVydCBhbGwgZ2xvYmFsIG1kIGJsb2NrcyB0byBDb21wb25lbnRzXG4gIGZvciAoY29uc3QgW25hbWUsIG1kQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZ2xvYmFsTWRCbG9ja3MpKSB7XG4gICAgY29uc3QgbWRhc3QgPSBwcm9jZXNzb3IucGFyc2UobWRDb250ZW50KTtcbiAgICBjb25zdCBoYXN0VHJlZSA9IHByb2Nlc3Nvci5ydW5TeW5jKG1kYXN0KSBhcyBSb290O1xuICAgIGdsb2JhbFtuYW1lXSA9IGhhc3RUb1NvbGlkQ29tcG9uZW50KGhhc3RUcmVlLCBjb21wb25lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhnbG9iYWwpLmxlbmd0aCA+IDAgPyBnbG9iYWwgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBpc0luc2lkZUNvZGVCbG9jayhpbnB1dDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gIC8vIEZpbmQgYWxsIGNvZGUgYmxvY2sgZmVuY2VzIGJlZm9yZSB0aGlzIHBvc2l0aW9uXG4gIGNvbnN0IGJlZm9yZVRleHQgPSBpbnB1dC5zbGljZSgwLCBwb3NpdGlvbik7XG4gIGNvbnN0IGZlbmNlUGF0dGVybiA9IC9eYGBgL2dtO1xuICBsZXQgZmVuY2VDb3VudCA9IDA7XG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcblxuICB3aGlsZSAoKG1hdGNoID0gZmVuY2VQYXR0ZXJuLmV4ZWMoYmVmb3JlVGV4dCkpICE9PSBudWxsKSB7XG4gICAgZmVuY2VDb3VudCsrO1xuICB9XG5cbiAgLy8gSWYgb2RkIG51bWJlciBvZiBmZW5jZXMsIHdlJ3JlIGluc2lkZSBhIGNvZGUgYmxvY2tcbiAgcmV0dXJuIGZlbmNlQ291bnQgJSAyID09PSAxO1xufVxuXG5jb25zdCBWQUxJRF9JRF9QQVRURVJOID0gL15bYS16MC05LV0rJC87XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RlcElkKGlkOiBzdHJpbmcsIGxpbmVOdW1iZXI6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIVZBTElEX0lEX1BBVFRFUk4udGVzdChpZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBzdGVwIElEIFwiJHtpZH1cIiBhdCBsaW5lICR7bGluZU51bWJlcn0uIGAgK1xuICAgICAgICBgU3RlcCBJRHMgbXVzdCBvbmx5IGNvbnRhaW4gbG93ZXJjYXNlIGxldHRlcnMgKGEteiksIG51bWJlcnMgKDAtOSksIGFuZCBoeXBoZW5zICgtKS5gLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlPFRHbG9iYWwgPSBHbG9iYWxNZXRhQmFzZSwgVExvY2FsID0gU3RlcExvY2FsQmFzZT4oXG4gIGlucHV0OiBzdHJpbmcsXG4gIGNvbXBvbmVudHM6IENvbXBvbmVudE1hcCA9IHt9LFxuKTogUGFyc2VSZXN1bHQ8VEdsb2JhbCwgVExvY2FsPiB7XG4gIC8vIENhcHR1cmUgZXZlcnl0aGluZyBhZnRlciArKysgdW50aWwgZW5kIG9mIGxpbmVcbiAgY29uc3Qgc3RlcFBhdHRlcm4gPSAvXlxcK1xcK1xcKyguKykkL2dtO1xuICBjb25zdCBzdGVwczogUmVjb3JkPHN0cmluZywgU3RlcDxUTG9jYWw+PiA9IHt9O1xuICBjb25zdCBjb21wb25lbnROYW1lcyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoY29tcG9uZW50cykpO1xuICBjb25zdCBiYXNlUHJvY2Vzc29yID0gdW5pZmllZCgpXG4gICAgLnVzZShyZW1hcmtQYXJzZSlcbiAgICAudXNlKHJlbWFya0dmbSlcbiAgICAudXNlKHJlbWFya01hdGgpO1xuICBjb25zdCBwcm9jZXNzb3IgPSB1bmlmaWVkKClcbiAgICAudXNlKHJlbWFya1BhcnNlKVxuICAgIC51c2UocmVtYXJrR2ZtKVxuICAgIC51c2UocmVtYXJrTWF0aClcbiAgICAudXNlKHJlbWFya0N1c3RvbUJsb2Nrcywge1xuICAgICAgY29tcG9uZW50czogY29tcG9uZW50TmFtZXMsXG4gICAgICBwcm9jZXNzb3I6IGJhc2VQcm9jZXNzb3IsXG4gICAgfSlcbiAgICAudXNlKHJlbWFya1JlaHlwZSwgeyBhbGxvd0Rhbmdlcm91c0h0bWw6IHRydWUgfSlcbiAgICAudXNlKHJlaHlwZUthdGV4KTtcbiAgY29uc3QgZ2xvYmFsID0gcGFyc2VHbG9iYWxNZXRhKGlucHV0LCBwcm9jZXNzb3IsIGNvbXBvbmVudHMpO1xuXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgY29uc3QgbWF0Y2hlczogeyBpZDogc3RyaW5nOyBpbmRleDogbnVtYmVyIH1bXSA9IFtdO1xuXG4gIHdoaWxlICgobWF0Y2ggPSBzdGVwUGF0dGVybi5leGVjKGlucHV0KSkgIT09IG51bGwpIHtcbiAgICAvLyBTa2lwIHRoaXMgbWF0Y2ggaWYgaXQncyBpbnNpZGUgYSBjb2RlIGJsb2NrXG4gICAgaWYgKCFpc0luc2lkZUNvZGVCbG9jayhpbnB1dCwgbWF0Y2guaW5kZXgpKSB7XG4gICAgICBjb25zdCBpZCA9IG1hdGNoWzFdLnRyaW0oKTtcbiAgICAgIC8vIENhbGN1bGF0ZSBsaW5lIG51bWJlciBmb3IgZXJyb3IgbWVzc2FnZXNcbiAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBpbnB1dC5zbGljZSgwLCBtYXRjaC5pbmRleCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xuICAgICAgdmFsaWRhdGVTdGVwSWQoaWQsIGxpbmVOdW1iZXIpO1xuICAgICAgbWF0Y2hlcy5wdXNoKHsgaWQsIGluZGV4OiBtYXRjaC5pbmRleCB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBJZiBubyBzZXBhcmF0b3JzIGZvdW5kLCB0cmVhdCB0aGUgZW50aXJlIGlucHV0IGFzIGEgc2luZ2xlIFwiZGVmYXVsdFwiIHN0ZXBcbiAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc3QgeyBsb2NhbCwgYm9keTogbWFya2Rvd24gfSA9IHBhcnNlTG9jYWxNZXRhKFxuICAgICAgaW5wdXQudHJpbSgpLFxuICAgICAgcHJvY2Vzc29yLFxuICAgICAgY29tcG9uZW50cyxcbiAgICApO1xuXG4gICAgY29uc3QgbWRhc3QgPSBwcm9jZXNzb3IucGFyc2UobWFya2Rvd24pO1xuICAgIGNvbnN0IGhhc3RUcmVlID0gcHJvY2Vzc29yLnJ1blN5bmMobWRhc3QpIGFzIFJvb3Q7XG4gICAgY29uc3QgQm9keSA9IGhhc3RUb1NvbGlkQ29tcG9uZW50KGhhc3RUcmVlLCBjb21wb25lbnRzKTtcblxuICAgIHN0ZXBzW1wiZGVmYXVsdFwiXSA9IHtcbiAgICAgIGlkOiBcImRlZmF1bHRcIixcbiAgICAgIGxvY2FsOiBsb2NhbCBhcyBUTG9jYWwsXG4gICAgICBCb2R5LFxuICAgICAgcHJldjogbnVsbCxcbiAgICAgIG5leHQ6IG51bGwsXG4gICAgICBjdXJyZW50OiAxLFxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlyc3Q6IFwiZGVmYXVsdFwiLFxuICAgICAgc3RlcHMsXG4gICAgICBjb3VudDogMSxcbiAgICAgIGdsb2JhbDogZ2xvYmFsIGFzIFRHbG9iYWwgfCBudWxsLFxuICAgIH07XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjdXJyZW50ID0gbWF0Y2hlc1tpXTtcbiAgICBjb25zdCBuZXh0TWF0Y2ggPSBtYXRjaGVzW2kgKyAxXTtcbiAgICBjb25zdCBwcmV2TWF0Y2ggPSBtYXRjaGVzW2kgLSAxXTtcblxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJyZW50LmluZGV4ICsgYCsrKyR7Y3VycmVudC5pZH1gLmxlbmd0aDtcbiAgICBjb25zdCBlbmRJbmRleCA9IG5leHRNYXRjaCA/IG5leHRNYXRjaC5pbmRleCA6IGlucHV0Lmxlbmd0aDtcblxuICAgIGNvbnN0IHJhd0NvbnRlbnQgPSBpbnB1dC5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCkudHJpbSgpO1xuICAgIGNvbnN0IHsgbG9jYWwsIGJvZHk6IG1hcmtkb3duIH0gPSBwYXJzZUxvY2FsTWV0YShcbiAgICAgIHJhd0NvbnRlbnQsXG4gICAgICBwcm9jZXNzb3IsXG4gICAgICBjb21wb25lbnRzLFxuICAgICk7XG5cbiAgICBjb25zdCBtZGFzdCA9IHByb2Nlc3Nvci5wYXJzZShtYXJrZG93bik7XG4gICAgY29uc3QgaGFzdFRyZWUgPSBwcm9jZXNzb3IucnVuU3luYyhtZGFzdCkgYXMgUm9vdDtcbiAgICBjb25zdCBCb2R5ID0gaGFzdFRvU29saWRDb21wb25lbnQoaGFzdFRyZWUsIGNvbXBvbmVudHMpO1xuXG4gICAgc3RlcHNbY3VycmVudC5pZF0gPSB7XG4gICAgICBpZDogY3VycmVudC5pZCxcbiAgICAgIGxvY2FsOiBsb2NhbCBhcyBUTG9jYWwsXG4gICAgICBCb2R5LFxuICAgICAgcHJldjogcHJldk1hdGNoID8gcHJldk1hdGNoLmlkIDogbnVsbCxcbiAgICAgIG5leHQ6IG5leHRNYXRjaCA/IG5leHRNYXRjaC5pZCA6IG51bGwsXG4gICAgICBjdXJyZW50OiBpICsgMSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmaXJzdDogbWF0Y2hlcy5sZW5ndGggPiAwID8gbWF0Y2hlc1swXS5pZCA6IG51bGwsXG4gICAgc3RlcHMsXG4gICAgY291bnQ6IG1hdGNoZXMubGVuZ3RoLFxuICAgIGdsb2JhbDogZ2xvYmFsIGFzIFRHbG9iYWwgfCBudWxsLFxuICB9O1xufVxuIiwgImltcG9ydCB7IEpTWCwgQ29tcG9uZW50LCBjaGlsZHJlbiBhcyByZXNvbHZlQ2hpbGRyZW4gfSBmcm9tIFwic29saWQtanNcIjtcbmltcG9ydCB0eXBlIHsgUm9vdCwgRWxlbWVudCwgVGV4dCwgUm9vdENvbnRlbnQgfSBmcm9tIFwiaGFzdFwiO1xuXG4vKipcbiAqIFByb3BzIGZvciBjdXN0b20gYmxvY2sgY29tcG9uZW50cyAoY29kZSBibG9ja3Mgd2l0aCBuYW1lL3N1Yi9wYXRoIHN5bnRheClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21CbG9ja1Byb3BzIHtcbiAgLyoqIFRoZSBwYXRoIHNlZ21lbnRzIGFmdGVyIHRoZSBjb21wb25lbnQgbmFtZSwgZS5nLiBbJ3N1YnN0cnVjdHVyZScsICdzdWJzdWInXSAqL1xuICBwYXlsb2FkOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSByYXcgY29udGVudCBvZiB0aGUgY29kZSBibG9jayBhcyBwbGFpbiB0ZXh0ICovXG4gIHJhdzogc3RyaW5nO1xuICAvKiogUGFyc2VkIFlBTUwgZGF0YSB3aGVuIHVzaW5nIGNvbXBvbmVudE5hbWV8IHN5bnRheCAqL1xuICBkYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuICAvKiogVGhlIG1hcmtkb3duLXJlbmRlcmVkIGNvbnRlbnQgYXMgY2hpbGRyZW4gKi9cbiAgY2hpbGRyZW4/OiBKU1guRWxlbWVudDtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBjb21wb25lbnQgcHJvcHMgZm9yIHJlZ3VsYXIgSFRNTCBlbGVtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYXJkQ29tcG9uZW50UHJvcHMge1xuICBjaGlsZHJlbj86IEpTWC5FbGVtZW50O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgdHlwZSBDb21wb25lbnRNYXAgPSB7XG4gIFt0YWdOYW1lOiBzdHJpbmddOiBDb21wb25lbnQ8Q3VzdG9tQmxvY2tQcm9wcz4gfCBDb21wb25lbnQ8U3RhbmRhcmRDb21wb25lbnRQcm9wcz47XG59O1xuXG5mdW5jdGlvbiBjb252ZXJ0UHJvcGVydGllcyhcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKCFwcm9wZXJ0aWVzKSByZXR1cm4ge307XG5cbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpKSB7XG4gICAgaWYgKGtleSA9PT0gXCJjbGFzc05hbWVcIikge1xuICAgICAgcmVzdWx0LmNsYXNzID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgICAgcmVzdWx0LmNsYXNzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKFwiIFwiKSA6IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckVsZW1lbnQoXG4gIHRhZ05hbWU6IHN0cmluZyxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjaGlsZHJlbjogSlNYLkVsZW1lbnRcbik6IEpTWC5FbGVtZW50IHtcbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgY2FzZSBcInBcIjpcbiAgICAgIHJldHVybiA8cCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3A+O1xuICAgIGNhc2UgXCJoMVwiOlxuICAgICAgcmV0dXJuIDxoMSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2gxPjtcbiAgICBjYXNlIFwiaDJcIjpcbiAgICAgIHJldHVybiA8aDIgey4uLnByb3BzfT57Y2hpbGRyZW59PC9oMj47XG4gICAgY2FzZSBcImgzXCI6XG4gICAgICByZXR1cm4gPGgzIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvaDM+O1xuICAgIGNhc2UgXCJoNFwiOlxuICAgICAgcmV0dXJuIDxoNCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2g0PjtcbiAgICBjYXNlIFwiaDVcIjpcbiAgICAgIHJldHVybiA8aDUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9oNT47XG4gICAgY2FzZSBcImg2XCI6XG4gICAgICByZXR1cm4gPGg2IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvaDY+O1xuICAgIGNhc2UgXCJkaXZcIjpcbiAgICAgIHJldHVybiA8ZGl2IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvZGl2PjtcbiAgICBjYXNlIFwic3BhblwiOlxuICAgICAgcmV0dXJuIDxzcGFuIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvc3Bhbj47XG4gICAgY2FzZSBcImFcIjpcbiAgICAgIHJldHVybiA8YSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2E+O1xuICAgIGNhc2UgXCJzdHJvbmdcIjpcbiAgICAgIHJldHVybiA8c3Ryb25nIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvc3Ryb25nPjtcbiAgICBjYXNlIFwiYlwiOlxuICAgICAgcmV0dXJuIDxiIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvYj47XG4gICAgY2FzZSBcImVtXCI6XG4gICAgICByZXR1cm4gPGVtIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvZW0+O1xuICAgIGNhc2UgXCJpXCI6XG4gICAgICByZXR1cm4gPGkgey4uLnByb3BzfT57Y2hpbGRyZW59PC9pPjtcbiAgICBjYXNlIFwiY29kZVwiOlxuICAgICAgcmV0dXJuIDxjb2RlIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvY29kZT47XG4gICAgY2FzZSBcInByZVwiOlxuICAgICAgcmV0dXJuIDxwcmUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9wcmU+O1xuICAgIGNhc2UgXCJibG9ja3F1b3RlXCI6XG4gICAgICByZXR1cm4gPGJsb2NrcXVvdGUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9ibG9ja3F1b3RlPjtcbiAgICBjYXNlIFwidWxcIjpcbiAgICAgIHJldHVybiA8dWwgey4uLnByb3BzfT57Y2hpbGRyZW59PC91bD47XG4gICAgY2FzZSBcIm9sXCI6XG4gICAgICByZXR1cm4gPG9sIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvb2w+O1xuICAgIGNhc2UgXCJsaVwiOlxuICAgICAgcmV0dXJuIDxsaSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2xpPjtcbiAgICBjYXNlIFwiaHJcIjpcbiAgICAgIHJldHVybiA8aHIgey4uLnByb3BzfSAvPjtcbiAgICBjYXNlIFwiYnJcIjpcbiAgICAgIHJldHVybiA8YnIgey4uLnByb3BzfSAvPjtcbiAgICBjYXNlIFwiaW1nXCI6XG4gICAgICByZXR1cm4gPGltZyB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgXCJ0YWJsZVwiOlxuICAgICAgcmV0dXJuIDx0YWJsZSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3RhYmxlPjtcbiAgICBjYXNlIFwidGhlYWRcIjpcbiAgICAgIHJldHVybiA8dGhlYWQgey4uLnByb3BzfT57Y2hpbGRyZW59PC90aGVhZD47XG4gICAgY2FzZSBcInRib2R5XCI6XG4gICAgICByZXR1cm4gPHRib2R5IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvdGJvZHk+O1xuICAgIGNhc2UgXCJ0clwiOlxuICAgICAgcmV0dXJuIDx0ciB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3RyPjtcbiAgICBjYXNlIFwidGhcIjpcbiAgICAgIHJldHVybiA8dGggey4uLnByb3BzfT57Y2hpbGRyZW59PC90aD47XG4gICAgY2FzZSBcInRkXCI6XG4gICAgICByZXR1cm4gPHRkIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvdGQ+O1xuICAgIGNhc2UgXCJkZWxcIjpcbiAgICAgIHJldHVybiA8ZGVsIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvZGVsPjtcbiAgICBjYXNlIFwic3VwXCI6XG4gICAgICByZXR1cm4gPHN1cCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3N1cD47XG4gICAgY2FzZSBcInN1YlwiOlxuICAgICAgcmV0dXJuIDxzdWIgey4uLnByb3BzfT57Y2hpbGRyZW59PC9zdWI+O1xuICAgIC8vIEdGTSBlbGVtZW50c1xuICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgcmV0dXJuIDxpbnB1dCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgXCJzZWN0aW9uXCI6XG4gICAgICByZXR1cm4gPHNlY3Rpb24gey4uLnByb3BzfT57Y2hpbGRyZW59PC9zZWN0aW9uPjtcbiAgICAvLyBLYVRlWCBtYXRoIGVsZW1lbnRzXG4gICAgY2FzZSBcIm1hdGhcIjpcbiAgICAgIHJldHVybiA8bWF0aCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21hdGg+O1xuICAgIGNhc2UgXCJzZW1hbnRpY3NcIjpcbiAgICAgIHJldHVybiA8c2VtYW50aWNzIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvc2VtYW50aWNzPjtcbiAgICBjYXNlIFwibXJvd1wiOlxuICAgICAgcmV0dXJuIDxtcm93IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXJvdz47XG4gICAgY2FzZSBcIm1pXCI6XG4gICAgICByZXR1cm4gPG1pIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbWk+O1xuICAgIGNhc2UgXCJtb1wiOlxuICAgICAgcmV0dXJuIDxtbyB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21vPjtcbiAgICBjYXNlIFwibW5cIjpcbiAgICAgIHJldHVybiA8bW4gey4uLnByb3BzfT57Y2hpbGRyZW59PC9tbj47XG4gICAgY2FzZSBcIm1mcmFjXCI6XG4gICAgICByZXR1cm4gPG1mcmFjIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbWZyYWM+O1xuICAgIGNhc2UgXCJtc3VwXCI6XG4gICAgICByZXR1cm4gPG1zdXAgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tc3VwPjtcbiAgICBjYXNlIFwibXN1YlwiOlxuICAgICAgcmV0dXJuIDxtc3ViIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXN1Yj47XG4gICAgY2FzZSBcIm1zdWJzdXBcIjpcbiAgICAgIHJldHVybiA8bXN1YnN1cCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21zdWJzdXA+O1xuICAgIGNhc2UgXCJtc3FydFwiOlxuICAgICAgcmV0dXJuIDxtc3FydCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21zcXJ0PjtcbiAgICBjYXNlIFwibXJvb3RcIjpcbiAgICAgIHJldHVybiA8bXJvb3Qgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tcm9vdD47XG4gICAgY2FzZSBcIm11bmRlclwiOlxuICAgICAgcmV0dXJuIDxtdW5kZXIgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tdW5kZXI+O1xuICAgIGNhc2UgXCJtb3ZlclwiOlxuICAgICAgcmV0dXJuIDxtb3ZlciB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21vdmVyPjtcbiAgICBjYXNlIFwibXVuZGVyb3ZlclwiOlxuICAgICAgcmV0dXJuIDxtdW5kZXJvdmVyIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXVuZGVyb3Zlcj47XG4gICAgY2FzZSBcIm10YWJsZVwiOlxuICAgICAgcmV0dXJuIDxtdGFibGUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tdGFibGU+O1xuICAgIGNhc2UgXCJtdHJcIjpcbiAgICAgIHJldHVybiA8bXRyIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXRyPjtcbiAgICBjYXNlIFwibXRkXCI6XG4gICAgICByZXR1cm4gPG10ZCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L210ZD47XG4gICAgY2FzZSBcIm10ZXh0XCI6XG4gICAgICByZXR1cm4gPG10ZXh0IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXRleHQ+O1xuICAgIGNhc2UgXCJtc3BhY2VcIjpcbiAgICAgIHJldHVybiA8bXNwYWNlIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXNwYWNlPjtcbiAgICBjYXNlIFwiYW5ub3RhdGlvblwiOlxuICAgICAgcmV0dXJuIDxhbm5vdGF0aW9uIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvYW5ub3RhdGlvbj47XG4gICAgY2FzZSBcInN2Z1wiOlxuICAgICAgcmV0dXJuIDxzdmcgey4uLnByb3BzfT57Y2hpbGRyZW59PC9zdmc+O1xuICAgIGNhc2UgXCJwYXRoXCI6XG4gICAgICByZXR1cm4gPHBhdGggey4uLnByb3BzfSAvPjtcbiAgICBjYXNlIFwibGluZVwiOlxuICAgICAgcmV0dXJuIDxsaW5lIHsuLi5wcm9wc30gLz47XG4gICAgY2FzZSBcInJlY3RcIjpcbiAgICAgIHJldHVybiA8cmVjdCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgXCJjaXJjbGVcIjpcbiAgICAgIHJldHVybiA8Y2lyY2xlIHsuLi5wcm9wc30gLz47XG4gICAgY2FzZSBcImdcIjpcbiAgICAgIHJldHVybiA8ZyB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2c+O1xuICAgIGNhc2UgXCJkZWZzXCI6XG4gICAgICByZXR1cm4gPGRlZnMgey4uLnByb3BzfT57Y2hpbGRyZW59PC9kZWZzPjtcbiAgICBjYXNlIFwiY2xpcFBhdGhcIjpcbiAgICAgIHJldHVybiA8Y2xpcFBhdGggey4uLnByb3BzfT57Y2hpbGRyZW59PC9jbGlwUGF0aD47XG4gICAgY2FzZSBcInVzZVwiOlxuICAgICAgcmV0dXJuIDx1c2Ugey4uLnByb3BzfSAvPjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDxkaXYgey4uLnByb3BzfT57Y2hpbGRyZW59PC9kaXY+O1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlck5vZGUoXG4gIG5vZGU6IFJvb3RDb250ZW50LFxuICBjb21wb25lbnRzOiBDb21wb25lbnRNYXBcbik6IEpTWC5FbGVtZW50IHwgc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChub2RlLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgcmV0dXJuIChub2RlIGFzIFRleHQpLnZhbHVlO1xuICB9XG5cbiAgaWYgKG5vZGUudHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBFbGVtZW50O1xuICAgIGNvbnN0IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWU7XG4gICAgY29uc3QgcmF3UHJvcHMgPSBjb252ZXJ0UHJvcGVydGllcyhlbGVtZW50LnByb3BlcnRpZXMpO1xuICAgIGNvbnN0IEN1c3RvbUNvbXBvbmVudCA9IGNvbXBvbmVudHNbdGFnTmFtZV07XG5cbiAgICBjb25zdCBjaGlsZEVsZW1lbnRzID1cbiAgICAgIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMFxuICAgICAgICA/IGVsZW1lbnQuY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4gcmVuZGVyTm9kZShjaGlsZCwgY29tcG9uZW50cykpXG4gICAgICAgIDogbnVsbDtcblxuICAgIGlmIChDdXN0b21Db21wb25lbnQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjdXN0b20gYmxvY2sgY29tcG9uZW50IChoYXMgcGF5bG9hZCBhbmQgcmF3IHByb3BzKVxuICAgICAgaWYgKHR5cGVvZiByYXdQcm9wcy5wYXlsb2FkID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiByYXdQcm9wcy5yYXcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gRGVzZXJpYWxpemUgcGF5bG9hZCBmcm9tIEpTT04gc3RyaW5nXG4gICAgICAgIGNvbnN0IGN1c3RvbUJsb2NrUHJvcHM6IEN1c3RvbUJsb2NrUHJvcHMgPSB7XG4gICAgICAgICAgcGF5bG9hZDogSlNPTi5wYXJzZShyYXdQcm9wcy5wYXlsb2FkIGFzIHN0cmluZyksXG4gICAgICAgICAgcmF3OiByYXdQcm9wcy5yYXcgYXMgc3RyaW5nLFxuICAgICAgICB9O1xuICAgICAgICAvLyBBZGQgZGF0YSBpZiBwcmVzZW50IChmb3IgY29tcG9uZW50TmFtZXwgc3ludGF4KVxuICAgICAgICBpZiAodHlwZW9mIHJhd1Byb3BzLmRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjdXN0b21CbG9ja1Byb3BzLmRhdGEgPSBKU09OLnBhcnNlKHJhd1Byb3BzLmRhdGEgYXMgc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBDb21wID0gQ3VzdG9tQ29tcG9uZW50IGFzIENvbXBvbmVudDxDdXN0b21CbG9ja1Byb3BzPjtcbiAgICAgICAgcmV0dXJuIDxDb21wIHsuLi5jdXN0b21CbG9ja1Byb3BzfT57Y2hpbGRFbGVtZW50c308L0NvbXA+O1xuICAgICAgfVxuICAgICAgY29uc3QgQ29tcCA9IEN1c3RvbUNvbXBvbmVudCBhcyBDb21wb25lbnQ8U3RhbmRhcmRDb21wb25lbnRQcm9wcz47XG4gICAgICByZXR1cm4gPENvbXAgey4uLnJhd1Byb3BzfT57Y2hpbGRFbGVtZW50c308L0NvbXA+O1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJFbGVtZW50KHRhZ05hbWUsIHJhd1Byb3BzLCBjaGlsZEVsZW1lbnRzIGFzIEpTWC5FbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzdFRvU29saWRKc3goXG4gIGhhc3RUcmVlOiBSb290LFxuICBjb21wb25lbnRzOiBDb21wb25lbnRNYXAgPSB7fVxuKTogSlNYLkVsZW1lbnQge1xuICBjb25zdCBlbGVtZW50cyA9IGhhc3RUcmVlLmNoaWxkcmVuLm1hcCgobm9kZSkgPT4gcmVuZGVyTm9kZShub2RlLCBjb21wb25lbnRzKSk7XG4gIHJldHVybiA8PntlbGVtZW50c308Lz47XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNvbXBvbmVudCBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlIEhBU1QgdHJlZSB3aGVuIGNhbGxlZC5cbiAqIFRoaXMgZGVmZXJzIEpTWCBlbGVtZW50IGNyZWF0aW9uIHVudGlsIHJlbmRlciB0aW1lLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAqIGZvciBTU1IgaHlkcmF0aW9uIHRvIHdvcmsgY29ycmVjdGx5LlxuICpcbiAqIFdlIHNlcmlhbGl6ZSB0aGUgSEFTVCB0cmVlIGFuZCBjb21wb25lbnRzIGluZm8gc28gdGhhdCB0aGUgZXhhY3Qgc2FtZVxuICogcmVuZGVyaW5nIGxvZ2ljIHJ1bnMgb24gYm90aCBzZXJ2ZXIgYW5kIGNsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc3RUb1NvbGlkQ29tcG9uZW50KFxuICBoYXN0VHJlZTogUm9vdCxcbiAgY29tcG9uZW50czogQ29tcG9uZW50TWFwID0ge31cbik6ICgpID0+IEpTWC5FbGVtZW50IHtcbiAgLy8gU3RvcmUgdGhlIHRyZWUgZGF0YSwgbm90IHByZS1yZW5kZXJlZCBlbGVtZW50c1xuICBjb25zdCB0cmVlRGF0YSA9IGhhc3RUcmVlO1xuICBjb25zdCBjb21wb25lbnRNYXAgPSBjb21wb25lbnRzO1xuXG4gIHJldHVybiBmdW5jdGlvbiBIYXN0Qm9keSgpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRyZWVEYXRhLmNoaWxkcmVuLm1hcCgobm9kZSkgPT4gcmVuZGVyTm9kZShub2RlLCBjb21wb25lbnRNYXApKTtcbiAgICByZXR1cm4gPD57ZWxlbWVudHN9PC8+O1xuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgUm9vdCwgQ29kZSwgUGFyZW50LCBSb290Q29udGVudCB9IGZyb20gXCJtZGFzdFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzb3IgfSBmcm9tIFwidW5pZmllZFwiO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tIFwidW5pc3QtdXRpbC12aXNpdFwiO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VZYW1sIH0gZnJvbSBcInlhbWxcIjtcblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCByZWNlaXZlcyBjdXN0b20gYmxvY2sgcHJvcHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21CbG9ja0NvbXBvbmVudFByb3BzIHtcbiAgLyoqIFRoZSBwYXRoIHNlZ21lbnRzIGFmdGVyIHRoZSBjb21wb25lbnQgbmFtZSwgZS5nLiBbJ3N1YnN0cnVjdHVyZScsICdzdWJzdWInXSAqL1xuICBwYXlsb2FkOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSByYXcgY29udGVudCBvZiB0aGUgY29kZSBibG9jayBhcyBwbGFpbiB0ZXh0ICovXG4gIHJhdzogc3RyaW5nO1xuICAvKiogUGFyc2VkIFlBTUwgZGF0YSB3aGVuIHVzaW5nIGNvbXBvbmVudE5hbWV8IHN5bnRheCAqL1xuICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBUaGUgbWFya2Rvd24tcmVuZGVyZWQgY29udGVudCBhcyBjaGlsZHJlbiAqL1xuICBjaGlsZHJlbj86IHVua25vd247XG59XG5cbi8qKlxuICogU2V0IG9mIGNvbXBvbmVudCBuYW1lcyB0aGF0IGFyZSBhdmFpbGFibGVcbiAqL1xuZXhwb3J0IHR5cGUgQ3VzdG9tQmxvY2tDb21wb25lbnRzID0gU2V0PHN0cmluZz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtYXJrQ3VzdG9tQmxvY2tzT3B0aW9ucyB7XG4gIC8qKiBTZXQgb2YgY29tcG9uZW50IG5hbWVzIHRoYXQgYXJlIGF2YWlsYWJsZSAqL1xuICBjb21wb25lbnRzOiBDdXN0b21CbG9ja0NvbXBvbmVudHM7XG4gIC8qKiBUaGUgcHJvY2Vzc29yIHRvIHVzZSBmb3IgcGFyc2luZyBuZXN0ZWQgbWFya2Rvd24gKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJvY2Vzc29yOiBQcm9jZXNzb3I8YW55LCBhbnksIGFueSwgYW55LCBhbnk+O1xufVxuXG5cbi8qKlxuICogQSByZW1hcmsgcGx1Z2luIHRoYXQgdHJhbnNmb3JtcyBjb2RlIGJsb2NrcyB3aXRoIGBuYW1lL3BhdGgvc2VnbWVudHNgIHN5bnRheFxuICogaW50byBjdXN0b20gYmxvY2sgbm9kZXMgdGhhdCByZW5kZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudC5cbiAqXG4gKiBDb2RlIGJsb2NrcyBsaWtlOlxuICogYGBgY29tcG9uZW50TmFtZS9zdWIvcGF0aFxuICogY29udGVudCBoZXJlXG4gKiBgYGBcbiAqXG4gKiBXaWxsIGJlIHRyYW5zZm9ybWVkIHRvIHVzZSB0aGUgY29tcG9uZW50IGlmIGl0IGV4aXN0cyBpbiB0aGUgY29tcG9uZW50cyBzZXQsXG4gKiBvdGhlcndpc2UgdGhleSByZW1haW4gYXMgcmVndWxhciBjb2RlIGJsb2Nrcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFya0N1c3RvbUJsb2NrcyhvcHRpb25zOiBSZW1hcmtDdXN0b21CbG9ja3NPcHRpb25zKSB7XG4gIGNvbnN0IHsgY29tcG9uZW50cywgcHJvY2Vzc29yIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiAodHJlZTogUm9vdCkgPT4ge1xuICAgIHZpc2l0KHRyZWUsIFwiY29kZVwiLCAobm9kZTogQ29kZSwgaW5kZXgsIHBhcmVudDogUGFyZW50IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoIXBhcmVudCB8fCBpbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGxhbmcgPSBub2RlLmxhbmc7XG4gICAgICBpZiAoIWxhbmcpIHJldHVybjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGRhdGEgYmxvY2sgKGxhbmcgZW5kcyB3aXRoIHwpXG4gICAgICBjb25zdCBpc0RhdGFCbG9jayA9IGxhbmcuZW5kc1dpdGgoXCJ8XCIpO1xuICAgICAgY29uc3QgY2xlYW5MYW5nID0gaXNEYXRhQmxvY2sgPyBsYW5nLnNsaWNlKDAsIC0xKSA6IGxhbmc7XG5cbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gY2xlYW5MYW5nLnNwbGl0KFwiL1wiKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBzZWdtZW50c1swXTtcbiAgICAgIGNvbnN0IHJhdyA9IG5vZGUudmFsdWU7XG5cbiAgICAgIC8vIElmIHRoZSBjb21wb25lbnQgZG9lc24ndCBleGlzdCwgbGVhdmUgaXQgYXMgYSByZWd1bGFyIGNvZGUgYmxvY2tcbiAgICAgIGlmICghY29tcG9uZW50cy5oYXMoY29tcG9uZW50TmFtZSkpIHJldHVybjtcblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHNlZ21lbnRzLnNsaWNlKDEpO1xuXG4gICAgICAvLyBGb3IgZGF0YSBibG9ja3MsIHBhcnNlIFlBTUwgaW5zdGVhZCBvZiBtYXJrZG93blxuICAgICAgaWYgKGlzRGF0YUJsb2NrKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBwYXJzZVlhbWwocmF3KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgICBjb25zdCBjdXN0b21Ob2RlID0ge1xuICAgICAgICAgIHR5cGU6IFwiY3VzdG9tQmxvY2tcIixcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBoTmFtZTogY29tcG9uZW50TmFtZSxcbiAgICAgICAgICAgIGhQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIHBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgICAgICAgICByYXcsXG4gICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICBwYXJlbnQuY2hpbGRyZW5baW5kZXhdID0gY3VzdG9tTm9kZSBhcyB1bmtub3duIGFzIFJvb3RDb250ZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBjb250ZW50IGFzIG1hcmtkb3duIHRvIGdldCBpdHMgQVNUXG4gICAgICBjb25zdCBjb250ZW50TWRhc3QgPSBwcm9jZXNzb3IucGFyc2UocmF3KSBhcyBSb290O1xuXG4gICAgICAvLyBDcmVhdGUgYSBjdXN0b20gZWxlbWVudCB0aGF0IHdpbGwgYmUgY29udmVydGVkIHRvIGhhc3RcbiAgICAgIC8vIFdlIHVzZSBhIGN1c3RvbSBub2RlIHR5cGUgdGhhdCByZW1hcmstcmVoeXBlIHdpbGwgaGFuZGxlXG4gICAgICBjb25zdCBjdXN0b21Ob2RlID0ge1xuICAgICAgICB0eXBlOiBcImN1c3RvbUJsb2NrXCIsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBoTmFtZTogY29tcG9uZW50TmFtZSxcbiAgICAgICAgICBoUHJvcGVydGllczoge1xuICAgICAgICAgICAgcGF5bG9hZDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICAgICAgICByYXcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IGNvbnRlbnRNZGFzdC5jaGlsZHJlbixcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlcGxhY2UgdGhlIGNvZGUgbm9kZSB3aXRoIG91ciBjdXN0b20gYmxvY2tcbiAgICAgIHBhcmVudC5jaGlsZHJlbltpbmRleF0gPSBjdXN0b21Ob2RlIGFzIHVua25vd24gYXMgUm9vdENvbnRlbnQ7XG4gICAgfSk7XG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsU0FBUyxlQUErQjtBQUN4QyxPQUFPLGlCQUFpQjtBQUN4QixPQUFPLGVBQWU7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LEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsUUFBUSxRQUFRLFNBQVMsRUFBekI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsUUFBUSxRQUFRLFNBQVMsRUFBekI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsUUFBUSxRQUFRLFNBQVMsRUFBekI7QUFBQTtBQUFBLElBRVYsS0FBSztBQUNILGFBQU8sQ0FBQyxVQUFVLE9BQU87QUFBQSxJQUMzQixLQUFLO0FBQ0gsYUFBTyxDQUFDLFlBQVksUUFBUSxTQUFTLEVBQTdCO0FBQUE7QUFBQSxJQUVWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsY0FBYyxRQUFRLFNBQVMsRUFBL0I7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsVUFBVSxRQUFRLFNBQVMsRUFBM0I7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsWUFBWSxRQUFRLFNBQVMsRUFBN0I7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsVUFBVSxRQUFRLFNB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eEIsVUFBTSxFQUFFLE9BQU8sTUFBTSxTQUFTLElBQUk7QUFBQSxNQUNoQyxNQUFNLEtBQUs7QUFBQSxNQUNYO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFFQSxVQUFNLFFBQVEsVUFBVSxNQUFNLFFBQVE7QUFDdEMsVUFBTSxXQUFXLFVBQVUsUUFBUSxLQUFLO0FBQ3hDLFVBQU0sT0FBTyxxQkFBcUIsVUFBVSxVQUFVO0FBRXRELFVBQU0sU0FBUyxJQUFJO0FBQUEsTUFDakIsSUFBSTtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsTUFDQSxNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWDtBQUVBLFdBQU87QUFBQSxNQUNMLE9BQU87QUFBQSxNQUNQO0FBQUEsTUFDQSxPQUFPO0FBQUEsTUFDUDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsV0FBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUN2QyxVQUFNLFVBQVUsUUFBUSxDQUFDO0FBQ3pCLFVBQU0sWUFBWSxRQUFRLElBQUksQ0FBQztBQUMvQixVQUFNLFlBQVksUUFBUSxJQUFJLENBQUM7QUFFL0IsVUFBTSxhQUFhLFFBQVEsUUFBUSxNQUFNLFFBQVEsRUFBRSxHQUFHO0FBQ3RELFVBQU0sV0FBVyxZQUFZLFVBQVUsUUFBUSxNQUFNO0FBRXJELFVBQU0sYUFBYSxNQUFNLE1BQU0sWUFBWSxRQUFRLEVBQUUsS0FBSztBQUMxRCxVQUFNLEVBQUUsT0FBTyxNQUFNLFNBQVMsSUFBSTtBQUFBLE1BQ2hDO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBRUEsVUFBTSxRQUFRLFVBQVUsTUFBTSxRQUFRO0FBQ3RDLFVBQU0sV0FBVyxVQUFVLFFBQVEsS0FBSztBQUN4QyxVQUFNLE9BQU8scUJBQXFCLFVBQVUsVUFBVTtBQUV0RCxVQUFNLFFBQVEsRUFBRSxJQUFJO0FBQUEsTUFDbEIsSUFBSSxRQUFRO0FBQUEsTUFDWjtBQUFBLE1BQ0E7QUFBQSxNQUNBLE1BQU0sWUFBWSxVQUFVLEtBQUs7QUFBQSxNQUNqQyxNQUFNLFlBQVksVUFBVSxLQUFLO0FBQUEsTUFDakMsU0FBUyxJQUFJO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQUEsSUFDTCxPQUFPLFFBQVEsU0FBUyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUs7QUFBQSxJQUM1QztBQUFBLElBQ0EsT0FBTyxRQUFRO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFsicGFyc2VZYW1sIiwgIkNvbXAiLCAiY3VzdG9tTm9kZSIsICJwYXJzZVlhbWwiLCAiY29udGVudCJdCn0K
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "solid-mds",
3
+ "version": "0.3.2",
4
+ "description": "A SolidJS library for parsing and rendering MDS (Markdown Steps) format",
5
+ "license": "MIT",
6
+ "author": "Matthias Reis",
7
+ "keywords": [
8
+ "solid",
9
+ "solidjs",
10
+ "markdown",
11
+ "parser",
12
+ "slides",
13
+ "presentation",
14
+ "remark",
15
+ "rehype"
16
+ ],
17
+ "type": "module",
18
+ "main": "./dist/index.jsx",
19
+ "module": "./dist/index.jsx",
20
+ "types": "./dist/index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.jsx"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "README.md",
30
+ "LICENSE"
31
+ ],
32
+ "scripts": {
33
+ "build": "tsup",
34
+ "dev": "tsup --watch",
35
+ "test": "vitest run",
36
+ "test:watch": "vitest",
37
+ "prepublishOnly": "pnpm run build",
38
+ "release": "bash ../../scripts/release.sh"
39
+ },
40
+ "dependencies": {
41
+ "yaml": "^2.7.0",
42
+ "rehype-katex": "^7.0.0",
43
+ "rehype-stringify": "^10.0.1",
44
+ "remark-gfm": "^4.0.0",
45
+ "remark-math": "^6.0.0",
46
+ "remark-parse": "^11.0.0",
47
+ "remark-rehype": "^11.1.1",
48
+ "unified": "^11.0.5",
49
+ "unist-util-visit": "^5.0.0"
50
+ },
51
+ "devDependencies": {
52
+ "@solidjs/testing-library": "^0.8.0",
53
+ "@types/hast": "^3.0.4",
54
+ "@types/mdast": "^4.0.4",
55
+ "jsdom": "^26.0.0",
56
+ "tsup": "^8.3.5",
57
+ "tsup-preset-solid": "^2.2.0",
58
+ "typescript": "^5.7.3",
59
+ "vite-plugin-solid": "^2.10.0",
60
+ "vitest": "^3.0.0"
61
+ },
62
+ "peerDependencies": {
63
+ "solid-js": "^1.9.0"
64
+ },
65
+ "typesVersions": {}
66
+ }