@nlabs/arkhamjs 3.22.0 → 3.24.0
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/lib/Flux/Flux.js +41 -68
- package/lib/Flux/Flux.test.js +62 -82
- package/lib/Flux/Flux.types.js +15 -3
- package/lib/constants/ArkhamConstants.js +17 -5
- package/lib/index.js +16 -19
- package/package.json +10 -11
package/lib/Flux/Flux.js
CHANGED
@@ -2,64 +2,37 @@ var __create = Object.create;
|
|
2
2
|
var __defProp = Object.defineProperty;
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
6
5
|
var __getProtoOf = Object.getPrototypeOf;
|
7
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
8
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
9
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {enumerable: true, configurable: true, writable: true, value}) : obj[key] = value;
|
10
|
-
var __spreadValues = (a, b) => {
|
11
|
-
for (var prop in b || (b = {}))
|
12
|
-
if (__hasOwnProp.call(b, prop))
|
13
|
-
__defNormalProp(a, prop, b[prop]);
|
14
|
-
if (__getOwnPropSymbols)
|
15
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
16
|
-
if (__propIsEnum.call(b, prop))
|
17
|
-
__defNormalProp(a, prop, b[prop]);
|
18
|
-
}
|
19
|
-
return a;
|
20
|
-
};
|
21
|
-
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
22
|
-
var __objRest = (source, exclude) => {
|
23
|
-
var target = {};
|
24
|
-
for (var prop in source)
|
25
|
-
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
26
|
-
target[prop] = source[prop];
|
27
|
-
if (source != null && __getOwnPropSymbols)
|
28
|
-
for (var prop of __getOwnPropSymbols(source)) {
|
29
|
-
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
30
|
-
target[prop] = source[prop];
|
31
|
-
}
|
32
|
-
return target;
|
33
|
-
};
|
34
7
|
var __export = (target, all) => {
|
35
8
|
for (var name in all)
|
36
|
-
__defProp(target, name, {get: all[name], enumerable: true});
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
37
10
|
};
|
38
|
-
var
|
39
|
-
if (
|
40
|
-
for (let key of __getOwnPropNames(
|
41
|
-
if (!__hasOwnProp.call(
|
42
|
-
__defProp(
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
13
|
+
for (let key of __getOwnPropNames(from))
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
43
16
|
}
|
44
|
-
return
|
45
|
-
};
|
46
|
-
var __toModule = (module2) => {
|
47
|
-
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
|
17
|
+
return to;
|
48
18
|
};
|
49
|
-
|
50
|
-
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
|
20
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
21
|
+
var Flux_exports = {};
|
22
|
+
__export(Flux_exports, {
|
51
23
|
Flux: () => Flux,
|
52
24
|
FluxFramework: () => FluxFramework
|
53
25
|
});
|
54
|
-
|
55
|
-
var
|
56
|
-
var
|
57
|
-
var
|
58
|
-
var
|
59
|
-
var
|
60
|
-
var
|
61
|
-
var
|
62
|
-
var
|
26
|
+
module.exports = __toCommonJS(Flux_exports);
|
27
|
+
var import_error_stack_parser = __toESM(require("error-stack-parser"));
|
28
|
+
var import_events = require("events");
|
29
|
+
var import_debounce = __toESM(require("lodash/debounce"));
|
30
|
+
var import_cloneDeep = __toESM(require("lodash/fp/cloneDeep"));
|
31
|
+
var import_get = __toESM(require("lodash/fp/get"));
|
32
|
+
var import_isEmpty = __toESM(require("lodash/fp/isEmpty"));
|
33
|
+
var import_merge = __toESM(require("lodash/fp/merge"));
|
34
|
+
var import_set = __toESM(require("lodash/fp/set"));
|
35
|
+
var import_ArkhamConstants = require("../constants/ArkhamConstants");
|
63
36
|
class FluxFramework extends import_events.EventEmitter {
|
64
37
|
constructor() {
|
65
38
|
super();
|
@@ -107,7 +80,7 @@ class FluxFramework extends import_events.EventEmitter {
|
|
107
80
|
}
|
108
81
|
this.pluginTypes.forEach((type) => {
|
109
82
|
const method = middleObj[type];
|
110
|
-
const plugin = {method, name: middleName};
|
83
|
+
const plugin = { method, name: middleName };
|
111
84
|
this.middleware[`${type}List`] = this.addPlugin(type, plugin);
|
112
85
|
});
|
113
86
|
} else {
|
@@ -120,7 +93,7 @@ class FluxFramework extends import_events.EventEmitter {
|
|
120
93
|
const storeFn = this.storeActions[storeName];
|
121
94
|
this.state[storeFn.name] = (0, import_cloneDeep.default)(storeFn.initialState);
|
122
95
|
});
|
123
|
-
const {name, storage} = this.options;
|
96
|
+
const { name, storage } = this.options;
|
124
97
|
if (storage) {
|
125
98
|
return storage.setStorageData(name, this.state);
|
126
99
|
}
|
@@ -144,21 +117,21 @@ class FluxFramework extends import_events.EventEmitter {
|
|
144
117
|
let stack = [];
|
145
118
|
try {
|
146
119
|
const stackProperty = "stackTraceLimit";
|
147
|
-
const {stackTraceLimit} = Error;
|
120
|
+
const { stackTraceLimit } = Error;
|
148
121
|
Error[stackProperty] = Infinity;
|
149
122
|
stack = import_error_stack_parser.default.parse(new Error());
|
150
123
|
Error[stackProperty] = stackTraceLimit;
|
151
124
|
} catch (error) {
|
152
125
|
}
|
153
126
|
const options = (0, import_cloneDeep.default)(this.options);
|
154
|
-
const appInfo = {duration: 0, options, stack};
|
155
|
-
const {postDispatchList = [], preDispatchList = []} = this.middleware;
|
127
|
+
const appInfo = { duration: 0, options, stack };
|
128
|
+
const { postDispatchList = [], preDispatchList = [] } = this.middleware;
|
156
129
|
if (preDispatchList.length) {
|
157
130
|
clonedAction = await Promise.all(preDispatchList.map((plugin) => plugin.method((0, import_cloneDeep.default)(clonedAction), (0, import_cloneDeep.default)(this.state), appInfo))).then((actions) => actions.reduce((updatedAction, action2) => (0, import_merge.default)(updatedAction, action2), clonedAction)).catch((error) => {
|
158
131
|
throw error;
|
159
132
|
});
|
160
133
|
}
|
161
|
-
const
|
134
|
+
const { type, ...data } = clonedAction;
|
162
135
|
if (!type || type === "") {
|
163
136
|
console.warn("ArkhamJS Warning: Flux.dispatch is missing an action type for the payload:", data);
|
164
137
|
return Promise.resolve(clonedAction);
|
@@ -168,7 +141,7 @@ class FluxFramework extends import_events.EventEmitter {
|
|
168
141
|
const state = (0, import_cloneDeep.default)(this.state[storeName]) || (0, import_cloneDeep.default)(storeFn.initialState) || {};
|
169
142
|
this.state[storeName] = (0, import_cloneDeep.default)(storeFn.action(type, data, state)) || state;
|
170
143
|
});
|
171
|
-
const {storage} = this.options;
|
144
|
+
const { storage } = this.options;
|
172
145
|
if (storage) {
|
173
146
|
try {
|
174
147
|
await this.updateStorage();
|
@@ -210,12 +183,12 @@ class FluxFramework extends import_events.EventEmitter {
|
|
210
183
|
this.isInit = false;
|
211
184
|
this.reset(false);
|
212
185
|
}
|
213
|
-
const updatedOptions =
|
186
|
+
const updatedOptions = { ...options };
|
214
187
|
if (this.isInit) {
|
215
188
|
updatedOptions.name = this.options.name;
|
216
189
|
}
|
217
|
-
this.options =
|
218
|
-
const {debug, middleware, name, stores} = this.options;
|
190
|
+
this.options = { ...this.defaultOptions, ...updatedOptions };
|
191
|
+
const { debug, middleware, name, stores } = this.options;
|
219
192
|
try {
|
220
193
|
await this.useStorage(name);
|
221
194
|
} catch (error) {
|
@@ -260,7 +233,7 @@ class FluxFramework extends import_events.EventEmitter {
|
|
260
233
|
}
|
261
234
|
async addStores(stores) {
|
262
235
|
const registeredStores = stores.map((store) => this.register(store));
|
263
|
-
const {name, storage} = this.options;
|
236
|
+
const { name, storage } = this.options;
|
264
237
|
if (storage) {
|
265
238
|
try {
|
266
239
|
await storage.setStorageData(name, this.state);
|
@@ -278,7 +251,7 @@ class FluxFramework extends import_events.EventEmitter {
|
|
278
251
|
});
|
279
252
|
}
|
280
253
|
async reset(clearStorage = true) {
|
281
|
-
const {name, storage} = this.options;
|
254
|
+
const { name, storage } = this.options;
|
282
255
|
if (storage && clearStorage) {
|
283
256
|
try {
|
284
257
|
await storage.setStorageData(name, {});
|
@@ -287,7 +260,7 @@ class FluxFramework extends import_events.EventEmitter {
|
|
287
260
|
}
|
288
261
|
}
|
289
262
|
this.middleware = {};
|
290
|
-
this.options =
|
263
|
+
this.options = { ...this.defaultOptions };
|
291
264
|
this.state = {};
|
292
265
|
this.storeActions = {};
|
293
266
|
this.isInit = false;
|
@@ -296,7 +269,7 @@ class FluxFramework extends import_events.EventEmitter {
|
|
296
269
|
if (!!path) {
|
297
270
|
this.state = (0, import_set.default)(path, (0, import_cloneDeep.default)(value), this.state);
|
298
271
|
}
|
299
|
-
const {storage} = this.options;
|
272
|
+
const { storage } = this.options;
|
300
273
|
if (storage) {
|
301
274
|
return this.updateStorage();
|
302
275
|
}
|
@@ -304,11 +277,11 @@ class FluxFramework extends import_events.EventEmitter {
|
|
304
277
|
}
|
305
278
|
addPlugin(type, plugin) {
|
306
279
|
const list = this.middleware[`${type}List`] || [];
|
307
|
-
const {method, name} = plugin;
|
280
|
+
const { method, name } = plugin;
|
308
281
|
if (method && typeof method === "function") {
|
309
282
|
const exists = !!list.filter((obj) => obj.name === name).length;
|
310
283
|
if (!exists) {
|
311
|
-
list.push({method, name});
|
284
|
+
list.push({ method, name });
|
312
285
|
}
|
313
286
|
} else if (method !== void 0) {
|
314
287
|
throw Error(`${plugin.name} middleware is not configured properly. Method is not a function.`);
|
@@ -327,7 +300,7 @@ class FluxFramework extends import_events.EventEmitter {
|
|
327
300
|
if (!isFnc) {
|
328
301
|
throw Error(`${storeFn} is not a store function. Cannot register with Flux.`);
|
329
302
|
}
|
330
|
-
const {name} = storeFn;
|
303
|
+
const { name } = storeFn;
|
331
304
|
const initialState = storeFn();
|
332
305
|
const storeAction = {
|
333
306
|
action: storeFn,
|
@@ -351,11 +324,11 @@ class FluxFramework extends import_events.EventEmitter {
|
|
351
324
|
return list.filter((obj) => obj.name !== name);
|
352
325
|
}
|
353
326
|
async useStorage(name) {
|
354
|
-
const {storage, state, storageWait} = this.options;
|
327
|
+
const { storage, state, storageWait } = this.options;
|
355
328
|
if (storage) {
|
356
329
|
try {
|
357
330
|
this.state = state || await storage.getStorageData(name) || {};
|
358
|
-
this.updateStorage = (0, import_debounce.default)(() => storage.setStorageData(name, this.state), storageWait, {leading: true, trailing: true});
|
331
|
+
this.updateStorage = (0, import_debounce.default)(() => storage.setStorageData(name, this.state), storageWait, { leading: true, trailing: true });
|
359
332
|
} catch (error) {
|
360
333
|
console.error(`ArkhamJS Error: Using storage, "${name}".`);
|
361
334
|
throw error;
|
@@ -373,4 +346,4 @@ const Flux = new FluxFramework();
|
|
373
346
|
Flux,
|
374
347
|
FluxFramework
|
375
348
|
});
|
376
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBFcnJvclN0YWNrUGFyc2VyIGZyb20gJ2Vycm9yLXN0YWNrLXBhcnNlcic7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvZnAvY2xvbmVEZWVwJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2ZwL2dldCc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvZnAvaXNFbXB0eSc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnbG9kYXNoL2ZwL21lcmdlJztcbmltcG9ydCBzZXQgZnJvbSAnbG9kYXNoL2ZwL3NldCc7XG5cbmltcG9ydCB7QXJraGFtQ29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvQXJraGFtQ29uc3RhbnRzJztcbmltcG9ydCB7Rmx1eEFjdGlvbiwgRmx1eE1pZGRsZXdhcmVUeXBlLCBGbHV4T3B0aW9ucywgRmx1eFBsdWdpblR5cGUsIEZsdXhTdG9yZX0gZnJvbSAnLi9GbHV4LnR5cGVzJztcblxuLyoqXG4gKiBGbHV4RnJhbWV3b3JrXG4gKiBAdHlwZSB7RXZlbnRFbWl0dGVyfVxuICovXG5leHBvcnQgY2xhc3MgRmx1eEZyYW1ld29yayBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBpbml0Rmx1eDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gUHVibGljIHByb3BlcnRpZXNcbiAgcGx1Z2luVHlwZXM6IHN0cmluZ1tdID0gWydwcmVEaXNwYXRjaCcsICdwb3N0RGlzcGF0Y2gnXTtcbiAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgc3RhdGU6IGFueSA9IHt9O1xuICBwcml2YXRlIHN0b3JlQWN0aW9uczogYW55ID0ge307XG4gIHByaXZhdGUgZGVmYXVsdE9wdGlvbnM6IEZsdXhPcHRpb25zID0ge1xuICAgIG5hbWU6ICdhcmtoYW1qcycsXG4gICAgcm91dGVyVHlwZTogJ2Jyb3dzZXInLFxuICAgIHNjcm9sbFRvVG9wOiB0cnVlLFxuICAgIHN0YXRlOiBudWxsLFxuICAgIHN0b3JhZ2U6IG51bGwsXG4gICAgc3RvcmFnZVdhaXQ6IDMwMCxcbiAgICBzdG9yZXM6IFtdLFxuICAgIHRpdGxlOiAnQXJraGFtSlMnXG4gIH07XG4gIHByaXZhdGUgbWlkZGxld2FyZTogYW55ID0ge307XG4gIHByaXZhdGUgb3B0aW9uczogRmx1eE9wdGlvbnMgPSB0aGlzLmRlZmF1bHRPcHRpb25zO1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEZsdXguICBOb3RlIHRoYXQgdGhlIEZsdXggb2JqZWN0XG4gICAqIGlzIGEgU2luZ2xldG9uIHBhdHRlcm4sIHNvIG9ubHkgb25lIHNob3VsZCBldmVyIGV4aXN0LlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHRoaXMge0ZsdXhGcmFtZXdvcmt9XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gTWV0aG9kc1xuICAgIHRoaXMuYWRkTWlkZGxld2FyZSA9IHRoaXMuYWRkTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYWRkU3RvcmVzID0gdGhpcy5hZGRTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyQXBwRGF0YSA9IHRoaXMuY2xlYXJBcHBEYXRhLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jbGVhck1pZGRsZXdhcmUgPSB0aGlzLmNsZWFyTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGVyZWdpc3RlciA9IHRoaXMuZGVyZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLmRpc3BhdGNoLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRPcHRpb25zID0gdGhpcy5nZXRPcHRpb25zLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0b3JlID0gdGhpcy5nZXRTdG9yZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaW5pdCA9IHRoaXMuaW5pdC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub2ZmID0gdGhpcy5vZmYuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyID0gdGhpcy5yZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlTWlkZGxld2FyZSA9IHRoaXMucmVtb3ZlTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlU3RvcmVzID0gdGhpcy5yZW1vdmVTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlc2V0ID0gdGhpcy5yZXNldC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2V0U3RhdGUgPSB0aGlzLnNldFN0YXRlLmJpbmQodGhpcyk7XG5cbiAgICAvLyBBZGQgbWlkZGxld2FyZSBwbHVnaW4gdHlwZXNcbiAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtaWRkbGV3YXJlIHRvIGZyYW1ld29yay5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gbWlkZGxld2FyZSBBbiBhcnJheSBvZiBtaWRkbGV3YXJlIHRvIGFkZCB0byB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlOiBGbHV4TWlkZGxld2FyZVR5cGVbXSk6IHZvaWQge1xuICAgIG1pZGRsZXdhcmUuZm9yRWFjaCgobWlkZGxlT2JqOiBGbHV4TWlkZGxld2FyZVR5cGUpID0+IHtcbiAgICAgIC8vIE1ha2Ugc3VyZSBtaWRkbGV3YXJlIGlzIGVpdGhlciBhIGNsYXNzIG9yIG9iamVjdC5cbiAgICAgIGlmKCEhbWlkZGxlT2JqICYmICgodHlwZW9mIG1pZGRsZU9iaiA9PT0gJ2Z1bmN0aW9uJykgfHwgKHR5cGVvZiBtaWRkbGVPYmogPT09ICdvYmplY3QnKSkpIHtcbiAgICAgICAgY29uc3QgbWlkZGxlTmFtZTogc3RyaW5nID0gbWlkZGxlT2JqLm5hbWUgfHwgJyc7XG5cbiAgICAgICAgaWYoIW1pZGRsZU5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBSZXF1aXJlcyBuYW1lIHByb3BlcnR5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IG1pZGRsZXdhcmUgcGx1Z2lucyBmb3IgZWZmaWNpZW5jeVxuICAgICAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1pZGRsZU9ialt0eXBlXTtcbiAgICAgICAgICBjb25zdCBwbHVnaW46IEZsdXhQbHVnaW5UeXBlID0ge21ldGhvZCwgbmFtZTogbWlkZGxlTmFtZX07XG4gICAgICAgICAgdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gdGhpcy5hZGRQbHVnaW4odHlwZSwgcGx1Z2luKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBhcHAgZGF0YSBmcm9tIHN0b3JhZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGFwcCBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyQXBwRGF0YSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5zdG9yZUFjdGlvbnMpXG4gICAgICAuZm9yRWFjaCgoc3RvcmVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmVGbiA9IHRoaXMuc3RvcmVBY3Rpb25zW3N0b3JlTmFtZV07XG4gICAgICAgIHRoaXMuc3RhdGVbc3RvcmVGbi5uYW1lXSA9IGNsb25lRGVlcChzdG9yZUZuLmluaXRpYWxTdGF0ZSk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHRoaXMuc3RhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBtaWRkbGV3YXJlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtaWRkbGV3YXJlIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyTWlkZGxld2FyZSgpOiBib29sZWFuIHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5taWRkbGV3YXJlKVxuICAgICAgLmZvckVhY2goKHBsdWdpblR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm1pZGRsZXdhcmVbcGx1Z2luVHlwZV0gPSBbXTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGUtcmVnaXN0ZXJzIG5hbWVkIHN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RvcmVOYW1lcyBBbiBhcnJheSBvZiBzdG9yZSBuYW1lcyB0byByZW1vdmUgZnJvbSB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgcmVtb3ZlU3RvcmVzKHN0b3JlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgc3RvcmVOYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuZGVyZWdpc3RlcihuYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24gdG8gYWxsIHN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFjdGlvbiB0byBkaXNwYXRjaCB0byBhbGwgdGhlIHN0b3Jlcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBzaWxlbnQgVG8gc2lsZW5jZSBhbnkgZXZlbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgd2hlbiBhbmQgaWYgdGhlIGFwcCBzYXZlcyBkYXRhIHRvIHN0b3JhZ2UsIHJldHVybmluZ1xuICAgKiB0aGUgYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZGlzcGF0Y2goYWN0aW9uOiBGbHV4QWN0aW9uLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4ge1xuICAgIGlmKCFhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJraGFtSlMgRXJyb3I6IEZsdXguZGlzcGF0Y2ggcmVxdWlyZXMgYW4gYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCBjbG9uZWRBY3Rpb246IEZsdXhBY3Rpb24gPSBjbG9uZURlZXAoYWN0aW9uKTtcblxuICAgIC8vIExvZyBkdXJhdGlvbiBvZiBkaXNwYXRjaFxuICAgIGNvbnN0IHN0YXJ0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIEdldCBzdGFja1xuICAgIGxldCBzdGFjayA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YWNrUHJvcGVydHk6IHN0cmluZyA9ICdzdGFja1RyYWNlTGltaXQnO1xuICAgICAgY29uc3Qge3N0YWNrVHJhY2VMaW1pdH06IGFueSA9IEVycm9yO1xuICAgICAgRXJyb3Jbc3RhY2tQcm9wZXJ0eV0gPSBJbmZpbml0eTtcbiAgICAgIHN0YWNrID0gRXJyb3JTdGFja1BhcnNlci5wYXJzZShuZXcgRXJyb3IoKSk7XG4gICAgICBFcnJvcltzdGFja1Byb3BlcnR5XSA9IHN0YWNrVHJhY2VMaW1pdDtcbiAgICB9IGNhdGNoKGVycm9yKSB7fVxuXG4gICAgLy8gR2V0IG9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zID0gY2xvbmVEZWVwKHRoaXMub3B0aW9ucyk7XG5cbiAgICAvLyBBcHAgaW5mb1xuICAgIGNvbnN0IGFwcEluZm8gPSB7ZHVyYXRpb246IDAsIG9wdGlvbnMsIHN0YWNrfTtcblxuICAgIC8vIEFwcGx5IG1pZGRsZXdhcmUgYmVmb3JlIHRoZSBhY3Rpb24gaXMgcHJvY2Vzc2VkXG4gICAgY29uc3Qge3Bvc3REaXNwYXRjaExpc3QgPSBbXSwgcHJlRGlzcGF0Y2hMaXN0ID0gW119ID0gdGhpcy5taWRkbGV3YXJlO1xuXG4gICAgaWYocHJlRGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgUHJvbWlzZVxuICAgICAgICAuYWxsKFxuICAgICAgICAgIHByZURpc3BhdGNoTGlzdC5tYXAoKHBsdWdpbjogRmx1eFBsdWdpblR5cGUpID0+IHBsdWdpbi5tZXRob2QoXG4gICAgICAgICAgICBjbG9uZURlZXAoY2xvbmVkQWN0aW9uKSwgY2xvbmVEZWVwKHRoaXMuc3RhdGUpLCBhcHBJbmZvKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAudGhlbihcbiAgICAgICAgICAoYWN0aW9ucykgPT4gYWN0aW9ucy5yZWR1Y2UoKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbikgPT5cbiAgICAgICAgICAgIG1lcmdlKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbiksIGNsb25lZEFjdGlvbikgYXMgRmx1eEFjdGlvblxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qge3R5cGUsIC4uLmRhdGF9ID0gY2xvbmVkQWN0aW9uO1xuXG4gICAgLy8gUmVxdWlyZSBhIHR5cGVcbiAgICBpZighdHlwZSB8fCB0eXBlID09PSAnJykge1xuICAgICAgY29uc29sZS53YXJuKCdBcmtoYW1KUyBXYXJuaW5nOiBGbHV4LmRpc3BhdGNoIGlzIG1pc3NpbmcgYW4gYWN0aW9uIHR5cGUgZm9yIHRoZSBwYXlsb2FkOicsIGRhdGEpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZWRBY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIFdoZW4gYW4gYWN0aW9uIGNvbWVzIGluLCBpdCBtdXN0IGJlIGNvbXBsZXRlbHkgaGFuZGxlZCBieSBhbGwgc3RvcmVzXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyh0aGlzLnN0b3JlQWN0aW9ucylcbiAgICAgIC5mb3JFYWNoKChzdG9yZU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjbG9uZURlZXAodGhpcy5zdGF0ZVtzdG9yZU5hbWVdKSB8fCBjbG9uZURlZXAoc3RvcmVGbi5pbml0aWFsU3RhdGUpIHx8IHt9O1xuICAgICAgICB0aGlzLnN0YXRlW3N0b3JlTmFtZV0gPSBjbG9uZURlZXAoc3RvcmVGbi5hY3Rpb24odHlwZSwgZGF0YSwgc3RhdGUpKSB8fCBzdGF0ZTtcbiAgICAgIH0pO1xuXG4gICAgLy8gU2F2ZSBjYWNoZSBpbiBzdG9yYWdlXG4gICAgY29uc3Qge3N0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdG9yYWdlKCk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7fVxuICAgIH1cblxuICAgIGNvbnN0IGVuZFRpbWU6IG51bWJlciA9ICsobmV3IERhdGUoKSk7XG4gICAgY29uc3QgZHVyYXRpb246IG51bWJlciA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgYXBwSW5mby5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG4gICAgaWYocG9zdERpc3BhdGNoTGlzdC5sZW5ndGgpIHtcbiAgICAgIGNsb25lZEFjdGlvbiA9IGF3YWl0IFByb21pc2VcbiAgICAgICAgLmFsbChcbiAgICAgICAgICBwb3N0RGlzcGF0Y2hMaXN0Lm1hcChcbiAgICAgICAgICAgIGFzeW5jIChwbHVnaW46IEZsdXhQbHVnaW5UeXBlKSA9PiBwbHVnaW4ubWV0aG9kKGNsb25lRGVlcChjbG9uZWRBY3Rpb24pLCBjbG9uZURlZXAodGhpcy5zdGF0ZSksIGFwcEluZm8pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIChhY3Rpb25zKSA9PiBhY3Rpb25zLnJlZHVjZSgodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSA9PlxuICAgICAgICAgICAgbWVyZ2UodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSwgY2xvbmVkQWN0aW9uKSBhcyBGbHV4QWN0aW9uXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZighc2lsZW50KSB7XG4gICAgICB0aGlzLmVtaXQodHlwZSwgY2xvbmVkQWN0aW9uKTtcbiAgICAgIHRoaXMuZW1pdCgnYXJraGFtanMnLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNsb25lZEFjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IEZsdXggb3B0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMge0ZsdXhPcHRpb25zfSB0aGUgRmx1eCBvcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGdldE9wdGlvbnMoKTogRmx1eE9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IFtuYW1lXSAob3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSBmb3IgYW4gb2JqZWN0LCBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gYWxsIHN0b3JlXG4gICAqICAgb2JqZWN0cy4gWW91IGNhbiBhbHNvIHVzZSBhbiBhcnJheSB0byBzcGVjaWZ5IGEgcHJvcGVydHkgcGF0aCB3aXRoaW4gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFtkZWZhdWx0VmFsdWVdIChvcHRpb25hbCkgQSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiBudWxsLlxuICAgKiBAcmV0dXJucyB7YW55fSB0aGUgc3RhdGUgb2JqZWN0IG9yIGEgcHJvcGVydHkgdmFsdWUgd2l0aGluLlxuICAgKi9cbiAgZ2V0U3RhdGUocGF0aDogc3RyaW5nIHwgc3RyaW5nW10gPSAnJywgZGVmYXVsdFZhbHVlPyk6IGFueSB7XG4gICAgbGV0IHN0b3JlVmFsdWU7XG5cbiAgICBpZighcGF0aCkge1xuICAgICAgc3RvcmVWYWx1ZSA9IHRoaXMuc3RhdGUgfHwge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3JlVmFsdWUgPSBnZXQocGF0aCwgdGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBzdG9yZVZhbHVlID8gY2xvbmVEZWVwKHN0b3JlVmFsdWUpIDogc3RvcmVWYWx1ZTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0b3JlIG9iamVjdCByZWdpc3RlcmVkIHdpdGggRmx1eC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN0b3JlLlxuICAgKiBAcmV0dXJucyB7Rmx1eFN0b3JlfSB0aGUgc3RvcmUgb2JqZWN0LlxuICAgKi9cbiAgZ2V0U3RvcmUobmFtZTogc3RyaW5nID0gJycpOiBGbHV4U3RvcmUge1xuICAgIHJldHVybiB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFuZCBzZXQgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqL1xuICBhc3luYyBpbml0KG9wdGlvbnM6IEZsdXhPcHRpb25zID0ge30sIHJlc2V0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEZsdXhGcmFtZXdvcms+IHtcbiAgICAvLyBTaG91bGQgcmVzZXQgcHJldmlvdXMgcGFyYW1zXG4gICAgaWYocmVzZXQpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgb3B0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0gey4uLm9wdGlvbnN9O1xuXG4gICAgaWYodGhpcy5pc0luaXQpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgbmFtZSBmcm9tIG9wdGlvbnMgaWYgYWxyZWFkeSBpbml0aWFsaXplZCwgb3RoZXJ3aXNlIHRoZSByb290IGFwcCB3aWxsIG5vdCBiZSBhYmxlIHRvIGFjY2Vzc1xuICAgICAgLy8gdGhlIHN0YXRlIHRyZWVcbiAgICAgIHVwZGF0ZWRPcHRpb25zLm5hbWUgPSB0aGlzLm9wdGlvbnMubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5kZWZhdWx0T3B0aW9ucywgLi4udXBkYXRlZE9wdGlvbnN9O1xuICAgIGNvbnN0IHtkZWJ1ZywgbWlkZGxld2FyZSwgbmFtZSwgc3RvcmVzfSA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIFVwZGF0ZSBkZWZhdWx0IHN0b3JlXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXNlU3RvcmFnZShuYW1lKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSB1c2luZyBzdG9yYWdlLicsIG5hbWUpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYoISFzdG9yZXMgJiYgc3RvcmVzLmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRTdG9yZXMoc3RvcmVzKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXJraGFtIEVycm9yOiBUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWRkaW5nIHN0b3Jlcy4nLCBzdG9yZXMpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZighIW1pZGRsZXdhcmUgJiYgbWlkZGxld2FyZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCB3aW5kb3dQcm9wZXJ0eTogc3RyaW5nID0gJ2Fya2hhbWpzJztcblxuICAgIGlmKGRlYnVnKSB7XG4gICAgICB3aW5kb3dbd2luZG93UHJvcGVydHldID0gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHdpbmRvd1t3aW5kb3dQcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXQgPSB0cnVlO1xuICAgIHRoaXMuZW1pdChBcmtoYW1Db25zdGFudHMuSU5JVCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGluaXRpYWxpemF0aW9uIGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbGlzdGVuZXJdIFRoZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnNjcmliZWQgZXZlbnQuXG4gICAqL1xuICBvbkluaXQobGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub24oQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcblxuICAgIGlmKHRoaXMuaXNJbml0KSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBpbml0aWFsaXphdGlvbiBsaXN0ZW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb2ZmSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vZmYoQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50VHlwZV0gRXZlbnQgdG8gdW5zdWJzY3JpYmUuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9mZihldmVudFR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRUeXBlXSBFdmVudCB0byBzdWJzY3JpYmUuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9uKGV2ZW50VHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIG5ldyBTdG9yZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0b3JlcyBTdG9yZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgYXN5bmMgYWRkU3RvcmVzKHN0b3JlczogYW55W10pOiBQcm9taXNlPG9iamVjdFtdPiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZFN0b3JlczogRmx1eFN0b3JlW10gPSBzdG9yZXMubWFwKChzdG9yZTogRmx1eFN0b3JlKSA9PiB0aGlzLnJlZ2lzdGVyKHN0b3JlKSk7XG5cbiAgICAvLyBTYXZlIGNhY2hlIGluIHNlc3Npb24gc3RvcmFnZVxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBjbGFzc2VzXG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRTdG9yZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG1pZGRsZXdhcmUgZnJvbSBmcmFtZXdvcmsuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0cmluZyBtaWRkbGV3YXJlIG5hbWVzIHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgcmVtb3ZlTWlkZGxld2FyZShuYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBuYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlbW92ZSBtaWRkbGV3YXJlIHBsdWdpbnNcbiAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSA9IHRoaXMucmVtb3ZlUGx1Z2luKHR5cGUsIG5hbWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgZnJhbWV3b3JrLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBzdHJpbmcgbWlkZGxld2FyZSBuYW1lcyB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdFtdPn0gdGhlIGNsYXNzIG9iamVjdChzKS5cbiAgICovXG4gIGFzeW5jIHJlc2V0KGNsZWFyU3RvcmFnZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7bmFtZSwgc3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBDbGVhciBwZXJzaXN0ZW50IGNhY2hlXG4gICAgaWYoc3RvcmFnZSAmJiBjbGVhclN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwge30pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciBhbGwgcHJvcGVydGllc1xuICAgIHRoaXMubWlkZGxld2FyZSA9IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zfTtcbiAgICB0aGlzLnN0YXRlID0ge307XG4gICAgdGhpcy5zdG9yZUFjdGlvbnMgPSB7fTtcbiAgICB0aGlzLmlzSW5pdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSB0byBzZXQuIFlvdSBjYW4gYWxzbyB1c2UgYW4gYXJyYXkgdG8gc3BlY2lmeSBhIHByb3BlcnR5IHBhdGhcbiAgICogd2l0aGluIHRoZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7YW55fSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICBzZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCB2YWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmKCEhcGF0aCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHNldChwYXRoLCBjbG9uZURlZXAodmFsdWUpLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcGVyc2lzdGVudCBjYWNoZVxuICAgIGNvbnN0IHtzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVN0b3JhZ2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUGx1Z2luKHR5cGU6IHN0cmluZywgcGx1Z2luOiBGbHV4UGx1Z2luVHlwZSk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG4gICAgY29uc3Qge21ldGhvZCwgbmFtZX0gPSBwbHVnaW47XG5cbiAgICBpZihtZXRob2QgJiYgdHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQ2hlY2sgaWYgcGx1Z2luIGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCBleGlzdHM6IGJvb2xlYW4gPSAhIWxpc3QuZmlsdGVyKChvYmo6IEZsdXhQbHVnaW5UeXBlKSA9PiBvYmoubmFtZSA9PT0gbmFtZSkubGVuZ3RoO1xuXG4gICAgICAvLyBEbyBub3QgYWRkIGR1cGxpY2F0ZSBwbHVnaW5zXG4gICAgICBpZighZXhpc3RzKSB7XG4gICAgICAgIGxpc3QucHVzaCh7bWV0aG9kLCBuYW1lfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtwbHVnaW4ubmFtZX0gbWlkZGxld2FyZSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4gTWV0aG9kIGlzIG5vdCBhIGZ1bmN0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXJlZ2lzdGVyKG5hbWU6IHN0cmluZyA9ICcnKTogdm9pZCB7XG4gICAgZGVsZXRlIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICAgIGRlbGV0ZSB0aGlzLnN0YXRlW25hbWVdO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlcihzdG9yZUZuKTogRmx1eFN0b3JlIHtcbiAgICBpZighc3RvcmVGbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1N0b3JlIGlzIHVuZGVmaW5lZC4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0ZuYzogYm9vbGVhbiA9IHR5cGVvZiBzdG9yZUZuID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYoIWlzRm5jKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtzdG9yZUZufSBpcyBub3QgYSBzdG9yZSBmdW5jdGlvbi4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC5gKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RvcmUgb2JqZWN0XG4gICAgY29uc3Qge25hbWV9ID0gc3RvcmVGbjtcbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IGFueSA9IHN0b3JlRm4oKTtcbiAgICBjb25zdCBzdG9yZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogc3RvcmVGbixcbiAgICAgIGluaXRpYWxTdGF0ZTogc3RvcmVGbigpLFxuICAgICAgbmFtZVxuICAgIH07XG5cbiAgICBpZighaXNFbXB0eShuYW1lKSAmJiAhdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV0pIHtcbiAgICAgIC8vIFNhdmUgc3RvcmUgb2JqZWN0XG4gICAgICB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSA9IHN0b3JlQWN0aW9uO1xuXG4gICAgICAvLyBHZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICAgIGlmKCF0aGlzLnN0YXRlW25hbWVdKSB7XG4gICAgICAgIGlmKGluaXRpYWxTdGF0ZSkge1xuICAgICAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSBjbG9uZURlZXAoaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlW25hbWVdID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gc3RvcmUgY2xhc3NcbiAgICByZXR1cm4gdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV07XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBsdWdpbih0eXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG5cbiAgICAvLyByZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBwbHVnaW5cbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lICE9PSBuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RvcmFnZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cbiAgcHJpdmF0ZSBhc3luYyB1c2VTdG9yYWdlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtzdG9yYWdlLCBzdGF0ZSwgc3RvcmFnZVdhaXR9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgLy8gQ2FjaGVcbiAgICBpZihzdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGUgfHwgYXdhaXQgc3RvcmFnZS5nZXRTdG9yYWdlRGF0YShuYW1lKSB8fCB7fTtcbiAgICAgICAgdGhpcy51cGRhdGVTdG9yYWdlID0gZGVib3VuY2UoXG4gICAgICAgICAgKCkgPT4gc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICBzdG9yYWdlV2FpdCxcbiAgICAgICAgICB7bGVhZGluZzogdHJ1ZSwgdHJhaWxpbmc6IHRydWV9XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEFya2hhbUpTIEVycm9yOiBVc2luZyBzdG9yYWdlLCBcIiR7bmFtZX1cIi5gKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRmx1eDogRmx1eEZyYW1ld29yayA9IG5ldyBGbHV4RnJhbWV3b3JrKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7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
|
349
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBFcnJvclN0YWNrUGFyc2VyIGZyb20gJ2Vycm9yLXN0YWNrLXBhcnNlcic7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvZnAvY2xvbmVEZWVwJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2ZwL2dldCc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvZnAvaXNFbXB0eSc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnbG9kYXNoL2ZwL21lcmdlJztcbmltcG9ydCBzZXQgZnJvbSAnbG9kYXNoL2ZwL3NldCc7XG5cbmltcG9ydCB7QXJraGFtQ29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvQXJraGFtQ29uc3RhbnRzJztcbmltcG9ydCB7Rmx1eEFjdGlvbiwgRmx1eE1pZGRsZXdhcmVUeXBlLCBGbHV4T3B0aW9ucywgRmx1eFBsdWdpblR5cGUsIEZsdXhTdG9yZX0gZnJvbSAnLi9GbHV4LnR5cGVzJztcblxuLyoqXG4gKiBGbHV4RnJhbWV3b3JrXG4gKiBAdHlwZSB7RXZlbnRFbWl0dGVyfVxuICovXG5leHBvcnQgY2xhc3MgRmx1eEZyYW1ld29yayBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBpbml0Rmx1eDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gUHVibGljIHByb3BlcnRpZXNcbiAgcGx1Z2luVHlwZXM6IHN0cmluZ1tdID0gWydwcmVEaXNwYXRjaCcsICdwb3N0RGlzcGF0Y2gnXTtcbiAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgc3RhdGU6IGFueSA9IHt9O1xuICBwcml2YXRlIHN0b3JlQWN0aW9uczogYW55ID0ge307XG4gIHByaXZhdGUgZGVmYXVsdE9wdGlvbnM6IEZsdXhPcHRpb25zID0ge1xuICAgIG5hbWU6ICdhcmtoYW1qcycsXG4gICAgcm91dGVyVHlwZTogJ2Jyb3dzZXInLFxuICAgIHNjcm9sbFRvVG9wOiB0cnVlLFxuICAgIHN0YXRlOiBudWxsLFxuICAgIHN0b3JhZ2U6IG51bGwsXG4gICAgc3RvcmFnZVdhaXQ6IDMwMCxcbiAgICBzdG9yZXM6IFtdLFxuICAgIHRpdGxlOiAnQXJraGFtSlMnXG4gIH07XG4gIHByaXZhdGUgbWlkZGxld2FyZTogYW55ID0ge307XG4gIHByaXZhdGUgb3B0aW9uczogRmx1eE9wdGlvbnMgPSB0aGlzLmRlZmF1bHRPcHRpb25zO1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEZsdXguICBOb3RlIHRoYXQgdGhlIEZsdXggb2JqZWN0XG4gICAqIGlzIGEgU2luZ2xldG9uIHBhdHRlcm4sIHNvIG9ubHkgb25lIHNob3VsZCBldmVyIGV4aXN0LlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHRoaXMge0ZsdXhGcmFtZXdvcmt9XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gTWV0aG9kc1xuICAgIHRoaXMuYWRkTWlkZGxld2FyZSA9IHRoaXMuYWRkTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYWRkU3RvcmVzID0gdGhpcy5hZGRTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyQXBwRGF0YSA9IHRoaXMuY2xlYXJBcHBEYXRhLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jbGVhck1pZGRsZXdhcmUgPSB0aGlzLmNsZWFyTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGVyZWdpc3RlciA9IHRoaXMuZGVyZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLmRpc3BhdGNoLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRPcHRpb25zID0gdGhpcy5nZXRPcHRpb25zLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0b3JlID0gdGhpcy5nZXRTdG9yZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaW5pdCA9IHRoaXMuaW5pdC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub2ZmID0gdGhpcy5vZmYuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyID0gdGhpcy5yZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlTWlkZGxld2FyZSA9IHRoaXMucmVtb3ZlTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlU3RvcmVzID0gdGhpcy5yZW1vdmVTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlc2V0ID0gdGhpcy5yZXNldC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2V0U3RhdGUgPSB0aGlzLnNldFN0YXRlLmJpbmQodGhpcyk7XG5cbiAgICAvLyBBZGQgbWlkZGxld2FyZSBwbHVnaW4gdHlwZXNcbiAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtaWRkbGV3YXJlIHRvIGZyYW1ld29yay5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gbWlkZGxld2FyZSBBbiBhcnJheSBvZiBtaWRkbGV3YXJlIHRvIGFkZCB0byB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlOiBGbHV4TWlkZGxld2FyZVR5cGVbXSk6IHZvaWQge1xuICAgIG1pZGRsZXdhcmUuZm9yRWFjaCgobWlkZGxlT2JqOiBGbHV4TWlkZGxld2FyZVR5cGUpID0+IHtcbiAgICAgIC8vIE1ha2Ugc3VyZSBtaWRkbGV3YXJlIGlzIGVpdGhlciBhIGNsYXNzIG9yIG9iamVjdC5cbiAgICAgIGlmKCEhbWlkZGxlT2JqICYmICgodHlwZW9mIG1pZGRsZU9iaiA9PT0gJ2Z1bmN0aW9uJykgfHwgKHR5cGVvZiBtaWRkbGVPYmogPT09ICdvYmplY3QnKSkpIHtcbiAgICAgICAgY29uc3QgbWlkZGxlTmFtZTogc3RyaW5nID0gbWlkZGxlT2JqLm5hbWUgfHwgJyc7XG5cbiAgICAgICAgaWYoIW1pZGRsZU5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBSZXF1aXJlcyBuYW1lIHByb3BlcnR5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IG1pZGRsZXdhcmUgcGx1Z2lucyBmb3IgZWZmaWNpZW5jeVxuICAgICAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1pZGRsZU9ialt0eXBlXTtcbiAgICAgICAgICBjb25zdCBwbHVnaW46IEZsdXhQbHVnaW5UeXBlID0ge21ldGhvZCwgbmFtZTogbWlkZGxlTmFtZX07XG4gICAgICAgICAgdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gdGhpcy5hZGRQbHVnaW4odHlwZSwgcGx1Z2luKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBhcHAgZGF0YSBmcm9tIHN0b3JhZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGFwcCBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyQXBwRGF0YSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5zdG9yZUFjdGlvbnMpXG4gICAgICAuZm9yRWFjaCgoc3RvcmVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmVGbiA9IHRoaXMuc3RvcmVBY3Rpb25zW3N0b3JlTmFtZV07XG4gICAgICAgIHRoaXMuc3RhdGVbc3RvcmVGbi5uYW1lXSA9IGNsb25lRGVlcChzdG9yZUZuLmluaXRpYWxTdGF0ZSk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHRoaXMuc3RhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBtaWRkbGV3YXJlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtaWRkbGV3YXJlIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyTWlkZGxld2FyZSgpOiBib29sZWFuIHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5taWRkbGV3YXJlKVxuICAgICAgLmZvckVhY2goKHBsdWdpblR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm1pZGRsZXdhcmVbcGx1Z2luVHlwZV0gPSBbXTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGUtcmVnaXN0ZXJzIG5hbWVkIHN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RvcmVOYW1lcyBBbiBhcnJheSBvZiBzdG9yZSBuYW1lcyB0byByZW1vdmUgZnJvbSB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgcmVtb3ZlU3RvcmVzKHN0b3JlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgc3RvcmVOYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuZGVyZWdpc3RlcihuYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24gdG8gYWxsIHN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFjdGlvbiB0byBkaXNwYXRjaCB0byBhbGwgdGhlIHN0b3Jlcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBzaWxlbnQgVG8gc2lsZW5jZSBhbnkgZXZlbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgd2hlbiBhbmQgaWYgdGhlIGFwcCBzYXZlcyBkYXRhIHRvIHN0b3JhZ2UsIHJldHVybmluZ1xuICAgKiB0aGUgYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZGlzcGF0Y2goYWN0aW9uOiBGbHV4QWN0aW9uLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4ge1xuICAgIGlmKCFhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJraGFtSlMgRXJyb3I6IEZsdXguZGlzcGF0Y2ggcmVxdWlyZXMgYW4gYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCBjbG9uZWRBY3Rpb246IEZsdXhBY3Rpb24gPSBjbG9uZURlZXAoYWN0aW9uKTtcblxuICAgIC8vIExvZyBkdXJhdGlvbiBvZiBkaXNwYXRjaFxuICAgIGNvbnN0IHN0YXJ0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIEdldCBzdGFja1xuICAgIGxldCBzdGFjayA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YWNrUHJvcGVydHk6IHN0cmluZyA9ICdzdGFja1RyYWNlTGltaXQnO1xuICAgICAgY29uc3Qge3N0YWNrVHJhY2VMaW1pdH06IGFueSA9IEVycm9yO1xuICAgICAgRXJyb3Jbc3RhY2tQcm9wZXJ0eV0gPSBJbmZpbml0eTtcbiAgICAgIHN0YWNrID0gRXJyb3JTdGFja1BhcnNlci5wYXJzZShuZXcgRXJyb3IoKSk7XG4gICAgICBFcnJvcltzdGFja1Byb3BlcnR5XSA9IHN0YWNrVHJhY2VMaW1pdDtcbiAgICB9IGNhdGNoKGVycm9yKSB7fVxuXG4gICAgLy8gR2V0IG9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zID0gY2xvbmVEZWVwKHRoaXMub3B0aW9ucyk7XG5cbiAgICAvLyBBcHAgaW5mb1xuICAgIGNvbnN0IGFwcEluZm8gPSB7ZHVyYXRpb246IDAsIG9wdGlvbnMsIHN0YWNrfTtcblxuICAgIC8vIEFwcGx5IG1pZGRsZXdhcmUgYmVmb3JlIHRoZSBhY3Rpb24gaXMgcHJvY2Vzc2VkXG4gICAgY29uc3Qge3Bvc3REaXNwYXRjaExpc3QgPSBbXSwgcHJlRGlzcGF0Y2hMaXN0ID0gW119ID0gdGhpcy5taWRkbGV3YXJlO1xuXG4gICAgaWYocHJlRGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgUHJvbWlzZVxuICAgICAgICAuYWxsKFxuICAgICAgICAgIHByZURpc3BhdGNoTGlzdC5tYXAoKHBsdWdpbjogRmx1eFBsdWdpblR5cGUpID0+IHBsdWdpbi5tZXRob2QoXG4gICAgICAgICAgICBjbG9uZURlZXAoY2xvbmVkQWN0aW9uKSwgY2xvbmVEZWVwKHRoaXMuc3RhdGUpLCBhcHBJbmZvKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAudGhlbihcbiAgICAgICAgICAoYWN0aW9ucykgPT4gYWN0aW9ucy5yZWR1Y2UoKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbikgPT5cbiAgICAgICAgICAgIG1lcmdlKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbiksIGNsb25lZEFjdGlvbikgYXMgRmx1eEFjdGlvblxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qge3R5cGUsIC4uLmRhdGF9ID0gY2xvbmVkQWN0aW9uO1xuXG4gICAgLy8gUmVxdWlyZSBhIHR5cGVcbiAgICBpZighdHlwZSB8fCB0eXBlID09PSAnJykge1xuICAgICAgY29uc29sZS53YXJuKCdBcmtoYW1KUyBXYXJuaW5nOiBGbHV4LmRpc3BhdGNoIGlzIG1pc3NpbmcgYW4gYWN0aW9uIHR5cGUgZm9yIHRoZSBwYXlsb2FkOicsIGRhdGEpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZWRBY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIFdoZW4gYW4gYWN0aW9uIGNvbWVzIGluLCBpdCBtdXN0IGJlIGNvbXBsZXRlbHkgaGFuZGxlZCBieSBhbGwgc3RvcmVzXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyh0aGlzLnN0b3JlQWN0aW9ucylcbiAgICAgIC5mb3JFYWNoKChzdG9yZU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjbG9uZURlZXAodGhpcy5zdGF0ZVtzdG9yZU5hbWVdKSB8fCBjbG9uZURlZXAoc3RvcmVGbi5pbml0aWFsU3RhdGUpIHx8IHt9O1xuICAgICAgICB0aGlzLnN0YXRlW3N0b3JlTmFtZV0gPSBjbG9uZURlZXAoc3RvcmVGbi5hY3Rpb24odHlwZSwgZGF0YSwgc3RhdGUpKSB8fCBzdGF0ZTtcbiAgICAgIH0pO1xuXG4gICAgLy8gU2F2ZSBjYWNoZSBpbiBzdG9yYWdlXG4gICAgY29uc3Qge3N0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdG9yYWdlKCk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7fVxuICAgIH1cblxuICAgIGNvbnN0IGVuZFRpbWU6IG51bWJlciA9ICsobmV3IERhdGUoKSk7XG4gICAgY29uc3QgZHVyYXRpb246IG51bWJlciA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgYXBwSW5mby5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG4gICAgaWYocG9zdERpc3BhdGNoTGlzdC5sZW5ndGgpIHtcbiAgICAgIGNsb25lZEFjdGlvbiA9IGF3YWl0IFByb21pc2VcbiAgICAgICAgLmFsbChcbiAgICAgICAgICBwb3N0RGlzcGF0Y2hMaXN0Lm1hcChcbiAgICAgICAgICAgIGFzeW5jIChwbHVnaW46IEZsdXhQbHVnaW5UeXBlKSA9PiBwbHVnaW4ubWV0aG9kKGNsb25lRGVlcChjbG9uZWRBY3Rpb24pLCBjbG9uZURlZXAodGhpcy5zdGF0ZSksIGFwcEluZm8pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIChhY3Rpb25zKSA9PiBhY3Rpb25zLnJlZHVjZSgodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSA9PlxuICAgICAgICAgICAgbWVyZ2UodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSwgY2xvbmVkQWN0aW9uKSBhcyBGbHV4QWN0aW9uXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZighc2lsZW50KSB7XG4gICAgICB0aGlzLmVtaXQodHlwZSwgY2xvbmVkQWN0aW9uKTtcbiAgICAgIHRoaXMuZW1pdCgnYXJraGFtanMnLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNsb25lZEFjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IEZsdXggb3B0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMge0ZsdXhPcHRpb25zfSB0aGUgRmx1eCBvcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGdldE9wdGlvbnMoKTogRmx1eE9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IFtuYW1lXSAob3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSBmb3IgYW4gb2JqZWN0LCBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gYWxsIHN0b3JlXG4gICAqICAgb2JqZWN0cy4gWW91IGNhbiBhbHNvIHVzZSBhbiBhcnJheSB0byBzcGVjaWZ5IGEgcHJvcGVydHkgcGF0aCB3aXRoaW4gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFtkZWZhdWx0VmFsdWVdIChvcHRpb25hbCkgQSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiBudWxsLlxuICAgKiBAcmV0dXJucyB7YW55fSB0aGUgc3RhdGUgb2JqZWN0IG9yIGEgcHJvcGVydHkgdmFsdWUgd2l0aGluLlxuICAgKi9cbiAgZ2V0U3RhdGUocGF0aDogc3RyaW5nIHwgc3RyaW5nW10gPSAnJywgZGVmYXVsdFZhbHVlPyk6IGFueSB7XG4gICAgbGV0IHN0b3JlVmFsdWU7XG5cbiAgICBpZighcGF0aCkge1xuICAgICAgc3RvcmVWYWx1ZSA9IHRoaXMuc3RhdGUgfHwge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3JlVmFsdWUgPSBnZXQocGF0aCwgdGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBzdG9yZVZhbHVlID8gY2xvbmVEZWVwKHN0b3JlVmFsdWUpIDogc3RvcmVWYWx1ZTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0b3JlIG9iamVjdCByZWdpc3RlcmVkIHdpdGggRmx1eC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN0b3JlLlxuICAgKiBAcmV0dXJucyB7Rmx1eFN0b3JlfSB0aGUgc3RvcmUgb2JqZWN0LlxuICAgKi9cbiAgZ2V0U3RvcmUobmFtZTogc3RyaW5nID0gJycpOiBGbHV4U3RvcmUge1xuICAgIHJldHVybiB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFuZCBzZXQgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqL1xuICBhc3luYyBpbml0KG9wdGlvbnM6IEZsdXhPcHRpb25zID0ge30sIHJlc2V0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEZsdXhGcmFtZXdvcms+IHtcbiAgICAvLyBTaG91bGQgcmVzZXQgcHJldmlvdXMgcGFyYW1zXG4gICAgaWYocmVzZXQpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgb3B0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0gey4uLm9wdGlvbnN9O1xuXG4gICAgaWYodGhpcy5pc0luaXQpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgbmFtZSBmcm9tIG9wdGlvbnMgaWYgYWxyZWFkeSBpbml0aWFsaXplZCwgb3RoZXJ3aXNlIHRoZSByb290IGFwcCB3aWxsIG5vdCBiZSBhYmxlIHRvIGFjY2Vzc1xuICAgICAgLy8gdGhlIHN0YXRlIHRyZWVcbiAgICAgIHVwZGF0ZWRPcHRpb25zLm5hbWUgPSB0aGlzLm9wdGlvbnMubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5kZWZhdWx0T3B0aW9ucywgLi4udXBkYXRlZE9wdGlvbnN9O1xuICAgIGNvbnN0IHtkZWJ1ZywgbWlkZGxld2FyZSwgbmFtZSwgc3RvcmVzfSA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIFVwZGF0ZSBkZWZhdWx0IHN0b3JlXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXNlU3RvcmFnZShuYW1lKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSB1c2luZyBzdG9yYWdlLicsIG5hbWUpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYoISFzdG9yZXMgJiYgc3RvcmVzLmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRTdG9yZXMoc3RvcmVzKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXJraGFtIEVycm9yOiBUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWRkaW5nIHN0b3Jlcy4nLCBzdG9yZXMpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZighIW1pZGRsZXdhcmUgJiYgbWlkZGxld2FyZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCB3aW5kb3dQcm9wZXJ0eTogc3RyaW5nID0gJ2Fya2hhbWpzJztcblxuICAgIGlmKGRlYnVnKSB7XG4gICAgICB3aW5kb3dbd2luZG93UHJvcGVydHldID0gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHdpbmRvd1t3aW5kb3dQcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXQgPSB0cnVlO1xuICAgIHRoaXMuZW1pdChBcmtoYW1Db25zdGFudHMuSU5JVCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGluaXRpYWxpemF0aW9uIGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbGlzdGVuZXJdIFRoZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnNjcmliZWQgZXZlbnQuXG4gICAqL1xuICBvbkluaXQobGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub24oQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcblxuICAgIGlmKHRoaXMuaXNJbml0KSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBpbml0aWFsaXphdGlvbiBsaXN0ZW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb2ZmSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vZmYoQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50VHlwZV0gRXZlbnQgdG8gdW5zdWJzY3JpYmUuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9mZihldmVudFR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRUeXBlXSBFdmVudCB0byBzdWJzY3JpYmUuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9uKGV2ZW50VHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIG5ldyBTdG9yZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0b3JlcyBTdG9yZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgYXN5bmMgYWRkU3RvcmVzKHN0b3JlczogYW55W10pOiBQcm9taXNlPG9iamVjdFtdPiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZFN0b3JlczogRmx1eFN0b3JlW10gPSBzdG9yZXMubWFwKChzdG9yZTogRmx1eFN0b3JlKSA9PiB0aGlzLnJlZ2lzdGVyKHN0b3JlKSk7XG5cbiAgICAvLyBTYXZlIGNhY2hlIGluIHNlc3Npb24gc3RvcmFnZVxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBjbGFzc2VzXG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRTdG9yZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG1pZGRsZXdhcmUgZnJvbSBmcmFtZXdvcmsuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0cmluZyBtaWRkbGV3YXJlIG5hbWVzIHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgcmVtb3ZlTWlkZGxld2FyZShuYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBuYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlbW92ZSBtaWRkbGV3YXJlIHBsdWdpbnNcbiAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSA9IHRoaXMucmVtb3ZlUGx1Z2luKHR5cGUsIG5hbWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgZnJhbWV3b3JrLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBzdHJpbmcgbWlkZGxld2FyZSBuYW1lcyB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdFtdPn0gdGhlIGNsYXNzIG9iamVjdChzKS5cbiAgICovXG4gIGFzeW5jIHJlc2V0KGNsZWFyU3RvcmFnZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7bmFtZSwgc3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBDbGVhciBwZXJzaXN0ZW50IGNhY2hlXG4gICAgaWYoc3RvcmFnZSAmJiBjbGVhclN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwge30pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciBhbGwgcHJvcGVydGllc1xuICAgIHRoaXMubWlkZGxld2FyZSA9IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zfTtcbiAgICB0aGlzLnN0YXRlID0ge307XG4gICAgdGhpcy5zdG9yZUFjdGlvbnMgPSB7fTtcbiAgICB0aGlzLmlzSW5pdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSB0byBzZXQuIFlvdSBjYW4gYWxzbyB1c2UgYW4gYXJyYXkgdG8gc3BlY2lmeSBhIHByb3BlcnR5IHBhdGhcbiAgICogd2l0aGluIHRoZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7YW55fSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICBzZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCB2YWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmKCEhcGF0aCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHNldChwYXRoLCBjbG9uZURlZXAodmFsdWUpLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcGVyc2lzdGVudCBjYWNoZVxuICAgIGNvbnN0IHtzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVN0b3JhZ2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUGx1Z2luKHR5cGU6IHN0cmluZywgcGx1Z2luOiBGbHV4UGx1Z2luVHlwZSk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG4gICAgY29uc3Qge21ldGhvZCwgbmFtZX0gPSBwbHVnaW47XG5cbiAgICBpZihtZXRob2QgJiYgdHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQ2hlY2sgaWYgcGx1Z2luIGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCBleGlzdHM6IGJvb2xlYW4gPSAhIWxpc3QuZmlsdGVyKChvYmo6IEZsdXhQbHVnaW5UeXBlKSA9PiBvYmoubmFtZSA9PT0gbmFtZSkubGVuZ3RoO1xuXG4gICAgICAvLyBEbyBub3QgYWRkIGR1cGxpY2F0ZSBwbHVnaW5zXG4gICAgICBpZighZXhpc3RzKSB7XG4gICAgICAgIGxpc3QucHVzaCh7bWV0aG9kLCBuYW1lfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtwbHVnaW4ubmFtZX0gbWlkZGxld2FyZSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4gTWV0aG9kIGlzIG5vdCBhIGZ1bmN0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXJlZ2lzdGVyKG5hbWU6IHN0cmluZyA9ICcnKTogdm9pZCB7XG4gICAgZGVsZXRlIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICAgIGRlbGV0ZSB0aGlzLnN0YXRlW25hbWVdO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlcihzdG9yZUZuKTogRmx1eFN0b3JlIHtcbiAgICBpZighc3RvcmVGbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1N0b3JlIGlzIHVuZGVmaW5lZC4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0ZuYzogYm9vbGVhbiA9IHR5cGVvZiBzdG9yZUZuID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYoIWlzRm5jKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtzdG9yZUZufSBpcyBub3QgYSBzdG9yZSBmdW5jdGlvbi4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC5gKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RvcmUgb2JqZWN0XG4gICAgY29uc3Qge25hbWV9ID0gc3RvcmVGbjtcbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IGFueSA9IHN0b3JlRm4oKTtcbiAgICBjb25zdCBzdG9yZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogc3RvcmVGbixcbiAgICAgIGluaXRpYWxTdGF0ZTogc3RvcmVGbigpLFxuICAgICAgbmFtZVxuICAgIH07XG5cbiAgICBpZighaXNFbXB0eShuYW1lKSAmJiAhdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV0pIHtcbiAgICAgIC8vIFNhdmUgc3RvcmUgb2JqZWN0XG4gICAgICB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSA9IHN0b3JlQWN0aW9uO1xuXG4gICAgICAvLyBHZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICAgIGlmKCF0aGlzLnN0YXRlW25hbWVdKSB7XG4gICAgICAgIGlmKGluaXRpYWxTdGF0ZSkge1xuICAgICAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSBjbG9uZURlZXAoaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlW25hbWVdID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gc3RvcmUgY2xhc3NcbiAgICByZXR1cm4gdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV07XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBsdWdpbih0eXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG5cbiAgICAvLyByZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBwbHVnaW5cbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lICE9PSBuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RvcmFnZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cbiAgcHJpdmF0ZSBhc3luYyB1c2VTdG9yYWdlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtzdG9yYWdlLCBzdGF0ZSwgc3RvcmFnZVdhaXR9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgLy8gQ2FjaGVcbiAgICBpZihzdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGUgfHwgYXdhaXQgc3RvcmFnZS5nZXRTdG9yYWdlRGF0YShuYW1lKSB8fCB7fTtcbiAgICAgICAgdGhpcy51cGRhdGVTdG9yYWdlID0gZGVib3VuY2UoXG4gICAgICAgICAgKCkgPT4gc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICBzdG9yYWdlV2FpdCxcbiAgICAgICAgICB7bGVhZGluZzogdHJ1ZSwgdHJhaWxpbmc6IHRydWV9XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEFya2hhbUpTIEVycm9yOiBVc2luZyBzdG9yYWdlLCBcIiR7bmFtZX1cIi5gKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRmx1eDogRmx1eEZyYW1ld29yayA9IG5ldyBGbHV4RnJhbWV3b3JrKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7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
|
package/lib/Flux/Flux.test.js
CHANGED
@@ -1,43 +1,23 @@
|
|
1
1
|
var __create = Object.create;
|
2
2
|
var __defProp = Object.defineProperty;
|
3
|
-
var __defProps = Object.defineProperties;
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
5
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
6
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
7
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
8
5
|
var __getProtoOf = Object.getPrototypeOf;
|
9
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
10
|
-
var
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
__defNormalProp(a, prop, b[prop]);
|
16
|
-
if (__getOwnPropSymbols)
|
17
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
18
|
-
if (__propIsEnum.call(b, prop))
|
19
|
-
__defNormalProp(a, prop, b[prop]);
|
20
|
-
}
|
21
|
-
return a;
|
22
|
-
};
|
23
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
24
|
-
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
25
|
-
var __reExport = (target, module2, desc) => {
|
26
|
-
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
27
|
-
for (let key of __getOwnPropNames(module2))
|
28
|
-
if (!__hasOwnProp.call(target, key) && key !== "default")
|
29
|
-
__defProp(target, key, {get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable});
|
7
|
+
var __copyProps = (to, from, except, desc) => {
|
8
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
9
|
+
for (let key of __getOwnPropNames(from))
|
10
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
11
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
30
12
|
}
|
31
|
-
return
|
32
|
-
};
|
33
|
-
var __toModule = (module2) => {
|
34
|
-
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2);
|
13
|
+
return to;
|
35
14
|
};
|
36
|
-
var
|
37
|
-
var
|
38
|
-
var
|
39
|
-
var
|
40
|
-
var
|
15
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
|
16
|
+
var import_debounce = __toESM(require("lodash/debounce"));
|
17
|
+
var import_cloneDeep = __toESM(require("lodash/fp/cloneDeep"));
|
18
|
+
var import_set = __toESM(require("lodash/fp/set"));
|
19
|
+
var import_ArkhamConstants = require("../constants/ArkhamConstants");
|
20
|
+
var import_Flux = require("./Flux");
|
41
21
|
jest.mock("lodash/debounce");
|
42
22
|
const initialState = {
|
43
23
|
falsy: false,
|
@@ -79,7 +59,7 @@ describe("Flux", () => {
|
|
79
59
|
const middleTest = "intercept object";
|
80
60
|
const objMiddleware = {
|
81
61
|
name: "objectMiddleware",
|
82
|
-
preDispatch: (action) =>
|
62
|
+
preDispatch: (action) => ({ ...action, testVar: middleTest })
|
83
63
|
};
|
84
64
|
afterEach(() => {
|
85
65
|
Flux.clearMiddleware();
|
@@ -87,12 +67,12 @@ describe("Flux", () => {
|
|
87
67
|
it("should alter data before sending to stores", async () => {
|
88
68
|
Flux.addMiddleware([objMiddleware]);
|
89
69
|
Flux.setState("helloStore.testAction", "default");
|
90
|
-
const preAction = await Flux.dispatch({testVar: "hello world", type: "TEST_EVENT"});
|
70
|
+
const preAction = await Flux.dispatch({ testVar: "hello world", type: "TEST_EVENT" });
|
91
71
|
expect(Flux.getState("helloStore.testAction")).toEqual(middleTest);
|
92
72
|
expect(preAction.testVar).toEqual(middleTest);
|
93
73
|
});
|
94
74
|
it("should handle error for middleware without a name", () => {
|
95
|
-
const fn = () => Flux.addMiddleware([{preDispatch: objMiddleware.preDispatch}]);
|
75
|
+
const fn = () => Flux.addMiddleware([{ preDispatch: objMiddleware.preDispatch }]);
|
96
76
|
expect(fn).toThrowError();
|
97
77
|
});
|
98
78
|
it("should handle error for incompatible middleware", () => {
|
@@ -105,7 +85,7 @@ describe("Flux", () => {
|
|
105
85
|
beforeEach(() => {
|
106
86
|
const promiseMiddleware = {
|
107
87
|
name: "promiseMiddleware",
|
108
|
-
preDispatch: (action) => Promise.resolve(
|
88
|
+
preDispatch: (action) => Promise.resolve({ ...action, testVar: middleTest })
|
109
89
|
};
|
110
90
|
Flux.addMiddleware([promiseMiddleware]);
|
111
91
|
});
|
@@ -114,7 +94,7 @@ describe("Flux", () => {
|
|
114
94
|
});
|
115
95
|
it("should alter data before sending to stores", async () => {
|
116
96
|
Flux.setState("helloStore.testAction", "default");
|
117
|
-
const preAction = await Flux.dispatch({testVar: "hello world", type: "TEST_EVENT"});
|
97
|
+
const preAction = await Flux.dispatch({ testVar: "hello world", type: "TEST_EVENT" });
|
118
98
|
expect(Flux.getState("helloStore.testAction")).toEqual(middleTest);
|
119
99
|
expect(preAction.testVar).toEqual(middleTest);
|
120
100
|
});
|
@@ -124,7 +104,7 @@ describe("Flux", () => {
|
|
124
104
|
beforeEach(() => {
|
125
105
|
const postMiddleware = {
|
126
106
|
name: "postMiddleware",
|
127
|
-
postDispatch: (action) => Promise.resolve(
|
107
|
+
postDispatch: (action) => Promise.resolve({ ...action, testVar: middleTest })
|
128
108
|
};
|
129
109
|
Flux.addMiddleware([postMiddleware]);
|
130
110
|
});
|
@@ -133,7 +113,7 @@ describe("Flux", () => {
|
|
133
113
|
});
|
134
114
|
it("should alter store data", async () => {
|
135
115
|
Flux.setState("helloStore.testAction", "default");
|
136
|
-
const postAction = await Flux.dispatch({testVar: "hello world", type: "TEST_EVENT"});
|
116
|
+
const postAction = await Flux.dispatch({ testVar: "hello world", type: "TEST_EVENT" });
|
137
117
|
expect(Flux.getState("helloStore.testAction")).toEqual("hello world");
|
138
118
|
expect(postAction.testVar).toEqual(middleTest);
|
139
119
|
});
|
@@ -146,7 +126,7 @@ describe("Flux", () => {
|
|
146
126
|
preDispatch: () => Promise.reject(new Error("test"))
|
147
127
|
};
|
148
128
|
Flux.addMiddleware([preMiddleware]);
|
149
|
-
await expect(Flux.dispatch({type: "test"})).rejects.toThrowError();
|
129
|
+
await expect(Flux.dispatch({ type: "test" })).rejects.toThrowError();
|
150
130
|
});
|
151
131
|
it("should handle post dispatch error", async () => {
|
152
132
|
const postMiddleware = {
|
@@ -154,29 +134,29 @@ describe("Flux", () => {
|
|
154
134
|
postDispatch: () => Promise.reject(new Error("test"))
|
155
135
|
};
|
156
136
|
Flux.addMiddleware([postMiddleware]);
|
157
|
-
await expect(Flux.dispatch({type: "test"})).rejects.toThrowError();
|
137
|
+
await expect(Flux.dispatch({ type: "test" })).rejects.toThrowError();
|
158
138
|
});
|
159
139
|
});
|
160
140
|
});
|
161
141
|
describe("#addPlugin", () => {
|
162
142
|
it("should add a plugin", () => {
|
163
143
|
const addPluginKey = "addPlugin";
|
164
|
-
const plugin = {method: () => {
|
165
|
-
}, name: "demoPlugin"};
|
144
|
+
const plugin = { method: () => {
|
145
|
+
}, name: "demoPlugin" };
|
166
146
|
const results = Flux[addPluginKey]("preDispatch", plugin);
|
167
147
|
expect(results).toEqual([plugin]);
|
168
148
|
});
|
169
149
|
it("should skip plugin if already exists", () => {
|
170
150
|
const addPluginKey = "addPlugin";
|
171
|
-
const plugin = {method: () => {
|
172
|
-
}, name: "demoPlugin"};
|
151
|
+
const plugin = { method: () => {
|
152
|
+
}, name: "demoPlugin" };
|
173
153
|
Flux.middleware.preDispatchList = [plugin];
|
174
154
|
const results = Flux[addPluginKey]("preDispatch", plugin);
|
175
155
|
expect(results).toEqual([plugin]);
|
176
156
|
});
|
177
157
|
it("should handle undefined function", () => {
|
178
158
|
const addPluginKey = "addPlugin";
|
179
|
-
const fn = () => Flux[addPluginKey]("preDispatch", {method: "object"});
|
159
|
+
const fn = () => Flux[addPluginKey]("preDispatch", { method: "object" });
|
180
160
|
expect(fn).toThrowError();
|
181
161
|
});
|
182
162
|
});
|
@@ -189,9 +169,9 @@ describe("Flux", () => {
|
|
189
169
|
expect(Flux.getState(["helloStore", "item"])).toEqual("default");
|
190
170
|
});
|
191
171
|
it("should set data in storage", async () => {
|
192
|
-
const retrnedValue = {hello: "world"};
|
172
|
+
const retrnedValue = { hello: "world" };
|
193
173
|
const setStorageData = jest.fn().mockResolvedValue(retrnedValue);
|
194
|
-
Flux.options.storage = {setStorageData};
|
174
|
+
Flux.options.storage = { setStorageData };
|
195
175
|
const results = await Flux.clearAppData();
|
196
176
|
expect(setStorageData.mock.calls.length).toEqual(1);
|
197
177
|
expect(results).toEqual(retrnedValue);
|
@@ -199,8 +179,8 @@ describe("Flux", () => {
|
|
199
179
|
});
|
200
180
|
describe("#deregister", () => {
|
201
181
|
it("should remove a state and store", () => {
|
202
|
-
Flux.state = {hello: "world"};
|
203
|
-
Flux.storeActions = {hello: "world"};
|
182
|
+
Flux.state = { hello: "world" };
|
183
|
+
Flux.storeActions = { hello: "world" };
|
204
184
|
Flux.deregister("hello");
|
205
185
|
expect(Flux.state).toEqual({});
|
206
186
|
expect(Flux.storeActions).toEqual({});
|
@@ -221,31 +201,31 @@ describe("Flux", () => {
|
|
221
201
|
Flux.off("TEST_EVENT", eventSpy);
|
222
202
|
});
|
223
203
|
it("should return an action", async () => {
|
224
|
-
Flux.dispatch({testVar: "test", type: "TEST_EVENT"});
|
225
|
-
const action = await Flux.dispatch({testVar: "test", type: "TEST_EVENT"});
|
226
|
-
expect(action).toEqual({testVar: "test", type: "TEST_EVENT"});
|
204
|
+
Flux.dispatch({ testVar: "test", type: "TEST_EVENT" });
|
205
|
+
const action = await Flux.dispatch({ testVar: "test", type: "TEST_EVENT" });
|
206
|
+
expect(action).toEqual({ testVar: "test", type: "TEST_EVENT" });
|
227
207
|
});
|
228
208
|
it("should alter the store data", () => {
|
229
|
-
Flux.dispatch({testVar: "test", type: "TEST_EVENT"});
|
209
|
+
Flux.dispatch({ testVar: "test", type: "TEST_EVENT" });
|
230
210
|
const item = Flux.getState("helloStore.testAction");
|
231
211
|
expect(item).toEqual("test");
|
232
212
|
});
|
233
213
|
it("should dispatch an event", () => {
|
234
|
-
Flux.dispatch({testVar: "test", type: "TEST_EVENT"});
|
214
|
+
Flux.dispatch({ testVar: "test", type: "TEST_EVENT" });
|
235
215
|
expect(eventSpy.mock.calls.length).toEqual(1);
|
236
216
|
});
|
237
217
|
it("should not dispatch if no type", () => {
|
238
|
-
Flux.dispatch({testVar: "test"});
|
218
|
+
Flux.dispatch({ testVar: "test" });
|
239
219
|
expect(eventSpy.mock.calls.length).toEqual(0);
|
240
220
|
});
|
241
221
|
it("should not dispatch if silent", () => {
|
242
|
-
Flux.dispatch({testVar: "test", type: "TEST_EVENT"}, true);
|
222
|
+
Flux.dispatch({ testVar: "test", type: "TEST_EVENT" }, true);
|
243
223
|
expect(eventSpy.mock.calls.length).toEqual(0);
|
244
224
|
});
|
245
225
|
it("should update storage", () => {
|
246
226
|
Flux.updateStorage = jest.fn().mockResolvedValue({});
|
247
227
|
Flux.options.storage = {};
|
248
|
-
Flux.dispatch({testVar: "test", type: "TEST_EVENT"});
|
228
|
+
Flux.dispatch({ testVar: "test", type: "TEST_EVENT" });
|
249
229
|
expect(Flux.updateStorage.mock.calls.length).toEqual(1);
|
250
230
|
});
|
251
231
|
it("should return updated state if action returns null", async () => {
|
@@ -258,7 +238,7 @@ describe("Flux", () => {
|
|
258
238
|
}
|
259
239
|
};
|
260
240
|
await Flux.addStores([nullStore]);
|
261
|
-
await Flux.dispatch({testVar: "test", type: "TEST_NULL"});
|
241
|
+
await Flux.dispatch({ testVar: "test", type: "TEST_NULL" });
|
262
242
|
expect(Flux.state.nullStore).toEqual(initialState);
|
263
243
|
});
|
264
244
|
it("should return empty object if store returns null by default", async () => {
|
@@ -272,7 +252,7 @@ describe("Flux", () => {
|
|
272
252
|
};
|
273
253
|
await Flux.addStores([nullStore]);
|
274
254
|
Flux.state.nullStore = null;
|
275
|
-
await Flux.dispatch({testVar: "test", type: "TEST_NULL"});
|
255
|
+
await Flux.dispatch({ testVar: "test", type: "TEST_NULL" });
|
276
256
|
expect(Flux.state.nullStore).toEqual({});
|
277
257
|
});
|
278
258
|
});
|
@@ -310,15 +290,15 @@ describe("Flux", () => {
|
|
310
290
|
});
|
311
291
|
it("should return entire store object with empty key", () => {
|
312
292
|
const value = Flux.getState("");
|
313
|
-
expect(value).toEqual({helloStore: initialState});
|
293
|
+
expect(value).toEqual({ helloStore: initialState });
|
314
294
|
});
|
315
295
|
it("should return entire store object with null key", () => {
|
316
296
|
const value = Flux.getState(null);
|
317
|
-
expect(value).toEqual({helloStore: initialState});
|
297
|
+
expect(value).toEqual({ helloStore: initialState });
|
318
298
|
});
|
319
299
|
it("should return entire store object with undefined key", () => {
|
320
300
|
const value = Flux.getState();
|
321
|
-
expect(value).toEqual({helloStore: initialState});
|
301
|
+
expect(value).toEqual({ helloStore: initialState });
|
322
302
|
});
|
323
303
|
it("should return empty object if state is null", () => {
|
324
304
|
Flux.state = null;
|
@@ -364,7 +344,7 @@ describe("Flux", () => {
|
|
364
344
|
expect(Flux[optionsKey].name).toEqual("arkhamjsTest");
|
365
345
|
});
|
366
346
|
it("should add windows object for debugging", async () => {
|
367
|
-
await Flux.init(
|
347
|
+
await Flux.init({ ...opts, debug: true });
|
368
348
|
const debugKey = "arkhamjs";
|
369
349
|
expect(window[debugKey]).toEqual(Flux);
|
370
350
|
});
|
@@ -429,7 +409,7 @@ describe("Flux", () => {
|
|
429
409
|
});
|
430
410
|
describe("set defined state", () => {
|
431
411
|
const opts = {
|
432
|
-
state: {second: "value", test: {hello: "world"}},
|
412
|
+
state: { second: "value", test: { hello: "world" } },
|
433
413
|
stores: [helloStore]
|
434
414
|
};
|
435
415
|
it("should set state", async () => {
|
@@ -446,7 +426,7 @@ describe("Flux", () => {
|
|
446
426
|
describe("middleware", () => {
|
447
427
|
const objMiddleware = {
|
448
428
|
name: "objectMiddleware",
|
449
|
-
preDispatch: (action) =>
|
429
|
+
preDispatch: (action) => ({ ...action })
|
450
430
|
};
|
451
431
|
const opts = {
|
452
432
|
middleware: [objMiddleware],
|
@@ -478,20 +458,20 @@ describe("Flux", () => {
|
|
478
458
|
});
|
479
459
|
describe("#on", () => {
|
480
460
|
it("should add a listener", async () => {
|
481
|
-
await Flux.dispatch({type: "test"});
|
461
|
+
await Flux.dispatch({ type: "test" });
|
482
462
|
expect(eventSpy.mock.calls.length).toEqual(1);
|
483
463
|
});
|
484
464
|
});
|
485
465
|
describe("#off", () => {
|
486
466
|
it("should remove a listener", async () => {
|
487
467
|
Flux.off("test", eventSpy);
|
488
|
-
await Flux.dispatch({type: "test"});
|
468
|
+
await Flux.dispatch({ type: "test" });
|
489
469
|
expect(eventSpy.mock.calls.length).toEqual(0);
|
490
470
|
});
|
491
471
|
});
|
492
472
|
});
|
493
473
|
describe("#addStores", () => {
|
494
|
-
const demo = (type, data, state = {helloStore: "joker"}) => {
|
474
|
+
const demo = (type, data, state = { helloStore: "joker" }) => {
|
495
475
|
if (type === "DEMO_TEST") {
|
496
476
|
state.helloStore = data.helloStore;
|
497
477
|
}
|
@@ -507,16 +487,16 @@ describe("Flux", () => {
|
|
507
487
|
Flux.addStores([demo]);
|
508
488
|
const privateProperty = "storeActions";
|
509
489
|
const storeAction = Flux[privateProperty].demo;
|
510
|
-
expect(storeAction.initialState).toEqual({helloStore: "joker"});
|
490
|
+
expect(storeAction.initialState).toEqual({ helloStore: "joker" });
|
511
491
|
});
|
512
492
|
it("should handle unsupported stores", () => {
|
513
493
|
const optionsKey = "options";
|
514
494
|
const setStorageData = new Error("test");
|
515
|
-
Flux[optionsKey].storage = {setStorageData};
|
495
|
+
Flux[optionsKey].storage = { setStorageData };
|
516
496
|
Flux.addStores([demo]);
|
517
497
|
const privateProperty = "storeActions";
|
518
498
|
const storeAction = Flux[privateProperty].demo;
|
519
|
-
expect(storeAction.initialState).toEqual({helloStore: "joker"});
|
499
|
+
expect(storeAction.initialState).toEqual({ helloStore: "joker" });
|
520
500
|
});
|
521
501
|
});
|
522
502
|
describe("#offInit", () => {
|
@@ -609,7 +589,7 @@ describe("Flux", () => {
|
|
609
589
|
Flux.clearMiddleware();
|
610
590
|
const objMiddleware = {
|
611
591
|
name: "objectMiddleware",
|
612
|
-
preDispatch: (action) =>
|
592
|
+
preDispatch: (action) => ({ ...action })
|
613
593
|
};
|
614
594
|
Flux.addMiddleware([objMiddleware]);
|
615
595
|
});
|
@@ -621,8 +601,8 @@ describe("Flux", () => {
|
|
621
601
|
});
|
622
602
|
describe("#removePlugin", () => {
|
623
603
|
it("should remove an existing plugin", () => {
|
624
|
-
Flux.middleware.preDispatchList = [{name: "demoPlugin"}, {name: "noNotRemovePlugin"}];
|
625
|
-
expect(Flux.removePlugin("preDispatch", "demoPlugin")).toEqual([{name: "noNotRemovePlugin"}]);
|
604
|
+
Flux.middleware.preDispatchList = [{ name: "demoPlugin" }, { name: "noNotRemovePlugin" }];
|
605
|
+
expect(Flux.removePlugin("preDispatch", "demoPlugin")).toEqual([{ name: "noNotRemovePlugin" }]);
|
626
606
|
});
|
627
607
|
it("should get an undefined list", () => {
|
628
608
|
Flux.middleware.preDispatchList = null;
|
@@ -649,7 +629,7 @@ describe("Flux", () => {
|
|
649
629
|
it("should handle argument that is not a function", async () => {
|
650
630
|
const optionsKey = "options";
|
651
631
|
const setStorageData = new Error("test");
|
652
|
-
Flux[optionsKey].storage = {setStorageData};
|
632
|
+
Flux[optionsKey].storage = { setStorageData };
|
653
633
|
await expect(Flux.reset()).rejects.toThrowError();
|
654
634
|
});
|
655
635
|
});
|
@@ -668,7 +648,7 @@ describe("Flux", () => {
|
|
668
648
|
const optionsKey = "options";
|
669
649
|
const updateStorageKey = "updateStorage";
|
670
650
|
const updateStorage = jest.fn();
|
671
|
-
Flux[optionsKey] = {storage: {}};
|
651
|
+
Flux[optionsKey] = { storage: {} };
|
672
652
|
Flux[updateStorageKey] = updateStorage;
|
673
653
|
await Flux.setState("helloStore.testUpdate", "test");
|
674
654
|
expect(updateStorage.mock.calls.length).toEqual(1);
|
@@ -679,14 +659,14 @@ describe("Flux", () => {
|
|
679
659
|
const getStorageData = jest.fn();
|
680
660
|
const optionsKey = "options";
|
681
661
|
Flux[optionsKey].state = null;
|
682
|
-
Flux[optionsKey].storage = {getStorageData};
|
662
|
+
Flux[optionsKey].storage = { getStorageData };
|
683
663
|
const useStorageKey = "useStorage";
|
684
664
|
await Flux[useStorageKey]("helloStore");
|
685
665
|
expect(getStorageData.mock.calls.length).toEqual(1);
|
686
666
|
});
|
687
667
|
it("without storage", async () => {
|
688
668
|
const optionsKey = "options";
|
689
|
-
Flux[optionsKey].state = {hello: "world"};
|
669
|
+
Flux[optionsKey].state = { hello: "world" };
|
690
670
|
Flux[optionsKey].storage = null;
|
691
671
|
const useStorageKey = "useStorage";
|
692
672
|
await Flux[useStorageKey]("helloStore");
|
@@ -703,9 +683,9 @@ describe("Flux", () => {
|
|
703
683
|
it("should debounce storage", async () => {
|
704
684
|
const value = "test";
|
705
685
|
const optionsKey = "options";
|
706
|
-
Flux[optionsKey].state = {hello: "world"};
|
686
|
+
Flux[optionsKey].state = { hello: "world" };
|
707
687
|
const setStorageData = jest.fn().mockReturnValue(value);
|
708
|
-
Flux[optionsKey].storage = {setStorageData};
|
688
|
+
Flux[optionsKey].storage = { setStorageData };
|
709
689
|
const debounceMock = import_debounce.default;
|
710
690
|
debounceMock.mockImplementation((fn) => fn());
|
711
691
|
const useStorageKey = "useStorage";
|
@@ -714,4 +694,4 @@ describe("Flux", () => {
|
|
714
694
|
});
|
715
695
|
});
|
716
696
|
});
|
717
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50ZXN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC9kZWJvdW5jZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9mcC9jbG9uZURlZXAnO1xuaW1wb3J0IHNldCBmcm9tICdsb2Rhc2gvZnAvc2V0JztcblxuaW1wb3J0IHtBcmtoYW1Db25zdGFudHN9IGZyb20gJy4uL2NvbnN0YW50cy9BcmtoYW1Db25zdGFudHMnO1xuaW1wb3J0IHtGbHV4RnJhbWV3b3JrfSBmcm9tICcuL0ZsdXgnO1xuaW1wb3J0IHtGbHV4QWN0aW9uLCBGbHV4T3B0aW9ucywgRmx1eFN0b3JlfSBmcm9tICcuL0ZsdXgudHlwZXMnO1xuXG5qZXN0Lm1vY2soJ2xvZGFzaC9kZWJvdW5jZScpO1xuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIGZhbHN5OiBmYWxzZSxcbiAgaXRlbTogJ2RlZmF1bHQnLFxuICB0ZXN0QWN0aW9uOiAnZGVmYXVsdCcsXG4gIHRlc3RVcGRhdGU6ICdkZWZhdWx0JyxcbiAgemVyb1ZhbHVlOiAwXG59O1xuXG5jb25zdCBoZWxsb1N0b3JlID0gKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUgPSBpbml0aWFsU3RhdGUpOiBhbnkgPT4ge1xuICBzd2l0Y2godHlwZSkge1xuICAgIGNhc2UgJ1RFU1RfRVZFTlQnOlxuICAgICAgcmV0dXJuIHNldCgndGVzdEFjdGlvbicsIGRhdGEudGVzdFZhciwgc3RhdGUpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn07XG5cbmRlc2NyaWJlKCdGbHV4JywgKCkgPT4ge1xuICBjb25zdCBjb25zb2xlRXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICBjb25zdCBjb25zb2xlV2FybiA9IGNvbnNvbGUud2FybjtcbiAgY29uc3QgY2ZnOiBGbHV4T3B0aW9ucyA9IHtcbiAgICBuYW1lOiAnYXJraGFtanNUZXN0JyxcbiAgICBzdG9yZXM6IFtoZWxsb1N0b3JlXVxuICB9O1xuICBsZXQgRmx1eDtcblxuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IgPSBqZXN0LmZuKCk7XG4gICAgY29uc29sZS53YXJuID0gamVzdC5mbigpO1xuICB9KTtcblxuICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICBGbHV4ID0gbmV3IEZsdXhGcmFtZXdvcmsoKTtcblxuICAgIC8vIENvbmZpZ3VyZVxuICAgIGF3YWl0IEZsdXguaW5pdChjZmcsIHRydWUpO1xuICB9KTtcblxuICBhZnRlckFsbCgoKSA9PiB7XG4gICAgY29uc29sZS5lcnJvciA9IGNvbnNvbGVFcnJvcjtcbiAgICBjb25zb2xlLndhcm4gPSBjb25zb2xlV2FybjtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNhZGRNaWRkbGV3YXJlJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdzaG91bGQgYXBwbHkgcHJlLWRpc3BhdGNoIG1pZGRsZXdhcmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGVUZXN0OiBzdHJpbmcgPSAnaW50ZXJjZXB0IG9iamVjdCc7XG5cbiAgICAgIC8vIEFkZCBvYmplY3QgbWlkZGxld2FyZVxuICAgICAgY29uc3Qgb2JqTWlkZGxld2FyZSA9IHtcbiAgICAgICAgbmFtZTogJ29iamVjdE1pZGRsZXdhcmUnLFxuICAgICAgICBwcmVEaXNwYXRjaDogKGFjdGlvbikgPT4gKHsuLi5hY3Rpb24sIHRlc3RWYXI6IG1pZGRsZVRlc3R9KVxuICAgICAgfTtcblxuICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgRmx1eC5jbGVhck1pZGRsZXdhcmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFsdGVyIGRhdGEgYmVmb3JlIHNlbmRpbmcgdG8gc3RvcmVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBNZXRob2RcbiAgICAgICAgRmx1eC5hZGRNaWRkbGV3YXJlKFtvYmpNaWRkbGV3YXJlXSk7XG5cbiAgICAgICAgLy8gU2V0IHRlc3QgZGF0YVxuICAgICAgICBGbHV4LnNldFN0YXRlKCdoZWxsb1N0b3JlLnRlc3RBY3Rpb24nLCAnZGVmYXVsdCcpO1xuXG4gICAgICAgIC8vIERpc3BhdGNoIGFuIGFjdGlvblxuICAgICAgICBjb25zdCBwcmVBY3Rpb246IEZsdXhBY3Rpb24gPSBhd2FpdCBGbHV4LmRpc3BhdGNoKHt0ZXN0VmFyOiAnaGVsbG8gd29ybGQnLCB0eXBlOiAnVEVTVF9FVkVOVCd9KTtcblxuICAgICAgICBleHBlY3QoRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0QWN0aW9uJykpLnRvRXF1YWwobWlkZGxlVGVzdCk7XG4gICAgICAgIGV4cGVjdChwcmVBY3Rpb24udGVzdFZhcikudG9FcXVhbChtaWRkbGVUZXN0KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBlcnJvciBmb3IgbWlkZGxld2FyZSB3aXRob3V0IGEgbmFtZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgZm4gPSAoKSA9PiBGbHV4LmFkZE1pZGRsZXdhcmUoW3twcmVEaXNwYXRjaDogb2JqTWlkZGxld2FyZS5wcmVEaXNwYXRjaH1dKTtcbiAgICAgICAgZXhwZWN0KGZuKS50b1Rocm93RXJyb3IoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBlcnJvciBmb3IgaW5jb21wYXRpYmxlIG1pZGRsZXdhcmUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZuID0gKCkgPT4gRmx1eC5hZGRNaWRkbGV3YXJlKFsnaW5jb3JyZWN0J10pO1xuICAgICAgICBleHBlY3QoZm4pLnRvVGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2hvdWxkIGFwcGx5IHByZS1kaXNwYXRjaCBtaWRkbGV3YXJlIGFzIHByb21pc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGVUZXN0OiBzdHJpbmcgPSAnaW50ZXJjZXB0IHByb21pc2UnO1xuXG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgLy8gQWRkIG9iamVjdCBtaWRkbGV3YXJlXG4gICAgICAgIGNvbnN0IHByb21pc2VNaWRkbGV3YXJlID0ge1xuICAgICAgICAgIG5hbWU6ICdwcm9taXNlTWlkZGxld2FyZScsXG4gICAgICAgICAgcHJlRGlzcGF0Y2g6IChhY3Rpb24pID0+IFByb21pc2UucmVzb2x2ZSh7Li4uYWN0aW9uLCB0ZXN0VmFyOiBtaWRkbGVUZXN0fSlcbiAgICAgICAgfTtcblxuICAgICAgICBGbHV4LmFkZE1pZGRsZXdhcmUoW3Byb21pc2VNaWRkbGV3YXJlXSk7XG4gICAgICB9KTtcblxuICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgRmx1eC5jbGVhck1pZGRsZXdhcmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFsdGVyIGRhdGEgYmVmb3JlIHNlbmRpbmcgdG8gc3RvcmVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBTZXQgdGVzdCBkYXRhXG4gICAgICAgIEZsdXguc2V0U3RhdGUoJ2hlbGxvU3RvcmUudGVzdEFjdGlvbicsICdkZWZhdWx0Jyk7XG5cbiAgICAgICAgLy8gRGlzcGF0Y2ggYW4gYWN0aW9uXG4gICAgICAgIGNvbnN0IHByZUFjdGlvbjogRmx1eEFjdGlvbiA9IGF3YWl0IEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICdoZWxsbyB3b3JsZCcsIHR5cGU6ICdURVNUX0VWRU5UJ30pO1xuICAgICAgICBleHBlY3QoRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0QWN0aW9uJykpLnRvRXF1YWwobWlkZGxlVGVzdCk7XG4gICAgICAgIGV4cGVjdChwcmVBY3Rpb24udGVzdFZhcikudG9FcXVhbChtaWRkbGVUZXN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCBhcHBseSBwb3N0IGRpc3BhdGNoIG1pZGRsZXdhcmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGVUZXN0OiBzdHJpbmcgPSAnaW50ZXJjZXB0IHBvc3QnO1xuXG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgLy8gQWRkIG9iamVjdCBtaWRkbGV3YXJlXG4gICAgICAgIGNvbnN0IHBvc3RNaWRkbGV3YXJlID0ge1xuICAgICAgICAgIG5hbWU6ICdwb3N0TWlkZGxld2FyZScsXG4gICAgICAgICAgcG9zdERpc3BhdGNoOiAoYWN0aW9uKSA9PiBQcm9taXNlLnJlc29sdmUoey4uLmFjdGlvbiwgdGVzdFZhcjogbWlkZGxlVGVzdH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgRmx1eC5hZGRNaWRkbGV3YXJlKFtwb3N0TWlkZGxld2FyZV0pO1xuICAgICAgfSk7XG5cbiAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIEZsdXguY2xlYXJNaWRkbGV3YXJlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBhbHRlciBzdG9yZSBkYXRhJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBTZXQgdGVzdCBkYXRhXG4gICAgICAgIEZsdXguc2V0U3RhdGUoJ2hlbGxvU3RvcmUudGVzdEFjdGlvbicsICdkZWZhdWx0Jyk7XG5cbiAgICAgICAgLy8gRGlzcGF0Y2ggYW4gYWN0aW9uXG4gICAgICAgIGNvbnN0IHBvc3RBY3Rpb246IEZsdXhBY3Rpb24gPSBhd2FpdCBGbHV4LmRpc3BhdGNoKHt0ZXN0VmFyOiAnaGVsbG8gd29ybGQnLCB0eXBlOiAnVEVTVF9FVkVOVCd9KTtcblxuICAgICAgICBleHBlY3QoRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0QWN0aW9uJykpLnRvRXF1YWwoJ2hlbGxvIHdvcmxkJyk7XG4gICAgICAgIGV4cGVjdChwb3N0QWN0aW9uLnRlc3RWYXIpLnRvRXF1YWwobWlkZGxlVGVzdCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbm8gYWN0aW9uIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBleHBlY3QoRmx1eC5kaXNwYXRjaChudWxsKSkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBwcmUgZGlzcGF0Y2ggZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZU1pZGRsZXdhcmUgPSB7XG4gICAgICAgICAgbmFtZTogJ2Vycm9yTWlkZGxld2FyZScsXG4gICAgICAgICAgcHJlRGlzcGF0Y2g6ICgpID0+IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigndGVzdCcpKVxuICAgICAgICB9O1xuICAgICAgICBGbHV4LmFkZE1pZGRsZXdhcmUoW3ByZU1pZGRsZXdhcmVdKTtcbiAgICAgICAgYXdhaXQgZXhwZWN0KEZsdXguZGlzcGF0Y2goe3R5cGU6ICd0ZXN0J30pKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIHBvc3QgZGlzcGF0Y2ggZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc3RNaWRkbGV3YXJlID0ge1xuICAgICAgICAgIG5hbWU6ICdlcnJvck1pZGRsZXdhcmUnLFxuICAgICAgICAgIHBvc3REaXNwYXRjaDogKCkgPT4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCd0ZXN0JykpXG4gICAgICAgIH07XG4gICAgICAgIEZsdXguYWRkTWlkZGxld2FyZShbcG9zdE1pZGRsZXdhcmVdKTtcbiAgICAgICAgYXdhaXQgZXhwZWN0KEZsdXguZGlzcGF0Y2goe3R5cGU6ICd0ZXN0J30pKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjYWRkUGx1Z2luJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWRkIGEgcGx1Z2luJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWRkUGx1Z2luS2V5OiBzdHJpbmcgPSAnYWRkUGx1Z2luJztcbiAgICAgIGNvbnN0IHBsdWdpbiA9IHttZXRob2Q6ICgpID0+IHt9LCBuYW1lOiAnZGVtb1BsdWdpbid9O1xuICAgICAgY29uc3QgcmVzdWx0cyA9IEZsdXhbYWRkUGx1Z2luS2V5XSgncHJlRGlzcGF0Y2gnLCBwbHVnaW4pO1xuICAgICAgZXhwZWN0KHJlc3VsdHMpLnRvRXF1YWwoW3BsdWdpbl0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBza2lwIHBsdWdpbiBpZiBhbHJlYWR5IGV4aXN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGFkZFBsdWdpbktleTogc3RyaW5nID0gJ2FkZFBsdWdpbic7XG4gICAgICBjb25zdCBwbHVnaW4gPSB7bWV0aG9kOiAoKSA9PiB7fSwgbmFtZTogJ2RlbW9QbHVnaW4nfTtcbiAgICAgIEZsdXgubWlkZGxld2FyZS5wcmVEaXNwYXRjaExpc3QgPSBbcGx1Z2luXTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBGbHV4W2FkZFBsdWdpbktleV0oJ3ByZURpc3BhdGNoJywgcGx1Z2luKTtcbiAgICAgIGV4cGVjdChyZXN1bHRzKS50b0VxdWFsKFtwbHVnaW5dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVuZGVmaW5lZCBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IGFkZFBsdWdpbktleTogc3RyaW5nID0gJ2FkZFBsdWdpbic7XG4gICAgICBjb25zdCBmbiA9ICgpID0+IEZsdXhbYWRkUGx1Z2luS2V5XSgncHJlRGlzcGF0Y2gnLCB7bWV0aG9kOiAnb2JqZWN0J30pO1xuICAgICAgZXhwZWN0KGZuKS50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNjbGVhckFwcERhdGEnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAvLyBTZXQgdGVzdCBkYXRhXG4gICAgICBGbHV4LnNldFN0YXRlKCdoZWxsb1N0b3JlLml0ZW0nLCAnY2xlYXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVzZXQgdGhlIHN0b3JlIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNZXRob2RcbiAgICAgIGF3YWl0IEZsdXguY2xlYXJBcHBEYXRhKCk7XG5cbiAgICAgIGV4cGVjdChGbHV4LmdldFN0YXRlKFsnaGVsbG9TdG9yZScsICdpdGVtJ10pKS50b0VxdWFsKCdkZWZhdWx0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBkYXRhIGluIHN0b3JhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXRybmVkVmFsdWUgPSB7aGVsbG86ICd3b3JsZCd9O1xuICAgICAgY29uc3Qgc2V0U3RvcmFnZURhdGEgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUocmV0cm5lZFZhbHVlKTtcbiAgICAgIEZsdXgub3B0aW9ucy5zdG9yYWdlID0ge3NldFN0b3JhZ2VEYXRhfTtcblxuICAgICAgLy8gTWV0aG9kXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgRmx1eC5jbGVhckFwcERhdGEoKTtcblxuICAgICAgZXhwZWN0KHNldFN0b3JhZ2VEYXRhLm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgICAgZXhwZWN0KHJlc3VsdHMpLnRvRXF1YWwocmV0cm5lZFZhbHVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNkZXJlZ2lzdGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGEgc3RhdGUgYW5kIHN0b3JlJywgKCkgPT4ge1xuICAgICAgRmx1eC5zdGF0ZSA9IHtoZWxsbzogJ3dvcmxkJ307XG4gICAgICBGbHV4LnN0b3JlQWN0aW9ucyA9IHtoZWxsbzogJ3dvcmxkJ307XG4gICAgICBGbHV4LmRlcmVnaXN0ZXIoJ2hlbGxvJyk7XG4gICAgICBleHBlY3QoRmx1eC5zdGF0ZSkudG9FcXVhbCh7fSk7XG4gICAgICBleHBlY3QoRmx1eC5zdG9yZUFjdGlvbnMpLnRvRXF1YWwoe30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgZW1wdHkgc3RyaW5nIGFzIGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW5hbFN0YXRlID0gY2xvbmVEZWVwKEZsdXguc3RhdGUpO1xuICAgICAgRmx1eC5kZXJlZ2lzdGVyKCk7XG4gICAgICBleHBlY3Qob3JpZ2luYWxTdGF0ZSkudG9FcXVhbChGbHV4LnN0YXRlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNkaXNwYXRjaCcsICgpID0+IHtcbiAgICBsZXQgZXZlbnRTcHk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIC8vIFNweVxuICAgICAgZXZlbnRTcHkgPSBqZXN0LmZuKCk7XG4gICAgICBGbHV4Lm9uKCdURVNUX0VWRU5UJywgZXZlbnRTcHkpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIEZsdXgub2ZmKCdURVNUX0VWRU5UJywgZXZlbnRTcHkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gTWV0aG9kXG4gICAgICBGbHV4LmRpc3BhdGNoKHt0ZXN0VmFyOiAndGVzdCcsIHR5cGU6ICdURVNUX0VWRU5UJ30pO1xuXG4gICAgICBjb25zdCBhY3Rpb246IGFueSA9IGF3YWl0IEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICd0ZXN0JywgdHlwZTogJ1RFU1RfRVZFTlQnfSk7XG4gICAgICBleHBlY3QoYWN0aW9uKS50b0VxdWFsKHt0ZXN0VmFyOiAndGVzdCcsIHR5cGU6ICdURVNUX0VWRU5UJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbHRlciB0aGUgc3RvcmUgZGF0YScsICgpID0+IHtcbiAgICAgIC8vIE1ldGhvZFxuICAgICAgRmx1eC5kaXNwYXRjaCh7dGVzdFZhcjogJ3Rlc3QnLCB0eXBlOiAnVEVTVF9FVkVOVCd9KTtcblxuICAgICAgY29uc3QgaXRlbTogc3RyaW5nID0gRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0QWN0aW9uJyk7XG4gICAgICBleHBlY3QoaXRlbSkudG9FcXVhbCgndGVzdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkaXNwYXRjaCBhbiBldmVudCcsICgpID0+IHtcbiAgICAgIC8vIE1ldGhvZFxuICAgICAgRmx1eC5kaXNwYXRjaCh7dGVzdFZhcjogJ3Rlc3QnLCB0eXBlOiAnVEVTVF9FVkVOVCd9KTtcblxuICAgICAgZXhwZWN0KGV2ZW50U3B5Lm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgZGlzcGF0Y2ggaWYgbm8gdHlwZScsICgpID0+IHtcbiAgICAgIC8vIE1ldGhvZFxuICAgICAgRmx1eC5kaXNwYXRjaCh7dGVzdFZhcjogJ3Rlc3QnfSk7XG5cbiAgICAgIGV4cGVjdChldmVudFNweS5tb2NrLmNhbGxzLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGRpc3BhdGNoIGlmIHNpbGVudCcsICgpID0+IHtcbiAgICAgIC8vIE1ldGhvZFxuICAgICAgRmx1eC5kaXNwYXRjaCh7dGVzdFZhcjogJ3Rlc3QnLCB0eXBlOiAnVEVTVF9FVkVOVCd9LCB0cnVlKTtcblxuICAgICAgZXhwZWN0KGV2ZW50U3B5Lm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1cGRhdGUgc3RvcmFnZScsICgpID0+IHtcbiAgICAgIEZsdXgudXBkYXRlU3RvcmFnZSA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgICBGbHV4Lm9wdGlvbnMuc3RvcmFnZSA9IHt9O1xuXG4gICAgICAvLyBNZXRob2RcbiAgICAgIEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICd0ZXN0JywgdHlwZTogJ1RFU1RfRVZFTlQnfSk7XG5cbiAgICAgIGV4cGVjdChGbHV4LnVwZGF0ZVN0b3JhZ2UubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1cGRhdGVkIHN0YXRlIGlmIGFjdGlvbiByZXR1cm5zIG51bGwnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBBZGQgbnVsbCBzdG9yZVxuICAgICAgY29uc3QgbnVsbFN0b3JlID0gKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUgPSBpbml0aWFsU3RhdGUpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ1RFU1RfTlVMTCc6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgYXdhaXQgRmx1eC5hZGRTdG9yZXMoW251bGxTdG9yZV0pO1xuXG4gICAgICAvLyBNZXRob2RcbiAgICAgIGF3YWl0IEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICd0ZXN0JywgdHlwZTogJ1RFU1RfTlVMTCd9KTtcblxuICAgICAgZXhwZWN0KEZsdXguc3RhdGUubnVsbFN0b3JlKS50b0VxdWFsKGluaXRpYWxTdGF0ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbXB0eSBvYmplY3QgaWYgc3RvcmUgcmV0dXJucyBudWxsIGJ5IGRlZmF1bHQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBBZGQgbnVsbCBzdG9yZVxuICAgICAgY29uc3QgbnVsbFN0b3JlID0gKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ1RFU1RfTlVMTCc6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgYXdhaXQgRmx1eC5hZGRTdG9yZXMoW251bGxTdG9yZV0pO1xuICAgICAgRmx1eC5zdGF0ZS5udWxsU3RvcmUgPSBudWxsO1xuXG4gICAgICAvLyBNZXRob2RcbiAgICAgIGF3YWl0IEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICd0ZXN0JywgdHlwZTogJ1RFU1RfTlVMTCd9KTtcblxuICAgICAgZXhwZWN0KEZsdXguc3RhdGUubnVsbFN0b3JlKS50b0VxdWFsKHt9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNnZXRPcHRpb25zJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ2V0IGEgb3B0aW9ucyBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0gRmx1eC5nZXRPcHRpb25zKCk7XG4gICAgICBjb25zdCBvcHRpb25zS2V5OiBzdHJpbmcgPSAnb3B0aW9ucyc7XG4gICAgICBleHBlY3Qob3B0aW9ucykudG9FcXVhbChGbHV4W29wdGlvbnNLZXldKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNnZXRTdGF0ZScsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlQWN0aW9uID0gRmx1eC5nZXRTdG9yZSgnaGVsbG9TdG9yZScpO1xuICAgICAgRmx1eC5zZXRTdGF0ZSgnaGVsbG9TdG9yZScsIHN0b3JlQWN0aW9uLmluaXRpYWxTdGF0ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBhIGdsb2JhbCBzdG9yZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRmx1eC5nZXRTdGF0ZSgpO1xuICAgICAgZXhwZWN0KHZhbHVlLmhlbGxvU3RvcmUuaXRlbSkudG9FcXVhbCgnZGVmYXVsdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYSBzcGVjaWZpYyBzdG9yZSByZXR1cm5pbmcgYW4gb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBGbHV4LmdldFN0YXRlKCdoZWxsb1N0b3JlJyk7XG4gICAgICBleHBlY3QodmFsdWUuaXRlbSkudG9FcXVhbCgnZGVmYXVsdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYSBzcGVjaWZpYyBpdGVtIHdpdGhpbiBhIHN0b3JlIHVzaW5nIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyA9IEZsdXguZ2V0U3RhdGUoWydoZWxsb1N0b3JlJywgJ2l0ZW0nXSk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJ2RlZmF1bHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IGEgc3BlY2lmaWMgaXRlbSB3aXRoaW4gYSBzdG9yZSB1c2luZyBkb3Qgbm90YXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZTogc3RyaW5nID0gRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS5pdGVtJyk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJ2RlZmF1bHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGRlZmF1bHQgdmFsdWUgZnJvbSBhIG51bGwgaXRlbScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBGbHV4LmdldFN0YXRlKCdoZWxsb1N0b3JlLm5vdERlZmF1bHQnLCAnJyk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW50aXJlIHN0b3JlIG9iamVjdCB3aXRoIGVtcHR5IGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBGbHV4LmdldFN0YXRlKCcnKTtcbiAgICAgIGV4cGVjdCh2YWx1ZSkudG9FcXVhbCh7aGVsbG9TdG9yZTogaW5pdGlhbFN0YXRlfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbnRpcmUgc3RvcmUgb2JqZWN0IHdpdGggbnVsbCBrZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZTogc3RyaW5nID0gRmx1eC5nZXRTdGF0ZShudWxsKTtcbiAgICAgIGV4cGVjdCh2YWx1ZSkudG9FcXVhbCh7aGVsbG9TdG9yZTogaW5pdGlhbFN0YXRlfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbnRpcmUgc3RvcmUgb2JqZWN0IHdpdGggdW5kZWZpbmVkIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBGbHV4LmdldFN0YXRlKCk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoe2hlbGxvU3RvcmU6IGluaXRpYWxTdGF0ZX0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW1wdHkgb2JqZWN0IGlmIHN0YXRlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBGbHV4LnN0YXRlID0gbnVsbDtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBGbHV4LmdldFN0YXRlKCk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoe30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBmYWxzZSB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS5mYWxzeScpO1xuICAgICAgZXhwZWN0KHZhbHVlKS50b0VxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgemVybyB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS56ZXJvVmFsdWUnKTtcbiAgICAgIGV4cGVjdCh2YWx1ZSkudG9FcXVhbCgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNnZXRTdG9yZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdldCBhIHN0b3JlIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVBY3Rpb24gPSBGbHV4LmdldFN0b3JlKCdoZWxsb1N0b3JlJyk7XG4gICAgICBleHBlY3Qoc3RvcmVBY3Rpb24ubmFtZSkudG9FcXVhbCgnaGVsbG9TdG9yZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgZW1wdHkgc3RyaW5nIGFzIGRlZmF1bHQgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZUFjdGlvbiA9IEZsdXguZ2V0U3RvcmUoKTtcbiAgICAgIGV4cGVjdChzdG9yZUFjdGlvbikudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnI2luaXQnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ3NldCBhcHAgbmFtZScsICgpID0+IHtcbiAgICAgIC8vIFZhcnNcbiAgICAgIGNvbnN0IG9wdHM6IEZsdXhPcHRpb25zID0ge1xuICAgICAgICBuYW1lOiAnZGVtbydcbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgdXBkYXRlIGFwcCBuYW1lIGlmIGluaXRpYWxpemluZyBmb3IgdGhlIGZpcnN0IHRpbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByaXZhdGVJbml0OiBzdHJpbmcgPSAnaXNJbml0JztcbiAgICAgICAgRmx1eFtwcml2YXRlSW5pdF0gPSBmYWxzZTtcblxuICAgICAgICAvLyBNZXRob2RcbiAgICAgICAgYXdhaXQgRmx1eC5pbml0KG9wdHMpO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgICAgZXhwZWN0KEZsdXhbb3B0aW9uc0tleV0ubmFtZSkudG9FcXVhbCgnZGVtbycpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IHVwZGF0ZSBhcHAgbmFtZSBpZiBpbml0aWFsaXppbmcgYWdhaW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByaXZhdGVJbml0OiBzdHJpbmcgPSAnaXNJbml0JztcbiAgICAgICAgRmx1eFtwcml2YXRlSW5pdF0gPSB0cnVlO1xuXG4gICAgICAgIC8vIE1ldGhvZFxuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cyk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc0tleTogc3RyaW5nID0gJ29wdGlvbnMnO1xuICAgICAgICBleHBlY3QoRmx1eFtvcHRpb25zS2V5XS5uYW1lKS50b0VxdWFsKCdhcmtoYW1qc1Rlc3QnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFkZCB3aW5kb3dzIG9iamVjdCBmb3IgZGVidWdnaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBNZXRob2RcbiAgICAgICAgYXdhaXQgRmx1eC5pbml0KHsuLi5vcHRzLCBkZWJ1ZzogdHJ1ZX0pO1xuXG4gICAgICAgIGNvbnN0IGRlYnVnS2V5OiBzdHJpbmcgPSAnYXJraGFtanMnO1xuICAgICAgICBleHBlY3Qod2luZG93W2RlYnVnS2V5XSkudG9FcXVhbChGbHV4KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHVzZSBkZWZhdWx0IG9iamVjdCBpZiB1bmRlZmluZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIE1ldGhvZFxuICAgICAgICBhd2FpdCBGbHV4LnJlc2V0KCk7XG4gICAgICAgIGF3YWl0IEZsdXguaW5pdCgpO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRPcHRpb25zID0ge1xuICAgICAgICAgIG5hbWU6ICdhcmtoYW1qcycsXG4gICAgICAgICAgcm91dGVyVHlwZTogJ2Jyb3dzZXInLFxuICAgICAgICAgIHNjcm9sbFRvVG9wOiB0cnVlLFxuICAgICAgICAgIHN0YXRlOiBudWxsLFxuICAgICAgICAgIHN0b3JhZ2U6IG51bGwsXG4gICAgICAgICAgc3RvcmFnZVdhaXQ6IDMwMCxcbiAgICAgICAgICBzdG9yZXM6IFtdLFxuICAgICAgICAgIHRpdGxlOiAnQXJraGFtSlMnXG4gICAgICAgIH07XG4gICAgICAgIGV4cGVjdChGbHV4W29wdGlvbnNLZXldKS50b0VxdWFsKGV4cGVjdGVkT3B0aW9ucyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZXQgYXBwIG5hbWUgZm9yIGluaXRpYWxpemVkIGFwcCcsICgpID0+IHtcbiAgICAgIC8vIFZhcnNcbiAgICAgIGNvbnN0IG9wdHM6IEZsdXhPcHRpb25zID0ge1xuICAgICAgICBuYW1lOiAnZGVtbydcbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IGFwcCBuYW1lJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVQcm9wZXJ0eTogc3RyaW5nID0gJ29wdGlvbnMnO1xuICAgICAgICBleHBlY3QoRmx1eFtwcml2YXRlUHJvcGVydHldLm5hbWUpLnRvRXF1YWwoJ2RlbW8nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldCBpbml0aWFsIGVtcHR5IHN0YXRlJywgKCkgPT4ge1xuICAgICAgLy8gVmFyc1xuICAgICAgY29uc3Qgb3B0czogRmx1eE9wdGlvbnMgPSB7XG4gICAgICAgIHN0YXRlOiB7fSxcbiAgICAgICAgc3RvcmVzOiBbaGVsbG9TdG9yZV1cbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IHN0YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVQcm9wZXJ0eTogc3RyaW5nID0gJ3N0YXRlJztcbiAgICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKEZsdXhbcHJpdmF0ZVByb3BlcnR5XSkubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IHN0YXRlIGJyYW5jaCBmb3Igc3RvcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IEZsdXguaW5pdChvcHRzLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RhdGUnO1xuICAgICAgICBleHBlY3QoRmx1eFtwcml2YXRlUHJvcGVydHldLmhlbGxvU3RvcmUuaXRlbSkudG9FcXVhbCgnZGVmYXVsdCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2V0IG51bGwgc3RhdGUnLCAoKSA9PiB7XG4gICAgICAvLyBWYXJzXG4gICAgICBjb25zdCBvcHRzOiBGbHV4T3B0aW9ucyA9IHtcbiAgICAgICAgc3RhdGU6IG51bGwsXG4gICAgICAgIHN0b3JlczogW2hlbGxvU3RvcmVdXG4gICAgICB9O1xuXG4gICAgICBpdCgnc2hvdWxkIHNldCBzdGF0ZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgRmx1eC5pbml0KG9wdHMsIHRydWUpO1xuICAgICAgICBjb25zdCBwcml2YXRlUHJvcGVydHk6IHN0cmluZyA9ICdzdGF0ZSc7XG4gICAgICAgIGV4cGVjdChPYmplY3Qua2V5cyhGbHV4W3ByaXZhdGVQcm9wZXJ0eV0pLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHNldCBzdGF0ZSBicmFuY2ggZm9yIHN0b3JlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVQcm9wZXJ0eTogc3RyaW5nID0gJ3N0YXRlJztcbiAgICAgICAgZXhwZWN0KEZsdXhbcHJpdmF0ZVByb3BlcnR5XS5oZWxsb1N0b3JlLml0ZW0pLnRvRXF1YWwoJ2RlZmF1bHQnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldCBkZWZpbmVkIHN0YXRlJywgKCkgPT4ge1xuICAgICAgLy8gVmFyc1xuICAgICAgY29uc3Qgb3B0czogRmx1eE9wdGlvbnMgPSB7XG4gICAgICAgIHN0YXRlOiB7c2Vjb25kOiAndmFsdWUnLCB0ZXN0OiB7aGVsbG86ICd3b3JsZCd9fSxcbiAgICAgICAgc3RvcmVzOiBbaGVsbG9TdG9yZV1cbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IHN0YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVQcm9wZXJ0eTogc3RyaW5nID0gJ3N0YXRlJztcbiAgICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKEZsdXhbcHJpdmF0ZVByb3BlcnR5XSkubGVuZ3RoKS50b0VxdWFsKDMpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IHN0YXRlIGJyYW5jaCBmb3Igc3RvcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IEZsdXguaW5pdChvcHRzLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RhdGUnO1xuICAgICAgICBleHBlY3QoRmx1eFtwcml2YXRlUHJvcGVydHldLnRlc3QuaGVsbG8pLnRvRXF1YWwoJ3dvcmxkJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdtaWRkbGV3YXJlJywgKCkgPT4ge1xuICAgICAgLy8gTWlkZGxld2FyZSBvYmplY3RcbiAgICAgIGNvbnN0IG9iak1pZGRsZXdhcmUgPSB7XG4gICAgICAgIG5hbWU6ICdvYmplY3RNaWRkbGV3YXJlJyxcbiAgICAgICAgcHJlRGlzcGF0Y2g6IChhY3Rpb24pID0+ICh7Li4uYWN0aW9ufSlcbiAgICAgIH07XG5cbiAgICAgIC8vIFZhcnNcbiAgICAgIGNvbnN0IG9wdHM6IEZsdXhPcHRpb25zID0ge1xuICAgICAgICBtaWRkbGV3YXJlOiBbb2JqTWlkZGxld2FyZV0sXG4gICAgICAgIG5hbWU6ICdkZW1vJyxcbiAgICAgICAgc3RvcmVzOiBbaGVsbG9TdG9yZV1cbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgYWRkIG1pZGRsZXdhcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IEZsdXguaW5pdChvcHRzLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnbWlkZGxld2FyZSc7XG4gICAgICAgIGV4cGVjdChGbHV4W3ByaXZhdGVQcm9wZXJ0eV0ucHJlRGlzcGF0Y2hMaXN0WzBdLm5hbWUpLnRvRXF1YWwoJ29iamVjdE1pZGRsZXdhcmUnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Vycm9yIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgdXNlU3RvcmFnZSBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgRmx1eC51c2VTdG9yYWdlID0gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCd0ZXN0JykpO1xuICAgICAgICBhd2FpdCBleHBlY3QoRmx1eC5pbml0KGNmZywgdHJ1ZSkpLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgYWRkU3RvcmVzIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBGbHV4LmFkZFN0b3JlcyA9IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigndGVzdCcpKTtcbiAgICAgICAgYXdhaXQgZXhwZWN0KEZsdXguaW5pdChjZmcsIHRydWUpKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdldmVudCBsaXN0ZW5lcnMnLCAoKSA9PiB7XG4gICAgbGV0IGV2ZW50U3B5O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBldmVudFNweSA9IGplc3QuZm4oKTtcbiAgICAgIEZsdXgub24oJ3Rlc3QnLCBldmVudFNweSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnI29uJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBhZGQgYSBsaXN0ZW5lcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgRmx1eC5kaXNwYXRjaCh7dHlwZTogJ3Rlc3QnfSk7XG4gICAgICAgIGV4cGVjdChldmVudFNweS5tb2NrLmNhbGxzLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJyNvZmYnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHJlbW92ZSBhIGxpc3RlbmVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBGbHV4Lm9mZigndGVzdCcsIGV2ZW50U3B5KTtcbiAgICAgICAgYXdhaXQgRmx1eC5kaXNwYXRjaCh7dHlwZTogJ3Rlc3QnfSk7XG5cbiAgICAgICAgZXhwZWN0KGV2ZW50U3B5Lm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjYWRkU3RvcmVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGRlbW8gPSAodHlwZSwgZGF0YSwgc3RhdGUgPSB7aGVsbG9TdG9yZTogJ2pva2VyJ30pID0+IHtcbiAgICAgIGlmKHR5cGUgPT09ICdERU1PX1RFU1QnKSB7XG4gICAgICAgIHN0YXRlLmhlbGxvU3RvcmUgPSBkYXRhLmhlbGxvU3RvcmU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9O1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgYW5kIHNhdmUgYSBTdG9yZSBjbGFzcycsICgpID0+IHtcbiAgICAgIEZsdXguYWRkU3RvcmVzKFtkZW1vXSk7XG4gICAgICBjb25zdCBwcml2YXRlUHJvcGVydHk6IHN0cmluZyA9ICdzdG9yZUFjdGlvbnMnO1xuICAgICAgY29uc3Qgc3RvcmVBY3Rpb246IEZsdXhTdG9yZSA9IEZsdXhbcHJpdmF0ZVByb3BlcnR5XS5kZW1vO1xuICAgICAgZXhwZWN0KHN0b3JlQWN0aW9uLm5hbWUpLnRvRXF1YWwoJ2RlbW8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGluaXRpYWwgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBGbHV4LmFkZFN0b3JlcyhbZGVtb10pO1xuICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RvcmVBY3Rpb25zJztcbiAgICAgIGNvbnN0IHN0b3JlQWN0aW9uOiBGbHV4U3RvcmUgPSBGbHV4W3ByaXZhdGVQcm9wZXJ0eV0uZGVtbztcbiAgICAgIGV4cGVjdChzdG9yZUFjdGlvbi5pbml0aWFsU3RhdGUpLnRvRXF1YWwoe2hlbGxvU3RvcmU6ICdqb2tlcid9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVuc3VwcG9ydGVkIHN0b3JlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgIGNvbnN0IHNldFN0b3JhZ2VEYXRhID0gbmV3IEVycm9yKCd0ZXN0Jyk7XG4gICAgICBGbHV4W29wdGlvbnNLZXldLnN0b3JhZ2UgPSB7c2V0U3RvcmFnZURhdGF9O1xuXG4gICAgICBGbHV4LmFkZFN0b3JlcyhbZGVtb10pO1xuICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RvcmVBY3Rpb25zJztcbiAgICAgIGNvbnN0IHN0b3JlQWN0aW9uOiBGbHV4U3RvcmUgPSBGbHV4W3ByaXZhdGVQcm9wZXJ0eV0uZGVtbztcbiAgICAgIGV4cGVjdChzdG9yZUFjdGlvbi5pbml0aWFsU3RhdGUpLnRvRXF1YWwoe2hlbGxvU3RvcmU6ICdqb2tlcid9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNvZmZJbml0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGxpc3RlbmVyIGFmdGVyIGluaXRpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBqZXN0LmZuKCk7XG4gICAgICBGbHV4Lm9mZiA9IGplc3QuZm4oKTtcbiAgICAgIEZsdXgub2ZmSW5pdChsaXN0ZW5lcik7XG4gICAgICBleHBlY3QoRmx1eC5vZmYubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoRmx1eC5vZmYubW9jay5jYWxsc1swXVswXSkudG9FcXVhbChBcmtoYW1Db25zdGFudHMuSU5JVCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjb25Jbml0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWRkIGxpc3RlbmVyIGFmdGVyIGluaXRpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBqZXN0LmZuKCk7XG4gICAgICBGbHV4LmlzSW5pdCA9IGZhbHNlO1xuICAgICAgRmx1eC5vbiA9IGplc3QuZm4oKTtcbiAgICAgIEZsdXgub25Jbml0KGxpc3RlbmVyKTtcbiAgICAgIGV4cGVjdChGbHV4Lm9uLm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgICAgZXhwZWN0KEZsdXgub24ubW9jay5jYWxsc1swXVswXSkudG9FcXVhbChBcmtoYW1Db25zdGFudHMuSU5JVCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRpc3BhdGNoIGluc3RhbnRseSBpZiBhbHJlYWR5IGluaXRpYWxpemVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBqZXN0LmZuKCk7XG4gICAgICBGbHV4LmlzSW5pdCA9IHRydWU7XG4gICAgICBGbHV4Lm9uSW5pdChsaXN0ZW5lcik7XG4gICAgICBleHBlY3QobGlzdGVuZXIubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjcmVnaXN0ZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZWdpc3RlciBhIHN0b3JlIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVtb1N0b3JlID0gKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUgPSBpbml0aWFsU3RhdGUpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ1RFU1RfRVZFTlQnOlxuICAgICAgICAgICAgcmV0dXJuIHNldCgndGVzdEFjdGlvbicsIGRhdGEudGVzdFZhciwgc3RhdGUpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlZ2lzdGVyS2V5OiBzdHJpbmcgPSAncmVnaXN0ZXInO1xuICAgICAgY29uc3Qgc3RvcmVBY3Rpb24gPSBGbHV4W3JlZ2lzdGVyS2V5XShkZW1vU3RvcmUpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogZGVtb1N0b3JlLFxuICAgICAgICBpbml0aWFsU3RhdGUsXG4gICAgICAgIG5hbWU6ICdkZW1vU3RvcmUnXG4gICAgICB9O1xuICAgICAgZXhwZWN0KHN0b3JlQWN0aW9uKS50b0VxdWFsKGV4cGVjdGVkQWN0aW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVnaXN0ZXIgYSBzdG9yZSBmdW5jdGlvbiB3aXRob3V0IGFuIGluaXRpYWwgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZW1vU3RvcmUgPSAodHlwZTogc3RyaW5nLCBkYXRhLCBzdGF0ZSk6IGFueSA9PiB7XG4gICAgICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgICAgY2FzZSAnVEVTVF9FVkVOVCc6XG4gICAgICAgICAgICByZXR1cm4gc2V0KCd0ZXN0QWN0aW9uJywgZGF0YS50ZXN0VmFyLCBzdGF0ZSk7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVnaXN0ZXJLZXk6IHN0cmluZyA9ICdyZWdpc3Rlcic7XG4gICAgICBjb25zdCBzdG9yZUFjdGlvbiA9IEZsdXhbcmVnaXN0ZXJLZXldKGRlbW9TdG9yZSk7XG4gICAgICBjb25zdCBleHBlY3RlZEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiBkZW1vU3RvcmUsXG4gICAgICAgIGluaXRpYWxTdGF0ZTogdW5kZWZpbmVkLFxuICAgICAgICBuYW1lOiAnZGVtb1N0b3JlJ1xuICAgICAgfTtcbiAgICAgIGV4cGVjdChzdG9yZUFjdGlvbikudG9FcXVhbChleHBlY3RlZEFjdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBzYXZlIGEgc3RvcmUgZnVuY3Rpb24gd2l0aG91dCBhIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcktleTogc3RyaW5nID0gJ3JlZ2lzdGVyJztcbiAgICAgIGNvbnN0IHN0b3JlQWN0aW9uID0gRmx1eFtyZWdpc3RlcktleV0oKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUgPSBpbml0aWFsU3RhdGUpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ1RFU1RfRVZFTlQnOlxuICAgICAgICAgICAgcmV0dXJuIHNldCgndGVzdEFjdGlvbicsIGRhdGEudGVzdFZhciwgc3RhdGUpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHN0b3JlQWN0aW9uKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB1bmRlZmluZWQgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcktleTogc3RyaW5nID0gJ3JlZ2lzdGVyJztcblxuICAgICAgY29uc3QgZm4gPSAoKSA9PiBGbHV4W3JlZ2lzdGVyS2V5XSgpO1xuICAgICAgZXhwZWN0KGZuKS50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGFyZ3VtZW50IHRoYXQgaXMgbm90IGEgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcktleTogc3RyaW5nID0gJ3JlZ2lzdGVyJztcblxuICAgICAgY29uc3QgZm4gPSAoKSA9PiBGbHV4W3JlZ2lzdGVyS2V5XSh7fSk7XG4gICAgICBleHBlY3QoZm4pLnRvVGhyb3dFcnJvcigpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnI3JlbW92ZU1pZGRsZXdhcmUnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBGbHV4LmNsZWFyTWlkZGxld2FyZSgpO1xuXG4gICAgICAvLyBBZGQgb2JqZWN0IG1pZGRsZXdhcmVcbiAgICAgIGNvbnN0IG9iak1pZGRsZXdhcmUgPSB7XG4gICAgICAgIG5hbWU6ICdvYmplY3RNaWRkbGV3YXJlJyxcbiAgICAgICAgcHJlRGlzcGF0Y2g6IChhY3Rpb24pID0+ICh7Li4uYWN0aW9ufSlcbiAgICAgIH07XG5cbiAgICAgIEZsdXguYWRkTWlkZGxld2FyZShbb2JqTWlkZGxld2FyZV0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbHRlciBkYXRhIGJlZm9yZSBzZW5kaW5nIHRvIHN0b3JlcycsICgpID0+IHtcbiAgICAgIEZsdXgucmVtb3ZlTWlkZGxld2FyZShbJ29iamVjdE1pZGRsZXdhcmUnXSk7XG4gICAgICBjb25zdCBwcml2YXRlUHJvcGVydHk6IHN0cmluZyA9ICdtaWRkbGV3YXJlJztcbiAgICAgIGV4cGVjdChGbHV4W3ByaXZhdGVQcm9wZXJ0eV0ucHJlRGlzcGF0Y2hMaXN0Lmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNyZW1vdmVQbHVnaW4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgYW4gZXhpc3RpbmcgcGx1Z2luJywgKCkgPT4ge1xuICAgICAgRmx1eC5taWRkbGV3YXJlLnByZURpc3BhdGNoTGlzdCA9IFt7bmFtZTogJ2RlbW9QbHVnaW4nfSwge25hbWU6ICdub05vdFJlbW92ZVBsdWdpbid9XTtcbiAgICAgIGV4cGVjdChGbHV4LnJlbW92ZVBsdWdpbigncHJlRGlzcGF0Y2gnLCAnZGVtb1BsdWdpbicpKS50b0VxdWFsKFt7bmFtZTogJ25vTm90UmVtb3ZlUGx1Z2luJ31dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IGFuIHVuZGVmaW5lZCBsaXN0JywgKCkgPT4ge1xuICAgICAgRmx1eC5taWRkbGV3YXJlLnByZURpc3BhdGNoTGlzdCA9IG51bGw7XG4gICAgICBleHBlY3QoRmx1eC5yZW1vdmVQbHVnaW4oJ3ByZURpc3BhdGNoJywgJ2RlbW9QbHVnaW4nKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjcmVtb3ZlU3RvcmVzJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgLy8gTWV0aG9kXG4gICAgICBGbHV4LnJlbW92ZVN0b3JlcyhbJ2hlbGxvU3RvcmUnXSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgRmx1eC5hZGRTdG9yZXMoW2hlbGxvU3RvcmVdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGNsYXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RvcmVBY3Rpb25zJztcbiAgICAgIGV4cGVjdCghIUZsdXhbcHJpdmF0ZVByb3BlcnR5XS5oZWxsb1N0b3JlKS50b0VxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVtb3ZlIHN0b3JlIGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcml2YXRlUHJvcGVydHk6IHN0cmluZyA9ICdzdGF0ZSc7XG4gICAgICBleHBlY3QoISFGbHV4W3ByaXZhdGVQcm9wZXJ0eV0uaGVsbG9TdG9yZSkudG9FcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjcmVzZXQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYXJndW1lbnQgdGhhdCBpcyBub3QgYSBmdW5jdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgIGNvbnN0IHNldFN0b3JhZ2VEYXRhID0gbmV3IEVycm9yKCd0ZXN0Jyk7XG4gICAgICBGbHV4W29wdGlvbnNLZXldLnN0b3JhZ2UgPSB7c2V0U3RvcmFnZURhdGF9O1xuICAgICAgYXdhaXQgZXhwZWN0KEZsdXgucmVzZXQoKSkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNzZXRTdGF0ZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHVwZGF0ZSB0aGUgcHJvcGVydHkgd2l0aGluIHRoZSBzdG9yZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IEZsdXguc2V0U3RhdGUoJ2hlbGxvU3RvcmUudGVzdFVwZGF0ZScsICd0ZXN0Jyk7XG4gICAgICBjb25zdCBuZXdJdGVtID0gYXdhaXQgRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0VXBkYXRlJyk7XG4gICAgICBleHBlY3QobmV3SXRlbSkudG9FcXVhbCgndGVzdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbXB0eSBzdHJpbmcgYXMgZGVmYXVsdCBwYXRoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgRmx1eC5zZXRTdGF0ZSh1bmRlZmluZWQsICd0ZXN0Jyk7XG4gICAgICBjb25zdCBuZXdJdGVtID0gYXdhaXQgRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZScpO1xuICAgICAgZXhwZWN0KG5ld0l0ZW0pLnRvRXF1YWwoaW5pdGlhbFN0YXRlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXBkYXRlIHN0b3JhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zS2V5OiBzdHJpbmcgPSAnb3B0aW9ucyc7XG4gICAgICBjb25zdCB1cGRhdGVTdG9yYWdlS2V5OiBzdHJpbmcgPSAndXBkYXRlU3RvcmFnZSc7XG4gICAgICBjb25zdCB1cGRhdGVTdG9yYWdlID0gamVzdC5mbigpO1xuICAgICAgRmx1eFtvcHRpb25zS2V5XSA9IHtzdG9yYWdlOiB7fX07XG4gICAgICBGbHV4W3VwZGF0ZVN0b3JhZ2VLZXldID0gdXBkYXRlU3RvcmFnZTtcbiAgICAgIGF3YWl0IEZsdXguc2V0U3RhdGUoJ2hlbGxvU3RvcmUudGVzdFVwZGF0ZScsICd0ZXN0Jyk7XG4gICAgICBleHBlY3QodXBkYXRlU3RvcmFnZS5tb2NrLmNhbGxzLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyN1c2VTdG9yYWdlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdXBkYXRlIHN0b3JhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBnZXRTdG9yYWdlRGF0YSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgIEZsdXhbb3B0aW9uc0tleV0uc3RhdGUgPSBudWxsO1xuICAgICAgRmx1eFtvcHRpb25zS2V5XS5zdG9yYWdlID0ge2dldFN0b3JhZ2VEYXRhfTtcblxuICAgICAgY29uc3QgdXNlU3RvcmFnZUtleTogc3RyaW5nID0gJ3VzZVN0b3JhZ2UnO1xuICAgICAgYXdhaXQgRmx1eFt1c2VTdG9yYWdlS2V5XSgnaGVsbG9TdG9yZScpO1xuXG4gICAgICBleHBlY3QoZ2V0U3RvcmFnZURhdGEubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2l0aG91dCBzdG9yYWdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uc0tleTogc3RyaW5nID0gJ29wdGlvbnMnO1xuICAgICAgRmx1eFtvcHRpb25zS2V5XS5zdGF0ZSA9IHtoZWxsbzogJ3dvcmxkJ307XG4gICAgICBGbHV4W29wdGlvbnNLZXldLnN0b3JhZ2UgPSBudWxsO1xuXG4gICAgICBjb25zdCB1c2VTdG9yYWdlS2V5OiBzdHJpbmcgPSAndXNlU3RvcmFnZSc7XG4gICAgICBhd2FpdCBGbHV4W3VzZVN0b3JhZ2VLZXldKCdoZWxsb1N0b3JlJyk7XG5cbiAgICAgIGNvbnN0IHN0YXRlS2V5OiBzdHJpbmcgPSAnc3RhdGUnO1xuICAgICAgZXhwZWN0KEZsdXhbc3RhdGVLZXldLmhlbGxvKS50b0VxdWFsKCd3b3JsZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc3RvcmFnZSBlcnJvcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zS2V5OiBzdHJpbmcgPSAnb3B0aW9ucyc7XG4gICAgICBGbHV4W29wdGlvbnNLZXldLnN0YXRlID0gbnVsbDtcbiAgICAgIEZsdXhbb3B0aW9uc0tleV0uc3RvcmFnZSA9IG5ldyBFcnJvcigndGVzdCcpO1xuXG4gICAgICBjb25zdCB1c2VTdG9yYWdlS2V5OiBzdHJpbmcgPSAndXNlU3RvcmFnZSc7XG4gICAgICBhd2FpdCBleHBlY3QoRmx1eFt1c2VTdG9yYWdlS2V5XSgnaGVsbG9TdG9yZScpKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWJvdW5jZSBzdG9yYWdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyA9ICd0ZXN0JztcbiAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgIEZsdXhbb3B0aW9uc0tleV0uc3RhdGUgPSB7aGVsbG86ICd3b3JsZCd9O1xuXG4gICAgICBjb25zdCBzZXRTdG9yYWdlRGF0YSA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUodmFsdWUpO1xuICAgICAgRmx1eFtvcHRpb25zS2V5XS5zdG9yYWdlID0ge3NldFN0b3JhZ2VEYXRhfTtcblxuICAgICAgY29uc3QgZGVib3VuY2VNb2NrOiBhbnkgPSBkZWJvdW5jZTtcbiAgICAgIGRlYm91bmNlTW9jay5tb2NrSW1wbGVtZW50YXRpb24oKGZuKSA9PiBmbigpKTtcblxuICAgICAgY29uc3QgdXNlU3RvcmFnZUtleTogc3RyaW5nID0gJ3VzZVN0b3JhZ2UnO1xuICAgICAgYXdhaXQgRmx1eFt1c2VTdG9yYWdlS2V5XSgnaGVsbG9TdG9yZScpO1xuXG4gICAgICBleHBlY3Qoc2V0U3RvcmFnZURhdGEubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlBLHNCQUFxQjtBQUNyQix1QkFBc0I7QUFDdEIsaUJBQWdCO0FBRWhCLDZCQUE4QjtBQUM5QixrQkFBNEI7QUFHNUIsS0FBSyxLQUFLO0FBRVYsTUFBTSxlQUFlO0FBQUEsRUFDbkIsT0FBTztBQUFBLEVBQ1AsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBO0FBR2IsTUFBTSxhQUFhLENBQUMsTUFBYyxNQUFNLFFBQVEsaUJBQXNCO0FBQ3BFLFVBQU87QUFBQSxTQUNBO0FBQ0gsYUFBTyx3QkFBSSxjQUFjLEtBQUssU0FBUztBQUFBO0FBRXZDLGFBQU87QUFBQTtBQUFBO0FBSWIsU0FBUyxRQUFRLE1BQU07QUFDckIsUUFBTSxlQUFlLFFBQVE7QUFDN0IsUUFBTSxjQUFjLFFBQVE7QUFDNUIsUUFBTSxNQUFtQjtBQUFBLElBQ3ZCLE1BQU07QUFBQSxJQUNOLFFBQVEsQ0FBQztBQUFBO0FBRVgsTUFBSTtBQUVKLFlBQVUsTUFBTTtBQUNkLFlBQVEsUUFBUSxLQUFLO0FBQ3JCLFlBQVEsT0FBTyxLQUFLO0FBQUE7QUFHdEIsYUFBVyxZQUFZO0FBQ3JCLFdBQU8sSUFBSTtBQUdYLFVBQU0sS0FBSyxLQUFLLEtBQUs7QUFBQTtBQUd2QixXQUFTLE1BQU07QUFDYixZQUFRLFFBQVE7QUFDaEIsWUFBUSxPQUFPO0FBQUE7QUFHakIsV0FBUyxrQkFBa0IsTUFBTTtBQUMvQixhQUFTLHdDQUF3QyxNQUFNO0FBQ3JELFlBQU0sYUFBcUI7QUFHM0IsWUFBTSxnQkFBZ0I7QUFBQSxRQUNwQixNQUFNO0FBQUEsUUFDTixhQUFhLENBQUMsV0FBWSxpQ0FBSSxTQUFKLENBQVksU0FBUztBQUFBO0FBR2pELGdCQUFVLE1BQU07QUFDZCxhQUFLO0FBQUE7QUFHUCxTQUFHLDhDQUE4QyxZQUFZO0FBRTNELGFBQUssY0FBYyxDQUFDO0FBR3BCLGFBQUssU0FBUyx5QkFBeUI7QUFHdkMsY0FBTSxZQUF3QixNQUFNLEtBQUssU0FBUyxDQUFDLFNBQVMsZUFBZSxNQUFNO0FBRWpGLGVBQU8sS0FBSyxTQUFTLDBCQUEwQixRQUFRO0FBQ3ZELGVBQU8sVUFBVSxTQUFTLFFBQVE7QUFBQTtBQUdwQyxTQUFHLHFEQUFxRCxNQUFNO0FBQzVELGNBQU0sS0FBSyxNQUFNLEtBQUssY0FBYyxDQUFDLENBQUMsYUFBYSxjQUFjO0FBQ2pFLGVBQU8sSUFBSTtBQUFBO0FBR2IsU0FBRyxtREFBbUQsTUFBTTtBQUMxRCxjQUFNLEtBQUssTUFBTSxLQUFLLGNBQWMsQ0FBQztBQUNyQyxlQUFPLElBQUk7QUFBQTtBQUFBO0FBSWYsYUFBUyxtREFBbUQsTUFBTTtBQUNoRSxZQUFNLGFBQXFCO0FBRTNCLGlCQUFXLE1BQU07QUFFZixjQUFNLG9CQUFvQjtBQUFBLFVBQ3hCLE1BQU07QUFBQSxVQUNOLGFBQWEsQ0FBQyxXQUFXLFFBQVEsUUFBUSxpQ0FBSSxTQUFKLENBQVksU0FBUztBQUFBO0FBR2hFLGFBQUssY0FBYyxDQUFDO0FBQUE7QUFHdEIsZ0JBQVUsTUFBTTtBQUNkLGFBQUs7QUFBQTtBQUdQLFNBQUcsOENBQThDLFlBQVk7QUFFM0QsYUFBSyxTQUFTLHlCQUF5QjtBQUd2QyxjQUFNLFlBQXdCLE1BQU0sS0FBSyxTQUFTLENBQUMsU0FBUyxlQUFlLE1BQU07QUFDakYsZUFBTyxLQUFLLFNBQVMsMEJBQTBCLFFBQVE7QUFDdkQsZUFBTyxVQUFVLFNBQVMsUUFBUTtBQUFBO0FBQUE7QUFJdEMsYUFBUyx5Q0FBeUMsTUFBTTtBQUN0RCxZQUFNLGFBQXFCO0FBRTNCLGlCQUFXLE1BQU07QUFFZixjQUFNLGlCQUFpQjtBQUFBLFVBQ3JCLE1BQU07QUFBQSxVQUNOLGNBQWMsQ0FBQyxXQUFXLFFBQVEsUUFBUSxpQ0FBSSxTQUFKLENBQVksU0FBUztBQUFBO0FBR2pFLGFBQUssY0FBYyxDQUFDO0FBQUE7QUFHdEIsZ0JBQVUsTUFBTTtBQUNkLGFBQUs7QUFBQTtBQUdQLFNBQUcsMkJBQTJCLFlBQVk7QUFFeEMsYUFBSyxTQUFTLHlCQUF5QjtBQUd2QyxjQUFNLGFBQXlCLE1BQU0sS0FBSyxTQUFTLENBQUMsU0FBUyxlQUFlLE1BQU07QUFFbEYsZUFBTyxLQUFLLFNBQVMsMEJBQTBCLFFBQVE7QUFDdkQsZUFBTyxXQUFXLFNBQVMsUUFBUTtBQUFBO0FBR3JDLFNBQUcsaUNBQWlDLFlBQVk7QUFDOUMsY0FBTSxPQUFPLEtBQUssU0FBUyxPQUFPLFFBQVE7QUFBQTtBQUc1QyxTQUFHLG9DQUFvQyxZQUFZO0FBQ2pELGNBQU0sZ0JBQWdCO0FBQUEsVUFDcEIsTUFBTTtBQUFBLFVBQ04sYUFBYSxNQUFNLFFBQVEsT0FBTyxJQUFJLE1BQU07QUFBQTtBQUU5QyxhQUFLLGNBQWMsQ0FBQztBQUNwQixjQUFNLE9BQU8sS0FBSyxTQUFTLENBQUMsTUFBTSxVQUFVLFFBQVE7QUFBQTtBQUd0RCxTQUFHLHFDQUFxQyxZQUFZO0FBQ2xELGNBQU0saUJBQWlCO0FBQUEsVUFDckIsTUFBTTtBQUFBLFVBQ04sY0FBYyxNQUFNLFFBQVEsT0FBTyxJQUFJLE1BQU07QUFBQTtBQUUvQyxhQUFLLGNBQWMsQ0FBQztBQUNwQixjQUFNLE9BQU8sS0FBSyxTQUFTLENBQUMsTUFBTSxVQUFVLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFLMUQsV0FBUyxjQUFjLE1BQU07QUFDM0IsT0FBRyx1QkFBdUIsTUFBTTtBQUM5QixZQUFNLGVBQXVCO0FBQzdCLFlBQU0sU0FBUyxDQUFDLFFBQVEsTUFBTTtBQUFBLFNBQUksTUFBTTtBQUN4QyxZQUFNLFVBQVUsS0FBSyxjQUFjLGVBQWU7QUFDbEQsYUFBTyxTQUFTLFFBQVEsQ0FBQztBQUFBO0FBRzNCLE9BQUcsd0NBQXdDLE1BQU07QUFDL0MsWUFBTSxlQUF1QjtBQUM3QixZQUFNLFNBQVMsQ0FBQyxRQUFRLE1BQU07QUFBQSxTQUFJLE1BQU07QUFDeEMsV0FBSyxXQUFXLGtCQUFrQixDQUFDO0FBQ25DLFlBQU0sVUFBVSxLQUFLLGNBQWMsZUFBZTtBQUNsRCxhQUFPLFNBQVMsUUFBUSxDQUFDO0FBQUE7QUFHM0IsT0FBRyxvQ0FBb0MsTUFBTTtBQUMzQyxZQUFNLGVBQXVCO0FBQzdCLFlBQU0sS0FBSyxNQUFNLEtBQUssY0FBYyxlQUFlLENBQUMsUUFBUTtBQUM1RCxhQUFPLElBQUk7QUFBQTtBQUFBO0FBSWYsV0FBUyxpQkFBaUIsTUFBTTtBQUM5QixlQUFXLE1BQU07QUFFZixXQUFLLFNBQVMsbUJBQW1CO0FBQUE7QUFHbkMsT0FBRywrQkFBK0IsWUFBWTtBQUU1QyxZQUFNLEtBQUs7QUFFWCxhQUFPLEtBQUssU0FBUyxDQUFDLGNBQWMsVUFBVSxRQUFRO0FBQUE7QUFHeEQsT0FBRyw4QkFBOEIsWUFBWTtBQUMzQyxZQUFNLGVBQWUsQ0FBQyxPQUFPO0FBQzdCLFlBQU0saUJBQWlCLEtBQUssS0FBSyxrQkFBa0I7QUFDbkQsV0FBSyxRQUFRLFVBQVUsQ0FBQztBQUd4QixZQUFNLFVBQVUsTUFBTSxLQUFLO0FBRTNCLGFBQU8sZUFBZSxLQUFLLE1BQU0sUUFBUSxRQUFRO0FBQ2pELGFBQU8sU0FBUyxRQUFRO0FBQUE7QUFBQTtBQUk1QixXQUFTLGVBQWUsTUFBTTtBQUM1QixPQUFHLG1DQUFtQyxNQUFNO0FBQzFDLFdBQUssUUFBUSxDQUFDLE9BQU87QUFDckIsV0FBSyxlQUFlLENBQUMsT0FBTztBQUM1QixXQUFLLFdBQVc7QUFDaEIsYUFBTyxLQUFLLE9BQU8sUUFBUTtBQUMzQixhQUFPLEtBQUssY0FBYyxRQUFRO0FBQUE7QUFHcEMsT0FBRyxzQ0FBc0MsTUFBTTtBQUM3QyxZQUFNLGdCQUFnQiw4QkFBVSxLQUFLO0FBQ3JDLFdBQUs7QUFDTCxhQUFPLGVBQWUsUUFBUSxLQUFLO0FBQUE7QUFBQTtBQUl2QyxXQUFTLGFBQWEsTUFBTTtBQUMxQixRQUFJO0FBRUosZUFBVyxNQUFNO0FBRWYsaUJBQVcsS0FBSztBQUNoQixXQUFLLEdBQUcsY0FBYztBQUFBO0FBR3hCLGNBQVUsTUFBTTtBQUNkLFdBQUssSUFBSSxjQUFjO0FBQUE7QUFHekIsT0FBRywyQkFBMkIsWUFBWTtBQUV4QyxXQUFLLFNBQVMsQ0FBQyxTQUFTLFFBQVEsTUFBTTtBQUV0QyxZQUFNLFNBQWMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxTQUFTLFFBQVEsTUFBTTtBQUNoRSxhQUFPLFFBQVEsUUFBUSxDQUFDLFNBQVMsUUFBUSxNQUFNO0FBQUE7QUFHakQsT0FBRywrQkFBK0IsTUFBTTtBQUV0QyxXQUFLLFNBQVMsQ0FBQyxTQUFTLFFBQVEsTUFBTTtBQUV0QyxZQUFNLE9BQWUsS0FBSyxTQUFTO0FBQ25DLGFBQU8sTUFBTSxRQUFRO0FBQUE7QUFHdkIsT0FBRyw0QkFBNEIsTUFBTTtBQUVuQyxXQUFLLFNBQVMsQ0FBQyxTQUFTLFFBQVEsTUFBTTtBQUV0QyxhQUFPLFNBQVMsS0FBSyxNQUFNLFFBQVEsUUFBUTtBQUFBO0FBRzdDLE9BQUcsa0NBQWtDLE1BQU07QUFFekMsV0FBSyxTQUFTLENBQUMsU0FBUztBQUV4QixhQUFPLFNBQVMsS0FBSyxNQUFNLFFBQVEsUUFBUTtBQUFBO0FBRzdDLE9BQUcsaUNBQWlDLE1BQU07QUFFeEMsV0FBSyxTQUFTLENBQUMsU0FBUyxRQUFRLE1BQU0sZUFBZTtBQUVyRCxhQUFPLFNBQVMsS0FBSyxNQUFNLFFBQVEsUUFBUTtBQUFBO0FBRzdDLE9BQUcseUJBQXlCLE1BQU07QUFDaEMsV0FBSyxnQkFBZ0IsS0FBSyxLQUFLLGtCQUFrQjtBQUNqRCxXQUFLLFFBQVEsVUFBVTtBQUd2QixXQUFLLFNBQVMsQ0FBQyxTQUFTLFFBQVEsTUFBTTtBQUV0QyxhQUFPLEtBQUssY0FBYyxLQUFLLE1BQU0sUUFBUSxRQUFRO0FBQUE7QUFHdkQsT0FBRyxzREFBc0QsWUFBWTtBQUVuRSxZQUFNLFlBQVksQ0FBQyxNQUFjLE1BQU0sUUFBUSxpQkFBc0I7QUFDbkUsZ0JBQU87QUFBQSxlQUNBO0FBQ0gsbUJBQU87QUFBQTtBQUVQLG1CQUFPO0FBQUE7QUFBQTtBQUdiLFlBQU0sS0FBSyxVQUFVLENBQUM7QUFHdEIsWUFBTSxLQUFLLFNBQVMsQ0FBQyxTQUFTLFFBQVEsTUFBTTtBQUU1QyxhQUFPLEtBQUssTUFBTSxXQUFXLFFBQVE7QUFBQTtBQUd2QyxPQUFHLCtEQUErRCxZQUFZO0FBRTVFLFlBQU0sWUFBWSxDQUFDLE1BQWMsTUFBTSxVQUFlO0FBQ3BELGdCQUFPO0FBQUEsZUFDQTtBQUNILG1CQUFPO0FBQUE7QUFFUCxtQkFBTztBQUFBO0FBQUE7QUFHYixZQUFNLEtBQUssVUFBVSxDQUFDO0FBQ3RCLFdBQUssTUFBTSxZQUFZO0FBR3ZCLFlBQU0sS0FBSyxTQUFTLENBQUMsU0FBUyxRQUFRLE1BQU07QUFFNUMsYUFBTyxLQUFLLE1BQU0sV0FBVyxRQUFRO0FBQUE7QUFBQTtBQUl6QyxXQUFTLGVBQWUsTUFBTTtBQUM1QixPQUFHLCtCQUErQixNQUFNO0FBQ3RDLFlBQU0sVUFBVSxLQUFLO0FBQ3JCLFlBQU0sYUFBcUI7QUFDM0IsYUFBTyxTQUFTLFFBQVEsS0FBSztBQUFBO0FBQUE7QUFJakMsV0FBUyxhQUFhLE1BQU07QUFDMUIsZUFBVyxNQUFNO0FBQ2YsWUFBTSxjQUFjLEtBQUssU0FBUztBQUNsQyxXQUFLLFNBQVMsY0FBYyxZQUFZO0FBQUE7QUFHMUMsT0FBRyw2QkFBNkIsTUFBTTtBQUNwQyxZQUFNLFFBQVEsS0FBSztBQUNuQixhQUFPLE1BQU0sV0FBVyxNQUFNLFFBQVE7QUFBQTtBQUd4QyxPQUFHLG1EQUFtRCxNQUFNO0FBQzFELFlBQU0sUUFBUSxLQUFLLFNBQVM7QUFDNUIsYUFBTyxNQUFNLE1BQU0sUUFBUTtBQUFBO0FBRzdCLE9BQUcseURBQXlELE1BQU07QUFDaEUsWUFBTSxRQUFnQixLQUFLLFNBQVMsQ0FBQyxjQUFjO0FBQ25ELGFBQU8sT0FBTyxRQUFRO0FBQUE7QUFHeEIsT0FBRyxnRUFBZ0UsTUFBTTtBQUN2RSxZQUFNLFFBQWdCLEtBQUssU0FBUztBQUNwQyxhQUFPLE9BQU8sUUFBUTtBQUFBO0FBR3hCLE9BQUcsZ0RBQWdELE1BQU07QUFDdkQsWUFBTSxRQUFnQixLQUFLLFNBQVMseUJBQXlCO0FBQzdELGFBQU8sT0FBTyxRQUFRO0FBQUE7QUFHeEIsT0FBRyxvREFBb0QsTUFBTTtBQUMzRCxZQUFNLFFBQWdCLEtBQUssU0FBUztBQUNwQyxhQUFPLE9BQU8sUUFBUSxDQUFDLFlBQVk7QUFBQTtBQUdyQyxPQUFHLG1EQUFtRCxNQUFNO0FBQzFELFlBQU0sUUFBZ0IsS0FBSyxTQUFTO0FBQ3BDLGFBQU8sT0FBTyxRQUFRLENBQUMsWUFBWTtBQUFBO0FBR3JDLE9BQUcsd0RBQXdELE1BQU07QUFDL0QsWUFBTSxRQUFnQixLQUFLO0FBQzNCLGFBQU8sT0FBTyxRQUFRLENBQUMsWUFBWTtBQUFBO0FBR3JDLE9BQUcsK0NBQStDLE1BQU07QUFDdEQsV0FBSyxRQUFRO0FBQ2IsWUFBTSxRQUFnQixLQUFLO0FBQzNCLGFBQU8sT0FBTyxRQUFRO0FBQUE7QUFHeEIsT0FBRywrQkFBK0IsTUFBTTtBQUN0QyxZQUFNLFFBQVEsS0FBSyxTQUFTO0FBQzVCLGFBQU8sT0FBTyxRQUFRO0FBQUE7QUFHeEIsT0FBRyw4QkFBOEIsTUFBTTtBQUNyQyxZQUFNLFFBQVEsS0FBSyxTQUFTO0FBQzVCLGFBQU8sT0FBTyxRQUFRO0FBQUE7QUFBQTtBQUkxQixXQUFTLGFBQWEsTUFBTTtBQUMxQixPQUFHLCtCQUErQixNQUFNO0FBQ3RDLFlBQU0sY0FBYyxLQUFLLFNBQVM7QUFDbEMsYUFBTyxZQUFZLE1BQU0sUUFBUTtBQUFBO0FBR25DLE9BQUcsNENBQTRDLE1BQU07QUFDbkQsWUFBTSxjQUFjLEtBQUs7QUFDekIsYUFBTyxhQUFhO0FBQUE7QUFBQTtBQUl4QixXQUFTLFNBQVMsTUFBTTtBQUN0QixhQUFTLGdCQUFnQixNQUFNO0FBRTdCLFlBQU0sT0FBb0I7QUFBQSxRQUN4QixNQUFNO0FBQUE7QUFHUixTQUFHLDZEQUE2RCxZQUFZO0FBQzFFLGNBQU0sY0FBc0I7QUFDNUIsYUFBSyxlQUFlO0FBR3BCLGNBQU0sS0FBSyxLQUFLO0FBRWhCLGNBQU0sYUFBcUI7QUFDM0IsZUFBTyxLQUFLLFlBQVksTUFBTSxRQUFRO0FBQUE7QUFHeEMsU0FBRyxvREFBb0QsWUFBWTtBQUNqRSxjQUFNLGNBQXNCO0FBQzVCLGFBQUssZUFBZTtBQUdwQixjQUFNLEtBQUssS0FBSztBQUVoQixjQUFNLGFBQXFCO0FBQzNCLGVBQU8sS0FBSyxZQUFZLE1BQU0sUUFBUTtBQUFBO0FBR3hDLFNBQUcsMkNBQTJDLFlBQVk7QUFFeEQsY0FBTSxLQUFLLEtBQUssaUNBQUksT0FBSixDQUFVLE9BQU87QUFFakMsY0FBTSxXQUFtQjtBQUN6QixlQUFPLE9BQU8sV0FBVyxRQUFRO0FBQUE7QUFHbkMsU0FBRywwQ0FBMEMsWUFBWTtBQUV2RCxjQUFNLEtBQUs7QUFDWCxjQUFNLEtBQUs7QUFFWCxjQUFNLGFBQXFCO0FBQzNCLGNBQU0sa0JBQWtCO0FBQUEsVUFDdEIsTUFBTTtBQUFBLFVBQ04sWUFBWTtBQUFBLFVBQ1osYUFBYTtBQUFBLFVBQ2IsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFVBQ1QsYUFBYTtBQUFBLFVBQ2IsUUFBUTtBQUFBLFVBQ1IsT0FBTztBQUFBO0FBRVQsZUFBTyxLQUFLLGFBQWEsUUFBUTtBQUFBO0FBQUE7QUFJckMsYUFBUyxvQ0FBb0MsTUFBTTtBQUVqRCxZQUFNLE9BQW9CO0FBQUEsUUFDeEIsTUFBTTtBQUFBO0FBR1IsU0FBRyx1QkFBdUIsWUFBWTtBQUNwQyxjQUFNLEtBQUssS0FBSyxNQUFNO0FBQ3RCLGNBQU0sa0JBQTBCO0FBQ2hDLGVBQU8sS0FBSyxpQkFBaUIsTUFBTSxRQUFRO0FBQUE7QUFBQTtBQUkvQyxhQUFTLDJCQUEyQixNQUFNO0FBRXhDLFlBQU0sT0FBb0I7QUFBQSxRQUN4QixPQUFPO0FBQUEsUUFDUCxRQUFRLENBQUM7QUFBQTtBQUdYLFNBQUcsb0JBQW9CLFlBQVk7QUFDakMsY0FBTSxLQUFLLEtBQUssTUFBTTtBQUN0QixjQUFNLGtCQUEwQjtBQUNoQyxlQUFPLE9BQU8sS0FBSyxLQUFLLGtCQUFrQixRQUFRLFFBQVE7QUFBQTtBQUc1RCxTQUFHLHFDQUFxQyxZQUFZO0FBQ2xELGNBQU0sS0FBSyxLQUFLLE1BQU07QUFDdEIsY0FBTSxrQkFBMEI7QUFDaEMsZUFBTyxLQUFLLGlCQUFpQixXQUFXLE1BQU0sUUFBUTtBQUFBO0FBQUE7QUFJMUQsYUFBUyxrQkFBa0IsTUFBTTtBQUUvQixZQUFNLE9BQW9CO0FBQUEsUUFDeEIsT0FBTztBQUFBLFFBQ1AsUUFBUSxDQUFDO0FBQUE7QUFHWCxTQUFHLG9CQUFvQixZQUFZO0FBQ2pDLGNBQU0sS0FBSyxLQUFLLE1BQU07QUFDdEIsY0FBTSxrQkFBMEI7QUFDaEMsZUFBTyxPQUFPLEtBQUssS0FBSyxrQkFBa0IsUUFBUSxRQUFRO0FBQUE7QUFHNUQsU0FBRyxxQ0FBcUMsWUFBWTtBQUNsRCxjQUFNLEtBQUssS0FBSyxNQUFNO0FBQ3RCLGNBQU0sa0JBQTBCO0FBQ2hDLGVBQU8sS0FBSyxpQkFBaUIsV0FBVyxNQUFNLFFBQVE7QUFBQTtBQUFBO0FBSTFELGFBQVMscUJBQXFCLE1BQU07QUFFbEMsWUFBTSxPQUFvQjtBQUFBLFFBQ3hCLE9BQU8sQ0FBQyxRQUFRLFNBQVMsTUFBTSxDQUFDLE9BQU87QUFBQSxRQUN2QyxRQUFRLENBQUM7QUFBQTtBQUdYLFNBQUcsb0JBQW9CLFlBQVk7QUFDakMsY0FBTSxLQUFLLEtBQUssTUFBTTtBQUN0QixjQUFNLGtCQUEwQjtBQUNoQyxlQUFPLE9BQU8sS0FBSyxLQUFLLGtCQUFrQixRQUFRLFFBQVE7QUFBQTtBQUc1RCxTQUFHLHFDQUFxQyxZQUFZO0FBQ2xELGNBQU0sS0FBSyxLQUFLLE1BQU07QUFDdEIsY0FBTSxrQkFBMEI7QUFDaEMsZUFBTyxLQUFLLGlCQUFpQixLQUFLLE9BQU8sUUFBUTtBQUFBO0FBQUE7QUFJckQsYUFBUyxjQUFjLE1BQU07QUFFM0IsWUFBTSxnQkFBZ0I7QUFBQSxRQUNwQixNQUFNO0FBQUEsUUFDTixhQUFhLENBQUMsV0FBWSxtQkFBSTtBQUFBO0FBSWhDLFlBQU0sT0FBb0I7QUFBQSxRQUN4QixZQUFZLENBQUM7QUFBQSxRQUNiLE1BQU07QUFBQSxRQUNOLFFBQVEsQ0FBQztBQUFBO0FBR1gsU0FBRyx5QkFBeUIsWUFBWTtBQUN0QyxjQUFNLEtBQUssS0FBSyxNQUFNO0FBQ3RCLGNBQU0sa0JBQTBCO0FBQ2hDLGVBQU8sS0FBSyxpQkFBaUIsZ0JBQWdCLEdBQUcsTUFBTSxRQUFRO0FBQUE7QUFBQTtBQUlsRSxhQUFTLGtCQUFrQixNQUFNO0FBQy9CLFNBQUcsa0NBQWtDLFlBQVk7QUFDL0MsYUFBSyxhQUFhLFFBQVEsT0FBTyxJQUFJLE1BQU07QUFDM0MsY0FBTSxPQUFPLEtBQUssS0FBSyxLQUFLLE9BQU8sUUFBUTtBQUFBO0FBRzdDLFNBQUcsaUNBQWlDLFlBQVk7QUFDOUMsYUFBSyxZQUFZLFFBQVEsT0FBTyxJQUFJLE1BQU07QUFDMUMsY0FBTSxPQUFPLEtBQUssS0FBSyxLQUFLLE9BQU8sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUtqRCxXQUFTLG1CQUFtQixNQUFNO0FBQ2hDLFFBQUk7QUFFSixlQUFXLE1BQU07QUFDZixpQkFBVyxLQUFLO0FBQ2hCLFdBQUssR0FBRyxRQUFRO0FBQUE7QUFHbEIsYUFBUyxPQUFPLE1BQU07QUFDcEIsU0FBRyx5QkFBeUIsWUFBWTtBQUN0QyxjQUFNLEtBQUssU0FBUyxDQUFDLE1BQU07QUFDM0IsZUFBTyxTQUFTLEtBQUssTUFBTSxRQUFRLFFBQVE7QUFBQTtBQUFBO0FBSS9DLGFBQVMsUUFBUSxNQUFNO0FBQ3JCLFNBQUcsNEJBQTRCLFlBQVk7QUFDekMsYUFBSyxJQUFJLFFBQVE7QUFDakIsY0FBTSxLQUFLLFNBQVMsQ0FBQyxNQUFNO0FBRTNCLGVBQU8sU0FBUyxLQUFLLE1BQU0sUUFBUSxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBS2pELFdBQVMsY0FBYyxNQUFNO0FBQzNCLFVBQU0sT0FBTyxDQUFDLE1BQU0sTUFBTSxRQUFRLENBQUMsWUFBWSxhQUFhO0FBQzFELFVBQUcsU0FBUyxhQUFhO0FBQ3ZCLGNBQU0sYUFBYSxLQUFLO0FBQUE7QUFHMUIsYUFBTztBQUFBO0FBR1QsT0FBRyx3Q0FBd0MsTUFBTTtBQUMvQyxXQUFLLFVBQVUsQ0FBQztBQUNoQixZQUFNLGtCQUEwQjtBQUNoQyxZQUFNLGNBQXlCLEtBQUssaUJBQWlCO0FBQ3JELGFBQU8sWUFBWSxNQUFNLFFBQVE7QUFBQTtBQUduQyxPQUFHLDRCQUE0QixNQUFNO0FBQ25DLFdBQUssVUFBVSxDQUFDO0FBQ2hCLFlBQU0sa0JBQTBCO0FBQ2hDLFlBQU0sY0FBeUIsS0FBSyxpQkFBaUI7QUFDckQsYUFBTyxZQUFZLGNBQWMsUUFBUSxDQUFDLFlBQVk7QUFBQTtBQUd4RCxPQUFHLG9DQUFvQyxNQUFNO0FBQzNDLFlBQU0sYUFBcUI7QUFDM0IsWUFBTSxpQkFBaUIsSUFBSSxNQUFNO0FBQ2pDLFdBQUssWUFBWSxVQUFVLENBQUM7QUFFNUIsV0FBSyxVQUFVLENBQUM7QUFDaEIsWUFBTSxrQkFBMEI7QUFDaEMsWUFBTSxjQUF5QixLQUFLLGlCQUFpQjtBQUNyRCxhQUFPLFlBQVksY0FBYyxRQUFRLENBQUMsWUFBWTtBQUFBO0FBQUE7QUFJMUQsV0FBUyxZQUFZLE1BQU07QUFDekIsT0FBRywrQ0FBK0MsTUFBTTtBQUN0RCxZQUFNLFdBQVcsS0FBSztBQUN0QixXQUFLLE1BQU0sS0FBSztBQUNoQixXQUFLLFFBQVE7QUFDYixhQUFPLEtBQUssSUFBSSxLQUFLLE1BQU0sUUFBUSxRQUFRO0FBQzNDLGFBQU8sS0FBSyxJQUFJLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSx1Q0FBZ0I7QUFBQTtBQUFBO0FBSTlELFdBQVMsV0FBVyxNQUFNO0FBQ3hCLE9BQUcsNENBQTRDLE1BQU07QUFDbkQsWUFBTSxXQUFXLEtBQUs7QUFDdEIsV0FBSyxTQUFTO0FBQ2QsV0FBSyxLQUFLLEtBQUs7QUFDZixXQUFLLE9BQU87QUFDWixhQUFPLEtBQUssR0FBRyxLQUFLLE1BQU0sUUFBUSxRQUFRO0FBQzFDLGFBQU8sS0FBSyxHQUFHLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSx1Q0FBZ0I7QUFBQTtBQUczRCxPQUFHLG9EQUFvRCxNQUFNO0FBQzNELFlBQU0sV0FBVyxLQUFLO0FBQ3RCLFdBQUssU0FBUztBQUNkLFdBQUssT0FBTztBQUNaLGFBQU8sU0FBUyxLQUFLLE1BQU0sUUFBUSxRQUFRO0FBQUE7QUFBQTtBQUkvQyxXQUFTLGFBQWEsTUFBTTtBQUMxQixPQUFHLG9DQUFvQyxNQUFNO0FBQzNDLFlBQU0sWUFBWSxDQUFDLE1BQWMsTUFBTSxRQUFRLGlCQUFzQjtBQUNuRSxnQkFBTztBQUFBLGVBQ0E7QUFDSCxtQkFBTyx3QkFBSSxjQUFjLEtBQUssU0FBUztBQUFBO0FBRXZDLG1CQUFPO0FBQUE7QUFBQTtBQUliLFlBQU0sY0FBc0I7QUFDNUIsWUFBTSxjQUFjLEtBQUssYUFBYTtBQUN0QyxZQUFNLGlCQUFpQjtBQUFBLFFBQ3JCLFFBQVE7QUFBQSxRQUNSO0FBQUEsUUFDQSxNQUFNO0FBQUE7QUFFUixhQUFPLGFBQWEsUUFBUTtBQUFBO0FBRzlCLE9BQUcsNkRBQTZELE1BQU07QUFDcEUsWUFBTSxZQUFZLENBQUMsTUFBYyxNQUFNLFVBQWU7QUFDcEQsZ0JBQU87QUFBQSxlQUNBO0FBQ0gsbUJBQU8sd0JBQUksY0FBYyxLQUFLLFNBQVM7QUFBQTtBQUV2QyxtQkFBTztBQUFBO0FBQUE7QUFJYixZQUFNLGNBQXNCO0FBQzVCLFlBQU0sY0FBYyxLQUFLLGFBQWE7QUFDdEMsWUFBTSxpQkFBaUI7QUFBQSxRQUNyQixRQUFRO0FBQUEsUUFDUixjQUFjO0FBQUEsUUFDZCxNQUFNO0FBQUE7QUFFUixhQUFPLGFBQWEsUUFBUTtBQUFBO0FBRzlCLE9BQUcsbURBQW1ELE1BQU07QUFDMUQsWUFBTSxjQUFzQjtBQUM1QixZQUFNLGNBQWMsS0FBSyxhQUFhLENBQUMsTUFBYyxNQUFNLFFBQVEsaUJBQXNCO0FBQ3ZGLGdCQUFPO0FBQUEsZUFDQTtBQUNILG1CQUFPLHdCQUFJLGNBQWMsS0FBSyxTQUFTO0FBQUE7QUFFdkMsbUJBQU87QUFBQTtBQUFBO0FBR2IsYUFBTyxhQUFhO0FBQUE7QUFHdEIsT0FBRyxvQ0FBb0MsTUFBTTtBQUMzQyxZQUFNLGNBQXNCO0FBRTVCLFlBQU0sS0FBSyxNQUFNLEtBQUs7QUFDdEIsYUFBTyxJQUFJO0FBQUE7QUFHYixPQUFHLGlEQUFpRCxNQUFNO0FBQ3hELFlBQU0sY0FBc0I7QUFFNUIsWUFBTSxLQUFLLE1BQU0sS0FBSyxhQUFhO0FBQ25DLGFBQU8sSUFBSTtBQUFBO0FBQUE7QUFJZixXQUFTLHFCQUFxQixNQUFNO0FBQ2xDLGVBQVcsTUFBTTtBQUNmLFdBQUs7QUFHTCxZQUFNLGdCQUFnQjtBQUFBLFFBQ3BCLE1BQU07QUFBQSxRQUNOLGFBQWEsQ0FBQyxXQUFZLG1CQUFJO0FBQUE7QUFHaEMsV0FBSyxjQUFjLENBQUM7QUFBQTtBQUd0QixPQUFHLDhDQUE4QyxNQUFNO0FBQ3JELFdBQUssaUJBQWlCLENBQUM7QUFDdkIsWUFBTSxrQkFBMEI7QUFDaEMsYUFBTyxLQUFLLGlCQUFpQixnQkFBZ0IsUUFBUSxRQUFRO0FBQUE7QUFBQTtBQUlqRSxXQUFTLGlCQUFpQixNQUFNO0FBQzlCLE9BQUcsb0NBQW9DLE1BQU07QUFDM0MsV0FBSyxXQUFXLGtCQUFrQixDQUFDLENBQUMsTUFBTSxlQUFlLENBQUMsTUFBTTtBQUNoRSxhQUFPLEtBQUssYUFBYSxlQUFlLGVBQWUsUUFBUSxDQUFDLENBQUMsTUFBTTtBQUFBO0FBR3pFLE9BQUcsZ0NBQWdDLE1BQU07QUFDdkMsV0FBSyxXQUFXLGtCQUFrQjtBQUNsQyxhQUFPLEtBQUssYUFBYSxlQUFlLGVBQWUsUUFBUTtBQUFBO0FBQUE7QUFJbkUsV0FBUyxpQkFBaUIsTUFBTTtBQUM5QixlQUFXLE1BQU07QUFFZixXQUFLLGFBQWEsQ0FBQztBQUFBO0FBR3JCLGNBQVUsTUFBTTtBQUNkLFdBQUssVUFBVSxDQUFDO0FBQUE7QUFHbEIsT0FBRyx1QkFBdUIsTUFBTTtBQUM5QixZQUFNLGtCQUEwQjtBQUNoQyxhQUFPLENBQUMsQ0FBQyxLQUFLLGlCQUFpQixZQUFZLFFBQVE7QUFBQTtBQUdyRCxPQUFHLDRCQUE0QixNQUFNO0FBQ25DLFlBQU0sa0JBQTBCO0FBQ2hDLGFBQU8sQ0FBQyxDQUFDLEtBQUssaUJBQWlCLFlBQVksUUFBUTtBQUFBO0FBQUE7QUFJdkQsV0FBUyxVQUFVLE1BQU07QUFDdkIsT0FBRyxpREFBaUQsWUFBWTtBQUM5RCxZQUFNLGFBQXFCO0FBQzNCLFlBQU0saUJBQWlCLElBQUksTUFBTTtBQUNqQyxXQUFLLFlBQVksVUFBVSxDQUFDO0FBQzVCLFlBQU0sT0FBTyxLQUFLLFNBQVMsUUFBUTtBQUFBO0FBQUE7QUFJdkMsV0FBUyxhQUFhLE1BQU07QUFDMUIsT0FBRywrQ0FBK0MsWUFBWTtBQUM1RCxZQUFNLEtBQUssU0FBUyx5QkFBeUI7QUFDN0MsWUFBTSxVQUFVLE1BQU0sS0FBSyxTQUFTO0FBQ3BDLGFBQU8sU0FBUyxRQUFRO0FBQUE7QUFHMUIsT0FBRyx1Q0FBdUMsWUFBWTtBQUNwRCxZQUFNLEtBQUssU0FBUyxRQUFXO0FBQy9CLFlBQU0sVUFBVSxNQUFNLEtBQUssU0FBUztBQUNwQyxhQUFPLFNBQVMsUUFBUTtBQUFBO0FBRzFCLE9BQUcseUJBQXlCLFlBQVk7QUFDdEMsWUFBTSxhQUFxQjtBQUMzQixZQUFNLG1CQUEyQjtBQUNqQyxZQUFNLGdCQUFnQixLQUFLO0FBQzNCLFdBQUssY0FBYyxDQUFDLFNBQVM7QUFDN0IsV0FBSyxvQkFBb0I7QUFDekIsWUFBTSxLQUFLLFNBQVMseUJBQXlCO0FBQzdDLGFBQU8sY0FBYyxLQUFLLE1BQU0sUUFBUSxRQUFRO0FBQUE7QUFBQTtBQUlwRCxXQUFTLGVBQWUsTUFBTTtBQUM1QixPQUFHLHlCQUF5QixZQUFZO0FBQ3RDLFlBQU0saUJBQWlCLEtBQUs7QUFDNUIsWUFBTSxhQUFxQjtBQUMzQixXQUFLLFlBQVksUUFBUTtBQUN6QixXQUFLLFlBQVksVUFBVSxDQUFDO0FBRTVCLFlBQU0sZ0JBQXdCO0FBQzlCLFlBQU0sS0FBSyxlQUFlO0FBRTFCLGFBQU8sZUFBZSxLQUFLLE1BQU0sUUFBUSxRQUFRO0FBQUE7QUFHbkQsT0FBRyxtQkFBbUIsWUFBWTtBQUNoQyxZQUFNLGFBQXFCO0FBQzNCLFdBQUssWUFBWSxRQUFRLENBQUMsT0FBTztBQUNqQyxXQUFLLFlBQVksVUFBVTtBQUUzQixZQUFNLGdCQUF3QjtBQUM5QixZQUFNLEtBQUssZUFBZTtBQUUxQixZQUFNLFdBQW1CO0FBQ3pCLGFBQU8sS0FBSyxVQUFVLE9BQU8sUUFBUTtBQUFBO0FBR3ZDLE9BQUcsZ0NBQWdDLFlBQVk7QUFDN0MsWUFBTSxhQUFxQjtBQUMzQixXQUFLLFlBQVksUUFBUTtBQUN6QixXQUFLLFlBQVksVUFBVSxJQUFJLE1BQU07QUFFckMsWUFBTSxnQkFBd0I7QUFDOUIsWUFBTSxPQUFPLEtBQUssZUFBZSxlQUFlLFFBQVE7QUFBQTtBQUcxRCxPQUFHLDJCQUEyQixZQUFZO0FBQ3hDLFlBQU0sUUFBZ0I7QUFDdEIsWUFBTSxhQUFxQjtBQUMzQixXQUFLLFlBQVksUUFBUSxDQUFDLE9BQU87QUFFakMsWUFBTSxpQkFBaUIsS0FBSyxLQUFLLGdCQUFnQjtBQUNqRCxXQUFLLFlBQVksVUFBVSxDQUFDO0FBRTVCLFlBQU0sZUFBb0I7QUFDMUIsbUJBQWEsbUJBQW1CLENBQUMsT0FBTztBQUV4QyxZQUFNLGdCQUF3QjtBQUM5QixZQUFNLEtBQUssZUFBZTtBQUUxQixhQUFPLGVBQWUsS0FBSyxNQUFNLFFBQVEsUUFBUTtBQUFBO0FBQUE7QUFBQTsiLAogICJuYW1lcyI6IFtdCn0K
|
697
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50ZXN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC9kZWJvdW5jZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9mcC9jbG9uZURlZXAnO1xuaW1wb3J0IHNldCBmcm9tICdsb2Rhc2gvZnAvc2V0JztcblxuaW1wb3J0IHtBcmtoYW1Db25zdGFudHN9IGZyb20gJy4uL2NvbnN0YW50cy9BcmtoYW1Db25zdGFudHMnO1xuaW1wb3J0IHtGbHV4RnJhbWV3b3JrfSBmcm9tICcuL0ZsdXgnO1xuaW1wb3J0IHtGbHV4QWN0aW9uLCBGbHV4T3B0aW9ucywgRmx1eFN0b3JlfSBmcm9tICcuL0ZsdXgudHlwZXMnO1xuXG5qZXN0Lm1vY2soJ2xvZGFzaC9kZWJvdW5jZScpO1xuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIGZhbHN5OiBmYWxzZSxcbiAgaXRlbTogJ2RlZmF1bHQnLFxuICB0ZXN0QWN0aW9uOiAnZGVmYXVsdCcsXG4gIHRlc3RVcGRhdGU6ICdkZWZhdWx0JyxcbiAgemVyb1ZhbHVlOiAwXG59O1xuXG5jb25zdCBoZWxsb1N0b3JlID0gKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUgPSBpbml0aWFsU3RhdGUpOiBhbnkgPT4ge1xuICBzd2l0Y2godHlwZSkge1xuICAgIGNhc2UgJ1RFU1RfRVZFTlQnOlxuICAgICAgcmV0dXJuIHNldCgndGVzdEFjdGlvbicsIGRhdGEudGVzdFZhciwgc3RhdGUpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn07XG5cbmRlc2NyaWJlKCdGbHV4JywgKCkgPT4ge1xuICBjb25zdCBjb25zb2xlRXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICBjb25zdCBjb25zb2xlV2FybiA9IGNvbnNvbGUud2FybjtcbiAgY29uc3QgY2ZnOiBGbHV4T3B0aW9ucyA9IHtcbiAgICBuYW1lOiAnYXJraGFtanNUZXN0JyxcbiAgICBzdG9yZXM6IFtoZWxsb1N0b3JlXVxuICB9O1xuICBsZXQgRmx1eDtcblxuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IgPSBqZXN0LmZuKCk7XG4gICAgY29uc29sZS53YXJuID0gamVzdC5mbigpO1xuICB9KTtcblxuICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICBGbHV4ID0gbmV3IEZsdXhGcmFtZXdvcmsoKTtcblxuICAgIC8vIENvbmZpZ3VyZVxuICAgIGF3YWl0IEZsdXguaW5pdChjZmcsIHRydWUpO1xuICB9KTtcblxuICBhZnRlckFsbCgoKSA9PiB7XG4gICAgY29uc29sZS5lcnJvciA9IGNvbnNvbGVFcnJvcjtcbiAgICBjb25zb2xlLndhcm4gPSBjb25zb2xlV2FybjtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNhZGRNaWRkbGV3YXJlJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdzaG91bGQgYXBwbHkgcHJlLWRpc3BhdGNoIG1pZGRsZXdhcmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGVUZXN0OiBzdHJpbmcgPSAnaW50ZXJjZXB0IG9iamVjdCc7XG5cbiAgICAgIC8vIEFkZCBvYmplY3QgbWlkZGxld2FyZVxuICAgICAgY29uc3Qgb2JqTWlkZGxld2FyZSA9IHtcbiAgICAgICAgbmFtZTogJ29iamVjdE1pZGRsZXdhcmUnLFxuICAgICAgICBwcmVEaXNwYXRjaDogKGFjdGlvbikgPT4gKHsuLi5hY3Rpb24sIHRlc3RWYXI6IG1pZGRsZVRlc3R9KVxuICAgICAgfTtcblxuICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgRmx1eC5jbGVhck1pZGRsZXdhcmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFsdGVyIGRhdGEgYmVmb3JlIHNlbmRpbmcgdG8gc3RvcmVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBNZXRob2RcbiAgICAgICAgRmx1eC5hZGRNaWRkbGV3YXJlKFtvYmpNaWRkbGV3YXJlXSk7XG5cbiAgICAgICAgLy8gU2V0IHRlc3QgZGF0YVxuICAgICAgICBGbHV4LnNldFN0YXRlKCdoZWxsb1N0b3JlLnRlc3RBY3Rpb24nLCAnZGVmYXVsdCcpO1xuXG4gICAgICAgIC8vIERpc3BhdGNoIGFuIGFjdGlvblxuICAgICAgICBjb25zdCBwcmVBY3Rpb246IEZsdXhBY3Rpb24gPSBhd2FpdCBGbHV4LmRpc3BhdGNoKHt0ZXN0VmFyOiAnaGVsbG8gd29ybGQnLCB0eXBlOiAnVEVTVF9FVkVOVCd9KTtcblxuICAgICAgICBleHBlY3QoRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0QWN0aW9uJykpLnRvRXF1YWwobWlkZGxlVGVzdCk7XG4gICAgICAgIGV4cGVjdChwcmVBY3Rpb24udGVzdFZhcikudG9FcXVhbChtaWRkbGVUZXN0KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBlcnJvciBmb3IgbWlkZGxld2FyZSB3aXRob3V0IGEgbmFtZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgZm4gPSAoKSA9PiBGbHV4LmFkZE1pZGRsZXdhcmUoW3twcmVEaXNwYXRjaDogb2JqTWlkZGxld2FyZS5wcmVEaXNwYXRjaH1dKTtcbiAgICAgICAgZXhwZWN0KGZuKS50b1Rocm93RXJyb3IoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBlcnJvciBmb3IgaW5jb21wYXRpYmxlIG1pZGRsZXdhcmUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZuID0gKCkgPT4gRmx1eC5hZGRNaWRkbGV3YXJlKFsnaW5jb3JyZWN0J10pO1xuICAgICAgICBleHBlY3QoZm4pLnRvVGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2hvdWxkIGFwcGx5IHByZS1kaXNwYXRjaCBtaWRkbGV3YXJlIGFzIHByb21pc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGVUZXN0OiBzdHJpbmcgPSAnaW50ZXJjZXB0IHByb21pc2UnO1xuXG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgLy8gQWRkIG9iamVjdCBtaWRkbGV3YXJlXG4gICAgICAgIGNvbnN0IHByb21pc2VNaWRkbGV3YXJlID0ge1xuICAgICAgICAgIG5hbWU6ICdwcm9taXNlTWlkZGxld2FyZScsXG4gICAgICAgICAgcHJlRGlzcGF0Y2g6IChhY3Rpb24pID0+IFByb21pc2UucmVzb2x2ZSh7Li4uYWN0aW9uLCB0ZXN0VmFyOiBtaWRkbGVUZXN0fSlcbiAgICAgICAgfTtcblxuICAgICAgICBGbHV4LmFkZE1pZGRsZXdhcmUoW3Byb21pc2VNaWRkbGV3YXJlXSk7XG4gICAgICB9KTtcblxuICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgRmx1eC5jbGVhck1pZGRsZXdhcmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFsdGVyIGRhdGEgYmVmb3JlIHNlbmRpbmcgdG8gc3RvcmVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBTZXQgdGVzdCBkYXRhXG4gICAgICAgIEZsdXguc2V0U3RhdGUoJ2hlbGxvU3RvcmUudGVzdEFjdGlvbicsICdkZWZhdWx0Jyk7XG5cbiAgICAgICAgLy8gRGlzcGF0Y2ggYW4gYWN0aW9uXG4gICAgICAgIGNvbnN0IHByZUFjdGlvbjogRmx1eEFjdGlvbiA9IGF3YWl0IEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICdoZWxsbyB3b3JsZCcsIHR5cGU6ICdURVNUX0VWRU5UJ30pO1xuICAgICAgICBleHBlY3QoRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0QWN0aW9uJykpLnRvRXF1YWwobWlkZGxlVGVzdCk7XG4gICAgICAgIGV4cGVjdChwcmVBY3Rpb24udGVzdFZhcikudG9FcXVhbChtaWRkbGVUZXN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCBhcHBseSBwb3N0IGRpc3BhdGNoIG1pZGRsZXdhcmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGVUZXN0OiBzdHJpbmcgPSAnaW50ZXJjZXB0IHBvc3QnO1xuXG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgLy8gQWRkIG9iamVjdCBtaWRkbGV3YXJlXG4gICAgICAgIGNvbnN0IHBvc3RNaWRkbGV3YXJlID0ge1xuICAgICAgICAgIG5hbWU6ICdwb3N0TWlkZGxld2FyZScsXG4gICAgICAgICAgcG9zdERpc3BhdGNoOiAoYWN0aW9uKSA9PiBQcm9taXNlLnJlc29sdmUoey4uLmFjdGlvbiwgdGVzdFZhcjogbWlkZGxlVGVzdH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgRmx1eC5hZGRNaWRkbGV3YXJlKFtwb3N0TWlkZGxld2FyZV0pO1xuICAgICAgfSk7XG5cbiAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIEZsdXguY2xlYXJNaWRkbGV3YXJlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBhbHRlciBzdG9yZSBkYXRhJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBTZXQgdGVzdCBkYXRhXG4gICAgICAgIEZsdXguc2V0U3RhdGUoJ2hlbGxvU3RvcmUudGVzdEFjdGlvbicsICdkZWZhdWx0Jyk7XG5cbiAgICAgICAgLy8gRGlzcGF0Y2ggYW4gYWN0aW9uXG4gICAgICAgIGNvbnN0IHBvc3RBY3Rpb246IEZsdXhBY3Rpb24gPSBhd2FpdCBGbHV4LmRpc3BhdGNoKHt0ZXN0VmFyOiAnaGVsbG8gd29ybGQnLCB0eXBlOiAnVEVTVF9FVkVOVCd9KTtcblxuICAgICAgICBleHBlY3QoRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0QWN0aW9uJykpLnRvRXF1YWwoJ2hlbGxvIHdvcmxkJyk7XG4gICAgICAgIGV4cGVjdChwb3N0QWN0aW9uLnRlc3RWYXIpLnRvRXF1YWwobWlkZGxlVGVzdCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbm8gYWN0aW9uIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBleHBlY3QoRmx1eC5kaXNwYXRjaChudWxsKSkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBwcmUgZGlzcGF0Y2ggZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZU1pZGRsZXdhcmUgPSB7XG4gICAgICAgICAgbmFtZTogJ2Vycm9yTWlkZGxld2FyZScsXG4gICAgICAgICAgcHJlRGlzcGF0Y2g6ICgpID0+IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigndGVzdCcpKVxuICAgICAgICB9O1xuICAgICAgICBGbHV4LmFkZE1pZGRsZXdhcmUoW3ByZU1pZGRsZXdhcmVdKTtcbiAgICAgICAgYXdhaXQgZXhwZWN0KEZsdXguZGlzcGF0Y2goe3R5cGU6ICd0ZXN0J30pKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIHBvc3QgZGlzcGF0Y2ggZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc3RNaWRkbGV3YXJlID0ge1xuICAgICAgICAgIG5hbWU6ICdlcnJvck1pZGRsZXdhcmUnLFxuICAgICAgICAgIHBvc3REaXNwYXRjaDogKCkgPT4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCd0ZXN0JykpXG4gICAgICAgIH07XG4gICAgICAgIEZsdXguYWRkTWlkZGxld2FyZShbcG9zdE1pZGRsZXdhcmVdKTtcbiAgICAgICAgYXdhaXQgZXhwZWN0KEZsdXguZGlzcGF0Y2goe3R5cGU6ICd0ZXN0J30pKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjYWRkUGx1Z2luJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWRkIGEgcGx1Z2luJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWRkUGx1Z2luS2V5OiBzdHJpbmcgPSAnYWRkUGx1Z2luJztcbiAgICAgIGNvbnN0IHBsdWdpbiA9IHttZXRob2Q6ICgpID0+IHt9LCBuYW1lOiAnZGVtb1BsdWdpbid9O1xuICAgICAgY29uc3QgcmVzdWx0cyA9IEZsdXhbYWRkUGx1Z2luS2V5XSgncHJlRGlzcGF0Y2gnLCBwbHVnaW4pO1xuICAgICAgZXhwZWN0KHJlc3VsdHMpLnRvRXF1YWwoW3BsdWdpbl0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBza2lwIHBsdWdpbiBpZiBhbHJlYWR5IGV4aXN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGFkZFBsdWdpbktleTogc3RyaW5nID0gJ2FkZFBsdWdpbic7XG4gICAgICBjb25zdCBwbHVnaW4gPSB7bWV0aG9kOiAoKSA9PiB7fSwgbmFtZTogJ2RlbW9QbHVnaW4nfTtcbiAgICAgIEZsdXgubWlkZGxld2FyZS5wcmVEaXNwYXRjaExpc3QgPSBbcGx1Z2luXTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBGbHV4W2FkZFBsdWdpbktleV0oJ3ByZURpc3BhdGNoJywgcGx1Z2luKTtcbiAgICAgIGV4cGVjdChyZXN1bHRzKS50b0VxdWFsKFtwbHVnaW5dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVuZGVmaW5lZCBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IGFkZFBsdWdpbktleTogc3RyaW5nID0gJ2FkZFBsdWdpbic7XG4gICAgICBjb25zdCBmbiA9ICgpID0+IEZsdXhbYWRkUGx1Z2luS2V5XSgncHJlRGlzcGF0Y2gnLCB7bWV0aG9kOiAnb2JqZWN0J30pO1xuICAgICAgZXhwZWN0KGZuKS50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNjbGVhckFwcERhdGEnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAvLyBTZXQgdGVzdCBkYXRhXG4gICAgICBGbHV4LnNldFN0YXRlKCdoZWxsb1N0b3JlLml0ZW0nLCAnY2xlYXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVzZXQgdGhlIHN0b3JlIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNZXRob2RcbiAgICAgIGF3YWl0IEZsdXguY2xlYXJBcHBEYXRhKCk7XG5cbiAgICAgIGV4cGVjdChGbHV4LmdldFN0YXRlKFsnaGVsbG9TdG9yZScsICdpdGVtJ10pKS50b0VxdWFsKCdkZWZhdWx0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBkYXRhIGluIHN0b3JhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXRybmVkVmFsdWUgPSB7aGVsbG86ICd3b3JsZCd9O1xuICAgICAgY29uc3Qgc2V0U3RvcmFnZURhdGEgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUocmV0cm5lZFZhbHVlKTtcbiAgICAgIEZsdXgub3B0aW9ucy5zdG9yYWdlID0ge3NldFN0b3JhZ2VEYXRhfTtcblxuICAgICAgLy8gTWV0aG9kXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgRmx1eC5jbGVhckFwcERhdGEoKTtcblxuICAgICAgZXhwZWN0KHNldFN0b3JhZ2VEYXRhLm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgICAgZXhwZWN0KHJlc3VsdHMpLnRvRXF1YWwocmV0cm5lZFZhbHVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNkZXJlZ2lzdGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGEgc3RhdGUgYW5kIHN0b3JlJywgKCkgPT4ge1xuICAgICAgRmx1eC5zdGF0ZSA9IHtoZWxsbzogJ3dvcmxkJ307XG4gICAgICBGbHV4LnN0b3JlQWN0aW9ucyA9IHtoZWxsbzogJ3dvcmxkJ307XG4gICAgICBGbHV4LmRlcmVnaXN0ZXIoJ2hlbGxvJyk7XG4gICAgICBleHBlY3QoRmx1eC5zdGF0ZSkudG9FcXVhbCh7fSk7XG4gICAgICBleHBlY3QoRmx1eC5zdG9yZUFjdGlvbnMpLnRvRXF1YWwoe30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgZW1wdHkgc3RyaW5nIGFzIGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW5hbFN0YXRlID0gY2xvbmVEZWVwKEZsdXguc3RhdGUpO1xuICAgICAgRmx1eC5kZXJlZ2lzdGVyKCk7XG4gICAgICBleHBlY3Qob3JpZ2luYWxTdGF0ZSkudG9FcXVhbChGbHV4LnN0YXRlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNkaXNwYXRjaCcsICgpID0+IHtcbiAgICBsZXQgZXZlbnRTcHk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIC8vIFNweVxuICAgICAgZXZlbnRTcHkgPSBqZXN0LmZuKCk7XG4gICAgICBGbHV4Lm9uKCdURVNUX0VWRU5UJywgZXZlbnRTcHkpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIEZsdXgub2ZmKCdURVNUX0VWRU5UJywgZXZlbnRTcHkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gTWV0aG9kXG4gICAgICBGbHV4LmRpc3BhdGNoKHt0ZXN0VmFyOiAndGVzdCcsIHR5cGU6ICdURVNUX0VWRU5UJ30pO1xuXG4gICAgICBjb25zdCBhY3Rpb246IGFueSA9IGF3YWl0IEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICd0ZXN0JywgdHlwZTogJ1RFU1RfRVZFTlQnfSk7XG4gICAgICBleHBlY3QoYWN0aW9uKS50b0VxdWFsKHt0ZXN0VmFyOiAndGVzdCcsIHR5cGU6ICdURVNUX0VWRU5UJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbHRlciB0aGUgc3RvcmUgZGF0YScsICgpID0+IHtcbiAgICAgIC8vIE1ldGhvZFxuICAgICAgRmx1eC5kaXNwYXRjaCh7dGVzdFZhcjogJ3Rlc3QnLCB0eXBlOiAnVEVTVF9FVkVOVCd9KTtcblxuICAgICAgY29uc3QgaXRlbTogc3RyaW5nID0gRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0QWN0aW9uJyk7XG4gICAgICBleHBlY3QoaXRlbSkudG9FcXVhbCgndGVzdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkaXNwYXRjaCBhbiBldmVudCcsICgpID0+IHtcbiAgICAgIC8vIE1ldGhvZFxuICAgICAgRmx1eC5kaXNwYXRjaCh7dGVzdFZhcjogJ3Rlc3QnLCB0eXBlOiAnVEVTVF9FVkVOVCd9KTtcblxuICAgICAgZXhwZWN0KGV2ZW50U3B5Lm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgZGlzcGF0Y2ggaWYgbm8gdHlwZScsICgpID0+IHtcbiAgICAgIC8vIE1ldGhvZFxuICAgICAgRmx1eC5kaXNwYXRjaCh7dGVzdFZhcjogJ3Rlc3QnfSk7XG5cbiAgICAgIGV4cGVjdChldmVudFNweS5tb2NrLmNhbGxzLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGRpc3BhdGNoIGlmIHNpbGVudCcsICgpID0+IHtcbiAgICAgIC8vIE1ldGhvZFxuICAgICAgRmx1eC5kaXNwYXRjaCh7dGVzdFZhcjogJ3Rlc3QnLCB0eXBlOiAnVEVTVF9FVkVOVCd9LCB0cnVlKTtcblxuICAgICAgZXhwZWN0KGV2ZW50U3B5Lm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1cGRhdGUgc3RvcmFnZScsICgpID0+IHtcbiAgICAgIEZsdXgudXBkYXRlU3RvcmFnZSA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgICBGbHV4Lm9wdGlvbnMuc3RvcmFnZSA9IHt9O1xuXG4gICAgICAvLyBNZXRob2RcbiAgICAgIEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICd0ZXN0JywgdHlwZTogJ1RFU1RfRVZFTlQnfSk7XG5cbiAgICAgIGV4cGVjdChGbHV4LnVwZGF0ZVN0b3JhZ2UubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1cGRhdGVkIHN0YXRlIGlmIGFjdGlvbiByZXR1cm5zIG51bGwnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBBZGQgbnVsbCBzdG9yZVxuICAgICAgY29uc3QgbnVsbFN0b3JlID0gKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUgPSBpbml0aWFsU3RhdGUpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ1RFU1RfTlVMTCc6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgYXdhaXQgRmx1eC5hZGRTdG9yZXMoW251bGxTdG9yZV0pO1xuXG4gICAgICAvLyBNZXRob2RcbiAgICAgIGF3YWl0IEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICd0ZXN0JywgdHlwZTogJ1RFU1RfTlVMTCd9KTtcblxuICAgICAgZXhwZWN0KEZsdXguc3RhdGUubnVsbFN0b3JlKS50b0VxdWFsKGluaXRpYWxTdGF0ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbXB0eSBvYmplY3QgaWYgc3RvcmUgcmV0dXJucyBudWxsIGJ5IGRlZmF1bHQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBBZGQgbnVsbCBzdG9yZVxuICAgICAgY29uc3QgbnVsbFN0b3JlID0gKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ1RFU1RfTlVMTCc6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgYXdhaXQgRmx1eC5hZGRTdG9yZXMoW251bGxTdG9yZV0pO1xuICAgICAgRmx1eC5zdGF0ZS5udWxsU3RvcmUgPSBudWxsO1xuXG4gICAgICAvLyBNZXRob2RcbiAgICAgIGF3YWl0IEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICd0ZXN0JywgdHlwZTogJ1RFU1RfTlVMTCd9KTtcblxuICAgICAgZXhwZWN0KEZsdXguc3RhdGUubnVsbFN0b3JlKS50b0VxdWFsKHt9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNnZXRPcHRpb25zJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ2V0IGEgb3B0aW9ucyBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0gRmx1eC5nZXRPcHRpb25zKCk7XG4gICAgICBjb25zdCBvcHRpb25zS2V5OiBzdHJpbmcgPSAnb3B0aW9ucyc7XG4gICAgICBleHBlY3Qob3B0aW9ucykudG9FcXVhbChGbHV4W29wdGlvbnNLZXldKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNnZXRTdGF0ZScsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlQWN0aW9uID0gRmx1eC5nZXRTdG9yZSgnaGVsbG9TdG9yZScpO1xuICAgICAgRmx1eC5zZXRTdGF0ZSgnaGVsbG9TdG9yZScsIHN0b3JlQWN0aW9uLmluaXRpYWxTdGF0ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBhIGdsb2JhbCBzdG9yZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRmx1eC5nZXRTdGF0ZSgpO1xuICAgICAgZXhwZWN0KHZhbHVlLmhlbGxvU3RvcmUuaXRlbSkudG9FcXVhbCgnZGVmYXVsdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYSBzcGVjaWZpYyBzdG9yZSByZXR1cm5pbmcgYW4gb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBGbHV4LmdldFN0YXRlKCdoZWxsb1N0b3JlJyk7XG4gICAgICBleHBlY3QodmFsdWUuaXRlbSkudG9FcXVhbCgnZGVmYXVsdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYSBzcGVjaWZpYyBpdGVtIHdpdGhpbiBhIHN0b3JlIHVzaW5nIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyA9IEZsdXguZ2V0U3RhdGUoWydoZWxsb1N0b3JlJywgJ2l0ZW0nXSk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJ2RlZmF1bHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IGEgc3BlY2lmaWMgaXRlbSB3aXRoaW4gYSBzdG9yZSB1c2luZyBkb3Qgbm90YXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZTogc3RyaW5nID0gRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS5pdGVtJyk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJ2RlZmF1bHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGRlZmF1bHQgdmFsdWUgZnJvbSBhIG51bGwgaXRlbScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBGbHV4LmdldFN0YXRlKCdoZWxsb1N0b3JlLm5vdERlZmF1bHQnLCAnJyk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW50aXJlIHN0b3JlIG9iamVjdCB3aXRoIGVtcHR5IGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBGbHV4LmdldFN0YXRlKCcnKTtcbiAgICAgIGV4cGVjdCh2YWx1ZSkudG9FcXVhbCh7aGVsbG9TdG9yZTogaW5pdGlhbFN0YXRlfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbnRpcmUgc3RvcmUgb2JqZWN0IHdpdGggbnVsbCBrZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZTogc3RyaW5nID0gRmx1eC5nZXRTdGF0ZShudWxsKTtcbiAgICAgIGV4cGVjdCh2YWx1ZSkudG9FcXVhbCh7aGVsbG9TdG9yZTogaW5pdGlhbFN0YXRlfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbnRpcmUgc3RvcmUgb2JqZWN0IHdpdGggdW5kZWZpbmVkIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBGbHV4LmdldFN0YXRlKCk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoe2hlbGxvU3RvcmU6IGluaXRpYWxTdGF0ZX0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW1wdHkgb2JqZWN0IGlmIHN0YXRlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBGbHV4LnN0YXRlID0gbnVsbDtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBGbHV4LmdldFN0YXRlKCk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoe30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBmYWxzZSB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS5mYWxzeScpO1xuICAgICAgZXhwZWN0KHZhbHVlKS50b0VxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgemVybyB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS56ZXJvVmFsdWUnKTtcbiAgICAgIGV4cGVjdCh2YWx1ZSkudG9FcXVhbCgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNnZXRTdG9yZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdldCBhIHN0b3JlIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVBY3Rpb24gPSBGbHV4LmdldFN0b3JlKCdoZWxsb1N0b3JlJyk7XG4gICAgICBleHBlY3Qoc3RvcmVBY3Rpb24ubmFtZSkudG9FcXVhbCgnaGVsbG9TdG9yZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgZW1wdHkgc3RyaW5nIGFzIGRlZmF1bHQgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZUFjdGlvbiA9IEZsdXguZ2V0U3RvcmUoKTtcbiAgICAgIGV4cGVjdChzdG9yZUFjdGlvbikudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnI2luaXQnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ3NldCBhcHAgbmFtZScsICgpID0+IHtcbiAgICAgIC8vIFZhcnNcbiAgICAgIGNvbnN0IG9wdHM6IEZsdXhPcHRpb25zID0ge1xuICAgICAgICBuYW1lOiAnZGVtbydcbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgdXBkYXRlIGFwcCBuYW1lIGlmIGluaXRpYWxpemluZyBmb3IgdGhlIGZpcnN0IHRpbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByaXZhdGVJbml0OiBzdHJpbmcgPSAnaXNJbml0JztcbiAgICAgICAgRmx1eFtwcml2YXRlSW5pdF0gPSBmYWxzZTtcblxuICAgICAgICAvLyBNZXRob2RcbiAgICAgICAgYXdhaXQgRmx1eC5pbml0KG9wdHMpO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgICAgZXhwZWN0KEZsdXhbb3B0aW9uc0tleV0ubmFtZSkudG9FcXVhbCgnZGVtbycpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IHVwZGF0ZSBhcHAgbmFtZSBpZiBpbml0aWFsaXppbmcgYWdhaW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByaXZhdGVJbml0OiBzdHJpbmcgPSAnaXNJbml0JztcbiAgICAgICAgRmx1eFtwcml2YXRlSW5pdF0gPSB0cnVlO1xuXG4gICAgICAgIC8vIE1ldGhvZFxuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cyk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc0tleTogc3RyaW5nID0gJ29wdGlvbnMnO1xuICAgICAgICBleHBlY3QoRmx1eFtvcHRpb25zS2V5XS5uYW1lKS50b0VxdWFsKCdhcmtoYW1qc1Rlc3QnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFkZCB3aW5kb3dzIG9iamVjdCBmb3IgZGVidWdnaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBNZXRob2RcbiAgICAgICAgYXdhaXQgRmx1eC5pbml0KHsuLi5vcHRzLCBkZWJ1ZzogdHJ1ZX0pO1xuXG4gICAgICAgIGNvbnN0IGRlYnVnS2V5OiBzdHJpbmcgPSAnYXJraGFtanMnO1xuICAgICAgICBleHBlY3Qod2luZG93W2RlYnVnS2V5XSkudG9FcXVhbChGbHV4KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHVzZSBkZWZhdWx0IG9iamVjdCBpZiB1bmRlZmluZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIE1ldGhvZFxuICAgICAgICBhd2FpdCBGbHV4LnJlc2V0KCk7XG4gICAgICAgIGF3YWl0IEZsdXguaW5pdCgpO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRPcHRpb25zID0ge1xuICAgICAgICAgIG5hbWU6ICdhcmtoYW1qcycsXG4gICAgICAgICAgcm91dGVyVHlwZTogJ2Jyb3dzZXInLFxuICAgICAgICAgIHNjcm9sbFRvVG9wOiB0cnVlLFxuICAgICAgICAgIHN0YXRlOiBudWxsLFxuICAgICAgICAgIHN0b3JhZ2U6IG51bGwsXG4gICAgICAgICAgc3RvcmFnZVdhaXQ6IDMwMCxcbiAgICAgICAgICBzdG9yZXM6IFtdLFxuICAgICAgICAgIHRpdGxlOiAnQXJraGFtSlMnXG4gICAgICAgIH07XG4gICAgICAgIGV4cGVjdChGbHV4W29wdGlvbnNLZXldKS50b0VxdWFsKGV4cGVjdGVkT3B0aW9ucyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZXQgYXBwIG5hbWUgZm9yIGluaXRpYWxpemVkIGFwcCcsICgpID0+IHtcbiAgICAgIC8vIFZhcnNcbiAgICAgIGNvbnN0IG9wdHM6IEZsdXhPcHRpb25zID0ge1xuICAgICAgICBuYW1lOiAnZGVtbydcbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IGFwcCBuYW1lJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVQcm9wZXJ0eTogc3RyaW5nID0gJ29wdGlvbnMnO1xuICAgICAgICBleHBlY3QoRmx1eFtwcml2YXRlUHJvcGVydHldLm5hbWUpLnRvRXF1YWwoJ2RlbW8nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldCBpbml0aWFsIGVtcHR5IHN0YXRlJywgKCkgPT4ge1xuICAgICAgLy8gVmFyc1xuICAgICAgY29uc3Qgb3B0czogRmx1eE9wdGlvbnMgPSB7XG4gICAgICAgIHN0YXRlOiB7fSxcbiAgICAgICAgc3RvcmVzOiBbaGVsbG9TdG9yZV1cbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IHN0YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVQcm9wZXJ0eTogc3RyaW5nID0gJ3N0YXRlJztcbiAgICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKEZsdXhbcHJpdmF0ZVByb3BlcnR5XSkubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IHN0YXRlIGJyYW5jaCBmb3Igc3RvcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IEZsdXguaW5pdChvcHRzLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RhdGUnO1xuICAgICAgICBleHBlY3QoRmx1eFtwcml2YXRlUHJvcGVydHldLmhlbGxvU3RvcmUuaXRlbSkudG9FcXVhbCgnZGVmYXVsdCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2V0IG51bGwgc3RhdGUnLCAoKSA9PiB7XG4gICAgICAvLyBWYXJzXG4gICAgICBjb25zdCBvcHRzOiBGbHV4T3B0aW9ucyA9IHtcbiAgICAgICAgc3RhdGU6IG51bGwsXG4gICAgICAgIHN0b3JlczogW2hlbGxvU3RvcmVdXG4gICAgICB9O1xuXG4gICAgICBpdCgnc2hvdWxkIHNldCBzdGF0ZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgRmx1eC5pbml0KG9wdHMsIHRydWUpO1xuICAgICAgICBjb25zdCBwcml2YXRlUHJvcGVydHk6IHN0cmluZyA9ICdzdGF0ZSc7XG4gICAgICAgIGV4cGVjdChPYmplY3Qua2V5cyhGbHV4W3ByaXZhdGVQcm9wZXJ0eV0pLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHNldCBzdGF0ZSBicmFuY2ggZm9yIHN0b3JlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVQcm9wZXJ0eTogc3RyaW5nID0gJ3N0YXRlJztcbiAgICAgICAgZXhwZWN0KEZsdXhbcHJpdmF0ZVByb3BlcnR5XS5oZWxsb1N0b3JlLml0ZW0pLnRvRXF1YWwoJ2RlZmF1bHQnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldCBkZWZpbmVkIHN0YXRlJywgKCkgPT4ge1xuICAgICAgLy8gVmFyc1xuICAgICAgY29uc3Qgb3B0czogRmx1eE9wdGlvbnMgPSB7XG4gICAgICAgIHN0YXRlOiB7c2Vjb25kOiAndmFsdWUnLCB0ZXN0OiB7aGVsbG86ICd3b3JsZCd9fSxcbiAgICAgICAgc3RvcmVzOiBbaGVsbG9TdG9yZV1cbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IHN0YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVQcm9wZXJ0eTogc3RyaW5nID0gJ3N0YXRlJztcbiAgICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKEZsdXhbcHJpdmF0ZVByb3BlcnR5XSkubGVuZ3RoKS50b0VxdWFsKDMpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IHN0YXRlIGJyYW5jaCBmb3Igc3RvcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IEZsdXguaW5pdChvcHRzLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RhdGUnO1xuICAgICAgICBleHBlY3QoRmx1eFtwcml2YXRlUHJvcGVydHldLnRlc3QuaGVsbG8pLnRvRXF1YWwoJ3dvcmxkJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdtaWRkbGV3YXJlJywgKCkgPT4ge1xuICAgICAgLy8gTWlkZGxld2FyZSBvYmplY3RcbiAgICAgIGNvbnN0IG9iak1pZGRsZXdhcmUgPSB7XG4gICAgICAgIG5hbWU6ICdvYmplY3RNaWRkbGV3YXJlJyxcbiAgICAgICAgcHJlRGlzcGF0Y2g6IChhY3Rpb24pID0+ICh7Li4uYWN0aW9ufSlcbiAgICAgIH07XG5cbiAgICAgIC8vIFZhcnNcbiAgICAgIGNvbnN0IG9wdHM6IEZsdXhPcHRpb25zID0ge1xuICAgICAgICBtaWRkbGV3YXJlOiBbb2JqTWlkZGxld2FyZV0sXG4gICAgICAgIG5hbWU6ICdkZW1vJyxcbiAgICAgICAgc3RvcmVzOiBbaGVsbG9TdG9yZV1cbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgYWRkIG1pZGRsZXdhcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IEZsdXguaW5pdChvcHRzLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnbWlkZGxld2FyZSc7XG4gICAgICAgIGV4cGVjdChGbHV4W3ByaXZhdGVQcm9wZXJ0eV0ucHJlRGlzcGF0Y2hMaXN0WzBdLm5hbWUpLnRvRXF1YWwoJ29iamVjdE1pZGRsZXdhcmUnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Vycm9yIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgdXNlU3RvcmFnZSBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgRmx1eC51c2VTdG9yYWdlID0gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCd0ZXN0JykpO1xuICAgICAgICBhd2FpdCBleHBlY3QoRmx1eC5pbml0KGNmZywgdHJ1ZSkpLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgYWRkU3RvcmVzIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBGbHV4LmFkZFN0b3JlcyA9IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigndGVzdCcpKTtcbiAgICAgICAgYXdhaXQgZXhwZWN0KEZsdXguaW5pdChjZmcsIHRydWUpKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdldmVudCBsaXN0ZW5lcnMnLCAoKSA9PiB7XG4gICAgbGV0IGV2ZW50U3B5O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBldmVudFNweSA9IGplc3QuZm4oKTtcbiAgICAgIEZsdXgub24oJ3Rlc3QnLCBldmVudFNweSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnI29uJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBhZGQgYSBsaXN0ZW5lcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgRmx1eC5kaXNwYXRjaCh7dHlwZTogJ3Rlc3QnfSk7XG4gICAgICAgIGV4cGVjdChldmVudFNweS5tb2NrLmNhbGxzLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJyNvZmYnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHJlbW92ZSBhIGxpc3RlbmVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBGbHV4Lm9mZigndGVzdCcsIGV2ZW50U3B5KTtcbiAgICAgICAgYXdhaXQgRmx1eC5kaXNwYXRjaCh7dHlwZTogJ3Rlc3QnfSk7XG5cbiAgICAgICAgZXhwZWN0KGV2ZW50U3B5Lm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjYWRkU3RvcmVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGRlbW8gPSAodHlwZSwgZGF0YSwgc3RhdGUgPSB7aGVsbG9TdG9yZTogJ2pva2VyJ30pID0+IHtcbiAgICAgIGlmKHR5cGUgPT09ICdERU1PX1RFU1QnKSB7XG4gICAgICAgIHN0YXRlLmhlbGxvU3RvcmUgPSBkYXRhLmhlbGxvU3RvcmU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9O1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgYW5kIHNhdmUgYSBTdG9yZSBjbGFzcycsICgpID0+IHtcbiAgICAgIEZsdXguYWRkU3RvcmVzKFtkZW1vXSk7XG4gICAgICBjb25zdCBwcml2YXRlUHJvcGVydHk6IHN0cmluZyA9ICdzdG9yZUFjdGlvbnMnO1xuICAgICAgY29uc3Qgc3RvcmVBY3Rpb246IEZsdXhTdG9yZSA9IEZsdXhbcHJpdmF0ZVByb3BlcnR5XS5kZW1vO1xuICAgICAgZXhwZWN0KHN0b3JlQWN0aW9uLm5hbWUpLnRvRXF1YWwoJ2RlbW8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGluaXRpYWwgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBGbHV4LmFkZFN0b3JlcyhbZGVtb10pO1xuICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RvcmVBY3Rpb25zJztcbiAgICAgIGNvbnN0IHN0b3JlQWN0aW9uOiBGbHV4U3RvcmUgPSBGbHV4W3ByaXZhdGVQcm9wZXJ0eV0uZGVtbztcbiAgICAgIGV4cGVjdChzdG9yZUFjdGlvbi5pbml0aWFsU3RhdGUpLnRvRXF1YWwoe2hlbGxvU3RvcmU6ICdqb2tlcid9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVuc3VwcG9ydGVkIHN0b3JlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgIGNvbnN0IHNldFN0b3JhZ2VEYXRhID0gbmV3IEVycm9yKCd0ZXN0Jyk7XG4gICAgICBGbHV4W29wdGlvbnNLZXldLnN0b3JhZ2UgPSB7c2V0U3RvcmFnZURhdGF9O1xuXG4gICAgICBGbHV4LmFkZFN0b3JlcyhbZGVtb10pO1xuICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RvcmVBY3Rpb25zJztcbiAgICAgIGNvbnN0IHN0b3JlQWN0aW9uOiBGbHV4U3RvcmUgPSBGbHV4W3ByaXZhdGVQcm9wZXJ0eV0uZGVtbztcbiAgICAgIGV4cGVjdChzdG9yZUFjdGlvbi5pbml0aWFsU3RhdGUpLnRvRXF1YWwoe2hlbGxvU3RvcmU6ICdqb2tlcid9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNvZmZJbml0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGxpc3RlbmVyIGFmdGVyIGluaXRpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBqZXN0LmZuKCk7XG4gICAgICBGbHV4Lm9mZiA9IGplc3QuZm4oKTtcbiAgICAgIEZsdXgub2ZmSW5pdChsaXN0ZW5lcik7XG4gICAgICBleHBlY3QoRmx1eC5vZmYubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoRmx1eC5vZmYubW9jay5jYWxsc1swXVswXSkudG9FcXVhbChBcmtoYW1Db25zdGFudHMuSU5JVCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjb25Jbml0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWRkIGxpc3RlbmVyIGFmdGVyIGluaXRpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBqZXN0LmZuKCk7XG4gICAgICBGbHV4LmlzSW5pdCA9IGZhbHNlO1xuICAgICAgRmx1eC5vbiA9IGplc3QuZm4oKTtcbiAgICAgIEZsdXgub25Jbml0KGxpc3RlbmVyKTtcbiAgICAgIGV4cGVjdChGbHV4Lm9uLm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgICAgZXhwZWN0KEZsdXgub24ubW9jay5jYWxsc1swXVswXSkudG9FcXVhbChBcmtoYW1Db25zdGFudHMuSU5JVCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRpc3BhdGNoIGluc3RhbnRseSBpZiBhbHJlYWR5IGluaXRpYWxpemVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBqZXN0LmZuKCk7XG4gICAgICBGbHV4LmlzSW5pdCA9IHRydWU7XG4gICAgICBGbHV4Lm9uSW5pdChsaXN0ZW5lcik7XG4gICAgICBleHBlY3QobGlzdGVuZXIubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjcmVnaXN0ZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZWdpc3RlciBhIHN0b3JlIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVtb1N0b3JlID0gKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUgPSBpbml0aWFsU3RhdGUpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ1RFU1RfRVZFTlQnOlxuICAgICAgICAgICAgcmV0dXJuIHNldCgndGVzdEFjdGlvbicsIGRhdGEudGVzdFZhciwgc3RhdGUpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlZ2lzdGVyS2V5OiBzdHJpbmcgPSAncmVnaXN0ZXInO1xuICAgICAgY29uc3Qgc3RvcmVBY3Rpb24gPSBGbHV4W3JlZ2lzdGVyS2V5XShkZW1vU3RvcmUpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogZGVtb1N0b3JlLFxuICAgICAgICBpbml0aWFsU3RhdGUsXG4gICAgICAgIG5hbWU6ICdkZW1vU3RvcmUnXG4gICAgICB9O1xuICAgICAgZXhwZWN0KHN0b3JlQWN0aW9uKS50b0VxdWFsKGV4cGVjdGVkQWN0aW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVnaXN0ZXIgYSBzdG9yZSBmdW5jdGlvbiB3aXRob3V0IGFuIGluaXRpYWwgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZW1vU3RvcmUgPSAodHlwZTogc3RyaW5nLCBkYXRhLCBzdGF0ZSk6IGFueSA9PiB7XG4gICAgICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgICAgY2FzZSAnVEVTVF9FVkVOVCc6XG4gICAgICAgICAgICByZXR1cm4gc2V0KCd0ZXN0QWN0aW9uJywgZGF0YS50ZXN0VmFyLCBzdGF0ZSk7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVnaXN0ZXJLZXk6IHN0cmluZyA9ICdyZWdpc3Rlcic7XG4gICAgICBjb25zdCBzdG9yZUFjdGlvbiA9IEZsdXhbcmVnaXN0ZXJLZXldKGRlbW9TdG9yZSk7XG4gICAgICBjb25zdCBleHBlY3RlZEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiBkZW1vU3RvcmUsXG4gICAgICAgIGluaXRpYWxTdGF0ZTogdW5kZWZpbmVkLFxuICAgICAgICBuYW1lOiAnZGVtb1N0b3JlJ1xuICAgICAgfTtcbiAgICAgIGV4cGVjdChzdG9yZUFjdGlvbikudG9FcXVhbChleHBlY3RlZEFjdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBzYXZlIGEgc3RvcmUgZnVuY3Rpb24gd2l0aG91dCBhIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcktleTogc3RyaW5nID0gJ3JlZ2lzdGVyJztcbiAgICAgIGNvbnN0IHN0b3JlQWN0aW9uID0gRmx1eFtyZWdpc3RlcktleV0oKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUgPSBpbml0aWFsU3RhdGUpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ1RFU1RfRVZFTlQnOlxuICAgICAgICAgICAgcmV0dXJuIHNldCgndGVzdEFjdGlvbicsIGRhdGEudGVzdFZhciwgc3RhdGUpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHN0b3JlQWN0aW9uKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB1bmRlZmluZWQgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcktleTogc3RyaW5nID0gJ3JlZ2lzdGVyJztcblxuICAgICAgY29uc3QgZm4gPSAoKSA9PiBGbHV4W3JlZ2lzdGVyS2V5XSgpO1xuICAgICAgZXhwZWN0KGZuKS50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGFyZ3VtZW50IHRoYXQgaXMgbm90IGEgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcktleTogc3RyaW5nID0gJ3JlZ2lzdGVyJztcblxuICAgICAgY29uc3QgZm4gPSAoKSA9PiBGbHV4W3JlZ2lzdGVyS2V5XSh7fSk7XG4gICAgICBleHBlY3QoZm4pLnRvVGhyb3dFcnJvcigpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnI3JlbW92ZU1pZGRsZXdhcmUnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBGbHV4LmNsZWFyTWlkZGxld2FyZSgpO1xuXG4gICAgICAvLyBBZGQgb2JqZWN0IG1pZGRsZXdhcmVcbiAgICAgIGNvbnN0IG9iak1pZGRsZXdhcmUgPSB7XG4gICAgICAgIG5hbWU6ICdvYmplY3RNaWRkbGV3YXJlJyxcbiAgICAgICAgcHJlRGlzcGF0Y2g6IChhY3Rpb24pID0+ICh7Li4uYWN0aW9ufSlcbiAgICAgIH07XG5cbiAgICAgIEZsdXguYWRkTWlkZGxld2FyZShbb2JqTWlkZGxld2FyZV0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbHRlciBkYXRhIGJlZm9yZSBzZW5kaW5nIHRvIHN0b3JlcycsICgpID0+IHtcbiAgICAgIEZsdXgucmVtb3ZlTWlkZGxld2FyZShbJ29iamVjdE1pZGRsZXdhcmUnXSk7XG4gICAgICBjb25zdCBwcml2YXRlUHJvcGVydHk6IHN0cmluZyA9ICdtaWRkbGV3YXJlJztcbiAgICAgIGV4cGVjdChGbHV4W3ByaXZhdGVQcm9wZXJ0eV0ucHJlRGlzcGF0Y2hMaXN0Lmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNyZW1vdmVQbHVnaW4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgYW4gZXhpc3RpbmcgcGx1Z2luJywgKCkgPT4ge1xuICAgICAgRmx1eC5taWRkbGV3YXJlLnByZURpc3BhdGNoTGlzdCA9IFt7bmFtZTogJ2RlbW9QbHVnaW4nfSwge25hbWU6ICdub05vdFJlbW92ZVBsdWdpbid9XTtcbiAgICAgIGV4cGVjdChGbHV4LnJlbW92ZVBsdWdpbigncHJlRGlzcGF0Y2gnLCAnZGVtb1BsdWdpbicpKS50b0VxdWFsKFt7bmFtZTogJ25vTm90UmVtb3ZlUGx1Z2luJ31dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IGFuIHVuZGVmaW5lZCBsaXN0JywgKCkgPT4ge1xuICAgICAgRmx1eC5taWRkbGV3YXJlLnByZURpc3BhdGNoTGlzdCA9IG51bGw7XG4gICAgICBleHBlY3QoRmx1eC5yZW1vdmVQbHVnaW4oJ3ByZURpc3BhdGNoJywgJ2RlbW9QbHVnaW4nKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjcmVtb3ZlU3RvcmVzJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgLy8gTWV0aG9kXG4gICAgICBGbHV4LnJlbW92ZVN0b3JlcyhbJ2hlbGxvU3RvcmUnXSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgRmx1eC5hZGRTdG9yZXMoW2hlbGxvU3RvcmVdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGNsYXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RvcmVBY3Rpb25zJztcbiAgICAgIGV4cGVjdCghIUZsdXhbcHJpdmF0ZVByb3BlcnR5XS5oZWxsb1N0b3JlKS50b0VxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVtb3ZlIHN0b3JlIGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcml2YXRlUHJvcGVydHk6IHN0cmluZyA9ICdzdGF0ZSc7XG4gICAgICBleHBlY3QoISFGbHV4W3ByaXZhdGVQcm9wZXJ0eV0uaGVsbG9TdG9yZSkudG9FcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjcmVzZXQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYXJndW1lbnQgdGhhdCBpcyBub3QgYSBmdW5jdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgIGNvbnN0IHNldFN0b3JhZ2VEYXRhID0gbmV3IEVycm9yKCd0ZXN0Jyk7XG4gICAgICBGbHV4W29wdGlvbnNLZXldLnN0b3JhZ2UgPSB7c2V0U3RvcmFnZURhdGF9O1xuICAgICAgYXdhaXQgZXhwZWN0KEZsdXgucmVzZXQoKSkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNzZXRTdGF0ZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHVwZGF0ZSB0aGUgcHJvcGVydHkgd2l0aGluIHRoZSBzdG9yZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IEZsdXguc2V0U3RhdGUoJ2hlbGxvU3RvcmUudGVzdFVwZGF0ZScsICd0ZXN0Jyk7XG4gICAgICBjb25zdCBuZXdJdGVtID0gYXdhaXQgRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0VXBkYXRlJyk7XG4gICAgICBleHBlY3QobmV3SXRlbSkudG9FcXVhbCgndGVzdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbXB0eSBzdHJpbmcgYXMgZGVmYXVsdCBwYXRoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgRmx1eC5zZXRTdGF0ZSh1bmRlZmluZWQsICd0ZXN0Jyk7XG4gICAgICBjb25zdCBuZXdJdGVtID0gYXdhaXQgRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZScpO1xuICAgICAgZXhwZWN0KG5ld0l0ZW0pLnRvRXF1YWwoaW5pdGlhbFN0YXRlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXBkYXRlIHN0b3JhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zS2V5OiBzdHJpbmcgPSAnb3B0aW9ucyc7XG4gICAgICBjb25zdCB1cGRhdGVTdG9yYWdlS2V5OiBzdHJpbmcgPSAndXBkYXRlU3RvcmFnZSc7XG4gICAgICBjb25zdCB1cGRhdGVTdG9yYWdlID0gamVzdC5mbigpO1xuICAgICAgRmx1eFtvcHRpb25zS2V5XSA9IHtzdG9yYWdlOiB7fX07XG4gICAgICBGbHV4W3VwZGF0ZVN0b3JhZ2VLZXldID0gdXBkYXRlU3RvcmFnZTtcbiAgICAgIGF3YWl0IEZsdXguc2V0U3RhdGUoJ2hlbGxvU3RvcmUudGVzdFVwZGF0ZScsICd0ZXN0Jyk7XG4gICAgICBleHBlY3QodXBkYXRlU3RvcmFnZS5tb2NrLmNhbGxzLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyN1c2VTdG9yYWdlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdXBkYXRlIHN0b3JhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBnZXRTdG9yYWdlRGF0YSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgIEZsdXhbb3B0aW9uc0tleV0uc3RhdGUgPSBudWxsO1xuICAgICAgRmx1eFtvcHRpb25zS2V5XS5zdG9yYWdlID0ge2dldFN0b3JhZ2VEYXRhfTtcblxuICAgICAgY29uc3QgdXNlU3RvcmFnZUtleTogc3RyaW5nID0gJ3VzZVN0b3JhZ2UnO1xuICAgICAgYXdhaXQgRmx1eFt1c2VTdG9yYWdlS2V5XSgnaGVsbG9TdG9yZScpO1xuXG4gICAgICBleHBlY3QoZ2V0U3RvcmFnZURhdGEubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2l0aG91dCBzdG9yYWdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uc0tleTogc3RyaW5nID0gJ29wdGlvbnMnO1xuICAgICAgRmx1eFtvcHRpb25zS2V5XS5zdGF0ZSA9IHtoZWxsbzogJ3dvcmxkJ307XG4gICAgICBGbHV4W29wdGlvbnNLZXldLnN0b3JhZ2UgPSBudWxsO1xuXG4gICAgICBjb25zdCB1c2VTdG9yYWdlS2V5OiBzdHJpbmcgPSAndXNlU3RvcmFnZSc7XG4gICAgICBhd2FpdCBGbHV4W3VzZVN0b3JhZ2VLZXldKCdoZWxsb1N0b3JlJyk7XG5cbiAgICAgIGNvbnN0IHN0YXRlS2V5OiBzdHJpbmcgPSAnc3RhdGUnO1xuICAgICAgZXhwZWN0KEZsdXhbc3RhdGVLZXldLmhlbGxvKS50b0VxdWFsKCd3b3JsZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc3RvcmFnZSBlcnJvcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zS2V5OiBzdHJpbmcgPSAnb3B0aW9ucyc7XG4gICAgICBGbHV4W29wdGlvbnNLZXldLnN0YXRlID0gbnVsbDtcbiAgICAgIEZsdXhbb3B0aW9uc0tleV0uc3RvcmFnZSA9IG5ldyBFcnJvcigndGVzdCcpO1xuXG4gICAgICBjb25zdCB1c2VTdG9yYWdlS2V5OiBzdHJpbmcgPSAndXNlU3RvcmFnZSc7XG4gICAgICBhd2FpdCBleHBlY3QoRmx1eFt1c2VTdG9yYWdlS2V5XSgnaGVsbG9TdG9yZScpKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWJvdW5jZSBzdG9yYWdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyA9ICd0ZXN0JztcbiAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgIEZsdXhbb3B0aW9uc0tleV0uc3RhdGUgPSB7aGVsbG86ICd3b3JsZCd9O1xuXG4gICAgICBjb25zdCBzZXRTdG9yYWdlRGF0YSA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUodmFsdWUpO1xuICAgICAgRmx1eFtvcHRpb25zS2V5XS5zdG9yYWdlID0ge3NldFN0b3JhZ2VEYXRhfTtcblxuICAgICAgY29uc3QgZGVib3VuY2VNb2NrOiBhbnkgPSBkZWJvdW5jZTtcbiAgICAgIGRlYm91bmNlTW9jay5tb2NrSW1wbGVtZW50YXRpb24oKGZuKSA9PiBmbigpKTtcblxuICAgICAgY29uc3QgdXNlU3RvcmFnZUtleTogc3RyaW5nID0gJ3VzZVN0b3JhZ2UnO1xuICAgICAgYXdhaXQgRmx1eFt1c2VTdG9yYWdlS2V5XSgnaGVsbG9TdG9yZScpO1xuXG4gICAgICBleHBlY3Qoc2V0U3RvcmFnZURhdGEubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7QUFJQSxzQkFBcUI7QUFDckIsdUJBQXNCO0FBQ3RCLGlCQUFnQjtBQUVoQiw2QkFBOEI7QUFDOUIsa0JBQTRCO0FBRzVCLEtBQUssS0FBSyxpQkFBaUI7QUFFM0IsTUFBTSxlQUFlO0FBQUEsRUFDbkIsT0FBTztBQUFBLEVBQ1AsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBLEVBQ1osV0FBVztBQUNiO0FBRUEsTUFBTSxhQUFhLENBQUMsTUFBYyxNQUFNLFFBQVEsaUJBQXNCO0FBQ3BFLFVBQU87QUFBQSxTQUNBO0FBQ0gsYUFBTyx3QkFBSSxjQUFjLEtBQUssU0FBUyxLQUFLO0FBQUE7QUFFNUMsYUFBTztBQUFBO0FBRWI7QUFFQSxTQUFTLFFBQVEsTUFBTTtBQUNyQixRQUFNLGVBQWUsUUFBUTtBQUM3QixRQUFNLGNBQWMsUUFBUTtBQUM1QixRQUFNLE1BQW1CO0FBQUEsSUFDdkIsTUFBTTtBQUFBLElBQ04sUUFBUSxDQUFDLFVBQVU7QUFBQSxFQUNyQjtBQUNBLE1BQUk7QUFFSixZQUFVLE1BQU07QUFDZCxZQUFRLFFBQVEsS0FBSyxHQUFHO0FBQ3hCLFlBQVEsT0FB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
|
package/lib/Flux/Flux.types.js
CHANGED
@@ -1,4 +1,16 @@
|
|
1
1
|
var __defProp = Object.defineProperty;
|
2
|
-
var
|
3
|
-
|
4
|
-
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
5
|
+
var __copyProps = (to, from, except, desc) => {
|
6
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
7
|
+
for (let key of __getOwnPropNames(from))
|
8
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
9
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
10
|
+
}
|
11
|
+
return to;
|
12
|
+
};
|
13
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
14
|
+
var Flux_types_exports = {};
|
15
|
+
module.exports = __toCommonJS(Flux_types_exports);
|
16
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50eXBlcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmx1eE9wdGlvbnMge1xuICByZWFkb25seSBiYXNlbmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGV4dD86IG9iamVjdDtcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBnZXRVc2VyQ29uZmlybWF0aW9uPzogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgaGFzaFR5cGU/OiAnc2xhc2gnIHwgJ25vc2xhc2gnIHwgJ2hhc2hiYW5nJztcbiAgcmVhZG9ubHkgaGlzdG9yeT86IG9iamVjdDtcbiAgcmVhZG9ubHkgaW5pdGlhbEVudHJpZXM/OiBhbnlbXTtcbiAgcmVhZG9ubHkgaW5pdGlhbEluZGV4PzogbnVtYmVyO1xuICByZWFkb25seSBrZXlMZW5ndGg/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogc3RyaW5nIHwgb2JqZWN0O1xuICByZWFkb25seSBtaWRkbGV3YXJlPzogRmx1eE1pZGRsZXdhcmVUeXBlW107XG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvdXRlclR5cGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjcm9sbFRvVG9wPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RhdGU/OiBhbnk7XG4gIHJlYWRvbmx5IHN0b3JhZ2U/OiBGbHV4U3RvcmFnZVR5cGU7XG4gIHJlYWRvbmx5IHN0b3JhZ2VXYWl0PzogbnVtYmVyO1xuICByZWFkb25seSBzdG9yZXM/OiBhbnlbXTtcbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmx1eEFjdGlvbiB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IGFueTtcbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsdXhTdG9yYWdlVHlwZSB7XG4gIHJlYWRvbmx5IGdldFN0b3JhZ2VEYXRhOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgcmVhZG9ubHkgc2V0U3RvcmFnZURhdGE6IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbHV4U3RvcmUge1xuICByZWFkb25seSBhY3Rpb246ICh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSwgc3RhdGU6IGFueSkgPT4gYW55O1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGluaXRpYWxTdGF0ZTogYW55O1xufVxuXG5leHBvcnQgdHlwZSBGbHV4UGx1Z2luTWV0aG9kVHlwZSA9IChhY3Rpb246IEZsdXhBY3Rpb24sIHN0b3JlOiBvYmplY3QsIGFwcERhdGE/OiBvYmplY3QpID0+IFByb21pc2U8Rmx1eEFjdGlvbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmx1eE1pZGRsZXdhcmVUeXBlIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwcmVEaXNwYXRjaD86IEZsdXhQbHVnaW5NZXRob2RUeXBlO1xuICByZWFkb25seSBwb3N0RGlzcGF0Y2g/OiBGbHV4UGx1Z2luTWV0aG9kVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbHV4UGx1Z2luVHlwZSB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbWV0aG9kOiBGbHV4UGx1Z2luTWV0aG9kVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckNvbnN0cnVjdG9yIHtcbiAgY2FwdHVyZVN0YWNrVHJhY2UodGhpc0FyZzogYW55LCBmdW5jOiBhbnkpOiB2b2lkXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTsiLAogICJuYW1lcyI6IFtdCn0K
|
@@ -1,13 +1,25 @@
|
|
1
1
|
var __defProp = Object.defineProperty;
|
2
|
-
var
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
3
5
|
var __export = (target, all) => {
|
4
6
|
for (var name in all)
|
5
|
-
__defProp(target, name, {get: all[name], enumerable: true});
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
6
8
|
};
|
7
|
-
|
8
|
-
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
11
|
+
for (let key of __getOwnPropNames(from))
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
14
|
+
}
|
15
|
+
return to;
|
16
|
+
};
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
18
|
+
var ArkhamConstants_exports = {};
|
19
|
+
__export(ArkhamConstants_exports, {
|
9
20
|
ArkhamConstants: () => ArkhamConstants
|
10
21
|
});
|
22
|
+
module.exports = __toCommonJS(ArkhamConstants_exports);
|
11
23
|
class ArkhamConstants {
|
12
24
|
}
|
13
25
|
ArkhamConstants.GO_BACK = "ARKHAM_GO_BACK";
|
@@ -20,4 +32,4 @@ ArkhamConstants.UPDATE_VIEW = "ARKHAM_UPDATE_VIEW";
|
|
20
32
|
0 && (module.exports = {
|
21
33
|
ArkhamConstants
|
22
34
|
});
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
35
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnN0YW50cy9BcmtoYW1Db25zdGFudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbmV4cG9ydCBjbGFzcyBBcmtoYW1Db25zdGFudHMge1xuICBzdGF0aWMgcmVhZG9ubHkgR09fQkFDSzogc3RyaW5nID0gJ0FSS0hBTV9HT19CQUNLJztcbiAgc3RhdGljIHJlYWRvbmx5IEdPX1JFUExBQ0U6IHN0cmluZyA9ICdBUktIQU1fR09fUkVQTEFDRSc7XG4gIHN0YXRpYyByZWFkb25seSBHT1RPOiBzdHJpbmcgPSAnQVJLSEFNX0dPVE8nO1xuICBzdGF0aWMgcmVhZG9ubHkgSU5JVDogc3RyaW5nID0gJ0FSS0hBTV9JTklUJztcbiAgc3RhdGljIHJlYWRvbmx5IFVQREFURV9USVRMRTogc3RyaW5nID0gJ0FSS0hBTV9VUERBVEVfVElUTEUnO1xuICBzdGF0aWMgcmVhZG9ubHkgVVBEQVRFX1ZJRVc6IHN0cmluZyA9ICdBUktIQU1fVVBEQVRFX1ZJRVcnO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS08sTUFBTSxnQkFBZ0I7QUFPN0I7QUFORSxBQURXLGdCQUNLLFVBQWtCO0FBQ2xDLEFBRlcsZ0JBRUssYUFBcUI7QUFDckMsQUFIVyxnQkFHSyxPQUFlO0FBQy9CLEFBSlcsZ0JBSUssT0FBZTtBQUMvQixBQUxXLGdCQUtLLGVBQXVCO0FBQ3ZDLEFBTlcsZ0JBTUssY0FBc0I7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
package/lib/index.js
CHANGED
@@ -1,38 +1,35 @@
|
|
1
|
-
var __create = Object.create;
|
2
1
|
var __defProp = Object.defineProperty;
|
3
2
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
3
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
6
4
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
7
|
-
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
8
5
|
var __export = (target, all) => {
|
9
6
|
for (var name in all)
|
10
|
-
__defProp(target, name, {get: all[name], enumerable: true});
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
11
8
|
};
|
12
|
-
var
|
13
|
-
if (
|
14
|
-
for (let key of __getOwnPropNames(
|
15
|
-
if (!__hasOwnProp.call(
|
16
|
-
__defProp(
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
11
|
+
for (let key of __getOwnPropNames(from))
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
17
14
|
}
|
18
|
-
return
|
15
|
+
return to;
|
19
16
|
};
|
20
|
-
var
|
21
|
-
|
22
|
-
};
|
23
|
-
|
24
|
-
__export(exports, {
|
17
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
19
|
+
var src_exports = {};
|
20
|
+
__export(src_exports, {
|
25
21
|
ArkhamConstants: () => import_ArkhamConstants.ArkhamConstants,
|
26
22
|
Flux: () => import_Flux.Flux,
|
27
23
|
FluxFramework: () => import_Flux.FluxFramework
|
28
24
|
});
|
29
|
-
|
30
|
-
var
|
31
|
-
|
25
|
+
module.exports = __toCommonJS(src_exports);
|
26
|
+
var import_ArkhamConstants = require("./constants/ArkhamConstants");
|
27
|
+
var import_Flux = require("./Flux/Flux");
|
28
|
+
__reExport(src_exports, require("./Flux/Flux.types"), module.exports);
|
32
29
|
// Annotate the CommonJS export names for ESM import in node:
|
33
30
|
0 && (module.exports = {
|
34
31
|
ArkhamConstants,
|
35
32
|
Flux,
|
36
33
|
FluxFramework
|
37
34
|
});
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
35
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtBcmtoYW1Db25zdGFudHN9IGZyb20gJy4vY29uc3RhbnRzL0Fya2hhbUNvbnN0YW50cyc7XG5pbXBvcnQge0ZsdXgsIEZsdXhGcmFtZXdvcmt9IGZyb20gJy4vRmx1eC9GbHV4JztcblxuZXhwb3J0ICogZnJvbSAnLi9GbHV4L0ZsdXgudHlwZXMnO1xuZXhwb3J0IHtBcmtoYW1Db25zdGFudHMsIEZsdXgsIEZsdXhGcmFtZXdvcmt9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQSw2QkFBOEI7QUFDOUIsa0JBQWtDO0FBRWxDLHdCQUFjLDhCQVBkOyIsCiAgIm5hbWVzIjogW10KfQo=
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nlabs/arkhamjs",
|
3
|
-
"version": "3.
|
3
|
+
"version": "3.24.0",
|
4
4
|
"publishConfig": {
|
5
5
|
"access": "public"
|
6
6
|
},
|
@@ -30,7 +30,7 @@
|
|
30
30
|
},
|
31
31
|
"homepage": "https://arkhamjs.io",
|
32
32
|
"bugs": {
|
33
|
-
"url": "nitrogenlabs/arkhamjs/issues"
|
33
|
+
"url": "https://github.com/nitrogenlabs/arkhamjs/issues"
|
34
34
|
},
|
35
35
|
"scripts": {
|
36
36
|
"build": "lex compile -r",
|
@@ -41,19 +41,18 @@
|
|
41
41
|
"update": "lex update -i"
|
42
42
|
},
|
43
43
|
"dependencies": {
|
44
|
-
"
|
45
|
-
"error-stack-parser": "^2.0.6",
|
44
|
+
"error-stack-parser": "^2.0.7",
|
46
45
|
"events": "^3.3.0",
|
47
46
|
"lodash": "^4.17.21"
|
48
47
|
},
|
49
48
|
"devDependencies": {
|
50
49
|
"@types/events": "^3.0.0",
|
51
|
-
"@types/jest": "^
|
52
|
-
"@types/lodash": "^4.14.
|
53
|
-
"@types/node": "^
|
54
|
-
"eslint": "^
|
55
|
-
"eslint-config-styleguidejs": "^1.
|
56
|
-
"typescript": "^4.
|
50
|
+
"@types/jest": "^28.1.4",
|
51
|
+
"@types/lodash": "^4.14.178",
|
52
|
+
"@types/node": "^18.0.3",
|
53
|
+
"eslint": "^8.19.0",
|
54
|
+
"eslint-config-styleguidejs": "^2.1.2",
|
55
|
+
"typescript": "^4.5.5"
|
57
56
|
},
|
58
|
-
"gitHead": "
|
57
|
+
"gitHead": "00d9ba3197abda87d27d6505d8002ccb3e622116"
|
59
58
|
}
|