@sidekick-coder/zenith-kit 0.0.12 → 0.0.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/bin/zenith.js +28 -0
- package/bin/zkit.js +26 -0
- package/cli/commands/build.js +49 -0
- package/cli/commands/dev.js +37 -0
- package/cli/commands/start.js +38 -0
- package/cli/config.js +23 -0
- package/cli/utils/createWrapper.js +20 -0
- package/dist/client/index.d.mts +448 -0
- package/dist/client/index.mjs +2 -0
- package/dist/components/index-Dk5fhUBV.mjs +4399 -0
- package/dist/components/index.es.js +65708 -0
- package/dist/components/styles.css +4756 -0
- package/dist/server/index.d.mts +441 -1013
- package/dist/server/index.mjs +5 -7754
- package/dist/shared/chunk-0Lt9GpW0.mjs +1 -0
- package/dist/shared/index.d.mts +257 -18
- package/dist/shared/index.mjs +2 -841
- package/package.json +55 -13
- package/tsconfig.client.json +3 -3
- package/tsconfig.server.json +1 -1
- package/tsdown/createTsdownConfig.js +29 -0
- package/tsdown.config.ts +52 -2
- package/vite/createViteConfig.js +55 -0
- package/vite/plugins/zenith.js +143 -0
- package/vite.config.ts +71 -0
- package/dist/shared/chunk-CfYAbeIz.mjs +0 -13
package/dist/shared/index.mjs
CHANGED
|
@@ -1,841 +1,2 @@
|
|
|
1
|
-
import { t as __exportAll } from "./chunk-CfYAbeIz.mjs";
|
|
2
|
-
import { debounce, get, has, set, unset } from "lodash-es";
|
|
3
|
-
import * as v from "valibot";
|
|
4
|
-
import { format } from "date-fns";
|
|
5
|
-
import qs from "qs";
|
|
6
|
-
//#region src/shared/services/ConfigService.ts
|
|
7
|
-
var ConfigService = class {
|
|
8
|
-
entries;
|
|
9
|
-
constructor() {
|
|
10
|
-
this.entries = /* @__PURE__ */ new Map();
|
|
11
|
-
}
|
|
12
|
-
list() {
|
|
13
|
-
return Array.from(this.entries.values());
|
|
14
|
-
}
|
|
15
|
-
parseValue(value) {
|
|
16
|
-
if (typeof value === "string" && value.endsWith(":boolean")) return value.replace(":boolean", "").trim() === "true";
|
|
17
|
-
return value;
|
|
18
|
-
}
|
|
19
|
-
loadFromRecord(record, source = "unknow") {
|
|
20
|
-
for (const [key, value] of Object.entries(record)) this.entries.set(key, {
|
|
21
|
-
key,
|
|
22
|
-
value: this.parseValue(value),
|
|
23
|
-
source
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
loadFromEntries(entries, source = "unknow") {
|
|
27
|
-
for (const [key, value] of entries) this.entries.set(key, {
|
|
28
|
-
key,
|
|
29
|
-
value: this.parseValue(value),
|
|
30
|
-
source
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
toRecord() {
|
|
34
|
-
const record = {};
|
|
35
|
-
for (const [key, entry] of this.entries.entries()) record[key] = entry.value;
|
|
36
|
-
return record;
|
|
37
|
-
}
|
|
38
|
-
has(key) {
|
|
39
|
-
if (this.entries.get(key)) return true;
|
|
40
|
-
if (!key.includes(".")) return false;
|
|
41
|
-
const primary = key.split(".")[0];
|
|
42
|
-
const primaryEntry = this.entries.get(primary);
|
|
43
|
-
if (!primaryEntry) return this.entries.get(key) ? true : false;
|
|
44
|
-
const value = primaryEntry.value;
|
|
45
|
-
if (typeof value !== "object" || Array.isArray(value)) return false;
|
|
46
|
-
return has(value, key.substring(primary.length + 1));
|
|
47
|
-
}
|
|
48
|
-
get(key, defaultValue) {
|
|
49
|
-
const entry = this.entries.get(key);
|
|
50
|
-
if (entry) return entry.value;
|
|
51
|
-
if (!key.includes(".")) return defaultValue;
|
|
52
|
-
const primary = key.split(".")[0];
|
|
53
|
-
const primaryEntry = this.entries.get(primary);
|
|
54
|
-
if (!primaryEntry) {
|
|
55
|
-
const entry = this.entries.get(key);
|
|
56
|
-
return entry ? entry.value : defaultValue;
|
|
57
|
-
}
|
|
58
|
-
const value = primaryEntry.value;
|
|
59
|
-
if (typeof value !== "object" || Array.isArray(value)) return defaultValue;
|
|
60
|
-
return get(value, key.substring(primary.length + 1), defaultValue);
|
|
61
|
-
}
|
|
62
|
-
getOne(keys, defaultValue) {
|
|
63
|
-
for (const key of keys) if (this.has(key)) return this.get(key);
|
|
64
|
-
return defaultValue;
|
|
65
|
-
}
|
|
66
|
-
set(key, value, source = "runtime") {
|
|
67
|
-
if (!key.includes(".")) {
|
|
68
|
-
this.entries.set(key, {
|
|
69
|
-
key,
|
|
70
|
-
source,
|
|
71
|
-
value
|
|
72
|
-
});
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
const primary = key.split(".")[0];
|
|
76
|
-
let primaryValue = this.get(primary, {});
|
|
77
|
-
if (typeof primaryValue !== "object" || Array.isArray(primaryValue)) primaryValue = {};
|
|
78
|
-
set(primaryValue, key.substring(primary.length + 1), value);
|
|
79
|
-
this.entries.set(primary, {
|
|
80
|
-
key: primary,
|
|
81
|
-
source,
|
|
82
|
-
value: primaryValue
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
unset(key) {
|
|
86
|
-
if (!key.includes(".")) {
|
|
87
|
-
this.entries.delete(key);
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
const primary = key.split(".")[0];
|
|
91
|
-
const primaryValue = this.get(primary, {});
|
|
92
|
-
if (!primaryValue) return;
|
|
93
|
-
if (typeof primaryValue !== "object" || Array.isArray(primaryValue)) return;
|
|
94
|
-
unset(primaryValue, key.substring(primary.length + 1));
|
|
95
|
-
this.entries.set(primary, {
|
|
96
|
-
key: primary,
|
|
97
|
-
source: "runtime",
|
|
98
|
-
value: primaryValue
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
clear() {
|
|
102
|
-
this.entries.clear();
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
//#endregion
|
|
106
|
-
//#region src/shared/services/ContainerService.ts
|
|
107
|
-
var ContainerService = class {
|
|
108
|
-
entries = /* @__PURE__ */ new Map();
|
|
109
|
-
loadFromRecord(record) {
|
|
110
|
-
Object.entries(record).forEach(([key, value]) => {
|
|
111
|
-
this.set(key, value);
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
toRecord() {
|
|
115
|
-
const record = {};
|
|
116
|
-
for (const [key, value] of this.entries.entries()) record[String(key)] = value;
|
|
117
|
-
return record;
|
|
118
|
-
}
|
|
119
|
-
set(payload, value) {
|
|
120
|
-
let key = payload;
|
|
121
|
-
if (typeof payload === "function" || typeof payload === "object") key = payload.name;
|
|
122
|
-
this.entries.set(key, value);
|
|
123
|
-
return this;
|
|
124
|
-
}
|
|
125
|
-
has(payload) {
|
|
126
|
-
let key = payload;
|
|
127
|
-
if (typeof payload === "function" || typeof payload === "object") key = payload.name;
|
|
128
|
-
return this.entries.has(key);
|
|
129
|
-
}
|
|
130
|
-
get(payload) {
|
|
131
|
-
let key = payload;
|
|
132
|
-
if (typeof payload === "function" || typeof payload === "object") key = payload.name;
|
|
133
|
-
if (!this.has(key)) throw new Error(`entry not found: ${String(key)}`);
|
|
134
|
-
return this.entries.get(key);
|
|
135
|
-
}
|
|
136
|
-
singleton(classConstructor) {
|
|
137
|
-
const key = classConstructor.name;
|
|
138
|
-
const existingInstance = this.entries.get(key);
|
|
139
|
-
if (existingInstance) return existingInstance;
|
|
140
|
-
const newInstance = new classConstructor();
|
|
141
|
-
this.entries.set(key, newInstance);
|
|
142
|
-
return newInstance;
|
|
143
|
-
}
|
|
144
|
-
load(entries) {
|
|
145
|
-
Object.entries(entries).forEach(([key, value]) => {
|
|
146
|
-
this.set(key, value);
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
proxy(key) {
|
|
150
|
-
return new Proxy({}, {
|
|
151
|
-
get: (_target, prop) => {
|
|
152
|
-
const entry = this.get(key);
|
|
153
|
-
const value = entry[prop];
|
|
154
|
-
if (typeof value === "function") return value.bind(entry);
|
|
155
|
-
return entry[prop];
|
|
156
|
-
},
|
|
157
|
-
set: (_target, prop, value) => {
|
|
158
|
-
const entry = this.get(key);
|
|
159
|
-
entry[prop] = value;
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
keys() {
|
|
165
|
-
return Array.from(this.entries.keys());
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
//#endregion
|
|
169
|
-
//#region src/shared/services/CookieService.ts
|
|
170
|
-
var CookieService = class {
|
|
171
|
-
cookies;
|
|
172
|
-
prefix;
|
|
173
|
-
constructor(data = {}) {
|
|
174
|
-
this.cookies = data.cookies || /* @__PURE__ */ new Map();
|
|
175
|
-
this.prefix = data.prefix || "";
|
|
176
|
-
}
|
|
177
|
-
load(cookies) {
|
|
178
|
-
if (cookies instanceof Map) {
|
|
179
|
-
for (const [key, value] of cookies.entries()) this.set(key, value);
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
for (const key of Object.keys(cookies)) this.set(key, cookies[key]);
|
|
183
|
-
}
|
|
184
|
-
get(name, defaultValue = null) {
|
|
185
|
-
const fullName = this.prefix + name;
|
|
186
|
-
return this.cookies.get(fullName) || defaultValue;
|
|
187
|
-
}
|
|
188
|
-
set(name, value, options) {
|
|
189
|
-
const fullName = this.prefix + name;
|
|
190
|
-
this.cookies.set(fullName, value);
|
|
191
|
-
}
|
|
192
|
-
toRecord() {
|
|
193
|
-
const result = {};
|
|
194
|
-
for (const [key, value] of this.cookies.entries()) if (key.startsWith(this.prefix)) {
|
|
195
|
-
const unprefixedKey = key.slice(this.prefix.length);
|
|
196
|
-
result[unprefixedKey] = value;
|
|
197
|
-
}
|
|
198
|
-
return result;
|
|
199
|
-
}
|
|
200
|
-
};
|
|
201
|
-
//#endregion
|
|
202
|
-
//#region src/shared/utils/compose.ts
|
|
203
|
-
/**
|
|
204
|
-
* Composes multiple mixins into a single class that can be extended.
|
|
205
|
-
* Allows for multiple inheritance-like behavior by applying mixins sequentially.
|
|
206
|
-
*
|
|
207
|
-
* @param mixins - Array of mixin functions to compose
|
|
208
|
-
* @returns A class constructor that includes all mixin functionality
|
|
209
|
-
*
|
|
210
|
-
* @example
|
|
211
|
-
* ```typescript
|
|
212
|
-
* class User extends compose(Timestamp, SoftDelete) {
|
|
213
|
-
* constructor(public name: string) {
|
|
214
|
-
* super()
|
|
215
|
-
* }
|
|
216
|
-
* }
|
|
217
|
-
* ```
|
|
218
|
-
*/
|
|
219
|
-
function compose(...mixins) {
|
|
220
|
-
return mixins.reduce((base, mixin) => mixin(base), class {});
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Alternative compose function that starts with a base class
|
|
224
|
-
*
|
|
225
|
-
* @param baseClass - The base class to start with
|
|
226
|
-
* @param mixins - Array of mixin functions to apply
|
|
227
|
-
* @returns A class constructor that extends the base class with all mixin functionality
|
|
228
|
-
*
|
|
229
|
-
* @example
|
|
230
|
-
* ```typescript
|
|
231
|
-
* class User extends composeWith(BaseEntity, Timestamp, SoftDelete) {
|
|
232
|
-
* constructor(public name: string) {
|
|
233
|
-
* super()
|
|
234
|
-
* }
|
|
235
|
-
* }
|
|
236
|
-
* ```
|
|
237
|
-
*/
|
|
238
|
-
function composeWith(baseClass, ...mixins) {
|
|
239
|
-
return mixins.reduce((base, mixin) => mixin(base), baseClass);
|
|
240
|
-
}
|
|
241
|
-
function mixin(Source) {
|
|
242
|
-
return function(Target) {
|
|
243
|
-
class Mixed extends Target {
|
|
244
|
-
constructor(...args) {
|
|
245
|
-
super(...args);
|
|
246
|
-
const source = new Source(...args);
|
|
247
|
-
Object.assign(this, source);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
for (const key of Reflect.ownKeys(Source.prototype)) if (key !== "constructor") Object.defineProperty(Mixed.prototype, key, Object.getOwnPropertyDescriptor(Source.prototype, key));
|
|
251
|
-
return Mixed;
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
//#endregion
|
|
255
|
-
//#region src/shared/utils/formatBytes.ts
|
|
256
|
-
function formatBytes(bytes, decimals = 2) {
|
|
257
|
-
if (bytes === 0) return "0 Bytes";
|
|
258
|
-
const k = 1024;
|
|
259
|
-
const dm = decimals < 0 ? 0 : decimals;
|
|
260
|
-
const sizes = [
|
|
261
|
-
"Bytes",
|
|
262
|
-
"KB",
|
|
263
|
-
"MB",
|
|
264
|
-
"GB",
|
|
265
|
-
"TB",
|
|
266
|
-
"PB"
|
|
267
|
-
];
|
|
268
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
269
|
-
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
|
|
270
|
-
}
|
|
271
|
-
//#endregion
|
|
272
|
-
//#region src/shared/utils/flatten.ts
|
|
273
|
-
function flatten(obj, prefix = "", res = {}) {
|
|
274
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
275
|
-
const newKey = prefix ? `${prefix}.${key}` : key;
|
|
276
|
-
if (value && typeof value === "object" && !Array.isArray(value)) flatten(value, newKey, res);
|
|
277
|
-
else res[newKey] = value;
|
|
278
|
-
}
|
|
279
|
-
return res;
|
|
280
|
-
}
|
|
281
|
-
function unflatten(obj) {
|
|
282
|
-
const result = {};
|
|
283
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
284
|
-
const parts = key.split(".");
|
|
285
|
-
let current = result;
|
|
286
|
-
parts.forEach((part, i) => {
|
|
287
|
-
if (i === parts.length - 1) current[part] = value;
|
|
288
|
-
else {
|
|
289
|
-
if (!current[part] || typeof current[part] !== "object") current[part] = {};
|
|
290
|
-
current = current[part];
|
|
291
|
-
}
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
return result;
|
|
295
|
-
}
|
|
296
|
-
//#endregion
|
|
297
|
-
//#region src/shared/utils/tryCatch.ts
|
|
298
|
-
async function tryCatch(tryer) {
|
|
299
|
-
try {
|
|
300
|
-
return [null, await tryer()];
|
|
301
|
-
} catch (error) {
|
|
302
|
-
return [error, null];
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
tryCatch.sync = function(tryer) {
|
|
306
|
-
try {
|
|
307
|
-
return [null, tryer()];
|
|
308
|
-
} catch (error) {
|
|
309
|
-
return [error, null];
|
|
310
|
-
}
|
|
311
|
-
};
|
|
312
|
-
//#endregion
|
|
313
|
-
//#region src/shared/utils/createId.ts
|
|
314
|
-
function uuid() {
|
|
315
|
-
if (typeof crypto !== "undefined" && crypto.randomUUID) return crypto.randomUUID();
|
|
316
|
-
if (typeof self !== "undefined" && self.crypto && self.crypto.randomUUID) return self.crypto.randomUUID();
|
|
317
|
-
if (typeof window !== "undefined" && window.crypto && window.crypto.randomUUID) return window.crypto.randomUUID();
|
|
318
|
-
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
|
|
319
|
-
const r = Math.random() * 16 | 0;
|
|
320
|
-
return (c === "x" ? r : r & 3 | 8).toString(16);
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
function createId(prefix = "") {
|
|
324
|
-
return prefix + uuid();
|
|
325
|
-
}
|
|
326
|
-
//#endregion
|
|
327
|
-
//#region src/shared/services/LoggerService.ts
|
|
328
|
-
var LoggerService = class LoggerService {
|
|
329
|
-
info(message, meta) {}
|
|
330
|
-
debug(message, meta) {}
|
|
331
|
-
warn(message, meta) {}
|
|
332
|
-
error(message, meta) {}
|
|
333
|
-
child(options) {
|
|
334
|
-
return new LoggerService();
|
|
335
|
-
}
|
|
336
|
-
};
|
|
337
|
-
//#endregion
|
|
338
|
-
//#region src/shared/services/EmmitterService.ts
|
|
339
|
-
var EmmitterService = class {
|
|
340
|
-
handlers = [];
|
|
341
|
-
debug;
|
|
342
|
-
logger;
|
|
343
|
-
load(options) {
|
|
344
|
-
this.debug = options?.debug || false;
|
|
345
|
-
this.logger = options?.logger || new LoggerService();
|
|
346
|
-
if (this.debug) this.logger.debug("emmitter loaded with debug mode enabled");
|
|
347
|
-
}
|
|
348
|
-
on(event, listener, options) {
|
|
349
|
-
const id = options?.id || createId();
|
|
350
|
-
if (options?.unique) {
|
|
351
|
-
if (this.handlers.some((h) => h.event === event && h.listener === listener || h.id === id)) return;
|
|
352
|
-
}
|
|
353
|
-
const handler = {
|
|
354
|
-
id,
|
|
355
|
-
event,
|
|
356
|
-
listener
|
|
357
|
-
};
|
|
358
|
-
this.handlers.push(handler);
|
|
359
|
-
if (this.debug) this.logger.debug("handler added", handler);
|
|
360
|
-
return handler;
|
|
361
|
-
}
|
|
362
|
-
once(event, listener, options) {
|
|
363
|
-
const wrapper = (args) => {
|
|
364
|
-
listener(args);
|
|
365
|
-
this.off(event, wrapper);
|
|
366
|
-
};
|
|
367
|
-
return this.on(event, wrapper, options);
|
|
368
|
-
}
|
|
369
|
-
onDebounce(event, listener, options) {
|
|
370
|
-
const debounced = debounce(listener, options?.debounce || 300);
|
|
371
|
-
const handler = this.on(event, debounced, options);
|
|
372
|
-
if (handler) handler.originalListener = listener;
|
|
373
|
-
return handler;
|
|
374
|
-
}
|
|
375
|
-
onAnyOf(events, listener, options) {
|
|
376
|
-
const handlers = [];
|
|
377
|
-
for (const event of events) {
|
|
378
|
-
const handler = this.on(event, listener, options);
|
|
379
|
-
if (handler) handlers.push(handler);
|
|
380
|
-
}
|
|
381
|
-
return handlers;
|
|
382
|
-
}
|
|
383
|
-
off(event, listener) {
|
|
384
|
-
this.handlers = this.handlers.filter((h) => {
|
|
385
|
-
if (h.event === event && (h.listener === listener || h.originalListener === listener)) return false;
|
|
386
|
-
return true;
|
|
387
|
-
});
|
|
388
|
-
if (this.debug) this.logger.debug("handler removed", { event });
|
|
389
|
-
}
|
|
390
|
-
emit(event, args) {
|
|
391
|
-
if (this.debug) this.logger.debug("emitting event", {
|
|
392
|
-
event,
|
|
393
|
-
args
|
|
394
|
-
});
|
|
395
|
-
const handlers = this.handlers.filter((h) => h.event === event);
|
|
396
|
-
for (const handler of handlers) tryCatch.sync(() => handler.listener(args));
|
|
397
|
-
}
|
|
398
|
-
async emitAndWait(event, args) {
|
|
399
|
-
const handlers = this.handlers.filter((h) => h.event === event);
|
|
400
|
-
if (this.debug) this.logger.debug("emitting event", {
|
|
401
|
-
handlers: handlers.length,
|
|
402
|
-
event,
|
|
403
|
-
args
|
|
404
|
-
});
|
|
405
|
-
for await (const handler of handlers) await handler.listener(args);
|
|
406
|
-
}
|
|
407
|
-
list() {
|
|
408
|
-
return this.handlers;
|
|
409
|
-
}
|
|
410
|
-
listByEvent(event) {
|
|
411
|
-
return this.handlers.filter((h) => h.event === event);
|
|
412
|
-
}
|
|
413
|
-
remove(payload) {
|
|
414
|
-
const ids = Array.isArray(payload) ? payload : [payload];
|
|
415
|
-
this.handlers = this.handlers.filter((h) => !ids.includes(h.id));
|
|
416
|
-
if (this.debug) this.logger.debug("handlers removed", { ids });
|
|
417
|
-
}
|
|
418
|
-
clear() {
|
|
419
|
-
this.handlers = [];
|
|
420
|
-
if (this.debug) this.logger.debug("all handlers cleared");
|
|
421
|
-
}
|
|
422
|
-
hasHandlers() {
|
|
423
|
-
return this.handlers.length > 0;
|
|
424
|
-
}
|
|
425
|
-
};
|
|
426
|
-
//#endregion
|
|
427
|
-
//#region src/shared/services/LifecycleService.ts
|
|
428
|
-
var LifecycleService = class {
|
|
429
|
-
hooks;
|
|
430
|
-
logger;
|
|
431
|
-
debug = false;
|
|
432
|
-
constructor(data = {}) {
|
|
433
|
-
this.debug = data.debug ?? this.debug;
|
|
434
|
-
this.hooks = data.hooks ?? /* @__PURE__ */ new Map();
|
|
435
|
-
this.logger = data.logger ?? new LoggerService();
|
|
436
|
-
}
|
|
437
|
-
async executeHookMethod(hook, method) {
|
|
438
|
-
await hook[method]();
|
|
439
|
-
if (this.debug) this.logger.debug(`${method} ${hook.hook_id}`);
|
|
440
|
-
const subhooks = hook.subhooks || [];
|
|
441
|
-
for (const subhook of subhooks) {
|
|
442
|
-
await this.executeHookMethod(subhook, method);
|
|
443
|
-
if (this.debug) this.logger.debug(`${method} subhook ${subhook.hook_id} of ${hook.hook_id}`);
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
list(options) {
|
|
447
|
-
let hooks = Array.from(this.hooks.values());
|
|
448
|
-
if (options?.exclude) {
|
|
449
|
-
const ids = options.exclude.filter((item) => typeof item === "string");
|
|
450
|
-
const constructors = options.exclude.filter((item) => typeof item === "function");
|
|
451
|
-
const instances = options.exclude.filter((item) => typeof item === "object");
|
|
452
|
-
hooks = hooks.filter((hook) => {
|
|
453
|
-
if (ids.includes(hook.hook_id)) return false;
|
|
454
|
-
if (constructors.find((ctor) => hook instanceof ctor)) return false;
|
|
455
|
-
if (instances.find((inst) => hook === inst)) return false;
|
|
456
|
-
return true;
|
|
457
|
-
});
|
|
458
|
-
}
|
|
459
|
-
hooks.sort((a, b) => {
|
|
460
|
-
return (a.order ?? 0) - (b.order ?? 0);
|
|
461
|
-
});
|
|
462
|
-
return hooks;
|
|
463
|
-
}
|
|
464
|
-
add(...payload) {
|
|
465
|
-
const instances = [];
|
|
466
|
-
for (const item of payload) {
|
|
467
|
-
if (typeof item === "function") {
|
|
468
|
-
instances.push(new item());
|
|
469
|
-
continue;
|
|
470
|
-
}
|
|
471
|
-
instances.push(item);
|
|
472
|
-
}
|
|
473
|
-
for (const hook of instances) {
|
|
474
|
-
this.hooks.set(hook.hook_id, hook);
|
|
475
|
-
if (this.debug) this.logger.debug("add " + hook.hook_id);
|
|
476
|
-
if (hook.subhooks) hook.subhooks.forEach((subhook) => this.add(subhook));
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
async register(options) {
|
|
480
|
-
for (const hook of this.list(options)) {
|
|
481
|
-
const [error] = await tryCatch(() => this.executeHookMethod(hook, "onRegister"));
|
|
482
|
-
if (error) {
|
|
483
|
-
Object.assign(error, { hookId: hook.hook_id });
|
|
484
|
-
this.logger.error("error in hook register: ", error);
|
|
485
|
-
continue;
|
|
486
|
-
}
|
|
487
|
-
if (this.debug) this.logger.debug("register " + hook.hook_id);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
async load(options) {
|
|
491
|
-
for (const hook of this.list(options)) {
|
|
492
|
-
const [error] = await tryCatch(() => this.executeHookMethod(hook, "onLoad"));
|
|
493
|
-
if (error) {
|
|
494
|
-
Object.assign(error, { hookId: hook.hook_id });
|
|
495
|
-
this.logger.error("error in hook load:", error);
|
|
496
|
-
continue;
|
|
497
|
-
}
|
|
498
|
-
if (this.debug) this.logger.debug("load " + hook.hook_id);
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
async boot(options) {
|
|
502
|
-
const hooks = this.list(options);
|
|
503
|
-
for (const hook of hooks) {
|
|
504
|
-
const [error] = await tryCatch(() => this.executeHookMethod(hook, "onBoot"));
|
|
505
|
-
if (error) {
|
|
506
|
-
Object.assign(error, { hookId: hook.hook_id });
|
|
507
|
-
this.logger.error("error in hook boot:", error);
|
|
508
|
-
continue;
|
|
509
|
-
}
|
|
510
|
-
if (this.debug) this.logger.debug("boot " + hook.hook_id);
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
async shutdown(options) {
|
|
514
|
-
for (const hook of this.list(options)) {
|
|
515
|
-
const [error] = await tryCatch(() => this.executeHookMethod(hook, "onShutdown"));
|
|
516
|
-
if (error) {
|
|
517
|
-
Object.assign(error, { hookId: hook.hook_id });
|
|
518
|
-
this.logger.error("error in hook shutdown:", error);
|
|
519
|
-
continue;
|
|
520
|
-
}
|
|
521
|
-
if (this.debug) this.logger.debug("shutdown " + hook.hook_id);
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
clear() {
|
|
525
|
-
this.hooks.clear();
|
|
526
|
-
}
|
|
527
|
-
};
|
|
528
|
-
//#endregion
|
|
529
|
-
//#region src/shared/services/TranslatorService.ts
|
|
530
|
-
var TranslatorService = class {
|
|
531
|
-
entries;
|
|
532
|
-
locale;
|
|
533
|
-
localeLoaders;
|
|
534
|
-
debug = false;
|
|
535
|
-
logger;
|
|
536
|
-
cache;
|
|
537
|
-
constructor(data = {}) {
|
|
538
|
-
this.entries = data.entries || /* @__PURE__ */ new Map();
|
|
539
|
-
this.locale = data.locale || "en";
|
|
540
|
-
this.debug = data.debug || false;
|
|
541
|
-
this.cache = data.cache || /* @__PURE__ */ new Map();
|
|
542
|
-
this.logger = data.logger || new LoggerService();
|
|
543
|
-
this.localeLoaders = /* @__PURE__ */ new Map();
|
|
544
|
-
if (this.debug) this.logger.debug("initialized in debug mode", { locale: this.locale });
|
|
545
|
-
}
|
|
546
|
-
get locales() {
|
|
547
|
-
return Array.from(this.localeLoaders.keys());
|
|
548
|
-
}
|
|
549
|
-
list() {
|
|
550
|
-
const items = [];
|
|
551
|
-
this.entries.forEach((value, key) => {
|
|
552
|
-
items.push({
|
|
553
|
-
key,
|
|
554
|
-
value
|
|
555
|
-
});
|
|
556
|
-
});
|
|
557
|
-
return items;
|
|
558
|
-
}
|
|
559
|
-
async getEntries(locale) {
|
|
560
|
-
const cache = this.cache.get(locale);
|
|
561
|
-
if (cache && this.debug) this.logger.debug(`load locale "${locale}" from cache`, {
|
|
562
|
-
locale,
|
|
563
|
-
length: Object.keys(cache).length
|
|
564
|
-
});
|
|
565
|
-
if (cache) return cache;
|
|
566
|
-
const loader = this.localeLoaders.get(locale);
|
|
567
|
-
if (!loader) {
|
|
568
|
-
this.logger.warn(`no loader found for locale "${locale}"`);
|
|
569
|
-
return {};
|
|
570
|
-
}
|
|
571
|
-
const entries = await loader();
|
|
572
|
-
this.cache.set(locale, entries);
|
|
573
|
-
if (this.debug) this.logger.debug(`load locale ${locale}`, {
|
|
574
|
-
locale,
|
|
575
|
-
keys: Object.keys(entries).length
|
|
576
|
-
});
|
|
577
|
-
return entries;
|
|
578
|
-
}
|
|
579
|
-
async load(locale) {
|
|
580
|
-
const entries = await this.getEntries(locale);
|
|
581
|
-
this.entries = new Map(Object.entries(entries));
|
|
582
|
-
this.locale = locale;
|
|
583
|
-
}
|
|
584
|
-
t(key, args = {}) {
|
|
585
|
-
if (!this.entries.has(key) && this.debug) this.logger.debug(`missing translation for key "${key}"`, {
|
|
586
|
-
key,
|
|
587
|
-
locale: this.locale
|
|
588
|
-
});
|
|
589
|
-
let translation = this.entries.get(key) || key;
|
|
590
|
-
if (!Object.keys(args).length) return translation;
|
|
591
|
-
Object.entries(args).forEach(([aKey, aValue]) => {
|
|
592
|
-
translation = translation.replace(`:${aKey}`, aValue);
|
|
593
|
-
});
|
|
594
|
-
return translation;
|
|
595
|
-
}
|
|
596
|
-
date(data) {
|
|
597
|
-
return new Date(data).toLocaleDateString(this.locale, {
|
|
598
|
-
year: "numeric",
|
|
599
|
-
month: "2-digit",
|
|
600
|
-
day: "2-digit"
|
|
601
|
-
});
|
|
602
|
-
}
|
|
603
|
-
datetime(data) {
|
|
604
|
-
return new Date(data).toLocaleString(this.locale, {
|
|
605
|
-
year: "numeric",
|
|
606
|
-
month: "2-digit",
|
|
607
|
-
day: "2-digit",
|
|
608
|
-
hour: "2-digit",
|
|
609
|
-
minute: "2-digit"
|
|
610
|
-
});
|
|
611
|
-
}
|
|
612
|
-
};
|
|
613
|
-
//#endregion
|
|
614
|
-
//#region src/shared/services/UploadService.ts
|
|
615
|
-
var UploadService = class {
|
|
616
|
-
single(name) {
|
|
617
|
-
const error = /* @__PURE__ */ new Error("Method not implemented.");
|
|
618
|
-
Object.assign(error, { name });
|
|
619
|
-
throw error;
|
|
620
|
-
}
|
|
621
|
-
multiple(name) {
|
|
622
|
-
const error = /* @__PURE__ */ new Error("Method not implemented.");
|
|
623
|
-
Object.assign(error, { name });
|
|
624
|
-
throw error;
|
|
625
|
-
}
|
|
626
|
-
};
|
|
627
|
-
//#endregion
|
|
628
|
-
//#region src/shared/validators/url.ts
|
|
629
|
-
var url_exports = /* @__PURE__ */ __exportAll({
|
|
630
|
-
array: () => array,
|
|
631
|
-
arrayNumber: () => arrayNumber,
|
|
632
|
-
boolean: () => boolean,
|
|
633
|
-
date: () => date,
|
|
634
|
-
datetime: () => datetime,
|
|
635
|
-
number: () => number,
|
|
636
|
-
object: () => object
|
|
637
|
-
});
|
|
638
|
-
const number = () => v.pipe(v.union([v.string(), v.number()]), v.transform(Number), v.integer());
|
|
639
|
-
const boolean = () => v.pipe(v.union([v.string(), v.boolean()]), v.transform((v) => v === true || v === "true"));
|
|
640
|
-
const date = () => v.pipe(v.union([v.string(), v.date()]), v.transform((v) => v instanceof Date ? v : new Date(v)), v.transform((v) => v ? format(v, "yyyy-MM-dd") : v));
|
|
641
|
-
const datetime = () => v.pipe(v.union([v.string(), v.date()]), v.transform((v) => {
|
|
642
|
-
if (!v) return v;
|
|
643
|
-
if (v === "null") return null;
|
|
644
|
-
if (typeof v === "string") v = new Date(v);
|
|
645
|
-
return format(v, "yyyy-MM-dd HH:mm");
|
|
646
|
-
}));
|
|
647
|
-
const array = (schema = v.any()) => v.pipe(v.union([v.string(), v.array(v.string())]), v.transform((value) => Array.isArray(value) ? value : value.split(",")), v.array(schema));
|
|
648
|
-
const arrayNumber = () => v.pipe(array(), v.transform((value) => value.map(Number)));
|
|
649
|
-
const object = () => v.pipe(v.union([v.string(), v.record(v.string(), v.any())]), v.transform((value) => typeof value === "string" ? qs.parse(value) : value), v.transform((value) => {
|
|
650
|
-
const result = {};
|
|
651
|
-
for (const key in value) set(result, key, get(value, key));
|
|
652
|
-
return result;
|
|
653
|
-
}));
|
|
654
|
-
//#endregion
|
|
655
|
-
//#region src/shared/exceptions/BaseException.ts
|
|
656
|
-
var BaseException = class BaseException extends Error {
|
|
657
|
-
statusCode = 500;
|
|
658
|
-
constructor(message, statusCode = 500) {
|
|
659
|
-
super(message);
|
|
660
|
-
this.name = this.constructor.name;
|
|
661
|
-
this.statusCode = statusCode;
|
|
662
|
-
}
|
|
663
|
-
static fromError(error) {
|
|
664
|
-
return new BaseException(error.message, 500);
|
|
665
|
-
}
|
|
666
|
-
};
|
|
667
|
-
//#endregion
|
|
668
|
-
//#region src/shared/services/ValidatorService.ts
|
|
669
|
-
const extras = { url: url_exports };
|
|
670
|
-
var ValidatorService = class {
|
|
671
|
-
v = {
|
|
672
|
-
...v,
|
|
673
|
-
extras
|
|
674
|
-
};
|
|
675
|
-
create(cb) {
|
|
676
|
-
return cb(this.v);
|
|
677
|
-
}
|
|
678
|
-
validate(payload, cb) {
|
|
679
|
-
const schema = typeof cb === "function" ? cb(this.v) : cb;
|
|
680
|
-
const { output, issues, success } = v.safeParse(schema, payload);
|
|
681
|
-
if (!success) {
|
|
682
|
-
const flatten = v.flatten(issues);
|
|
683
|
-
const messages = [];
|
|
684
|
-
if (flatten.root) messages.push(...flatten.root);
|
|
685
|
-
if (flatten.nested) Object.entries(flatten.nested).forEach((entry) => {
|
|
686
|
-
const [key, value] = entry;
|
|
687
|
-
messages.push(...value.map((v) => `${key}: ${v}`));
|
|
688
|
-
});
|
|
689
|
-
const error = new BaseException(messages.length ? messages.join(", ") : "Validation failed", 422);
|
|
690
|
-
error.name = "ValidationError";
|
|
691
|
-
Object.assign(error, { messages });
|
|
692
|
-
throw error;
|
|
693
|
-
}
|
|
694
|
-
return output;
|
|
695
|
-
}
|
|
696
|
-
async validateAsync(payload, cb) {
|
|
697
|
-
const schema = typeof cb === "function" ? cb(this.v) : cb;
|
|
698
|
-
const { output, issues, success } = await v.safeParseAsync(schema, payload);
|
|
699
|
-
if (!success) {
|
|
700
|
-
const error = /* @__PURE__ */ new Error("Validation failed");
|
|
701
|
-
const flatten = v.flatten(issues);
|
|
702
|
-
const details = {
|
|
703
|
-
...flatten.root,
|
|
704
|
-
...flatten.nested
|
|
705
|
-
};
|
|
706
|
-
Object.assign(error, { details });
|
|
707
|
-
throw error;
|
|
708
|
-
}
|
|
709
|
-
return output;
|
|
710
|
-
}
|
|
711
|
-
isValid(payload, cb) {
|
|
712
|
-
const schema = typeof cb === "function" ? cb(this.v) : cb;
|
|
713
|
-
const { success } = v.safeParse(schema, payload);
|
|
714
|
-
return success;
|
|
715
|
-
}
|
|
716
|
-
};
|
|
717
|
-
//#endregion
|
|
718
|
-
//#region src/shared/schemas/permissionAssignmentSchema.ts
|
|
719
|
-
const permissionAssignmentSchema = v.object({
|
|
720
|
-
id: v.number(),
|
|
721
|
-
permission_id: v.number(),
|
|
722
|
-
assignable_type: v.string(),
|
|
723
|
-
assignable_id: v.string(),
|
|
724
|
-
created_at: v.string(),
|
|
725
|
-
updated_at: v.string()
|
|
726
|
-
});
|
|
727
|
-
//#endregion
|
|
728
|
-
//#region src/shared/schemas/permissionSchema.ts
|
|
729
|
-
const permissionSchema = v.object({
|
|
730
|
-
id: v.number(),
|
|
731
|
-
name: v.nullable(v.string()),
|
|
732
|
-
description: v.nullable(v.string()),
|
|
733
|
-
action: v.string(),
|
|
734
|
-
subject: v.string(),
|
|
735
|
-
conditions: v.nullable(v.string()),
|
|
736
|
-
created_at: v.string(),
|
|
737
|
-
updated_at: v.string(),
|
|
738
|
-
expires_at: v.string()
|
|
739
|
-
});
|
|
740
|
-
//#endregion
|
|
741
|
-
//#region src/shared/schemas/tokenSchema.ts
|
|
742
|
-
const tokenSchema = v.object({
|
|
743
|
-
id: v.number(),
|
|
744
|
-
name: v.nullable(v.string()),
|
|
745
|
-
type: v.string(),
|
|
746
|
-
user_id: v.number(),
|
|
747
|
-
token: v.string(),
|
|
748
|
-
created_at: v.string(),
|
|
749
|
-
updated_at: v.string(),
|
|
750
|
-
expires_at: v.string()
|
|
751
|
-
});
|
|
752
|
-
//#endregion
|
|
753
|
-
//#region src/shared/exceptions/ShellException.ts
|
|
754
|
-
var ShellException = class extends BaseException {
|
|
755
|
-
output;
|
|
756
|
-
bin;
|
|
757
|
-
args;
|
|
758
|
-
constructor(message, output, bin, args) {
|
|
759
|
-
super(message, 501);
|
|
760
|
-
this.output = output;
|
|
761
|
-
this.bin = bin;
|
|
762
|
-
this.args = args;
|
|
763
|
-
}
|
|
764
|
-
};
|
|
765
|
-
//#endregion
|
|
766
|
-
//#region src/shared/facades/validator.ts
|
|
767
|
-
const validator = new ValidatorService();
|
|
768
|
-
//#endregion
|
|
769
|
-
//#region src/shared/entities/DriveEntryEntity.ts
|
|
770
|
-
var DriveEntry = class {
|
|
771
|
-
name;
|
|
772
|
-
path;
|
|
773
|
-
type;
|
|
774
|
-
metas = {};
|
|
775
|
-
constructor(data) {
|
|
776
|
-
Object.assign(this, data);
|
|
777
|
-
}
|
|
778
|
-
};
|
|
779
|
-
//#endregion
|
|
780
|
-
//#region src/shared/entities/LifecycleHook.ts
|
|
781
|
-
var LifecycleHook = class {
|
|
782
|
-
hook_id;
|
|
783
|
-
order;
|
|
784
|
-
subhooks;
|
|
785
|
-
constructor() {
|
|
786
|
-
if (!this.hook_id) this.hook_id = this.constructor.name;
|
|
787
|
-
}
|
|
788
|
-
async onRegister() {}
|
|
789
|
-
async onLoad() {}
|
|
790
|
-
async onBoot() {}
|
|
791
|
-
async onShutdown() {}
|
|
792
|
-
};
|
|
793
|
-
//#endregion
|
|
794
|
-
//#region src/shared/mixins/BaseEntityMixin.ts
|
|
795
|
-
function BaseEntity(Base) {
|
|
796
|
-
return class extends Base {
|
|
797
|
-
static from(data) {
|
|
798
|
-
const contructor = typeof this === "function" ? this : Base;
|
|
799
|
-
const instance = new contructor();
|
|
800
|
-
let payload = { ...data };
|
|
801
|
-
if (typeof contructor?.parse === "function") payload = contructor.parse(data);
|
|
802
|
-
if (typeof this?.parse === "function") payload = this.parse(data);
|
|
803
|
-
Object.assign(instance, payload);
|
|
804
|
-
return instance;
|
|
805
|
-
}
|
|
806
|
-
merge(data) {
|
|
807
|
-
Object.assign(this, data);
|
|
808
|
-
return this;
|
|
809
|
-
}
|
|
810
|
-
};
|
|
811
|
-
}
|
|
812
|
-
//#endregion
|
|
813
|
-
//#region src/shared/entities/ModuleEntity.ts
|
|
814
|
-
var Module = class extends compose(BaseEntity, mixin(LifecycleHook)) {
|
|
815
|
-
id;
|
|
816
|
-
name;
|
|
817
|
-
enabled = false;
|
|
818
|
-
dependencies = {};
|
|
819
|
-
build = {};
|
|
820
|
-
directory;
|
|
821
|
-
upgrade_info;
|
|
822
|
-
setData(data) {
|
|
823
|
-
const filtered = Object.fromEntries(Object.entries(data).filter(([, v]) => v !== void 0));
|
|
824
|
-
Object.assign(this, filtered);
|
|
825
|
-
this.hook_id = `module:${this.id}`;
|
|
826
|
-
}
|
|
827
|
-
};
|
|
828
|
-
//#endregion
|
|
829
|
-
//#region src/shared/entities/ModuleManifestEntity.ts
|
|
830
|
-
var ModuleManifest = class extends compose(BaseEntity) {
|
|
831
|
-
id;
|
|
832
|
-
name;
|
|
833
|
-
version;
|
|
834
|
-
description;
|
|
835
|
-
enabled;
|
|
836
|
-
author;
|
|
837
|
-
dependencies;
|
|
838
|
-
build;
|
|
839
|
-
};
|
|
840
|
-
//#endregion
|
|
841
|
-
export { BaseException, ConfigService, ContainerService, CookieService, DriveEntry as DriveEntryEntity, EmmitterService, LifecycleHook, LifecycleService, LoggerService, Module as ModuleEntity, ModuleManifest as ModuleManifestEntity, ShellException, TranslatorService, UploadService, ValidatorService, compose, composeWith, createId, flatten, formatBytes, mixin, permissionAssignmentSchema, permissionSchema, tokenSchema, tryCatch, unflatten, validator };
|
|
1
|
+
import{t as e}from"./chunk-0Lt9GpW0.mjs";import{debounce as t,get as n,has as r,orderBy as i,set as a,unset as o}from"lodash-es";import*as s from"valibot";import{format as c}from"date-fns";import l from"qs";import{defineAbility as u,subject as d}from"@casl/ability";var f=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let i=n.value;return typeof i!=`object`||Array.isArray(i)?!1:r(i,e.substring(t.length+1))}get(e,t){let r=this.entries.get(e);if(r)return r.value;if(!e.includes(`.`))return t;let i=e.split(`.`)[0],a=this.entries.get(i);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:n(o,e.substring(i.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),a(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(o(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}},p=class e extends Error{statusCode=500;constructor(e,t=500){super(e),this.name=this.constructor.name,this.statusCode=t}static fromError(t){return new e(t.message,500)}},m=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new p(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};function h(...e){return e.reduce((e,t)=>t(e),class{})}function g(e,...t){return t.reduce((e,t)=>t(e),e)}function _(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function v(e,t=2){if(e===0)return`0 Bytes`;let n=1024,r=t<0?0:t,i=[`Bytes`,`KB`,`MB`,`GB`,`TB`,`PB`],a=Math.floor(Math.log(e)/Math.log(n));return parseFloat((e/n**+a).toFixed(r))+` `+i[a]}function y(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=t?`${t}.${r}`:r;i&&typeof i==`object`&&!Array.isArray(i)?y(i,e,n):n[e]=i}return n}function b(e){let t={};for(let[n,r]of Object.entries(e)){let e=n.split(`.`),i=t;e.forEach((t,n)=>{n===e.length-1?i[t]=r:((!i[t]||typeof i[t]!=`object`)&&(i[t]={}),i=i[t])})}return t}async function x(e){try{return[null,await e()]}catch(e){return[e,null]}}x.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};function S(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function C(e=``){return e+S()}var w=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},ee=class{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;load(e){this.debug=e?.debug||!1,this.logger=e?.logger||new w,this.debug&&this.logger.debug(`emmitter loaded with debug mode enabled`)}on(e,t,n){let r=n?.id||C();if(n?.unique&&this.handlers.some(n=>n.event===e&&n.listener===t||n.id===r))return;let i={id:r,event:e,listener:t};return this.handlers.push(i),this.debug&&this.logger.debug(`handler added`,i),i}once(e,t,n){let r=n=>{t(n),this.off(e,r)};return this.on(e,r,n)}onDebounce(e,n,r){let i=t(n,r?.debounce||300),a=this.on(e,i,r);return a&&(a.originalListener=n),a}onAnyOf(e,t,n){let r=[];for(let i of e){let e=this.on(i,t,n);e&&r.push(e)}return r}off(e,t){this.handlers=this.handlers.filter(n=>!(n.event===e&&(n.listener===t||n.originalListener===t))),this.debug&&this.logger.debug(`handler removed`,{event:e})}emit(e,t){this.debug&&this.logger.debug(`emitting event`,{event:e,args:t});let n=this.handlers.filter(t=>t.event===e);for(let e of n)x.sync(()=>e.listener(t))}async emitAndWait(e,t){let n=this.handlers.filter(t=>t.event===e);this.debug&&this.logger.debug(`emitting event`,{handlers:n.length,event:e,args:t});for await(let e of n)await e.listener(t)}list(){return this.handlers}listByEvent(e){return this.handlers.filter(t=>t.event===e)}remove(e){let t=Array.isArray(e)?e:[e];this.handlers=this.handlers.filter(e=>!t.includes(e.id)),this.debug&&this.logger.debug(`handlers removed`,{ids:t})}clear(){this.handlers=[],this.debug&&this.logger.debug(`all handlers cleared`)}hasHandlers(){return this.handlers.length>0}},te=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new w,e.onError&&(this.onError=e.onError)}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=i(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await x(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}},T=class{static __container_entry_key=`TranslatorService`;entries;locale;localeLoaders;debug=!1;logger;cache;constructor(e={}){this.entries=e.entries||new Map,this.locale=e.locale||`en`,this.debug=e.debug||!1,this.cache=e.cache||new Map,this.logger=e.logger||new w,this.localeLoaders=new Map,this.debug&&this.logger.debug(`initialized in debug mode`,{locale:this.locale})}get locales(){return Array.from(this.localeLoaders.keys())}list(){let e=[];return this.entries.forEach((t,n)=>{e.push({key:n,value:t})}),e}async getEntries(e){let t=this.cache.get(e);if(t&&this.debug&&this.logger.debug(`load locale "${e}" from cache`,{locale:e,length:Object.keys(t).length}),t)return t;let n=this.localeLoaders.get(e);if(!n)return this.logger.warn(`no loader found for locale "${e}"`),{};let r=await n();return this.cache.set(e,r),this.debug&&this.logger.debug(`load locale ${e}`,{locale:e,keys:Object.keys(r).length}),r}async load(e){let t=await this.getEntries(e);this.entries=new Map(Object.entries(t)),this.locale=e}t(e,t={}){!this.entries.has(e)&&this.debug&&this.logger.debug(`missing translation for key "${e}"`,{key:e,locale:this.locale});let n=this.entries.get(e)||e;return Object.keys(t).length&&Object.entries(t).forEach(([e,t])=>{n=n.replace(`:${e}`,t)}),n}date(e){return new Date(e).toLocaleDateString(this.locale,{year:`numeric`,month:`2-digit`,day:`2-digit`})}datetime(e){return new Date(e).toLocaleString(this.locale,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}},E=class{static __container_entry_key=`UploadService`;single(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{name:e}),t}multiple(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{name:e}),t}},D=e({array:()=>M,arrayNumber:()=>N,boolean:()=>k,date:()=>A,datetime:()=>j,number:()=>O,object:()=>P});const O=()=>s.pipe(s.union([s.string(),s.number()]),s.transform(Number),s.integer()),k=()=>s.pipe(s.union([s.string(),s.boolean()]),s.transform(e=>e===!0||e===`true`)),A=()=>s.pipe(s.union([s.string(),s.date()]),s.transform(e=>e instanceof Date?e:new Date(e)),s.transform(e=>e&&c(e,`yyyy-MM-dd`))),j=()=>s.pipe(s.union([s.string(),s.date()]),s.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),c(e,`yyyy-MM-dd HH:mm`))))),M=(e=s.any())=>s.pipe(s.union([s.string(),s.array(s.string())]),s.transform(e=>Array.isArray(e)?e:e.split(`,`)),s.array(e)),N=()=>s.pipe(M(),s.transform(e=>e.map(Number))),P=()=>s.pipe(s.union([s.string(),s.record(s.string(),s.any())]),s.transform(e=>typeof e==`string`?l.parse(e):e),s.transform(e=>{let t={};for(let r in e)a(t,r,n(e,r));return t}));var F=e({base:()=>I});const I=(e={})=>s.object({page:s.optional(O(),1),limit:s.optional(O(),e.maxLimit||100),orderBy:s.optional(e.orderFields?M(s.picklist(e.orderFields)):M(s.string()),[]),orderDirection:s.optional(M(s.union([s.literal(`asc`),s.literal(`desc`)])),[])}),L={url:D,pagination:F};var R=class{static __container_entry_key=`ValidatorService`;v={...s,extras:L};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=s.safeParse(n,e);if(!a){let e=s.flatten(i),t=[];e.root&&t.push(...e.root),e.nested&&Object.entries(e.nested).forEach(e=>{let[n,r]=e;t.push(...r.map(e=>`${n}: ${e}`))});let n=new p(t.length?t.join(`, `):`Validation failed`,422);throw n.name=`ValidationError`,Object.assign(n,{messages:t}),n}return r}async validateAsync(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=await s.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=s.flatten(i),n={...t.root,...t.nested};throw Object.assign(e,{details:n}),e}return r}isValid(e,t){let n=typeof t==`function`?t(this.v):t,{success:r}=s.safeParse(n,e);return r}};function z(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function B(e){let t={},n=e.split(`?`)[1];return n?l.parse(n):t}const ne=s.object({id:s.number(),permission_id:s.number(),assignable_type:s.string(),assignable_id:s.string(),created_at:s.string(),updated_at:s.string()}),V=s.object({id:s.number(),name:s.nullable(s.string()),description:s.nullable(s.string()),action:s.string(),subject:s.string(),conditions:s.nullable(s.string()),created_at:s.string(),updated_at:s.string(),expires_at:s.string()}),H=s.object({id:s.number(),name:s.nullable(s.string()),type:s.string(),user_id:s.number(),token:s.string(),created_at:s.string(),updated_at:s.string(),expires_at:s.string()});var U=class extends p{output;bin;args;constructor(e,t,n,r){super(e,501),this.output=t,this.bin=n,this.args=r}};const W=new R;function G(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}var K=class extends h(G){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=x.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},q=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>K.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new w().child({label:`acl`}),this.ability=u(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=d(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=d(t,n);return this.ability.cannot(e,r)}subject(e,t){return d(e,t)}},J=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}},Y=class{name;path;type;metas={};constructor(e){Object.assign(this,e)}};function X(e){return class extends e{deleted_at=null}}function Z(e){return class extends e{created_at;updated_at}}var re=class extends h(G,Z,X){id;drive;mimetype;purpose;client_name;filename;public;url;metas;isImage(){return this.mimetype.startsWith(`image/`)}},ie=class extends h(G,Z,X){id;purpose;mime_types;max_size;upload_url;create_file_url;getParsedMimeTypes(){return this.mime_types.split(`,`).map(e=>e.trim())}isAllowedMimeType(e){let t=this.getParsedMimeTypes();return t.includes(e)||t.includes(`*/*`)}isAllowedSize(e){return e<=this.max_size}},ae=class{static __container_entry_key=`HeaderMapEntity`;entries;setHeader;constructor(e){this.entries=new Map,this.setHeader=e?.setHeader,e?.headers&&this.loadFromRecord(e.headers)}loadFromRecord(e){for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){return this.entries.get(e)||t}set(e,t){if(!this.setHeader)throw new p(`setHeader function is not defined`);this.entries.set(e,t)}toRecord(){let e={},t=Array.from(this.entries.entries());for(let[n,r]of t)e[n]=r;return e}},Q=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},oe=class extends h(G,_(Q)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}},$=class extends h(G){id;name;version;description;enabled;author;dependencies;build},se=class e{items;total;page;per_page;total_pages;constructor(e){Object.assign(this,e)}static from(t){return new e(t)}},ce=class extends h(G){id;name;version;enabled},le=class extends h(G,Z,X){id;name;description},ue=class extends h(G,Z,X){id;email;name;username;password;verified_at;permissions;roles;get initials(){let[e,t]=this.name.split(` `);return t?e[0].toUpperCase()+t[0].toUpperCase():e[0].toUpperCase()}};export{q as AclEntity,p as BaseException,f as ConfigService,m as ContainerService,J as CookieMapEntity,Y as DriveEntryEntity,ee as EmmitterService,re as FileEntity,ie as FileUploadSessionEntity,ae as HeaderMapEntity,Q as LifecycleHook,te as LifecycleService,w as LoggerService,oe as ModuleEntity,$ as ModuleManifestEntity,se as PaginationEntity,K as PermissionEntity,ce as PluginEntity,le as RoleEntity,U as ShellException,T as TranslatorService,E as UploadService,ue as UserEntity,R as ValidatorService,h as compose,g as composeWith,C as createId,y as flatten,v as formatBytes,_ as mixin,z as parseUrlParams,B as parseUrlQuery,ne as permissionAssignmentSchema,V as permissionSchema,H as tokenSchema,x as tryCatch,b as unflatten,W as validator};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiUGVybWlzc2lvbiIsInN1YmplY3QiLCJjcmVhdGVTdWJqZWN0IiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2Zvcm1hdEJ5dGVzLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9mbGF0dGVuLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy90cnlDYXRjaC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvY3JlYXRlSWQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVHJhbnNsYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1VwbG9hZFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvdXJsVmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC92YWxpZGF0b3JzL3BhZ2luYXRpb25WYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy90b2tlblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZXhjZXB0aW9ucy9TaGVsbEV4Y2VwdGlvbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Ecml2ZUVudHJ5RW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVVcGxvYWRTZXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9IZWFkZXJNYXBFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BhZ2luYXRpb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUm9sZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvVXNlckVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXQsIHNldCwgaGFzLCB1bnNldCB9IGZyb20gJ2xvZGFzaC1lcydcblxuaW50ZXJmYWNlIEVudHJ5IHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIHZhbHVlOiBhbnlcbiAgICBzb3VyY2U6IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdDb25maWdTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIEVudHJ5PlxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXAoKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmVuZHNXaXRoKCc6Ym9vbGVhbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgnOmJvb2xlYW4nLCAnJykudHJpbSgpID09PSAndHJ1ZSdcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbUVudHJpZXMoZW50cmllczogW3N0cmluZywgYW55XVtdLCBzb3VyY2UgPSAndW5rbm93Jyk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVZhbHVlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBlbnRyeS52YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5RW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHByaW1hcnkpXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5RW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeSA/IHRydWUgOiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzKHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSkpXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUID0gYW55IHwgdW5kZWZpbmVkPihrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkudmFsdWUgYXMgVFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnkudmFsdWUgOiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJpbWFyeUVudHJ5LnZhbHVlXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldCh2YWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCBkZWZhdWx0VmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPbmU8VCA9IGFueSB8IHVuZGVmaW5lZD4oa2V5czogc3RyaW5nW10sIGRlZmF1bHRWYWx1ZT86IGFueSk6IFQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldDxUPihrZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlID0gJ3J1bnRpbWUnKTogdm9pZCB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBsZXQgcHJpbWFyeVZhbHVlID0gdGhpcy5nZXQocHJpbWFyeSwge30pXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcHJpbWFyeVZhbHVlID0ge31cbiAgICAgICAgfVxuXG4gICAgICAgIHNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSwgdmFsdWUpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChwcmltYXJ5LCB7XG4gICAgICAgICAgICBrZXk6IHByaW1hcnksXG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgIHZhbHVlOiBwcmltYXJ5VmFsdWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zZXQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAoIXByaW1hcnlWYWx1ZSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB1bnNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogJ3J1bnRpbWUnLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmNsZWFyKClcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICAgIHB1YmxpYyBzdGF0dXNDb2RlOiBudW1iZXIgPSA1MDBcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1c0NvZGU6IG51bWJlciA9IDUwMCkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKVxuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUVycm9yKGVycm9yOiBFcnJvcik6IEJhc2VFeGNlcHRpb24ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VFeGNlcHRpb24oZXJyb3IubWVzc2FnZSwgNTAwKVxuICAgIH1cbn0iLCJpbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tIFwiI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHNcIlxuXG50eXBlIENvbnN0cnVjdG9yPFQgPSBvYmplY3Q+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuXG50eXBlIEVudHJ5S2V5ID0gc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0b3JcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udGFpbmVyU2VydmljZSB7XG4gICAgcHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxFbnRyeUtleSwgYW55PigpXG5cbiAgICBwdWJsaWMgbG9hZEZyb21SZWNvcmQocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJlY29yZCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRbU3RyaW5nKGtleSldID0gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWNvcmRcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEtleShwYXlsb2FkOiBFbnRyeUtleSk6IEVudHJ5S2V5IHtcbiAgICAgICAgbGV0IGtleSA9IHBheWxvYWRcblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBrZXkgPSBwYXlsb2FkLm5hbWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQ29uc3RydWN0b3IgPSB0eXBlb2YgcGF5bG9hZCAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHBheWxvYWQgIT09ICdzeW1ib2wnXG5cbiAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgIShwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5KSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFdhcm5pbmc6IFRoZSBjb25zdHJ1Y3RvciAke3BheWxvYWQubmFtZX0gZG9lcyBub3QgaGF2ZSBhIHVuaXF1ZSBpZGVudGlmaWVyLiBDb25zaWRlciBhZGRpbmcgYSBzdGF0aWMgcHJvcGVydHkgX19jb250YWluZXJfZW50cnlfa2V5IHRvIGF2b2lkIHBvdGVudGlhbCBjb25mbGljdHMuYClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmIChwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5KSB7XG4gICAgICAgICAgICBrZXkgPSAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGtleVxuXG4gICAgfVxuXG4gICAgcHVibGljIHNldChwYXlsb2FkOiBFbnRyeUtleSwgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB2YWx1ZSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMocGF5bG9hZDogRW50cnlLZXkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmhhcyhrZXkpXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUPihwYXlsb2FkOiBFbnRyeUtleSk6IFQge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgRW50cnkgd2l0aCBrZXkgXCIke1N0cmluZyhrZXkpfVwiIG5vdCBmb3VuZCBpbiBjb250YWluZXIuYClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgcHVibGljIHNpbmdsZXRvbjxUPihjbGFzc0NvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPik6IFQge1xuICAgICAgICBjb25zdCBrZXkgPSBjbGFzc0NvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgY2xhc3NDb25zdHJ1Y3RvcigpXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCBuZXdJbnN0YW5jZSlcbiAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoZW50cmllczogUmVjb3JkPGFueSwgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhlbnRyaWVzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHByb3h5PFQgPSB1bmtub3duPihrZXk6IEVudHJ5S2V5KTogVCB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoe30sIHtcbiAgICAgICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbnRyeVtwcm9wXVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuYmluZChlbnRyeSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlbcHJvcF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IChfdGFyZ2V0LCBwcm9wLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXQ8VD4oa2V5KSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGVudHJ5W3Byb3BdID0gdmFsdWVcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pIGFzIFRcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5cygpOiBFbnRyeUtleVtdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLmtleXMoKSlcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuL3R5cGluZy50cydcblxuZXhwb3J0IHR5cGUgQW55Q2xhc3MgPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG5leHBvcnQgdHlwZSBNaXhpbjxUPiA9IChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8VD5cblxuLyoqXG4gKiBDb21wb3NlcyBtdWx0aXBsZSBtaXhpbnMgaW50byBhIHNpbmdsZSBjbGFzcyB0aGF0IGNhbiBiZSBleHRlbmRlZC5cbiAqIEFsbG93cyBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UtbGlrZSBiZWhhdmlvciBieSBhcHBseWluZyBtaXhpbnMgc2VxdWVudGlhbGx5LlxuICogXG4gKiBAcGFyYW0gbWl4aW5zIC0gQXJyYXkgb2YgbWl4aW4gZnVuY3Rpb25zIHRvIGNvbXBvc2VcbiAqIEByZXR1cm5zIEEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBpbmNsdWRlcyBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2UoVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZTxcbiAgICBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yPGFueT4pID0+IENvbnN0cnVjdG9yPGFueT4+XG4+KC4uLm1peGluczogTSk6IFVuaW9uVG9JbnRlcnNlY3Rpb248UmV0dXJuVHlwZTxNW251bWJlcl0+PiB7XG4gICAgcmV0dXJuIG1peGlucy5yZWR1Y2UoKGJhc2UsIG1peGluKSA9PiBtaXhpbihiYXNlKSwgY2xhc3Mge30gYXMgYW55KSBhcyBhbnlcbn1cblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBjb21wb3NlIGZ1bmN0aW9uIHRoYXQgc3RhcnRzIHdpdGggYSBiYXNlIGNsYXNzXG4gKiBcbiAqIEBwYXJhbSBiYXNlQ2xhc3MgLSBUaGUgYmFzZSBjbGFzcyB0byBzdGFydCB3aXRoXG4gKiBAcGFyYW0gbWl4aW5zIC0gQXJyYXkgb2YgbWl4aW4gZnVuY3Rpb25zIHRvIGFwcGx5XG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgZXh0ZW5kcyB0aGUgYmFzZSBjbGFzcyB3aXRoIGFsbCBtaXhpbiBmdW5jdGlvbmFsaXR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZUVudGl0eSwgVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZVdpdGg8XG4gICAgVEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3RvcixcbiAgICBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPihcbiAgICBiYXNlQ2xhc3M6IFRCYXNlLFxuICAgIC4uLm1peGluczogTVxuKTogVEJhc2UgJiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGJhc2VDbGFzcyBhcyBhbnkpIGFzIGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWl4aW48VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oU291cmNlOiBUQmFzZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiA8VFRhcmdldCBleHRlbmRzIENvbnN0cnVjdG9yPihUYXJnZXQ6IFRUYXJnZXQpIHtcbiAgICAgICAgY2xhc3MgTWl4ZWQgZXh0ZW5kcyBUYXJnZXQge1xuICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBTb3VyY2UoLi4uYXJncylcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHNvdXJjZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvcHkgbWV0aG9kc1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoU291cmNlLnByb3RvdHlwZSkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgIE1peGVkLnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNvdXJjZS5wcm90b3R5cGUsIGtleSkhXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE1peGVkIGFzIFRUYXJnZXQgJiBUQmFzZVxuICAgIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlczogbnVtYmVyLCBkZWNpbWFscyA9IDIpIHtcbiAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCeXRlcydcblxuICAgIGNvbnN0IGsgPSAxMDI0XG4gICAgY29uc3QgZG0gPSBkZWNpbWFscyA8IDAgPyAwIDogZGVjaW1hbHNcbiAgICBjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInXVxuXG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpXG5cbiAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZChkbSkpICsgJyAnICsgc2l6ZXNbaV1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKG9iajogYW55LCBwcmVmaXggPSAnJywgcmVzOiBhbnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgY29uc3QgbmV3S2V5ID0gcHJlZml4ID8gYCR7cHJlZml4fS4ke2tleX1gIDoga2V5XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZmxhdHRlbih2YWx1ZSwgbmV3S2V5LCByZXMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNbbmV3S2V5XSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKG9iajogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0ga2V5LnNwbGl0KCcuJylcbiAgICAgICAgbGV0IGN1cnJlbnQ6IGFueSA9IHJlc3VsdFxuICAgICAgICBwYXJ0cy5mb3JFYWNoKChwYXJ0LCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gcGFydHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRbcGFydF0gPSB2YWx1ZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRbcGFydF0gfHwgdHlwZW9mIGN1cnJlbnRbcGFydF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRbcGFydF0gPSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG59IiwiaW50ZXJmYWNlIFRyeWVyIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBhbnlcbn1cblxuaW50ZXJmYWNlIFRyeWVyQXN5bmMge1xuICAgICguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8YW55PiB8IGFueVxufVxuXG50eXBlIFRyeUNhdGNoUmVzdWx0PFQgZXh0ZW5kcyBUcnllcj4gPSBbbnVsbCwgUmV0dXJuVHlwZTxUPl0gfCBbRXJyb3IsIG51bGxdXG5cbnR5cGUgVHJ5Q2F0Y2hBc3luY1Jlc3VsdDxUIGV4dGVuZHMgVHJ5ZXJBc3luYz4gPSBbbnVsbCwgQXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pl0gfCBbRXJyb3IsIG51bGxdXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cnlDYXRjaDxUIGV4dGVuZHMgVHJ5ZXJBc3luYz4odHJ5ZXI6IFQpOiBQcm9taXNlPFRyeUNhdGNoQXN5bmNSZXN1bHQ8VD4+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cblxudHJ5Q2F0Y2guc3luYyA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgVHJ5ZXI+KHRyeWVyOiBUKTogVHJ5Q2F0Y2hSZXN1bHQ8VD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRyeWVyKClcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBhbnksIG51bGxdXG4gICAgfVxufVxuIiwiZnVuY3Rpb24gdXVpZCgpe1xuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuY3J5cHRvICYmIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0byAmJiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGVudmlyb25tZW50cyB3aXRob3V0IGNyeXB0by5yYW5kb21VVUlEXG4gICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMFxuICAgICAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4OFxuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNilcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSWQocHJlZml4ID0gJycpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgdXVpZCgpXG59IiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZ2dlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xvZ2dlclNlcnZpY2UnIFxuXG4gICAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cblxuICAgIHB1YmxpYyBjaGlsZChvcHRpb25zOiBhbnkpOiBMb2dnZXJTZXJ2aWNlIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgICAgICByZXR1cm4gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgY3JlYXRlSWQsIHRyeUNhdGNoIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXgudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnXG5cbmludGVyZmFjZSBFbW1pdHRlckhhbmRsZXIge1xuICAgIGlkOiBzdHJpbmdcbiAgICBldmVudDogc3RyaW5nXG4gICAgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gICAgb3JpZ2luYWxMaXN0ZW5lcj86ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG59XG5cbmludGVyZmFjZSBPbk9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nXG4gICAgdW5pcXVlPzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgT25EZWJvdW5jZU9wdGlvbnMgZXh0ZW5kcyBPbk9wdGlvbnMge1xuICAgIGRlYm91bmNlPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbW1pdHRlclNlcnZpY2U8RXZlbnRzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdFbW1pdHRlclNlcnZpY2UnXG5cbiAgICBwcml2YXRlIGhhbmRsZXJzOiBFbW1pdHRlckhhbmRsZXJbXSA9IFtdXG4gICAgcHJpdmF0ZSBkZWJ1ZzogYm9vbGVhblxuICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBwdWJsaWMgbG9hZChvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucz8uZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zPy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1taXR0ZXIgbG9hZGVkIHdpdGggZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbjxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgbGlzdGVuZXI6IChhcmdzOiBFdmVudHNbS10pID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCBpZCA9IG9wdGlvbnM/LmlkIHx8IGNyZWF0ZUlkKClcblxuICAgICAgICBpZiAob3B0aW9ucz8udW5pcXVlKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmhhbmRsZXJzLnNvbWUoaCA9PiAoaC5ldmVudCA9PT0gZXZlbnQgJiYgaC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHx8IGguaWQgPT09IGlkKVxuXG4gICAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVyOiBFbW1pdHRlckhhbmRsZXIgPSB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgbGlzdGVuZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlciBhZGRlZCcsIGhhbmRsZXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgIH1cblxuICAgIHB1YmxpYyBvbmNlPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXIoYXJncylcblxuICAgICAgICAgICAgdGhpcy5vZmYoZXZlbnQsIHdyYXBwZXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5vbihldmVudCwgd3JhcHBlciwgb3B0aW9ucylcbiAgICB9XG5cblxuICAgIHB1YmxpYyBvbkRlYm91bmNlPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uRGVib3VuY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbkRlYm91bmNlT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbkRlYm91bmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbkRlYm91bmNlT3B0aW9ucykge1xuICAgICAgICBjb25zdCBkZWJvdW5jZWQgPSBkZWJvdW5jZShsaXN0ZW5lciwgb3B0aW9ucz8uZGVib3VuY2UgfHwgMzAwKVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm9uKGV2ZW50LCBkZWJvdW5jZWQsIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGhhbmRsZXIub3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RlbmVyXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgIH1cblxuICAgIHB1YmxpYyBvbkFueU9mPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50czogS1tdLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdXG4gICAgcHVibGljIG9uQW55T2YoZXZlbnRzOiBzdHJpbmdbXSwgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJbXVxuICAgIHB1YmxpYyBvbkFueU9mKGV2ZW50czogc3RyaW5nW10sIGxpc3RlbmVyOiBGdW5jdGlvbiwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCBoYW5kbGVyczogRW1taXR0ZXJIYW5kbGVyW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5vbihldmVudCwgbGlzdGVuZXIgYXMgYW55LCBvcHRpb25zKVxuXG4gICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnB1c2goaGFuZGxlcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyc1xuICAgIH1cblxuICAgIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IHtcbiAgICAgICAgICAgIGlmIChoLmV2ZW50ID09PSBldmVudCAmJiAoaC5saXN0ZW5lciA9PT0gbGlzdGVuZXIgfHwgaC5vcmlnaW5hbExpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2hhbmRsZXIgcmVtb3ZlZCcsIHsgZXZlbnQgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBhcmdzOiBFdmVudHNbS10pOiB2b2lkXG4gICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSk6IHZvaWRcbiAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KSB7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdlbWl0dGluZyBldmVudCcsIHtcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgdHJ5Q2F0Y2guc3luYygoKSA9PiBoYW5kbGVyLmxpc3RlbmVyKGFyZ3MpKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBhcmdzOiBFdmVudHNbS10pOiBQcm9taXNlPHZvaWQ+XG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpOiBQcm9taXNlPHZvaWQ+XG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpIHtcblxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiBoLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtaXR0aW5nIGV2ZW50Jywge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzOiBoYW5kbGVycy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgYXJnc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlci5saXN0ZW5lcihhcmdzKVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgbGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnNcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdEJ5RXZlbnQoZXZlbnQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiBoLmV2ZW50ID09PSBldmVudClcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlKHBheWxvYWQ6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdXG5cbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gIWlkcy5pbmNsdWRlcyhoLmlkKSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2hhbmRsZXJzIHJlbW92ZWQnLCB7IGlkcyB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gW11cblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2FsbCBoYW5kbGVycyBjbGVhcmVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNIYW5kbGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoID4gMFxuICAgIH1cbn1cbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCB0eXBlIExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJ1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnLi4vdXRpbHMvdHJ5Q2F0Y2gudHMnXG5pbXBvcnQgeyBvcmRlckJ5IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG50eXBlIExpZmVjeWNsZU1ldGhvZCA9ICdyZWdpc3RlcicgfCAnbG9hZCcgfCAnYm9vdCcgfCAnc2h1dGRvd24nXG5cbmludGVyZmFjZSBMaXN0T3B0aW9ucyB7XG4gICAgaW5jbHVkZT86IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgZXhjbHVkZT86IHN0cmluZyB8IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIGhvb2tzPzogTWFwPHN0cmluZywgTGlmZWN5Y2xlSG9vaz5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG4gICAgb25FcnJvcj86IChlcnJvcjogRXJyb3IsIGNvbnRleHQ6IHsgaG9va0lkOiBzdHJpbmc7IG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kIH0pID0+IHZvaWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTGlmZWN5Y2xlU2VydmljZSdcblxuICAgIHB1YmxpYyBob29rczogTWFwPHN0cmluZywgTGlmZWN5Y2xlSG9vaz5cbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IExpZmVjeWNsZVNlcnZpY2VPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgPz8gdGhpcy5kZWJ1Z1xuICAgICAgICB0aGlzLmhvb2tzID0gZGF0YS5ob29rcyA/PyBuZXcgTWFwKClcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciA/PyBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgICAgIFxuICAgICAgICBpZiAoZGF0YS5vbkVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IgPSBkYXRhLm9uRXJyb3JcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkVycm9yKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGNvbnRleHQgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaG9vayAke2NvbnRleHQubWV0aG9kfSAoJHtjb250ZXh0Lmhvb2tJZH0pOmAsIGVycm9yKVxuICAgIH1cblxuICAgIHB1YmxpYyBtYXBBbGlhc2VzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXVxuICAgICAgICBjb25zdCBhbGwgPSBBcnJheS5mcm9tKHRoaXMuaG9va3MudmFsdWVzKCkpXG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGFsbCkge1xuICAgICAgICAgICAgaWYgKGFyZ3MuaW5jbHVkZXMoaG9vay5ob29rX2lkKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaG9vay5ob29rX2FsaWFzZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkQWxpYXMgPSBob29rLmhvb2tfYWxpYXNlcy5maW5kKGFsaWFzID0+IGFyZ3MuaW5jbHVkZXMoYWxpYXMpKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRBbGlhcykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChob29rLmhvb2tfaWQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KG9wdGlvbnM/OiBMaXN0T3B0aW9ucykge1xuICAgICAgICBsZXQgaG9va3MgPSBBcnJheS5mcm9tKHRoaXMuaG9va3MudmFsdWVzKCkpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmV4Y2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuZXhjbHVkZSkgPyBvcHRpb25zLmV4Y2x1ZGUgOiBbb3B0aW9ucy5leGNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+ICFpZHMuaW5jbHVkZXMoaG9vay5ob29rX2lkKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5pbmNsdWRlKSB7XG4gICAgICAgICAgICBsZXQgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmluY2x1ZGUpID8gb3B0aW9ucy5pbmNsdWRlIDogW29wdGlvbnMuaW5jbHVkZV1cblxuICAgICAgICAgICAgaWRzID0gdGhpcy5tYXBBbGlhc2VzKGlkcylcblxuICAgICAgICAgICAgaG9va3MgPSBob29rcy5maWx0ZXIoaG9vayA9PiBpZHMuaW5jbHVkZXMoaG9vay5ob29rX2lkKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGhvb2tzID0gb3JkZXJCeShob29rcywgWydvcmRlciddLCBbJ2FzYyddKVxuXG4gICAgICAgIHJldHVybiBob29rc1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGQoLi4ucGF5bG9hZDogKExpZmVjeWNsZUhvb2sgfCBDb25zdHJ1Y3RvcjxMaWZlY3ljbGVIb29rPilbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnN0YW5jZXM6IExpZmVjeWNsZUhvb2tbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBheWxvYWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlcy5wdXNoKG5ldyBpdGVtKCkpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2goaXRlbSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBpbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGlmICghaG9vay5ob29rX2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignU2tpcHBpbmcgaG9vayB3aXRob3V0IGhvb2tfaWQ6JywgaG9vaylcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmhvb2tzLnNldChob29rLmhvb2tfaWQsIGhvb2spXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2FkZCAnICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaG9vay5zdWJob29rcykge1xuICAgICAgICAgICAgICAgIGhvb2suc3ViaG9va3MuZm9yRWFjaChzdWJob29rID0+IHRoaXMuYWRkKHN1Ymhvb2spKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXRNZXRob2QobWV0aG9kOiBMaWZlY3ljbGVNZXRob2QsIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBob29rcyA9IHRoaXMubGlzdChvcHRpb25zKSBcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGVtaXR0aW5nICR7bWV0aG9kfSBmb3IgaG9va3M6YCwge1xuICAgICAgICAgICAgICAgIGhvb2tzOiBob29rcy5tYXAoaG9vayA9PiBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIHRoaXMubGlzdChvcHRpb25zKSkge1xuICAgICAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgICAgIHJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5yZWdpc3RlcigpLCBob29rLm9uUmVnaXN0ZXIoKV0pLFxuICAgICAgICAgICAgICAgIGxvYWQ6ICgpID0+IFByb21pc2UuYWxsKFtob29rLmxvYWQoKSwgaG9vay5vbkxvYWQoKV0pLFxuICAgICAgICAgICAgICAgIGJvb3Q6ICgpID0+IFByb21pc2UuYWxsKFtob29rLmJvb3QoKSwgaG9vay5vbkJvb3QoKV0pLFxuICAgICAgICAgICAgICAgIHNodXRkb3duOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5zaHV0ZG93bigpLCBob29rLm9uU2h1dGRvd24oKV0pLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gbWFwW21ldGhvZF0oKSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yLCB7IGhvb2tJZDogaG9vay5ob29rX2lkLCBtZXRob2QgfSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke21ldGhvZH0gYCArIGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0KHBheWxvYWQ6IExpZmVjeWNsZU1ldGhvZCB8IExpZmVjeWNsZU1ldGhvZFtdLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbWV0aG9kcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdXG5cbiAgICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0TWV0aG9kKG1ldGhvZCwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcihvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgncmVnaXN0ZXInLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdsb2FkJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYm9vdChvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnYm9vdCcsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3NodXRkb3duJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG9va3MuY2xlYXIoKVxuICAgIH1cbn1cbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJhbnNsYXRvclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1RyYW5zbGF0b3JTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgbG9jYWxlOiBzdHJpbmdcbiAgICBwdWJsaWMgbG9jYWxlTG9hZGVyczogTWFwPHN0cmluZywgKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj5cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgY2FjaGU6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPFRyYW5zbGF0b3JTZXJ2aWNlPiA9IHt9KSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IGRhdGEuZW50cmllcyB8fCBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgICAgIHRoaXMubG9jYWxlID0gZGF0YS5sb2NhbGUgfHwgJ2VuJ1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmNhY2hlID0gZGF0YS5jYWNoZSB8fCBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5sb2NhbGVMb2FkZXJzID0gbmV3IE1hcDxzdHJpbmcsICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4+KClcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9jYWxlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubG9jYWxlTG9hZGVycy5rZXlzKCkpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgICAgICBjb25zdCBpdGVtczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RW50cmllcyhsb2NhbGU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGUuZ2V0KGxvY2FsZSkhXG5cbiAgICAgICAgaWYgKGNhY2hlICYmIHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBsb2FkIGxvY2FsZSBcIiR7bG9jYWxlfVwiIGZyb20gY2FjaGVgLCB7XG4gICAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogT2JqZWN0LmtleXMoY2FjaGUpLmxlbmd0aFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2FkZXIgPSB0aGlzLmxvY2FsZUxvYWRlcnMuZ2V0KGxvY2FsZSlcblxuICAgICAgICBpZiAoIWxvYWRlcikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybihgbm8gbG9hZGVyIGZvdW5kIGZvciBsb2NhbGUgXCIke2xvY2FsZX1cImApXG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBsb2FkZXIoKVxuXG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KGxvY2FsZSwgZW50cmllcylcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGxvYWQgbG9jYWxlICR7bG9jYWxlfWAsIHtcbiAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAga2V5czogT2JqZWN0LmtleXMoZW50cmllcykubGVuZ3RoXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChsb2NhbGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5nZXRFbnRyaWVzKGxvY2FsZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihPYmplY3QuZW50cmllcyhlbnRyaWVzKSlcblxuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZVxuICAgIH1cblxuICAgIHB1YmxpYyB0KGtleTogc3RyaW5nLCBhcmdzOiBhbnkgPSB7fSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmhhcyhrZXkpICYmIHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBtaXNzaW5nIHRyYW5zbGF0aW9uIGZvciBrZXkgXCIke2tleX1cImAsIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpIHx8IGtleVxuXG4gICAgICAgIGxldCB0cmFuc2xhdGlvbiA9IGVudHJ5XG5cbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhhcmdzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoYXJncykuZm9yRWFjaCgoW2FLZXksIGFWYWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb24ucmVwbGFjZShgOiR7YUtleX1gLCBhVmFsdWUpXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uXG4gICAgfVxuXG4gICAgcHVibGljIGRhdGUoZGF0YTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0YSlcblxuICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGUsIHtcbiAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICBkYXk6ICcyLWRpZ2l0J1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBkYXRldGltZShkYXRhOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRhKVxuXG4gICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKHRoaXMubG9jYWxlLCB7XG4gICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdVcGxvYWRTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHNpbmdsZShuYW1lOiBzdHJpbmcpe1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgbmFtZSB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIG11bHRpcGxlKG5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgbmFtZSB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnXG5pbXBvcnQgeyBnZXQsIHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCBxcyBmcm9tICdxcydcblxuZXhwb3J0IGNvbnN0IG51bWJlciA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2Lm51bWJlcigpXSksXG4gICAgdi50cmFuc2Zvcm0oTnVtYmVyKSxcbiAgICB2LmludGVnZXIoKSxcbilcblxuZXhwb3J0IGNvbnN0IGJvb2xlYW4gPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5ib29sZWFuKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPT09IHRydWUgfHwgdiA9PT0gJ3RydWUnKSxcbilcblxuZXhwb3J0IGNvbnN0IGRhdGUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgaW5zdGFuY2VvZiBEYXRlID8gdiA6IG5ldyBEYXRlKHYpKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPyBmb3JtYXQodiwgJ3l5eXktTU0tZGQnKSA6IHYpLFxuKVxuXG5leHBvcnQgY29uc3QgZGF0ZXRpbWUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHtcbiAgICAgICAgaWYgKCF2KSByZXR1cm4gdlxuXG4gICAgICAgIGlmICh2ID09PSAnbnVsbCcpIHJldHVybiBudWxsXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdiA9IG5ldyBEYXRlKHYpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0KHYsICd5eXl5LU1NLWRkIEhIOm1tJylcbiAgICB9KSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5ID0gPFQgZXh0ZW5kcyB2LkJhc2VTY2hlbWE8YW55LCBhbnksIGFueT4+KHNjaGVtYTogVCA9IHYuYW55KCkgYXMgYW55IGFzIFQpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmFycmF5KHYuc3RyaW5nKCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlLnNwbGl0KCcsJykpLFxuICAgIHYuYXJyYXkoc2NoZW1hKSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5TnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIGFycmF5KCksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdmFsdWUubWFwKE51bWJlcikpLFxuKVxuXG5leHBvcnQgY29uc3Qgb2JqZWN0ID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYucmVjb3JkKHYuc3RyaW5nKCksIHYuYW55KCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHFzLnBhcnNlKHZhbHVlKSA6IHZhbHVlKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIHNldChyZXN1bHQsIGtleSwgZ2V0KHZhbHVlLCBrZXkpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0pLFxuKVxuXG4iLCJpbXBvcnQgeyBudW1iZXIsIGFycmF5IH0gZnJvbSAnLi91cmxWYWxpZGF0b3IudHMnXG5pbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblBhcmFtcyB7XG4gICAgbWF4TGltaXQ/OiBudW1iZXJcbiAgICBvcmRlckZpZWxkcz86IHN0cmluZ1tdXG59XG5cblxuZXhwb3J0IGNvbnN0IGJhc2UgPSAob3B0aW9uczogUGFnaW5hdGlvblBhcmFtcyA9IHt9KSA9PiB2Lm9iamVjdCh7XG4gICAgcGFnZTogdi5vcHRpb25hbChudW1iZXIoKSwgMSksXG4gICAgbGltaXQ6IHYub3B0aW9uYWwobnVtYmVyKCksIG9wdGlvbnMubWF4TGltaXQgfHwgMTAwKSxcbiAgICBvcmRlckJ5OiB2Lm9wdGlvbmFsKG9wdGlvbnMub3JkZXJGaWVsZHMgPyBhcnJheSh2LnBpY2tsaXN0KG9wdGlvbnMub3JkZXJGaWVsZHMpKSA6IGFycmF5KHYuc3RyaW5nKCkpLCBbXSksXG4gICAgb3JkZXJEaXJlY3Rpb246IHYub3B0aW9uYWwoYXJyYXkodi51bmlvbihbdi5saXRlcmFsKCdhc2MnKSwgdi5saXRlcmFsKCdkZXNjJyldKSksIFtdKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5pbXBvcnQgKiBhcyB1cmwgZnJvbSAnI3NoYXJlZC92YWxpZGF0b3JzL3VybFZhbGlkYXRvci50cydcbmltcG9ydCAqIGFzIHBhZ2luYXRpb24gZnJvbSAnI3NoYXJlZC92YWxpZGF0b3JzL3BhZ2luYXRpb25WYWxpZGF0b3IudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmNvbnN0IGV4dHJhcyA9IHtcbiAgICB1cmwsXG4gICAgcGFnaW5hdGlvbixcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWJvdCA9IHR5cGVvZiB2ICYgeyBleHRyYXM6IHR5cGVvZiBleHRyYXMgfSBcblxuZXhwb3J0IHR5cGUgVmFsaWJvdFNjaGVtYSA9IHYuQmFzZVNjaGVtYTx1bmtub3duLCB1bmtub3duLCB2LkJhc2VJc3N1ZTx1bmtub3duPj5cbmV4cG9ydCB0eXBlIFZhbGlib3RTY2hlbWFBc3luYyA9IHYuQmFzZVNjaGVtYUFzeW5jPHVua25vd24sIHVua25vd24sIHYuQmFzZUlzc3VlPHVua25vd24+PlxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvckNhbGxiYWNrPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPiB7XG4gICAgKF92OiBWYWxpYm90KTogVFxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hQXN5bmM+ID0ge1xuICAgIChfdjogVmFsaWJvdCk6IFRcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yUmVzdWx0PFQgZXh0ZW5kcyB2Lk9iamVjdEVudHJpZXM+ID0gdi5JbmZlck91dHB1dDx2Lk9iamVjdFNjaGVtYTxULCB1bmRlZmluZWQ+PlxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVBheWxvYWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPSBWYWxpYm90U2NoZW1hPiA9IFZhbGlkYXRvckNhbGxiYWNrPFQ+IHwgVFxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVJlc3VsdDxUIGV4dGVuZHMgVmFsaWRhdGVQYXlsb2FkPiA9XG4gICAgVCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPyB2LkluZmVyT3V0cHV0PFQ+IDpcbiAgICBUIGV4dGVuZHMgVmFsaWRhdG9yQ2FsbGJhY2s8aW5mZXIgVT4gPyB2LkluZmVyT3V0cHV0PFU+IDpcbiAgICB1bmtub3duXG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmFsaWRhdG9yU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVmFsaWRhdG9yU2VydmljZSdcblxuICAgIHB1YmxpYyB2OiBWYWxpYm90ID0ge1xuICAgICAgICAuLi52LFxuICAgICAgICBleHRyYXMsXG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZTxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4oY2I6IFZhbGlkYXRvckNhbGxiYWNrPFQ+KSB7XG4gICAgICAgIHJldHVybiBjYih0aGlzLnYpXG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0ZVBheWxvYWQ8VD4pIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBUID0gdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IodGhpcy52KSA6IGNiXG5cbiAgICAgICAgY29uc3QgeyBvdXRwdXQsIGlzc3Vlcywgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgZmxhdHRlbiA9IHYuZmxhdHRlbihpc3N1ZXMpXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IFtdIGFzIHN0cmluZ1tdXG5cbiAgICAgICAgICAgIGlmIChmbGF0dGVuLnJvb3QpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKC4uLmZsYXR0ZW4ucm9vdClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZsYXR0ZW4ubmVzdGVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZmxhdHRlbi5uZXN0ZWQpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5IGFzIFtzdHJpbmcsIHN0cmluZ1tdXVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goLi4udmFsdWUubWFwKCh2KSA9PiBgJHtrZXl9OiAke3Z9YCkpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzLmxlbmd0aCA/IG1lc3NhZ2VzLmpvaW4oJywgJykgOiAnVmFsaWRhdGlvbiBmYWlsZWQnXG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEJhc2VFeGNlcHRpb24obWVzc2FnZSwgNDIyKVxuXG4gICAgICAgICAgICBlcnJvci5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcidcblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBtZXNzYWdlcywgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBc3luYzxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYUFzeW5jPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQ+IHwgVCkge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IG91dHB1dCwgaXNzdWVzLCBzdWNjZXNzIH0gPSBhd2FpdCB2LnNhZmVQYXJzZUFzeW5jKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdWYWxpZGF0aW9uIGZhaWxlZCcpXG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuID0gdi5mbGF0dGVuKGlzc3VlcylcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbi5yb290LFxuICAgICAgICAgICAgICAgIC4uLmZsYXR0ZW4ubmVzdGVkLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGRldGFpbHMsIH0pXG5cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRlUGF5bG9hZDxUPik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IHN1Y2Nlc3MgfSA9IHYuc2FmZVBhcnNlKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICByZXR1cm4gc3VjY2Vzc1xuICAgIH1cbn1cblxuIiwiaW1wb3J0IHFzIGZyb20gJ3FzJyBcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsUGFyYW1zKHJvdXRlUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgIGNvbnN0IHJvdXRlU2VnbWVudHMgPSByb3V0ZVBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCByZXF1ZXN0U2VnbWVudHMgPSByZXF1ZXN0UGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlU2VnbWVudCA9IHJvdXRlU2VnbWVudHNbaV1cbiAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnQgPSByZXF1ZXN0U2VnbWVudHNbaV1cblxuICAgICAgICBpZiAocm91dGVTZWdtZW50LnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gcm91dGVTZWdtZW50LnNsaWNlKDEpIC8vIFJlbW92ZSB0aGUgJzonIHByZWZpeFxuICAgICAgICAgICAgcGFyYW1zW3BhcmFtTmFtZV0gPSByZXF1ZXN0U2VnbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudCA9PT0gJyonKSB7XG4gICAgICAgICAgICAvLyBDYXB0dXJlIGFsbCByZW1haW5pbmcgc2VnbWVudHMgYXMgYSBzaW5nbGUgcGF0aFxuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nU2VnbWVudHMgPSByZXF1ZXN0U2VnbWVudHMuc2xpY2UoaSlcbiAgICAgICAgICAgIHBhcmFtc1snKiddID0gcmVtYWluaW5nU2VnbWVudHMuam9pbignLycpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmxRdWVyeShyZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcmVxdWVzdFBhdGguc3BsaXQoJz8nKVsxXVxuXG4gICAgaWYgKCFxdWVyeVN0cmluZykge1xuICAgICAgICByZXR1cm4gcXVlcnlcbiAgICB9XG5cbiAgICByZXR1cm4gcXMucGFyc2UocXVlcnlTdHJpbmcpXG59XG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25Bc3NpZ25tZW50ID0gdi5JbmZlck91dHB1dDx0eXBlb2YgcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWE+XG5cbmV4cG9ydCBjb25zdCBwZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBwZXJtaXNzaW9uX2lkOiB2Lm51bWJlcigpLFxuICAgIGFzc2lnbmFibGVfdHlwZTogdi5zdHJpbmcoKSxcbiAgICBhc3NpZ25hYmxlX2lkOiB2LnN0cmluZygpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb24gPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBwZXJtaXNzaW9uU2NoZW1hPlxuXG5leHBvcnQgY29uc3QgcGVybWlzc2lvblNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBuYW1lOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGRlc2NyaXB0aW9uOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGFjdGlvbjogdi5zdHJpbmcoKSxcbiAgICBzdWJqZWN0OiB2LnN0cmluZygpLFxuICAgIGNvbmRpdGlvbnM6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIGV4cGlyZXNfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBUb2tlbiA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHRva2VuU2NoZW1hPlxuXG5leHBvcnQgY29uc3QgdG9rZW5TY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgbmFtZTogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICB0eXBlOiB2LnN0cmluZygpLFxuICAgIHVzZXJfaWQ6IHYubnVtYmVyKCksXG4gICAgdG9rZW46IHYuc3RyaW5nKCksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIGV4cGlyZXNfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnLi9CYXNlRXhjZXB0aW9uLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGVsbEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICAgIHB1YmxpYyBvdXRwdXQ6IHN0cmluZ1xuICAgIHB1YmxpYyBiaW46IHN0cmluZyBcbiAgICBwdWJsaWMgYXJnczogc3RyaW5nW11cblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3V0cHV0OiBzdHJpbmcsIGJpbjogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCA1MDEpXG5cbiAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXRcbiAgICAgICAgdGhpcy5iaW4gPSBiaW4gXG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3MgXG4gICAgfVxufVxuIiwiaW1wb3J0IFZhbGlkYXRvclNlcnZpY2UgZnJvbSBcIi4uL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2VcIlxuXG5leHBvcnQgY29uc3QgdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvclNlcnZpY2UoKVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0b3JcbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmludGVyZmFjZSBDcmVhdGVCYXNlRW50aXR5T3B0aW9ucyB7XG4gICAgcGFyc2U/OiAoZGF0YTogYW55KSA9PiBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJhc2VFbnRpdHkob3B0aW9uczogQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBCYXNlRW50aXR5PFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJ1Y3RvciA9ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBCYXNlKSBhcyBhbnlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBvcHRpb25zLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHBheWxvYWQpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIG1lcmdlKGRhdGE6IFBhcnRpYWw8dGhpcz4pOiB0aGlzIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBwdWJsaWMgc3RhdGljIGZyb208VD4odGhpczogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7IC4uLmRhdGEgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRydWN0b3I/LnBhcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IChjb250cnVjdG9yIGFzIGFueSkucGFyc2UoZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcyBhcyBhbnkpPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAodGhpcyBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgb3JpZ2luOiBzdHJpbmdcbiAgICBwdWJsaWMgc3ViamVjdDogc3RyaW5nXG4gICAgcHVibGljIGFjdGlvbjogc3RyaW5nXG4gICAgcHVibGljIGNvbmRpdGlvbnM6IHN0cmluZyB8IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbnVsbFxuXG4gICAgcHVibGljIGdldCBlZGl0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luID09PSAnY3VzdG9tJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyc2VkQ29uZGl0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCBqc29uXSA9IHRyeUNhdGNoLnN5bmMoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmRpdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5jb25kaXRpb25zIGFzIHN0cmluZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGVycm9yID8ge30gOiBqc29uXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lQWJpbGl0eSwgc3ViamVjdCBhcyBjcmVhdGVTdWJqZWN0IH0gZnJvbSAnQGNhc2wvYWJpbGl0eSdcbmltcG9ydCBQZXJtaXNzaW9uIGZyb20gJy4vUGVybWlzc2lvbkVudGl0eS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNsRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdBY2xFbnRpdHknXG5cbiAgICBwdWJsaWMgYWJpbGl0eTogUmV0dXJuVHlwZTx0eXBlb2YgZGVmaW5lQWJpbGl0eT5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXVxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBY2xFbnRpdHk+ID0ge30pIHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBkYXRhLnBlcm1pc3Npb25zIHx8IFtdXG4gICAgICAgIGNvbnN0IHBlcm1zID0gcGVybWlzc2lvbnMubWFwKChwZXJtaXNzaW9uKSA9PiBQZXJtaXNzaW9uLmZyb20ocGVybWlzc2lvbikpXG5cbiAgICAgICAgXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtc1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKCkuY2hpbGQoeyBsYWJlbDogJ2FjbCcgfSlcbiAgICAgICAgXG4gICAgICAgIHRoaXMuYWJpbGl0eSA9IGRlZmluZUFiaWxpdHkoKGNhbikgPT4ge1xuICAgICAgICAgICAgcGVybXMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbihwZXJtaXNzaW9uLmFjdGlvbiwgcGVybWlzc2lvbi5zdWJqZWN0LCBwZXJtaXNzaW9uLnBhcnNlZENvbmRpdGlvbnMpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaW5pdGlhbGl6ZWQgaW4gZGVidWcgbW9kZScsIHtcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuKGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblxuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbihhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW5ub3QoYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbm5vdChhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWJqZWN0KHN1YmplY3Q6IHN0cmluZywgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcbiAgICB9XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIENvb2tpZU1hcEVudGl0eU9wdGlvbnMge1xuICAgIGNvb2tpZXM/OiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHJlZml4Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZU1hcEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQ29va2llTWFwRW50aXR5J1xuXG4gICAgcHVibGljIGNvb2tpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgcHJlZml4OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBDb29raWVNYXBFbnRpdHlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY29va2llcyA9IGRhdGE/LmNvb2tpZXMgfHwgbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgICAgICB0aGlzLnByZWZpeCA9IGRhdGE/LnByZWZpeCB8fCAnJ1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBNYXA8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIGlmIChjb29raWVzIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29va2llcykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29va2llc1trZXldKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICByZXR1cm4gdGhpcy5jb29raWVzLmdldChmdWxsTmFtZSkgfHwgZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIFdlIHdhbnQgdG8gYWxsb3cgYW55IG9wdGlvbnMgdG8gYmUgcGFzc2VkIGhlcmUsIGFzIHRoZXkgbWF5IGJlIHVzZWQgYnkgdGhlIHVuZGVybHlpbmcgY29va2llXG4gICAgLy8gIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHRoaXMucHJlZml4ICsgbmFtZVxuXG4gICAgICAgIHRoaXMuY29va2llcy5zZXQoZnVsbE5hbWUsIHZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmNvb2tpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgodGhpcy5wcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5wcmVmaXhlZEtleSA9IGtleS5zbGljZSh0aGlzLnByZWZpeC5sZW5ndGgpXG5cbiAgICAgICAgICAgICAgICByZXN1bHRbdW5wcmVmaXhlZEtleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlRW50cnkge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nXG4gICAgcHVibGljIHR5cGU6ICdmaWxlJyB8ICdkaXJlY3RvcnknXG4gICAgcHVibGljIG1ldGFzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IERyaXZlRW50cnkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNvZnREZWxldGVNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGRlbGV0ZWRfYXQ6IERhdGUgfCBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRpbWVzdGFtcE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgY3JlYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgICAgICBwdWJsaWMgdXBkYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgIH1cbn1cbiIsImltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHlNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5TWl4aW4sIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGRyaXZlOiBzdHJpbmdcbiAgICBwdWJsaWMgbWltZXR5cGU6IHN0cmluZ1xuICAgIHB1YmxpYyBwdXJwb3NlOiBzdHJpbmdcbiAgICBwdWJsaWMgY2xpZW50X25hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBmaWxlbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHB1YmxpYzogYm9vbGVhblxuXG4gICAgLy8gZHluYW1pY1xuICAgIHB1YmxpYyB1cmw/OiBzdHJpbmdcbiAgICBwdWJsaWMgbWV0YXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG5cbiAgICBwdWJsaWMgaXNJbWFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWltZXR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJylcbiAgICB9XG59XG4iLCJpbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBsb2FkU2Vzc2lvbiBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgcHVycG9zZTogc3RyaW5nXG4gICAgcHVibGljIG1pbWVfdHlwZXM6IHN0cmluZ1xuICAgIHB1YmxpYyBtYXhfc2l6ZTogbnVtYmVyXG5cbiAgICAvLyBkeW5hbWljIFxuICAgIHB1YmxpYyB1cGxvYWRfdXJsPzogc3RyaW5nXG4gICAgcHVibGljIGNyZWF0ZV9maWxlX3VybD86IHN0cmluZ1xuXG4gICAgcHVibGljIGdldFBhcnNlZE1pbWVUeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWVfdHlwZXMuc3BsaXQoJywnKS5tYXAodHlwZSA9PiB0eXBlLnRyaW0oKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkTWltZVR5cGUobWltZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSB0aGlzLmdldFBhcnNlZE1pbWVUeXBlcygpXG4gICAgICAgIHJldHVybiBhbGxvd2VkVHlwZXMuaW5jbHVkZXMobWltZVR5cGUpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygnKi8qJylcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkU2l6ZShzaXplOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHNpemUgPD0gdGhpcy5tYXhfc2l6ZVxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gXCIjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29va2llTWFwRW50aXR5T3B0aW9ucyB7XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBzZXRIZWFkZXI/OiAobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhlYWRlck1hcEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnSGVhZGVyTWFwRW50aXR5J1xuICAgIHB1YmxpYyBlbnRyaWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIHNldEhlYWRlcj86IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBDb29raWVNYXBFbnRpdHlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5zZXRIZWFkZXIgPSBkYXRhPy5zZXRIZWFkZXJcblxuICAgICAgICBpZiAoZGF0YT8uaGVhZGVycykge1xuICAgICAgICAgICAgdGhpcy5sb2FkRnJvbVJlY29yZChkYXRhLmhlYWRlcnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEZyb21SZWNvcmQoY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb29raWVzKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb29raWVzW2tleV0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChuYW1lKSB8fCBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuc2V0SGVhZGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignc2V0SGVhZGVyIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkJylcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQobmFtZSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5lbnRyaWVzKCkpXG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZUhvb2sge1xuICAgIHB1YmxpYyBob29rX2lkOiBzdHJpbmdcbiAgICBwdWJsaWMgaG9va19hbGlhc2VzPzogc3RyaW5nW11cbiAgICBwdWJsaWMgb3JkZXI/OiBudW1iZXJcbiAgICBwdWJsaWMgc3ViaG9va3M/OiBMaWZlY3ljbGVIb29rW11cblxuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIGJvb3QoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7IH1cblxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgcmVnaXN0ZXIgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25SZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgbG9hZCAqL1xuICAgIHB1YmxpYyBhc3luYyBvbkxvYWQoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGJvb3QgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Cb290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBzaHV0ZG93biAqL1xuICAgIHB1YmxpYyBhc3luYyBvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbn1cbiIsImltcG9ydCB0eXBlIE1vZHVsZU1hbmlmZXN0IGZyb20gJy4vTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgeyBjb21wb3NlLCBtaXhpbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuaW50ZXJmYWNlIE1vZHVsZVVwZ3JhZGVJbmZvIHtcbiAgICBzb3VyY2U6ICdnaXQnIHwgJ3ppcCdcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBtaXhpbihMaWZlY3ljbGVIb29rKSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBwdWJsaWMgYnVpbGQ6IE1vZHVsZU1hbmlmZXN0WydidWlsZCddID0ge31cbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcblxuICAgIHB1YmxpYyB1cGdyYWRlX2luZm8/OiBNb2R1bGVVcGdyYWRlSW5mb1xuXG4gICAgcHVibGljIHNldERhdGEoZGF0YTogUGFydGlhbDxNb2R1bGUgfCBNb2R1bGVNYW5pZmVzdD4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIClcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGZpbHRlcmVkKVxuXG4gICAgICAgIHRoaXMuaG9va19pZCA9IGBtb2R1bGU6JHt0aGlzLmlkfWBcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGRJbXBvcnQge1xuICAgIGZyb206IHN0cmluZ1xuICAgIHRvPzogc3RyaW5nXG4gICAgdHlwZTogJ2dsb2JhbF9pbXBvcnQnXG59XG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGQge1xuICAgIGltcG9ydHM/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkSW1wb3J0W11cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlTWFuaWZlc3QgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgYXV0aG9yPzogc3RyaW5nXG4gICAgcHVibGljIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgYnVpbGQ/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdpbmF0aW9uRW50aXR5PFQgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgcHVibGljIGl0ZW1zOiBUW11cbiAgICBwdWJsaWMgdG90YWw6IG51bWJlclxuICAgIHB1YmxpYyBwYWdlOiBudW1iZXJcbiAgICBwdWJsaWMgcGVyX3BhZ2U6IG51bWJlclxuICAgIHB1YmxpYyB0b3RhbF9wYWdlczogbnVtYmVyXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPFBhZ2luYXRpb25FbnRpdHk+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb208VCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPihwYXlsb2FkOiBQYXJ0aWFsPFBhZ2luYXRpb25FbnRpdHk8VD4+KTogUGFnaW5hdGlvbkVudGl0eTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbkVudGl0eShwYXlsb2FkIGFzIGFueSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuIiwiaW1wb3J0IHR5cGUgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgdHlwZSBSb2xlIGZyb20gJy4vUm9sZUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlckVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZW1haWw6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdXNlcm5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwYXNzd29yZD86IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJpZmllZF9hdD86IERhdGUgfCBzdHJpbmcgfCBudWxsXG5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM/OiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgcm9sZXM/OiBSb2xlW11cblxuICAgIHB1YmxpYyBnZXQgaW5pdGlhbHMoKXtcbiAgICAgICAgY29uc3QgW2ZpcnN0TmFtZSwgc2Vjb25kTmFtZV0gPSB0aGlzLm5hbWUuc3BsaXQoJyAnKVxuXG4gICAgICAgIGlmICghc2Vjb25kTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhID0gZmlyc3ROYW1lWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgY29uc3QgYiA9IHNlY29uZE5hbWVbMF0udG9VcHBlckNhc2UoKVxuXG4gICAgICAgIHJldHVybiBhICsgYlxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjBRQVFBLElBQXFCLEVBQXJCLEtBQW1DLENBQy9CLE9BQWMsc0JBQXdCLGdCQUV0QyxRQUVBLGFBQWMsQ0FDVixLQUFLLFFBQVUsSUFBSSxJQUd2QixNQUFjLENBQ1YsT0FBTyxNQUFNLEtBQUssS0FBSyxRQUFRLFFBQVEsQ0FBQyxDQUc1QyxXQUFrQixFQUFpQixDQUsvQixPQUpJLE9BQU8sR0FBVSxVQUFZLEVBQU0sU0FBUyxXQUFXLENBQ2hELEVBQU0sUUFBUSxXQUFZLEdBQUcsQ0FBQyxNQUFNLEdBQUssT0FHN0MsRUFHWCxlQUFzQixFQUE2QixFQUFTLFNBQWdCLENBQ3hFLElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxPQUFPLFFBQVEsRUFBTyxDQUM3QyxLQUFLLFFBQVEsSUFBSSxFQUFLLENBQ2xCLE1BQ0EsTUFBTyxLQUFLLFdBQVcsRUFBTSxDQUM3QixTQUNILENBQUMsQ0FJVixnQkFBdUIsRUFBMEIsRUFBUyxTQUFnQixDQUN0RSxJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUs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
|