sonamu 0.7.12 → 0.7.13
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/dist/api/config.d.ts +0 -3
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +14 -4
- package/dist/bin/cli.js +2 -58
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +3 -2
- package/dist/syncer/syncer.d.ts +2 -1
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +17 -18
- package/dist/types/types.d.ts +1 -1
- package/dist/ui/ai-api.d.ts +1 -0
- package/dist/ui/ai-api.d.ts.map +1 -0
- package/dist/ui/ai-api.js +50 -0
- package/dist/ui/ai-client.d.ts +1 -0
- package/dist/ui/ai-client.d.ts.map +1 -0
- package/dist/ui/ai-client.js +438 -0
- package/dist/ui/api.d.ts +3 -0
- package/dist/ui/api.d.ts.map +1 -0
- package/dist/ui/api.js +680 -0
- package/dist/ui-web/assets/brand-icons-Cu_C0hZ4.svg +1008 -0
- package/dist/ui-web/assets/brand-icons-F3SPCeH1.woff +0 -0
- package/dist/ui-web/assets/brand-icons-XL9sxUpA.woff2 +0 -0
- package/dist/ui-web/assets/brand-icons-sqJ2Pg7a.eot +0 -0
- package/dist/ui-web/assets/brand-icons-ubhWoxly.ttf +0 -0
- package/dist/ui-web/assets/flags-DOLqOU7Y.png +0 -0
- package/dist/ui-web/assets/icons-BOCtAERH.woff +0 -0
- package/dist/ui-web/assets/icons-CHzK1VD9.eot +0 -0
- package/dist/ui-web/assets/icons-D29ZQHHw.ttf +0 -0
- package/dist/ui-web/assets/icons-Du6TOHnR.woff2 +0 -0
- package/dist/ui-web/assets/icons-RwhydX30.svg +1518 -0
- package/dist/ui-web/assets/index-CpaB9P6g.css +1 -0
- package/dist/ui-web/assets/index-J9MCfjCd.js +95 -0
- package/dist/ui-web/assets/outline-icons-BfdLr8tr.svg +366 -0
- package/dist/ui-web/assets/outline-icons-DD8jm0uy.ttf +0 -0
- package/dist/ui-web/assets/outline-icons-DInHoiqI.woff2 +0 -0
- package/dist/ui-web/assets/outline-icons-LX8adJ4n.eot +0 -0
- package/dist/ui-web/assets/outline-icons-aQ88nltS.woff +0 -0
- package/dist/ui-web/assets/provider-utils_false-BKJD46kk.js +1 -0
- package/dist/ui-web/assets/provider-utils_false-Bu5lmX18.js +1 -0
- package/dist/ui-web/index.html +13 -0
- package/dist/ui-web/vite.svg +1 -0
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +7 -7
- package/package.json +7 -5
- package/src/api/config.ts +0 -3
- package/src/api/sonamu.ts +17 -4
- package/src/bin/cli.ts +1 -67
- package/src/syncer/api-parser.ts +2 -1
- package/src/syncer/syncer.ts +20 -21
- package/src/ui/ai-api.ts +60 -0
- package/src/ui/ai-client.ts +499 -0
- package/src/ui/api.ts +786 -0
- package/src/vector/embedding.ts +8 -6
package/dist/syncer/syncer.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { hot } from "@sonamu-kit/hmr-hook";
|
|
2
2
|
import assert from "assert";
|
|
3
3
|
import chalk from "chalk";
|
|
4
|
+
import { EventEmitter } from "events";
|
|
4
5
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
5
6
|
import inflection from "inflection";
|
|
6
7
|
import { minimatch } from "minimatch";
|
|
@@ -28,6 +29,7 @@ export class Syncer {
|
|
|
28
29
|
models = {};
|
|
29
30
|
workflows = new Map();
|
|
30
31
|
isSyncing = false;
|
|
32
|
+
eventEmitter = new EventEmitter();
|
|
31
33
|
/**
|
|
32
34
|
* 체크섬이 변경된 부분에 대해 싱크를 진행합니다.
|
|
33
35
|
* 다만 sonamu.shared.ts는 체크섬 비교 없이 무조건 싱크(복사)합니다.
|
|
@@ -72,14 +74,19 @@ export class Syncer {
|
|
|
72
74
|
if (invalidatedPaths.length > 0) {
|
|
73
75
|
console.log(chalk.bold(`🔄 Invalidated:`));
|
|
74
76
|
for (const invalidatedPath of invalidatedPaths){
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
try {
|
|
78
|
+
// 만약 model.ts 파일이 변경(invalidate)되었다? 그러면 registeredApis 중에서 이 모델에 해당하는 api들은 지워줘요.
|
|
79
|
+
// registeredApis는 통으로 다 날려버릴 수 없습니다. registeredApis에 올라오는 친구들은 초기 로드시 또는 HMR시에만 등록되기 때문입니다.
|
|
80
|
+
// 따라서 model.ts 파일의 변경으로 다음번 새로운 eval이 예상되는 이 시점에서만, 이 모델에서 나온 registeredApis들을 지워줄 수 있습니다.
|
|
81
|
+
const removedApis = this.removeInvalidatedRegisteredApis(invalidatedPath);
|
|
82
|
+
if (removedApis.length > 0) {
|
|
83
|
+
console.log(chalk.blue(`- ${path.relative(Sonamu.apiRootPath, invalidatedPath)}`), chalk.gray(`(with ${removedApis.length} APIs)`));
|
|
84
|
+
} else {
|
|
85
|
+
console.log(chalk.blue(`- ${path.relative(Sonamu.apiRootPath, invalidatedPath)}`));
|
|
86
|
+
}
|
|
87
|
+
} catch (e) {
|
|
88
|
+
console.error(e);
|
|
89
|
+
console.error(chalk.red(`Failed to remove invalidated registered APIs for ${invalidatedPath}`));
|
|
83
90
|
}
|
|
84
91
|
}
|
|
85
92
|
}
|
|
@@ -97,7 +104,7 @@ export class Syncer {
|
|
|
97
104
|
await this.autoloadModels();
|
|
98
105
|
await this.autoloadApis();
|
|
99
106
|
await this.autoloadWorkflows();
|
|
100
|
-
this.
|
|
107
|
+
this.eventEmitter.emit("onHMRCompleted");
|
|
101
108
|
}
|
|
102
109
|
removeInvalidatedRegisteredApis(invalidatedPath) {
|
|
103
110
|
if (!invalidatedPath.endsWith(".model.ts" /*소스 코드를 다루는 상황이니 .ts 경로로 봅니다.*/ )) {
|
|
@@ -407,14 +414,6 @@ export class Syncer {
|
|
|
407
414
|
return result;
|
|
408
415
|
}, {});
|
|
409
416
|
}
|
|
410
|
-
syncUI() {
|
|
411
|
-
const uiPort = Sonamu.config.ui?.port ?? 57000;
|
|
412
|
-
if (!isTest()) {
|
|
413
|
-
fetch(`http://127.0.0.1:${uiPort}/api/reload`, {
|
|
414
|
-
method: "GET"
|
|
415
|
-
}).catch((e)=>console.log(chalk.dim(`Failed to reload Sonamu UI: ${e.message}`)));
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
417
|
/**
|
|
419
418
|
* 하위호환용 프록시 메소드입니다.
|
|
420
419
|
*/ async createEntity(form) {
|
|
@@ -442,4 +441,4 @@ export class Syncer {
|
|
|
442
441
|
}
|
|
443
442
|
}
|
|
444
443
|
|
|
445
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGFyZUZpbGVzU2FtZSwgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLCByZW5ld0NoZWNrc3VtcyB9IGZyb20gXCIuL2NoZWNrc3VtXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlLCByZW5kZXJUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHksIGRlbEVudGl0eSB9IGZyb20gXCIuL2VudGl0eS1vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlLCBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBMb2FkZWRBcGlzLFxuICB0eXBlIExvYWRlZE1vZGVscyxcbiAgdHlwZSBMb2FkZWRUeXBlcyxcbiAgbG9hZEFwaXMsXG4gIGxvYWRNb2RlbHMsXG4gIGxvYWRUeXBlcyxcbiAgbG9hZFdvcmtmbG93cyxcbn0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICB3b3JrZmxvd3M6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT4gPSBuZXcgTWFwKCk7XG4gIGlzU3luY2luZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiDssrTtgazshKzsnbQg67OA6rK965CcIOu2gOu2hOyXkCDrjIDtlbQg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICog64uk66eMIHNvbmFtdS5zaGFyZWQudHPripQg7LK07YGs7ISsIOu5hOq1kCDsl4bsnbQg66y07KGw6rG0IOyLse2BrCjrs7Xsgqwp7ZWp64uI64ukLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcblxuICAgIC8vIHNvbmFtdS5zaGFyZWQudHPripQg66y07KGw6rG0IOyLse2BrCjrs7Xsgqwp7ZWp64uI64ukLlxuICAgIGF3YWl0IHRoaXMuY29weVNoYXJlZFRvVGFyZ2V0cyh0YXJnZXRzKTtcblxuICAgIC8vIOq3uCDri6TsnYzrtoDthLDripQg67OA6rK965CcIO2MjOydvOydhCDssL7slYTshJwg64+Z6riw7ZmUIOyekeyXheydhCDsi6Ttlontlanri4jri6QuXG4gICAgY29uc3QgY2hhbmdlZEZpbGVzID0gYXdhaXQgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zKCk7XG4gICAgaWYgKGNoYW5nZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChcIkFsbCBmaWxlcyBhcmUgc3luY2VkIVwiKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOunjOyVvSDsi7Htgawg7KSR7JeQIO2UhOuhnOyEuOyKpOqwgCDso73snLzrqbQg6rys7Jes67KE66as6riwIOuVjOusuOyXkCxcbiAgICAvLyDsi5zqt7jrhJDsl5Drj4Qg7J6g7IucIOuyhO2LuCDsiJgg7J6I64qUIO2ZmOqyvSDsho3sl5DshJwg7Iux7YGs66W8IOyLpO2Wie2VqeuLiOuLpC5cbiAgICBhd2FpdCBydW5XaXRoR3JhY2VmdWxTaHV0ZG93bihcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8g7JaY6rCAIOyLse2BrCDsnpHsl4Ug7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKGNoYW5nZWRGaWxlcyk7XG5cbiAgICAgICAgLy8g7Iux7YGsIOyVoeyFmOydtCDrgZ3rgpjrqbQg7ZWt7IOBIOyytO2BrOyErOydhCDri6Tsi5wg6rCx7Iug7ZWp64uI64ukLlxuICAgICAgICBhd2FpdCByZW5ld0NoZWNrc3VtcygpO1xuICAgICAgfSxcbiAgICAgIHsgd2hlblRoaXNIYXBwZW5zOiBcIlNJR1VTUjJcIiwgd2FpdEZvclVwVG86IDIwMDAwIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaGVy6rCAIOqwkOyngO2VnCDtjIzsnbwg67OA6rK9IOyCrO2VreyXkCDrjIDtlbQg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICog7KO87Ja07KeEIOuzgOqyvSDtjIzsnbzrk6Qg7KSRIOyytO2BrOyErCDqtIDrpqwg64yA7IOB7J24IOqyg+uTpOunjCDqsIDsoLjri6TqsIAg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICog7LK07YGs7ISsIO2MjOydvCDsl4XrjbDsnbTtirjripQg7Jes6riw7JeQ7IScIO2VmOyngCDslYrsirXri4jri6QuIO2YuOy2nOyekOqwgCDtlanri4jri6QuXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGggLSDrs4Dqsr0g7YyM7J2865OkLiDtlITroZzsoJ3tirgg66Oo7Yq467aA7YSwIFwic3JjL1wiIOuYkOuKlCBcImRpc3QvXCLroZwg7Iuc7J6R7ZWY64qUIOyDgeuMgCDqsr3roZzsnoXri4jri6QuIOyYiOyLnDogXCJzcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAgICovXG4gIGFzeW5jIHN5bmNGcm9tV2F0Y2hlcihldmVudDogc3RyaW5nLCBkaWZmRmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChldmVudCAhPT0gXCJjaGFuZ2VcIiAmJiBldmVudCAhPT0gXCJhZGRcIiAmJiBldmVudCAhPT0gXCJ1bmxpbmtcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOydvOuLqCDrs4Dqsr3rkJwg7YyM7J286rO8IGRlcGVuZGVudCDtjIzsnbzrk6TsnYQgaW52YWxpZGF0ZSDtlanri4jri6QuXG4gICAgLy8g7ZWcIOuyiCDsnbTsg4EgaW1wb3J065CcIOy5nOq1rOuTpOyXkCDrjIDtlbTshJzrp4wg7Iuk7KCcIOyekeyXheydtCDsnbzslrTrgqnri4jri6QuXG4gICAgLy8g6re465+s64uIIOyViOyLrO2VmOqzoCBpbnZhbGlkYXRlIO2VtOuPhCDrkKnri4jri6QuXG4gICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOuKlCBob3QuaW52YWxpZGF0ZUZpbGXsi5wg7LSI6riwIOyXkOufrOqwgCDrsJzsg53tlZjquLAg65WM66y47JeQIGludmFsaWRhdGUg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICBjb25zdCBpbnZhbGlkYXRlZFBhdGhzID0gKGF3YWl0IGhvdC5pbnZhbGlkYXRlRmlsZShkaWZmRmlsZVBhdGgsIGV2ZW50KSkgYXMgQWJzb2x1dGVQYXRoW107XG5cbiAgICAgIGlmIChpbnZhbGlkYXRlZFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChg8J+UhCBJbnZhbGlkYXRlZDpgKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBpbnZhbGlkYXRlZFBhdGggb2YgaW52YWxpZGF0ZWRQYXRocykge1xuICAgICAgICAgIC8vIOunjOyVvSBtb2RlbC50cyDtjIzsnbzsnbQg67OA6rK9KGludmFsaWRhdGUp65CY7JeI64ukPyDqt7jrn6zrqbQgcmVnaXN0ZXJlZEFwaXMg7KSR7JeQ7IScIOydtCDrqqjrjbjsl5Ag7ZW064u57ZWY64qUIGFwaeuTpOydgCDsp4Dsm4zspJjsmpQuXG4gICAgICAgICAgLy8gcmVnaXN0ZXJlZEFwaXPripQg7Ya17Jy866GcIOuLpCDrgqDroKTrsoTrprQg7IiYIOyXhuyKteuLiOuLpC4gcmVnaXN0ZXJlZEFwaXPsl5Ag7Jis65287Jik64qUIOy5nOq1rOuTpOydgCDstIjquLAg66Gc65Oc7IucIOuYkOuKlCBITVLsi5zsl5Drp4wg65Ox66Gd65CY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICAgICAgICAvLyDrlLDrnbzshJwgbW9kZWwudHMg7YyM7J287J2YIOuzgOqyveycvOuhnCDri6TsnYzrsogg7IOI66Gc7Jq0IGV2YWzsnbQg7JiI7IOB65CY64qUIOydtCDsi5zsoJDsl5DshJzrp4wsIOydtCDrqqjrjbjsl5DshJwg64KY7JioIHJlZ2lzdGVyZWRBcGlz65Ok7J2EIOyngOybjOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAgIGNvbnN0IHJlbW92ZWRBcGlzID0gdGhpcy5yZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKGludmFsaWRhdGVkUGF0aCk7XG4gICAgICAgICAgaWYgKHJlbW92ZWRBcGlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCksXG4gICAgICAgICAgICAgIGNoYWxrLmdyYXkoYCh3aXRoICR7cmVtb3ZlZEFwaXMubGVuZ3RofSBBUElzKWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc0luQ2hlY2tQYXR0ZXJuR3JvdXAgPSBPYmplY3QudmFsdWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkuc29tZShcbiAgICAgIChwYXR0ZXJuKSA9PiBtaW5pbWF0Y2goZGlmZkZpbGVQYXRoLCBwYXR0ZXJuKSxcbiAgICApO1xuXG4gICAgLy8g7ZWgIOydvChzeW5jKeydtCDsnojsnLzrqbQg7ZWp64uI64ukLlxuICAgIGlmIChpc0luQ2hlY2tQYXR0ZXJuR3JvdXApIHtcbiAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhbZGlmZkZpbGVQYXRoXSk7XG4gICAgfVxuXG4gICAgLy8g7Iux7YGsIOyekeyXheydtCDrgZ3rgpjrqbQg66qo65OgIOuqqOuTiOydhCDroZzrk5ztlanri4jri6QuXG4gICAgLy8gaG1yLWhvb2vsl5Ag7J2Y7ZW0IGludmFsaWRhdGXrkJwg67aA67aE65Ok7J20IOyVhOuLiOudvOuptCDsupDsi5wg6re464yA66GcIOycoOyngO2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG5cbiAgICB0aGlzLnN5bmNVSSgpO1xuICB9XG5cbiAgcmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhcbiAgICBpbnZhbGlkYXRlZFBhdGg6IEFic29sdXRlUGF0aCxcbiAgKTogKHR5cGVvZiByZWdpc3RlcmVkQXBpcylbbnVtYmVyXVtdIHtcbiAgICBpZiAoIWludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiIC8q7IaM7IqkIOy9lOuTnOulvCDri6Tro6jripQg7IOB7Zmp7J2064uIIC50cyDqsr3roZzroZwg67SF64uI64ukLiovKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGludmFsaWRhdGVkUGF0aCk7XG4gICAgY29uc3QgdG9SZW1vdmUgPSByZWdpc3RlcmVkQXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gYCR7ZW50aXR5SWR9TW9kZWxgKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiB0b1JlbW92ZSkge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMuc3BsaWNlKHJlZ2lzdGVyZWRBcGlzLmluZGV4T2YoYXBpKSwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvUmVtb3ZlO1xuICB9XG5cbiAgYXN5bmMgY29weVNoYXJlZFRvVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIC8vIOyngOq4iCDqsIDsoLjqsIDroKTripQg7J20IO2MjOydvOydgCBTb25hbXUg7L2U65Oc67Kg7J207Iqk7J2YIOydvOu2gOyeheuLiOuLpC5cbiAgICAgIC8vIOq3uOufsOuNsCBkaXN0IOyGjSDruYzrk5zrkJwg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnbQg7ZWE7JqU7ZWcIOqyg+ydtCDslYTri4jqs6AsIHNyY+yXkOunjCDsnojripQg7YWN7Iqk7Yq4IO2MjOydvOydtCDtlYTsmpTtlanri4jri6QuXG4gICAgICAvLyDrlLDrnbzshJwgL3NyYy/sl5DshJwg7LC+7Iq164uI64ukLlxuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICAgIGAuLi9zaGFyZWQvJHt0YXJnZXR9LnNoYXJlZC50cy50eHRgLFxuICAgICAgKTtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNQYXRoKSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0KSkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVHJpZWQgdG8gY29weSBzb25hbXUuc2hhcmVkLnRzIHRvIHRhcmdldCAnJHt0YXJnZXR9JyBidXQgdGhlIHRhcmdldCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBjaGVjayB5b3VyIHByb2plY3QgZGlyZWN0b3J5IHN0cnVjdHVyZS5gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyDsnbTqsbQg7ZSE66Gc7KCd7Yq47JeQIC50cyDshozsiqQg7L2U65OcIO2MjOydvOydhCDsg53shLHtlZjripQg6rKD7J2066+A66GcIHNyY+ydmCAudHMg6rK966Gc66GcIOqwkeuLiOuLpC5cbiAgICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcInNyYy9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkLnRzXCIpO1xuXG4gICAgICAvLyDsoJXrp5Ag7Zi57Iuc64KY7KeA66eMIHRhcmdldCDrlJTroInthqDrpqzripQg7J6I7Ja064+EIHNyYy9zZXJ2aWNlcyDrlJTroInthqDrpqzripQg7JeG7J2EIOyImCDsnojsnLzrr4DroZwg66+466asIOyDneyEse2VtOykjeuLiOuLpC5cbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmRpcm5hbWUoZGVzdFBhdGgpKSkpIHtcbiAgICAgICAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ3JlYXRlZCBkaXJlY3RvcnkgJyR7cGF0aC5kaXJuYW1lKGRlc3RQYXRoKX0nIGJlY2F1c2UgaXQgZGlkIG5vdCBleGlzdC5gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGFyZUZpbGVzU2FtZShzcmNQYXRoLCBkZXN0UGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShkZXN0UGF0aCwgYXdhaXQgcmVhZEZpbGUoc3JjUGF0aCkpO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZGVzdFBhdGgpKSxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFR5cGVzKCkge1xuICAgIHRoaXMudHlwZXMgPSBhd2FpdCBsb2FkVHlwZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkTW9kZWxzKCkge1xuICAgIHRoaXMubW9kZWxzID0gYXdhaXQgbG9hZE1vZGVscygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRBcGlzKCkge1xuICAgIHRoaXMuYXBpcyA9IGF3YWl0IGxvYWRBcGlzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFdvcmtmbG93cygpIHtcbiAgICB0aGlzLndvcmtmbG93cyA9IGF3YWl0IGxvYWRXb3JrZmxvd3MoKTtcbiAgICBhd2FpdCBTb25hbXUud29ya2Zsb3dzLnN5bmNocm9uaXplKHRoaXMud29ya2Zsb3dzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsi6TsoJwg7Iux7YGs66W8IOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAqIOuzgOqyveuQnCDtjIzsnbzrk6TsnYQg7YOA7J6F67OE66GcIOu2hOulmO2VmOqzoCDqsIEg7YOA7J6F7JeQIOunnuuKlCDslaHshZjsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRocyAtIOuzgOqyveuQnCDtjIzsnbzrk6TsnZgg7KCI64yAIOqyveuhnCDrqqnroZ1cbiAgICogQHJldHVybnMgZGlmZlR5cGVzIC0g67OA6rK965CcIO2MjOydvOydmCDtg4DsnoUg66qp66GdIChlbnRpdHksIHR5cGVzLCBtb2RlbCDrk7EpXG4gICAqL1xuICBhc3luYyBkb1N5bmNBY3Rpb25zKGRpZmZGaWxlUGF0aHM6IEFic29sdXRlUGF0aFtdKTogUHJvbWlzZTx7IGRpZmZUeXBlczogc3RyaW5nW10gfT4ge1xuICAgIGNvbnN0IGRpZmZHcm91cHMgPSB0aGlzLmNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVQYXRocyk7XG4gICAgY29uc3QgZGlmZlR5cGVzID0gT2JqZWN0LmtleXMoZGlmZkdyb3Vwcyk7XG5cbiAgICAvLyDtirjrpqzqsbA6IGVudGl0eSwgdHlwZXNcbiAgICAvLyDslaHshZg6IOyKpO2CpOuniCDsg53shLFcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwiZW50aXR5XCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUVudGl0eUNoYW5nZShkaWZmR3JvdXBzLCBkaWZmVHlwZXMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogdHlwZXMsIGVudW1zLCBnZW5lcmF0ZWQg67OA6rK97IucXG4gICAgLy8g7JWh7IWYOiDtjIzsnbwg7Iux7YGsIHR5cGVzLCBlbnVtcywgZ2VuZXJhdGVkXG4gICAgaWYgKFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwidHlwZXNcIikgfHxcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImZ1bmN0aW9uc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZ2VuZXJhdGVkXCIpXG4gICAgKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZShkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IG1vZGVsXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcIm1vZGVsXCIpIHx8IGRpZmZUeXBlcy5pbmNsdWRlcyhcImZyYW1lXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZShkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IGNvbmZpZ1xuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJjb25maWdcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWN0aW9uU3luY0NvbmZpZygpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogd29ya2Zsb3dcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwid29ya2Zsb3dcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pOiBEaWZmR3JvdXBzIHtcbiAgICByZXR1cm4gZ3JvdXAoZGlmZkZpbGVzLCAocikgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IHIubWF0Y2goL1xcLihtb2RlbHx0eXBlc3xmdW5jdGlvbnN8ZW50aXR5fGdlbmVyYXRlZHxmcmFtZXxjb25maWcpXFwuW3RqXXMvKTtcbiAgICAgIHJldHVybiBtYXRjaGVkPy5bMV0gPz8gXCJ1bmtub3duXCI7XG4gICAgfSkgYXMgdW5rbm93biBhcyBEaWZmR3JvdXBzO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlRW50aXR5Q2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMsIGRpZmZUeXBlczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlRW50aXR5Q2hhbmdlXCIsIHsgZGlmZkdyb3VwcywgZGlmZlR5cGVzIH0pO1xuXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWxvYWQoKTtcblxuICAgIC8vIHR5cGVzIOyDneyEsShlbnRpdHkg7IOI66GcIOy2lOqwgOuQnCDqsr3smrApXG4gICAgLy8gcGFyZW50SWTqsIAg7JeG6rOgLCB0eXBlc+qwgCDsl4bripQg6rK97Jqw7JeQ66eMIOyDneyEsVxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGRpZmZHcm91cHMuZW50aXR5Py5bMF0pO1xuXG4gICAgaWYgKGVudGl0eUlkKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAvLyDtlITroZzsoJ3tirjsl5Ag7IOd7ISx65CY7Ja07JW8IO2VmOuKlCAudHMg7YyM7J287J2YIOqyveuhnOyeheuLiOuLpC5cbiAgICAgIGNvbnN0IHR5cGVGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICBgc3JjL2FwcGxpY2F0aW9uLyR7ZW50aXR5Lm5hbWVzLmZzfS8ke2VudGl0eS5uYW1lcy5mc30udHlwZXMudHNgLFxuICAgICAgKTtcbiAgICAgIGlmIChlbnRpdHkucGFyZW50SWQgPT09IHVuZGVmaW5lZCAmJiAhKGF3YWl0IGV4aXN0cyh0eXBlRmlsZVBhdGgpKSkge1xuICAgICAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiaW5pdF90eXBlc1wiLCB7IGVudGl0eUlkIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk7XG5cbiAgICBkaWZmR3JvdXBzLmdlbmVyYXRlZCA9IHVuaXF1ZShbXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmMvYXBwbGljYXRpb24vc29uYW11LmdlbmVyYXRlZC50c1wiKSBhcyBBYnNvbHV0ZVBhdGgsXG4gICAgXSk7XG4gICAgZGlmZlR5cGVzLnB1c2goXCJnZW5lcmF0ZWRcIik7XG4gIH1cblxuICBhc3luYyBoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2UoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8RmlsZVR5cGVbXT4ge1xuICAgIGNvbnN0IHRzUGF0aHMgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMudHlwZXMgPz8gW10pLFxuICAgICAgLi4uKGRpZmZHcm91cHMuZnVuY3Rpb25zID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmdlbmVyYXRlZCA/PyBbXSksXG4gICAgXSk7XG4gICAgTmFpdGUudChcImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZVwiLCB7IGRpZmZHcm91cHMgfSk7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGNoYWxrLmdyYXkoXG4gICAgLy8gICAgIGBbUHJvY2Vzc2luZ10gSGFuZGxpbmcgdHlwZXMvZnVuY3Rpb25zL2dlbmVyYXRlZCBjaGFuZ2VzOiAke3RzUGF0aHMubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIGF3YWl0IHRoaXMuYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHMpO1xuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlXCIsIHsgZGlmZkdyb3VwcyB9KTtcbiAgICBjb25zdCBtZXJnZWRHcm91cCA9IFsuLi4oZGlmZkdyb3Vwcy5tb2RlbCA/PyBbXSksIC4uLihkaWZmR3JvdXBzLmZyYW1lID8/IFtdKV07XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGNoYWxrLmdyYXkoXG4gICAgLy8gICAgIGBbUHJvY2Vzc2luZ10gSGFuZGxpbmcgbW9kZWwvZnJhbWUgY2hhbmdlczogJHttZXJnZWRHcm91cC5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBwKSkuam9pbihcIiwgXCIpfWBcbiAgICAvLyAgIClcbiAgICAvLyApO1xuXG4gICAgLy8gZ2VuZXJhdGVkX2h0dHAudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLnR5cGVz66W8IOyUgeuLiOuLpC5cbiAgICAvLyBzZXJ2aWNlLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci5hcGlz66W8IOyUgeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcblxuICAgIGNvbnN0IHBhcmFtczoge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSA9IG1lcmdlZEdyb3VwLm1hcCgobW9kZWxQYXRoKSA9PiB7XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKG1vZGVsUGF0aCk7XG4gICAgICAgIGFzc2VydChlbnRpdHlJZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5mcmFtZS50c1wiKSkge1xuICAgICAgICBjb25zdCBbLCBmcmFtZU5hbWVdID0gbW9kZWxQYXRoLm1hdGNoKC8uK1xcLyguKylcXC5mcmFtZVxcLnRzJC8pID8/IFtdO1xuICAgICAgICBhc3NlcnQoZnJhbWVOYW1lKTtcbiAgICAgICAgLy8gZnJhbWVOYW1l7J2EIFBhc2NhbENhc2XroZwg67OA7ZmYIChkYXNoYm9hcmQgLT4gRGFzaGJvYXJkKVxuICAgICAgICBjb25zdCBmcmFtZUlkID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShmcmFtZU5hbWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGZyYW1lSWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IHJlYWNoYWJsZVwiKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyhwYXJhbXMpO1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uR2VuZXJhdGVIdHRwcygpO1xuICB9XG5cbiAgLy8gd2ViLy5zb25hbXUuZW52IOyXkCDtmITsnqwg7ISk7KCV6rCSIOyggOyepVxuICBhc3luYyBhY3Rpb25TeW5jQ29uZmlnKCkge1xuICAgIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gU29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuID8/IHt9O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBgQVBJX0hPU1Q9JHtob3N0ID8/IFwibG9jYWxob3N0XCJ9XFxuQVBJX1BPUlQ9JHtwb3J0ID8/IDMwMDB9YDtcblxuICAgIE5haXRlLnQoXCJhY3Rpb25TeW5jQ29uZmlnXCIsIHsgY29udGVudCB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFNvbmFtdS5jb25maWcuc3luYy50YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwiLnNvbmFtdS5lbnZcIiksIGNvbnRlbnQpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUuZ2VuZXJhdGVkLnRz7JmAIHNvbmFtdS5nZW5lcmF0ZWQuc3NvLnRz66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkX3Nzb1wiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRcIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgICAgXSlcbiAgICApXG4gICAgICAuZmxhdCgpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqICouc2VydmljZS50c+ulvCDsg53shLHtlanri4jri6QuXG4gICAqIEBwYXJhbSBwYXJhbXNBcnJheVxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKFxuICAgIHBhcmFtc0FycmF5OiB7XG4gICAgICBuYW1lc1JlY29yZDogRW50aXR5TmFtZXNSZWNvcmQ7XG4gICAgfVtdLFxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgTmFpdGUudChcImFjdGlvbkdlbmVyYXRlU2VydmljZXNcIiwgcGFyYW1zQXJyYXkpO1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcGFyYW1zQXJyYXkubWFwKGFzeW5jIChwYXJhbXMpID0+XG4gICAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcInNlcnZpY2VcIiwgcGFyYW1zIGFzIFRlbXBsYXRlT3B0aW9uc1tcInNlcnZpY2VcIl0sIHtcbiAgICAgICAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICApXG4gICAgICAuZmxhdCgpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5nZW5lcmF0ZWQuaHR0cOulvCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcLlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVIdHRwcygpOiBQcm9taXNlPEFic29sdXRlUGF0aD4ge1xuICAgIGNvbnN0IFtyZXNdID0gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICAgIFwiZ2VuZXJhdGVkX2h0dHBcIixcbiAgICAgIHsgZW50aXR5SWQ6IFwiZHVtbXlcIiB9LFxuICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfSxcbiAgICApO1xuICAgIGFzc2VydChyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogKi50eXBlcy50cywgKi5mdW5jdGlvbnMudHMsICouZ2VuZXJhdGVkLnRz66W8IO2DgOqynyDrlJTroInthqDrpqzsl5Ag67O17IKs7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gdHNQYXRoc1xuICAgKiBAcmV0dXJucyDrs7XsgqzrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHNQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgY29uc3QgeyBkaXI6IGFwaURpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+XG4gICAgICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB0c1BhdGhzLm1hcChhc3luYyAocmVhbFNyYykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkc3QgPSByZWFsU3JjXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoYC8ke2FwaURpcn0vYCwgYC8ke3RhcmdldH0vYClcbiAgICAgICAgICAgICAgICAucmVwbGFjZShcIi9hcHBsaWNhdGlvbi9cIiwgXCIvc2VydmljZXMvXCIpO1xuICAgICAgICAgICAgICBjb25zdCBkaXIgPSBkaXJuYW1lKGRzdCk7XG4gICAgICAgICAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhkaXIpKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKGRzdC5yZXBsYWNlKGAke1NvbmFtdS5hcHBSb290UGF0aH0vYCwgXCJcIikpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChyZWFsU3JjLCBkc3QpO1xuICAgICAgICAgICAgICByZXR1cm4gZHN0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChmcm9tUGF0aDogc3RyaW5nLCB0b1BhdGg6IHN0cmluZykge1xuICAgIGlmICghKGF3YWl0IGV4aXN0cyhmcm9tUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkRmlsZUNvbnRlbnQgPSAoYXdhaXQgcmVhZEZpbGUoZnJvbVBhdGgpKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSAoKCkgPT4ge1xuICAgICAgLy8gd2Vi7J2064KYIGFwcCDrk7Hsl5DripQgc29uYW116rCAIOyXhuyKteuLiOuLpC5cbiAgICAgIC8vIOuUsOudvOyEnCBzb25hbXXsl5Ag64yA7ZWcIGltcG9ydOuKlCDtlajqu5gg67O17IKs65CY64qUIHNvbmFtdS5zaGFyZWQudHPsl5Ag64yA7ZWcIGltcG9ydOuhnCDsuZjtmZjtlbTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g66y47KCc64qUIOumrOyGjOyKpCDsooXrpZjsl5Ag65Sw6528IHNvbmFtdS5zaGFyZWQudHProZwg6rCA64qUIOqyveuhnOqwgCDri6TrpbTri6TripQg7KCQ7J6F64uI64ukLlxuICAgICAgLy8g7JiI66W8IOuTpOyWtCBzb25hbXUuZ2VuZXJhdGVkLnRzIOyeheyepeyXkOyEnCBzb25hbXUuc2hhcmVkLnRz64qUIOqwmeydgCDrlJTroInthqDrpqzsl5Ag7J6I7Jy864uIIC4vc29uYW11LnNoYXJlZOuhnCDsuZjtmZjtlZjrqbQg65CY7KeA66eMLFxuICAgICAgLy8gdXNlci50eXBlcy50cyDsnoXsnqXsl5DshJwgc29uYW11LnNoYXJlZC50c+uKlCDsg4HsnIQg65SU66CJ7Yag66as7JeQIOyeiOycvOuLiCAuLi9zb25hbXUuc2hhcmVk66GcIOy5mO2ZmO2VtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDsnbQg66y47KCc66W8IO2VtOqysO2VmOq4sCDsnITtlbQg67O17IKs7ZWY6rOg7J6QIO2VmOuKlCDrpqzshozsiqTsnZgg6rK966GcKHRvUGF0aCnrpbwg6riw7KSA7Jy866GcIHNvbmFtdS5zaGFyZWQudHPqsIAg7J6I64qUIOuUlOugie2GoOumrOulvCDssL7slYTshJwg7IOB64yAIOqyveuhnOulvCDqs4TsgrDtlZjrj4TroZ0g7ZWY7JiA7Iq164uI64ukLlxuICAgICAgY29uc3Qgc2VydmljZXNEaXIgPSB0b1BhdGgucmVwbGFjZSgvXFwvc2VydmljZXNcXC8uKiQvLCBcIi9zZXJ2aWNlc1wiKTtcbiAgICAgIGNvbnN0IGZpbGVEaXIgPSBkaXJuYW1lKHRvUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGZpbGVEaXIsIHNlcnZpY2VzRGlyKTtcbiAgICAgIGNvbnN0IHNoYXJlZFBhdGggPSByZWxhdGl2ZVBhdGggPT09IFwiXCIgPyBcIi4vc29uYW11LnNoYXJlZFwiIDogYCR7cmVsYXRpdmVQYXRofS9zb25hbXUuc2hhcmVkYDtcblxuICAgICAgY29uc3QgbmZjID0gb2xkRmlsZUNvbnRlbnQucmVwbGFjZSgvZnJvbSBcInNvbmFtdVwiL2csIGBmcm9tIFwiJHtzaGFyZWRQYXRofVwiYCk7XG4gICAgICByZXR1cm4gbmZjO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIHdyaXRlRmlsZSh0b1BhdGgsIG5ld0ZpbGVDb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIO2FnO2UjOumvyDtgqTsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIHRlbXBsYXRlS2V5IO2FnO2UjOumvyDtgqRcbiAgICogQHBhcmFtIGVudW1JZCDsl7TqsbDtmJUgSURcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0c0dlbkNvZGUoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICB0ZW1wbGF0ZUtleTogVGVtcGxhdGVLZXksXG4gICAgZW51bUlkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgc3ViUGF0aDogc3RyaW5nOyBmdWxsUGF0aDogc3RyaW5nOyBpc0V4aXN0czogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IGdlblBhdGggfSA9IFRlbXBsYXRlTWFuYWdlci5nZXQodGVtcGxhdGVLZXkpLmdldFRhcmdldEFuZFBhdGgoXG4gICAgICBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgIGVudW1JZCxcbiAgICApO1xuXG4gICAgY29uc3Qgc3ViUGF0aCA9IHBhdGguam9pbih0YXJnZXQsIGdlblBhdGgpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgc3ViUGF0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1YlBhdGgsXG4gICAgICBmdWxsUGF0aCxcbiAgICAgIGlzRXhpc3RzOiBhd2FpdCBleGlzdHMoZnVsbFBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDsl7TqsbDtmJXsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIGVudW1zIOyXtOqxsO2YlSDroIjsnbTruJRcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0cyhcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGVudW1zOiB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4+PjtcbiAgICB9LFxuICApOiBQcm9taXNlPFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPj4ge1xuICAgIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBUZW1wbGF0ZUtleS5vcHRpb25zO1xuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG4gICAgY29uc3QgZW51bXNLZXlzID0gT2JqZWN0LmtleXMoZW51bXMpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gbmFtZXMuY29uc3RhbnQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHJlZHVjZUFzeW5jKFxuICAgICAga2V5cyxcbiAgICAgIGFzeW5jIChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCB0cGwgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChcInZpZXdfZW51bXNcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyhlbnVtc0tleXMsIGFzeW5jIChjb21wb25lbnRJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzLCBjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHtjb21wb25lbnRJZH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQucmVwbGFjZShcIjp0YXJnZXRcIiwgdCksIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+LFxuICAgICk7XG4gIH1cblxuICBzeW5jVUkoKSB7XG4gICAgY29uc3QgdWlQb3J0ID0gU29uYW11LmNvbmZpZy51aT8ucG9ydCA/PyA1NzAwMDtcblxuICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgIGZldGNoKGBodHRwOi8vMTI3LjAuMC4xOiR7dWlQb3J0fS9hcGkvcmVsb2FkYCwge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB9KS5jYXRjaCgoZSkgPT4gY29uc29sZS5sb2coY2hhbGsuZGltKGBGYWlsZWQgdG8gcmVsb2FkIFNvbmFtdSBVSTogJHtlLm1lc3NhZ2V9YCkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRpdHkoZm9ybTogVGVtcGxhdGVPcHRpb25zW1wiZW50aXR5XCJdKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUVudGl0eShmb3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGRlbEVudGl0eShlbnRpdHlJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRlbFBhdGhzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGRlbEVudGl0eShlbnRpdHlJZCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlPFQgZXh0ZW5kcyBUZW1wbGF0ZUtleT4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICAgIF9nZW5lcmF0ZU9wdGlvbnM/OiBHZW5lcmF0ZU9wdGlvbnMsXG4gICk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucywgX2dlbmVyYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZTxUIGV4dGVuZHMga2V5b2YgVGVtcGxhdGVPcHRpb25zPihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICk6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICAgIHJldHVybiBhd2FpdCByZW5kZXJUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImhvdCIsImFzc2VydCIsImNoYWxrIiwibWtkaXIiLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsImluZmxlY3Rpb24iLCJtaW5pbWF0Y2giLCJwYXRoIiwiZGlybmFtZSIsImdyb3VwIiwidW5pcXVlIiwicmVnaXN0ZXJlZEFwaXMiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJUZW1wbGF0ZU1hbmFnZXIiLCJUZW1wbGF0ZUtleSIsIm1hcEFzeW5jIiwicmVkdWNlQXN5bmMiLCJjZW50ZXJUZXh0IiwiaXNUZXN0IiwiZXhpc3RzIiwicnVuV2l0aEdyYWNlZnVsU2h1dGRvd24iLCJhcmVGaWxlc1NhbWUiLCJmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMiLCJyZW5ld0NoZWNrc3VtcyIsImdlbmVyYXRlVGVtcGxhdGUiLCJyZW5kZXJUZW1wbGF0ZSIsImNyZWF0ZUVudGl0eSIsImRlbEVudGl0eSIsImdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgiLCJsb2FkQXBpcyIsImxvYWRNb2RlbHMiLCJsb2FkVHlwZXMiLCJsb2FkV29ya2Zsb3dzIiwiU3luY2VyIiwiYXBpcyIsInR5cGVzIiwibW9kZWxzIiwid29ya2Zsb3dzIiwiTWFwIiwiaXNTeW5jaW5nIiwic3luYyIsInRhcmdldHMiLCJjb25maWciLCJjb3B5U2hhcmVkVG9UYXJnZXRzIiwiY2hhbmdlZEZpbGVzIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsImJsYWNrIiwiYmdHcmVlbiIsImRvU3luY0FjdGlvbnMiLCJ3aGVuVGhpc0hhcHBlbnMiLCJ3YWl0Rm9yVXBUbyIsInN5bmNGcm9tV2F0Y2hlciIsImV2ZW50IiwiZGlmZkZpbGVQYXRoIiwiaW52YWxpZGF0ZWRQYXRocyIsImludmFsaWRhdGVGaWxlIiwiYm9sZCIsImludmFsaWRhdGVkUGF0aCIsInJlbW92ZWRBcGlzIiwicmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyIsImJsdWUiLCJyZWxhdGl2ZSIsImFwaVJvb3RQYXRoIiwiZ3JheSIsImlzSW5DaGVja1BhdHRlcm5Hcm91cCIsIk9iamVjdCIsInZhbHVlcyIsInNvbWUiLCJwYXR0ZXJuIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwiYXV0b2xvYWRXb3JrZmxvd3MiLCJzeW5jVUkiLCJlbmRzV2l0aCIsImVudGl0eUlkIiwiZ2V0RW50aXR5SWRGcm9tUGF0aCIsInRvUmVtb3ZlIiwiZmlsdGVyIiwiYXBpIiwibW9kZWxOYW1lIiwic3BsaWNlIiwiaW5kZXhPZiIsInRhcmdldCIsInNyY1BhdGgiLCJqb2luIiwicmVwbGFjZSIsImFwcFJvb3RQYXRoIiwiRXJyb3IiLCJkZXN0UGF0aCIsInJlY3Vyc2l2ZSIsIndhcm4iLCJzeW5jaHJvbml6ZSIsImRpZmZGaWxlUGF0aHMiLCJkaWZmR3JvdXBzIiwiY2FsY3VsYXRlRGlmZkdyb3VwcyIsImRpZmZUeXBlcyIsImtleXMiLCJpbmNsdWRlcyIsImhhbmRsZUVudGl0eUNoYW5nZSIsImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZSIsImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZSIsImFjdGlvblN5bmNDb25maWciLCJkaWZmRmlsZXMiLCJyIiwibWF0Y2hlZCIsIm1hdGNoIiwidCIsInJlbG9hZCIsImVudGl0eSIsImdldCIsInR5cGVGaWxlUGF0aCIsIm5hbWVzIiwiZnMiLCJwYXJlbnRJZCIsInVuZGVmaW5lZCIsImFjdGlvbkdlbmVyYXRlU2NoZW1hcyIsImdlbmVyYXRlZCIsInB1c2giLCJ0c1BhdGhzIiwiZnVuY3Rpb25zIiwiYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzIiwibWVyZ2VkR3JvdXAiLCJtb2RlbCIsImZyYW1lIiwicGFyYW1zIiwibWFwIiwibW9kZWxQYXRoIiwibmFtZXNSZWNvcmQiLCJnZXROYW1lc0Zyb21JZCIsImZyYW1lTmFtZSIsImZyYW1lSWQiLCJjYW1lbGl6ZSIsImFjdGlvbkdlbmVyYXRlU2VydmljZXMiLCJhY3Rpb25HZW5lcmF0ZUh0dHBzIiwiaG9zdCIsInBvcnQiLCJzZXJ2ZXIiLCJsaXN0ZW4iLCJjb250ZW50IiwiUHJvbWlzZSIsImFsbCIsIm92ZXJ3cml0ZSIsImZsYXQiLCJwYXJhbXNBcnJheSIsInJlcyIsImRpciIsImFwaURpciIsInJlYWxTcmMiLCJkc3QiLCJjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkIiwiZnJvbVBhdGgiLCJ0b1BhdGgiLCJvbGRGaWxlQ29udGVudCIsInRvU3RyaW5nIiwibmV3RmlsZUNvbnRlbnQiLCJzZXJ2aWNlc0RpciIsImZpbGVEaXIiLCJyZWxhdGl2ZVBhdGgiLCJzaGFyZWRQYXRoIiwibmZjIiwiY2hlY2tFeGlzdHNHZW5Db2RlIiwidGVtcGxhdGVLZXkiLCJlbnVtSWQiLCJnZW5QYXRoIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsInN1YlBhdGgiLCJmdWxsUGF0aCIsImlzRXhpc3RzIiwiY2hlY2tFeGlzdHMiLCJlbnVtcyIsIm9wdGlvbnMiLCJlbnVtc0tleXMiLCJuYW1lIiwiY29uc3RhbnQiLCJyZXN1bHQiLCJrZXkiLCJ0cGwiLCJzdGFydHNXaXRoIiwiY29tcG9uZW50SWQiLCJwIiwidWlQb3J0IiwidWkiLCJmZXRjaCIsIm1ldGhvZCIsImNhdGNoIiwiZSIsImRpbSIsIm1lc3NhZ2UiLCJmb3JtIiwidGVtcGxhdGVPcHRpb25zIiwiX2dlbmVyYXRlT3B0aW9ucyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsR0FBRyxRQUFRLHVCQUF1QjtBQUMzQyxPQUFPQyxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLEtBQUssRUFBRUMsUUFBUSxFQUFFQyxTQUFTLFFBQVEsbUJBQWM7QUFDekQsT0FBT0MsZ0JBQWdCLGFBQWE7QUFDcEMsU0FBU0MsU0FBUyxRQUFRLFlBQVk7QUFDdEMsT0FBT0MsUUFBUUMsT0FBTyxRQUFRLE9BQU87QUFDckMsU0FBU0MsS0FBSyxFQUFFQyxNQUFNLFFBQVEsVUFBVTtBQUd4QyxTQUFTQyxjQUFjLFFBQVEsdUJBQW9CO0FBQ25ELFNBQVNDLE1BQU0sUUFBUSxtQkFB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
|
|
444
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGFyZUZpbGVzU2FtZSwgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLCByZW5ld0NoZWNrc3VtcyB9IGZyb20gXCIuL2NoZWNrc3VtXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlLCByZW5kZXJUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHksIGRlbEVudGl0eSB9IGZyb20gXCIuL2VudGl0eS1vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlLCBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBMb2FkZWRBcGlzLFxuICB0eXBlIExvYWRlZE1vZGVscyxcbiAgdHlwZSBMb2FkZWRUeXBlcyxcbiAgbG9hZEFwaXMsXG4gIGxvYWRNb2RlbHMsXG4gIGxvYWRUeXBlcyxcbiAgbG9hZFdvcmtmbG93cyxcbn0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICB3b3JrZmxvd3M6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT4gPSBuZXcgTWFwKCk7XG4gIGlzU3luY2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOuLpOunjCBzb25hbXUuc2hhcmVkLnRz64qUIOyytO2BrOyErCDruYTqtZAg7JeG7J20IOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVkLnRz64qUIOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0cyk7XG5cbiAgICAvLyDqt7gg64uk7J2M67aA7YSw64qUIOuzgOqyveuQnCDtjIzsnbzsnYQg7LC+7JWE7IScIOuPmeq4sO2ZlCDsnpHsl4XsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IGF3YWl0IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpO1xuICAgIGlmIChjaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQoXCJBbGwgZmlsZXMgYXJlIHN5bmNlZCFcIikpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDrp4zslb0g7Iux7YGsIOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Jy866m0IOq8rOyXrOuyhOumrOq4sCDrlYzrrLjsl5AsXG4gICAgLy8g7Iuc6re464SQ7JeQ64+EIOyeoOyLnCDrsoTti7gg7IiYIOyeiOuKlCDtmZjqsr0g7IaN7JeQ7IScIOyLse2BrOulvCDsi6Ttlontlanri4jri6QuXG4gICAgYXdhaXQgcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOyWmOqwgCDsi7Htgawg7J6R7JeFIOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhjaGFuZ2VkRmlsZXMpO1xuXG4gICAgICAgIC8vIOyLse2BrCDslaHshZjsnbQg64Gd64KY66m0IO2VreyDgSDssrTtgazshKzsnYQg64uk7IucIOqwseyLoO2VqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH0sXG4gICAgICB7IHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsIHdhaXRGb3JVcFRvOiAyMDAwMCB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCDqsJDsp4DtlZwg7YyM7J28IOuzgOqyvSDsgqztla3sl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyjvOyWtOynhCDrs4Dqsr0g7YyM7J2865OkIOykkSDssrTtgazshKwg6rSA66asIOuMgOyDgeyduCDqsoPrk6Trp4wg6rCA7KC464uk6rCAIOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyytO2BrOyErCDtjIzsnbwg7JeF642w7J207Yq464qUIOyXrOq4sOyXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLiDtmLjstpzsnpDqsIAg7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRoIC0g67OA6rK9IO2MjOydvOuTpC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCBcInNyYy9cIiDrmJDripQgXCJkaXN0L1wi66GcIOyLnOyeke2VmOuKlCDsg4HrjIAg6rK966Gc7J6F64uI64ukLiDsmIjsi5w6IFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gICAqL1xuICBhc3luYyBzeW5jRnJvbVdhdGNoZXIoZXZlbnQ6IHN0cmluZywgZGlmZkZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIgJiYgZXZlbnQgIT09IFwidW5saW5rXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDsnbzri6gg67OA6rK965CcIO2MjOydvOqzvCBkZXBlbmRlbnQg7YyM7J2865Ok7J2EIGludmFsaWRhdGUg7ZWp64uI64ukLlxuICAgIC8vIO2VnCDrsogg7J207IOBIGltcG9ydOuQnCDsuZzqtazrk6Tsl5Ag64yA7ZW07ISc66eMIOyLpOygnCDsnpHsl4XsnbQg7J287Ja064Kp64uI64ukLlxuICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzripQgaG90LmludmFsaWRhdGVGaWxl7IucIOy0iOq4sCDsl5Drn6zqsIAg67Cc7IOd7ZWY6riwIOuVjOusuOyXkCBpbnZhbGlkYXRlIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9IChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCkpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gICAgICBpZiAoaW52YWxpZGF0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYPCflIQgSW52YWxpZGF0ZWQ6YCkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZWRQYXRoIG9mIGludmFsaWRhdGVkUGF0aHMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g66eM7JW9IG1vZGVsLnRzIO2MjOydvOydtCDrs4Dqsr0oaW52YWxpZGF0ZSnrkJjsl4jri6Q/IOq3uOufrOuptCByZWdpc3RlcmVkQXBpcyDspJHsl5DshJwg7J20IOuqqOuNuOyXkCDtlbTri7ntlZjripQgYXBp65Ok7J2AIOyngOybjOykmOyalC5cbiAgICAgICAgICAgIC8vIHJlZ2lzdGVyZWRBcGlz64qUIO2GteycvOuhnCDri6Qg64Kg66Ck67KE66a0IOyImCDsl4bsirXri4jri6QuIHJlZ2lzdGVyZWRBcGlz7JeQIOyYrOudvOyYpOuKlCDsuZzqtazrk6TsnYAg7LSI6riwIOuhnOuTnOyLnCDrmJDripQgSE1S7Iuc7JeQ66eMIOuTseuhneuQmOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgICAgICAgICAvLyDrlLDrnbzshJwgbW9kZWwudHMg7YyM7J287J2YIOuzgOqyveycvOuhnCDri6TsnYzrsogg7IOI66Gc7Jq0IGV2YWzsnbQg7JiI7IOB65CY64qUIOydtCDsi5zsoJDsl5DshJzrp4wsIOydtCDrqqjrjbjsl5DshJwg64KY7JioIHJlZ2lzdGVyZWRBcGlz65Ok7J2EIOyngOybjOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZEFwaXMgPSB0aGlzLnJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkQXBpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSxcbiAgICAgICAgICAgICAgICBjaGFsay5ncmF5KGAod2l0aCAke3JlbW92ZWRBcGlzLmxlbmd0aH0gQVBJcylgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGNoYWxrLnJlZChgRmFpbGVkIHRvIHJlbW92ZSBpbnZhbGlkYXRlZCByZWdpc3RlcmVkIEFQSXMgZm9yICR7aW52YWxpZGF0ZWRQYXRofWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc0luQ2hlY2tQYXR0ZXJuR3JvdXAgPSBPYmplY3QudmFsdWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkuc29tZShcbiAgICAgIChwYXR0ZXJuKSA9PiBtaW5pbWF0Y2goZGlmZkZpbGVQYXRoLCBwYXR0ZXJuKSxcbiAgICApO1xuXG4gICAgLy8g7ZWgIOydvChzeW5jKeydtCDsnojsnLzrqbQg7ZWp64uI64ukLlxuICAgIGlmIChpc0luQ2hlY2tQYXR0ZXJuR3JvdXApIHtcbiAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhbZGlmZkZpbGVQYXRoXSk7XG4gICAgfVxuXG4gICAgLy8g7Iux7YGsIOyekeyXheydtCDrgZ3rgpjrqbQg66qo65OgIOuqqOuTiOydhCDroZzrk5ztlanri4jri6QuXG4gICAgLy8gaG1yLWhvb2vsl5Ag7J2Y7ZW0IGludmFsaWRhdGXrkJwg67aA67aE65Ok7J20IOyVhOuLiOudvOuptCDsupDsi5wg6re464yA66GcIOycoOyngO2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG5cbiAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwib25ITVJDb21wbGV0ZWRcIik7XG4gIH1cblxuICByZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKFxuICAgIGludmFsaWRhdGVkUGF0aDogQWJzb2x1dGVQYXRoLFxuICApOiAodHlwZW9mIHJlZ2lzdGVyZWRBcGlzKVtudW1iZXJdW10ge1xuICAgIGlmICghaW52YWxpZGF0ZWRQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIgLyrshozsiqQg7L2U65Oc66W8IOuLpOujqOuKlCDsg4HtmansnbTri4ggLnRzIOqyveuhnOuhnCDrtIXri4jri6QuKi8pKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHJlZ2lzdGVyZWRBcGlzLmZpbHRlcigoYXBpKSA9PiBhcGkubW9kZWxOYW1lID09PSBgJHtlbnRpdHlJZH1Nb2RlbGApO1xuICAgIGZvciAoY29uc3QgYXBpIG9mIHRvUmVtb3ZlKSB7XG4gICAgICByZWdpc3RlcmVkQXBpcy5zcGxpY2UocmVnaXN0ZXJlZEFwaXMuaW5kZXhPZihhcGkpLCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9SZW1vdmU7XG4gIH1cblxuICBhc3luYyBjb3B5U2hhcmVkVG9UYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgLy8g7KeA6riIIOqwgOyguOqwgOugpOuKlCDsnbQg7YyM7J287J2AIFNvbmFtdSDsvZTrk5zrsqDsnbTsiqTsnZgg7J2867aA7J6F64uI64ukLlxuICAgICAgLy8g6re465+w642wIGRpc3Qg7IaNIOu5jOuTnOuQnCDshozsiqQg7L2U65OcIO2MjOydvOydtCDtlYTsmpTtlZwg6rKD7J20IOyVhOuLiOqzoCwgc3Jj7JeQ66eMIOyeiOuKlCDthY3siqTtirgg7YyM7J287J20IO2VhOyalO2VqeuLiOuLpC5cbiAgICAgIC8vIOuUsOudvOyEnCAvc3JjL+yXkOyEnCDssL7sirXri4jri6QuXG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBpbXBvcnQubWV0YS5kaXJuYW1lLnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKSxcbiAgICAgICAgYC4uL3NoYXJlZC8ke3RhcmdldH0uc2hhcmVkLnRzLnR4dGAsXG4gICAgICApO1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHNyY1BhdGgpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQpKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUcmllZCB0byBjb3B5IHNvbmFtdS5zaGFyZWQudHMgdG8gdGFyZ2V0ICcke3RhcmdldH0nIGJ1dCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIGNoZWNrIHlvdXIgcHJvamVjdCBkaXJlY3Rvcnkgc3RydWN0dXJlLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIOydtOqxtCDtlITroZzsoJ3tirjsl5AgLnRzIOyGjOyKpCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VmOuKlCDqsoPsnbTrr4DroZwgc3Jj7J2YIC50cyDqsr3roZzroZwg6rCR64uI64ukLlxuICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwic3JjL3NlcnZpY2VzL3NvbmFtdS5zaGFyZWQudHNcIik7XG5cbiAgICAgIC8vIOygleunkCDtmLnsi5zrgpjsp4Drp4wgdGFyZ2V0IOuUlOugie2GoOumrOuKlCDsnojslrTrj4Qgc3JjL3NlcnZpY2VzIOuUlOugie2GoOumrOuKlCDsl4bsnYQg7IiYIOyeiOycvOuvgOuhnCDrr7jrpqwg7IOd7ISx7ZW07KSN64uI64ukLlxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguZGlybmFtZShkZXN0UGF0aCkpKSkge1xuICAgICAgICBhd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZGVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS53YXJuKGBDcmVhdGVkIGRpcmVjdG9yeSAnJHtwYXRoLmRpcm5hbWUoZGVzdFBhdGgpfScgYmVjYXVzZSBpdCBkaWQgbm90IGV4aXN0LmApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgYXJlRmlsZXNTYW1lKHNyY1BhdGgsIGRlc3RQYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgd3JpdGVGaWxlKGRlc3RQYXRoLCBhd2FpdCByZWFkRmlsZShzcmNQYXRoKSk7XG5cbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKHBhdGgucmVsYXRpdmUoU29uYW11LmFwcFJvb3RQYXRoLCBkZXN0UGF0aCkpLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkVHlwZXMoKSB7XG4gICAgdGhpcy50eXBlcyA9IGF3YWl0IGxvYWRUeXBlcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRNb2RlbHMoKSB7XG4gICAgdGhpcy5tb2RlbHMgPSBhd2FpdCBsb2FkTW9kZWxzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZEFwaXMoKSB7XG4gICAgdGhpcy5hcGlzID0gYXdhaXQgbG9hZEFwaXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkV29ya2Zsb3dzKCkge1xuICAgIHRoaXMud29ya2Zsb3dzID0gYXdhaXQgbG9hZFdvcmtmbG93cygpO1xuICAgIGF3YWl0IFNvbmFtdS53b3JrZmxvd3Muc3luY2hyb25pemUodGhpcy53b3JrZmxvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCDsi7Htgazrpbwg7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICog67OA6rK965CcIO2MjOydvOuTpOydhCDtg4DsnoXrs4TroZwg67aE66WY7ZWY6rOgIOqwgSDtg4DsnoXsl5Ag66ee64qUIOyVoeyFmOydhCDsi6Ttlontlanri4jri6QuXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGhzIC0g67OA6rK965CcIO2MjOydvOuTpOydmCDsoIjrjIAg6rK966GcIOuqqeuhnVxuICAgKiBAcmV0dXJucyBkaWZmVHlwZXMgLSDrs4Dqsr3rkJwg7YyM7J287J2YIO2DgOyehSDrqqnroZ0gKGVudGl0eSwgdHlwZXMsIG1vZGVsIOuTsSlcbiAgICovXG4gIGFzeW5jIGRvU3luY0FjdGlvbnMoZGlmZkZpbGVQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHsgZGlmZlR5cGVzOiBzdHJpbmdbXSB9PiB7XG4gICAgY29uc3QgZGlmZkdyb3VwcyA9IHRoaXMuY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZVBhdGhzKTtcbiAgICBjb25zdCBkaWZmVHlwZXMgPSBPYmplY3Qua2V5cyhkaWZmR3JvdXBzKTtcblxuICAgIC8vIO2KuOumrOqxsDogZW50aXR5LCB0eXBlc1xuICAgIC8vIOyVoeyFmDog7Iqk7YKk66eIIOyDneyEsVxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJlbnRpdHlcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRW50aXR5Q2hhbmdlKGRpZmZHcm91cHMsIGRpZmZUeXBlcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiB0eXBlcywgZW51bXMsIGdlbmVyYXRlZCDrs4Dqsr3si5xcbiAgICAvLyDslaHshZg6IO2MjOydvCDsi7HtgawgdHlwZXMsIGVudW1zLCBnZW5lcmF0ZWRcbiAgICBpZiAoXG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJ0eXBlc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnVuY3Rpb25zXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJnZW5lcmF0ZWRcIilcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogbW9kZWxcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwibW9kZWxcIikgfHwgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnJhbWVcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogY29uZmlnXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImNvbmZpZ1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5hY3Rpb25TeW5jQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiB3b3JrZmxvd1xuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJ3b3JrZmxvd1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5hdXRvbG9hZFdvcmtmbG93cygpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaWZmVHlwZXMsXG4gICAgfTtcbiAgfVxuXG4gIGNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVzOiBBYnNvbHV0ZVBhdGhbXSk6IERpZmZHcm91cHMge1xuICAgIHJldHVybiBncm91cChkaWZmRmlsZXMsIChyKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGVkID0gci5tYXRjaCgvXFwuKG1vZGVsfHR5cGVzfGZ1bmN0aW9uc3xlbnRpdHl8Z2VuZXJhdGVkfGZyYW1lfGNvbmZpZylcXC5bdGpdcy8pO1xuICAgICAgcmV0dXJuIG1hdGNoZWQ/LlsxXSA/PyBcInVua25vd25cIjtcbiAgICB9KSBhcyB1bmtub3duIGFzIERpZmZHcm91cHM7XG4gIH1cblxuICBhc3luYyBoYW5kbGVFbnRpdHlDaGFuZ2UoZGlmZkdyb3VwczogRGlmZkdyb3VwcywgZGlmZlR5cGVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVFbnRpdHlDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzLCBkaWZmVHlwZXMgfSk7XG5cbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlbG9hZCgpO1xuXG4gICAgLy8gdHlwZXMg7IOd7ISxKGVudGl0eSDsg4jroZwg7LaU6rCA65CcIOqyveyasClcbiAgICAvLyBwYXJlbnRJZOqwgCDsl4bqs6AsIHR5cGVz6rCAIOyXhuuKlCDqsr3smrDsl5Drp4wg7IOd7ISxXG4gICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoZGlmZkdyb3Vwcy5lbnRpdHk/LlswXSk7XG5cbiAgICBpZiAoZW50aXR5SWQpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgIC8vIO2UhOuhnOygne2KuOyXkCDsg53shLHrkJjslrTslbwg7ZWY64qUIC50cyDtjIzsnbzsnZgg6rK966Gc7J6F64uI64ukLlxuICAgICAgY29uc3QgdHlwZUZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICAgIGBzcmMvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMuZnN9LyR7ZW50aXR5Lm5hbWVzLmZzfS50eXBlcy50c2AsXG4gICAgICApO1xuICAgICAgaWYgKGVudGl0eS5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkICYmICEoYXdhaXQgZXhpc3RzKHR5cGVGaWxlUGF0aCkpKSB7XG4gICAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJpbml0X3R5cGVzXCIsIHsgZW50aXR5SWQgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTtcblxuICAgIGRpZmZHcm91cHMuZ2VuZXJhdGVkID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLmdlbmVyYXRlZCA/PyBbXSksXG4gICAgICBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyYy9hcHBsaWNhdGlvbi9zb25hbXUuZ2VuZXJhdGVkLnRzXCIpIGFzIEFic29sdXRlUGF0aCxcbiAgICBdKTtcbiAgICBkaWZmVHlwZXMucHVzaChcImdlbmVyYXRlZFwiKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTxGaWxlVHlwZVtdPiB7XG4gICAgY29uc3QgdHNQYXRocyA9IHVuaXF1ZShbXG4gICAgICAuLi4oZGlmZkdyb3Vwcy50eXBlcyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5mdW5jdGlvbnMgPz8gW10pLFxuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICBdKTtcbiAgICBOYWl0ZS50KFwiaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlXCIsIHsgZGlmZkdyb3VwcyB9KTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgY2hhbGsuZ3JheShcbiAgICAvLyAgICAgYFtQcm9jZXNzaW5nXSBIYW5kbGluZyB0eXBlcy9mdW5jdGlvbnMvZ2VuZXJhdGVkIGNoYW5nZXM6ICR7dHNQYXRocy5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBwKSkuam9pbihcIiwgXCIpfWBcbiAgICAvLyAgIClcbiAgICAvLyApO1xuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHNQYXRocyk7XG5cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBhc3luYyBoYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2UoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzIH0pO1xuICAgIGNvbnN0IG1lcmdlZEdyb3VwID0gWy4uLihkaWZmR3JvdXBzLm1vZGVsID8/IFtdKSwgLi4uKGRpZmZHcm91cHMuZnJhbWUgPz8gW10pXTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgY2hhbGsuZ3JheShcbiAgICAvLyAgICAgYFtQcm9jZXNzaW5nXSBIYW5kbGluZyBtb2RlbC9mcmFtZSBjaGFuZ2VzOiAke21lcmdlZEdyb3VwLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICAvLyBnZW5lcmF0ZWRfaHR0cC50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIudHlwZXPrpbwg7JSB64uI64ukLlxuICAgIC8vIHNlcnZpY2UudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLmFwaXPrpbwg7JSB64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuXG4gICAgY29uc3QgcGFyYW1zOiB7XG4gICAgICBuYW1lc1JlY29yZDogRW50aXR5TmFtZXNSZWNvcmQ7XG4gICAgfVtdID0gbWVyZ2VkR3JvdXAubWFwKChtb2RlbFBhdGgpID0+IHtcbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIikpIHtcbiAgICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgobW9kZWxQYXRoKTtcbiAgICAgICAgYXNzZXJ0KGVudGl0eUlkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLmZyYW1lLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IFssIGZyYW1lTmFtZV0gPSBtb2RlbFBhdGgubWF0Y2goLy4rXFwvKC4rKVxcLmZyYW1lXFwudHMkLykgPz8gW107XG4gICAgICAgIGFzc2VydChmcmFtZU5hbWUpO1xuICAgICAgICAvLyBmcmFtZU5hbWXsnYQgUGFzY2FsQ2FzZeuhnCDrs4DtmZggKGRhc2hib2FyZCAtPiBEYXNoYm9hcmQpXG4gICAgICAgIGNvbnN0IGZyYW1lSWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGZyYW1lTmFtZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZnJhbWVJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgcmVhY2hhYmxlXCIpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKHBhcmFtcyk7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZUh0dHBzKCk7XG4gIH1cblxuICAvLyB3ZWIvLnNvbmFtdS5lbnYg7JeQIO2YhOyerCDshKTsoJXqsJIg7KCA7J6lXG4gIGFzeW5jIGFjdGlvblN5bmNDb25maWcoKSB7XG4gICAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSBTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4gPz8ge307XG4gICAgY29uc3QgY29udGVudCA9IGBBUElfSE9TVD0ke2hvc3QgPz8gXCJsb2NhbGhvc3RcIn1cXG5BUElfUE9SVD0ke3BvcnQgPz8gMzAwMH1gO1xuXG4gICAgTmFpdGUudChcImFjdGlvblN5bmNDb25maWdcIiwgeyBjb250ZW50IH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCIuc29uYW11LmVudlwiKSwgY29udGVudCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5nZW5lcmF0ZWQudHPsmYAgc29uYW11LmdlbmVyYXRlZC5zc28udHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRfc3NvXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcImdlbmVyYXRlZFwiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICBdKVxuICAgIClcbiAgICAgIC5mbGF0KClcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICAvKipcbiAgICogKi5zZXJ2aWNlLnRz66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHBhcmFtIHBhcmFtc0FycmF5XG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlU2VydmljZXMoXG4gICAgcGFyYW1zQXJyYXk6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10sXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBOYWl0ZS50KFwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlc1wiLCBwYXJhbXNBcnJheSk7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBwYXJhbXNBcnJheS5tYXAoYXN5bmMgKHBhcmFtcykgPT5cbiAgICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwic2VydmljZVwiLCBwYXJhbXMgYXMgVGVtcGxhdGVPcHRpb25zW1wic2VydmljZVwiXSwge1xuICAgICAgICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKVxuICAgIClcbiAgICAgIC5mbGF0KClcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICAvKipcbiAgICogc29uYW11LmdlbmVyYXRlZC5odHRw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZUh0dHBzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoPiB7XG4gICAgY29uc3QgW3Jlc10gPSBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFxuICAgICAgXCJnZW5lcmF0ZWRfaHR0cFwiLFxuICAgICAgeyBlbnRpdHlJZDogXCJkdW1teVwiIH0sXG4gICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9LFxuICAgICk7XG4gICAgYXNzZXJ0KHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiAqLnR5cGVzLnRzLCAqLmZ1bmN0aW9ucy50cywgKi5nZW5lcmF0ZWQudHPrpbwg7YOA6rKfIOuUlOugie2GoOumrOyXkCDrs7Xsgqztlanri4jri6QuXG4gICAqIEBwYXJhbSB0c1BhdGhzXG4gICAqIEByZXR1cm5zIOuzteyCrOuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICBjb25zdCB7IGRpcjogYXBpRGlyIH0gPSBTb25hbXUuY29uZmlnLmFwaTtcblxuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT5cbiAgICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHRzUGF0aHMubWFwKGFzeW5jIChyZWFsU3JjKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGRzdCA9IHJlYWxTcmNcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgLyR7YXBpRGlyfS9gLCBgLyR7dGFyZ2V0fS9gKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiL2FwcGxpY2F0aW9uL1wiLCBcIi9zZXJ2aWNlcy9cIik7XG4gICAgICAgICAgICAgIGNvbnN0IGRpciA9IGRpcm5hbWUoZHN0KTtcbiAgICAgICAgICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUoZHN0LnJlcGxhY2UoYCR7U29uYW11LmFwcFJvb3RQYXRofS9gLCBcIlwiKSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkKHJlYWxTcmMsIGRzdCk7XG4gICAgICAgICAgICAgIHJldHVybiBkc3Q7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKVxuICAgICkuZmxhdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkKGZyb21QYXRoOiBzdHJpbmcsIHRvUGF0aDogc3RyaW5nKSB7XG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKGZyb21QYXRoKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRGaWxlQ29udGVudCA9IChhd2FpdCByZWFkRmlsZShmcm9tUGF0aCkpLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9ICgoKSA9PiB7XG4gICAgICAvLyB3ZWLsnbTrgpggYXBwIOuTseyXkOuKlCBzb25hbXXqsIAg7JeG7Iq164uI64ukLlxuICAgICAgLy8g65Sw65287IScIHNvbmFtdeyXkCDrjIDtlZwgaW1wb3J064qUIO2VqOq7mCDrs7XsgqzrkJjripQgc29uYW11LnNoYXJlZC50c+yXkCDrjIDtlZwgaW1wb3J066GcIOy5mO2ZmO2VtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDrrLjsoJzripQg66as7IaM7IqkIOyiheulmOyXkCDrlLDrnbwgc29uYW11LnNoYXJlZC50c+uhnCDqsIDripQg6rK966Gc6rCAIOuLpOultOuLpOuKlCDsoJDsnoXri4jri6QuXG4gICAgICAvLyDsmIjrpbwg65Ok7Ja0IHNvbmFtdS5nZW5lcmF0ZWQudHMg7J6F7J6l7JeQ7IScIHNvbmFtdS5zaGFyZWQudHPripQg6rCZ7J2AIOuUlOugie2GoOumrOyXkCDsnojsnLzri4ggLi9zb25hbXUuc2hhcmVk66GcIOy5mO2ZmO2VmOuptCDrkJjsp4Drp4wsXG4gICAgICAvLyB1c2VyLnR5cGVzLnRzIOyeheyepeyXkOyEnCBzb25hbXUuc2hhcmVkLnRz64qUIOyDgeychCDrlJTroInthqDrpqzsl5Ag7J6I7Jy864uIIC4uL3NvbmFtdS5zaGFyZWTroZwg7LmY7ZmY7ZW07JW8IO2VqeuLiOuLpC5cbiAgICAgIC8vIOydtCDrrLjsoJzrpbwg7ZW06rKw7ZWY6riwIOychO2VtCDrs7XsgqztlZjqs6DsnpAg7ZWY64qUIOumrOyGjOyKpOydmCDqsr3roZwodG9QYXRoKeulvCDquLDspIDsnLzroZwgc29uYW11LnNoYXJlZC50c+qwgCDsnojripQg65SU66CJ7Yag66as66W8IOywvuyVhOyEnCDsg4HrjIAg6rK966Gc66W8IOqzhOyCsO2VmOuPhOuhnSDtlZjsmIDsirXri4jri6QuXG4gICAgICBjb25zdCBzZXJ2aWNlc0RpciA9IHRvUGF0aC5yZXBsYWNlKC9cXC9zZXJ2aWNlc1xcLy4qJC8sIFwiL3NlcnZpY2VzXCIpO1xuICAgICAgY29uc3QgZmlsZURpciA9IGRpcm5hbWUodG9QYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZmlsZURpciwgc2VydmljZXNEaXIpO1xuICAgICAgY29uc3Qgc2hhcmVkUGF0aCA9IHJlbGF0aXZlUGF0aCA9PT0gXCJcIiA/IFwiLi9zb25hbXUuc2hhcmVkXCIgOiBgJHtyZWxhdGl2ZVBhdGh9L3NvbmFtdS5zaGFyZWRgO1xuXG4gICAgICBjb25zdCBuZmMgPSBvbGRGaWxlQ29udGVudC5yZXBsYWNlKC9mcm9tIFwic29uYW11XCIvZywgYGZyb20gXCIke3NoYXJlZFBhdGh9XCJgKTtcbiAgICAgIHJldHVybiBuZmM7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gd3JpdGVGaWxlKHRvUGF0aCwgbmV3RmlsZUNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7YWc7ZSM66a/IO2CpOyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gdGVtcGxhdGVLZXkg7YWc7ZSM66a/IO2CpFxuICAgKiBAcGFyYW0gZW51bUlkIOyXtOqxsO2YlSBJRFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIHRlbXBsYXRlS2V5OiBUZW1wbGF0ZUtleSxcbiAgICBlbnVtSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBzdWJQYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmc7IGlzRXhpc3RzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogZ2VuUGF0aCB9ID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSkuZ2V0VGFyZ2V0QW5kUGF0aChcbiAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgZW51bUlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdWJQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgZ2VuUGF0aCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBzdWJQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3ViUGF0aCxcbiAgICAgIGZ1bGxQYXRoLFxuICAgICAgaXNFeGlzdHM6IGF3YWl0IGV4aXN0cyhmdWxsUGF0aCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIOyXtOqxsO2YleyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gZW51bXMg7Je06rGw7ZiVIOugiOydtOu4lFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgZW51bXM6IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB6LlpvZEVudW08UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPj4+O1xuICAgIH0sXG4gICk6IFByb21pc2U8UmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+PiB7XG4gICAgY29uc3Qga2V5czogVGVtcGxhdGVLZXlbXSA9IFRlbXBsYXRlS2V5Lm9wdGlvbnM7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnVtc0tleXMgPSBPYmplY3Qua2V5cyhlbnVtcykuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBuYW1lcy5jb25zdGFudCk7XG5cbiAgICByZXR1cm4gYXdhaXQgcmVkdWNlQXN5bmMoXG4gICAgICBrZXlzLFxuICAgICAgYXN5bmMgKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHRwbCA9IFRlbXBsYXRlTWFuYWdlci5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwidmlld19lbnVtc1wiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKGVudW1zS2V5cywgYXN5bmMgKGNvbXBvbmVudElkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMsIGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke2NvbXBvbmVudElkfWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzKTtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgICAgIGlmICh0YXJnZXQuaW5jbHVkZXMoXCI6dGFyZ2V0XCIpKSB7XG4gICAgICAgICAgYXdhaXQgbWFwQXN5bmModGFyZ2V0cywgYXN5bmMgKHQpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke3R9YF0gPSBhd2FpdCBleGlzdHMoXG4gICAgICAgICAgICAgIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldC5yZXBsYWNlKFwiOnRhcmdldFwiLCB0KSwgcCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7fSBhcyBSZWNvcmQ8YCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCwgYm9vbGVhbj4sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUVudGl0eShmb3JtOiBUZW1wbGF0ZU9wdGlvbnNbXCJlbnRpdHlcIl0pIHtcbiAgICByZXR1cm4gYXdhaXQgY3JlYXRlRW50aXR5KGZvcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZGVsRW50aXR5KGVudGl0eUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgZGVsUGF0aHM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4gYXdhaXQgZGVsRW50aXR5KGVudGl0eUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlVGVtcGxhdGU8VCBleHRlbmRzIFRlbXBsYXRlS2V5PihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICAgX2dlbmVyYXRlT3B0aW9ucz86IEdlbmVyYXRlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zLCBfZ2VuZXJhdGVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHJlbmRlclRlbXBsYXRlPFQgZXh0ZW5kcyBrZXlvZiBUZW1wbGF0ZU9wdGlvbnM+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgKTogUHJvbWlzZTxQYXRoQW5kQ29kZVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmRlclRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHJlbmV3Q2hlY2tzdW1zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCByZW5ld0NoZWNrc3VtcygpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaG90IiwiYXNzZXJ0IiwiY2hhbGsiLCJFdmVudEVtaXR0ZXIiLCJta2RpciIsInJlYWRGaWxlIiwid3JpdGVGaWxlIiwiaW5mbGVjdGlvbiIsIm1pbmltYXRjaCIsInBhdGgiLCJkaXJuYW1lIiwiZ3JvdXAiLCJ1bmlxdWUiLCJyZWdpc3RlcmVkQXBpcyIsIlNvbmFtdSIsIkVudGl0eU1hbmFnZXIiLCJOYWl0ZSIsIlRlbXBsYXRlTWFuYWdlciIsIlRlbXBsYXRlS2V5IiwibWFwQXN5bmMiLCJyZWR1Y2VBc3luYyIsImNlbnRlclRleHQiLCJpc1Rlc3QiLCJleGlzdHMiLCJydW5XaXRoR3JhY2VmdWxTaHV0ZG93biIsImFyZUZpbGVzU2FtZSIsImZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcyIsInJlbmV3Q2hlY2tzdW1zIiwiZ2VuZXJhdGVUZW1wbGF0ZSIsInJlbmRlclRlbXBsYXRlIiwiY3JlYXRlRW50aXR5IiwiZGVsRW50aXR5IiwiZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCIsImxvYWRBcGlzIiwibG9hZE1vZGVscyIsImxvYWRUeXBlcyIsImxvYWRXb3JrZmxvd3MiLCJTeW5jZXIiLCJhcGlzIiwidHlwZXMiLCJtb2RlbHMiLCJ3b3JrZmxvd3MiLCJNYXAiLCJpc1N5bmNpbmciLCJldmVudEVtaXR0ZXIiLCJzeW5jIiwidGFyZ2V0cyIsImNvbmZpZyIsImNvcHlTaGFyZWRUb1RhcmdldHMiLCJjaGFuZ2VkRmlsZXMiLCJsZW5ndGgiLCJjb25zb2xlIiwibG9nIiwiYmxhY2siLCJiZ0dyZWVuIiwiZG9TeW5jQWN0aW9ucyIsIndoZW5UaGlzSGFwcGVucyIsIndhaXRGb3JVcFRvIiwic3luY0Zyb21XYXRjaGVyIiwiZXZlbnQiLCJkaWZmRmlsZVBhdGgiLCJpbnZhbGlkYXRlZFBhdGhzIiwiaW52YWxpZGF0ZUZpbGUiLCJib2xkIiwiaW52YWxpZGF0ZWRQYXRoIiwicmVtb3ZlZEFwaXMiLCJyZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzIiwiYmx1ZSIsInJlbGF0aXZlIiwiYXBpUm9vdFBhdGgiLCJncmF5IiwiZSIsImVycm9yIiwicmVkIiwiaXNJbkNoZWNrUGF0dGVybkdyb3VwIiwiT2JqZWN0IiwidmFsdWVzIiwic29tZSIsInBhdHRlcm4iLCJhdXRvbG9hZFR5cGVzIiwiYXV0b2xvYWRNb2RlbHMiLCJhdXRvbG9hZEFwaXMiLCJhdXRvbG9hZFdvcmtmbG93cyIsImVtaXQiLCJlbmRzV2l0aCIsImVudGl0eUlkIiwiZ2V0RW50aXR5SWRGcm9tUGF0aCIsInRvUmVtb3ZlIiwiZmlsdGVyIiwiYXBpIiwibW9kZWxOYW1lIiwic3BsaWNlIiwiaW5kZXhPZiIsInRhcmdldCIsInNyY1BhdGgiLCJqb2luIiwicmVwbGFjZSIsImFwcFJvb3RQYXRoIiwiRXJyb3IiLCJkZXN0UGF0aCIsInJlY3Vyc2l2ZSIsIndhcm4iLCJzeW5jaHJvbml6ZSIsImRpZmZGaWxlUGF0aHMiLCJkaWZmR3JvdXBzIiwiY2FsY3VsYXRlRGlmZkdyb3VwcyIsImRpZmZUeXBlcyIsImtleXMiLCJpbmNsdWRlcyIsImhhbmRsZUVudGl0eUNoYW5nZSIsImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZSIsImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZSIsImFjdGlvblN5bmNDb25maWciLCJkaWZmRmlsZXMiLCJyIiwibWF0Y2hlZCIsIm1hdGNoIiwidCIsInJlbG9hZCIsImVudGl0eSIsImdldCIsInR5cGVGaWxlUGF0aCIsIm5hbWVzIiwiZnMiLCJwYXJlbnRJZCIsInVuZGVmaW5lZCIsImFjdGlvbkdlbmVyYXRlU2NoZW1hcyIsImdlbmVyYXRlZCIsInB1c2giLCJ0c1BhdGhzIiwiZnVuY3Rpb25zIiwiYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzIiwibWVyZ2VkR3JvdXAiLCJtb2RlbCIsImZyYW1lIiwicGFyYW1zIiwibWFwIiwibW9kZWxQYXRoIiwibmFtZXNSZWNvcmQiLCJnZXROYW1lc0Zyb21JZCIsImZyYW1lTmFtZSIsImZyYW1lSWQiLCJjYW1lbGl6ZSIsImFjdGlvbkdlbmVyYXRlU2VydmljZXMiLCJhY3Rpb25HZW5lcmF0ZUh0dHBzIiwiaG9zdCIsInBvcnQiLCJzZXJ2ZXIiLCJsaXN0ZW4iLCJjb250ZW50IiwiUHJvbWlzZSIsImFsbCIsIm92ZXJ3cml0ZSIsImZsYXQiLCJwYXJhbXNBcnJheSIsInJlcyIsImRpciIsImFwaURpciIsInJlYWxTcmMiLCJkc3QiLCJjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkIiwiZnJvbVBhdGgiLCJ0b1BhdGgiLCJvbGRGaWxlQ29udGVudCIsInRvU3RyaW5nIiwibmV3RmlsZUNvbnRlbnQiLCJzZXJ2aWNlc0RpciIsImZpbGVEaXIiLCJyZWxhdGl2ZVBhdGgiLCJzaGFyZWRQYXRoIiwibmZjIiwiY2hlY2tFeGlzdHNHZW5Db2RlIiwidGVtcGxhdGVLZXkiLCJlbnVtSWQiLCJnZW5QYXRoIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsInN1YlBhdGgiLCJmdWxsUGF0aCIsImlzRXhpc3RzIiwiY2hlY2tFeGlzdHMiLCJlbnVtcyIsIm9wdGlvbnMiLCJlbnVtc0tleXMiLCJuYW1lIiwiY29uc3RhbnQiLCJyZXN1bHQiLCJrZXkiLCJ0cGwiLCJzdGFydHNXaXRoIiwiY29tcG9uZW50SWQiLCJwIiwiZm9ybSIsInRlbXBsYXRlT3B0aW9ucyIsIl9nZW5lcmF0ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLEdBQUcsUUFBUSx1QkFBdUI7QUFDM0MsT0FBT0MsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxZQUFZLFFBQVEsU0FBUztBQUN0QyxTQUFTQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ3pELE9BQU9DLGdCQUFnQixhQUFhO0FBQ3BDLFNBQVNDLFNBQVMsUUFBUSxZQUFZO0FBQ3RDLE9BQU9DLFFBQVFD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
|
package/dist/types/types.d.ts
CHANGED
|
@@ -350,8 +350,8 @@ export type SubsetQuery = {
|
|
|
350
350
|
loaders: SubsetLoader[];
|
|
351
351
|
};
|
|
352
352
|
export declare const SonamuQueryMode: z.ZodEnum<{
|
|
353
|
-
both: "both";
|
|
354
353
|
count: "count";
|
|
354
|
+
both: "both";
|
|
355
355
|
list: "list";
|
|
356
356
|
}>;
|
|
357
357
|
export type SonamuQueryMode = z.infer<typeof SonamuQueryMode>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=ai-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-api.d.ts","sourceRoot":"","sources":["../../src/ui/ai-api.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// import { convertToModelMessages, type UIMessage } from "ai";
|
|
2
|
+
// import type { FastifyInstance } from "fastify";
|
|
3
|
+
// import { BadRequestException, type FixtureRecord } from "sonamu";
|
|
4
|
+
// import { aiClient } from "./ai-client";
|
|
5
|
+
// export async function setAiApi(server: FastifyInstance) {
|
|
6
|
+
// await aiClient.init();
|
|
7
|
+
// server.post("/api/ai/fixture/chat", async (request, reply) => {
|
|
8
|
+
// const { messages, fixtureRecords } = request.body as {
|
|
9
|
+
// messages: UIMessage[];
|
|
10
|
+
// fixtureRecords?: FixtureRecord[];
|
|
11
|
+
// };
|
|
12
|
+
// if (!fixtureRecords || fixtureRecords.length === 0) {
|
|
13
|
+
// throw new BadRequestException("픽스쳐 레코드가 없습니다. 픽스쳐 조회 후 시도하세요.");
|
|
14
|
+
// }
|
|
15
|
+
// const result = aiClient.handleFixture(convertToModelMessages(messages), fixtureRecords);
|
|
16
|
+
// const response = result.toUIMessageStreamResponse();
|
|
17
|
+
// reply.raw.writeHead(response.status, Object.fromEntries(response.headers.entries()));
|
|
18
|
+
// if (response.body) {
|
|
19
|
+
// const reader = response.body.getReader();
|
|
20
|
+
// while (true) {
|
|
21
|
+
// const { done, value } = await reader.read();
|
|
22
|
+
// if (done) break;
|
|
23
|
+
// reply.raw.write(value);
|
|
24
|
+
// }
|
|
25
|
+
// }
|
|
26
|
+
// reply.raw.end();
|
|
27
|
+
// return reply;
|
|
28
|
+
// });
|
|
29
|
+
// // Entity/Enum 생성용 AI Chat Stream
|
|
30
|
+
// server.post("/api/ai/entity/chat", async (request, reply) => {
|
|
31
|
+
// const { messages } = request.body as {
|
|
32
|
+
// messages: UIMessage[];
|
|
33
|
+
// };
|
|
34
|
+
// const result = aiClient.handleEntity(convertToModelMessages(messages));
|
|
35
|
+
// const response = result.toUIMessageStreamResponse();
|
|
36
|
+
// reply.raw.writeHead(response.status, Object.fromEntries(response.headers.entries()));
|
|
37
|
+
// if (response.body) {
|
|
38
|
+
// const reader = response.body.getReader();
|
|
39
|
+
// while (true) {
|
|
40
|
+
// const { done, value } = await reader.read();
|
|
41
|
+
// if (done) break;
|
|
42
|
+
// reply.raw.write(value);
|
|
43
|
+
// }
|
|
44
|
+
// }
|
|
45
|
+
// reply.raw.end();
|
|
46
|
+
// return reply;
|
|
47
|
+
// });
|
|
48
|
+
// }
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9haS1hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHsgY29udmVydFRvTW9kZWxNZXNzYWdlcywgdHlwZSBVSU1lc3NhZ2UgfSBmcm9tIFwiYWlcIjtcbi8vIGltcG9ydCB0eXBlIHsgRmFzdGlmeUluc3RhbmNlIH0gZnJvbSBcImZhc3RpZnlcIjtcbi8vIGltcG9ydCB7IEJhZFJlcXVlc3RFeGNlcHRpb24sIHR5cGUgRml4dHVyZVJlY29yZCB9IGZyb20gXCJzb25hbXVcIjtcbi8vIGltcG9ydCB7IGFpQ2xpZW50IH0gZnJvbSBcIi4vYWktY2xpZW50XCI7XG5cbi8vIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRBaUFwaShzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSkge1xuLy8gICBhd2FpdCBhaUNsaWVudC5pbml0KCk7XG5cbi8vICAgc2VydmVyLnBvc3QoXCIvYXBpL2FpL2ZpeHR1cmUvY2hhdFwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbi8vICAgICBjb25zdCB7IG1lc3NhZ2VzLCBmaXh0dXJlUmVjb3JkcyB9ID0gcmVxdWVzdC5ib2R5IGFzIHtcbi8vICAgICAgIG1lc3NhZ2VzOiBVSU1lc3NhZ2VbXTtcbi8vICAgICAgIGZpeHR1cmVSZWNvcmRzPzogRml4dHVyZVJlY29yZFtdO1xuLy8gICAgIH07XG5cbi8vICAgICBpZiAoIWZpeHR1cmVSZWNvcmRzIHx8IGZpeHR1cmVSZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuLy8gICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXCLtlL3siqTss5Ag66CI7L2U65Oc6rCAIOyXhuyKteuLiOuLpC4g7ZS97Iqk7LOQIOyhsO2ajCDtm4Qg7Iuc64+E7ZWY7IS47JqULlwiKTtcbi8vICAgICB9XG5cbi8vICAgICBjb25zdCByZXN1bHQgPSBhaUNsaWVudC5oYW5kbGVGaXh0dXJlKGNvbnZlcnRUb01vZGVsTWVzc2FnZXMobWVzc2FnZXMpLCBmaXh0dXJlUmVjb3Jkcyk7XG4vLyAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudG9VSU1lc3NhZ2VTdHJlYW1SZXNwb25zZSgpO1xuXG4vLyAgICAgcmVwbHkucmF3LndyaXRlSGVhZChyZXNwb25zZS5zdGF0dXMsIE9iamVjdC5mcm9tRW50cmllcyhyZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSkpO1xuXG4vLyAgICAgaWYgKHJlc3BvbnNlLmJvZHkpIHtcbi8vICAgICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG4vLyAgICAgICB3aGlsZSAodHJ1ZSkge1xuLy8gICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuLy8gICAgICAgICBpZiAoZG9uZSkgYnJlYWs7XG4vLyAgICAgICAgIHJlcGx5LnJhdy53cml0ZSh2YWx1ZSk7XG4vLyAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgcmVwbHkucmF3LmVuZCgpO1xuLy8gICAgIHJldHVybiByZXBseTtcbi8vICAgfSk7XG5cbi8vICAgLy8gRW50aXR5L0VudW0g7IOd7ISx7JqpIEFJIENoYXQgU3RyZWFtXG4vLyAgIHNlcnZlci5wb3N0KFwiL2FwaS9haS9lbnRpdHkvY2hhdFwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbi8vICAgICBjb25zdCB7IG1lc3NhZ2VzIH0gPSByZXF1ZXN0LmJvZHkgYXMge1xuLy8gICAgICAgbWVzc2FnZXM6IFVJTWVzc2FnZVtdO1xuLy8gICAgIH07XG5cbi8vICAgICBjb25zdCByZXN1bHQgPSBhaUNsaWVudC5oYW5kbGVFbnRpdHkoY29udmVydFRvTW9kZWxNZXNzYWdlcyhtZXNzYWdlcykpO1xuLy8gICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnRvVUlNZXNzYWdlU3RyZWFtUmVzcG9uc2UoKTtcblxuLy8gICAgIHJlcGx5LnJhdy53cml0ZUhlYWQocmVzcG9uc2Uuc3RhdHVzLCBPYmplY3QuZnJvbUVudHJpZXMocmVzcG9uc2UuaGVhZGVycy5lbnRyaWVzKCkpKTtcblxuLy8gICAgIGlmIChyZXNwb25zZS5ib2R5KSB7XG4vLyAgICAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuLy8gICAgICAgd2hpbGUgKHRydWUpIHtcbi8vICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbi8vICAgICAgICAgaWYgKGRvbmUpIGJyZWFrO1xuLy8gICAgICAgICByZXBseS5yYXcud3JpdGUodmFsdWUpO1xuLy8gICAgICAgfVxuLy8gICAgIH1cblxuLy8gICAgIHJlcGx5LnJhdy5lbmQoKTtcbi8vICAgICByZXR1cm4gcmVwbHk7XG4vLyAgIH0pO1xuLy8gfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUErRDtBQUMvRCxrREFBa0Q7QUFDbEQsb0VBQW9FO0FBQ3BFLDBDQUEwQztBQUUxQyw0REFBNEQ7QUFDNUQsMkJBQTJCO0FBRTNCLG9FQUFvRTtBQUNwRSw2REFBNkQ7QUFDN0QsK0JBQStCO0FBQy9CLDBDQUEwQztBQUMxQyxTQUFTO0FBRVQsNERBQTREO0FBQzVELHlFQUF5RTtBQUN6RSxRQUFRO0FBRVIsK0ZBQStGO0FBQy9GLDJEQUEyRDtBQUUzRCw0RkFBNEY7QUFFNUYsMkJBQTJCO0FBQzNCLGtEQUFrRDtBQUNsRCx1QkFBdUI7QUFDdkIsdURBQXVEO0FBQ3ZELDJCQUEyQjtBQUMzQixrQ0FBa0M7QUFDbEMsVUFBVTtBQUNWLFFBQVE7QUFFUix1QkFBdUI7QUFDdkIsb0JBQW9CO0FBQ3BCLFFBQVE7QUFFUixzQ0FBc0M7QUFDdEMsbUVBQW1FO0FBQ25FLDZDQUE2QztBQUM3QywrQkFBK0I7QUFDL0IsU0FBUztBQUVULDhFQUE4RTtBQUM5RSwyREFBMkQ7QUFFM0QsNEZBQTRGO0FBRTVGLDJCQUEyQjtBQUMzQixrREFBa0Q7QUFDbEQsdUJBQXVCO0FBQ3ZCLHVEQUF1RDtBQUN2RCwyQkFBMkI7QUFDM0Isa0NBQWtDO0FBQ2xDLFVBQVU7QUFDVixRQUFRO0FBRVIsdUJBQXVCO0FBQ3ZCLG9CQUFvQjtBQUNwQixRQUFRO0FBQ1IsSUFBSSJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=ai-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-client.d.ts","sourceRoot":"","sources":["../../src/ui/ai-client.ts"],"names":[],"mappings":""}
|