livemark 0.28.4 → 0.28.5
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 +2 -2
- package/build/actions/changelog/build.d.ts +1 -1
- package/build/actions/changelog/build.js +5 -5
- package/build/actions/changelog/build.unit.js +6 -6
- package/build/actions/target/build.d.ts +9 -5
- package/build/actions/target/build.js +14 -9
- package/build/actions/target/build.unit.js +17 -2
- package/build/actions/target/clear.d.ts +2 -2
- package/build/actions/target/clear.js +11 -9
- package/build/actions/target/clear.unit.js +10 -3
- package/build/commands/clear.d.ts +1 -1
- package/build/commands/clear.js +6 -5
- package/build/helpers/tailwind-sources.unit.js +4 -4
- package/build/helpers/target-dir.d.ts +2 -0
- package/build/helpers/target-dir.js +11 -0
- package/build/helpers/target-export.unit.js +2 -2
- package/build/plugins/vite-livemark.d.ts +2 -1
- package/build/plugins/vite-livemark.js +20 -9
- package/package.json +1 -1
- package/skills/livemark-configuration/SKILL.md +1 -1
- package/skills/livemark-customization/SKILL.md +1 -1
- package/skills/livemark-deployment/SKILL.md +1 -1
- package/source/actions/changelog/build.ts +4 -5
- package/source/actions/changelog/build.unit.ts +5 -5
- package/source/actions/target/build.ts +29 -9
- package/source/actions/target/build.unit.ts +24 -1
- package/source/actions/target/clear.ts +9 -8
- package/source/actions/target/clear.unit.ts +9 -2
- package/source/commands/clear.ts +5 -4
- package/source/helpers/tailwind-sources.unit.ts +3 -3
- package/source/helpers/target-dir.ts +12 -0
- package/source/helpers/target-export.unit.ts +1 -1
- package/source/plugins/vite-livemark.ts +19 -9
|
@@ -3,21 +3,28 @@ import { mkdir, symlink, writeFile } from "node:fs/promises";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { temporaryDirectoryTask } from "tempy";
|
|
5
5
|
import { describe, expect, it } from "vite-plus/test";
|
|
6
|
+
import { cacheDirFor } from "../../helpers/target-dir.js";
|
|
6
7
|
import { targetDirFor } from "./build.js";
|
|
7
8
|
import { clearTarget } from "./clear.js";
|
|
8
9
|
describe("clearTarget", () => {
|
|
9
|
-
it("removes the target
|
|
10
|
+
it("removes the target dirs without following their dependency link", () => temporaryDirectoryTask(async (root) => {
|
|
10
11
|
const configPath = join(root, "livemark.config.ts");
|
|
11
12
|
const targetDir = targetDirFor(configPath);
|
|
13
|
+
const buildDir = targetDirFor(configPath, "build");
|
|
14
|
+
const cacheDir = cacheDirFor(configPath);
|
|
15
|
+
await mkdir(buildDir, { recursive: true });
|
|
16
|
+
await mkdir(cacheDir, { recursive: true });
|
|
12
17
|
await mkdir(join(targetDir, "cache"), { recursive: true });
|
|
13
18
|
await writeFile(join(targetDir, "cache", "entry.md"), "cached");
|
|
14
19
|
await mkdir(join(root, "deps"));
|
|
15
20
|
await writeFile(join(root, "deps", "kept.js"), "");
|
|
16
21
|
await symlink(join(root, "deps"), join(targetDir, "node_modules"), "junction");
|
|
17
|
-
expect(clearTarget(configPath)).
|
|
22
|
+
expect(clearTarget(configPath)).toEqual([targetDir, buildDir, cacheDir]);
|
|
18
23
|
expect(existsSync(targetDir)).toBe(false);
|
|
24
|
+
expect(existsSync(buildDir)).toBe(false);
|
|
25
|
+
expect(existsSync(cacheDir)).toBe(false);
|
|
19
26
|
expect(existsSync(join(root, "deps", "kept.js"))).toBe(true);
|
|
20
27
|
expect(() => clearTarget(configPath)).not.toThrow();
|
|
21
28
|
}));
|
|
22
29
|
});
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXIudW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NvdXJjZS9hY3Rpb25zL3RhcmdldC9jbGVhci51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUV4QyxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixFQUFFLENBQUMsaUVBQWlFLEVBQUUsR0FBRyxFQUFFLENBQ3pFLHNCQUFzQixDQUFDLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtRQUNsQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLENBQUE7UUFDbkQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDbEQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQzFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUMxRCxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUMvRCxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDL0IsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDbEQsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBRTlFLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDeEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN6QyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDeEMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzVELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDckQsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNQLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IG1rZGlyLCBzeW1saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyB0ZW1wb3JhcnlEaXJlY3RvcnlUYXNrIH0gZnJvbSBcInRlbXB5XCJcbmltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGUtcGx1cy90ZXN0XCJcbmltcG9ydCB7IGNhY2hlRGlyRm9yIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvdGFyZ2V0LWRpci50c1wiXG5pbXBvcnQgeyB0YXJnZXREaXJGb3IgfSBmcm9tIFwiLi9idWlsZC50c1wiXG5pbXBvcnQgeyBjbGVhclRhcmdldCB9IGZyb20gXCIuL2NsZWFyLnRzXCJcblxuZGVzY3JpYmUoXCJjbGVhclRhcmdldFwiLCAoKSA9PiB7XG4gIGl0KFwicmVtb3ZlcyB0aGUgdGFyZ2V0IGRpcnMgd2l0aG91dCBmb2xsb3dpbmcgdGhlaXIgZGVwZW5kZW5jeSBsaW5rXCIsICgpID0+XG4gICAgdGVtcG9yYXJ5RGlyZWN0b3J5VGFzayhhc3luYyByb290ID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKHJvb3QsIFwibGl2ZW1hcmsuY29uZmlnLnRzXCIpXG4gICAgICBjb25zdCB0YXJnZXREaXIgPSB0YXJnZXREaXJGb3IoY29uZmlnUGF0aClcbiAgICAgIGNvbnN0IGJ1aWxkRGlyID0gdGFyZ2V0RGlyRm9yKGNvbmZpZ1BhdGgsIFwiYnVpbGRcIilcbiAgICAgIGNvbnN0IGNhY2hlRGlyID0gY2FjaGVEaXJGb3IoY29uZmlnUGF0aClcbiAgICAgIGF3YWl0IG1rZGlyKGJ1aWxkRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgYXdhaXQgbWtkaXIoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICBhd2FpdCBta2Rpcihqb2luKHRhcmdldERpciwgXCJjYWNoZVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJjYWNoZVwiLCBcImVudHJ5Lm1kXCIpLCBcImNhY2hlZFwiKVxuICAgICAgYXdhaXQgbWtkaXIoam9pbihyb290LCBcImRlcHNcIikpXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoam9pbihyb290LCBcImRlcHNcIiwgXCJrZXB0LmpzXCIpLCBcIlwiKVxuICAgICAgYXdhaXQgc3ltbGluayhqb2luKHJvb3QsIFwiZGVwc1wiKSwgam9pbih0YXJnZXREaXIsIFwibm9kZV9tb2R1bGVzXCIpLCBcImp1bmN0aW9uXCIpXG5cbiAgICAgIGV4cGVjdChjbGVhclRhcmdldChjb25maWdQYXRoKSkudG9FcXVhbChbdGFyZ2V0RGlyLCBidWlsZERpciwgY2FjaGVEaXJdKVxuICAgICAgZXhwZWN0KGV4aXN0c1N5bmModGFyZ2V0RGlyKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChleGlzdHNTeW5jKGJ1aWxkRGlyKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChleGlzdHNTeW5jKGNhY2hlRGlyKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChleGlzdHNTeW5jKGpvaW4ocm9vdCwgXCJkZXBzXCIsIFwia2VwdC5qc1wiKSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdCgoKSA9PiBjbGVhclRhcmdldChjb25maWdQYXRoKSkubm90LnRvVGhyb3coKVxuICAgIH0pKVxufSlcbiJdfQ==
|
package/build/commands/clear.js
CHANGED
|
@@ -3,13 +3,14 @@ import pc from "picocolors";
|
|
|
3
3
|
import { loadConfig } from "../actions/config/load.js";
|
|
4
4
|
import { clearTarget } from "../actions/target/clear.js";
|
|
5
5
|
/**
|
|
6
|
-
* Wipe the generated `.livemark/.
|
|
6
|
+
* Wipe the generated `.livemark/.serve/` and `.livemark/.build/` mounts and `.livemark/.cache/`.
|
|
7
7
|
*/
|
|
8
8
|
export const clear = new Command("clear")
|
|
9
|
-
.description("Wipe the generated .livemark/.
|
|
9
|
+
.description("Wipe the generated .livemark/.serve/, .build/ and .cache/")
|
|
10
10
|
.action(async () => {
|
|
11
11
|
const config = await loadConfig();
|
|
12
|
-
const targetDir
|
|
13
|
-
|
|
12
|
+
for (const targetDir of clearTarget(config.configPath)) {
|
|
13
|
+
console.log(`Cleared ${pc.dim(targetDir)}`);
|
|
14
|
+
}
|
|
14
15
|
});
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tbWFuZHMvY2xlYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDM0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUV4RDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7S0FDdEMsV0FBVyxDQUFDLDJEQUEyRCxDQUFDO0tBQ3hFLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNqQixNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsRUFBRSxDQUFBO0lBQ2pDLEtBQUssTUFBTSxTQUFTLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgcGMgZnJvbSBcInBpY29jb2xvcnNcIlxuaW1wb3J0IHsgbG9hZENvbmZpZyB9IGZyb20gXCIuLi9hY3Rpb25zL2NvbmZpZy9sb2FkLnRzXCJcbmltcG9ydCB7IGNsZWFyVGFyZ2V0IH0gZnJvbSBcIi4uL2FjdGlvbnMvdGFyZ2V0L2NsZWFyLnRzXCJcblxuLyoqXG4gKiBXaXBlIHRoZSBnZW5lcmF0ZWQgYC5saXZlbWFyay8uc2VydmUvYCBhbmQgYC5saXZlbWFyay8uYnVpbGQvYCBtb3VudHMgYW5kIGAubGl2ZW1hcmsvLmNhY2hlL2AuXG4gKi9cbmV4cG9ydCBjb25zdCBjbGVhciA9IG5ldyBDb21tYW5kKFwiY2xlYXJcIilcbiAgLmRlc2NyaXB0aW9uKFwiV2lwZSB0aGUgZ2VuZXJhdGVkIC5saXZlbWFyay8uc2VydmUvLCAuYnVpbGQvIGFuZCAuY2FjaGUvXCIpXG4gIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoKVxuICAgIGZvciAoY29uc3QgdGFyZ2V0RGlyIG9mIGNsZWFyVGFyZ2V0KGNvbmZpZy5jb25maWdQYXRoKSkge1xuICAgICAgY29uc29sZS5sb2coYENsZWFyZWQgJHtwYy5kaW0odGFyZ2V0RGlyKX1gKVxuICAgIH1cbiAgfSlcbiJdfQ==
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { describe, expect, it } from "vite-plus/test";
|
|
2
2
|
import { excludeTailwindSources } from "./tailwind-sources.js";
|
|
3
|
-
const targetDir = "/project/.livemark/.
|
|
3
|
+
const targetDir = "/project/.livemark/.serve";
|
|
4
4
|
describe("excludeTailwindSources", () => {
|
|
5
5
|
it("excludes the dependency link and the content cache from a Tailwind entry", () => {
|
|
6
6
|
const css = `@import "tailwindcss";\n@import "./shape.css";`;
|
|
7
|
-
expect(excludeTailwindSources({ css, targetDir })).toBe(`${css}\n@source not "/project/.livemark/.
|
|
8
|
-
`@source not "/project/.livemark/.
|
|
7
|
+
expect(excludeTailwindSources({ css, targetDir })).toBe(`${css}\n@source not "/project/.livemark/.serve/node_modules";\n` +
|
|
8
|
+
`@source not "/project/.livemark/.serve/.content-collections/cache";\n`);
|
|
9
9
|
});
|
|
10
10
|
it("accepts single quotes, import options and a bare utilities layer", () => {
|
|
11
11
|
for (const css of [
|
|
@@ -20,4 +20,4 @@ describe("excludeTailwindSources", () => {
|
|
|
20
20
|
expect(excludeTailwindSources({ css: `@import "tailwindcss/theme";`, targetDir })).toBeUndefined();
|
|
21
21
|
});
|
|
22
22
|
});
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmQtc291cmNlcy51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvdGFpbHdpbmQtc291cmNlcy51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBRTlELE1BQU0sU0FBUyxHQUFHLDJCQUEyQixDQUFBO0FBRTdDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDdEMsRUFBRSxDQUFDLDBFQUEwRSxFQUFFLEdBQUcsRUFBRTtRQUNsRixNQUFNLEdBQUcsR0FBRyxnREFBZ0QsQ0FBQTtRQUM1RCxNQUFNLENBQUMsc0JBQXNCLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDckQsR0FBRyxHQUFHLDJEQUEyRDtZQUMvRCx1RUFBdUUsQ0FDMUUsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGtFQUFrRSxFQUFFLEdBQUcsRUFBRTtRQUMxRSxLQUFLLE1BQU0sR0FBRyxJQUFJO1lBQ2hCLHFDQUFxQztZQUNyQyxtREFBbUQ7U0FDcEQsRUFBRSxDQUFDO1lBQ0YsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDN0UsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtRQUN4QyxNQUFNLENBQ0osc0JBQXNCLENBQUMsRUFBRSxHQUFHLEVBQUUsMkJBQTJCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FDeEUsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNqQixNQUFNLENBQ0osc0JBQXNCLENBQUMsRUFBRSxHQUFHLEVBQUUsOEJBQThCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FDM0UsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUNuQixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZS1wbHVzL3Rlc3RcIlxuaW1wb3J0IHsgZXhjbHVkZVRhaWx3aW5kU291cmNlcyB9IGZyb20gXCIuL3RhaWx3aW5kLXNvdXJjZXMudHNcIlxuXG5jb25zdCB0YXJnZXREaXIgPSBcIi9wcm9qZWN0Ly5saXZlbWFyay8uc2VydmVcIlxuXG5kZXNjcmliZShcImV4Y2x1ZGVUYWlsd2luZFNvdXJjZXNcIiwgKCkgPT4ge1xuICBpdChcImV4Y2x1ZGVzIHRoZSBkZXBlbmRlbmN5IGxpbmsgYW5kIHRoZSBjb250ZW50IGNhY2hlIGZyb20gYSBUYWlsd2luZCBlbnRyeVwiLCAoKSA9PiB7XG4gICAgY29uc3QgY3NzID0gYEBpbXBvcnQgXCJ0YWlsd2luZGNzc1wiO1xcbkBpbXBvcnQgXCIuL3NoYXBlLmNzc1wiO2BcbiAgICBleHBlY3QoZXhjbHVkZVRhaWx3aW5kU291cmNlcyh7IGNzcywgdGFyZ2V0RGlyIH0pKS50b0JlKFxuICAgICAgYCR7Y3NzfVxcbkBzb3VyY2Ugbm90IFwiL3Byb2plY3QvLmxpdmVtYXJrLy5zZXJ2ZS9ub2RlX21vZHVsZXNcIjtcXG5gICtcbiAgICAgICAgYEBzb3VyY2Ugbm90IFwiL3Byb2plY3QvLmxpdmVtYXJrLy5zZXJ2ZS8uY29udGVudC1jb2xsZWN0aW9ucy9jYWNoZVwiO1xcbmAsXG4gICAgKVxuICB9KVxuXG4gIGl0KFwiYWNjZXB0cyBzaW5nbGUgcXVvdGVzLCBpbXBvcnQgb3B0aW9ucyBhbmQgYSBiYXJlIHV0aWxpdGllcyBsYXllclwiLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBjc3Mgb2YgW1xuICAgICAgYEBpbXBvcnQgJ3RhaWx3aW5kY3NzJyBzb3VyY2Uobm9uZSk7YCxcbiAgICAgIGBAaW1wb3J0IFwidGFpbHdpbmRjc3MvdXRpbGl0aWVzXCIgbGF5ZXIodXRpbGl0aWVzKTtgLFxuICAgIF0pIHtcbiAgICAgIGV4cGVjdChleGNsdWRlVGFpbHdpbmRTb3VyY2VzKHsgY3NzLCB0YXJnZXREaXIgfSkpLnRvQ29udGFpbihcIkBzb3VyY2Ugbm90XCIpXG4gICAgfVxuICB9KVxuXG4gIGl0KFwibGVhdmVzIG90aGVyIHN0eWxlc2hlZXRzIGFsb25lXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBleGNsdWRlVGFpbHdpbmRTb3VyY2VzKHsgY3NzOiBgQGltcG9ydCBcInR3LWFuaW1hdGUtY3NzXCI7YCwgdGFyZ2V0RGlyIH0pLFxuICAgICkudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KFxuICAgICAgZXhjbHVkZVRhaWx3aW5kU291cmNlcyh7IGNzczogYEBpbXBvcnQgXCJ0YWlsd2luZGNzcy90aGVtZVwiO2AsIHRhcmdldERpciB9KSxcbiAgICApLnRvQmVVbmRlZmluZWQoKVxuICB9KVxufSlcbiJdfQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { rmSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
export function removeTargetDir(targetDir) {
|
|
4
|
+
// Unlink the dependency link first so the recursive remove cannot reach the store.
|
|
5
|
+
rmSync(join(targetDir, "node_modules"), { force: true });
|
|
6
|
+
rmSync(targetDir, { recursive: true, force: true });
|
|
7
|
+
}
|
|
8
|
+
export function cacheDirFor(configPath) {
|
|
9
|
+
return join(dirname(configPath), ".livemark", ".cache");
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LWRpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9oZWxwZXJzL3RhcmdldC1kaXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV6QyxNQUFNLFVBQVUsZUFBZSxDQUFDLFNBQWlCO0lBQy9DLG1GQUFtRjtJQUNuRixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3hELE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQ3JELENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLFVBQWtCO0lBQzVDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJtU3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRhcmdldERpcih0YXJnZXREaXI6IHN0cmluZykge1xuICAvLyBVbmxpbmsgdGhlIGRlcGVuZGVuY3kgbGluayBmaXJzdCBzbyB0aGUgcmVjdXJzaXZlIHJlbW92ZSBjYW5ub3QgcmVhY2ggdGhlIHN0b3JlLlxuICBybVN5bmMoam9pbih0YXJnZXREaXIsIFwibm9kZV9tb2R1bGVzXCIpLCB7IGZvcmNlOiB0cnVlIH0pXG4gIHJtU3luYyh0YXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVEaXJGb3IoY29uZmlnUGF0aDogc3RyaW5nKSB7XG4gIHJldHVybiBqb2luKGRpcm5hbWUoY29uZmlnUGF0aCksIFwiLmxpdmVtYXJrXCIsIFwiLmNhY2hlXCIpXG59XG4iXX0=
|
|
@@ -2,7 +2,7 @@ import { join } from "node:path";
|
|
|
2
2
|
import { describe, expect, it } from "vite-plus/test";
|
|
3
3
|
import packageJson from "../../package.json" with { type: "json" };
|
|
4
4
|
import { resolveTargetExport } from "./target-export.js";
|
|
5
|
-
const targetDir = "/project/.livemark/.
|
|
5
|
+
const targetDir = "/project/.livemark/.serve";
|
|
6
6
|
function resolveId(id) {
|
|
7
7
|
return resolveTargetExport({ id, targetDir, exports: packageJson.exports });
|
|
8
8
|
}
|
|
@@ -22,4 +22,4 @@ describe("resolveTargetExport", () => {
|
|
|
22
22
|
expect(resolveId("react")).toBeUndefined();
|
|
23
23
|
});
|
|
24
24
|
});
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LWV4cG9ydC51bml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2hlbHBlcnMvdGFyZ2V0LWV4cG9ydC51bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDaEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckQsT0FBTyxXQUFXLE1BQU0sb0JBQW9CLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDbEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFeEQsTUFBTSxTQUFTLEdBQUcsMkJBQTJCLENBQUE7QUFFN0MsU0FBUyxTQUFTLENBQUMsRUFBVTtJQUMzQixPQUFPLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDN0UsQ0FBQztBQUVELFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7SUFDbkMsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEdBQUcsRUFBRTtRQUN6RCxNQUFNLENBQUMsU0FBUyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2xELElBQUksQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLENBQUMsQ0FDekMsQ0FBQTtRQUNELE1BQU0sQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDaEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUN2QyxDQUFBO1FBQ0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFBO1FBQ3JGLE1BQU0sQ0FBQyxTQUFTLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDL0MsSUFBSSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUN0QyxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLE1BQU0sQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDbkQsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FDL0MsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtRQUN2QyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDN0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDM0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQzVDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlLXBsdXMvdGVzdFwiXG5pbXBvcnQgcGFja2FnZUpzb24gZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9XG5pbXBvcnQgeyByZXNvbHZlVGFyZ2V0RXhwb3J0IH0gZnJvbSBcIi4vdGFyZ2V0LWV4cG9ydC50c1wiXG5cbmNvbnN0IHRhcmdldERpciA9IFwiL3Byb2plY3QvLmxpdmVtYXJrLy5zZXJ2ZVwiXG5cbmZ1bmN0aW9uIHJlc29sdmVJZChpZDogc3RyaW5nKSB7XG4gIHJldHVybiByZXNvbHZlVGFyZ2V0RXhwb3J0KHsgaWQsIHRhcmdldERpciwgZXhwb3J0czogcGFja2FnZUpzb24uZXhwb3J0cyB9KVxufVxuXG5kZXNjcmliZShcInJlc29sdmVUYXJnZXRFeHBvcnRcIiwgKCkgPT4ge1xuICBpdChcIm1hcHMgZWFjaCBzb3VyY2Ugc3VicGF0aCBleHBvcnQgaW50byB0aGUgdGFyZ2V0XCIsICgpID0+IHtcbiAgICBleHBlY3QocmVzb2x2ZUlkKFwibGl2ZW1hcmsvY29tcG9uZW50cy9Gb290ZXJcIikpLnRvQmUoXG4gICAgICBqb2luKHRhcmdldERpciwgXCJjb21wb25lbnRzL0Zvb3Rlci50c3hcIiksXG4gICAgKVxuICAgIGV4cGVjdChyZXNvbHZlSWQoXCJsaXZlbWFyay9lbGVtZW50cy9idXR0b25cIikpLnRvQmUoXG4gICAgICBqb2luKHRhcmdldERpciwgXCJlbGVtZW50cy9idXR0b24udHN4XCIpLFxuICAgIClcbiAgICBleHBlY3QocmVzb2x2ZUlkKFwibGl2ZW1hcmsvaG9va3MvaW4tdmlld1wiKSkudG9CZShqb2luKHRhcmdldERpciwgXCJob29rcy9pbi12aWV3LnRzXCIpKVxuICAgIGV4cGVjdChyZXNvbHZlSWQoXCJsaXZlbWFyay9zdHlsZXMvZ2VuZXJhbFwiKSkudG9CZShcbiAgICAgIGpvaW4odGFyZ2V0RGlyLCBcInN0eWxlcy9nZW5lcmFsLmNzc1wiKSxcbiAgICApXG4gIH0pXG5cbiAgaXQoXCJrZWVwcyB0aGUgcXVlcnlcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChyZXNvbHZlSWQoXCJsaXZlbWFyay9zdHlsZXMvZ2VuZXJhbD91cmxcIikpLnRvQmUoXG4gICAgICBgJHtqb2luKHRhcmdldERpciwgXCJzdHlsZXMvZ2VuZXJhbC5jc3NcIil9P3VybGAsXG4gICAgKVxuICB9KVxuXG4gIGl0KFwibGVhdmVzIG90aGVyIHNwZWNpZmllcnMgYWxvbmVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChyZXNvbHZlSWQoXCJsaXZlbWFya1wiKSkudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc29sdmVJZChcImxpdmVtYXJrL3Vua25vd24vdGhpbmdcIikpLnRvQmVVbmRlZmluZWQoKVxuICAgIGV4cGVjdChyZXNvbHZlSWQoXCJyZWFjdFwiKSkudG9CZVVuZGVmaW5lZCgpXG4gIH0pXG59KVxuIl19
|
|
@@ -3,7 +3,8 @@ import type { Config } from "../models/config.ts";
|
|
|
3
3
|
export interface LivemarkOptions {
|
|
4
4
|
config: Config;
|
|
5
5
|
}
|
|
6
|
-
/** Owns the project's `.livemark/.
|
|
6
|
+
/** Owns the project's `.livemark/.serve/` mount (`.build/` when building, so a build
|
|
7
|
+
* never rewrites a running dev server's files): synthesizes it via
|
|
7
8
|
* `buildTarget()`, returns the Vite config that anchors there, and
|
|
8
9
|
* copies `.livemark/` edits (plus livemark's `source/` in its own dev)
|
|
9
10
|
* into the target. Vite watches the target natively, so its own HMR
|
|
@@ -33,7 +33,8 @@ const LOCKFILES = [
|
|
|
33
33
|
* or load it from disk". */
|
|
34
34
|
const VIRTUAL_ID = "livemark:virtual";
|
|
35
35
|
const VIRTUAL_RESOLVED_ID = `\0${VIRTUAL_ID}`;
|
|
36
|
-
/** Owns the project's `.livemark/.
|
|
36
|
+
/** Owns the project's `.livemark/.serve/` mount (`.build/` when building, so a build
|
|
37
|
+
* never rewrites a running dev server's files): synthesizes it via
|
|
37
38
|
* `buildTarget()`, returns the Vite config that anchors there, and
|
|
38
39
|
* copies `.livemark/` edits (plus livemark's `source/` in its own dev)
|
|
39
40
|
* into the target. Vite watches the target natively, so its own HMR
|
|
@@ -49,6 +50,7 @@ export function livemark(opts) {
|
|
|
49
50
|
targetDir = buildTarget({
|
|
50
51
|
configPath: opts.config.configPath,
|
|
51
52
|
sourceDir: SOURCE_DIR,
|
|
53
|
+
command: env.command === "build" || env.isPreview ? "build" : "serve",
|
|
52
54
|
});
|
|
53
55
|
const base = {
|
|
54
56
|
root: targetDir,
|
|
@@ -132,14 +134,23 @@ export function livemark(opts) {
|
|
|
132
134
|
}
|
|
133
135
|
if (isWithin(file, targetDir) || isWithin(file, outDir))
|
|
134
136
|
return;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
// A watcher callback that throws kills the server, and a copy racing another
|
|
138
|
+
// writer of the target (an editor's atomic save, `livemark clear`) fails.
|
|
139
|
+
try {
|
|
140
|
+
const overlayHit = matchPath(file, overridesRoot);
|
|
141
|
+
if (overlayHit) {
|
|
142
|
+
syncOverlay(overlayHit, kind, targetDir, overridesRoot);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const sourceHit = matchPath(file, SOURCE_DIR);
|
|
146
|
+
if (sourceHit && !sourceHit.rel.includes("routeTree.gen.ts")) {
|
|
147
|
+
syncSource(sourceHit, kind, targetDir, overridesRoot);
|
|
148
|
+
}
|
|
139
149
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
150
|
+
catch (error) {
|
|
151
|
+
server.config.logger.error(`[livemark] failed to sync ${file}: ${error}`, {
|
|
152
|
+
error: error instanceof Error ? error : undefined,
|
|
153
|
+
});
|
|
143
154
|
}
|
|
144
155
|
}
|
|
145
156
|
},
|
|
@@ -259,4 +270,4 @@ async function resolveViteOverride(vite, env) {
|
|
|
259
270
|
function isObject(v) {
|
|
260
271
|
return v !== null && typeof v === "object";
|
|
261
272
|
}
|
|
262
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDNUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRTlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDbEMsT0FBTyxXQUFXLE1BQU0sb0JBQW9CLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBRWpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFNbkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUNsRCxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxlQUFlLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDcEUsTUFBTSxTQUFTLEdBQUc7SUFDaEIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixXQUFX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SUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDbEUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLFFBQVE7WUFDM0QsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQ2hCLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDZixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRDs7O3FDQUdxQztBQUNyQyxLQUFLLFVBQVUsbUJBQW1CLENBQ2hDLElBQWEsRUFDYixHQUFjO0lBRWQsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUN0QixJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUMxRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDekMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNyQyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBVTtJQUMxQixPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFBO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcFN5bmMsIGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCBzdGF0U3luYyB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHR5cGUgeyBDb25maWdFbnYsIFBsdWdpbiwgVXNlckNvbmZpZyBhcyBWaXRlVXNlckNvbmZpZywgVml0ZURldlNlcnZlciB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCB7IG1lcmdlQ29uZmlnIH0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHBhY2thZ2VKc29uIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfVxuaW1wb3J0IHsgYnVpbGRUYXJnZXQgfSBmcm9tIFwiLi4vYWN0aW9ucy90YXJnZXQvYnVpbGQudHNcIlxuaW1wb3J0IHsgY29sbGVjdExvY2FsSW1wb3J0cyB9IGZyb20gXCIuLi9oZWxwZXJzL2xvY2FsLWltcG9ydHMudHNcIlxuaW1wb3J0IHsgcmVuZGVySW5saW5lTWFya2Rvd24gfSBmcm9tIFwiLi4vaGVscGVycy9yZW5kZXItaW5saW5lLW1hcmtkb3duLnRzXCJcbmltcG9ydCB7IGV4Y2x1ZGVUYWlsd2luZFNvdXJjZXMgfSBmcm9tIFwiLi4vaGVscGVycy90YWlsd2luZC1zb3VyY2VzLnRzXCJcbmltcG9ydCB7IHJlc29sdmVUYXJnZXRFeHBvcnQgfSBmcm9tIFwiLi4vaGVscGVycy90YXJnZXQtZXhwb3J0LnRzXCJcbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9jb25maWcudHNcIlxuaW1wb3J0IHsgV2Vic2l0ZUNvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvY29uZmlnLnRzXCJcbmltcG9ydCB7IEVTQ0FQQUJMRV9GSUxFUywgRVNDQVBBQkxFX0ZPTERFUlMgfSBmcm9tIFwiLi4vc2V0dGluZ3MudHNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIExpdmVtYXJrT3B0aW9ucyB7XG4gIGNvbmZpZzogQ29uZmlnXG59XG5cbmNvbnN0IFNPVVJDRV9ESVIgPSBqb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIilcbmNvbnN0IElTX0lOU1RBTExFRCA9IFNPVVJDRV9ESVIuaW5jbHVkZXMoYCR7c2VwfW5vZGVfbW9kdWxlcyR7c2VwfWApXG5jb25zdCBMT0NLRklMRVMgPSBbXG4gIFwicG5wbS1sb2NrLnlhbWxcIixcbiAgXCJwYWNrYWdlLWxvY2suanNvblwiLFxuICBcInlhcm4ubG9ja1wiLFxuICBcImJ1bi5sb2NrXCIsXG4gIFwiYnVuLmxvY2tiXCIsXG5dXG5cbi8qKiBTaW5nbGUgdmlydHVhbCBtb2R1bGUgZXhwb3NpbmcgbGl2ZW1hcmsncyBydW50aW1lIHZhbHVlcyB0byBjb25zdW1lclxuICogIG92ZXJyaWRlIGZpbGVzIHZpYSBuYW1lZCBleHBvcnRzOlxuICpcbiAqICAgICAgaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuICpcbiAqICBDdXJyZW50bHkgZXhwb3J0cyBgY29uZmlnYCAodmFsaWRhdGVkIGBXZWJzaXRlQ29uZmlnYCkgYW5kIGBiYW5uZXJIdG1sYFxuICogIChgY29uZmlnLmJhbm5lcmAgcmVuZGVyZWQgZnJvbSBpbmxpbmUgTWFya2Rvd24gYXQgYnVpbGQgdGltZSk7IGZ1dHVyZVxuICogIGFkZGl0aW9ucyAoZS5nLiBgYXJ0aWNsZXNgLCBgc2VjdGlvbnNgKSBsYW5kIGhlcmUgYXMgbmV3IG5hbWVkXG4gKiAgZXhwb3J0cyB3aXRob3V0IGNvbnN1bWVycyBjaGFuZ2luZyB0aGVpciBpbXBvcnQgc3RhdGVtZW50cy5cbiAqXG4gKiAgVGhlIGBcXDBgIHByZWZpeCBvbiB0aGUgcmVzb2x2ZWQgaWQgaXMgVml0ZSdzIGNvbnZlbnRpb24gdG8gc2lnbmFsXG4gKiAgXCJ0aGlzIGlzIGEgdmlydHVhbCBtb2R1bGUg4oCUIG5vIG90aGVyIHBsdWdpbiBzaG91bGQgdHJ5IHRvIHJlc29sdmVcbiAqICBvciBsb2FkIGl0IGZyb20gZGlza1wiLiAqL1xuY29uc3QgVklSVFVBTF9JRCA9IFwibGl2ZW1hcms6dmlydHVhbFwiXG5jb25zdCBWSVJUVUFMX1JFU09MVkVEX0lEID0gYFxcMCR7VklSVFVBTF9JRH1gXG5cbi8qKiBPd25zIHRoZSBwcm9qZWN0J3MgYC5saXZlbWFyay8udGFyZ2V0L2AgbW91bnQ6IHN5bnRoZXNpemVzIGl0IHZpYVxuICogIGBidWlsZFRhcmdldCgpYCwgcmV0dXJucyB0aGUgVml0ZSBjb25maWcgdGhhdCBhbmNob3JzIHRoZXJlLCBhbmRcbiAqICBjb3BpZXMgYC5saXZlbWFyay9gIGVkaXRzIChwbHVzIGxpdmVtYXJrJ3MgYHNvdXJjZS9gIGluIGl0cyBvd24gZGV2KVxuICogIGludG8gdGhlIHRhcmdldC4gVml0ZSB3YXRjaGVzIHRoZSB0YXJnZXQgbmF0aXZlbHksIHNvIGl0cyBvd24gSE1SXG4gKiAgZGVjaWRlcyBiZXR3ZWVuIEZhc3QgUmVmcmVzaCwgQ1NTIHVwZGF0ZXMgYW5kIGEgcGFnZSByZWxvYWQuICovXG5leHBvcnQgZnVuY3Rpb24gbGl2ZW1hcmsob3B0czogTGl2ZW1hcmtPcHRpb25zKTogUGx1Z2luIHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IGpvaW4ob3B0cy5jb25maWcucm9vdCwgXCIubGl2ZW1hcmtcIilcbiAgY29uc3Qgb3V0RGlyID0gam9pbihvdmVycmlkZXNSb290LCBcImJ1aWxkXCIpXG4gIGxldCB0YXJnZXREaXIgPSBcIlwiXG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJsaXZlbWFya1wiLFxuICAgIGVuZm9yY2U6IFwicHJlXCIsXG4gICAgYXN5bmMgY29uZmlnKF8sIGVudikge1xuICAgICAgdGFyZ2V0RGlyID0gYnVpbGRUYXJnZXQoe1xuICAgICAgICBjb25maWdQYXRoOiBvcHRzLmNvbmZpZy5jb25maWdQYXRoLFxuICAgICAgICBzb3VyY2VEaXI6IFNPVVJDRV9ESVIsXG4gICAgICB9KVxuICAgICAgY29uc3QgYmFzZTogVml0ZVVzZXJDb25maWcgPSB7XG4gICAgICAgIHJvb3Q6IHRhcmdldERpcixcbiAgICAgICAgLy8gVGhlIGRlZmF1bHQgYDxyb290Pi9ub2RlX21vZHVsZXMvLnZpdGVgIHdvdWxkIGxhbmQgaW5zaWRlIHRoZVxuICAgICAgICAvLyBkZXBlbmRlbmN5IGxpbmssIGkuZS4gaW4gbGl2ZW1hcmsncyBzaGFyZWQgaW5zdGFsbC5cbiAgICAgICAgY2FjaGVEaXI6IGpvaW4odGFyZ2V0RGlyLCBcIi52aXRlXCIpLFxuICAgICAgICAvLyBNb3VudCBldmVyeXRoaW5nIChhc3NldCBVUkxzLCBtb2R1bGVwcmVsb2FkcywgZGV2IHNlcnZlcikgdW5kZXJcbiAgICAgICAgLy8gYGNvbmZpZy5iYXNlYCBzbyB0aGUgc2FtZSBidWlsZCB3b3JrcyBhdCByb290IG9yIGF0IGEgc3ViLXBhdGhcbiAgICAgICAgLy8gKGUuZy4gR2l0SHViIFBhZ2VzIGBodHRwczovL3VzZXIuZ2l0aHViLmlvL3JlcG8vYCkuIFRoZSByb3V0ZXJcbiAgICAgICAgLy8gYW5kIGFzc2V0LXBhdGggcmVzb2x2ZXIgbWlycm9yIHRoaXMgYXQgcnVudGltZS5cbiAgICAgICAgYmFzZTogb3B0cy5jb25maWcuYmFzZSA/IGAke29wdHMuY29uZmlnLmJhc2V9L2AgOiBcIi9cIixcbiAgICAgICAgLy8gb3V0RGlyIGxpdmVzIG91dHNpZGUgdGhlIHRhcmdldCByb290LCBzbyBWaXRlJ3MgcmVmdXNhbCB0b1xuICAgICAgICAvLyBlbXB0eSBvdXQtb2Ytcm9vdCBkaXJlY3RvcmllcyBuZWVkcyBgZW1wdHlPdXREaXJgLlxuICAgICAgICBidWlsZDogeyBvdXREaXIsIGVtcHR5T3V0RGlyOiB0cnVlIH0sXG4gICAgICAgIHJlc29sdmU6IHsgZGVkdXBlOiBbXCJyZWFjdFwiLCBcInJlYWN0LWRvbVwiXSB9LFxuICAgICAgICAvLyBGb3IgdGhlIFNTUiBidWlsZCBvbmx5LCBpbmxpbmUgZXZlcnkgbm9kZV9tb2R1bGVzIGRlcCBpbnRvXG4gICAgICAgIC8vIHNlcnZlci5qcy4gVGhlIHByZXJlbmRlciBzdGVwICh3aGljaCBydW5zIHNlcnZlci5qcyB3aXRoXG4gICAgICAgIC8vIE5vZGUpIHdhbGtzIG5vZGVfbW9kdWxlcyBmcm9tIHRoZSBidWlsZC8gZGlyIGFuZCBjYW4ndCByZWFjaFxuICAgICAgICAvLyBwYWNrYWdlcyBidXJpZWQgaW4gcG5wbSdzIGAucG5wbS8qL25vZGVfbW9kdWxlcy9gIChlLmcuXG4gICAgICAgIC8vIFRhblN0YWNrLWludGVybmFsIGFsaWFzZXMgbGlrZSBgaDMtdjJgKS4gU2VsZi1jb250YWluZWRcbiAgICAgICAgLy8gYnVuZGxlIGJ5cGFzc2VzIHRoZSBpc3N1ZS4gRGV2IFNTUiBrZWVwcyBleHRlcm5hbHMgKGZhc3RlcikuXG4gICAgICAgIC4uLihlbnYuY29tbWFuZCA9PT0gXCJidWlsZFwiICYmIHtcbiAgICAgICAgICBlbnZpcm9ubWVudHM6IHsgc3NyOiB7IHJlc29sdmU6IHsgbm9FeHRlcm5hbDogdHJ1ZSB9IH0gfSxcbiAgICAgICAgfSksXG4gICAgICB9XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGF3YWl0IHJlc29sdmVWaXRlT3ZlcnJpZGUob3B0cy5jb25maWcudml0ZSwgZW52KVxuICAgICAgcmV0dXJuIG92ZXJyaWRlID8gbWVyZ2VDb25maWcoYmFzZSwgb3ZlcnJpZGUpIDogYmFzZVxuICAgIH0sXG4gICAgLy8gSGVyZSwgbm90IGluIGBzdHlsZXMvZ2VuZXJhbC5jc3NgLCBzbyBhbiBlc2NhcGVkIHN0eWxlc2hlZXQga2VlcHMgaXQuIFdvcmtzIG9ubHlcbiAgICAvLyB3aGlsZSB0aGlzIHBsdWdpbiBwcmVjZWRlcyBgdGFpbHdpbmQoKWA6IGJvdGggYXJlIGBwcmVgLCBzbyBhcnJheSBvcmRlciBkZWNpZGVzLlxuICAgIHRyYW5zZm9ybToge1xuICAgICAgZmlsdGVyOiB7IGlkOiAvXFwuY3NzKFxcP3wkKS8gfSxcbiAgICAgIGhhbmRsZXIoY3NzKSB7XG4gICAgICAgIHJldHVybiBleGNsdWRlVGFpbHdpbmRTb3VyY2VzKHsgY3NzLCB0YXJnZXREaXIgfSlcbiAgICAgIH0sXG4gICAgfSxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIGlmIChpZCA9PT0gVklSVFVBTF9JRCkgcmV0dXJuIFZJUlRVQUxfUkVTT0xWRURfSURcbiAgICAgIHJldHVybiByZXNvbHZlVGFyZ2V0RXhwb3J0KHsgaWQsIHRhcmdldERpciwgZXhwb3J0czogcGFja2FnZUpzb24uZXhwb3J0cyB9KSA/PyBudWxsXG4gICAgfSxcbiAgICBsb2FkKGlkKSB7XG4gICAgICBpZiAoaWQgIT09IFZJUlRVQUxfUkVTT0xWRURfSUQpIHJldHVybiBudWxsXG4gICAgICBjb25zdCBjb25maWcgPSBXZWJzaXRlQ29uZmlnLnBhcnNlKG9wdHMuY29uZmlnKVxuICAgICAgY29uc3QgYmFubmVySHRtbCA9IGNvbmZpZy5iYW5uZXJcbiAgICAgICAgPyByZW5kZXJJbmxpbmVNYXJrZG93bihjb25maWcuYmFubmVyLCBjb25maWcuYmFzZSlcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGBleHBvcnQgY29uc3QgY29uZmlnID0gJHtKU09OLnN0cmluZ2lmeShjb25maWcpfWAsXG4gICAgICAgIGBleHBvcnQgY29uc3QgYmFubmVySHRtbCA9ICR7SlNPTi5zdHJpbmdpZnkoYmFubmVySHRtbCl9YCxcbiAgICAgIF0uam9pbihcIlxcblwiKVxuICAgIH0sXG4gICAgY29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuICAgICAgLy8gVml0ZSByZXN0YXJ0cyBvbmx5IGZvciBpdHMgb3duIGNvbmZpZydzIGltcG9ydHM7IHRoZSBwcm9qZWN0IGNvbmZpZydzXG4gICAgICAvLyBpbXBvcnRzIGFuZCwgaW4gbGl2ZW1hcmsncyBvd24gZGV2LCB0aGUgY29udGVudC1jb2xsZWN0aW9ucyBjb25maWcnc1xuICAgICAgLy8gaW1wb3J0cyBuZWVkIGl0IHRvby4gQSByZXN0YXJ0IHJlYnVpbGRzIHRoZSB0YXJnZXQsIHNvIG5vIHN5bmMgaXMgbG9zdC5cbiAgICAgIGNvbnN0IHJlc3RhcnRGaWxlcyA9IG5ldyBTZXQoW1xuICAgICAgICBvcHRzLmNvbmZpZy5jb25maWdQYXRoLFxuICAgICAgICAuLi5vcHRzLmNvbmZpZy5jb25maWdEZXBlbmRlbmNpZXMsXG4gICAgICAgIC4uLihJU19JTlNUQUxMRURcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBjb2xsZWN0TG9jYWxJbXBvcnRzKGpvaW4oU09VUkNFX0RJUiwgXCJjb250ZW50LWNvbGxlY3Rpb25zLnRzXCIpKSksXG4gICAgICBdKVxuICAgICAgLy8gVml0ZSB3YXRjaGVzIG9ubHkgaXRzIHJvb3QgKHRoZSB0YXJnZXQpOyB0aGUgZmlsZXMgdGhlIHRhcmdldCBpc1xuICAgICAgLy8gY29waWVkIGZyb20gam9pbiBpdHMgd2F0Y2hlciBoZXJlLiBgLmxpdmVtYXJrL2AgYWx3YXlzIGV4aXN0c1xuICAgICAgLy8gYmVjYXVzZSB0aGUgdGFyZ2V0IGxpdmVzIGluc2lkZSBpdC5cbiAgICAgIHNlcnZlci53YXRjaGVyLmFkZChbLi4ucmVzdGFydEZpbGVzLCBvdmVycmlkZXNSb290XSlcbiAgICAgIGlmIChJU19JTlNUQUxMRUQpIHdhdGNoSW5zdGFsbGVkVmVyc2lvbihzZXJ2ZXIsIG9wdHMuY29uZmlnLnJvb3QpXG4gICAgICBlbHNlIHNlcnZlci53YXRjaGVyLmFkZChTT1VSQ0VfRElSKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJjaGFuZ2VcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcImNoYW5nZVwiKSlcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwiYWRkXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJhZGRcIikpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcInVubGlua1wiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwidW5saW5rXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJ1bmxpbmtEaXJcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcInVubGlua1wiKSlcblxuICAgICAgZnVuY3Rpb24gb25DaGFuZ2UoZmlsZTogc3RyaW5nLCBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIpIHtcbiAgICAgICAgaWYgKHJlc3RhcnRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgICBzZXJ2ZXIucmVzdGFydCgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzV2l0aGluKGZpbGUsIHRhcmdldERpcikgfHwgaXNXaXRoaW4oZmlsZSwgb3V0RGlyKSkgcmV0dXJuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlIaXQgPSBtYXRjaFBhdGgoZmlsZSwgb3ZlcnJpZGVzUm9vdClcbiAgICAgICAgaWYgKG92ZXJsYXlIaXQpIHtcbiAgICAgICAgICBzeW5jT3ZlcmxheShvdmVybGF5SGl0LCBraW5kLCB0YXJnZXREaXIsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlSGl0ID0gbWF0Y2hQYXRoKGZpbGUsIFNPVVJDRV9ESVIpXG4gICAgICAgIGlmIChzb3VyY2VIaXQgJiYgIXNvdXJjZUhpdC5yZWwuaW5jbHVkZXMoXCJyb3V0ZVRyZWUuZ2VuLnRzXCIpKSB7XG4gICAgICAgICAgc3luY1NvdXJjZShzb3VyY2VIaXQsIGtpbmQsIHRhcmdldERpciwgb3ZlcnJpZGVzUm9vdClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn1cblxuaW50ZXJmYWNlIEhpdCB7XG4gIHJlbDogc3RyaW5nXG4gIGNhdGVnb3J5OiBcImZvbGRlclwiIHwgXCJmaWxlXCIgfCBudWxsXG59XG5cbmZ1bmN0aW9uIG1hdGNoUGF0aChmaWxlOiBzdHJpbmcsIHJvb3Q6IHN0cmluZyk6IEhpdCB8IG51bGwge1xuICBpZiAoIWlzV2l0aGluKGZpbGUsIHJvb3QpIHx8IGZpbGUgPT09IHJvb3QpIHJldHVybiBudWxsXG4gIGNvbnN0IHJlbCA9IGZpbGUuc2xpY2Uocm9vdC5sZW5ndGggKyBzZXAubGVuZ3RoKVxuICByZXR1cm4geyByZWwsIGNhdGVnb3J5OiBjbGFzc2lmeShyZWwpIH1cbn1cblxuZnVuY3Rpb24gaXNXaXRoaW4oZmlsZTogc3RyaW5nLCBkaXI6IHN0cmluZykge1xuICByZXR1cm4gZmlsZSA9PT0gZGlyIHx8IGZpbGUuc3RhcnRzV2l0aChgJHtkaXJ9JHtzZXB9YClcbn1cblxuZnVuY3Rpb24gY2xhc3NpZnkocmVsOiBzdHJpbmcpOiBcImZvbGRlclwiIHwgXCJmaWxlXCIgfCBudWxsIHtcbiAgY29uc3QgW2hlYWRdID0gcmVsLnNwbGl0KHNlcClcbiAgaWYgKGhlYWQgJiYgRVNDQVBBQkxFX0ZPTERFUlMuaW5jbHVkZXMoaGVhZCkpIHJldHVybiBcImZvbGRlclwiXG4gIGlmIChFU0NBUEFCTEVfRklMRVMuaW5jbHVkZXMocmVsKSkgcmV0dXJuIFwiZmlsZVwiXG4gIC8vIE5vbi1lc2NhcGFibGUgc291cmNlIGZpbGVzIHN0aWxsIG5lZWQgdG8gZmxvdyBpbnRvIHRhcmdldCBkdXJpbmdcbiAgLy8gbGl2ZW1hcmsncyBvd24gZGV2IOKAlCB0aGUgdXNlciBpcyBlZGl0aW5nIHRoZSBjYW5vbmljYWwgc291cmNlLlxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBzeW5jT3ZlcmxheShcbiAgaGl0OiBIaXQsXG4gIGtpbmQ6IFwiY2hhbmdlXCIgfCBcImFkZFwiIHwgXCJ1bmxpbmtcIixcbiAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gIG92ZXJyaWRlc1Jvb3Q6IHN0cmluZyxcbikge1xuICBpZiAoIWhpdC5jYXRlZ29yeSkgcmV0dXJuXG4gIGNvbnN0IGRlc3QgPSBqb2luKHRhcmdldERpciwgaGl0LnJlbClcbiAgY29uc3Qgc291cmNlID0gam9pbihTT1VSQ0VfRElSLCBoaXQucmVsKVxuICBpZiAoa2luZCA9PT0gXCJ1bmxpbmtcIikge1xuICAgIC8vIENvcHkgYSBmaWxlJ3MgZGVmYXVsdCBvdmVyIHRoZSBlc2NhcGUgaW4gb25lIHdyaXRlOiBhbiB1bmxpbmsgdGhlblxuICAgIC8vIGFuIGFkZCByZWFjaGVzIFZpdGUgYXMgdHdvIGV2ZW50cyBhbmQgY29zdHMgYSBwYWdlIHJlbG9hZC5cbiAgICBpZiAoIWV4aXN0c1N5bmMoc291cmNlKSB8fCBzdGF0U3luYyhzb3VyY2UpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJtU3luYyhkZXN0LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICB9XG4gICAgaWYgKGV4aXN0c1N5bmMoc291cmNlKSkgY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3Qgb3ZlcmxheSA9IGpvaW4ob3ZlcnJpZGVzUm9vdCwgaGl0LnJlbClcbiAgaWYgKGV4aXN0c1N5bmMob3ZlcmxheSkpIGNwU3luYyhvdmVybGF5LCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbn1cblxuZnVuY3Rpb24gc3luY1NvdXJjZShcbiAgaGl0OiBIaXQsXG4gIGtpbmQ6IFwiY2hhbmdlXCIgfCBcImFkZFwiIHwgXCJ1bmxpbmtcIixcbiAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gIG92ZXJyaWRlc1Jvb3Q6IHN0cmluZyxcbikge1xuICAvLyBJZiB0aGUgY29uc3VtZXIgaGFzIGFuIG92ZXJsYXkgZm9yIHRoaXMgZmlsZSAoYW5kIGl0J3MgZXNjYXBhYmxlKSxcbiAgLy8gdGhlIG92ZXJsYXkgd2lucyDigJQgaWdub3JlIHNvdXJjZSBjaGFuZ2VzLlxuICBpZiAoaGl0LmNhdGVnb3J5ICYmIGV4aXN0c1N5bmMoam9pbihvdmVycmlkZXNSb290LCBoaXQucmVsKSkpIHJldHVyblxuICBjb25zdCBkZXN0ID0gam9pbih0YXJnZXREaXIsIGhpdC5yZWwpXG4gIGNvbnN0IHNvdXJjZSA9IGpvaW4oU09VUkNFX0RJUiwgaGl0LnJlbClcbiAgaWYgKGtpbmQgPT09IFwidW5saW5rXCIpIHtcbiAgICBybVN5bmMoZGVzdCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGV4aXN0c1N5bmMoc291cmNlKSkgY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbi8vIEEgcnVubmluZyBzZXJ2ZXIga2VlcHMgdGhlIGxpdmVtYXJrIGl0IHN0YXJ0ZWQgd2l0aDogYW4gaW4tcHJvY2VzcyByZXN0YXJ0IGNhbm5vdFxuLy8gcmVsb2FkIHRoZSBwYWNrYWdlJ3Mgb3duIG1vZHVsZXMsIHNvIGFuIHVwZ3JhZGUgaXMgcmVwb3J0ZWQgaW5zdGVhZC5cbmZ1bmN0aW9uIHdhdGNoSW5zdGFsbGVkVmVyc2lvbihzZXJ2ZXI6IFZpdGVEZXZTZXJ2ZXIsIHJvb3Q6IHN0cmluZykge1xuICBjb25zdCBwYWNrYWdlRGlyID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdClcbiAgaWYgKCFwYWNrYWdlRGlyKSByZXR1cm5cbiAgLy8gVml0ZSdzIHdhdGNoZXIgaWdub3JlcyBub2RlX21vZHVsZXMsIHNvIHRoZSBsb2NrZmlsZSBpcyB3aGF0IHNpZ25hbHMgYW4gaW5zdGFsbC5cbiAgY29uc3QgcHJvamVjdERpciA9IGRpcm5hbWUoZGlybmFtZShwYWNrYWdlRGlyKSlcbiAgY29uc3QgbWFuaWZlc3QgPSBqb2luKHBhY2thZ2VEaXIsIFwicGFja2FnZS5qc29uXCIpXG4gIGNvbnN0IHdhdGNoZWQgPSBMT0NLRklMRVMubWFwKG5hbWUgPT4gam9pbihwcm9qZWN0RGlyLCBuYW1lKSlcbiAgc2VydmVyLndhdGNoZXIuYWRkKHdhdGNoZWQpXG4gIGxldCB0aW1lcjogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWRcbiAgc2VydmVyLndhdGNoZXIub24oXCJhbGxcIiwgKF8sIGZpbGUpID0+IHtcbiAgICBpZiAoIXdhdGNoZWQuaW5jbHVkZXMoZmlsZSkpIHJldHVyblxuICAgIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAvLyBMZXQgdGhlIHBhY2thZ2UgbWFuYWdlciBmaW5pc2ggcmVsaW5raW5nIGFmdGVyIGl0IHdyaXRlcyB0aGUgbG9ja2ZpbGUuXG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KHJlcG9ydFVwZ3JhZGUsIDEwMDApXG4gIH0pXG5cbiAgZnVuY3Rpb24gcmVwb3J0VXBncmFkZSgpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVhZFBhY2thZ2VWZXJzaW9uKG1hbmlmZXN0KVxuICAgIGlmICghdmVyc2lvbiB8fCB2ZXJzaW9uID09PSBwYWNrYWdlSnNvbi52ZXJzaW9uKSByZXR1cm5cbiAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgYGxpdmVtYXJrICR7cGFja2FnZUpzb24udmVyc2lvbn0g4oaSICR7dmVyc2lvbn0gaW5zdGFsbGVkOyByZXN0YXJ0IHRoZSBkZXYgc2VydmVyIHRvIHVzZSBpdGAsXG4gICAgICB7IHRpbWVzdGFtcDogdHJ1ZSB9LFxuICAgIClcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSW5zdGFsbGVkUGFja2FnZURpcihyb290OiBzdHJpbmcpIHtcbiAgZm9yIChsZXQgZGlyID0gcm9vdDsgOyBkaXIgPSBkaXJuYW1lKGRpcikpIHtcbiAgICBjb25zdCBwYWNrYWdlRGlyID0gam9pbihkaXIsIFwibm9kZV9tb2R1bGVzXCIsIHBhY2thZ2VKc29uLm5hbWUpXG4gICAgaWYgKGV4aXN0c1N5bmMocGFja2FnZURpcikpIHJldHVybiBwYWNrYWdlRGlyXG4gICAgaWYgKGRpcm5hbWUoZGlyKSA9PT0gZGlyKSByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VWZXJzaW9uKG1hbmlmZXN0OiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQ6IHVua25vd24gPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhtYW5pZmVzdCwgXCJ1dGY4XCIpKVxuICAgIHJldHVybiBpc09iamVjdChwYXJzZWQpICYmIHR5cGVvZiBwYXJzZWQudmVyc2lvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBwYXJzZWQudmVyc2lvblxuICAgICAgOiB1bmRlZmluZWRcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbi8qKiBSZXNvbHZlIGxpdmVtYXJrLmNvbmZpZy50cydzIGB2aXRlYCBmaWVsZCDigJQgZWl0aGVyIGEgY29uZmlnIG9iamVjdFxuICogIG9yIGEgZnVuY3Rpb24gYChlbnYpID0+IGNvbmZpZ2AgKG1hdGNoaW5nIFZpdGUncyBvd24gYGRlZmluZUNvbmZpZ2ApLlxuICogIFNjaGVtYSBzdG9yZXMgaXQgYXMgYHVua25vd25gOyB0eXBpbmcgZm9yIHRoZSBjb25zdW1lcidzIGVkaXRvclxuICogIGxpdmVzIG9uIHtAbGluayBWaXRlT3ZlcnJpZGV9LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVZpdGVPdmVycmlkZShcbiAgdml0ZTogdW5rbm93bixcbiAgZW52OiBDb25maWdFbnYsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD4ge1xuICBpZiAoIXZpdGUpIHJldHVybiBudWxsXG4gIGlmICh0eXBlb2Ygdml0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseSh2aXRlLCB1bmRlZmluZWQsIFtlbnZdKVxuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogbnVsbFxuICB9XG4gIHJldHVybiBpc09iamVjdCh2aXRlKSA/IHZpdGUgOiBudWxsXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHY6IHVua25vd24pOiB2IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHYgIT09IG51bGwgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCJcbn1cbiJdfQ==
|
|
273
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDNUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRTlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDbEMsT0FBTyxXQUFXLE1BQU0sb0JBQW9CLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFBO0FBRWpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFNbkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUNsRCxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxlQUFlLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDcEUsTUFBTSxTQUFTLEdBQUc7SUFDaEIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixXQUFX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QyxDQUFDLElBQUksQ0FBQTtJQUN6QyxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQ3JDLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxDQUFVO0lBQzFCLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUE7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNwU3luYywgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCBybVN5bmMsIHN0YXRTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgc2VwIH0gZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgdHlwZSB7IENvbmZpZ0VudiwgUGx1Z2luLCBVc2VyQ29uZmlnIGFzIFZpdGVVc2VyQ29uZmlnLCBWaXRlRGV2U2VydmVyIH0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHsgbWVyZ2VDb25maWcgfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgcGFja2FnZUpzb24gZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9XG5pbXBvcnQgeyBidWlsZFRhcmdldCB9IGZyb20gXCIuLi9hY3Rpb25zL3RhcmdldC9idWlsZC50c1wiXG5pbXBvcnQgeyBjb2xsZWN0TG9jYWxJbXBvcnRzIH0gZnJvbSBcIi4uL2hlbHBlcnMvbG9jYWwtaW1wb3J0cy50c1wiXG5pbXBvcnQgeyByZW5kZXJJbmxpbmVNYXJrZG93biB9IGZyb20gXCIuLi9oZWxwZXJzL3JlbmRlci1pbmxpbmUtbWFya2Rvd24udHNcIlxuaW1wb3J0IHsgZXhjbHVkZVRhaWx3aW5kU291cmNlcyB9IGZyb20gXCIuLi9oZWxwZXJzL3RhaWx3aW5kLXNvdXJjZXMudHNcIlxuaW1wb3J0IHsgcmVzb2x2ZVRhcmdldEV4cG9ydCB9IGZyb20gXCIuLi9oZWxwZXJzL3RhcmdldC1leHBvcnQudHNcIlxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgeyBXZWJzaXRlQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9jb25maWcudHNcIlxuaW1wb3J0IHsgRVNDQVBBQkxFX0ZJTEVTLCBFU0NBUEFCTEVfRk9MREVSUyB9IGZyb20gXCIuLi9zZXR0aW5ncy50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGl2ZW1hcmtPcHRpb25zIHtcbiAgY29uZmlnOiBDb25maWdcbn1cblxuY29uc3QgU09VUkNFX0RJUiA9IGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiKVxuY29uc3QgSVNfSU5TVEFMTEVEID0gU09VUkNFX0RJUi5pbmNsdWRlcyhgJHtzZXB9bm9kZV9tb2R1bGVzJHtzZXB9YClcbmNvbnN0IExPQ0tGSUxFUyA9IFtcbiAgXCJwbnBtLWxvY2sueWFtbFwiLFxuICBcInBhY2thZ2UtbG9jay5qc29uXCIsXG4gIFwieWFybi5sb2NrXCIsXG4gIFwiYnVuLmxvY2tcIixcbiAgXCJidW4ubG9ja2JcIixcbl1cblxuLyoqIFNpbmdsZSB2aXJ0dWFsIG1vZHVsZSBleHBvc2luZyBsaXZlbWFyaydzIHJ1bnRpbWUgdmFsdWVzIHRvIGNvbnN1bWVyXG4gKiAgb3ZlcnJpZGUgZmlsZXMgdmlhIG5hbWVkIGV4cG9ydHM6XG4gKlxuICogICAgICBpbXBvcnQgeyBjb25maWcgfSBmcm9tIFwibGl2ZW1hcms6dmlydHVhbFwiXG4gKlxuICogIEN1cnJlbnRseSBleHBvcnRzIGBjb25maWdgICh2YWxpZGF0ZWQgYFdlYnNpdGVDb25maWdgKSBhbmQgYGJhbm5lckh0bWxgXG4gKiAgKGBjb25maWcuYmFubmVyYCByZW5kZXJlZCBmcm9tIGlubGluZSBNYXJrZG93biBhdCBidWlsZCB0aW1lKTsgZnV0dXJlXG4gKiAgYWRkaXRpb25zIChlLmcuIGBhcnRpY2xlc2AsIGBzZWN0aW9uc2ApIGxhbmQgaGVyZSBhcyBuZXcgbmFtZWRcbiAqICBleHBvcnRzIHdpdGhvdXQgY29uc3VtZXJzIGNoYW5naW5nIHRoZWlyIGltcG9ydCBzdGF0ZW1lbnRzLlxuICpcbiAqICBUaGUgYFxcMGAgcHJlZml4IG9uIHRoZSByZXNvbHZlZCBpZCBpcyBWaXRlJ3MgY29udmVudGlvbiB0byBzaWduYWxcbiAqICBcInRoaXMgaXMgYSB2aXJ0dWFsIG1vZHVsZSDigJQgbm8gb3RoZXIgcGx1Z2luIHNob3VsZCB0cnkgdG8gcmVzb2x2ZVxuICogIG9yIGxvYWQgaXQgZnJvbSBkaXNrXCIuICovXG5jb25zdCBWSVJUVUFMX0lEID0gXCJsaXZlbWFyazp2aXJ0dWFsXCJcbmNvbnN0IFZJUlRVQUxfUkVTT0xWRURfSUQgPSBgXFwwJHtWSVJUVUFMX0lEfWBcblxuLyoqIE93bnMgdGhlIHByb2plY3QncyBgLmxpdmVtYXJrLy5zZXJ2ZS9gIG1vdW50IChgLmJ1aWxkL2Agd2hlbiBidWlsZGluZywgc28gYSBidWlsZFxuICogIG5ldmVyIHJld3JpdGVzIGEgcnVubmluZyBkZXYgc2VydmVyJ3MgZmlsZXMpOiBzeW50aGVzaXplcyBpdCB2aWFcbiAqICBgYnVpbGRUYXJnZXQoKWAsIHJldHVybnMgdGhlIFZpdGUgY29uZmlnIHRoYXQgYW5jaG9ycyB0aGVyZSwgYW5kXG4gKiAgY29waWVzIGAubGl2ZW1hcmsvYCBlZGl0cyAocGx1cyBsaXZlbWFyaydzIGBzb3VyY2UvYCBpbiBpdHMgb3duIGRldilcbiAqICBpbnRvIHRoZSB0YXJnZXQuIFZpdGUgd2F0Y2hlcyB0aGUgdGFyZ2V0IG5hdGl2ZWx5LCBzbyBpdHMgb3duIEhNUlxuICogIGRlY2lkZXMgYmV0d2VlbiBGYXN0IFJlZnJlc2gsIENTUyB1cGRhdGVzIGFuZCBhIHBhZ2UgcmVsb2FkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdmVtYXJrKG9wdHM6IExpdmVtYXJrT3B0aW9ucyk6IFBsdWdpbiB7XG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBqb2luKG9wdHMuY29uZmlnLnJvb3QsIFwiLmxpdmVtYXJrXCIpXG4gIGNvbnN0IG91dERpciA9IGpvaW4ob3ZlcnJpZGVzUm9vdCwgXCJidWlsZFwiKVxuICBsZXQgdGFyZ2V0RGlyID0gXCJcIlxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwibGl2ZW1hcmtcIixcbiAgICBlbmZvcmNlOiBcInByZVwiLFxuICAgIGFzeW5jIGNvbmZpZyhfLCBlbnYpIHtcbiAgICAgIHRhcmdldERpciA9IGJ1aWxkVGFyZ2V0KHtcbiAgICAgICAgY29uZmlnUGF0aDogb3B0cy5jb25maWcuY29uZmlnUGF0aCxcbiAgICAgICAgc291cmNlRGlyOiBTT1VSQ0VfRElSLFxuICAgICAgICBjb21tYW5kOiBlbnYuY29tbWFuZCA9PT0gXCJidWlsZFwiIHx8IGVudi5pc1ByZXZpZXcgPyBcImJ1aWxkXCIgOiBcInNlcnZlXCIsXG4gICAgICB9KVxuICAgICAgY29uc3QgYmFzZTogVml0ZVVzZXJDb25maWcgPSB7XG4gICAgICAgIHJvb3Q6IHRhcmdldERpcixcbiAgICAgICAgLy8gVGhlIGRlZmF1bHQgYDxyb290Pi9ub2RlX21vZHVsZXMvLnZpdGVgIHdvdWxkIGxhbmQgaW5zaWRlIHRoZVxuICAgICAgICAvLyBkZXBlbmRlbmN5IGxpbmssIGkuZS4gaW4gbGl2ZW1hcmsncyBzaGFyZWQgaW5zdGFsbC5cbiAgICAgICAgY2FjaGVEaXI6IGpvaW4odGFyZ2V0RGlyLCBcIi52aXRlXCIpLFxuICAgICAgICAvLyBNb3VudCBldmVyeXRoaW5nIChhc3NldCBVUkxzLCBtb2R1bGVwcmVsb2FkcywgZGV2IHNlcnZlcikgdW5kZXJcbiAgICAgICAgLy8gYGNvbmZpZy5iYXNlYCBzbyB0aGUgc2FtZSBidWlsZCB3b3JrcyBhdCByb290IG9yIGF0IGEgc3ViLXBhdGhcbiAgICAgICAgLy8gKGUuZy4gR2l0SHViIFBhZ2VzIGBodHRwczovL3VzZXIuZ2l0aHViLmlvL3JlcG8vYCkuIFRoZSByb3V0ZXJcbiAgICAgICAgLy8gYW5kIGFzc2V0LXBhdGggcmVzb2x2ZXIgbWlycm9yIHRoaXMgYXQgcnVudGltZS5cbiAgICAgICAgYmFzZTogb3B0cy5jb25maWcuYmFzZSA/IGAke29wdHMuY29uZmlnLmJhc2V9L2AgOiBcIi9cIixcbiAgICAgICAgLy8gb3V0RGlyIGxpdmVzIG91dHNpZGUgdGhlIHRhcmdldCByb290LCBzbyBWaXRlJ3MgcmVmdXNhbCB0b1xuICAgICAgICAvLyBlbXB0eSBvdXQtb2Ytcm9vdCBkaXJlY3RvcmllcyBuZWVkcyBgZW1wdHlPdXREaXJgLlxuICAgICAgICBidWlsZDogeyBvdXREaXIsIGVtcHR5T3V0RGlyOiB0cnVlIH0sXG4gICAgICAgIHJlc29sdmU6IHsgZGVkdXBlOiBbXCJyZWFjdFwiLCBcInJlYWN0LWRvbVwiXSB9LFxuICAgICAgICAvLyBGb3IgdGhlIFNTUiBidWlsZCBvbmx5LCBpbmxpbmUgZXZlcnkgbm9kZV9tb2R1bGVzIGRlcCBpbnRvXG4gICAgICAgIC8vIHNlcnZlci5qcy4gVGhlIHByZXJlbmRlciBzdGVwICh3aGljaCBydW5zIHNlcnZlci5qcyB3aXRoXG4gICAgICAgIC8vIE5vZGUpIHdhbGtzIG5vZGVfbW9kdWxlcyBmcm9tIHRoZSBidWlsZC8gZGlyIGFuZCBjYW4ndCByZWFjaFxuICAgICAgICAvLyBwYWNrYWdlcyBidXJpZWQgaW4gcG5wbSdzIGAucG5wbS8qL25vZGVfbW9kdWxlcy9gIChlLmcuXG4gICAgICAgIC8vIFRhblN0YWNrLWludGVybmFsIGFsaWFzZXMgbGlrZSBgaDMtdjJgKS4gU2VsZi1jb250YWluZWRcbiAgICAgICAgLy8gYnVuZGxlIGJ5cGFzc2VzIHRoZSBpc3N1ZS4gRGV2IFNTUiBrZWVwcyBleHRlcm5hbHMgKGZhc3RlcikuXG4gICAgICAgIC4uLihlbnYuY29tbWFuZCA9PT0gXCJidWlsZFwiICYmIHtcbiAgICAgICAgICBlbnZpcm9ubWVudHM6IHsgc3NyOiB7IHJlc29sdmU6IHsgbm9FeHRlcm5hbDogdHJ1ZSB9IH0gfSxcbiAgICAgICAgfSksXG4gICAgICB9XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGF3YWl0IHJlc29sdmVWaXRlT3ZlcnJpZGUob3B0cy5jb25maWcudml0ZSwgZW52KVxuICAgICAgcmV0dXJuIG92ZXJyaWRlID8gbWVyZ2VDb25maWcoYmFzZSwgb3ZlcnJpZGUpIDogYmFzZVxuICAgIH0sXG4gICAgLy8gSGVyZSwgbm90IGluIGBzdHlsZXMvZ2VuZXJhbC5jc3NgLCBzbyBhbiBlc2NhcGVkIHN0eWxlc2hlZXQga2VlcHMgaXQuIFdvcmtzIG9ubHlcbiAgICAvLyB3aGlsZSB0aGlzIHBsdWdpbiBwcmVjZWRlcyBgdGFpbHdpbmQoKWA6IGJvdGggYXJlIGBwcmVgLCBzbyBhcnJheSBvcmRlciBkZWNpZGVzLlxuICAgIHRyYW5zZm9ybToge1xuICAgICAgZmlsdGVyOiB7IGlkOiAvXFwuY3NzKFxcP3wkKS8gfSxcbiAgICAgIGhhbmRsZXIoY3NzKSB7XG4gICAgICAgIHJldHVybiBleGNsdWRlVGFpbHdpbmRTb3VyY2VzKHsgY3NzLCB0YXJnZXREaXIgfSlcbiAgICAgIH0sXG4gICAgfSxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIGlmIChpZCA9PT0gVklSVFVBTF9JRCkgcmV0dXJuIFZJUlRVQUxfUkVTT0xWRURfSURcbiAgICAgIHJldHVybiByZXNvbHZlVGFyZ2V0RXhwb3J0KHsgaWQsIHRhcmdldERpciwgZXhwb3J0czogcGFja2FnZUpzb24uZXhwb3J0cyB9KSA/PyBudWxsXG4gICAgfSxcbiAgICBsb2FkKGlkKSB7XG4gICAgICBpZiAoaWQgIT09IFZJUlRVQUxfUkVTT0xWRURfSUQpIHJldHVybiBudWxsXG4gICAgICBjb25zdCBjb25maWcgPSBXZWJzaXRlQ29uZmlnLnBhcnNlKG9wdHMuY29uZmlnKVxuICAgICAgY29uc3QgYmFubmVySHRtbCA9IGNvbmZpZy5iYW5uZXJcbiAgICAgICAgPyByZW5kZXJJbmxpbmVNYXJrZG93bihjb25maWcuYmFubmVyLCBjb25maWcuYmFzZSlcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGBleHBvcnQgY29uc3QgY29uZmlnID0gJHtKU09OLnN0cmluZ2lmeShjb25maWcpfWAsXG4gICAgICAgIGBleHBvcnQgY29uc3QgYmFubmVySHRtbCA9ICR7SlNPTi5zdHJpbmdpZnkoYmFubmVySHRtbCl9YCxcbiAgICAgIF0uam9pbihcIlxcblwiKVxuICAgIH0sXG4gICAgY29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuICAgICAgLy8gVml0ZSByZXN0YXJ0cyBvbmx5IGZvciBpdHMgb3duIGNvbmZpZydzIGltcG9ydHM7IHRoZSBwcm9qZWN0IGNvbmZpZydzXG4gICAgICAvLyBpbXBvcnRzIGFuZCwgaW4gbGl2ZW1hcmsncyBvd24gZGV2LCB0aGUgY29udGVudC1jb2xsZWN0aW9ucyBjb25maWcnc1xuICAgICAgLy8gaW1wb3J0cyBuZWVkIGl0IHRvby4gQSByZXN0YXJ0IHJlYnVpbGRzIHRoZSB0YXJnZXQsIHNvIG5vIHN5bmMgaXMgbG9zdC5cbiAgICAgIGNvbnN0IHJlc3RhcnRGaWxlcyA9IG5ldyBTZXQoW1xuICAgICAgICBvcHRzLmNvbmZpZy5jb25maWdQYXRoLFxuICAgICAgICAuLi5vcHRzLmNvbmZpZy5jb25maWdEZXBlbmRlbmNpZXMsXG4gICAgICAgIC4uLihJU19JTlNUQUxMRURcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBjb2xsZWN0TG9jYWxJbXBvcnRzKGpvaW4oU09VUkNFX0RJUiwgXCJjb250ZW50LWNvbGxlY3Rpb25zLnRzXCIpKSksXG4gICAgICBdKVxuICAgICAgLy8gVml0ZSB3YXRjaGVzIG9ubHkgaXRzIHJvb3QgKHRoZSB0YXJnZXQpOyB0aGUgZmlsZXMgdGhlIHRhcmdldCBpc1xuICAgICAgLy8gY29waWVkIGZyb20gam9pbiBpdHMgd2F0Y2hlciBoZXJlLiBgLmxpdmVtYXJrL2AgYWx3YXlzIGV4aXN0c1xuICAgICAgLy8gYmVjYXVzZSB0aGUgdGFyZ2V0IGxpdmVzIGluc2lkZSBpdC5cbiAgICAgIHNlcnZlci53YXRjaGVyLmFkZChbLi4ucmVzdGFydEZpbGVzLCBvdmVycmlkZXNSb290XSlcbiAgICAgIGlmIChJU19JTlNUQUxMRUQpIHdhdGNoSW5zdGFsbGVkVmVyc2lvbihzZXJ2ZXIsIG9wdHMuY29uZmlnLnJvb3QpXG4gICAgICBlbHNlIHNlcnZlci53YXRjaGVyLmFkZChTT1VSQ0VfRElSKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJjaGFuZ2VcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcImNoYW5nZVwiKSlcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwiYWRkXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJhZGRcIikpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcInVubGlua1wiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwidW5saW5rXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJ1bmxpbmtEaXJcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcInVubGlua1wiKSlcblxuICAgICAgZnVuY3Rpb24gb25DaGFuZ2UoZmlsZTogc3RyaW5nLCBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIpIHtcbiAgICAgICAgaWYgKHJlc3RhcnRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgICBzZXJ2ZXIucmVzdGFydCgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzV2l0aGluKGZpbGUsIHRhcmdldERpcikgfHwgaXNXaXRoaW4oZmlsZSwgb3V0RGlyKSkgcmV0dXJuXG4gICAgICAgIC8vIEEgd2F0Y2hlciBjYWxsYmFjayB0aGF0IHRocm93cyBraWxscyB0aGUgc2VydmVyLCBhbmQgYSBjb3B5IHJhY2luZyBhbm90aGVyXG4gICAgICAgIC8vIHdyaXRlciBvZiB0aGUgdGFyZ2V0IChhbiBlZGl0b3IncyBhdG9taWMgc2F2ZSwgYGxpdmVtYXJrIGNsZWFyYCkgZmFpbHMuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb3ZlcmxheUhpdCA9IG1hdGNoUGF0aChmaWxlLCBvdmVycmlkZXNSb290KVxuICAgICAgICAgIGlmIChvdmVybGF5SGl0KSB7XG4gICAgICAgICAgICBzeW5jT3ZlcmxheShvdmVybGF5SGl0LCBraW5kLCB0YXJnZXREaXIsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc291cmNlSGl0ID0gbWF0Y2hQYXRoKGZpbGUsIFNPVVJDRV9ESVIpXG4gICAgICAgICAgaWYgKHNvdXJjZUhpdCAmJiAhc291cmNlSGl0LnJlbC5pbmNsdWRlcyhcInJvdXRlVHJlZS5nZW4udHNcIikpIHtcbiAgICAgICAgICAgIHN5bmNTb3VyY2Uoc291cmNlSGl0LCBraW5kLCB0YXJnZXREaXIsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHNlcnZlci5jb25maWcubG9nZ2VyLmVycm9yKGBbbGl2ZW1hcmtdIGZhaWxlZCB0byBzeW5jICR7ZmlsZX06ICR7ZXJyb3J9YCwge1xuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfVxufVxuXG5pbnRlcmZhY2UgSGl0IHtcbiAgcmVsOiBzdHJpbmdcbiAgY2F0ZWdvcnk6IFwiZm9sZGVyXCIgfCBcImZpbGVcIiB8IG51bGxcbn1cblxuZnVuY3Rpb24gbWF0Y2hQYXRoKGZpbGU6IHN0cmluZywgcm9vdDogc3RyaW5nKTogSGl0IHwgbnVsbCB7XG4gIGlmICghaXNXaXRoaW4oZmlsZSwgcm9vdCkgfHwgZmlsZSA9PT0gcm9vdCkgcmV0dXJuIG51bGxcbiAgY29uc3QgcmVsID0gZmlsZS5zbGljZShyb290Lmxlbmd0aCArIHNlcC5sZW5ndGgpXG4gIHJldHVybiB7IHJlbCwgY2F0ZWdvcnk6IGNsYXNzaWZ5KHJlbCkgfVxufVxuXG5mdW5jdGlvbiBpc1dpdGhpbihmaWxlOiBzdHJpbmcsIGRpcjogc3RyaW5nKSB7XG4gIHJldHVybiBmaWxlID09PSBkaXIgfHwgZmlsZS5zdGFydHNXaXRoKGAke2Rpcn0ke3NlcH1gKVxufVxuXG5mdW5jdGlvbiBjbGFzc2lmeShyZWw6IHN0cmluZyk6IFwiZm9sZGVyXCIgfCBcImZpbGVcIiB8IG51bGwge1xuICBjb25zdCBbaGVhZF0gPSByZWwuc3BsaXQoc2VwKVxuICBpZiAoaGVhZCAmJiBFU0NBUEFCTEVfRk9MREVSUy5pbmNsdWRlcyhoZWFkKSkgcmV0dXJuIFwiZm9sZGVyXCJcbiAgaWYgKEVTQ0FQQUJMRV9GSUxFUy5pbmNsdWRlcyhyZWwpKSByZXR1cm4gXCJmaWxlXCJcbiAgLy8gTm9uLWVzY2FwYWJsZSBzb3VyY2UgZmlsZXMgc3RpbGwgbmVlZCB0byBmbG93IGludG8gdGFyZ2V0IGR1cmluZ1xuICAvLyBsaXZlbWFyaydzIG93biBkZXYg4oCUIHRoZSB1c2VyIGlzIGVkaXRpbmcgdGhlIGNhbm9uaWNhbCBzb3VyY2UuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHN5bmNPdmVybGF5KFxuICBoaXQ6IEhpdCxcbiAga2luZDogXCJjaGFuZ2VcIiB8IFwiYWRkXCIgfCBcInVubGlua1wiLFxuICB0YXJnZXREaXI6IHN0cmluZyxcbiAgb3ZlcnJpZGVzUm9vdDogc3RyaW5nLFxuKSB7XG4gIGlmICghaGl0LmNhdGVnb3J5KSByZXR1cm5cbiAgY29uc3QgZGVzdCA9IGpvaW4odGFyZ2V0RGlyLCBoaXQucmVsKVxuICBjb25zdCBzb3VyY2UgPSBqb2luKFNPVVJDRV9ESVIsIGhpdC5yZWwpXG4gIGlmIChraW5kID09PSBcInVubGlua1wiKSB7XG4gICAgLy8gQ29weSBhIGZpbGUncyBkZWZhdWx0IG92ZXIgdGhlIGVzY2FwZSBpbiBvbmUgd3JpdGU6IGFuIHVubGluayB0aGVuXG4gICAgLy8gYW4gYWRkIHJlYWNoZXMgVml0ZSBhcyB0d28gZXZlbnRzIGFuZCBjb3N0cyBhIHBhZ2UgcmVsb2FkLlxuICAgIGlmICghZXhpc3RzU3luYyhzb3VyY2UpIHx8IHN0YXRTeW5jKHNvdXJjZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcm1TeW5jKGRlc3QsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIH1cbiAgICBpZiAoZXhpc3RzU3luYyhzb3VyY2UpKSBjcFN5bmMoc291cmNlLCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBvdmVybGF5ID0gam9pbihvdmVycmlkZXNSb290LCBoaXQucmVsKVxuICBpZiAoZXhpc3RzU3luYyhvdmVybGF5KSkgY3BTeW5jKG92ZXJsYXksIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxufVxuXG5mdW5jdGlvbiBzeW5jU291cmNlKFxuICBoaXQ6IEhpdCxcbiAga2luZDogXCJjaGFuZ2VcIiB8IFwiYWRkXCIgfCBcInVubGlua1wiLFxuICB0YXJnZXREaXI6IHN0cmluZyxcbiAgb3ZlcnJpZGVzUm9vdDogc3RyaW5nLFxuKSB7XG4gIC8vIElmIHRoZSBjb25zdW1lciBoYXMgYW4gb3ZlcmxheSBmb3IgdGhpcyBmaWxlIChhbmQgaXQncyBlc2NhcGFibGUpLFxuICAvLyB0aGUgb3ZlcmxheSB3aW5zIOKAlCBpZ25vcmUgc291cmNlIGNoYW5nZXMuXG4gIGlmIChoaXQuY2F0ZWdvcnkgJiYgZXhpc3RzU3luYyhqb2luKG92ZXJyaWRlc1Jvb3QsIGhpdC5yZWwpKSkgcmV0dXJuXG4gIGNvbnN0IGRlc3QgPSBqb2luKHRhcmdldERpciwgaGl0LnJlbClcbiAgY29uc3Qgc291cmNlID0gam9pbihTT1VSQ0VfRElSLCBoaXQucmVsKVxuICBpZiAoa2luZCA9PT0gXCJ1bmxpbmtcIikge1xuICAgIHJtU3luYyhkZXN0LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoZXhpc3RzU3luYyhzb3VyY2UpKSBjcFN5bmMoc291cmNlLCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbn1cblxuLy8gQSBydW5uaW5nIHNlcnZlciBrZWVwcyB0aGUgbGl2ZW1hcmsgaXQgc3RhcnRlZCB3aXRoOiBhbiBpbi1wcm9jZXNzIHJlc3RhcnQgY2Fubm90XG4vLyByZWxvYWQgdGhlIHBhY2thZ2UncyBvd24gbW9kdWxlcywgc28gYW4gdXBncmFkZSBpcyByZXBvcnRlZCBpbnN0ZWFkLlxuZnVuY3Rpb24gd2F0Y2hJbnN0YWxsZWRWZXJzaW9uKHNlcnZlcjogVml0ZURldlNlcnZlciwgcm9vdDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhY2thZ2VEaXIgPSBmaW5kSW5zdGFsbGVkUGFja2FnZURpcihyb290KVxuICBpZiAoIXBhY2thZ2VEaXIpIHJldHVyblxuICAvLyBWaXRlJ3Mgd2F0Y2hlciBpZ25vcmVzIG5vZGVfbW9kdWxlcywgc28gdGhlIGxvY2tmaWxlIGlzIHdoYXQgc2lnbmFscyBhbiBpbnN0YWxsLlxuICBjb25zdCBwcm9qZWN0RGlyID0gZGlybmFtZShkaXJuYW1lKHBhY2thZ2VEaXIpKVxuICBjb25zdCBtYW5pZmVzdCA9IGpvaW4ocGFja2FnZURpciwgXCJwYWNrYWdlLmpzb25cIilcbiAgY29uc3Qgd2F0Y2hlZCA9IExPQ0tGSUxFUy5tYXAobmFtZSA9PiBqb2luKHByb2plY3REaXIsIG5hbWUpKVxuICBzZXJ2ZXIud2F0Y2hlci5hZGQod2F0Y2hlZClcbiAgbGV0IHRpbWVyOiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZFxuICBzZXJ2ZXIud2F0Y2hlci5vbihcImFsbFwiLCAoXywgZmlsZSkgPT4ge1xuICAgIGlmICghd2F0Y2hlZC5pbmNsdWRlcyhmaWxlKSkgcmV0dXJuXG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgIC8vIExldCB0aGUgcGFja2FnZSBtYW5hZ2VyIGZpbmlzaCByZWxpbmtpbmcgYWZ0ZXIgaXQgd3JpdGVzIHRoZSBsb2NrZmlsZS5cbiAgICB0aW1lciA9IHNldFRpbWVvdXQocmVwb3J0VXBncmFkZSwgMTAwMClcbiAgfSlcblxuICBmdW5jdGlvbiByZXBvcnRVcGdyYWRlKCkge1xuICAgIGNvbnN0IHZlcnNpb24gPSByZWFkUGFja2FnZVZlcnNpb24obWFuaWZlc3QpXG4gICAgaWYgKCF2ZXJzaW9uIHx8IHZlcnNpb24gPT09IHBhY2thZ2VKc29uLnZlcnNpb24pIHJldHVyblxuICAgIHNlcnZlci5jb25maWcubG9nZ2VyLndhcm4oXG4gICAgICBgbGl2ZW1hcmsgJHtwYWNrYWdlSnNvbi52ZXJzaW9ufSDihpIgJHt2ZXJzaW9ufSBpbnN0YWxsZWQ7IHJlc3RhcnQgdGhlIGRldiBzZXJ2ZXIgdG8gdXNlIGl0YCxcbiAgICAgIHsgdGltZXN0YW1wOiB0cnVlIH0sXG4gICAgKVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRJbnN0YWxsZWRQYWNrYWdlRGlyKHJvb3Q6IHN0cmluZykge1xuICBmb3IgKGxldCBkaXIgPSByb290OyA7IGRpciA9IGRpcm5hbWUoZGlyKSkge1xuICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBqb2luKGRpciwgXCJub2RlX21vZHVsZXNcIiwgcGFja2FnZUpzb24ubmFtZSlcbiAgICBpZiAoZXhpc3RzU3luYyhwYWNrYWdlRGlyKSkgcmV0dXJuIHBhY2thZ2VEaXJcbiAgICBpZiAoZGlybmFtZShkaXIpID09PSBkaXIpIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkUGFja2FnZVZlcnNpb24obWFuaWZlc3Q6IHN0cmluZykge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZDogdW5rbm93biA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKG1hbmlmZXN0LCBcInV0ZjhcIikpXG4gICAgcmV0dXJuIGlzT2JqZWN0KHBhcnNlZCkgJiYgdHlwZW9mIHBhcnNlZC52ZXJzaW9uID09PSBcInN0cmluZ1wiXG4gICAgICA/IHBhcnNlZC52ZXJzaW9uXG4gICAgICA6IHVuZGVmaW5lZFxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqIFJlc29sdmUgbGl2ZW1hcmsuY29uZmlnLnRzJ3MgYHZpdGVgIGZpZWxkIOKAlCBlaXRoZXIgYSBjb25maWcgb2JqZWN0XG4gKiAgb3IgYSBmdW5jdGlvbiBgKGVudikgPT4gY29uZmlnYCAobWF0Y2hpbmcgVml0ZSdzIG93biBgZGVmaW5lQ29uZmlnYCkuXG4gKiAgU2NoZW1hIHN0b3JlcyBpdCBhcyBgdW5rbm93bmA7IHR5cGluZyBmb3IgdGhlIGNvbnN1bWVyJ3MgZWRpdG9yXG4gKiAgbGl2ZXMgb24ge0BsaW5rIFZpdGVPdmVycmlkZX0uICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVml0ZU92ZXJyaWRlKFxuICB2aXRlOiB1bmtub3duLFxuICBlbnY6IENvbmZpZ0Vudixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPiB7XG4gIGlmICghdml0ZSkgcmV0dXJuIG51bGxcbiAgaWYgKHR5cGVvZiB2aXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBSZWZsZWN0LmFwcGx5KHZpdGUsIHVuZGVmaW5lZCwgW2Vudl0pXG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBudWxsXG4gIH1cbiAgcmV0dXJuIGlzT2JqZWN0KHZpdGUpID8gdml0ZSA6IG51bGxcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxufVxuIl19
|
package/package.json
CHANGED
|
@@ -80,7 +80,7 @@ export default defineConfig({
|
|
|
80
80
|
|
|
81
81
|
- **Article** (default when `type` is omitted): flat docs with a tree sidebar.
|
|
82
82
|
- **Blog** (`type: "blog"`): auto-generated index at `prefix`, sorts by `date`, exposes `/prefix/tags/<tag>/` pages.
|
|
83
|
-
- **Changelog** (`type: "changelog"`): reads `source` file; with `version: true`, splits on semver headings into per-version articles. Several changelog sections may coexist as long as their prefixes differ — each is cached in its own
|
|
83
|
+
- **Changelog** (`type: "changelog"`): reads `source` file; with `version: true`, splits on semver headings into per-version articles. Several changelog sections may coexist as long as their prefixes differ — each is cached in its own `.livemark/.cache/changelog/<slug-of-prefix>-<hash-of-prefix>/` directory (the hash keeps prefixes that slugify alike, like `/python/changelog/` and `/python-changelog/`, apart), so a version shared by two changelogs never collides. The `(version)` suffix only renders for `position: "header"` sections.
|
|
84
84
|
|
|
85
85
|
Shared fields on every section: `title`, `prefix` (keep trailing-slashed), `type`, `icon` (lucide), `position` (`"header"` default, `"sidebar"` also available). Header sections and links never overflow: past the bar's width Search turns icon-only, then the rest fold into a "More" menu.
|
|
86
86
|
|
|
@@ -118,7 +118,7 @@ Custom routes win over the Markdown catch-all at exact URLs. Don't create a rout
|
|
|
118
118
|
3. **Override files are full replacements**, not diffs. Copy the default first (via `escape`), then edit.
|
|
119
119
|
4. **Import Livemark internals via `livemark/*`**, not via relative paths — the plugin resolves those to the project's copy, so chained overrides (e.g., your Layout using your Header) compose correctly.
|
|
120
120
|
5. **Static files belong in `.livemark/public/`**, which Vite exposes at the site root.
|
|
121
|
-
6. **Never edit `.livemark/.
|
|
121
|
+
6. **Never edit `.livemark/.serve/` or `.livemark/.build/`** — they are the generated mounts Vite runs for the dev server and the production build (Livemark's source with your overrides copied in), rebuilt on every run, so stack traces point there but edits are lost. Each carries its own `.gitignore`.
|
|
122
122
|
7. **Keyboard shortcuts live in the component they drive** — bare keys through `@tanstack/react-hotkeys`, ignored while typing: `L` sidebar (`Sidebar`), `S` search (`Search`), `T` theme (`Theme`), `J`/`K` scroll (`Root`), `B` back to top (`BackToTop`). Overriding one of these drops its key unless the copy keeps the `useHotkey` call; register a key in a component that mounts once, or one press fires twice.
|
|
123
123
|
8. **Search highlights live in `Article`** — picking a result opens the page with `?highlight=<query>`, and `Article` passes it to `useSearchHighlight` with a ref on its `.prose` wrapper. An overridden `components/Article.tsx` must keep that call and ref, or matches stop being marked. Theme the mark through the `--highlight` and `--highlight-foreground` tokens; code blocks are never marked.
|
|
124
124
|
9. **Edited Markdown reaches the page through `router.tsx`** — articles are route loader data, and route HMR keeps loader data, so `getRouter` re-runs loaders on Vite's `vite:afterUpdate`. An overridden `router.tsx` must keep that hook, or Markdown edits show only after a reload.
|
|
@@ -23,7 +23,7 @@ npx livemark build # prerender every route into .livemark/build/client/
|
|
|
23
23
|
npx livemark preview # serve that build locally on port 8000
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
`.livemark/build/client/` is the **only** directory to publish: an `index.html` per route plus assets, `sitemap.xml`, `robots.txt`, RSS feeds, Markdown twins, `llms.txt` and a `_headers` file. Not `dist/`, and not `.livemark/build/` itself — its `server/` sibling is the prerender bundle, not a site. Gitignore `.livemark/build
|
|
26
|
+
`.livemark/build/client/` is the **only** directory to publish: an `index.html` per route plus assets, `sitemap.xml`, `robots.txt`, RSS feeds, Markdown twins, `llms.txt` and a `_headers` file. Not `dist/`, and not `.livemark/build/` itself — its `server/` sibling is the prerender bundle, not a site. Gitignore `.livemark/build/`; it is regenerated on every build.
|
|
27
27
|
|
|
28
28
|
## Config that affects deployment
|
|
29
29
|
|
|
@@ -11,7 +11,7 @@ import { visit } from "unist-util-visit"
|
|
|
11
11
|
import type { Config } from "../../models/config.ts"
|
|
12
12
|
import type { ChangelogSection } from "../../models/section.ts"
|
|
13
13
|
import { isGitHubUrl, parseGitHubRepo } from "../../helpers/changelog-source.ts"
|
|
14
|
-
import {
|
|
14
|
+
import { cacheDirFor } from "../../helpers/target-dir.ts"
|
|
15
15
|
|
|
16
16
|
interface Release {
|
|
17
17
|
tag_name: string
|
|
@@ -34,8 +34,6 @@ interface ChangelogEntry {
|
|
|
34
34
|
sourceUrl?: string
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
const CACHE_SUBDIR = "cache/changelog"
|
|
38
|
-
|
|
39
37
|
const parser = unified().use(remarkParse)
|
|
40
38
|
const stringifier = unified().use(remarkStringify, {
|
|
41
39
|
bullet: "-",
|
|
@@ -52,7 +50,7 @@ export function cacheIncludeGlob(section: ChangelogSection, config: Config) {
|
|
|
52
50
|
|
|
53
51
|
/** Directory holding one changelog section's cache state: the rendered
|
|
54
52
|
* `.md` entries plus a `meta.json` holding the etag for conditional
|
|
55
|
-
* GETs. Each section gets its own subdirectory of
|
|
53
|
+
* GETs. Each section gets its own subdirectory of `.livemark/.cache/changelog/`,
|
|
56
54
|
* keyed by its prefix's slug plus a hash of the raw prefix
|
|
57
55
|
* (`/python/changelog/` → `python-changelog-<hash>`), so several
|
|
58
56
|
* changelogs never overwrite each other's entries even when their
|
|
@@ -60,7 +58,7 @@ export function cacheIncludeGlob(section: ChangelogSection, config: Config) {
|
|
|
60
58
|
export function changelogCacheDir(section: ChangelogSection, config: Config) {
|
|
61
59
|
const slug = slugify(section.prefix) || "index"
|
|
62
60
|
const hash = createHash("sha256").update(section.prefix).digest("hex").slice(0, 8)
|
|
63
|
-
return join(
|
|
61
|
+
return join(cacheDirFor(config.configPath), "changelog", `${slug}-${hash}`)
|
|
64
62
|
}
|
|
65
63
|
|
|
66
64
|
/** Build the per-version changelog cache files of one changelog section
|
|
@@ -77,6 +75,7 @@ export async function buildChangelog(section: ChangelogSection, config: Config)
|
|
|
77
75
|
if (entries === undefined) return
|
|
78
76
|
|
|
79
77
|
await mkdir(cacheDir, { recursive: true })
|
|
78
|
+
await writeFile(join(cacheDirFor(config.configPath), ".gitignore"), "*\n")
|
|
80
79
|
for (const f of await readdir(cacheDir).catch(() => [])) {
|
|
81
80
|
if (f.endsWith(".md")) await rm(join(cacheDir, f), { force: true })
|
|
82
81
|
}
|
|
@@ -5,7 +5,7 @@ import { describe, expect, it } from "vite-plus/test"
|
|
|
5
5
|
import { partitionBySection } from "../../helpers/section.ts"
|
|
6
6
|
import { Config } from "../../models/config.ts"
|
|
7
7
|
import type { ChangelogSection } from "../../models/section.ts"
|
|
8
|
-
import {
|
|
8
|
+
import { cacheDirFor } from "../../helpers/target-dir.ts"
|
|
9
9
|
import {
|
|
10
10
|
buildChangelog,
|
|
11
11
|
cacheIncludeGlob,
|
|
@@ -49,7 +49,7 @@ describe("buildChangelog", () => {
|
|
|
49
49
|
|
|
50
50
|
const standardDir = changelogCacheDir(standard, config)
|
|
51
51
|
const pythonDir = changelogCacheDir(python, config)
|
|
52
|
-
const cacheRoot = join(
|
|
52
|
+
const cacheRoot = join(cacheDirFor(configPath), "changelog")
|
|
53
53
|
expect(dirname(standardDir)).toBe(cacheRoot)
|
|
54
54
|
expect(dirname(pythonDir)).toBe(cacheRoot)
|
|
55
55
|
expect(basename(standardDir)).toMatch(/^changelog-[0-9a-f]{8}$/)
|
|
@@ -79,7 +79,7 @@ describe("buildChangelog", () => {
|
|
|
79
79
|
"/python/changelog/0-2-0/",
|
|
80
80
|
])
|
|
81
81
|
} finally {
|
|
82
|
-
await rm(
|
|
82
|
+
await rm(cacheDirFor(configPath), { recursive: true, force: true })
|
|
83
83
|
}
|
|
84
84
|
}))
|
|
85
85
|
|
|
@@ -114,7 +114,7 @@ describe("buildChangelog", () => {
|
|
|
114
114
|
expect(await readdir(changelogCacheDir(standard, config))).toEqual(["0-4-0.md"])
|
|
115
115
|
expect(await readdir(changelogCacheDir(python, config))).toEqual(["0-3-0.md"])
|
|
116
116
|
} finally {
|
|
117
|
-
await rm(
|
|
117
|
+
await rm(cacheDirFor(configPath), { recursive: true, force: true })
|
|
118
118
|
}
|
|
119
119
|
}))
|
|
120
120
|
|
|
@@ -150,7 +150,7 @@ describe("buildChangelog", () => {
|
|
|
150
150
|
expect(await readdir(nestedDir)).toEqual(["0-1-0.md"])
|
|
151
151
|
expect(await readdir(flatDir)).toEqual(["0-2-0.md"])
|
|
152
152
|
} finally {
|
|
153
|
-
await rm(
|
|
153
|
+
await rm(cacheDirFor(configPath), { recursive: true, force: true })
|
|
154
154
|
}
|
|
155
155
|
}))
|
|
156
156
|
})
|
|
@@ -1,18 +1,35 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
cpSync,
|
|
3
|
+
existsSync,
|
|
4
|
+
mkdirSync,
|
|
5
|
+
readlinkSync,
|
|
6
|
+
rmSync,
|
|
7
|
+
symlinkSync,
|
|
8
|
+
writeFileSync,
|
|
9
|
+
} from "node:fs"
|
|
2
10
|
import { basename, dirname, join, relative, resolve } from "node:path"
|
|
3
11
|
import { resolveDependencyDir } from "../../helpers/dependency-dir.ts"
|
|
12
|
+
import { removeTargetDir } from "../../helpers/target-dir.ts"
|
|
4
13
|
import { ESCAPABLE_FILES, ESCAPABLE_FOLDERS } from "../../settings.ts"
|
|
5
14
|
|
|
6
15
|
/**
|
|
7
|
-
* Synthesize the project's Vite mount
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
16
|
+
* Synthesize the project's Vite mount — `.livemark/.serve/` for the dev server,
|
|
17
|
+
* `.livemark/.build/` for a production build or preview: livemark's `source/` with the
|
|
18
|
+
* project's `.livemark/` escapes copied over it, plus a `node_modules` link to livemark's
|
|
19
|
+
* dependencies. Escapable folders are rebuilt on every run, so a removed escape never
|
|
20
|
+
* keeps rendering. Returns the target dir.
|
|
11
21
|
*/
|
|
12
|
-
export function buildTarget(props: {
|
|
13
|
-
|
|
22
|
+
export function buildTarget(props: {
|
|
23
|
+
configPath: string
|
|
24
|
+
sourceDir: string
|
|
25
|
+
command?: TargetCommand
|
|
26
|
+
}) {
|
|
27
|
+
const targetDir = targetDirFor(props.configPath, props.command)
|
|
14
28
|
const overridesRoot = dirname(targetDir)
|
|
29
|
+
// `.target/` was the mount before `.serve/` and `.build/`; an upgrade must not keep it.
|
|
30
|
+
removeTargetDir(join(overridesRoot, ".target"))
|
|
15
31
|
mkdirSync(targetDir, { recursive: true })
|
|
32
|
+
writeFileSync(join(targetDir, ".gitignore"), "*\n")
|
|
16
33
|
|
|
17
34
|
cpSync(props.sourceDir, targetDir, {
|
|
18
35
|
recursive: true,
|
|
@@ -36,9 +53,12 @@ export function buildTarget(props: { configPath: string; sourceDir: string }) {
|
|
|
36
53
|
return targetDir
|
|
37
54
|
}
|
|
38
55
|
|
|
56
|
+
/** Which mount a run uses: the dev server's, or the production build's. */
|
|
57
|
+
export type TargetCommand = "serve" | "build"
|
|
58
|
+
|
|
39
59
|
/** Locate the project's target dir without building it. */
|
|
40
|
-
export function targetDirFor(configPath: string) {
|
|
41
|
-
return join(dirname(configPath), ".livemark",
|
|
60
|
+
export function targetDirFor(configPath: string, command: TargetCommand = "serve") {
|
|
61
|
+
return join(dirname(configPath), ".livemark", `.${command}`)
|
|
42
62
|
}
|
|
43
63
|
|
|
44
64
|
function isPackageFile(src: string) {
|
|
@@ -14,7 +14,7 @@ describe("buildTarget", () => {
|
|
|
14
14
|
|
|
15
15
|
const targetDir = buildTarget({ configPath, sourceDir })
|
|
16
16
|
|
|
17
|
-
expect(targetDir).toBe(join(root, "project/.livemark/.
|
|
17
|
+
expect(targetDir).toBe(join(root, "project/.livemark/.serve"))
|
|
18
18
|
expect(read(targetDir, "components/Footer.tsx")).toBe("escaped")
|
|
19
19
|
expect(read(targetDir, "components/Header.tsx")).toBe("default")
|
|
20
20
|
expect(read(targetDir, "head.ts")).toBe("escaped head")
|
|
@@ -22,6 +22,29 @@ describe("buildTarget", () => {
|
|
|
22
22
|
expect(existsSync(join(targetDir, "helpers/util.unit.ts"))).toBe(false)
|
|
23
23
|
}))
|
|
24
24
|
|
|
25
|
+
it("mounts a production build apart from the dev server's target", () =>
|
|
26
|
+
temporaryDirectoryTask(async root => {
|
|
27
|
+
const { configPath, sourceDir } = await createFixture(root)
|
|
28
|
+
|
|
29
|
+
const targetDir = buildTarget({ configPath, sourceDir, command: "build" })
|
|
30
|
+
|
|
31
|
+
expect(targetDir).toBe(join(root, "project/.livemark/.build"))
|
|
32
|
+
expect(read(targetDir, "routes/index.tsx")).toBe("index")
|
|
33
|
+
expect(existsSync(targetDirFor(configPath))).toBe(false)
|
|
34
|
+
}))
|
|
35
|
+
|
|
36
|
+
it("ignores itself in git and removes the legacy .target mount", () =>
|
|
37
|
+
temporaryDirectoryTask(async root => {
|
|
38
|
+
const { configPath, sourceDir } = await createFixture(root)
|
|
39
|
+
const legacyDir = join(root, "project/.livemark/.target")
|
|
40
|
+
await put(join(legacyDir, "routes/index.tsx"), "stale")
|
|
41
|
+
|
|
42
|
+
const targetDir = buildTarget({ configPath, sourceDir })
|
|
43
|
+
|
|
44
|
+
expect(read(targetDir, ".gitignore")).toBe("*\n")
|
|
45
|
+
expect(existsSync(legacyDir)).toBe(false)
|
|
46
|
+
}))
|
|
47
|
+
|
|
25
48
|
it("drops escapes removed since the last run", () =>
|
|
26
49
|
temporaryDirectoryTask(async root => {
|
|
27
50
|
const { configPath, sourceDir } = await createFixture(root)
|