@decohere/flux 0.0.1-dev.6 → 0.0.1-dev.61
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/commonjs/src/flux.command.js +27 -0
- package/commonjs/src/flux.module.js +32 -0
- package/commonjs/src/hot-reload-server.js +243 -117
- package/commonjs/src/index.js +7 -36
- package/commonjs/src/serve.action.js +22 -11
- package/commonjs/src/serve.command.js +6 -4
- package/es6/src/flux.command.js +17 -0
- package/es6/src/flux.module.js +22 -0
- package/es6/src/hot-reload-server.js +244 -118
- package/es6/src/index.js +3 -7
- package/es6/src/serve.action.js +24 -11
- package/es6/src/serve.command.js +7 -5
- package/package.json +7 -12
- package/types/src/{ember.command.d.ts → flux.command.d.ts} +1 -1
- package/types/src/flux.module.d.ts +14 -0
- package/types/src/hot-reload-server.d.ts +49 -22
- package/types/src/index.d.ts +3 -8
- package/types/src/serve.action.d.ts +7 -2
- package/types/src/serve.command.d.ts +2 -2
- package/commonjs/src/ember.command.js +0 -27
- package/commonjs/src/ember.module.js +0 -37
- package/commonjs/src/hot-module-hooks.js +0 -47
- package/commonjs/src/serve.js +0 -36
- package/commonjs/src/workspace-serve.action.js +0 -59
- package/es6/src/ember.command.js +0 -17
- package/es6/src/ember.module.js +0 -19
- package/es6/src/hot-module-hooks.js +0 -26
- package/es6/src/serve.js +0 -32
- package/es6/src/workspace-serve.action.js +0 -45
- package/types/src/ember.module.d.ts +0 -22
- package/types/src/hot-module-hooks.d.ts +0 -5
- package/types/src/serve.d.ts +0 -1
- package/types/src/workspace-serve.action.d.ts +0 -11
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "FluxCommand", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return FluxCommand;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _cli = require("@decohere/nexus/cli");
|
|
12
|
+
const _servecommand = require("./serve.command.js");
|
|
13
|
+
class FluxCommand extends _cli.DecohereCommand {
|
|
14
|
+
constructor(commands, handler){
|
|
15
|
+
super(FluxCommand);
|
|
16
|
+
this.exitOverride();
|
|
17
|
+
this.registerSubcommand({
|
|
18
|
+
serve: _servecommand.ServeCommand,
|
|
19
|
+
...commands
|
|
20
|
+
}, handler);
|
|
21
|
+
}
|
|
22
|
+
run(_actions, _options) {
|
|
23
|
+
return this.help();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2ZsdXguY29tbWFuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFjdGlvbnMgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHtcblx0dHlwZSBDb21tYW5kSGFuZGxlcixcblx0dHlwZSBDb21tYW5kUmVzcG9uc2UsXG5cdHR5cGUgQ29tbWFuZFR5cGUsXG5cdERlY29oZXJlQ29tbWFuZCxcbn0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IFNlcnZlQ29tbWFuZCB9IGZyb20gXCIuL3NlcnZlLmNvbW1hbmQuanNcIjtcblxuZXhwb3J0IGNsYXNzIEZsdXhDb21tYW5kIGV4dGVuZHMgRGVjb2hlcmVDb21tYW5kIHtcblx0cHVibGljIGNvbnN0cnVjdG9yKGNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBDb21tYW5kVHlwZT4sIGhhbmRsZXI6IENvbW1hbmRIYW5kbGVyKSB7XG5cdFx0c3VwZXIoRmx1eENvbW1hbmQpO1xuXHRcdHRoaXMuZXhpdE92ZXJyaWRlKCk7XG5cdFx0dGhpcy5yZWdpc3RlclN1YmNvbW1hbmQoeyBzZXJ2ZTogU2VydmVDb21tYW5kLCAuLi5jb21tYW5kcyB9LCBoYW5kbGVyKTtcblx0fVxuXG5cdHB1YmxpYyBydW4oX2FjdGlvbnM6IEFjdGlvbnMsIF9vcHRpb25zOiBuZXZlcik6IFByb21pc2U8Q29tbWFuZFJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHRoaXMuaGVscCgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRmx1eENvbW1hbmQiLCJEZWNvaGVyZUNvbW1hbmQiLCJjb21tYW5kcyIsImhhbmRsZXIiLCJleGl0T3ZlcnJpZGUiLCJyZWdpc3RlclN1YmNvbW1hbmQiLCJzZXJ2ZSIsIlNlcnZlQ29tbWFuZCIsInJ1biIsIl9hY3Rpb25zIiwiX29wdGlvbnMiLCJoZWxwIl0sIm1hcHBpbmdzIjoiOzs7OytCQVNhQTs7O2VBQUFBOzs7cUJBSE47OEJBQ3NCO0FBRXRCLE1BQU1BLG9CQUFvQkMsb0JBQWU7SUFDL0MsWUFBbUJDLFFBQXFDLEVBQUVDLE9BQXVCLENBQUU7UUFDbEYsS0FBSyxDQUFDSDtRQUNOLElBQUksQ0FBQ0ksWUFBWTtRQUNqQixJQUFJLENBQUNDLGtCQUFrQixDQUFDO1lBQUVDLE9BQU9DLDBCQUFZO1lBQUUsR0FBR0wsUUFBUTtRQUFDLEdBQUdDO0lBQy9EO0lBRU9LLElBQUlDLFFBQWlCLEVBQUVDLFFBQWUsRUFBNEI7UUFDeEUsT0FBTyxJQUFJLENBQUNDLElBQUk7SUFDakI7QUFDRCJ9
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "FluxModule", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return FluxModule;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _mesh = require("@decohere/mesh");
|
|
12
|
+
const _cli = require("@decohere/nexus/cli");
|
|
13
|
+
const _fluxcommand = require("./flux.command.js");
|
|
14
|
+
const _hotreloadserver = require("./hot-reload-server.js");
|
|
15
|
+
const _serveaction = require("./serve.action.js");
|
|
16
|
+
class FluxModule extends _cli.ModuleManifest {
|
|
17
|
+
id = "flux";
|
|
18
|
+
command = _fluxcommand.FluxCommand;
|
|
19
|
+
actions = {
|
|
20
|
+
serve: _serveaction.ServeAction
|
|
21
|
+
};
|
|
22
|
+
registerServices(builder) {
|
|
23
|
+
builder.registerSingleton(_hotreloadserver.HotReloadServer);
|
|
24
|
+
}
|
|
25
|
+
createWorkspace(options) {
|
|
26
|
+
return _mesh.WorkspaceFactory.create({
|
|
27
|
+
configFile: options.configFile
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2ZsdXgubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtzcGFjZUZhY3RvcnkgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlRmFjdG9yeU9wdGlvbnMgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgTW9kdWxlTWFuaWZlc3QgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHR5cGUgeyBDb250YWluZXJCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jb21wb3NpdGlvblwiO1xuaW1wb3J0IHsgRmx1eENvbW1hbmQgfSBmcm9tIFwiLi9mbHV4LmNvbW1hbmQuanNcIjtcbmltcG9ydCB7IEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5pbXBvcnQgeyBTZXJ2ZUFjdGlvbiB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuXG5leHBvcnQgY2xhc3MgRmx1eE1vZHVsZSBleHRlbmRzIE1vZHVsZU1hbmlmZXN0IHtcblx0cHVibGljIHJlYWRvbmx5IGlkID0gXCJmbHV4XCI7XG5cdHB1YmxpYyByZWFkb25seSBjb21tYW5kID0gRmx1eENvbW1hbmQ7XG5cdHB1YmxpYyByZWFkb25seSBhY3Rpb25zID0ge1xuXHRcdHNlcnZlOiBTZXJ2ZUFjdGlvbixcblx0fTtcblxuXHRwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlcyhidWlsZGVyOiBDb250YWluZXJCdWlsZGVyKSB7XG5cdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihIb3RSZWxvYWRTZXJ2ZXIpO1xuXHR9XG5cblx0cHVibGljIG92ZXJyaWRlIGNyZWF0ZVdvcmtzcGFjZShvcHRpb25zOiBXb3Jrc3BhY2VGYWN0b3J5T3B0aW9ucykge1xuXHRcdHJldHVybiBXb3Jrc3BhY2VGYWN0b3J5LmNyZWF0ZSh7IGNvbmZpZ0ZpbGU6IG9wdGlvbnMuY29uZmlnRmlsZSB9KTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkZsdXhNb2R1bGUiLCJNb2R1bGVNYW5pZmVzdCIsImlkIiwiY29tbWFuZCIsIkZsdXhDb21tYW5kIiwiYWN0aW9ucyIsInNlcnZlIiwiU2VydmVBY3Rpb24iLCJyZWdpc3RlclNlcnZpY2VzIiwiYnVpbGRlciIsInJlZ2lzdGVyU2luZ2xldG9uIiwiSG90UmVsb2FkU2VydmVyIiwiY3JlYXRlV29ya3NwYWNlIiwib3B0aW9ucyIsIldvcmtzcGFjZUZhY3RvcnkiLCJjcmVhdGUiLCJjb25maWdGaWxlIl0sIm1hcHBpbmdzIjoiOzs7OytCQVFhQTs7O2VBQUFBOzs7c0JBUm9CO3FCQUVGOzZCQUVIO2lDQUNJOzZCQUNKO0FBRXJCLE1BQU1BLG1CQUFtQkMsbUJBQWM7SUFDN0JDLEtBQUssT0FBTztJQUNaQyxVQUFVQyx3QkFBVyxDQUFDO0lBQ3RCQyxVQUFVO1FBQ3pCQyxPQUFPQyx3QkFBVztJQUNuQixFQUFFO0lBRUtDLGlCQUFpQkMsT0FBeUIsRUFBRTtRQUNsREEsUUFBUUMsaUJBQWlCLENBQUNDLGdDQUFlO0lBQzFDO0lBRWdCQyxnQkFBZ0JDLE9BQWdDLEVBQUU7UUFDakUsT0FBT0Msc0JBQWdCLENBQUNDLE1BQU0sQ0FBQztZQUFFQyxZQUFZSCxRQUFRRyxVQUFVO1FBQUM7SUFDakU7QUFDRCJ9
|
|
@@ -9,10 +9,13 @@ Object.defineProperty(exports, "HotReloadServer", {
|
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
11
|
const _nodeevents = require("node:events");
|
|
12
|
+
const _nodemodule = require("node:module");
|
|
12
13
|
const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
|
|
14
|
+
const _forge = require("@decohere/forge");
|
|
15
|
+
const _mesh = require("@decohere/mesh");
|
|
13
16
|
const _io = require("@decohere/nexus/io");
|
|
14
17
|
const _system = require("@decohere/nexus/system");
|
|
15
|
-
const
|
|
18
|
+
const _scribe = require("@decohere/scribe");
|
|
16
19
|
function _interop_require_default(obj) {
|
|
17
20
|
return obj && obj.__esModule ? obj : {
|
|
18
21
|
default: obj
|
|
@@ -60,79 +63,257 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
60
63
|
return newObj;
|
|
61
64
|
}
|
|
62
65
|
const currentFilePath = _io.io.fileUrlToPath(require("url").pathToFileURL(__filename).toString());
|
|
66
|
+
const VERSION_URL_PARAM = "version";
|
|
67
|
+
const REBOOT_DEBOUNCE_MS = 250;
|
|
63
68
|
class HotReloadServer extends _nodeevents.EventEmitter {
|
|
64
|
-
|
|
69
|
+
// ── State ────────────────────────────────────────────────────────────────
|
|
70
|
+
logger = _scribe.scribe.logger(HotReloadServer.name);
|
|
65
71
|
disposed = false;
|
|
72
|
+
hooksRegistered = false;
|
|
73
|
+
entryModulePath;
|
|
66
74
|
entryModule;
|
|
67
|
-
|
|
68
|
-
|
|
75
|
+
workspace;
|
|
76
|
+
buildConfig = "debug";
|
|
77
|
+
watchSubscription;
|
|
78
|
+
/** Map from absolute .ts source file path to project info */ fileInfoMap = new Map();
|
|
69
79
|
moduleCache = new Map();
|
|
70
80
|
dependencies = new Map();
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
this.
|
|
78
|
-
this.
|
|
79
|
-
|
|
81
|
+
transpileCache = new Map();
|
|
82
|
+
transpiler = new _forge.SwcTranspiler();
|
|
83
|
+
// ── Public API ───────────────────────────────────────────────────────────
|
|
84
|
+
async start(options) {
|
|
85
|
+
this.disposed = false;
|
|
86
|
+
this.dependencies.clear();
|
|
87
|
+
this.moduleCache.clear();
|
|
88
|
+
this.transpileCache.clear();
|
|
89
|
+
const { buildConfig } = options;
|
|
90
|
+
this.buildConfig = buildConfig;
|
|
91
|
+
this.workspace = await this.resolveWorkspace(options);
|
|
92
|
+
const project = this.resolveProject(buildConfig, options.project);
|
|
93
|
+
this.entryModulePath = _nodepath.default.resolve(project.getSourceEntryPath());
|
|
94
|
+
this.fileInfoMap = await this.buildFileInfoMap(buildConfig);
|
|
95
|
+
this.registerHooks();
|
|
80
96
|
this.invalidateAllSourceFiles();
|
|
81
|
-
await this.watch(
|
|
82
|
-
this.
|
|
83
|
-
this.logger.trace(
|
|
97
|
+
await this.workspace.watch(buildConfig);
|
|
98
|
+
this.watchSubscription = this.workspace.projectFileChanged$.subscribe(this.onFileChange);
|
|
99
|
+
this.logger.trace(`Serving ${this.entryModulePath}`);
|
|
84
100
|
await this.bootEntry();
|
|
101
|
+
this.emit("start");
|
|
85
102
|
}
|
|
86
103
|
async dispose() {
|
|
87
104
|
if (this.disposed) return;
|
|
88
105
|
this.disposed = true;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
106
|
+
this.watchSubscription?.unsubscribe();
|
|
107
|
+
this.workspace?.[Symbol.dispose]();
|
|
108
|
+
await this.disposeEntry();
|
|
109
|
+
}
|
|
110
|
+
async [Symbol.asyncDispose]() {
|
|
111
|
+
await this.dispose();
|
|
112
|
+
}
|
|
113
|
+
// ── Lifecycle ────────────────────────────────────────────────────────────
|
|
114
|
+
async bootEntry() {
|
|
115
|
+
try {
|
|
116
|
+
const url = this.versionModule(_io.io.pathToFileUrl(this.entryModulePath));
|
|
117
|
+
this.entryModule = (await Promise.resolve(url).then((p)=>/*#__PURE__*/ _interop_require_wildcard(require(p))))?.default;
|
|
118
|
+
} catch (error) {
|
|
119
|
+
this.logger.error("There was an error booting the entry point. Your application may not function as expected", error);
|
|
92
120
|
}
|
|
121
|
+
}
|
|
122
|
+
async reboot() {
|
|
123
|
+
this.logger.trace("Rebooting entry module");
|
|
93
124
|
await this.disposeEntry();
|
|
125
|
+
this.emit("reboot");
|
|
126
|
+
await this.bootEntry();
|
|
94
127
|
}
|
|
95
|
-
|
|
96
|
-
|
|
128
|
+
async disposeEntry() {
|
|
129
|
+
await this.entryModule?.[Symbol.asyncDispose]();
|
|
97
130
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
return
|
|
131
|
+
scheduleReboot = (0, _system.debounce)(()=>this.reboot(), REBOOT_DEBOUNCE_MS);
|
|
132
|
+
// ── Setup ────────────────────────────────────────────────────────────────
|
|
133
|
+
async resolveWorkspace(options) {
|
|
134
|
+
return options.workspace ?? _mesh.WorkspaceFactory.create({
|
|
135
|
+
..._forge.WorkspaceDefaults,
|
|
136
|
+
rootDir: process.cwd()
|
|
137
|
+
});
|
|
102
138
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
(0
|
|
139
|
+
resolveProject(buildConfig, name) {
|
|
140
|
+
const projects = this.workspace?.getProjects(buildConfig) ?? [];
|
|
141
|
+
const found = name == null ? projects.at(0) : projects.find((p)=>p.name === name);
|
|
142
|
+
if (found == null) {
|
|
143
|
+
throw new Error(name == null ? `No projects found for configuration: ${buildConfig}` : `Project "${name}" not found in workspace`);
|
|
144
|
+
}
|
|
145
|
+
return found;
|
|
146
|
+
}
|
|
147
|
+
async buildFileInfoMap(buildConfig) {
|
|
148
|
+
const projects = this.workspace?.getProjects(buildConfig) ?? [];
|
|
149
|
+
const entries = await Promise.all(projects.map(async (project)=>{
|
|
150
|
+
const files = await project.getAllFiles();
|
|
151
|
+
return files.map((file)=>[
|
|
152
|
+
file.fullPath,
|
|
153
|
+
{
|
|
154
|
+
project
|
|
155
|
+
}
|
|
156
|
+
]);
|
|
157
|
+
}));
|
|
158
|
+
return new Map(entries.flat());
|
|
106
159
|
}
|
|
107
|
-
|
|
160
|
+
registerHooks() {
|
|
161
|
+
if (this.hooksRegistered) return;
|
|
162
|
+
this.hooksRegistered = true;
|
|
163
|
+
(0, _nodemodule.registerHooks)({
|
|
164
|
+
resolve: (specifier, context, next)=>{
|
|
165
|
+
if (this.disposed) return next(specifier, context);
|
|
166
|
+
const parentUrl = context.parentURL ?? "";
|
|
167
|
+
const rewritten = this.rewriteJsToTs(specifier, parentUrl) ?? specifier;
|
|
168
|
+
const result = next(rewritten, context);
|
|
169
|
+
this.onPostResolve(result, parentUrl);
|
|
170
|
+
return result;
|
|
171
|
+
},
|
|
172
|
+
load: (url, context, next)=>{
|
|
173
|
+
if (this.disposed) return next(url, context);
|
|
174
|
+
const result = this.loadTs(url);
|
|
175
|
+
if (result != null) return {
|
|
176
|
+
format: "module",
|
|
177
|
+
source: result.source,
|
|
178
|
+
shortCircuit: true
|
|
179
|
+
};
|
|
180
|
+
return next(url, context);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
// ── Module hooks ─────────────────────────────────────────────────────────
|
|
185
|
+
/**
|
|
186
|
+
* Pre-next specifier rewriter: if specifier is a .js import that maps to a
|
|
187
|
+
* known .ts source file, returns the versioned .ts file URL so next() never
|
|
188
|
+
* tries to load a non-existent .js file from disk.
|
|
189
|
+
*/ rewriteJsToTs = (specifier, parentUrl)=>{
|
|
190
|
+
if (!specifier.endsWith(".js")) return null;
|
|
191
|
+
const parentClean = parentUrl.split("?")[0];
|
|
192
|
+
if (!parentClean) return null;
|
|
193
|
+
let jsPath;
|
|
194
|
+
try {
|
|
195
|
+
const resolved = new URL(specifier, parentClean);
|
|
196
|
+
jsPath = _io.io.fileUrlToPath(resolved.toString());
|
|
197
|
+
} catch {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
if (!jsPath.endsWith(".js")) return null;
|
|
201
|
+
const tsPath = jsPath.replace(/\.js$/, ".ts");
|
|
202
|
+
if (!this.fileInfoMap.has(tsPath)) return null;
|
|
203
|
+
return this.getCachedOrNew(_io.io.pathToFileUrl(tsPath));
|
|
204
|
+
};
|
|
205
|
+
/**
|
|
206
|
+
* Post-next dependency tracker: records which source files import which
|
|
207
|
+
* other source files so that reloadIfAffected can traverse the graph.
|
|
208
|
+
*/ onPostResolve = (result, parentUrl)=>{
|
|
108
209
|
const { url } = result;
|
|
109
210
|
const parentUrlClean = parentUrl.split("?")[0];
|
|
110
|
-
|
|
111
|
-
|
|
211
|
+
let filePath;
|
|
212
|
+
let parentPath;
|
|
213
|
+
try {
|
|
214
|
+
const urlObj = new URL(url);
|
|
215
|
+
urlObj.search = "";
|
|
216
|
+
filePath = _io.io.fileUrlToPath(urlObj.toString());
|
|
217
|
+
} catch {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
parentPath = _io.io.fileUrlToPath(parentUrlClean);
|
|
222
|
+
} catch {
|
|
223
|
+
parentPath = "";
|
|
224
|
+
}
|
|
225
|
+
const isSource = this.fileInfoMap.has(filePath);
|
|
226
|
+
const parentIsSource = this.fileInfoMap.has(parentPath);
|
|
112
227
|
if (isSource || parentIsSource) {
|
|
113
|
-
this.trackDependency(
|
|
228
|
+
this.trackDependency(filePath, parentPath);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
loadTs = (url)=>{
|
|
232
|
+
if (!url.startsWith("file:")) return null;
|
|
233
|
+
const cleanPath = new URL(url).pathname;
|
|
234
|
+
const fileInfo = this.fileInfoMap.get(cleanPath);
|
|
235
|
+
if (fileInfo == null) return null;
|
|
236
|
+
const cached = this.transpileCache.get(cleanPath);
|
|
237
|
+
if (cached != null) return {
|
|
238
|
+
source: cached
|
|
239
|
+
};
|
|
240
|
+
const { project } = fileInfo;
|
|
241
|
+
const tsConfig = project.getTsConfigSync();
|
|
242
|
+
const userConfig = project.getSwcConfigSync();
|
|
243
|
+
const file = new _io.FileEx({
|
|
244
|
+
fullPath: cleanPath
|
|
245
|
+
});
|
|
246
|
+
const response = this.transpiler.transformFileSync(file, _forge.BuildTargets.es6, {
|
|
247
|
+
tsConfig,
|
|
248
|
+
aliasPaths: true,
|
|
249
|
+
userConfig,
|
|
250
|
+
workspace: this.workspace,
|
|
251
|
+
projects: this.workspace?.getProjects(this.buildConfig)
|
|
252
|
+
});
|
|
253
|
+
if (response.outcome !== "success") {
|
|
254
|
+
this.logger.error(`Failed to transpile ${cleanPath}`, response);
|
|
255
|
+
return null;
|
|
114
256
|
}
|
|
115
|
-
|
|
257
|
+
this.transpileCache.set(cleanPath, response.code);
|
|
258
|
+
return {
|
|
259
|
+
source: response.code
|
|
260
|
+
};
|
|
261
|
+
};
|
|
262
|
+
// ── File watching ────────────────────────────────────────────────────────
|
|
263
|
+
onFileChange = (evt)=>{
|
|
264
|
+
const { file, eventName, project } = evt;
|
|
265
|
+
const fullPath = file.fullPath;
|
|
266
|
+
this.logger.trace(`File ${eventName}: ${fullPath}`);
|
|
267
|
+
if (eventName === _io.io.WatchEvents.unlink) {
|
|
268
|
+
this.fileInfoMap.delete(fullPath);
|
|
116
269
|
return;
|
|
117
270
|
}
|
|
118
|
-
|
|
271
|
+
if (eventName === _io.io.WatchEvents.add) {
|
|
272
|
+
if (project.isSourceFile(file)) {
|
|
273
|
+
this.fileInfoMap.set(fullPath, {
|
|
274
|
+
project
|
|
275
|
+
});
|
|
276
|
+
this.moduleCache.set(fullPath, null);
|
|
277
|
+
this.reloadIfAffected(fullPath);
|
|
278
|
+
}
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
// change
|
|
282
|
+
if (!project.isSourceFile(file)) return;
|
|
283
|
+
this.transpileCache.delete(fullPath);
|
|
284
|
+
this.transpiler.invalidateContentCache(new _io.FileEx({
|
|
285
|
+
fullPath
|
|
286
|
+
}));
|
|
287
|
+
this.reloadIfAffected(fullPath);
|
|
119
288
|
};
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
|
|
289
|
+
reloadIfAffected(fullPath) {
|
|
290
|
+
const deps = this.getDependencyGraph(fullPath);
|
|
291
|
+
const modules = [
|
|
292
|
+
...new Set([
|
|
293
|
+
...deps,
|
|
294
|
+
fullPath
|
|
295
|
+
])
|
|
296
|
+
];
|
|
297
|
+
if (!modules.includes(this.entryModulePath)) {
|
|
298
|
+
this.logger.trace(`Change in ${fullPath} does not affect entry — skipping reload`);
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
this.logger.trace(`Change in ${fullPath} affects ${modules.length} module(s) — scheduling reload`);
|
|
302
|
+
this.invalidateModule(...modules);
|
|
303
|
+
this.scheduleReboot();
|
|
304
|
+
return true;
|
|
123
305
|
}
|
|
306
|
+
// ── Dependency graph ─────────────────────────────────────────────────────
|
|
124
307
|
getDependencyGraph(moduleId, parentModules = []) {
|
|
125
|
-
if (this.isSelf(moduleId))
|
|
126
|
-
return [];
|
|
127
|
-
}
|
|
308
|
+
if (this.isSelf(moduleId)) return [];
|
|
128
309
|
const moduleDeps = this.dependencies.get(moduleId) ?? [];
|
|
129
310
|
if (parentModules.includes(moduleId)) {
|
|
130
311
|
this.logger.error(`Circular reference detected: ${moduleId}`);
|
|
131
312
|
return [];
|
|
132
313
|
}
|
|
133
|
-
let subDeps =
|
|
314
|
+
let subDeps = [];
|
|
134
315
|
for (const dep of moduleDeps){
|
|
135
|
-
if (!this.
|
|
316
|
+
if (!this.fileInfoMap.has(dep)) continue;
|
|
136
317
|
const subs = this.getDependencyGraph(dep, [
|
|
137
318
|
moduleId,
|
|
138
319
|
...parentModules
|
|
@@ -149,9 +330,8 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
149
330
|
])
|
|
150
331
|
];
|
|
151
332
|
}
|
|
152
|
-
trackDependency(
|
|
153
|
-
|
|
154
|
-
const parentPath = _io.io.fileUrlToPath(parentUrl.split("?")[0]);
|
|
333
|
+
trackDependency(filePath, parentPath) {
|
|
334
|
+
if (!parentPath) return;
|
|
155
335
|
const deps = this.dependencies.get(filePath) ?? [];
|
|
156
336
|
const updatedDeps = new Set([
|
|
157
337
|
...deps,
|
|
@@ -161,6 +341,7 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
161
341
|
...updatedDeps
|
|
162
342
|
]);
|
|
163
343
|
}
|
|
344
|
+
// ── Module cache ─────────────────────────────────────────────────────────
|
|
164
345
|
getCachedOrNew(moduleUrl) {
|
|
165
346
|
const filePath = _io.io.fileUrlToPath(moduleUrl);
|
|
166
347
|
const cached = this.moduleCache.get(filePath);
|
|
@@ -170,88 +351,33 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
170
351
|
}
|
|
171
352
|
versionModule(moduleUrl) {
|
|
172
353
|
const versionedUrl = new URL(moduleUrl);
|
|
173
|
-
versionedUrl.searchParams.set(
|
|
354
|
+
versionedUrl.searchParams.set(VERSION_URL_PARAM, Date.now().toString());
|
|
174
355
|
return versionedUrl.toString();
|
|
175
356
|
}
|
|
176
|
-
|
|
177
|
-
for (const dir of dirs){
|
|
178
|
-
const watcher = _io.io.watch(dir, {
|
|
179
|
-
include: [
|
|
180
|
-
"**/*.js"
|
|
181
|
-
],
|
|
182
|
-
ignoreInitial: true
|
|
183
|
-
});
|
|
184
|
-
watcher.on("add", this.onFileAdded).on("change", this.onSourceFileChanged).on("unlink", this.onFileDeleted);
|
|
185
|
-
this.watchers.push(watcher);
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
onFileAdded = async ({ fullPath })=>{
|
|
189
|
-
this.sourceFiles.push(fullPath);
|
|
190
|
-
this.moduleCache.set(fullPath, null);
|
|
191
|
-
this.reloadIfAffected(fullPath);
|
|
192
|
-
};
|
|
193
|
-
onSourceFileChanged = async ({ fullPath })=>{
|
|
194
|
-
if (!this.reloadIfAffected(fullPath)) {
|
|
195
|
-
this.logger.trace(`${fullPath} is not part of the current dependency graph. Not reloading entry.`);
|
|
196
|
-
}
|
|
197
|
-
};
|
|
198
|
-
onFileDeleted = async ({ fullPath })=>{
|
|
199
|
-
this.removeSourceFiles(fullPath);
|
|
200
|
-
};
|
|
201
|
-
reloadIfAffected(fullPath) {
|
|
202
|
-
const deps = this.getDependencyGraph(fullPath);
|
|
203
|
-
const modules = [
|
|
204
|
-
...new Set([
|
|
205
|
-
...deps,
|
|
206
|
-
fullPath
|
|
207
|
-
])
|
|
208
|
-
];
|
|
209
|
-
if (!modules.includes(this.entryModule)) {
|
|
210
|
-
return false;
|
|
211
|
-
}
|
|
212
|
-
this.invlidateModule(...modules);
|
|
213
|
-
this.disposeAndBoot();
|
|
214
|
-
return true;
|
|
215
|
-
}
|
|
216
|
-
isSelf(urlLike) {
|
|
217
|
-
return currentFilePath === _nodepath.default.resolve(_io.io.fileUrlToPath(urlLike));
|
|
218
|
-
}
|
|
219
|
-
invlidateModule(...modules) {
|
|
357
|
+
invalidateModule(...modules) {
|
|
220
358
|
for (const module of modules){
|
|
221
359
|
this.moduleCache.set(module, null);
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
360
|
+
this.transpileCache.delete(module);
|
|
361
|
+
// Prune stale outgoing edges: remove this module as a parent from all dependency lists
|
|
362
|
+
for (const [key, parents] of this.dependencies){
|
|
363
|
+
const filtered = parents.filter((p)=>p !== module);
|
|
364
|
+
if (filtered.length === 0) {
|
|
365
|
+
this.dependencies.delete(key);
|
|
366
|
+
} else {
|
|
367
|
+
this.dependencies.set(key, filtered);
|
|
368
|
+
}
|
|
231
369
|
}
|
|
232
370
|
}
|
|
233
371
|
}
|
|
234
372
|
invalidateAllSourceFiles() {
|
|
235
|
-
for (const
|
|
236
|
-
this.moduleCache.set(
|
|
373
|
+
for (const filePath of this.fileInfoMap.keys()){
|
|
374
|
+
this.moduleCache.set(filePath, null);
|
|
237
375
|
}
|
|
238
376
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}, 250);
|
|
243
|
-
async disposeEntry() {
|
|
244
|
-
await this.entry?.[Symbol.asyncDispose]();
|
|
245
|
-
}
|
|
246
|
-
async bootEntry() {
|
|
247
|
-
try {
|
|
248
|
-
const version = this.versionModule(_io.io.pathToFileUrl(this.entryModule));
|
|
249
|
-
this.entry = (await Promise.resolve(version).then((p)=>/*#__PURE__*/ _interop_require_wildcard(require(p))))?.default;
|
|
250
|
-
this.emit("reboot");
|
|
251
|
-
} catch (error) {
|
|
252
|
-
this.logger.error(`There was an error booting the entry point. Your application may not function as expected`, error);
|
|
253
|
-
}
|
|
377
|
+
// ── Utilities ────────────────────────────────────────────────────────────
|
|
378
|
+
isSelf(filePath) {
|
|
379
|
+
return currentFilePath === _nodepath.default.resolve(filePath);
|
|
254
380
|
}
|
|
255
381
|
}
|
|
256
382
|
|
|
257
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHR5cGUgRmlsZSwgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvc3lzdGVtXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgeyBhZGRSZXNvbHZlckhvb2ssIGluaXRNb2R1bGVIb29rcywgcmVtb3ZlUmVzb2x2ZXJIb29rIH0gZnJvbSBcIi4vaG90LW1vZHVsZS1ob29rcy5qc1wiO1xuXG5jb25zdCBjdXJyZW50RmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0cmVib290OiBbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGVudHJ5TW9kdWxlOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnk6IEFzeW5jRGlzcG9zYWJsZTtcblx0cHJpdmF0ZSBzb3VyY2VGaWxlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSBtb2R1bGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigpO1xuXHRwcml2YXRlIGRlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblx0cHJpdmF0ZSB3YXRjaGVyczogUmV0dXJuVHlwZTx0eXBlb2YgaW8ud2F0Y2g+W10gPSBbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IobG9nZ2VyOiBMb2dnZXIpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHN0YXJ0KGVudHJ5OiBzdHJpbmcsIC4uLndhdGNoRGlyczogc3RyaW5nW10pIHtcblx0XHR0aGlzLmVudHJ5TW9kdWxlID0gZW50cnk7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0U291cmNlRmlsZXMod2F0Y2hEaXJzKTtcblx0XHR0aGlzLmNvbmZpZ3VyZU1vZHVsZUhvb2tzKCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKTtcblx0XHRhd2FpdCB0aGlzLndhdGNoKHdhdGNoRGlycyk7XG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoXCJTZXJ2aW5nXCIsIGVudHJ5KTtcblx0XHR0aGlzLmxvZ2dlci50cmFjZShcIkhvdCByZWxvYWQgd2F0Y2hpbmdcIiwgd2F0Y2hEaXJzKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHRyZW1vdmVSZXNvbHZlckhvb2sodGhpcy5vblJlc29sdmUpO1xuXHRcdGZvciAoY29uc3Qgd2F0Y2hlciBvZiB0aGlzLndhdGNoZXJzKSB7XG5cdFx0XHR3YXRjaGVyLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJ5KCk7XG5cdH1cblxuXHRwcml2YXRlIHJlbW92ZVNvdXJjZUZpbGVzKC4uLnNvdXJjZUZpbGVzOiBzdHJpbmdbXSkge1xuXHRcdHRoaXMuc291cmNlRmlsZXMgPSB0aGlzLnNvdXJjZUZpbGVzLmZpbHRlcihcblx0XHRcdChzb3VyY2VGaWxlKSA9PiAhc291cmNlRmlsZXMuaW5jbHVkZXMoc291cmNlRmlsZSksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0U291cmNlRmlsZXMoZGlyczogc3RyaW5nW10pIHtcblx0XHRjb25zdCBwYXR0ZXJucyA9IGRpcnMubWFwKChkaXIpID0+IGAke2Rpcn0vKiovKi5qc2ApO1xuXHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgaW8uZmluZEZpbGVzKHBhdHRlcm5zKTtcblx0XHRyZXR1cm4gZmlsZXMubWFwKChmKSA9PiBmLmZ1bGxQYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgY29uZmlndXJlTW9kdWxlSG9va3MoKSB7XG5cdFx0aW5pdE1vZHVsZUhvb2tzKCk7XG5cdFx0YWRkUmVzb2x2ZXJIb29rKHRoaXMub25SZXNvbHZlKTtcblx0fVxuXG5cdHByaXZhdGUgb25SZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZSh1cmwpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZShwYXJlbnRVcmxDbGVhbik7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KHVybCwgcGFyZW50VXJsKTtcblx0XHR9XG5cblx0XHRpZiAoIWlzU291cmNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmVzdWx0LnVybCA9IHRoaXMuZ2V0Q2FjaGVkT3JOZXcodXJsKTtcblx0fTtcblxuXHRwcml2YXRlIGlzU291cmNlTW9kdWxlKHVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhwYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzID0gQXJyYXkub2Y8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeSh1cmw6IHN0cmluZywgcGFyZW50VXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRjb25zdCBwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdKTtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRDYWNoZWRPck5ldyhtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChtb2R1bGVVcmwpO1xuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMubW9kdWxlQ2FjaGUuZ2V0KGZpbGVQYXRoKTtcblx0XHRjb25zdCB2ZXJzaW9uZWQgPSBjYWNoZWQgPz8gdGhpcy52ZXJzaW9uTW9kdWxlKG1vZHVsZVVybCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIHZlcnNpb25lZCk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZDtcblx0fVxuXG5cdHByaXZhdGUgdmVyc2lvbk1vZHVsZShtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IHZlcnNpb25lZFVybCA9IG5ldyBVUkwobW9kdWxlVXJsKTtcblx0XHR2ZXJzaW9uZWRVcmwuc2VhcmNoUGFyYW1zLnNldChcInZlcnNpb25cIiwgRGF0ZS5ub3coKS50b1N0cmluZygpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIHdhdGNoID0gYXN5bmMgKGRpcnM6IHN0cmluZ1tdKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuXHRcdFx0Y29uc3Qgd2F0Y2hlciA9IGlvLndhdGNoKGRpciwgeyBpbmNsdWRlOiBbXCIqKi8qLmpzXCJdLCBpZ25vcmVJbml0aWFsOiB0cnVlIH0pO1xuXHRcdFx0d2F0Y2hlclxuXHRcdFx0XHQub24oXCJhZGRcIiwgdGhpcy5vbkZpbGVBZGRlZClcblx0XHRcdFx0Lm9uKFwiY2hhbmdlXCIsIHRoaXMub25Tb3VyY2VGaWxlQ2hhbmdlZClcblx0XHRcdFx0Lm9uKFwidW5saW5rXCIsIHRoaXMub25GaWxlRGVsZXRlZCk7XG5cdFx0XHR0aGlzLndhdGNoZXJzLnB1c2god2F0Y2hlcik7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlQWRkZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIG9uU291cmNlRmlsZUNoYW5nZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0aWYgKCF0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdFx0YCR7ZnVsbFBhdGh9IGlzIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IGRlcGVuZGVuY3kgZ3JhcGguIE5vdCByZWxvYWRpbmcgZW50cnkuYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlRGVsZXRlZCA9IGFzeW5jICh7IGZ1bGxQYXRoIH06IEZpbGUpID0+IHtcblx0XHR0aGlzLnJlbW92ZVNvdXJjZUZpbGVzKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXMpO1xuXHRcdHRoaXMuZGlzcG9zZUFuZEJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHByaXZhdGUgaXNTZWxmKHVybExpa2U6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShpby5maWxlVXJsVG9QYXRoKHVybExpa2UpKTtcblx0fVxuXG5cdHByaXZhdGUgaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHR9XG5cdFx0Ly8gUHJ1bmUgaW52YWxpZGF0ZWQgbW9kdWxlcyBmcm9tIGFsbCBwYXJlbnQgbGlzdHMgc28gc3RhbGUgcmVsYXRpb25zaGlwc1xuXHRcdC8vIGFyZSBjbGVhcmVkLiBUaGUgZnJlc2ggYm9vdCByZWJ1aWxkcyBvbmx5IHdoYXQgaXMgYWN0dWFsbHkgaW1wb3J0ZWQuXG5cdFx0Zm9yIChjb25zdCBbY2hpbGQsIHBhcmVudHNdIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG5cdFx0XHRjb25zdCBwcnVuZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gIW1vZHVsZXMuaW5jbHVkZXMocCkpO1xuXHRcdFx0aWYgKHBydW5lZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGNoaWxkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChjaGlsZCwgcHJ1bmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpIHtcblx0XHRmb3IgKGNvbnN0IGZpbGUgb2YgdGhpcy5zb3VyY2VGaWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZSwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBkaXNwb3NlQW5kQm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdH0sIDI1MCk7XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cnkoKSB7XG5cdFx0YXdhaXQgdGhpcy5lbnRyeT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeSgpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdmVyc2lvbiA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGUpKTtcblx0XHRcdHRoaXMuZW50cnkgPSAoYXdhaXQgaW1wb3J0KHZlcnNpb24pKT8uZGVmYXVsdDtcblx0XHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdGBUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZGAsXG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJIb3RSZWxvYWRTZXJ2ZXIiLCJjdXJyZW50RmlsZVBhdGgiLCJpbyIsImZpbGVVcmxUb1BhdGgiLCJFdmVudEVtaXR0ZXIiLCJsb2dnZXIiLCJkaXNwb3NlZCIsImVudHJ5TW9kdWxlIiwiZW50cnkiLCJzb3VyY2VGaWxlcyIsIm1vZHVsZUNhY2hlIiwiTWFwIiwiZGVwZW5kZW5jaWVzIiwid2F0Y2hlcnMiLCJzdGFydCIsIndhdGNoRGlycyIsImdldFNvdXJjZUZpbGVzIiwiY29uZmlndXJlTW9kdWxlSG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInRyYWNlIiwiYm9vdEVudHJ5IiwiZGlzcG9zZSIsInJlbW92ZVJlc29sdmVySG9vayIsIm9uUmVzb2x2ZSIsIndhdGNoZXIiLCJjbG9zZSIsImRpc3Bvc2VFbnRyeSIsInJlbW92ZVNvdXJjZUZpbGVzIiwiZmlsdGVyIiwic291cmNlRmlsZSIsImluY2x1ZGVzIiwiZGlycyIsInBhdHRlcm5zIiwibWFwIiwiZGlyIiwiZmlsZXMiLCJmaW5kRmlsZXMiLCJmIiwiZnVsbFBhdGgiLCJpbml0TW9kdWxlSG9va3MiLCJhZGRSZXNvbHZlckhvb2siLCJyZXN1bHQiLCJwYXJlbnRVcmwiLCJ1cmwiLCJwYXJlbnRVcmxDbGVhbiIsInNwbGl0IiwiaXNTb3VyY2UiLCJpc1NvdXJjZU1vZHVsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZ2V0Q2FjaGVkT3JOZXciLCJwYXRoIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsImdldCIsImVycm9yIiwic3ViRGVwcyIsIkFycmF5Iiwib2YiLCJkZXAiLCJzdWJzIiwiU2V0IiwiZmlsZVBhdGgiLCJwYXJlbnRQYXRoIiwiZGVwcyIsInVwZGF0ZWREZXBzIiwic2V0IiwibW9kdWxlVXJsIiwiY2FjaGVkIiwidmVyc2lvbmVkIiwidmVyc2lvbk1vZHVsZSIsInZlcnNpb25lZFVybCIsIlVSTCIsInNlYXJjaFBhcmFtcyIsIkRhdGUiLCJub3ciLCJ0b1N0cmluZyIsImluY2x1ZGUiLCJpZ25vcmVJbml0aWFsIiwib24iLCJvbkZpbGVBZGRlZCIsIm9uU291cmNlRmlsZUNoYW5nZWQiLCJvbkZpbGVEZWxldGVkIiwicHVzaCIsInJlbG9hZElmQWZmZWN0ZWQiLCJtb2R1bGVzIiwiaW52bGlkYXRlTW9kdWxlIiwiZGlzcG9zZUFuZEJvb3QiLCJ1cmxMaWtlIiwicmVzb2x2ZSIsIm1vZHVsZSIsImNoaWxkIiwicGFyZW50cyIsInBydW5lZCIsInAiLCJsZW5ndGgiLCJkZWxldGUiLCJmaWxlIiwiZGVib3VuY2UiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJ2ZXJzaW9uIiwicGF0aFRvRmlsZVVybCIsImRlZmF1bHQiLCJlbWl0Il0sIm1hcHBpbmdzIjoiOzs7OytCQWNhQTs7O2VBQUFBOzs7NEJBZGdCO2lFQUVaO29CQUNhO3dCQUNMO2dDQUU0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFckUsTUFBTUMsa0JBQWtCQyxNQUFFLENBQUNDLGFBQWEsQ0FBQztBQU1sQyxNQUFNSCx3QkFBd0JJLHdCQUFZO0lBQy9CQyxPQUFlO0lBQ3hCQyxXQUFXLE1BQU07SUFDakJDLFlBQW9CO0lBQ3BCQyxNQUF1QjtJQUN2QkMsY0FBd0IsRUFBRSxDQUFDO0lBQzNCQyxjQUFjLElBQUlDLE1BQTZCO0lBQy9DQyxlQUFlLElBQUlELE1BQXdCO0lBQzNDRSxXQUEwQyxFQUFFLENBQUM7SUFFckQsWUFBbUJSLE1BQWMsQ0FBRTtRQUNsQyxLQUFLO1FBQ0wsSUFBSSxDQUFDQSxNQUFNLEdBQUdBO0lBQ2Y7SUFFQSxNQUFhUyxNQUFNTixLQUFhLEVBQUUsR0FBR08sU0FBbUIsRUFBRTtRQUN6RCxJQUFJLENBQUNSLFdBQVcsR0FBR0M7UUFDbkIsSUFBSSxDQUFDQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNPLGNBQWMsQ0FBQ0Q7UUFDN0MsSUFBSSxDQUFDRSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDQyx3QkFBd0I7UUFDN0IsTUFBTSxJQUFJLENBQUNDLEtBQUssQ0FBQ0o7UUFDakIsSUFBSSxDQUFDVixNQUFNLENBQUNlLEtBQUss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
|
|
383
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBXb3Jrc3BhY2VGYWN0b3J5IH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBGaWxlRXgsIGlvIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL3N5c3RlbVwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgdHlwZSB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbnR5cGUgTG9hZERlbGVnYXRlID0gKHVybDogc3RyaW5nKSA9PiB7IHNvdXJjZTogc3RyaW5nIH0gfCBudWxsO1xuXG5jb25zdCBjdXJyZW50RmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBWRVJTSU9OX1VSTF9QQVJBTSA9IFwidmVyc2lvblwiO1xuY29uc3QgUkVCT09UX0RFQk9VTkNFX01TID0gMjUwO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlckV2ZW50cyB7XG5cdHN0YXJ0OiBbXTtcblx0cmVib290OiBbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zIHtcblx0LyoqIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbmFtZS4gKi9cblx0YnVpbGRDb25maWc6IHN0cmluZztcblx0LyoqIE5hbWUgb2YgdGhlIHByb2plY3QgdG8gc2VydmUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UuICovXG5cdHByb2plY3Q/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBQcmUtYnVpbHQgV29ya3NwYWNlIGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgV29ya3NwYWNlRmFjdG9yeS5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIGJ5cGFzcyBmaWxlc3lzdGVtLWJhc2VkIHdvcmtzcGFjZSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG59XG5cbnR5cGUgRmlsZUluZm8gPSB7IHByb2plY3Q6IFByb2plY3QgfTtcblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0Ly8g4pSA4pSAIFN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXHRwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihIb3RSZWxvYWRTZXJ2ZXIubmFtZSk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBob29rc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBlbnRyeU1vZHVsZVBhdGghOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnlNb2R1bGU/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdHByaXZhdGUgd29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHRwcml2YXRlIGJ1aWxkQ29uZmlnID0gXCJkZWJ1Z1wiO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHQvKiogTWFwIGZyb20gYWJzb2x1dGUgLnRzIHNvdXJjZSBmaWxlIHBhdGggdG8gcHJvamVjdCBpbmZvICovXG5cdHByaXZhdGUgZmlsZUluZm9NYXAgPSBuZXcgTWFwPHN0cmluZywgRmlsZUluZm8+KCk7XG5cdHByaXZhdGUgbW9kdWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblx0cHJpdmF0ZSBkZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cdHByaXZhdGUgdHJhbnNwaWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZXIgPSBuZXcgU3djVHJhbnNwaWxlcigpO1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuY2xlYXIoKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cdFx0dGhpcy5idWlsZENvbmZpZyA9IGJ1aWxkQ29uZmlnO1xuXHRcdHRoaXMud29ya3NwYWNlID0gYXdhaXQgdGhpcy5yZXNvbHZlV29ya3NwYWNlKG9wdGlvbnMpO1xuXHRcdGNvbnN0IHByb2plY3QgPSB0aGlzLnJlc29sdmVQcm9qZWN0KGJ1aWxkQ29uZmlnLCBvcHRpb25zLnByb2plY3QpO1xuXG5cdFx0dGhpcy5lbnRyeU1vZHVsZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5nZXRTb3VyY2VFbnRyeVBhdGgoKSk7XG5cdFx0dGhpcy5maWxlSW5mb01hcCA9IGF3YWl0IHRoaXMuYnVpbGRGaWxlSW5mb01hcChidWlsZENvbmZpZyk7XG5cblx0XHR0aGlzLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgdGhpcy53b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLndvcmtzcGFjZS5wcm9qZWN0RmlsZUNoYW5nZWQkLnN1YnNjcmliZSh0aGlzLm9uRmlsZUNoYW5nZSk7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgU2VydmluZyAke3RoaXMuZW50cnlNb2R1bGVQYXRofWApO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdFx0dGhpcy5lbWl0KFwic3RhcnRcIik7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cdFx0dGhpcy53b3Jrc3BhY2U/LltTeW1ib2wuZGlzcG9zZV0oKTtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybCA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGVQYXRoKSk7XG5cdFx0XHR0aGlzLmVudHJ5TW9kdWxlID0gKGF3YWl0IGltcG9ydCh1cmwpKT8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcmVib290KCkge1xuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKFwiUmVib290aW5nIGVudHJ5IG1vZHVsZVwiKTtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cnkoKSB7XG5cdFx0YXdhaXQgdGhpcy5lbnRyeU1vZHVsZT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdH1cblxuXHRwcml2YXRlIHNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoKCkgPT4gdGhpcy5yZWJvb3QoKSwgUkVCT09UX0RFQk9VTkNFX01TKTtcblxuXHQvLyDilIDilIAgU2V0dXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyByZXNvbHZlV29ya3NwYWNlKG9wdGlvbnM6IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMpOiBQcm9taXNlPFdvcmtzcGFjZT4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRvcHRpb25zLndvcmtzcGFjZSA/P1xuXHRcdFx0V29ya3NwYWNlRmFjdG9yeS5jcmVhdGUoeyAuLi5Xb3Jrc3BhY2VEZWZhdWx0cywgcm9vdERpcjogcHJvY2Vzcy5jd2QoKSB9KVxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVQcm9qZWN0KGJ1aWxkQ29uZmlnOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcpOiBQcm9qZWN0IHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgZm91bmQgPSBuYW1lID09IG51bGwgPyBwcm9qZWN0cy5hdCgwKSA6IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0aWYgKGZvdW5kID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0bmFtZSA9PSBudWxsXG5cdFx0XHRcdFx0PyBgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YFxuXHRcdFx0XHRcdDogYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gZm91bmQ7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJ1aWxkRmlsZUluZm9NYXAoYnVpbGRDb25maWc6IHN0cmluZyk6IFByb21pc2U8TWFwPHN0cmluZywgRmlsZUluZm8+PiB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IGVudHJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHByb2plY3RzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCBmaWxlcyA9IGF3YWl0IHByb2plY3QuZ2V0QWxsRmlsZXMoKTtcblx0XHRcdFx0cmV0dXJuIGZpbGVzLm1hcCgoZmlsZSk6IFtzdHJpbmcsIEZpbGVJbmZvXSA9PiBbZmlsZS5mdWxsUGF0aCwgeyBwcm9qZWN0IH1dKTtcblx0XHRcdH0pLFxuXHRcdCk7XG5cdFx0cmV0dXJuIG5ldyBNYXAoZW50cmllcy5mbGF0KCkpO1xuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3Rlckhvb2tzKCkge1xuXHRcdGlmICh0aGlzLmhvb2tzUmVnaXN0ZXJlZCkgcmV0dXJuO1xuXHRcdHRoaXMuaG9va3NSZWdpc3RlcmVkID0gdHJ1ZTtcblx0XHRyZWdpc3Rlckhvb2tzKHtcblx0XHRcdHJlc29sdmU6IChcblx0XHRcdFx0c3BlY2lmaWVyOiBzdHJpbmcsXG5cdFx0XHRcdGNvbnRleHQ6IFJlc29sdmVIb29rQ29udGV4dCxcblx0XHRcdFx0bmV4dDogKHNwZWNpZmllcjogc3RyaW5nLCBjb250ZXh0PzogUGFydGlhbDxSZXNvbHZlSG9va0NvbnRleHQ+KSA9PiBSZXNvbHZlRm5PdXRwdXQsXG5cdFx0XHQpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybiBuZXh0KHNwZWNpZmllciwgY29udGV4dCk7XG5cdFx0XHRcdGNvbnN0IHBhcmVudFVybCA9IGNvbnRleHQucGFyZW50VVJMID8/IFwiXCI7XG5cdFx0XHRcdGNvbnN0IHJld3JpdHRlbiA9IHRoaXMucmV3cml0ZUpzVG9UcyhzcGVjaWZpZXIsIHBhcmVudFVybCkgPz8gc3BlY2lmaWVyO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBuZXh0KHJld3JpdHRlbiwgY29udGV4dCkgYXMgUmVzb2x2ZUZuT3V0cHV0O1xuXHRcdFx0XHR0aGlzLm9uUG9zdFJlc29sdmUocmVzdWx0LCBwYXJlbnRVcmwpO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGxvYWQ6IChcblx0XHRcdFx0dXJsOiBzdHJpbmcsXG5cdFx0XHRcdGNvbnRleHQ6IExvYWRIb29rQ29udGV4dCxcblx0XHRcdFx0bmV4dDogKHVybDogc3RyaW5nLCBjb250ZXh0PzogUGFydGlhbDxMb2FkSG9va0NvbnRleHQ+KSA9PiBMb2FkRm5PdXRwdXQsXG5cdFx0XHQpOiBMb2FkRm5PdXRwdXQgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuIG5leHQodXJsLCBjb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5sb2FkVHModXJsKTtcblx0XHRcdFx0aWYgKHJlc3VsdCAhPSBudWxsKVxuXHRcdFx0XHRcdHJldHVybiB7IGZvcm1hdDogXCJtb2R1bGVcIiwgc291cmNlOiByZXN1bHQuc291cmNlLCBzaG9ydENpcmN1aXQ6IHRydWUgfTtcblx0XHRcdFx0cmV0dXJuIG5leHQodXJsLCBjb250ZXh0KTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGhvb2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdC8qKlxuXHQgKiBQcmUtbmV4dCBzcGVjaWZpZXIgcmV3cml0ZXI6IGlmIHNwZWNpZmllciBpcyBhIC5qcyBpbXBvcnQgdGhhdCBtYXBzIHRvIGFcblx0ICoga25vd24gLnRzIHNvdXJjZSBmaWxlLCByZXR1cm5zIHRoZSB2ZXJzaW9uZWQgLnRzIGZpbGUgVVJMIHNvIG5leHQoKSBuZXZlclxuXHQgKiB0cmllcyB0byBsb2FkIGEgbm9uLWV4aXN0ZW50IC5qcyBmaWxlIGZyb20gZGlzay5cblx0ICovXG5cdHByaXZhdGUgcmV3cml0ZUpzVG9UcyA9IChzcGVjaWZpZXI6IHN0cmluZywgcGFyZW50VXJsOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcblx0XHRpZiAoIXNwZWNpZmllci5lbmRzV2l0aChcIi5qc1wiKSkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBwYXJlbnRDbGVhbiA9IHBhcmVudFVybC5zcGxpdChcIj9cIilbMF07XG5cdFx0aWYgKCFwYXJlbnRDbGVhbikgcmV0dXJuIG51bGw7XG5cblx0XHRsZXQganNQYXRoOiBzdHJpbmc7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHJlc29sdmVkID0gbmV3IFVSTChzcGVjaWZpZXIsIHBhcmVudENsZWFuKTtcblx0XHRcdGpzUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgocmVzb2x2ZWQudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoIWpzUGF0aC5lbmRzV2l0aChcIi5qc1wiKSkgcmV0dXJuIG51bGw7XG5cdFx0Y29uc3QgdHNQYXRoID0ganNQYXRoLnJlcGxhY2UoL1xcLmpzJC8sIFwiLnRzXCIpO1xuXHRcdGlmICghdGhpcy5maWxlSW5mb01hcC5oYXModHNQYXRoKSkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRDYWNoZWRPck5ldyhpby5wYXRoVG9GaWxlVXJsKHRzUGF0aCkpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBQb3N0LW5leHQgZGVwZW5kZW5jeSB0cmFja2VyOiByZWNvcmRzIHdoaWNoIHNvdXJjZSBmaWxlcyBpbXBvcnQgd2hpY2hcblx0ICogb3RoZXIgc291cmNlIGZpbGVzIHNvIHRoYXQgcmVsb2FkSWZBZmZlY3RlZCBjYW4gdHJhdmVyc2UgdGhlIGdyYXBoLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBvc3RSZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0bGV0IGZpbGVQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IHBhcmVudFBhdGg6IHN0cmluZztcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cdFx0XHR1cmxPYmouc2VhcmNoID0gXCJcIjtcblx0XHRcdGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aCh1cmxPYmoudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHBhcmVudFBhdGggPSBpby5maWxlVXJsVG9QYXRoKHBhcmVudFVybENsZWFuKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcmVudFBhdGggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5maWxlSW5mb01hcC5oYXMoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5maWxlSW5mb01hcC5oYXMocGFyZW50UGF0aCk7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoLCBwYXJlbnRQYXRoKTtcblx0XHR9XG5cdH07XG5cblx0cHJpdmF0ZSBsb2FkVHM6IExvYWREZWxlZ2F0ZSA9ICh1cmw6IHN0cmluZykgPT4ge1xuXHRcdGlmICghdXJsLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjbGVhblBhdGggPSBuZXcgVVJMKHVybCkucGF0aG5hbWU7XG5cdFx0Y29uc3QgZmlsZUluZm8gPSB0aGlzLmZpbGVJbmZvTWFwLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChmaWxlSW5mbyA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMudHJhbnNwaWxlQ2FjaGUuZ2V0KGNsZWFuUGF0aCk7XG5cdFx0aWYgKGNhY2hlZCAhPSBudWxsKSByZXR1cm4geyBzb3VyY2U6IGNhY2hlZCB9O1xuXG5cdFx0Y29uc3QgeyBwcm9qZWN0IH0gPSBmaWxlSW5mbztcblx0XHRjb25zdCB0c0NvbmZpZyA9IHByb2plY3QuZ2V0VHNDb25maWdTeW5jKCk7XG5cdFx0Y29uc3QgdXNlckNvbmZpZyA9IHByb2plY3QuZ2V0U3djQ29uZmlnU3luYygpO1xuXG5cdFx0Y29uc3QgZmlsZSA9IG5ldyBGaWxlRXgoeyBmdWxsUGF0aDogY2xlYW5QYXRoIH0pO1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gdGhpcy50cmFuc3BpbGVyLnRyYW5zZm9ybUZpbGVTeW5jKGZpbGUsIEJ1aWxkVGFyZ2V0cy5lczYsIHtcblx0XHRcdHRzQ29uZmlnLFxuXHRcdFx0YWxpYXNQYXRoczogdHJ1ZSxcblx0XHRcdHVzZXJDb25maWcsXG5cdFx0XHR3b3Jrc3BhY2U6IHRoaXMud29ya3NwYWNlLFxuXHRcdFx0cHJvamVjdHM6IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyh0aGlzLmJ1aWxkQ29uZmlnKSxcblx0XHR9KTtcblxuXHRcdGlmIChyZXNwb25zZS5vdXRjb21lICE9PSBcInN1Y2Nlc3NcIikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB0cmFuc3BpbGUgJHtjbGVhblBhdGh9YCwgcmVzcG9uc2UpO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5zZXQoY2xlYW5QYXRoLCByZXNwb25zZS5jb2RlKTtcblx0XHRyZXR1cm4geyBzb3VyY2U6IHJlc3BvbnNlLmNvZGUgfTtcblx0fTtcblxuXHQvLyDilIDilIAgRmlsZSB3YXRjaGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIG9uRmlsZUNoYW5nZSA9IChldnQ6IFByb2plY3RGaWxlRXZlbnQpID0+IHtcblx0XHRjb25zdCB7IGZpbGUsIGV2ZW50TmFtZSwgcHJvamVjdCB9ID0gZXZ0O1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gZmlsZS5mdWxsUGF0aDtcblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBGaWxlICR7ZXZlbnROYW1lfTogJHtmdWxsUGF0aH1gKTtcblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLnVubGluaykge1xuXHRcdFx0dGhpcy5maWxlSW5mb01hcC5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLmFkZCkge1xuXHRcdFx0aWYgKHByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRcdHRoaXMuZmlsZUluZm9NYXAuc2V0KGZ1bGxQYXRoLCB7IHByb2plY3QgfSk7XG5cdFx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBjaGFuZ2Vcblx0XHRpZiAoIXByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSByZXR1cm47XG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdHRoaXMudHJhbnNwaWxlci5pbnZhbGlkYXRlQ29udGVudENhY2hlKG5ldyBGaWxlRXgoeyBmdWxsUGF0aCB9KSk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlUGF0aCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZSguLi5tb2R1bGVzKTtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290KCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyDilIDilIAgRGVwZW5kZW5jeSBncmFwaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldERlcGVuZGVuY3lHcmFwaChtb2R1bGVJZDogc3RyaW5nLCBwYXJlbnRNb2R1bGVzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuXHRcdGlmICh0aGlzLmlzU2VsZihtb2R1bGVJZCkpIHJldHVybiBbXTtcblxuXHRcdGNvbnN0IG1vZHVsZURlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQobW9kdWxlSWQpID8/IFtdO1xuXHRcdGlmIChwYXJlbnRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZUlkKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZDogJHttb2R1bGVJZH1gKTtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRsZXQgc3ViRGVwczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGRlcCBvZiBtb2R1bGVEZXBzKSB7XG5cdFx0XHRpZiAoIXRoaXMuZmlsZUluZm9NYXAuaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIERhdGUubm93KCkudG9TdHJpbmcoKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKG1vZHVsZSk7XG5cdFx0XHQvLyBQcnVuZSBzdGFsZSBvdXRnb2luZyBlZGdlczogcmVtb3ZlIHRoaXMgbW9kdWxlIGFzIGEgcGFyZW50IGZyb20gYWxsIGRlcGVuZGVuY3kgbGlzdHNcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5maWxlSW5mb01hcC5rZXlzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgaXNTZWxmKGZpbGVQYXRoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gY3VycmVudEZpbGVQYXRoID09PSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiSG90UmVsb2FkU2VydmVyIiwiY3VycmVudEZpbGVQYXRoIiwiaW8iLCJmaWxlVXJsVG9QYXRoIiwiVkVSU0lPTl9VUkxfUEFSQU0iLCJSRUJPT1RfREVCT1VOQ0VfTVMiLCJFdmVudEVtaXR0ZXIiLCJsb2dnZXIiLCJzY3JpYmUiLCJuYW1lIiwiZGlzcG9zZWQiLCJob29rc1JlZ2lzdGVyZWQiLCJlbnRyeU1vZHVsZVBhdGgiLCJlbnRyeU1vZHVsZSIsIndvcmtzcGFjZSIsImJ1aWxkQ29uZmlnIiwid2F0Y2hTdWJzY3JpcHRpb24iLCJmaWxlSW5mb01hcCIsIk1hcCIsIm1vZHVsZUNhY2hlIiwiZGVwZW5kZW5jaWVzIiwidHJhbnNwaWxlQ2FjaGUiLCJ0cmFuc3BpbGVyIiwiU3djVHJhbnNwaWxlciIsInN0YXJ0Iiwib3B0aW9ucyIsImNsZWFyIiwicmVzb2x2ZVdvcmtzcGFjZSIsInByb2plY3QiLCJyZXNvbHZlUHJvamVjdCIsInBhdGgiLCJyZXNvbHZlIiwiZ2V0U291cmNlRW50cnlQYXRoIiwiYnVpbGRGaWxlSW5mb01hcCIsInJlZ2lzdGVySG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJvbkZpbGVDaGFuZ2UiLCJ0cmFjZSIsImJvb3RFbnRyeSIsImVtaXQiLCJkaXNwb3NlIiwidW5zdWJzY3JpYmUiLCJTeW1ib2wiLCJkaXNwb3NlRW50cnkiLCJhc3luY0Rpc3Bvc2UiLCJ1cmwiLCJ2ZXJzaW9uTW9kdWxlIiwicGF0aFRvRmlsZVVybCIsImRlZmF1bHQiLCJlcnJvciIsInJlYm9vdCIsInNjaGVkdWxlUmVib290IiwiZGVib3VuY2UiLCJXb3Jrc3BhY2VGYWN0b3J5IiwiY3JlYXRlIiwiV29ya3NwYWNlRGVmYXVsdHMiLCJyb290RGlyIiwicHJvY2VzcyIsImN3ZCIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJmb3VuZCIsImF0IiwiZmluZCIsInAiLCJFcnJvciIsImVudHJpZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiZmlsZXMiLCJnZXRBbGxGaWxlcyIsImZpbGUiLCJmdWxsUGF0aCIsImZsYXQiLCJzcGVjaWZpZXIiLCJjb250ZXh0IiwibmV4dCIsInBhcmVudFVybCIsInBhcmVudFVSTCIsInJld3JpdHRlbiIsInJld3JpdGVKc1RvVHMiLCJyZXN1bHQiLCJvblBvc3RSZXNvbHZlIiwibG9hZCIsImxvYWRUcyIsImZvcm1hdCIsInNvdXJjZSIsInNob3J0Q2lyY3VpdCIsImVuZHNXaXRoIiwicGFyZW50Q2xlYW4iLCJzcGxpdCIsImpzUGF0aCIsInJlc29sdmVkIiwiVVJMIiwidG9TdHJpbmciLCJ0c1BhdGgiLCJyZXBsYWNlIiwiaGFzIiwiZ2V0Q2FjaGVkT3JOZXciLCJwYXJlbnRVcmxDbGVhbiIsImZpbGVQYXRoIiwicGFyZW50UGF0aCIsInVybE9iaiIsInNlYXJjaCIsImlzU291cmNlIiwicGFyZW50SXNTb3VyY2UiLCJ0cmFja0RlcGVuZGVuY3kiLCJzdGFydHNXaXRoIiwiY2xlYW5QYXRoIiwicGF0aG5hbWUiLCJmaWxlSW5mbyIsImdldCIsImNhY2hlZCIsInRzQ29uZmlnIiwiZ2V0VHNDb25maWdTeW5jIiwidXNlckNvbmZpZyIsImdldFN3Y0NvbmZpZ1N5bmMiLCJGaWxlRXgiLCJyZXNwb25zZSIsInRyYW5zZm9ybUZpbGVTeW5jIiwiQnVpbGRUYXJnZXRzIiwiZXM2IiwiYWxpYXNQYXRocyIsIm91dGNvbWUiLCJzZXQiLCJjb2RlIiwiZXZ0IiwiZXZlbnROYW1lIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJkZWxldGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJyZWxvYWRJZkFmZmVjdGVkIiwiaW52YWxpZGF0ZUNvbnRlbnRDYWNoZSIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiU2V0IiwiaW5jbHVkZXMiLCJsZW5ndGgiLCJpbnZhbGlkYXRlTW9kdWxlIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uZWRVcmwiLCJzZWFyY2hQYXJhbXMiLCJEYXRlIiwibm93IiwibW9kdWxlIiwia2V5IiwicGFyZW50cyIsImZpbHRlcmVkIiwiZmlsdGVyIiwia2V5cyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkEwQ2FBOzs7ZUFBQUE7Ozs0QkExQ2dCOzRCQU9DO2lFQUNiO3VCQUM4QztzQkFFOUI7b0JBQ047d0JBQ0Y7d0JBQ1c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBS3BDLE1BQU1DLGtCQUFrQkMsTUFBRSxDQUFDQyxhQUFhLENBQUM7QUFDekMsTUFBTUMsb0JBQW9CO0FBQzFCLE1BQU1DLHFCQUFxQjtBQXFCcEIsTUFBTUwsd0JBQXdCTSx3QkFBWTtJQUNoRCw0RUFBNEU7SUFDM0RDLFNBQWlCQyxjQUFNLENBQUNELE1BQU0sQ0FBQ1AsZ0JBQWdCUyxJQUFJLEVBQUU7SUFDOURDLFdBQVcsTUFBTTtJQUNqQkMsa0JBQWtCLE1BQU07SUFDeEJDLGdCQUF5QjtJQUN6QkMsWUFBOEI7SUFDOUJDLFVBQXNCO0lBQ3RCQyxjQUFjLFFBQVE7SUFDdEJDLGtCQUFpQztJQUN6QywyREFBMkQsR0FDM0QsQUFBUUMsY0FBYyxJQUFJQyxNQUF3QjtJQUMxQ0Ms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
|