@milkio/vite-plugin-milkio 1.3.39 → 1.3.41
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/index.js +37 -13
- package/package.json +4 -1
- package/chunk-0n8pdns7.js +0 -10
- package/chunk-3k49pqb5.js +0 -2372
- package/chunk-50hnq58q.js +0 -6822
- package/chunk-53gf2b22.js +0 -7
- package/chunk-716p476m.js +0 -18382
- package/chunk-8prfxy1y.js +0 -6083
- package/chunk-bxrexwh3.js +0 -963
- package/chunk-d85ypywj.js +0 -38
- package/chunk-dcm40dpy.js +0 -6984
- package/chunk-e6wvfs61.js +0 -22
- package/chunk-grxb9rka.js +0 -397
- package/chunk-hnjvhpbj.js +0 -6837
- package/chunk-tqpznpdp.js +0 -5411
- package/chunk-tvwsh3py.js +0 -533
- package/chunk-wp73r5y8.js +0 -7115
- package/chunk-x2ktqdp2.js +0 -67
- package/chunk-ywkaz8jz.js +0 -834
package/chunk-3k49pqb5.js
DELETED
|
@@ -1,2372 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
__commonJS,
|
|
3
|
-
__require,
|
|
4
|
-
__toESM
|
|
5
|
-
} from "./chunk-d85ypywj.js";
|
|
6
|
-
|
|
7
|
-
// node_modules/esbuild/lib/main.js
|
|
8
|
-
var require_main = __commonJS((exports, module) => {
|
|
9
|
-
var __dirname = "/home/runner/work/milkio/milkio/node_modules/esbuild/lib", __filename = "/home/runner/work/milkio/milkio/node_modules/esbuild/lib/main.js";
|
|
10
|
-
var __defProp = Object.defineProperty;
|
|
11
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
13
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
-
var __export = (target, all) => {
|
|
15
|
-
for (var name in all)
|
|
16
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
-
};
|
|
18
|
-
var __copyProps = (to, from, except, desc) => {
|
|
19
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
-
for (let key of __getOwnPropNames(from))
|
|
21
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
-
}
|
|
24
|
-
return to;
|
|
25
|
-
};
|
|
26
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
-
var node_exports = {};
|
|
28
|
-
__export(node_exports, {
|
|
29
|
-
analyzeMetafile: () => analyzeMetafile,
|
|
30
|
-
analyzeMetafileSync: () => analyzeMetafileSync,
|
|
31
|
-
build: () => build,
|
|
32
|
-
buildSync: () => buildSync,
|
|
33
|
-
context: () => context,
|
|
34
|
-
default: () => node_default,
|
|
35
|
-
formatMessages: () => formatMessages,
|
|
36
|
-
formatMessagesSync: () => formatMessagesSync,
|
|
37
|
-
initialize: () => initialize,
|
|
38
|
-
stop: () => stop,
|
|
39
|
-
transform: () => transform,
|
|
40
|
-
transformSync: () => transformSync,
|
|
41
|
-
version: () => version
|
|
42
|
-
});
|
|
43
|
-
module.exports = __toCommonJS(node_exports);
|
|
44
|
-
function encodePacket(packet) {
|
|
45
|
-
let visit = (value) => {
|
|
46
|
-
if (value === null) {
|
|
47
|
-
bb.write8(0);
|
|
48
|
-
} else if (typeof value === "boolean") {
|
|
49
|
-
bb.write8(1);
|
|
50
|
-
bb.write8(+value);
|
|
51
|
-
} else if (typeof value === "number") {
|
|
52
|
-
bb.write8(2);
|
|
53
|
-
bb.write32(value | 0);
|
|
54
|
-
} else if (typeof value === "string") {
|
|
55
|
-
bb.write8(3);
|
|
56
|
-
bb.write(encodeUTF8(value));
|
|
57
|
-
} else if (value instanceof Uint8Array) {
|
|
58
|
-
bb.write8(4);
|
|
59
|
-
bb.write(value);
|
|
60
|
-
} else if (value instanceof Array) {
|
|
61
|
-
bb.write8(5);
|
|
62
|
-
bb.write32(value.length);
|
|
63
|
-
for (let item of value) {
|
|
64
|
-
visit(item);
|
|
65
|
-
}
|
|
66
|
-
} else {
|
|
67
|
-
let keys = Object.keys(value);
|
|
68
|
-
bb.write8(6);
|
|
69
|
-
bb.write32(keys.length);
|
|
70
|
-
for (let key of keys) {
|
|
71
|
-
bb.write(encodeUTF8(key));
|
|
72
|
-
visit(value[key]);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
let bb = new ByteBuffer;
|
|
77
|
-
bb.write32(0);
|
|
78
|
-
bb.write32(packet.id << 1 | +!packet.isRequest);
|
|
79
|
-
visit(packet.value);
|
|
80
|
-
writeUInt32LE(bb.buf, bb.len - 4, 0);
|
|
81
|
-
return bb.buf.subarray(0, bb.len);
|
|
82
|
-
}
|
|
83
|
-
function decodePacket(bytes) {
|
|
84
|
-
let visit = () => {
|
|
85
|
-
switch (bb.read8()) {
|
|
86
|
-
case 0:
|
|
87
|
-
return null;
|
|
88
|
-
case 1:
|
|
89
|
-
return !!bb.read8();
|
|
90
|
-
case 2:
|
|
91
|
-
return bb.read32();
|
|
92
|
-
case 3:
|
|
93
|
-
return decodeUTF8(bb.read());
|
|
94
|
-
case 4:
|
|
95
|
-
return bb.read();
|
|
96
|
-
case 5: {
|
|
97
|
-
let count = bb.read32();
|
|
98
|
-
let value2 = [];
|
|
99
|
-
for (let i = 0;i < count; i++) {
|
|
100
|
-
value2.push(visit());
|
|
101
|
-
}
|
|
102
|
-
return value2;
|
|
103
|
-
}
|
|
104
|
-
case 6: {
|
|
105
|
-
let count = bb.read32();
|
|
106
|
-
let value2 = {};
|
|
107
|
-
for (let i = 0;i < count; i++) {
|
|
108
|
-
value2[decodeUTF8(bb.read())] = visit();
|
|
109
|
-
}
|
|
110
|
-
return value2;
|
|
111
|
-
}
|
|
112
|
-
default:
|
|
113
|
-
throw new Error("Invalid packet");
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
let bb = new ByteBuffer(bytes);
|
|
117
|
-
let id = bb.read32();
|
|
118
|
-
let isRequest = (id & 1) === 0;
|
|
119
|
-
id >>>= 1;
|
|
120
|
-
let value = visit();
|
|
121
|
-
if (bb.ptr !== bytes.length) {
|
|
122
|
-
throw new Error("Invalid packet");
|
|
123
|
-
}
|
|
124
|
-
return { id, isRequest, value };
|
|
125
|
-
}
|
|
126
|
-
var ByteBuffer = class {
|
|
127
|
-
constructor(buf = new Uint8Array(1024)) {
|
|
128
|
-
this.buf = buf;
|
|
129
|
-
this.len = 0;
|
|
130
|
-
this.ptr = 0;
|
|
131
|
-
}
|
|
132
|
-
_write(delta) {
|
|
133
|
-
if (this.len + delta > this.buf.length) {
|
|
134
|
-
let clone = new Uint8Array((this.len + delta) * 2);
|
|
135
|
-
clone.set(this.buf);
|
|
136
|
-
this.buf = clone;
|
|
137
|
-
}
|
|
138
|
-
this.len += delta;
|
|
139
|
-
return this.len - delta;
|
|
140
|
-
}
|
|
141
|
-
write8(value) {
|
|
142
|
-
let offset = this._write(1);
|
|
143
|
-
this.buf[offset] = value;
|
|
144
|
-
}
|
|
145
|
-
write32(value) {
|
|
146
|
-
let offset = this._write(4);
|
|
147
|
-
writeUInt32LE(this.buf, value, offset);
|
|
148
|
-
}
|
|
149
|
-
write(bytes) {
|
|
150
|
-
let offset = this._write(4 + bytes.length);
|
|
151
|
-
writeUInt32LE(this.buf, bytes.length, offset);
|
|
152
|
-
this.buf.set(bytes, offset + 4);
|
|
153
|
-
}
|
|
154
|
-
_read(delta) {
|
|
155
|
-
if (this.ptr + delta > this.buf.length) {
|
|
156
|
-
throw new Error("Invalid packet");
|
|
157
|
-
}
|
|
158
|
-
this.ptr += delta;
|
|
159
|
-
return this.ptr - delta;
|
|
160
|
-
}
|
|
161
|
-
read8() {
|
|
162
|
-
return this.buf[this._read(1)];
|
|
163
|
-
}
|
|
164
|
-
read32() {
|
|
165
|
-
return readUInt32LE(this.buf, this._read(4));
|
|
166
|
-
}
|
|
167
|
-
read() {
|
|
168
|
-
let length = this.read32();
|
|
169
|
-
let bytes = new Uint8Array(length);
|
|
170
|
-
let ptr = this._read(bytes.length);
|
|
171
|
-
bytes.set(this.buf.subarray(ptr, ptr + length));
|
|
172
|
-
return bytes;
|
|
173
|
-
}
|
|
174
|
-
};
|
|
175
|
-
var encodeUTF8;
|
|
176
|
-
var decodeUTF8;
|
|
177
|
-
var encodeInvariant;
|
|
178
|
-
if (typeof TextEncoder !== "undefined" && typeof TextDecoder !== "undefined") {
|
|
179
|
-
let encoder = new TextEncoder;
|
|
180
|
-
let decoder = new TextDecoder;
|
|
181
|
-
encodeUTF8 = (text) => encoder.encode(text);
|
|
182
|
-
decodeUTF8 = (bytes) => decoder.decode(bytes);
|
|
183
|
-
encodeInvariant = 'new TextEncoder().encode("")';
|
|
184
|
-
} else if (typeof Buffer !== "undefined") {
|
|
185
|
-
encodeUTF8 = (text) => Buffer.from(text);
|
|
186
|
-
decodeUTF8 = (bytes) => {
|
|
187
|
-
let { buffer, byteOffset, byteLength } = bytes;
|
|
188
|
-
return Buffer.from(buffer, byteOffset, byteLength).toString();
|
|
189
|
-
};
|
|
190
|
-
encodeInvariant = 'Buffer.from("")';
|
|
191
|
-
} else {
|
|
192
|
-
throw new Error("No UTF-8 codec found");
|
|
193
|
-
}
|
|
194
|
-
if (!(encodeUTF8("") instanceof Uint8Array))
|
|
195
|
-
throw new Error(`Invariant violation: "${encodeInvariant} instanceof Uint8Array" is incorrectly false
|
|
196
|
-
|
|
197
|
-
This indicates that your JavaScript environment is broken. You cannot use
|
|
198
|
-
esbuild in this environment because esbuild relies on this invariant. This
|
|
199
|
-
is not a problem with esbuild. You need to fix your environment instead.
|
|
200
|
-
`);
|
|
201
|
-
function readUInt32LE(buffer, offset) {
|
|
202
|
-
return buffer[offset++] | buffer[offset++] << 8 | buffer[offset++] << 16 | buffer[offset++] << 24;
|
|
203
|
-
}
|
|
204
|
-
function writeUInt32LE(buffer, value, offset) {
|
|
205
|
-
buffer[offset++] = value;
|
|
206
|
-
buffer[offset++] = value >> 8;
|
|
207
|
-
buffer[offset++] = value >> 16;
|
|
208
|
-
buffer[offset++] = value >> 24;
|
|
209
|
-
}
|
|
210
|
-
var quote = JSON.stringify;
|
|
211
|
-
var buildLogLevelDefault = "warning";
|
|
212
|
-
var transformLogLevelDefault = "silent";
|
|
213
|
-
function validateAndJoinStringArray(values, what) {
|
|
214
|
-
const toJoin = [];
|
|
215
|
-
for (const value of values) {
|
|
216
|
-
validateStringValue(value, what);
|
|
217
|
-
if (value.indexOf(",") >= 0)
|
|
218
|
-
throw new Error(`Invalid ${what}: ${value}`);
|
|
219
|
-
toJoin.push(value);
|
|
220
|
-
}
|
|
221
|
-
return toJoin.join(",");
|
|
222
|
-
}
|
|
223
|
-
var canBeAnything = () => null;
|
|
224
|
-
var mustBeBoolean = (value) => typeof value === "boolean" ? null : "a boolean";
|
|
225
|
-
var mustBeString = (value) => typeof value === "string" ? null : "a string";
|
|
226
|
-
var mustBeRegExp = (value) => value instanceof RegExp ? null : "a RegExp object";
|
|
227
|
-
var mustBeInteger = (value) => typeof value === "number" && value === (value | 0) ? null : "an integer";
|
|
228
|
-
var mustBeValidPortNumber = (value) => typeof value === "number" && value === (value | 0) && value >= 0 && value <= 65535 ? null : "a valid port number";
|
|
229
|
-
var mustBeFunction = (value) => typeof value === "function" ? null : "a function";
|
|
230
|
-
var mustBeArray = (value) => Array.isArray(value) ? null : "an array";
|
|
231
|
-
var mustBeArrayOfStrings = (value) => Array.isArray(value) && value.every((x) => typeof x === "string") ? null : "an array of strings";
|
|
232
|
-
var mustBeObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value) ? null : "an object";
|
|
233
|
-
var mustBeEntryPoints = (value) => typeof value === "object" && value !== null ? null : "an array or an object";
|
|
234
|
-
var mustBeWebAssemblyModule = (value) => value instanceof WebAssembly.Module ? null : "a WebAssembly.Module";
|
|
235
|
-
var mustBeObjectOrNull = (value) => typeof value === "object" && !Array.isArray(value) ? null : "an object or null";
|
|
236
|
-
var mustBeStringOrBoolean = (value) => typeof value === "string" || typeof value === "boolean" ? null : "a string or a boolean";
|
|
237
|
-
var mustBeStringOrObject = (value) => typeof value === "string" || typeof value === "object" && value !== null && !Array.isArray(value) ? null : "a string or an object";
|
|
238
|
-
var mustBeStringOrArrayOfStrings = (value) => typeof value === "string" || Array.isArray(value) && value.every((x) => typeof x === "string") ? null : "a string or an array of strings";
|
|
239
|
-
var mustBeStringOrUint8Array = (value) => typeof value === "string" || value instanceof Uint8Array ? null : "a string or a Uint8Array";
|
|
240
|
-
var mustBeStringOrURL = (value) => typeof value === "string" || value instanceof URL ? null : "a string or a URL";
|
|
241
|
-
function getFlag(object, keys, key, mustBeFn) {
|
|
242
|
-
let value = object[key];
|
|
243
|
-
keys[key + ""] = true;
|
|
244
|
-
if (value === undefined)
|
|
245
|
-
return;
|
|
246
|
-
let mustBe = mustBeFn(value);
|
|
247
|
-
if (mustBe !== null)
|
|
248
|
-
throw new Error(`${quote(key)} must be ${mustBe}`);
|
|
249
|
-
return value;
|
|
250
|
-
}
|
|
251
|
-
function checkForInvalidFlags(object, keys, where) {
|
|
252
|
-
for (let key in object) {
|
|
253
|
-
if (!(key in keys)) {
|
|
254
|
-
throw new Error(`Invalid option ${where}: ${quote(key)}`);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
function validateInitializeOptions(options) {
|
|
259
|
-
let keys = /* @__PURE__ */ Object.create(null);
|
|
260
|
-
let wasmURL = getFlag(options, keys, "wasmURL", mustBeStringOrURL);
|
|
261
|
-
let wasmModule = getFlag(options, keys, "wasmModule", mustBeWebAssemblyModule);
|
|
262
|
-
let worker = getFlag(options, keys, "worker", mustBeBoolean);
|
|
263
|
-
checkForInvalidFlags(options, keys, "in initialize() call");
|
|
264
|
-
return {
|
|
265
|
-
wasmURL,
|
|
266
|
-
wasmModule,
|
|
267
|
-
worker
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
function validateMangleCache(mangleCache) {
|
|
271
|
-
let validated;
|
|
272
|
-
if (mangleCache !== undefined) {
|
|
273
|
-
validated = /* @__PURE__ */ Object.create(null);
|
|
274
|
-
for (let key in mangleCache) {
|
|
275
|
-
let value = mangleCache[key];
|
|
276
|
-
if (typeof value === "string" || value === false) {
|
|
277
|
-
validated[key] = value;
|
|
278
|
-
} else {
|
|
279
|
-
throw new Error(`Expected ${quote(key)} in mangle cache to map to either a string or false`);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
return validated;
|
|
284
|
-
}
|
|
285
|
-
function pushLogFlags(flags, options, keys, isTTY2, logLevelDefault) {
|
|
286
|
-
let color = getFlag(options, keys, "color", mustBeBoolean);
|
|
287
|
-
let logLevel = getFlag(options, keys, "logLevel", mustBeString);
|
|
288
|
-
let logLimit = getFlag(options, keys, "logLimit", mustBeInteger);
|
|
289
|
-
if (color !== undefined)
|
|
290
|
-
flags.push(`--color=${color}`);
|
|
291
|
-
else if (isTTY2)
|
|
292
|
-
flags.push(`--color=true`);
|
|
293
|
-
flags.push(`--log-level=${logLevel || logLevelDefault}`);
|
|
294
|
-
flags.push(`--log-limit=${logLimit || 0}`);
|
|
295
|
-
}
|
|
296
|
-
function validateStringValue(value, what, key) {
|
|
297
|
-
if (typeof value !== "string") {
|
|
298
|
-
throw new Error(`Expected value for ${what}${key !== undefined ? " " + quote(key) : ""} to be a string, got ${typeof value} instead`);
|
|
299
|
-
}
|
|
300
|
-
return value;
|
|
301
|
-
}
|
|
302
|
-
function pushCommonFlags(flags, options, keys) {
|
|
303
|
-
let legalComments = getFlag(options, keys, "legalComments", mustBeString);
|
|
304
|
-
let sourceRoot = getFlag(options, keys, "sourceRoot", mustBeString);
|
|
305
|
-
let sourcesContent = getFlag(options, keys, "sourcesContent", mustBeBoolean);
|
|
306
|
-
let target = getFlag(options, keys, "target", mustBeStringOrArrayOfStrings);
|
|
307
|
-
let format = getFlag(options, keys, "format", mustBeString);
|
|
308
|
-
let globalName = getFlag(options, keys, "globalName", mustBeString);
|
|
309
|
-
let mangleProps = getFlag(options, keys, "mangleProps", mustBeRegExp);
|
|
310
|
-
let reserveProps = getFlag(options, keys, "reserveProps", mustBeRegExp);
|
|
311
|
-
let mangleQuoted = getFlag(options, keys, "mangleQuoted", mustBeBoolean);
|
|
312
|
-
let minify = getFlag(options, keys, "minify", mustBeBoolean);
|
|
313
|
-
let minifySyntax = getFlag(options, keys, "minifySyntax", mustBeBoolean);
|
|
314
|
-
let minifyWhitespace = getFlag(options, keys, "minifyWhitespace", mustBeBoolean);
|
|
315
|
-
let minifyIdentifiers = getFlag(options, keys, "minifyIdentifiers", mustBeBoolean);
|
|
316
|
-
let lineLimit = getFlag(options, keys, "lineLimit", mustBeInteger);
|
|
317
|
-
let drop = getFlag(options, keys, "drop", mustBeArrayOfStrings);
|
|
318
|
-
let dropLabels = getFlag(options, keys, "dropLabels", mustBeArrayOfStrings);
|
|
319
|
-
let charset = getFlag(options, keys, "charset", mustBeString);
|
|
320
|
-
let treeShaking = getFlag(options, keys, "treeShaking", mustBeBoolean);
|
|
321
|
-
let ignoreAnnotations = getFlag(options, keys, "ignoreAnnotations", mustBeBoolean);
|
|
322
|
-
let jsx = getFlag(options, keys, "jsx", mustBeString);
|
|
323
|
-
let jsxFactory = getFlag(options, keys, "jsxFactory", mustBeString);
|
|
324
|
-
let jsxFragment = getFlag(options, keys, "jsxFragment", mustBeString);
|
|
325
|
-
let jsxImportSource = getFlag(options, keys, "jsxImportSource", mustBeString);
|
|
326
|
-
let jsxDev = getFlag(options, keys, "jsxDev", mustBeBoolean);
|
|
327
|
-
let jsxSideEffects = getFlag(options, keys, "jsxSideEffects", mustBeBoolean);
|
|
328
|
-
let define = getFlag(options, keys, "define", mustBeObject);
|
|
329
|
-
let logOverride = getFlag(options, keys, "logOverride", mustBeObject);
|
|
330
|
-
let supported = getFlag(options, keys, "supported", mustBeObject);
|
|
331
|
-
let pure = getFlag(options, keys, "pure", mustBeArrayOfStrings);
|
|
332
|
-
let keepNames = getFlag(options, keys, "keepNames", mustBeBoolean);
|
|
333
|
-
let platform = getFlag(options, keys, "platform", mustBeString);
|
|
334
|
-
let tsconfigRaw = getFlag(options, keys, "tsconfigRaw", mustBeStringOrObject);
|
|
335
|
-
let absPaths = getFlag(options, keys, "absPaths", mustBeArrayOfStrings);
|
|
336
|
-
if (legalComments)
|
|
337
|
-
flags.push(`--legal-comments=${legalComments}`);
|
|
338
|
-
if (sourceRoot !== undefined)
|
|
339
|
-
flags.push(`--source-root=${sourceRoot}`);
|
|
340
|
-
if (sourcesContent !== undefined)
|
|
341
|
-
flags.push(`--sources-content=${sourcesContent}`);
|
|
342
|
-
if (target)
|
|
343
|
-
flags.push(`--target=${validateAndJoinStringArray(Array.isArray(target) ? target : [target], "target")}`);
|
|
344
|
-
if (format)
|
|
345
|
-
flags.push(`--format=${format}`);
|
|
346
|
-
if (globalName)
|
|
347
|
-
flags.push(`--global-name=${globalName}`);
|
|
348
|
-
if (platform)
|
|
349
|
-
flags.push(`--platform=${platform}`);
|
|
350
|
-
if (tsconfigRaw)
|
|
351
|
-
flags.push(`--tsconfig-raw=${typeof tsconfigRaw === "string" ? tsconfigRaw : JSON.stringify(tsconfigRaw)}`);
|
|
352
|
-
if (minify)
|
|
353
|
-
flags.push("--minify");
|
|
354
|
-
if (minifySyntax)
|
|
355
|
-
flags.push("--minify-syntax");
|
|
356
|
-
if (minifyWhitespace)
|
|
357
|
-
flags.push("--minify-whitespace");
|
|
358
|
-
if (minifyIdentifiers)
|
|
359
|
-
flags.push("--minify-identifiers");
|
|
360
|
-
if (lineLimit)
|
|
361
|
-
flags.push(`--line-limit=${lineLimit}`);
|
|
362
|
-
if (charset)
|
|
363
|
-
flags.push(`--charset=${charset}`);
|
|
364
|
-
if (treeShaking !== undefined)
|
|
365
|
-
flags.push(`--tree-shaking=${treeShaking}`);
|
|
366
|
-
if (ignoreAnnotations)
|
|
367
|
-
flags.push(`--ignore-annotations`);
|
|
368
|
-
if (drop)
|
|
369
|
-
for (let what of drop)
|
|
370
|
-
flags.push(`--drop:${validateStringValue(what, "drop")}`);
|
|
371
|
-
if (dropLabels)
|
|
372
|
-
flags.push(`--drop-labels=${validateAndJoinStringArray(dropLabels, "drop label")}`);
|
|
373
|
-
if (absPaths)
|
|
374
|
-
flags.push(`--abs-paths=${validateAndJoinStringArray(absPaths, "abs paths")}`);
|
|
375
|
-
if (mangleProps)
|
|
376
|
-
flags.push(`--mangle-props=${jsRegExpToGoRegExp(mangleProps)}`);
|
|
377
|
-
if (reserveProps)
|
|
378
|
-
flags.push(`--reserve-props=${jsRegExpToGoRegExp(reserveProps)}`);
|
|
379
|
-
if (mangleQuoted !== undefined)
|
|
380
|
-
flags.push(`--mangle-quoted=${mangleQuoted}`);
|
|
381
|
-
if (jsx)
|
|
382
|
-
flags.push(`--jsx=${jsx}`);
|
|
383
|
-
if (jsxFactory)
|
|
384
|
-
flags.push(`--jsx-factory=${jsxFactory}`);
|
|
385
|
-
if (jsxFragment)
|
|
386
|
-
flags.push(`--jsx-fragment=${jsxFragment}`);
|
|
387
|
-
if (jsxImportSource)
|
|
388
|
-
flags.push(`--jsx-import-source=${jsxImportSource}`);
|
|
389
|
-
if (jsxDev)
|
|
390
|
-
flags.push(`--jsx-dev`);
|
|
391
|
-
if (jsxSideEffects)
|
|
392
|
-
flags.push(`--jsx-side-effects`);
|
|
393
|
-
if (define) {
|
|
394
|
-
for (let key in define) {
|
|
395
|
-
if (key.indexOf("=") >= 0)
|
|
396
|
-
throw new Error(`Invalid define: ${key}`);
|
|
397
|
-
flags.push(`--define:${key}=${validateStringValue(define[key], "define", key)}`);
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
if (logOverride) {
|
|
401
|
-
for (let key in logOverride) {
|
|
402
|
-
if (key.indexOf("=") >= 0)
|
|
403
|
-
throw new Error(`Invalid log override: ${key}`);
|
|
404
|
-
flags.push(`--log-override:${key}=${validateStringValue(logOverride[key], "log override", key)}`);
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
if (supported) {
|
|
408
|
-
for (let key in supported) {
|
|
409
|
-
if (key.indexOf("=") >= 0)
|
|
410
|
-
throw new Error(`Invalid supported: ${key}`);
|
|
411
|
-
const value = supported[key];
|
|
412
|
-
if (typeof value !== "boolean")
|
|
413
|
-
throw new Error(`Expected value for supported ${quote(key)} to be a boolean, got ${typeof value} instead`);
|
|
414
|
-
flags.push(`--supported:${key}=${value}`);
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
if (pure)
|
|
418
|
-
for (let fn of pure)
|
|
419
|
-
flags.push(`--pure:${validateStringValue(fn, "pure")}`);
|
|
420
|
-
if (keepNames)
|
|
421
|
-
flags.push(`--keep-names`);
|
|
422
|
-
}
|
|
423
|
-
function flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeDefault) {
|
|
424
|
-
var _a2;
|
|
425
|
-
let flags = [];
|
|
426
|
-
let entries = [];
|
|
427
|
-
let keys = /* @__PURE__ */ Object.create(null);
|
|
428
|
-
let stdinContents = null;
|
|
429
|
-
let stdinResolveDir = null;
|
|
430
|
-
pushLogFlags(flags, options, keys, isTTY2, logLevelDefault);
|
|
431
|
-
pushCommonFlags(flags, options, keys);
|
|
432
|
-
let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean);
|
|
433
|
-
let bundle = getFlag(options, keys, "bundle", mustBeBoolean);
|
|
434
|
-
let splitting = getFlag(options, keys, "splitting", mustBeBoolean);
|
|
435
|
-
let preserveSymlinks = getFlag(options, keys, "preserveSymlinks", mustBeBoolean);
|
|
436
|
-
let metafile = getFlag(options, keys, "metafile", mustBeBoolean);
|
|
437
|
-
let outfile = getFlag(options, keys, "outfile", mustBeString);
|
|
438
|
-
let outdir = getFlag(options, keys, "outdir", mustBeString);
|
|
439
|
-
let outbase = getFlag(options, keys, "outbase", mustBeString);
|
|
440
|
-
let tsconfig = getFlag(options, keys, "tsconfig", mustBeString);
|
|
441
|
-
let resolveExtensions = getFlag(options, keys, "resolveExtensions", mustBeArrayOfStrings);
|
|
442
|
-
let nodePathsInput = getFlag(options, keys, "nodePaths", mustBeArrayOfStrings);
|
|
443
|
-
let mainFields = getFlag(options, keys, "mainFields", mustBeArrayOfStrings);
|
|
444
|
-
let conditions = getFlag(options, keys, "conditions", mustBeArrayOfStrings);
|
|
445
|
-
let external = getFlag(options, keys, "external", mustBeArrayOfStrings);
|
|
446
|
-
let packages = getFlag(options, keys, "packages", mustBeString);
|
|
447
|
-
let alias = getFlag(options, keys, "alias", mustBeObject);
|
|
448
|
-
let loader = getFlag(options, keys, "loader", mustBeObject);
|
|
449
|
-
let outExtension = getFlag(options, keys, "outExtension", mustBeObject);
|
|
450
|
-
let publicPath = getFlag(options, keys, "publicPath", mustBeString);
|
|
451
|
-
let entryNames = getFlag(options, keys, "entryNames", mustBeString);
|
|
452
|
-
let chunkNames = getFlag(options, keys, "chunkNames", mustBeString);
|
|
453
|
-
let assetNames = getFlag(options, keys, "assetNames", mustBeString);
|
|
454
|
-
let inject = getFlag(options, keys, "inject", mustBeArrayOfStrings);
|
|
455
|
-
let banner = getFlag(options, keys, "banner", mustBeObject);
|
|
456
|
-
let footer = getFlag(options, keys, "footer", mustBeObject);
|
|
457
|
-
let entryPoints = getFlag(options, keys, "entryPoints", mustBeEntryPoints);
|
|
458
|
-
let absWorkingDir = getFlag(options, keys, "absWorkingDir", mustBeString);
|
|
459
|
-
let stdin = getFlag(options, keys, "stdin", mustBeObject);
|
|
460
|
-
let write = (_a2 = getFlag(options, keys, "write", mustBeBoolean)) != null ? _a2 : writeDefault;
|
|
461
|
-
let allowOverwrite = getFlag(options, keys, "allowOverwrite", mustBeBoolean);
|
|
462
|
-
let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject);
|
|
463
|
-
keys.plugins = true;
|
|
464
|
-
checkForInvalidFlags(options, keys, `in ${callName}() call`);
|
|
465
|
-
if (sourcemap)
|
|
466
|
-
flags.push(`--sourcemap${sourcemap === true ? "" : `=${sourcemap}`}`);
|
|
467
|
-
if (bundle)
|
|
468
|
-
flags.push("--bundle");
|
|
469
|
-
if (allowOverwrite)
|
|
470
|
-
flags.push("--allow-overwrite");
|
|
471
|
-
if (splitting)
|
|
472
|
-
flags.push("--splitting");
|
|
473
|
-
if (preserveSymlinks)
|
|
474
|
-
flags.push("--preserve-symlinks");
|
|
475
|
-
if (metafile)
|
|
476
|
-
flags.push(`--metafile`);
|
|
477
|
-
if (outfile)
|
|
478
|
-
flags.push(`--outfile=${outfile}`);
|
|
479
|
-
if (outdir)
|
|
480
|
-
flags.push(`--outdir=${outdir}`);
|
|
481
|
-
if (outbase)
|
|
482
|
-
flags.push(`--outbase=${outbase}`);
|
|
483
|
-
if (tsconfig)
|
|
484
|
-
flags.push(`--tsconfig=${tsconfig}`);
|
|
485
|
-
if (packages)
|
|
486
|
-
flags.push(`--packages=${packages}`);
|
|
487
|
-
if (resolveExtensions)
|
|
488
|
-
flags.push(`--resolve-extensions=${validateAndJoinStringArray(resolveExtensions, "resolve extension")}`);
|
|
489
|
-
if (publicPath)
|
|
490
|
-
flags.push(`--public-path=${publicPath}`);
|
|
491
|
-
if (entryNames)
|
|
492
|
-
flags.push(`--entry-names=${entryNames}`);
|
|
493
|
-
if (chunkNames)
|
|
494
|
-
flags.push(`--chunk-names=${chunkNames}`);
|
|
495
|
-
if (assetNames)
|
|
496
|
-
flags.push(`--asset-names=${assetNames}`);
|
|
497
|
-
if (mainFields)
|
|
498
|
-
flags.push(`--main-fields=${validateAndJoinStringArray(mainFields, "main field")}`);
|
|
499
|
-
if (conditions)
|
|
500
|
-
flags.push(`--conditions=${validateAndJoinStringArray(conditions, "condition")}`);
|
|
501
|
-
if (external)
|
|
502
|
-
for (let name of external)
|
|
503
|
-
flags.push(`--external:${validateStringValue(name, "external")}`);
|
|
504
|
-
if (alias) {
|
|
505
|
-
for (let old in alias) {
|
|
506
|
-
if (old.indexOf("=") >= 0)
|
|
507
|
-
throw new Error(`Invalid package name in alias: ${old}`);
|
|
508
|
-
flags.push(`--alias:${old}=${validateStringValue(alias[old], "alias", old)}`);
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
if (banner) {
|
|
512
|
-
for (let type in banner) {
|
|
513
|
-
if (type.indexOf("=") >= 0)
|
|
514
|
-
throw new Error(`Invalid banner file type: ${type}`);
|
|
515
|
-
flags.push(`--banner:${type}=${validateStringValue(banner[type], "banner", type)}`);
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
if (footer) {
|
|
519
|
-
for (let type in footer) {
|
|
520
|
-
if (type.indexOf("=") >= 0)
|
|
521
|
-
throw new Error(`Invalid footer file type: ${type}`);
|
|
522
|
-
flags.push(`--footer:${type}=${validateStringValue(footer[type], "footer", type)}`);
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
if (inject)
|
|
526
|
-
for (let path3 of inject)
|
|
527
|
-
flags.push(`--inject:${validateStringValue(path3, "inject")}`);
|
|
528
|
-
if (loader) {
|
|
529
|
-
for (let ext in loader) {
|
|
530
|
-
if (ext.indexOf("=") >= 0)
|
|
531
|
-
throw new Error(`Invalid loader extension: ${ext}`);
|
|
532
|
-
flags.push(`--loader:${ext}=${validateStringValue(loader[ext], "loader", ext)}`);
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
if (outExtension) {
|
|
536
|
-
for (let ext in outExtension) {
|
|
537
|
-
if (ext.indexOf("=") >= 0)
|
|
538
|
-
throw new Error(`Invalid out extension: ${ext}`);
|
|
539
|
-
flags.push(`--out-extension:${ext}=${validateStringValue(outExtension[ext], "out extension", ext)}`);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
if (entryPoints) {
|
|
543
|
-
if (Array.isArray(entryPoints)) {
|
|
544
|
-
for (let i = 0, n = entryPoints.length;i < n; i++) {
|
|
545
|
-
let entryPoint = entryPoints[i];
|
|
546
|
-
if (typeof entryPoint === "object" && entryPoint !== null) {
|
|
547
|
-
let entryPointKeys = /* @__PURE__ */ Object.create(null);
|
|
548
|
-
let input = getFlag(entryPoint, entryPointKeys, "in", mustBeString);
|
|
549
|
-
let output = getFlag(entryPoint, entryPointKeys, "out", mustBeString);
|
|
550
|
-
checkForInvalidFlags(entryPoint, entryPointKeys, "in entry point at index " + i);
|
|
551
|
-
if (input === undefined)
|
|
552
|
-
throw new Error('Missing property "in" for entry point at index ' + i);
|
|
553
|
-
if (output === undefined)
|
|
554
|
-
throw new Error('Missing property "out" for entry point at index ' + i);
|
|
555
|
-
entries.push([output, input]);
|
|
556
|
-
} else {
|
|
557
|
-
entries.push(["", validateStringValue(entryPoint, "entry point at index " + i)]);
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
} else {
|
|
561
|
-
for (let key in entryPoints) {
|
|
562
|
-
entries.push([key, validateStringValue(entryPoints[key], "entry point", key)]);
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
if (stdin) {
|
|
567
|
-
let stdinKeys = /* @__PURE__ */ Object.create(null);
|
|
568
|
-
let contents = getFlag(stdin, stdinKeys, "contents", mustBeStringOrUint8Array);
|
|
569
|
-
let resolveDir = getFlag(stdin, stdinKeys, "resolveDir", mustBeString);
|
|
570
|
-
let sourcefile = getFlag(stdin, stdinKeys, "sourcefile", mustBeString);
|
|
571
|
-
let loader2 = getFlag(stdin, stdinKeys, "loader", mustBeString);
|
|
572
|
-
checkForInvalidFlags(stdin, stdinKeys, 'in "stdin" object');
|
|
573
|
-
if (sourcefile)
|
|
574
|
-
flags.push(`--sourcefile=${sourcefile}`);
|
|
575
|
-
if (loader2)
|
|
576
|
-
flags.push(`--loader=${loader2}`);
|
|
577
|
-
if (resolveDir)
|
|
578
|
-
stdinResolveDir = resolveDir;
|
|
579
|
-
if (typeof contents === "string")
|
|
580
|
-
stdinContents = encodeUTF8(contents);
|
|
581
|
-
else if (contents instanceof Uint8Array)
|
|
582
|
-
stdinContents = contents;
|
|
583
|
-
}
|
|
584
|
-
let nodePaths = [];
|
|
585
|
-
if (nodePathsInput) {
|
|
586
|
-
for (let value of nodePathsInput) {
|
|
587
|
-
value += "";
|
|
588
|
-
nodePaths.push(value);
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
return {
|
|
592
|
-
entries,
|
|
593
|
-
flags,
|
|
594
|
-
write,
|
|
595
|
-
stdinContents,
|
|
596
|
-
stdinResolveDir,
|
|
597
|
-
absWorkingDir,
|
|
598
|
-
nodePaths,
|
|
599
|
-
mangleCache: validateMangleCache(mangleCache)
|
|
600
|
-
};
|
|
601
|
-
}
|
|
602
|
-
function flagsForTransformOptions(callName, options, isTTY2, logLevelDefault) {
|
|
603
|
-
let flags = [];
|
|
604
|
-
let keys = /* @__PURE__ */ Object.create(null);
|
|
605
|
-
pushLogFlags(flags, options, keys, isTTY2, logLevelDefault);
|
|
606
|
-
pushCommonFlags(flags, options, keys);
|
|
607
|
-
let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean);
|
|
608
|
-
let sourcefile = getFlag(options, keys, "sourcefile", mustBeString);
|
|
609
|
-
let loader = getFlag(options, keys, "loader", mustBeString);
|
|
610
|
-
let banner = getFlag(options, keys, "banner", mustBeString);
|
|
611
|
-
let footer = getFlag(options, keys, "footer", mustBeString);
|
|
612
|
-
let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject);
|
|
613
|
-
checkForInvalidFlags(options, keys, `in ${callName}() call`);
|
|
614
|
-
if (sourcemap)
|
|
615
|
-
flags.push(`--sourcemap=${sourcemap === true ? "external" : sourcemap}`);
|
|
616
|
-
if (sourcefile)
|
|
617
|
-
flags.push(`--sourcefile=${sourcefile}`);
|
|
618
|
-
if (loader)
|
|
619
|
-
flags.push(`--loader=${loader}`);
|
|
620
|
-
if (banner)
|
|
621
|
-
flags.push(`--banner=${banner}`);
|
|
622
|
-
if (footer)
|
|
623
|
-
flags.push(`--footer=${footer}`);
|
|
624
|
-
return {
|
|
625
|
-
flags,
|
|
626
|
-
mangleCache: validateMangleCache(mangleCache)
|
|
627
|
-
};
|
|
628
|
-
}
|
|
629
|
-
function createChannel(streamIn) {
|
|
630
|
-
const requestCallbacksByKey = {};
|
|
631
|
-
const closeData = { didClose: false, reason: "" };
|
|
632
|
-
let responseCallbacks = {};
|
|
633
|
-
let nextRequestID = 0;
|
|
634
|
-
let nextBuildKey = 0;
|
|
635
|
-
let stdout = new Uint8Array(16 * 1024);
|
|
636
|
-
let stdoutUsed = 0;
|
|
637
|
-
let readFromStdout = (chunk) => {
|
|
638
|
-
let limit = stdoutUsed + chunk.length;
|
|
639
|
-
if (limit > stdout.length) {
|
|
640
|
-
let swap = new Uint8Array(limit * 2);
|
|
641
|
-
swap.set(stdout);
|
|
642
|
-
stdout = swap;
|
|
643
|
-
}
|
|
644
|
-
stdout.set(chunk, stdoutUsed);
|
|
645
|
-
stdoutUsed += chunk.length;
|
|
646
|
-
let offset = 0;
|
|
647
|
-
while (offset + 4 <= stdoutUsed) {
|
|
648
|
-
let length = readUInt32LE(stdout, offset);
|
|
649
|
-
if (offset + 4 + length > stdoutUsed) {
|
|
650
|
-
break;
|
|
651
|
-
}
|
|
652
|
-
offset += 4;
|
|
653
|
-
handleIncomingPacket(stdout.subarray(offset, offset + length));
|
|
654
|
-
offset += length;
|
|
655
|
-
}
|
|
656
|
-
if (offset > 0) {
|
|
657
|
-
stdout.copyWithin(0, offset, stdoutUsed);
|
|
658
|
-
stdoutUsed -= offset;
|
|
659
|
-
}
|
|
660
|
-
};
|
|
661
|
-
let afterClose = (error) => {
|
|
662
|
-
closeData.didClose = true;
|
|
663
|
-
if (error)
|
|
664
|
-
closeData.reason = ": " + (error.message || error);
|
|
665
|
-
const text = "The service was stopped" + closeData.reason;
|
|
666
|
-
for (let id in responseCallbacks) {
|
|
667
|
-
responseCallbacks[id](text, null);
|
|
668
|
-
}
|
|
669
|
-
responseCallbacks = {};
|
|
670
|
-
};
|
|
671
|
-
let sendRequest = (refs, value, callback) => {
|
|
672
|
-
if (closeData.didClose)
|
|
673
|
-
return callback("The service is no longer running" + closeData.reason, null);
|
|
674
|
-
let id = nextRequestID++;
|
|
675
|
-
responseCallbacks[id] = (error, response) => {
|
|
676
|
-
try {
|
|
677
|
-
callback(error, response);
|
|
678
|
-
} finally {
|
|
679
|
-
if (refs)
|
|
680
|
-
refs.unref();
|
|
681
|
-
}
|
|
682
|
-
};
|
|
683
|
-
if (refs)
|
|
684
|
-
refs.ref();
|
|
685
|
-
streamIn.writeToStdin(encodePacket({ id, isRequest: true, value }));
|
|
686
|
-
};
|
|
687
|
-
let sendResponse = (id, value) => {
|
|
688
|
-
if (closeData.didClose)
|
|
689
|
-
throw new Error("The service is no longer running" + closeData.reason);
|
|
690
|
-
streamIn.writeToStdin(encodePacket({ id, isRequest: false, value }));
|
|
691
|
-
};
|
|
692
|
-
let handleRequest = async (id, request) => {
|
|
693
|
-
try {
|
|
694
|
-
if (request.command === "ping") {
|
|
695
|
-
sendResponse(id, {});
|
|
696
|
-
return;
|
|
697
|
-
}
|
|
698
|
-
if (typeof request.key === "number") {
|
|
699
|
-
const requestCallbacks = requestCallbacksByKey[request.key];
|
|
700
|
-
if (!requestCallbacks) {
|
|
701
|
-
return;
|
|
702
|
-
}
|
|
703
|
-
const callback = requestCallbacks[request.command];
|
|
704
|
-
if (callback) {
|
|
705
|
-
await callback(id, request);
|
|
706
|
-
return;
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
throw new Error(`Invalid command: ` + request.command);
|
|
710
|
-
} catch (e) {
|
|
711
|
-
const errors = [extractErrorMessageV8(e, streamIn, null, undefined, "")];
|
|
712
|
-
try {
|
|
713
|
-
sendResponse(id, { errors });
|
|
714
|
-
} catch {}
|
|
715
|
-
}
|
|
716
|
-
};
|
|
717
|
-
let isFirstPacket = true;
|
|
718
|
-
let handleIncomingPacket = (bytes) => {
|
|
719
|
-
if (isFirstPacket) {
|
|
720
|
-
isFirstPacket = false;
|
|
721
|
-
let binaryVersion = String.fromCharCode(...bytes);
|
|
722
|
-
if (binaryVersion !== "0.25.12") {
|
|
723
|
-
throw new Error(`Cannot start service: Host version "${"0.25.12"}" does not match binary version ${quote(binaryVersion)}`);
|
|
724
|
-
}
|
|
725
|
-
return;
|
|
726
|
-
}
|
|
727
|
-
let packet = decodePacket(bytes);
|
|
728
|
-
if (packet.isRequest) {
|
|
729
|
-
handleRequest(packet.id, packet.value);
|
|
730
|
-
} else {
|
|
731
|
-
let callback = responseCallbacks[packet.id];
|
|
732
|
-
delete responseCallbacks[packet.id];
|
|
733
|
-
if (packet.value.error)
|
|
734
|
-
callback(packet.value.error, {});
|
|
735
|
-
else
|
|
736
|
-
callback(null, packet.value);
|
|
737
|
-
}
|
|
738
|
-
};
|
|
739
|
-
let buildOrContext = ({ callName, refs, options, isTTY: isTTY2, defaultWD: defaultWD2, callback }) => {
|
|
740
|
-
let refCount = 0;
|
|
741
|
-
const buildKey = nextBuildKey++;
|
|
742
|
-
const requestCallbacks = {};
|
|
743
|
-
const buildRefs = {
|
|
744
|
-
ref() {
|
|
745
|
-
if (++refCount === 1) {
|
|
746
|
-
if (refs)
|
|
747
|
-
refs.ref();
|
|
748
|
-
}
|
|
749
|
-
},
|
|
750
|
-
unref() {
|
|
751
|
-
if (--refCount === 0) {
|
|
752
|
-
delete requestCallbacksByKey[buildKey];
|
|
753
|
-
if (refs)
|
|
754
|
-
refs.unref();
|
|
755
|
-
}
|
|
756
|
-
}
|
|
757
|
-
};
|
|
758
|
-
requestCallbacksByKey[buildKey] = requestCallbacks;
|
|
759
|
-
buildRefs.ref();
|
|
760
|
-
buildOrContextImpl(callName, buildKey, sendRequest, sendResponse, buildRefs, streamIn, requestCallbacks, options, isTTY2, defaultWD2, (err, res) => {
|
|
761
|
-
try {
|
|
762
|
-
callback(err, res);
|
|
763
|
-
} finally {
|
|
764
|
-
buildRefs.unref();
|
|
765
|
-
}
|
|
766
|
-
});
|
|
767
|
-
};
|
|
768
|
-
let transform2 = ({ callName, refs, input, options, isTTY: isTTY2, fs: fs3, callback }) => {
|
|
769
|
-
const details = createObjectStash();
|
|
770
|
-
let start = (inputPath) => {
|
|
771
|
-
try {
|
|
772
|
-
if (typeof input !== "string" && !(input instanceof Uint8Array))
|
|
773
|
-
throw new Error('The input to "transform" must be a string or a Uint8Array');
|
|
774
|
-
let {
|
|
775
|
-
flags,
|
|
776
|
-
mangleCache
|
|
777
|
-
} = flagsForTransformOptions(callName, options, isTTY2, transformLogLevelDefault);
|
|
778
|
-
let request = {
|
|
779
|
-
command: "transform",
|
|
780
|
-
flags,
|
|
781
|
-
inputFS: inputPath !== null,
|
|
782
|
-
input: inputPath !== null ? encodeUTF8(inputPath) : typeof input === "string" ? encodeUTF8(input) : input
|
|
783
|
-
};
|
|
784
|
-
if (mangleCache)
|
|
785
|
-
request.mangleCache = mangleCache;
|
|
786
|
-
sendRequest(refs, request, (error, response) => {
|
|
787
|
-
if (error)
|
|
788
|
-
return callback(new Error(error), null);
|
|
789
|
-
let errors = replaceDetailsInMessages(response.errors, details);
|
|
790
|
-
let warnings = replaceDetailsInMessages(response.warnings, details);
|
|
791
|
-
let outstanding = 1;
|
|
792
|
-
let next = () => {
|
|
793
|
-
if (--outstanding === 0) {
|
|
794
|
-
let result = {
|
|
795
|
-
warnings,
|
|
796
|
-
code: response.code,
|
|
797
|
-
map: response.map,
|
|
798
|
-
mangleCache: undefined,
|
|
799
|
-
legalComments: undefined
|
|
800
|
-
};
|
|
801
|
-
if ("legalComments" in response)
|
|
802
|
-
result.legalComments = response == null ? undefined : response.legalComments;
|
|
803
|
-
if (response.mangleCache)
|
|
804
|
-
result.mangleCache = response == null ? undefined : response.mangleCache;
|
|
805
|
-
callback(null, result);
|
|
806
|
-
}
|
|
807
|
-
};
|
|
808
|
-
if (errors.length > 0)
|
|
809
|
-
return callback(failureErrorWithLog("Transform failed", errors, warnings), null);
|
|
810
|
-
if (response.codeFS) {
|
|
811
|
-
outstanding++;
|
|
812
|
-
fs3.readFile(response.code, (err, contents) => {
|
|
813
|
-
if (err !== null) {
|
|
814
|
-
callback(err, null);
|
|
815
|
-
} else {
|
|
816
|
-
response.code = contents;
|
|
817
|
-
next();
|
|
818
|
-
}
|
|
819
|
-
});
|
|
820
|
-
}
|
|
821
|
-
if (response.mapFS) {
|
|
822
|
-
outstanding++;
|
|
823
|
-
fs3.readFile(response.map, (err, contents) => {
|
|
824
|
-
if (err !== null) {
|
|
825
|
-
callback(err, null);
|
|
826
|
-
} else {
|
|
827
|
-
response.map = contents;
|
|
828
|
-
next();
|
|
829
|
-
}
|
|
830
|
-
});
|
|
831
|
-
}
|
|
832
|
-
next();
|
|
833
|
-
});
|
|
834
|
-
} catch (e) {
|
|
835
|
-
let flags = [];
|
|
836
|
-
try {
|
|
837
|
-
pushLogFlags(flags, options, {}, isTTY2, transformLogLevelDefault);
|
|
838
|
-
} catch {}
|
|
839
|
-
const error = extractErrorMessageV8(e, streamIn, details, undefined, "");
|
|
840
|
-
sendRequest(refs, { command: "error", flags, error }, () => {
|
|
841
|
-
error.detail = details.load(error.detail);
|
|
842
|
-
callback(failureErrorWithLog("Transform failed", [error], []), null);
|
|
843
|
-
});
|
|
844
|
-
}
|
|
845
|
-
};
|
|
846
|
-
if ((typeof input === "string" || input instanceof Uint8Array) && input.length > 1024 * 1024) {
|
|
847
|
-
let next = start;
|
|
848
|
-
start = () => fs3.writeFile(input, next);
|
|
849
|
-
}
|
|
850
|
-
start(null);
|
|
851
|
-
};
|
|
852
|
-
let formatMessages2 = ({ callName, refs, messages, options, callback }) => {
|
|
853
|
-
if (!options)
|
|
854
|
-
throw new Error(`Missing second argument in ${callName}() call`);
|
|
855
|
-
let keys = {};
|
|
856
|
-
let kind = getFlag(options, keys, "kind", mustBeString);
|
|
857
|
-
let color = getFlag(options, keys, "color", mustBeBoolean);
|
|
858
|
-
let terminalWidth = getFlag(options, keys, "terminalWidth", mustBeInteger);
|
|
859
|
-
checkForInvalidFlags(options, keys, `in ${callName}() call`);
|
|
860
|
-
if (kind === undefined)
|
|
861
|
-
throw new Error(`Missing "kind" in ${callName}() call`);
|
|
862
|
-
if (kind !== "error" && kind !== "warning")
|
|
863
|
-
throw new Error(`Expected "kind" to be "error" or "warning" in ${callName}() call`);
|
|
864
|
-
let request = {
|
|
865
|
-
command: "format-msgs",
|
|
866
|
-
messages: sanitizeMessages(messages, "messages", null, "", terminalWidth),
|
|
867
|
-
isWarning: kind === "warning"
|
|
868
|
-
};
|
|
869
|
-
if (color !== undefined)
|
|
870
|
-
request.color = color;
|
|
871
|
-
if (terminalWidth !== undefined)
|
|
872
|
-
request.terminalWidth = terminalWidth;
|
|
873
|
-
sendRequest(refs, request, (error, response) => {
|
|
874
|
-
if (error)
|
|
875
|
-
return callback(new Error(error), null);
|
|
876
|
-
callback(null, response.messages);
|
|
877
|
-
});
|
|
878
|
-
};
|
|
879
|
-
let analyzeMetafile2 = ({ callName, refs, metafile, options, callback }) => {
|
|
880
|
-
if (options === undefined)
|
|
881
|
-
options = {};
|
|
882
|
-
let keys = {};
|
|
883
|
-
let color = getFlag(options, keys, "color", mustBeBoolean);
|
|
884
|
-
let verbose = getFlag(options, keys, "verbose", mustBeBoolean);
|
|
885
|
-
checkForInvalidFlags(options, keys, `in ${callName}() call`);
|
|
886
|
-
let request = {
|
|
887
|
-
command: "analyze-metafile",
|
|
888
|
-
metafile
|
|
889
|
-
};
|
|
890
|
-
if (color !== undefined)
|
|
891
|
-
request.color = color;
|
|
892
|
-
if (verbose !== undefined)
|
|
893
|
-
request.verbose = verbose;
|
|
894
|
-
sendRequest(refs, request, (error, response) => {
|
|
895
|
-
if (error)
|
|
896
|
-
return callback(new Error(error), null);
|
|
897
|
-
callback(null, response.result);
|
|
898
|
-
});
|
|
899
|
-
};
|
|
900
|
-
return {
|
|
901
|
-
readFromStdout,
|
|
902
|
-
afterClose,
|
|
903
|
-
service: {
|
|
904
|
-
buildOrContext,
|
|
905
|
-
transform: transform2,
|
|
906
|
-
formatMessages: formatMessages2,
|
|
907
|
-
analyzeMetafile: analyzeMetafile2
|
|
908
|
-
}
|
|
909
|
-
};
|
|
910
|
-
}
|
|
911
|
-
function buildOrContextImpl(callName, buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, isTTY2, defaultWD2, callback) {
|
|
912
|
-
const details = createObjectStash();
|
|
913
|
-
const isContext = callName === "context";
|
|
914
|
-
const handleError = (e, pluginName) => {
|
|
915
|
-
const flags = [];
|
|
916
|
-
try {
|
|
917
|
-
pushLogFlags(flags, options, {}, isTTY2, buildLogLevelDefault);
|
|
918
|
-
} catch {}
|
|
919
|
-
const message = extractErrorMessageV8(e, streamIn, details, undefined, pluginName);
|
|
920
|
-
sendRequest(refs, { command: "error", flags, error: message }, () => {
|
|
921
|
-
message.detail = details.load(message.detail);
|
|
922
|
-
callback(failureErrorWithLog(isContext ? "Context failed" : "Build failed", [message], []), null);
|
|
923
|
-
});
|
|
924
|
-
};
|
|
925
|
-
let plugins;
|
|
926
|
-
if (typeof options === "object") {
|
|
927
|
-
const value = options.plugins;
|
|
928
|
-
if (value !== undefined) {
|
|
929
|
-
if (!Array.isArray(value))
|
|
930
|
-
return handleError(new Error(`"plugins" must be an array`), "");
|
|
931
|
-
plugins = value;
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
if (plugins && plugins.length > 0) {
|
|
935
|
-
if (streamIn.isSync)
|
|
936
|
-
return handleError(new Error("Cannot use plugins in synchronous API calls"), "");
|
|
937
|
-
handlePlugins(buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, plugins, details).then((result) => {
|
|
938
|
-
if (!result.ok)
|
|
939
|
-
return handleError(result.error, result.pluginName);
|
|
940
|
-
try {
|
|
941
|
-
buildOrContextContinue(result.requestPlugins, result.runOnEndCallbacks, result.scheduleOnDisposeCallbacks);
|
|
942
|
-
} catch (e) {
|
|
943
|
-
handleError(e, "");
|
|
944
|
-
}
|
|
945
|
-
}, (e) => handleError(e, ""));
|
|
946
|
-
return;
|
|
947
|
-
}
|
|
948
|
-
try {
|
|
949
|
-
buildOrContextContinue(null, (result, done) => done([], []), () => {});
|
|
950
|
-
} catch (e) {
|
|
951
|
-
handleError(e, "");
|
|
952
|
-
}
|
|
953
|
-
function buildOrContextContinue(requestPlugins, runOnEndCallbacks, scheduleOnDisposeCallbacks) {
|
|
954
|
-
const writeDefault = streamIn.hasFS;
|
|
955
|
-
const {
|
|
956
|
-
entries,
|
|
957
|
-
flags,
|
|
958
|
-
write,
|
|
959
|
-
stdinContents,
|
|
960
|
-
stdinResolveDir,
|
|
961
|
-
absWorkingDir,
|
|
962
|
-
nodePaths,
|
|
963
|
-
mangleCache
|
|
964
|
-
} = flagsForBuildOptions(callName, options, isTTY2, buildLogLevelDefault, writeDefault);
|
|
965
|
-
if (write && !streamIn.hasFS)
|
|
966
|
-
throw new Error(`The "write" option is unavailable in this environment`);
|
|
967
|
-
const request = {
|
|
968
|
-
command: "build",
|
|
969
|
-
key: buildKey,
|
|
970
|
-
entries,
|
|
971
|
-
flags,
|
|
972
|
-
write,
|
|
973
|
-
stdinContents,
|
|
974
|
-
stdinResolveDir,
|
|
975
|
-
absWorkingDir: absWorkingDir || defaultWD2,
|
|
976
|
-
nodePaths,
|
|
977
|
-
context: isContext
|
|
978
|
-
};
|
|
979
|
-
if (requestPlugins)
|
|
980
|
-
request.plugins = requestPlugins;
|
|
981
|
-
if (mangleCache)
|
|
982
|
-
request.mangleCache = mangleCache;
|
|
983
|
-
const buildResponseToResult = (response, callback2) => {
|
|
984
|
-
const result = {
|
|
985
|
-
errors: replaceDetailsInMessages(response.errors, details),
|
|
986
|
-
warnings: replaceDetailsInMessages(response.warnings, details),
|
|
987
|
-
outputFiles: undefined,
|
|
988
|
-
metafile: undefined,
|
|
989
|
-
mangleCache: undefined
|
|
990
|
-
};
|
|
991
|
-
const originalErrors = result.errors.slice();
|
|
992
|
-
const originalWarnings = result.warnings.slice();
|
|
993
|
-
if (response.outputFiles)
|
|
994
|
-
result.outputFiles = response.outputFiles.map(convertOutputFiles);
|
|
995
|
-
if (response.metafile)
|
|
996
|
-
result.metafile = JSON.parse(response.metafile);
|
|
997
|
-
if (response.mangleCache)
|
|
998
|
-
result.mangleCache = response.mangleCache;
|
|
999
|
-
if (response.writeToStdout !== undefined)
|
|
1000
|
-
console.log(decodeUTF8(response.writeToStdout).replace(/\n$/, ""));
|
|
1001
|
-
runOnEndCallbacks(result, (onEndErrors, onEndWarnings) => {
|
|
1002
|
-
if (originalErrors.length > 0 || onEndErrors.length > 0) {
|
|
1003
|
-
const error = failureErrorWithLog("Build failed", originalErrors.concat(onEndErrors), originalWarnings.concat(onEndWarnings));
|
|
1004
|
-
return callback2(error, null, onEndErrors, onEndWarnings);
|
|
1005
|
-
}
|
|
1006
|
-
callback2(null, result, onEndErrors, onEndWarnings);
|
|
1007
|
-
});
|
|
1008
|
-
};
|
|
1009
|
-
let latestResultPromise;
|
|
1010
|
-
let provideLatestResult;
|
|
1011
|
-
if (isContext)
|
|
1012
|
-
requestCallbacks["on-end"] = (id, request2) => new Promise((resolve) => {
|
|
1013
|
-
buildResponseToResult(request2, (err, result, onEndErrors, onEndWarnings) => {
|
|
1014
|
-
const response = {
|
|
1015
|
-
errors: onEndErrors,
|
|
1016
|
-
warnings: onEndWarnings
|
|
1017
|
-
};
|
|
1018
|
-
if (provideLatestResult)
|
|
1019
|
-
provideLatestResult(err, result);
|
|
1020
|
-
latestResultPromise = undefined;
|
|
1021
|
-
provideLatestResult = undefined;
|
|
1022
|
-
sendResponse(id, response);
|
|
1023
|
-
resolve();
|
|
1024
|
-
});
|
|
1025
|
-
});
|
|
1026
|
-
sendRequest(refs, request, (error, response) => {
|
|
1027
|
-
if (error)
|
|
1028
|
-
return callback(new Error(error), null);
|
|
1029
|
-
if (!isContext) {
|
|
1030
|
-
return buildResponseToResult(response, (err, res) => {
|
|
1031
|
-
scheduleOnDisposeCallbacks();
|
|
1032
|
-
return callback(err, res);
|
|
1033
|
-
});
|
|
1034
|
-
}
|
|
1035
|
-
if (response.errors.length > 0) {
|
|
1036
|
-
return callback(failureErrorWithLog("Context failed", response.errors, response.warnings), null);
|
|
1037
|
-
}
|
|
1038
|
-
let didDispose = false;
|
|
1039
|
-
const result = {
|
|
1040
|
-
rebuild: () => {
|
|
1041
|
-
if (!latestResultPromise)
|
|
1042
|
-
latestResultPromise = new Promise((resolve, reject) => {
|
|
1043
|
-
let settlePromise;
|
|
1044
|
-
provideLatestResult = (err, result2) => {
|
|
1045
|
-
if (!settlePromise)
|
|
1046
|
-
settlePromise = () => err ? reject(err) : resolve(result2);
|
|
1047
|
-
};
|
|
1048
|
-
const triggerAnotherBuild = () => {
|
|
1049
|
-
const request2 = {
|
|
1050
|
-
command: "rebuild",
|
|
1051
|
-
key: buildKey
|
|
1052
|
-
};
|
|
1053
|
-
sendRequest(refs, request2, (error2, response2) => {
|
|
1054
|
-
if (error2) {
|
|
1055
|
-
reject(new Error(error2));
|
|
1056
|
-
} else if (settlePromise) {
|
|
1057
|
-
settlePromise();
|
|
1058
|
-
} else {
|
|
1059
|
-
triggerAnotherBuild();
|
|
1060
|
-
}
|
|
1061
|
-
});
|
|
1062
|
-
};
|
|
1063
|
-
triggerAnotherBuild();
|
|
1064
|
-
});
|
|
1065
|
-
return latestResultPromise;
|
|
1066
|
-
},
|
|
1067
|
-
watch: (options2 = {}) => new Promise((resolve, reject) => {
|
|
1068
|
-
if (!streamIn.hasFS)
|
|
1069
|
-
throw new Error(`Cannot use the "watch" API in this environment`);
|
|
1070
|
-
const keys = {};
|
|
1071
|
-
const delay = getFlag(options2, keys, "delay", mustBeInteger);
|
|
1072
|
-
checkForInvalidFlags(options2, keys, `in watch() call`);
|
|
1073
|
-
const request2 = {
|
|
1074
|
-
command: "watch",
|
|
1075
|
-
key: buildKey
|
|
1076
|
-
};
|
|
1077
|
-
if (delay)
|
|
1078
|
-
request2.delay = delay;
|
|
1079
|
-
sendRequest(refs, request2, (error2) => {
|
|
1080
|
-
if (error2)
|
|
1081
|
-
reject(new Error(error2));
|
|
1082
|
-
else
|
|
1083
|
-
resolve(undefined);
|
|
1084
|
-
});
|
|
1085
|
-
}),
|
|
1086
|
-
serve: (options2 = {}) => new Promise((resolve, reject) => {
|
|
1087
|
-
if (!streamIn.hasFS)
|
|
1088
|
-
throw new Error(`Cannot use the "serve" API in this environment`);
|
|
1089
|
-
const keys = {};
|
|
1090
|
-
const port = getFlag(options2, keys, "port", mustBeValidPortNumber);
|
|
1091
|
-
const host = getFlag(options2, keys, "host", mustBeString);
|
|
1092
|
-
const servedir = getFlag(options2, keys, "servedir", mustBeString);
|
|
1093
|
-
const keyfile = getFlag(options2, keys, "keyfile", mustBeString);
|
|
1094
|
-
const certfile = getFlag(options2, keys, "certfile", mustBeString);
|
|
1095
|
-
const fallback = getFlag(options2, keys, "fallback", mustBeString);
|
|
1096
|
-
const cors = getFlag(options2, keys, "cors", mustBeObject);
|
|
1097
|
-
const onRequest = getFlag(options2, keys, "onRequest", mustBeFunction);
|
|
1098
|
-
checkForInvalidFlags(options2, keys, `in serve() call`);
|
|
1099
|
-
const request2 = {
|
|
1100
|
-
command: "serve",
|
|
1101
|
-
key: buildKey,
|
|
1102
|
-
onRequest: !!onRequest
|
|
1103
|
-
};
|
|
1104
|
-
if (port !== undefined)
|
|
1105
|
-
request2.port = port;
|
|
1106
|
-
if (host !== undefined)
|
|
1107
|
-
request2.host = host;
|
|
1108
|
-
if (servedir !== undefined)
|
|
1109
|
-
request2.servedir = servedir;
|
|
1110
|
-
if (keyfile !== undefined)
|
|
1111
|
-
request2.keyfile = keyfile;
|
|
1112
|
-
if (certfile !== undefined)
|
|
1113
|
-
request2.certfile = certfile;
|
|
1114
|
-
if (fallback !== undefined)
|
|
1115
|
-
request2.fallback = fallback;
|
|
1116
|
-
if (cors) {
|
|
1117
|
-
const corsKeys = {};
|
|
1118
|
-
const origin = getFlag(cors, corsKeys, "origin", mustBeStringOrArrayOfStrings);
|
|
1119
|
-
checkForInvalidFlags(cors, corsKeys, `on "cors" object`);
|
|
1120
|
-
if (Array.isArray(origin))
|
|
1121
|
-
request2.corsOrigin = origin;
|
|
1122
|
-
else if (origin !== undefined)
|
|
1123
|
-
request2.corsOrigin = [origin];
|
|
1124
|
-
}
|
|
1125
|
-
sendRequest(refs, request2, (error2, response2) => {
|
|
1126
|
-
if (error2)
|
|
1127
|
-
return reject(new Error(error2));
|
|
1128
|
-
if (onRequest) {
|
|
1129
|
-
requestCallbacks["serve-request"] = (id, request3) => {
|
|
1130
|
-
onRequest(request3.args);
|
|
1131
|
-
sendResponse(id, {});
|
|
1132
|
-
};
|
|
1133
|
-
}
|
|
1134
|
-
resolve(response2);
|
|
1135
|
-
});
|
|
1136
|
-
}),
|
|
1137
|
-
cancel: () => new Promise((resolve) => {
|
|
1138
|
-
if (didDispose)
|
|
1139
|
-
return resolve();
|
|
1140
|
-
const request2 = {
|
|
1141
|
-
command: "cancel",
|
|
1142
|
-
key: buildKey
|
|
1143
|
-
};
|
|
1144
|
-
sendRequest(refs, request2, () => {
|
|
1145
|
-
resolve();
|
|
1146
|
-
});
|
|
1147
|
-
}),
|
|
1148
|
-
dispose: () => new Promise((resolve) => {
|
|
1149
|
-
if (didDispose)
|
|
1150
|
-
return resolve();
|
|
1151
|
-
didDispose = true;
|
|
1152
|
-
const request2 = {
|
|
1153
|
-
command: "dispose",
|
|
1154
|
-
key: buildKey
|
|
1155
|
-
};
|
|
1156
|
-
sendRequest(refs, request2, () => {
|
|
1157
|
-
resolve();
|
|
1158
|
-
scheduleOnDisposeCallbacks();
|
|
1159
|
-
refs.unref();
|
|
1160
|
-
});
|
|
1161
|
-
})
|
|
1162
|
-
};
|
|
1163
|
-
refs.ref();
|
|
1164
|
-
callback(null, result);
|
|
1165
|
-
});
|
|
1166
|
-
}
|
|
1167
|
-
}
|
|
1168
|
-
var handlePlugins = async (buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, initialOptions, plugins, details) => {
|
|
1169
|
-
let onStartCallbacks = [];
|
|
1170
|
-
let onEndCallbacks = [];
|
|
1171
|
-
let onResolveCallbacks = {};
|
|
1172
|
-
let onLoadCallbacks = {};
|
|
1173
|
-
let onDisposeCallbacks = [];
|
|
1174
|
-
let nextCallbackID = 0;
|
|
1175
|
-
let i = 0;
|
|
1176
|
-
let requestPlugins = [];
|
|
1177
|
-
let isSetupDone = false;
|
|
1178
|
-
plugins = [...plugins];
|
|
1179
|
-
for (let item of plugins) {
|
|
1180
|
-
let keys = {};
|
|
1181
|
-
if (typeof item !== "object")
|
|
1182
|
-
throw new Error(`Plugin at index ${i} must be an object`);
|
|
1183
|
-
const name = getFlag(item, keys, "name", mustBeString);
|
|
1184
|
-
if (typeof name !== "string" || name === "")
|
|
1185
|
-
throw new Error(`Plugin at index ${i} is missing a name`);
|
|
1186
|
-
try {
|
|
1187
|
-
let setup = getFlag(item, keys, "setup", mustBeFunction);
|
|
1188
|
-
if (typeof setup !== "function")
|
|
1189
|
-
throw new Error(`Plugin is missing a setup function`);
|
|
1190
|
-
checkForInvalidFlags(item, keys, `on plugin ${quote(name)}`);
|
|
1191
|
-
let plugin = {
|
|
1192
|
-
name,
|
|
1193
|
-
onStart: false,
|
|
1194
|
-
onEnd: false,
|
|
1195
|
-
onResolve: [],
|
|
1196
|
-
onLoad: []
|
|
1197
|
-
};
|
|
1198
|
-
i++;
|
|
1199
|
-
let resolve = (path3, options = {}) => {
|
|
1200
|
-
if (!isSetupDone)
|
|
1201
|
-
throw new Error('Cannot call "resolve" before plugin setup has completed');
|
|
1202
|
-
if (typeof path3 !== "string")
|
|
1203
|
-
throw new Error(`The path to resolve must be a string`);
|
|
1204
|
-
let keys2 = /* @__PURE__ */ Object.create(null);
|
|
1205
|
-
let pluginName = getFlag(options, keys2, "pluginName", mustBeString);
|
|
1206
|
-
let importer = getFlag(options, keys2, "importer", mustBeString);
|
|
1207
|
-
let namespace = getFlag(options, keys2, "namespace", mustBeString);
|
|
1208
|
-
let resolveDir = getFlag(options, keys2, "resolveDir", mustBeString);
|
|
1209
|
-
let kind = getFlag(options, keys2, "kind", mustBeString);
|
|
1210
|
-
let pluginData = getFlag(options, keys2, "pluginData", canBeAnything);
|
|
1211
|
-
let importAttributes = getFlag(options, keys2, "with", mustBeObject);
|
|
1212
|
-
checkForInvalidFlags(options, keys2, "in resolve() call");
|
|
1213
|
-
return new Promise((resolve2, reject) => {
|
|
1214
|
-
const request = {
|
|
1215
|
-
command: "resolve",
|
|
1216
|
-
path: path3,
|
|
1217
|
-
key: buildKey,
|
|
1218
|
-
pluginName: name
|
|
1219
|
-
};
|
|
1220
|
-
if (pluginName != null)
|
|
1221
|
-
request.pluginName = pluginName;
|
|
1222
|
-
if (importer != null)
|
|
1223
|
-
request.importer = importer;
|
|
1224
|
-
if (namespace != null)
|
|
1225
|
-
request.namespace = namespace;
|
|
1226
|
-
if (resolveDir != null)
|
|
1227
|
-
request.resolveDir = resolveDir;
|
|
1228
|
-
if (kind != null)
|
|
1229
|
-
request.kind = kind;
|
|
1230
|
-
else
|
|
1231
|
-
throw new Error(`Must specify "kind" when calling "resolve"`);
|
|
1232
|
-
if (pluginData != null)
|
|
1233
|
-
request.pluginData = details.store(pluginData);
|
|
1234
|
-
if (importAttributes != null)
|
|
1235
|
-
request.with = sanitizeStringMap(importAttributes, "with");
|
|
1236
|
-
sendRequest(refs, request, (error, response) => {
|
|
1237
|
-
if (error !== null)
|
|
1238
|
-
reject(new Error(error));
|
|
1239
|
-
else
|
|
1240
|
-
resolve2({
|
|
1241
|
-
errors: replaceDetailsInMessages(response.errors, details),
|
|
1242
|
-
warnings: replaceDetailsInMessages(response.warnings, details),
|
|
1243
|
-
path: response.path,
|
|
1244
|
-
external: response.external,
|
|
1245
|
-
sideEffects: response.sideEffects,
|
|
1246
|
-
namespace: response.namespace,
|
|
1247
|
-
suffix: response.suffix,
|
|
1248
|
-
pluginData: details.load(response.pluginData)
|
|
1249
|
-
});
|
|
1250
|
-
});
|
|
1251
|
-
});
|
|
1252
|
-
};
|
|
1253
|
-
let promise = setup({
|
|
1254
|
-
initialOptions,
|
|
1255
|
-
resolve,
|
|
1256
|
-
onStart(callback) {
|
|
1257
|
-
let registeredText = `This error came from the "onStart" callback registered here:`;
|
|
1258
|
-
let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onStart");
|
|
1259
|
-
onStartCallbacks.push({ name, callback, note: registeredNote });
|
|
1260
|
-
plugin.onStart = true;
|
|
1261
|
-
},
|
|
1262
|
-
onEnd(callback) {
|
|
1263
|
-
let registeredText = `This error came from the "onEnd" callback registered here:`;
|
|
1264
|
-
let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onEnd");
|
|
1265
|
-
onEndCallbacks.push({ name, callback, note: registeredNote });
|
|
1266
|
-
plugin.onEnd = true;
|
|
1267
|
-
},
|
|
1268
|
-
onResolve(options, callback) {
|
|
1269
|
-
let registeredText = `This error came from the "onResolve" callback registered here:`;
|
|
1270
|
-
let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onResolve");
|
|
1271
|
-
let keys2 = {};
|
|
1272
|
-
let filter = getFlag(options, keys2, "filter", mustBeRegExp);
|
|
1273
|
-
let namespace = getFlag(options, keys2, "namespace", mustBeString);
|
|
1274
|
-
checkForInvalidFlags(options, keys2, `in onResolve() call for plugin ${quote(name)}`);
|
|
1275
|
-
if (filter == null)
|
|
1276
|
-
throw new Error(`onResolve() call is missing a filter`);
|
|
1277
|
-
let id = nextCallbackID++;
|
|
1278
|
-
onResolveCallbacks[id] = { name, callback, note: registeredNote };
|
|
1279
|
-
plugin.onResolve.push({ id, filter: jsRegExpToGoRegExp(filter), namespace: namespace || "" });
|
|
1280
|
-
},
|
|
1281
|
-
onLoad(options, callback) {
|
|
1282
|
-
let registeredText = `This error came from the "onLoad" callback registered here:`;
|
|
1283
|
-
let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onLoad");
|
|
1284
|
-
let keys2 = {};
|
|
1285
|
-
let filter = getFlag(options, keys2, "filter", mustBeRegExp);
|
|
1286
|
-
let namespace = getFlag(options, keys2, "namespace", mustBeString);
|
|
1287
|
-
checkForInvalidFlags(options, keys2, `in onLoad() call for plugin ${quote(name)}`);
|
|
1288
|
-
if (filter == null)
|
|
1289
|
-
throw new Error(`onLoad() call is missing a filter`);
|
|
1290
|
-
let id = nextCallbackID++;
|
|
1291
|
-
onLoadCallbacks[id] = { name, callback, note: registeredNote };
|
|
1292
|
-
plugin.onLoad.push({ id, filter: jsRegExpToGoRegExp(filter), namespace: namespace || "" });
|
|
1293
|
-
},
|
|
1294
|
-
onDispose(callback) {
|
|
1295
|
-
onDisposeCallbacks.push(callback);
|
|
1296
|
-
},
|
|
1297
|
-
esbuild: streamIn.esbuild
|
|
1298
|
-
});
|
|
1299
|
-
if (promise)
|
|
1300
|
-
await promise;
|
|
1301
|
-
requestPlugins.push(plugin);
|
|
1302
|
-
} catch (e) {
|
|
1303
|
-
return { ok: false, error: e, pluginName: name };
|
|
1304
|
-
}
|
|
1305
|
-
}
|
|
1306
|
-
requestCallbacks["on-start"] = async (id, request) => {
|
|
1307
|
-
details.clear();
|
|
1308
|
-
let response = { errors: [], warnings: [] };
|
|
1309
|
-
await Promise.all(onStartCallbacks.map(async ({ name, callback, note }) => {
|
|
1310
|
-
try {
|
|
1311
|
-
let result = await callback();
|
|
1312
|
-
if (result != null) {
|
|
1313
|
-
if (typeof result !== "object")
|
|
1314
|
-
throw new Error(`Expected onStart() callback in plugin ${quote(name)} to return an object`);
|
|
1315
|
-
let keys = {};
|
|
1316
|
-
let errors = getFlag(result, keys, "errors", mustBeArray);
|
|
1317
|
-
let warnings = getFlag(result, keys, "warnings", mustBeArray);
|
|
1318
|
-
checkForInvalidFlags(result, keys, `from onStart() callback in plugin ${quote(name)}`);
|
|
1319
|
-
if (errors != null)
|
|
1320
|
-
response.errors.push(...sanitizeMessages(errors, "errors", details, name, undefined));
|
|
1321
|
-
if (warnings != null)
|
|
1322
|
-
response.warnings.push(...sanitizeMessages(warnings, "warnings", details, name, undefined));
|
|
1323
|
-
}
|
|
1324
|
-
} catch (e) {
|
|
1325
|
-
response.errors.push(extractErrorMessageV8(e, streamIn, details, note && note(), name));
|
|
1326
|
-
}
|
|
1327
|
-
}));
|
|
1328
|
-
sendResponse(id, response);
|
|
1329
|
-
};
|
|
1330
|
-
requestCallbacks["on-resolve"] = async (id, request) => {
|
|
1331
|
-
let response = {}, name = "", callback, note;
|
|
1332
|
-
for (let id2 of request.ids) {
|
|
1333
|
-
try {
|
|
1334
|
-
({ name, callback, note } = onResolveCallbacks[id2]);
|
|
1335
|
-
let result = await callback({
|
|
1336
|
-
path: request.path,
|
|
1337
|
-
importer: request.importer,
|
|
1338
|
-
namespace: request.namespace,
|
|
1339
|
-
resolveDir: request.resolveDir,
|
|
1340
|
-
kind: request.kind,
|
|
1341
|
-
pluginData: details.load(request.pluginData),
|
|
1342
|
-
with: request.with
|
|
1343
|
-
});
|
|
1344
|
-
if (result != null) {
|
|
1345
|
-
if (typeof result !== "object")
|
|
1346
|
-
throw new Error(`Expected onResolve() callback in plugin ${quote(name)} to return an object`);
|
|
1347
|
-
let keys = {};
|
|
1348
|
-
let pluginName = getFlag(result, keys, "pluginName", mustBeString);
|
|
1349
|
-
let path3 = getFlag(result, keys, "path", mustBeString);
|
|
1350
|
-
let namespace = getFlag(result, keys, "namespace", mustBeString);
|
|
1351
|
-
let suffix = getFlag(result, keys, "suffix", mustBeString);
|
|
1352
|
-
let external = getFlag(result, keys, "external", mustBeBoolean);
|
|
1353
|
-
let sideEffects = getFlag(result, keys, "sideEffects", mustBeBoolean);
|
|
1354
|
-
let pluginData = getFlag(result, keys, "pluginData", canBeAnything);
|
|
1355
|
-
let errors = getFlag(result, keys, "errors", mustBeArray);
|
|
1356
|
-
let warnings = getFlag(result, keys, "warnings", mustBeArray);
|
|
1357
|
-
let watchFiles = getFlag(result, keys, "watchFiles", mustBeArrayOfStrings);
|
|
1358
|
-
let watchDirs = getFlag(result, keys, "watchDirs", mustBeArrayOfStrings);
|
|
1359
|
-
checkForInvalidFlags(result, keys, `from onResolve() callback in plugin ${quote(name)}`);
|
|
1360
|
-
response.id = id2;
|
|
1361
|
-
if (pluginName != null)
|
|
1362
|
-
response.pluginName = pluginName;
|
|
1363
|
-
if (path3 != null)
|
|
1364
|
-
response.path = path3;
|
|
1365
|
-
if (namespace != null)
|
|
1366
|
-
response.namespace = namespace;
|
|
1367
|
-
if (suffix != null)
|
|
1368
|
-
response.suffix = suffix;
|
|
1369
|
-
if (external != null)
|
|
1370
|
-
response.external = external;
|
|
1371
|
-
if (sideEffects != null)
|
|
1372
|
-
response.sideEffects = sideEffects;
|
|
1373
|
-
if (pluginData != null)
|
|
1374
|
-
response.pluginData = details.store(pluginData);
|
|
1375
|
-
if (errors != null)
|
|
1376
|
-
response.errors = sanitizeMessages(errors, "errors", details, name, undefined);
|
|
1377
|
-
if (warnings != null)
|
|
1378
|
-
response.warnings = sanitizeMessages(warnings, "warnings", details, name, undefined);
|
|
1379
|
-
if (watchFiles != null)
|
|
1380
|
-
response.watchFiles = sanitizeStringArray(watchFiles, "watchFiles");
|
|
1381
|
-
if (watchDirs != null)
|
|
1382
|
-
response.watchDirs = sanitizeStringArray(watchDirs, "watchDirs");
|
|
1383
|
-
break;
|
|
1384
|
-
}
|
|
1385
|
-
} catch (e) {
|
|
1386
|
-
response = { id: id2, errors: [extractErrorMessageV8(e, streamIn, details, note && note(), name)] };
|
|
1387
|
-
break;
|
|
1388
|
-
}
|
|
1389
|
-
}
|
|
1390
|
-
sendResponse(id, response);
|
|
1391
|
-
};
|
|
1392
|
-
requestCallbacks["on-load"] = async (id, request) => {
|
|
1393
|
-
let response = {}, name = "", callback, note;
|
|
1394
|
-
for (let id2 of request.ids) {
|
|
1395
|
-
try {
|
|
1396
|
-
({ name, callback, note } = onLoadCallbacks[id2]);
|
|
1397
|
-
let result = await callback({
|
|
1398
|
-
path: request.path,
|
|
1399
|
-
namespace: request.namespace,
|
|
1400
|
-
suffix: request.suffix,
|
|
1401
|
-
pluginData: details.load(request.pluginData),
|
|
1402
|
-
with: request.with
|
|
1403
|
-
});
|
|
1404
|
-
if (result != null) {
|
|
1405
|
-
if (typeof result !== "object")
|
|
1406
|
-
throw new Error(`Expected onLoad() callback in plugin ${quote(name)} to return an object`);
|
|
1407
|
-
let keys = {};
|
|
1408
|
-
let pluginName = getFlag(result, keys, "pluginName", mustBeString);
|
|
1409
|
-
let contents = getFlag(result, keys, "contents", mustBeStringOrUint8Array);
|
|
1410
|
-
let resolveDir = getFlag(result, keys, "resolveDir", mustBeString);
|
|
1411
|
-
let pluginData = getFlag(result, keys, "pluginData", canBeAnything);
|
|
1412
|
-
let loader = getFlag(result, keys, "loader", mustBeString);
|
|
1413
|
-
let errors = getFlag(result, keys, "errors", mustBeArray);
|
|
1414
|
-
let warnings = getFlag(result, keys, "warnings", mustBeArray);
|
|
1415
|
-
let watchFiles = getFlag(result, keys, "watchFiles", mustBeArrayOfStrings);
|
|
1416
|
-
let watchDirs = getFlag(result, keys, "watchDirs", mustBeArrayOfStrings);
|
|
1417
|
-
checkForInvalidFlags(result, keys, `from onLoad() callback in plugin ${quote(name)}`);
|
|
1418
|
-
response.id = id2;
|
|
1419
|
-
if (pluginName != null)
|
|
1420
|
-
response.pluginName = pluginName;
|
|
1421
|
-
if (contents instanceof Uint8Array)
|
|
1422
|
-
response.contents = contents;
|
|
1423
|
-
else if (contents != null)
|
|
1424
|
-
response.contents = encodeUTF8(contents);
|
|
1425
|
-
if (resolveDir != null)
|
|
1426
|
-
response.resolveDir = resolveDir;
|
|
1427
|
-
if (pluginData != null)
|
|
1428
|
-
response.pluginData = details.store(pluginData);
|
|
1429
|
-
if (loader != null)
|
|
1430
|
-
response.loader = loader;
|
|
1431
|
-
if (errors != null)
|
|
1432
|
-
response.errors = sanitizeMessages(errors, "errors", details, name, undefined);
|
|
1433
|
-
if (warnings != null)
|
|
1434
|
-
response.warnings = sanitizeMessages(warnings, "warnings", details, name, undefined);
|
|
1435
|
-
if (watchFiles != null)
|
|
1436
|
-
response.watchFiles = sanitizeStringArray(watchFiles, "watchFiles");
|
|
1437
|
-
if (watchDirs != null)
|
|
1438
|
-
response.watchDirs = sanitizeStringArray(watchDirs, "watchDirs");
|
|
1439
|
-
break;
|
|
1440
|
-
}
|
|
1441
|
-
} catch (e) {
|
|
1442
|
-
response = { id: id2, errors: [extractErrorMessageV8(e, streamIn, details, note && note(), name)] };
|
|
1443
|
-
break;
|
|
1444
|
-
}
|
|
1445
|
-
}
|
|
1446
|
-
sendResponse(id, response);
|
|
1447
|
-
};
|
|
1448
|
-
let runOnEndCallbacks = (result, done) => done([], []);
|
|
1449
|
-
if (onEndCallbacks.length > 0) {
|
|
1450
|
-
runOnEndCallbacks = (result, done) => {
|
|
1451
|
-
(async () => {
|
|
1452
|
-
const onEndErrors = [];
|
|
1453
|
-
const onEndWarnings = [];
|
|
1454
|
-
for (const { name, callback, note } of onEndCallbacks) {
|
|
1455
|
-
let newErrors;
|
|
1456
|
-
let newWarnings;
|
|
1457
|
-
try {
|
|
1458
|
-
const value = await callback(result);
|
|
1459
|
-
if (value != null) {
|
|
1460
|
-
if (typeof value !== "object")
|
|
1461
|
-
throw new Error(`Expected onEnd() callback in plugin ${quote(name)} to return an object`);
|
|
1462
|
-
let keys = {};
|
|
1463
|
-
let errors = getFlag(value, keys, "errors", mustBeArray);
|
|
1464
|
-
let warnings = getFlag(value, keys, "warnings", mustBeArray);
|
|
1465
|
-
checkForInvalidFlags(value, keys, `from onEnd() callback in plugin ${quote(name)}`);
|
|
1466
|
-
if (errors != null)
|
|
1467
|
-
newErrors = sanitizeMessages(errors, "errors", details, name, undefined);
|
|
1468
|
-
if (warnings != null)
|
|
1469
|
-
newWarnings = sanitizeMessages(warnings, "warnings", details, name, undefined);
|
|
1470
|
-
}
|
|
1471
|
-
} catch (e) {
|
|
1472
|
-
newErrors = [extractErrorMessageV8(e, streamIn, details, note && note(), name)];
|
|
1473
|
-
}
|
|
1474
|
-
if (newErrors) {
|
|
1475
|
-
onEndErrors.push(...newErrors);
|
|
1476
|
-
try {
|
|
1477
|
-
result.errors.push(...newErrors);
|
|
1478
|
-
} catch {}
|
|
1479
|
-
}
|
|
1480
|
-
if (newWarnings) {
|
|
1481
|
-
onEndWarnings.push(...newWarnings);
|
|
1482
|
-
try {
|
|
1483
|
-
result.warnings.push(...newWarnings);
|
|
1484
|
-
} catch {}
|
|
1485
|
-
}
|
|
1486
|
-
}
|
|
1487
|
-
done(onEndErrors, onEndWarnings);
|
|
1488
|
-
})();
|
|
1489
|
-
};
|
|
1490
|
-
}
|
|
1491
|
-
let scheduleOnDisposeCallbacks = () => {
|
|
1492
|
-
for (const cb of onDisposeCallbacks) {
|
|
1493
|
-
setTimeout(() => cb(), 0);
|
|
1494
|
-
}
|
|
1495
|
-
};
|
|
1496
|
-
isSetupDone = true;
|
|
1497
|
-
return {
|
|
1498
|
-
ok: true,
|
|
1499
|
-
requestPlugins,
|
|
1500
|
-
runOnEndCallbacks,
|
|
1501
|
-
scheduleOnDisposeCallbacks
|
|
1502
|
-
};
|
|
1503
|
-
};
|
|
1504
|
-
function createObjectStash() {
|
|
1505
|
-
const map = /* @__PURE__ */ new Map;
|
|
1506
|
-
let nextID = 0;
|
|
1507
|
-
return {
|
|
1508
|
-
clear() {
|
|
1509
|
-
map.clear();
|
|
1510
|
-
},
|
|
1511
|
-
load(id) {
|
|
1512
|
-
return map.get(id);
|
|
1513
|
-
},
|
|
1514
|
-
store(value) {
|
|
1515
|
-
if (value === undefined)
|
|
1516
|
-
return -1;
|
|
1517
|
-
const id = nextID++;
|
|
1518
|
-
map.set(id, value);
|
|
1519
|
-
return id;
|
|
1520
|
-
}
|
|
1521
|
-
};
|
|
1522
|
-
}
|
|
1523
|
-
function extractCallerV8(e, streamIn, ident) {
|
|
1524
|
-
let note;
|
|
1525
|
-
let tried = false;
|
|
1526
|
-
return () => {
|
|
1527
|
-
if (tried)
|
|
1528
|
-
return note;
|
|
1529
|
-
tried = true;
|
|
1530
|
-
try {
|
|
1531
|
-
let lines = (e.stack + "").split(`
|
|
1532
|
-
`);
|
|
1533
|
-
lines.splice(1, 1);
|
|
1534
|
-
let location = parseStackLinesV8(streamIn, lines, ident);
|
|
1535
|
-
if (location) {
|
|
1536
|
-
note = { text: e.message, location };
|
|
1537
|
-
return note;
|
|
1538
|
-
}
|
|
1539
|
-
} catch {}
|
|
1540
|
-
};
|
|
1541
|
-
}
|
|
1542
|
-
function extractErrorMessageV8(e, streamIn, stash, note, pluginName) {
|
|
1543
|
-
let text = "Internal error";
|
|
1544
|
-
let location = null;
|
|
1545
|
-
try {
|
|
1546
|
-
text = (e && e.message || e) + "";
|
|
1547
|
-
} catch {}
|
|
1548
|
-
try {
|
|
1549
|
-
location = parseStackLinesV8(streamIn, (e.stack + "").split(`
|
|
1550
|
-
`), "");
|
|
1551
|
-
} catch {}
|
|
1552
|
-
return { id: "", pluginName, text, location, notes: note ? [note] : [], detail: stash ? stash.store(e) : -1 };
|
|
1553
|
-
}
|
|
1554
|
-
function parseStackLinesV8(streamIn, lines, ident) {
|
|
1555
|
-
let at = " at ";
|
|
1556
|
-
if (streamIn.readFileSync && !lines[0].startsWith(at) && lines[1].startsWith(at)) {
|
|
1557
|
-
for (let i = 1;i < lines.length; i++) {
|
|
1558
|
-
let line = lines[i];
|
|
1559
|
-
if (!line.startsWith(at))
|
|
1560
|
-
continue;
|
|
1561
|
-
line = line.slice(at.length);
|
|
1562
|
-
while (true) {
|
|
1563
|
-
let match = /^(?:new |async )?\S+ \((.*)\)$/.exec(line);
|
|
1564
|
-
if (match) {
|
|
1565
|
-
line = match[1];
|
|
1566
|
-
continue;
|
|
1567
|
-
}
|
|
1568
|
-
match = /^eval at \S+ \((.*)\)(?:, \S+:\d+:\d+)?$/.exec(line);
|
|
1569
|
-
if (match) {
|
|
1570
|
-
line = match[1];
|
|
1571
|
-
continue;
|
|
1572
|
-
}
|
|
1573
|
-
match = /^(\S+):(\d+):(\d+)$/.exec(line);
|
|
1574
|
-
if (match) {
|
|
1575
|
-
let contents;
|
|
1576
|
-
try {
|
|
1577
|
-
contents = streamIn.readFileSync(match[1], "utf8");
|
|
1578
|
-
} catch {
|
|
1579
|
-
break;
|
|
1580
|
-
}
|
|
1581
|
-
let lineText = contents.split(/\r\n|\r|\n|\u2028|\u2029/)[+match[2] - 1] || "";
|
|
1582
|
-
let column = +match[3] - 1;
|
|
1583
|
-
let length = lineText.slice(column, column + ident.length) === ident ? ident.length : 0;
|
|
1584
|
-
return {
|
|
1585
|
-
file: match[1],
|
|
1586
|
-
namespace: "file",
|
|
1587
|
-
line: +match[2],
|
|
1588
|
-
column: encodeUTF8(lineText.slice(0, column)).length,
|
|
1589
|
-
length: encodeUTF8(lineText.slice(column, column + length)).length,
|
|
1590
|
-
lineText: lineText + `
|
|
1591
|
-
` + lines.slice(1).join(`
|
|
1592
|
-
`),
|
|
1593
|
-
suggestion: ""
|
|
1594
|
-
};
|
|
1595
|
-
}
|
|
1596
|
-
break;
|
|
1597
|
-
}
|
|
1598
|
-
}
|
|
1599
|
-
}
|
|
1600
|
-
return null;
|
|
1601
|
-
}
|
|
1602
|
-
function failureErrorWithLog(text, errors, warnings) {
|
|
1603
|
-
let limit = 5;
|
|
1604
|
-
text += errors.length < 1 ? "" : ` with ${errors.length} error${errors.length < 2 ? "" : "s"}:` + errors.slice(0, limit + 1).map((e, i) => {
|
|
1605
|
-
if (i === limit)
|
|
1606
|
-
return `
|
|
1607
|
-
...`;
|
|
1608
|
-
if (!e.location)
|
|
1609
|
-
return `
|
|
1610
|
-
error: ${e.text}`;
|
|
1611
|
-
let { file, line, column } = e.location;
|
|
1612
|
-
let pluginText = e.pluginName ? `[plugin: ${e.pluginName}] ` : "";
|
|
1613
|
-
return `
|
|
1614
|
-
${file}:${line}:${column}: ERROR: ${pluginText}${e.text}`;
|
|
1615
|
-
}).join("");
|
|
1616
|
-
let error = new Error(text);
|
|
1617
|
-
for (const [key, value] of [["errors", errors], ["warnings", warnings]]) {
|
|
1618
|
-
Object.defineProperty(error, key, {
|
|
1619
|
-
configurable: true,
|
|
1620
|
-
enumerable: true,
|
|
1621
|
-
get: () => value,
|
|
1622
|
-
set: (value2) => Object.defineProperty(error, key, {
|
|
1623
|
-
configurable: true,
|
|
1624
|
-
enumerable: true,
|
|
1625
|
-
value: value2
|
|
1626
|
-
})
|
|
1627
|
-
});
|
|
1628
|
-
}
|
|
1629
|
-
return error;
|
|
1630
|
-
}
|
|
1631
|
-
function replaceDetailsInMessages(messages, stash) {
|
|
1632
|
-
for (const message of messages) {
|
|
1633
|
-
message.detail = stash.load(message.detail);
|
|
1634
|
-
}
|
|
1635
|
-
return messages;
|
|
1636
|
-
}
|
|
1637
|
-
function sanitizeLocation(location, where, terminalWidth) {
|
|
1638
|
-
if (location == null)
|
|
1639
|
-
return null;
|
|
1640
|
-
let keys = {};
|
|
1641
|
-
let file = getFlag(location, keys, "file", mustBeString);
|
|
1642
|
-
let namespace = getFlag(location, keys, "namespace", mustBeString);
|
|
1643
|
-
let line = getFlag(location, keys, "line", mustBeInteger);
|
|
1644
|
-
let column = getFlag(location, keys, "column", mustBeInteger);
|
|
1645
|
-
let length = getFlag(location, keys, "length", mustBeInteger);
|
|
1646
|
-
let lineText = getFlag(location, keys, "lineText", mustBeString);
|
|
1647
|
-
let suggestion = getFlag(location, keys, "suggestion", mustBeString);
|
|
1648
|
-
checkForInvalidFlags(location, keys, where);
|
|
1649
|
-
if (lineText) {
|
|
1650
|
-
const relevantASCII = lineText.slice(0, (column && column > 0 ? column : 0) + (length && length > 0 ? length : 0) + (terminalWidth && terminalWidth > 0 ? terminalWidth : 80));
|
|
1651
|
-
if (!/[\x7F-\uFFFF]/.test(relevantASCII) && !/\n/.test(lineText)) {
|
|
1652
|
-
lineText = relevantASCII;
|
|
1653
|
-
}
|
|
1654
|
-
}
|
|
1655
|
-
return {
|
|
1656
|
-
file: file || "",
|
|
1657
|
-
namespace: namespace || "",
|
|
1658
|
-
line: line || 0,
|
|
1659
|
-
column: column || 0,
|
|
1660
|
-
length: length || 0,
|
|
1661
|
-
lineText: lineText || "",
|
|
1662
|
-
suggestion: suggestion || ""
|
|
1663
|
-
};
|
|
1664
|
-
}
|
|
1665
|
-
function sanitizeMessages(messages, property, stash, fallbackPluginName, terminalWidth) {
|
|
1666
|
-
let messagesClone = [];
|
|
1667
|
-
let index = 0;
|
|
1668
|
-
for (const message of messages) {
|
|
1669
|
-
let keys = {};
|
|
1670
|
-
let id = getFlag(message, keys, "id", mustBeString);
|
|
1671
|
-
let pluginName = getFlag(message, keys, "pluginName", mustBeString);
|
|
1672
|
-
let text = getFlag(message, keys, "text", mustBeString);
|
|
1673
|
-
let location = getFlag(message, keys, "location", mustBeObjectOrNull);
|
|
1674
|
-
let notes = getFlag(message, keys, "notes", mustBeArray);
|
|
1675
|
-
let detail = getFlag(message, keys, "detail", canBeAnything);
|
|
1676
|
-
let where = `in element ${index} of "${property}"`;
|
|
1677
|
-
checkForInvalidFlags(message, keys, where);
|
|
1678
|
-
let notesClone = [];
|
|
1679
|
-
if (notes) {
|
|
1680
|
-
for (const note of notes) {
|
|
1681
|
-
let noteKeys = {};
|
|
1682
|
-
let noteText = getFlag(note, noteKeys, "text", mustBeString);
|
|
1683
|
-
let noteLocation = getFlag(note, noteKeys, "location", mustBeObjectOrNull);
|
|
1684
|
-
checkForInvalidFlags(note, noteKeys, where);
|
|
1685
|
-
notesClone.push({
|
|
1686
|
-
text: noteText || "",
|
|
1687
|
-
location: sanitizeLocation(noteLocation, where, terminalWidth)
|
|
1688
|
-
});
|
|
1689
|
-
}
|
|
1690
|
-
}
|
|
1691
|
-
messagesClone.push({
|
|
1692
|
-
id: id || "",
|
|
1693
|
-
pluginName: pluginName || fallbackPluginName,
|
|
1694
|
-
text: text || "",
|
|
1695
|
-
location: sanitizeLocation(location, where, terminalWidth),
|
|
1696
|
-
notes: notesClone,
|
|
1697
|
-
detail: stash ? stash.store(detail) : -1
|
|
1698
|
-
});
|
|
1699
|
-
index++;
|
|
1700
|
-
}
|
|
1701
|
-
return messagesClone;
|
|
1702
|
-
}
|
|
1703
|
-
function sanitizeStringArray(values, property) {
|
|
1704
|
-
const result = [];
|
|
1705
|
-
for (const value of values) {
|
|
1706
|
-
if (typeof value !== "string")
|
|
1707
|
-
throw new Error(`${quote(property)} must be an array of strings`);
|
|
1708
|
-
result.push(value);
|
|
1709
|
-
}
|
|
1710
|
-
return result;
|
|
1711
|
-
}
|
|
1712
|
-
function sanitizeStringMap(map, property) {
|
|
1713
|
-
const result = /* @__PURE__ */ Object.create(null);
|
|
1714
|
-
for (const key in map) {
|
|
1715
|
-
const value = map[key];
|
|
1716
|
-
if (typeof value !== "string")
|
|
1717
|
-
throw new Error(`key ${quote(key)} in object ${quote(property)} must be a string`);
|
|
1718
|
-
result[key] = value;
|
|
1719
|
-
}
|
|
1720
|
-
return result;
|
|
1721
|
-
}
|
|
1722
|
-
function convertOutputFiles({ path: path3, contents, hash }) {
|
|
1723
|
-
let text = null;
|
|
1724
|
-
return {
|
|
1725
|
-
path: path3,
|
|
1726
|
-
contents,
|
|
1727
|
-
hash,
|
|
1728
|
-
get text() {
|
|
1729
|
-
const binary = this.contents;
|
|
1730
|
-
if (text === null || binary !== contents) {
|
|
1731
|
-
contents = binary;
|
|
1732
|
-
text = decodeUTF8(binary);
|
|
1733
|
-
}
|
|
1734
|
-
return text;
|
|
1735
|
-
}
|
|
1736
|
-
};
|
|
1737
|
-
}
|
|
1738
|
-
function jsRegExpToGoRegExp(regexp) {
|
|
1739
|
-
let result = regexp.source;
|
|
1740
|
-
if (regexp.flags)
|
|
1741
|
-
result = `(?${regexp.flags})${result}`;
|
|
1742
|
-
return result;
|
|
1743
|
-
}
|
|
1744
|
-
var fs = __require("fs");
|
|
1745
|
-
var os = __require("os");
|
|
1746
|
-
var path = __require("path");
|
|
1747
|
-
var ESBUILD_BINARY_PATH = process.env.ESBUILD_BINARY_PATH || ESBUILD_BINARY_PATH;
|
|
1748
|
-
var isValidBinaryPath = (x) => !!x && x !== "/usr/bin/esbuild";
|
|
1749
|
-
var packageDarwin_arm64 = "@esbuild/darwin-arm64";
|
|
1750
|
-
var packageDarwin_x64 = "@esbuild/darwin-x64";
|
|
1751
|
-
var knownWindowsPackages = {
|
|
1752
|
-
"win32 arm64 LE": "@esbuild/win32-arm64",
|
|
1753
|
-
"win32 ia32 LE": "@esbuild/win32-ia32",
|
|
1754
|
-
"win32 x64 LE": "@esbuild/win32-x64"
|
|
1755
|
-
};
|
|
1756
|
-
var knownUnixlikePackages = {
|
|
1757
|
-
"aix ppc64 BE": "@esbuild/aix-ppc64",
|
|
1758
|
-
"android arm64 LE": "@esbuild/android-arm64",
|
|
1759
|
-
"darwin arm64 LE": "@esbuild/darwin-arm64",
|
|
1760
|
-
"darwin x64 LE": "@esbuild/darwin-x64",
|
|
1761
|
-
"freebsd arm64 LE": "@esbuild/freebsd-arm64",
|
|
1762
|
-
"freebsd x64 LE": "@esbuild/freebsd-x64",
|
|
1763
|
-
"linux arm LE": "@esbuild/linux-arm",
|
|
1764
|
-
"linux arm64 LE": "@esbuild/linux-arm64",
|
|
1765
|
-
"linux ia32 LE": "@esbuild/linux-ia32",
|
|
1766
|
-
"linux mips64el LE": "@esbuild/linux-mips64el",
|
|
1767
|
-
"linux ppc64 LE": "@esbuild/linux-ppc64",
|
|
1768
|
-
"linux riscv64 LE": "@esbuild/linux-riscv64",
|
|
1769
|
-
"linux s390x BE": "@esbuild/linux-s390x",
|
|
1770
|
-
"linux x64 LE": "@esbuild/linux-x64",
|
|
1771
|
-
"linux loong64 LE": "@esbuild/linux-loong64",
|
|
1772
|
-
"netbsd arm64 LE": "@esbuild/netbsd-arm64",
|
|
1773
|
-
"netbsd x64 LE": "@esbuild/netbsd-x64",
|
|
1774
|
-
"openbsd arm64 LE": "@esbuild/openbsd-arm64",
|
|
1775
|
-
"openbsd x64 LE": "@esbuild/openbsd-x64",
|
|
1776
|
-
"sunos x64 LE": "@esbuild/sunos-x64"
|
|
1777
|
-
};
|
|
1778
|
-
var knownWebAssemblyFallbackPackages = {
|
|
1779
|
-
"android arm LE": "@esbuild/android-arm",
|
|
1780
|
-
"android x64 LE": "@esbuild/android-x64",
|
|
1781
|
-
"openharmony arm64 LE": "@esbuild/openharmony-arm64"
|
|
1782
|
-
};
|
|
1783
|
-
function pkgAndSubpathForCurrentPlatform() {
|
|
1784
|
-
let pkg;
|
|
1785
|
-
let subpath;
|
|
1786
|
-
let isWASM = false;
|
|
1787
|
-
let platformKey = `${process.platform} ${os.arch()} ${os.endianness()}`;
|
|
1788
|
-
if (platformKey in knownWindowsPackages) {
|
|
1789
|
-
pkg = knownWindowsPackages[platformKey];
|
|
1790
|
-
subpath = "esbuild.exe";
|
|
1791
|
-
} else if (platformKey in knownUnixlikePackages) {
|
|
1792
|
-
pkg = knownUnixlikePackages[platformKey];
|
|
1793
|
-
subpath = "bin/esbuild";
|
|
1794
|
-
} else if (platformKey in knownWebAssemblyFallbackPackages) {
|
|
1795
|
-
pkg = knownWebAssemblyFallbackPackages[platformKey];
|
|
1796
|
-
subpath = "bin/esbuild";
|
|
1797
|
-
isWASM = true;
|
|
1798
|
-
} else {
|
|
1799
|
-
throw new Error(`Unsupported platform: ${platformKey}`);
|
|
1800
|
-
}
|
|
1801
|
-
return { pkg, subpath, isWASM };
|
|
1802
|
-
}
|
|
1803
|
-
function pkgForSomeOtherPlatform() {
|
|
1804
|
-
const libMainJS = __require.resolve("esbuild");
|
|
1805
|
-
const nodeModulesDirectory = path.dirname(path.dirname(path.dirname(libMainJS)));
|
|
1806
|
-
if (path.basename(nodeModulesDirectory) === "node_modules") {
|
|
1807
|
-
for (const unixKey in knownUnixlikePackages) {
|
|
1808
|
-
try {
|
|
1809
|
-
const pkg = knownUnixlikePackages[unixKey];
|
|
1810
|
-
if (fs.existsSync(path.join(nodeModulesDirectory, pkg)))
|
|
1811
|
-
return pkg;
|
|
1812
|
-
} catch {}
|
|
1813
|
-
}
|
|
1814
|
-
for (const windowsKey in knownWindowsPackages) {
|
|
1815
|
-
try {
|
|
1816
|
-
const pkg = knownWindowsPackages[windowsKey];
|
|
1817
|
-
if (fs.existsSync(path.join(nodeModulesDirectory, pkg)))
|
|
1818
|
-
return pkg;
|
|
1819
|
-
} catch {}
|
|
1820
|
-
}
|
|
1821
|
-
}
|
|
1822
|
-
return null;
|
|
1823
|
-
}
|
|
1824
|
-
function downloadedBinPath(pkg, subpath) {
|
|
1825
|
-
const esbuildLibDir = path.dirname(__require.resolve("esbuild"));
|
|
1826
|
-
return path.join(esbuildLibDir, `downloaded-${pkg.replace("/", "-")}-${path.basename(subpath)}`);
|
|
1827
|
-
}
|
|
1828
|
-
function generateBinPath() {
|
|
1829
|
-
if (isValidBinaryPath(ESBUILD_BINARY_PATH)) {
|
|
1830
|
-
if (!fs.existsSync(ESBUILD_BINARY_PATH)) {
|
|
1831
|
-
console.warn(`[esbuild] Ignoring bad configuration: ESBUILD_BINARY_PATH=${ESBUILD_BINARY_PATH}`);
|
|
1832
|
-
} else {
|
|
1833
|
-
return { binPath: ESBUILD_BINARY_PATH, isWASM: false };
|
|
1834
|
-
}
|
|
1835
|
-
}
|
|
1836
|
-
const { pkg, subpath, isWASM } = pkgAndSubpathForCurrentPlatform();
|
|
1837
|
-
let binPath;
|
|
1838
|
-
try {
|
|
1839
|
-
binPath = __require.resolve(`${pkg}/${subpath}`);
|
|
1840
|
-
} catch (e) {
|
|
1841
|
-
binPath = downloadedBinPath(pkg, subpath);
|
|
1842
|
-
if (!fs.existsSync(binPath)) {
|
|
1843
|
-
try {
|
|
1844
|
-
__require.resolve(pkg);
|
|
1845
|
-
} catch {
|
|
1846
|
-
const otherPkg = pkgForSomeOtherPlatform();
|
|
1847
|
-
if (otherPkg) {
|
|
1848
|
-
let suggestions = `
|
|
1849
|
-
Specifically the "${otherPkg}" package is present but this platform
|
|
1850
|
-
needs the "${pkg}" package instead. People often get into this
|
|
1851
|
-
situation by installing esbuild on Windows or macOS and copying "node_modules"
|
|
1852
|
-
into a Docker image that runs Linux, or by copying "node_modules" between
|
|
1853
|
-
Windows and WSL environments.
|
|
1854
|
-
|
|
1855
|
-
If you are installing with npm, you can try not copying the "node_modules"
|
|
1856
|
-
directory when you copy the files over, and running "npm ci" or "npm install"
|
|
1857
|
-
on the destination platform after the copy. Or you could consider using yarn
|
|
1858
|
-
instead of npm which has built-in support for installing a package on multiple
|
|
1859
|
-
platforms simultaneously.
|
|
1860
|
-
|
|
1861
|
-
If you are installing with yarn, you can try listing both this platform and the
|
|
1862
|
-
other platform in your ".yarnrc.yml" file using the "supportedArchitectures"
|
|
1863
|
-
feature: https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures
|
|
1864
|
-
Keep in mind that this means multiple copies of esbuild will be present.
|
|
1865
|
-
`;
|
|
1866
|
-
if (pkg === packageDarwin_x64 && otherPkg === packageDarwin_arm64 || pkg === packageDarwin_arm64 && otherPkg === packageDarwin_x64) {
|
|
1867
|
-
suggestions = `
|
|
1868
|
-
Specifically the "${otherPkg}" package is present but this platform
|
|
1869
|
-
needs the "${pkg}" package instead. People often get into this
|
|
1870
|
-
situation by installing esbuild with npm running inside of Rosetta 2 and then
|
|
1871
|
-
trying to use it with node running outside of Rosetta 2, or vice versa (Rosetta
|
|
1872
|
-
2 is Apple's on-the-fly x86_64-to-arm64 translation service).
|
|
1873
|
-
|
|
1874
|
-
If you are installing with npm, you can try ensuring that both npm and node are
|
|
1875
|
-
not running under Rosetta 2 and then reinstalling esbuild. This likely involves
|
|
1876
|
-
changing how you installed npm and/or node. For example, installing node with
|
|
1877
|
-
the universal installer here should work: https://nodejs.org/en/download/. Or
|
|
1878
|
-
you could consider using yarn instead of npm which has built-in support for
|
|
1879
|
-
installing a package on multiple platforms simultaneously.
|
|
1880
|
-
|
|
1881
|
-
If you are installing with yarn, you can try listing both "arm64" and "x64"
|
|
1882
|
-
in your ".yarnrc.yml" file using the "supportedArchitectures" feature:
|
|
1883
|
-
https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures
|
|
1884
|
-
Keep in mind that this means multiple copies of esbuild will be present.
|
|
1885
|
-
`;
|
|
1886
|
-
}
|
|
1887
|
-
throw new Error(`
|
|
1888
|
-
You installed esbuild for another platform than the one you're currently using.
|
|
1889
|
-
This won't work because esbuild is written with native code and needs to
|
|
1890
|
-
install a platform-specific binary executable.
|
|
1891
|
-
${suggestions}
|
|
1892
|
-
Another alternative is to use the "esbuild-wasm" package instead, which works
|
|
1893
|
-
the same way on all platforms. But it comes with a heavy performance cost and
|
|
1894
|
-
can sometimes be 10x slower than the "esbuild" package, so you may also not
|
|
1895
|
-
want to do that.
|
|
1896
|
-
`);
|
|
1897
|
-
}
|
|
1898
|
-
throw new Error(`The package "${pkg}" could not be found, and is needed by esbuild.
|
|
1899
|
-
|
|
1900
|
-
If you are installing esbuild with npm, make sure that you don't specify the
|
|
1901
|
-
"--no-optional" or "--omit=optional" flags. The "optionalDependencies" feature
|
|
1902
|
-
of "package.json" is used by esbuild to install the correct binary executable
|
|
1903
|
-
for your current platform.`);
|
|
1904
|
-
}
|
|
1905
|
-
throw e;
|
|
1906
|
-
}
|
|
1907
|
-
}
|
|
1908
|
-
if (/\.zip\//.test(binPath)) {
|
|
1909
|
-
let pnpapi;
|
|
1910
|
-
try {
|
|
1911
|
-
pnpapi = (()=>{throw new Error("Cannot require module "+"pnpapi");})();
|
|
1912
|
-
} catch (e) {}
|
|
1913
|
-
if (pnpapi) {
|
|
1914
|
-
const root = pnpapi.getPackageInformation(pnpapi.topLevel).packageLocation;
|
|
1915
|
-
const binTargetPath = path.join(root, "node_modules", ".cache", "esbuild", `pnpapi-${pkg.replace("/", "-")}-${"0.25.12"}-${path.basename(subpath)}`);
|
|
1916
|
-
if (!fs.existsSync(binTargetPath)) {
|
|
1917
|
-
fs.mkdirSync(path.dirname(binTargetPath), { recursive: true });
|
|
1918
|
-
fs.copyFileSync(binPath, binTargetPath);
|
|
1919
|
-
fs.chmodSync(binTargetPath, 493);
|
|
1920
|
-
}
|
|
1921
|
-
return { binPath: binTargetPath, isWASM };
|
|
1922
|
-
}
|
|
1923
|
-
}
|
|
1924
|
-
return { binPath, isWASM };
|
|
1925
|
-
}
|
|
1926
|
-
var child_process = __require("child_process");
|
|
1927
|
-
var crypto = __require("crypto");
|
|
1928
|
-
var path2 = __require("path");
|
|
1929
|
-
var fs2 = __require("fs");
|
|
1930
|
-
var os2 = __require("os");
|
|
1931
|
-
var tty = __require("tty");
|
|
1932
|
-
var worker_threads;
|
|
1933
|
-
if (process.env.ESBUILD_WORKER_THREADS !== "0") {
|
|
1934
|
-
try {
|
|
1935
|
-
worker_threads = __require("worker_threads");
|
|
1936
|
-
} catch {}
|
|
1937
|
-
let [major, minor] = process.versions.node.split(".");
|
|
1938
|
-
if (+major < 12 || +major === 12 && +minor < 17 || +major === 13 && +minor < 13) {
|
|
1939
|
-
worker_threads = undefined;
|
|
1940
|
-
}
|
|
1941
|
-
}
|
|
1942
|
-
var _a;
|
|
1943
|
-
var isInternalWorkerThread = ((_a = worker_threads == null ? undefined : worker_threads.workerData) == null ? undefined : _a.esbuildVersion) === "0.25.12";
|
|
1944
|
-
var esbuildCommandAndArgs = () => {
|
|
1945
|
-
if ((!ESBUILD_BINARY_PATH || false) && (path2.basename(__filename) !== "main.js" || path2.basename(__dirname) !== "lib")) {
|
|
1946
|
-
throw new Error(`The esbuild JavaScript API cannot be bundled. Please mark the "esbuild" package as external so it's not included in the bundle.
|
|
1947
|
-
|
|
1948
|
-
More information: The file containing the code for esbuild's JavaScript API (${__filename}) does not appear to be inside the esbuild package on the file system, which usually means that the esbuild package was bundled into another file. This is problematic because the API needs to run a binary executable inside the esbuild package which is located using a relative path from the API code to the executable. If the esbuild package is bundled, the relative path will be incorrect and the executable won't be found.`);
|
|
1949
|
-
}
|
|
1950
|
-
if (false) {} else {
|
|
1951
|
-
const { binPath, isWASM } = generateBinPath();
|
|
1952
|
-
if (isWASM) {
|
|
1953
|
-
return ["node", [binPath]];
|
|
1954
|
-
} else {
|
|
1955
|
-
return [binPath, []];
|
|
1956
|
-
}
|
|
1957
|
-
}
|
|
1958
|
-
};
|
|
1959
|
-
var isTTY = () => tty.isatty(2);
|
|
1960
|
-
var fsSync = {
|
|
1961
|
-
readFile(tempFile, callback) {
|
|
1962
|
-
try {
|
|
1963
|
-
let contents = fs2.readFileSync(tempFile, "utf8");
|
|
1964
|
-
try {
|
|
1965
|
-
fs2.unlinkSync(tempFile);
|
|
1966
|
-
} catch {}
|
|
1967
|
-
callback(null, contents);
|
|
1968
|
-
} catch (err) {
|
|
1969
|
-
callback(err, null);
|
|
1970
|
-
}
|
|
1971
|
-
},
|
|
1972
|
-
writeFile(contents, callback) {
|
|
1973
|
-
try {
|
|
1974
|
-
let tempFile = randomFileName();
|
|
1975
|
-
fs2.writeFileSync(tempFile, contents);
|
|
1976
|
-
callback(tempFile);
|
|
1977
|
-
} catch {
|
|
1978
|
-
callback(null);
|
|
1979
|
-
}
|
|
1980
|
-
}
|
|
1981
|
-
};
|
|
1982
|
-
var fsAsync = {
|
|
1983
|
-
readFile(tempFile, callback) {
|
|
1984
|
-
try {
|
|
1985
|
-
fs2.readFile(tempFile, "utf8", (err, contents) => {
|
|
1986
|
-
try {
|
|
1987
|
-
fs2.unlink(tempFile, () => callback(err, contents));
|
|
1988
|
-
} catch {
|
|
1989
|
-
callback(err, contents);
|
|
1990
|
-
}
|
|
1991
|
-
});
|
|
1992
|
-
} catch (err) {
|
|
1993
|
-
callback(err, null);
|
|
1994
|
-
}
|
|
1995
|
-
},
|
|
1996
|
-
writeFile(contents, callback) {
|
|
1997
|
-
try {
|
|
1998
|
-
let tempFile = randomFileName();
|
|
1999
|
-
fs2.writeFile(tempFile, contents, (err) => err !== null ? callback(null) : callback(tempFile));
|
|
2000
|
-
} catch {
|
|
2001
|
-
callback(null);
|
|
2002
|
-
}
|
|
2003
|
-
}
|
|
2004
|
-
};
|
|
2005
|
-
var version = "0.25.12";
|
|
2006
|
-
var build = (options) => ensureServiceIsRunning().build(options);
|
|
2007
|
-
var context = (buildOptions) => ensureServiceIsRunning().context(buildOptions);
|
|
2008
|
-
var transform = (input, options) => ensureServiceIsRunning().transform(input, options);
|
|
2009
|
-
var formatMessages = (messages, options) => ensureServiceIsRunning().formatMessages(messages, options);
|
|
2010
|
-
var analyzeMetafile = (messages, options) => ensureServiceIsRunning().analyzeMetafile(messages, options);
|
|
2011
|
-
var buildSync = (options) => {
|
|
2012
|
-
if (worker_threads && !isInternalWorkerThread) {
|
|
2013
|
-
if (!workerThreadService)
|
|
2014
|
-
workerThreadService = startWorkerThreadService(worker_threads);
|
|
2015
|
-
return workerThreadService.buildSync(options);
|
|
2016
|
-
}
|
|
2017
|
-
let result;
|
|
2018
|
-
runServiceSync((service) => service.buildOrContext({
|
|
2019
|
-
callName: "buildSync",
|
|
2020
|
-
refs: null,
|
|
2021
|
-
options,
|
|
2022
|
-
isTTY: isTTY(),
|
|
2023
|
-
defaultWD,
|
|
2024
|
-
callback: (err, res) => {
|
|
2025
|
-
if (err)
|
|
2026
|
-
throw err;
|
|
2027
|
-
result = res;
|
|
2028
|
-
}
|
|
2029
|
-
}));
|
|
2030
|
-
return result;
|
|
2031
|
-
};
|
|
2032
|
-
var transformSync = (input, options) => {
|
|
2033
|
-
if (worker_threads && !isInternalWorkerThread) {
|
|
2034
|
-
if (!workerThreadService)
|
|
2035
|
-
workerThreadService = startWorkerThreadService(worker_threads);
|
|
2036
|
-
return workerThreadService.transformSync(input, options);
|
|
2037
|
-
}
|
|
2038
|
-
let result;
|
|
2039
|
-
runServiceSync((service) => service.transform({
|
|
2040
|
-
callName: "transformSync",
|
|
2041
|
-
refs: null,
|
|
2042
|
-
input,
|
|
2043
|
-
options: options || {},
|
|
2044
|
-
isTTY: isTTY(),
|
|
2045
|
-
fs: fsSync,
|
|
2046
|
-
callback: (err, res) => {
|
|
2047
|
-
if (err)
|
|
2048
|
-
throw err;
|
|
2049
|
-
result = res;
|
|
2050
|
-
}
|
|
2051
|
-
}));
|
|
2052
|
-
return result;
|
|
2053
|
-
};
|
|
2054
|
-
var formatMessagesSync = (messages, options) => {
|
|
2055
|
-
if (worker_threads && !isInternalWorkerThread) {
|
|
2056
|
-
if (!workerThreadService)
|
|
2057
|
-
workerThreadService = startWorkerThreadService(worker_threads);
|
|
2058
|
-
return workerThreadService.formatMessagesSync(messages, options);
|
|
2059
|
-
}
|
|
2060
|
-
let result;
|
|
2061
|
-
runServiceSync((service) => service.formatMessages({
|
|
2062
|
-
callName: "formatMessagesSync",
|
|
2063
|
-
refs: null,
|
|
2064
|
-
messages,
|
|
2065
|
-
options,
|
|
2066
|
-
callback: (err, res) => {
|
|
2067
|
-
if (err)
|
|
2068
|
-
throw err;
|
|
2069
|
-
result = res;
|
|
2070
|
-
}
|
|
2071
|
-
}));
|
|
2072
|
-
return result;
|
|
2073
|
-
};
|
|
2074
|
-
var analyzeMetafileSync = (metafile, options) => {
|
|
2075
|
-
if (worker_threads && !isInternalWorkerThread) {
|
|
2076
|
-
if (!workerThreadService)
|
|
2077
|
-
workerThreadService = startWorkerThreadService(worker_threads);
|
|
2078
|
-
return workerThreadService.analyzeMetafileSync(metafile, options);
|
|
2079
|
-
}
|
|
2080
|
-
let result;
|
|
2081
|
-
runServiceSync((service) => service.analyzeMetafile({
|
|
2082
|
-
callName: "analyzeMetafileSync",
|
|
2083
|
-
refs: null,
|
|
2084
|
-
metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile),
|
|
2085
|
-
options,
|
|
2086
|
-
callback: (err, res) => {
|
|
2087
|
-
if (err)
|
|
2088
|
-
throw err;
|
|
2089
|
-
result = res;
|
|
2090
|
-
}
|
|
2091
|
-
}));
|
|
2092
|
-
return result;
|
|
2093
|
-
};
|
|
2094
|
-
var stop = () => {
|
|
2095
|
-
if (stopService)
|
|
2096
|
-
stopService();
|
|
2097
|
-
if (workerThreadService)
|
|
2098
|
-
workerThreadService.stop();
|
|
2099
|
-
return Promise.resolve();
|
|
2100
|
-
};
|
|
2101
|
-
var initializeWasCalled = false;
|
|
2102
|
-
var initialize = (options) => {
|
|
2103
|
-
options = validateInitializeOptions(options || {});
|
|
2104
|
-
if (options.wasmURL)
|
|
2105
|
-
throw new Error(`The "wasmURL" option only works in the browser`);
|
|
2106
|
-
if (options.wasmModule)
|
|
2107
|
-
throw new Error(`The "wasmModule" option only works in the browser`);
|
|
2108
|
-
if (options.worker)
|
|
2109
|
-
throw new Error(`The "worker" option only works in the browser`);
|
|
2110
|
-
if (initializeWasCalled)
|
|
2111
|
-
throw new Error('Cannot call "initialize" more than once');
|
|
2112
|
-
ensureServiceIsRunning();
|
|
2113
|
-
initializeWasCalled = true;
|
|
2114
|
-
return Promise.resolve();
|
|
2115
|
-
};
|
|
2116
|
-
var defaultWD = process.cwd();
|
|
2117
|
-
var longLivedService;
|
|
2118
|
-
var stopService;
|
|
2119
|
-
var ensureServiceIsRunning = () => {
|
|
2120
|
-
if (longLivedService)
|
|
2121
|
-
return longLivedService;
|
|
2122
|
-
let [command, args] = esbuildCommandAndArgs();
|
|
2123
|
-
let child = child_process.spawn(command, args.concat(`--service=${"0.25.12"}`, "--ping"), {
|
|
2124
|
-
windowsHide: true,
|
|
2125
|
-
stdio: ["pipe", "pipe", "inherit"],
|
|
2126
|
-
cwd: defaultWD
|
|
2127
|
-
});
|
|
2128
|
-
let { readFromStdout, afterClose, service } = createChannel({
|
|
2129
|
-
writeToStdin(bytes) {
|
|
2130
|
-
child.stdin.write(bytes, (err) => {
|
|
2131
|
-
if (err)
|
|
2132
|
-
afterClose(err);
|
|
2133
|
-
});
|
|
2134
|
-
},
|
|
2135
|
-
readFileSync: fs2.readFileSync,
|
|
2136
|
-
isSync: false,
|
|
2137
|
-
hasFS: true,
|
|
2138
|
-
esbuild: node_exports
|
|
2139
|
-
});
|
|
2140
|
-
child.stdin.on("error", afterClose);
|
|
2141
|
-
child.on("error", afterClose);
|
|
2142
|
-
const stdin = child.stdin;
|
|
2143
|
-
const stdout = child.stdout;
|
|
2144
|
-
stdout.on("data", readFromStdout);
|
|
2145
|
-
stdout.on("end", afterClose);
|
|
2146
|
-
stopService = () => {
|
|
2147
|
-
stdin.destroy();
|
|
2148
|
-
stdout.destroy();
|
|
2149
|
-
child.kill();
|
|
2150
|
-
initializeWasCalled = false;
|
|
2151
|
-
longLivedService = undefined;
|
|
2152
|
-
stopService = undefined;
|
|
2153
|
-
};
|
|
2154
|
-
let refCount = 0;
|
|
2155
|
-
child.unref();
|
|
2156
|
-
if (stdin.unref) {
|
|
2157
|
-
stdin.unref();
|
|
2158
|
-
}
|
|
2159
|
-
if (stdout.unref) {
|
|
2160
|
-
stdout.unref();
|
|
2161
|
-
}
|
|
2162
|
-
const refs = {
|
|
2163
|
-
ref() {
|
|
2164
|
-
if (++refCount === 1)
|
|
2165
|
-
child.ref();
|
|
2166
|
-
},
|
|
2167
|
-
unref() {
|
|
2168
|
-
if (--refCount === 0)
|
|
2169
|
-
child.unref();
|
|
2170
|
-
}
|
|
2171
|
-
};
|
|
2172
|
-
longLivedService = {
|
|
2173
|
-
build: (options) => new Promise((resolve, reject) => {
|
|
2174
|
-
service.buildOrContext({
|
|
2175
|
-
callName: "build",
|
|
2176
|
-
refs,
|
|
2177
|
-
options,
|
|
2178
|
-
isTTY: isTTY(),
|
|
2179
|
-
defaultWD,
|
|
2180
|
-
callback: (err, res) => err ? reject(err) : resolve(res)
|
|
2181
|
-
});
|
|
2182
|
-
}),
|
|
2183
|
-
context: (options) => new Promise((resolve, reject) => service.buildOrContext({
|
|
2184
|
-
callName: "context",
|
|
2185
|
-
refs,
|
|
2186
|
-
options,
|
|
2187
|
-
isTTY: isTTY(),
|
|
2188
|
-
defaultWD,
|
|
2189
|
-
callback: (err, res) => err ? reject(err) : resolve(res)
|
|
2190
|
-
})),
|
|
2191
|
-
transform: (input, options) => new Promise((resolve, reject) => service.transform({
|
|
2192
|
-
callName: "transform",
|
|
2193
|
-
refs,
|
|
2194
|
-
input,
|
|
2195
|
-
options: options || {},
|
|
2196
|
-
isTTY: isTTY(),
|
|
2197
|
-
fs: fsAsync,
|
|
2198
|
-
callback: (err, res) => err ? reject(err) : resolve(res)
|
|
2199
|
-
})),
|
|
2200
|
-
formatMessages: (messages, options) => new Promise((resolve, reject) => service.formatMessages({
|
|
2201
|
-
callName: "formatMessages",
|
|
2202
|
-
refs,
|
|
2203
|
-
messages,
|
|
2204
|
-
options,
|
|
2205
|
-
callback: (err, res) => err ? reject(err) : resolve(res)
|
|
2206
|
-
})),
|
|
2207
|
-
analyzeMetafile: (metafile, options) => new Promise((resolve, reject) => service.analyzeMetafile({
|
|
2208
|
-
callName: "analyzeMetafile",
|
|
2209
|
-
refs,
|
|
2210
|
-
metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile),
|
|
2211
|
-
options,
|
|
2212
|
-
callback: (err, res) => err ? reject(err) : resolve(res)
|
|
2213
|
-
}))
|
|
2214
|
-
};
|
|
2215
|
-
return longLivedService;
|
|
2216
|
-
};
|
|
2217
|
-
var runServiceSync = (callback) => {
|
|
2218
|
-
let [command, args] = esbuildCommandAndArgs();
|
|
2219
|
-
let stdin = new Uint8Array;
|
|
2220
|
-
let { readFromStdout, afterClose, service } = createChannel({
|
|
2221
|
-
writeToStdin(bytes) {
|
|
2222
|
-
if (stdin.length !== 0)
|
|
2223
|
-
throw new Error("Must run at most one command");
|
|
2224
|
-
stdin = bytes;
|
|
2225
|
-
},
|
|
2226
|
-
isSync: true,
|
|
2227
|
-
hasFS: true,
|
|
2228
|
-
esbuild: node_exports
|
|
2229
|
-
});
|
|
2230
|
-
callback(service);
|
|
2231
|
-
let stdout = child_process.execFileSync(command, args.concat(`--service=${"0.25.12"}`), {
|
|
2232
|
-
cwd: defaultWD,
|
|
2233
|
-
windowsHide: true,
|
|
2234
|
-
input: stdin,
|
|
2235
|
-
maxBuffer: +process.env.ESBUILD_MAX_BUFFER || 16 * 1024 * 1024
|
|
2236
|
-
});
|
|
2237
|
-
readFromStdout(stdout);
|
|
2238
|
-
afterClose(null);
|
|
2239
|
-
};
|
|
2240
|
-
var randomFileName = () => {
|
|
2241
|
-
return path2.join(os2.tmpdir(), `esbuild-${crypto.randomBytes(32).toString("hex")}`);
|
|
2242
|
-
};
|
|
2243
|
-
var workerThreadService = null;
|
|
2244
|
-
var startWorkerThreadService = (worker_threads2) => {
|
|
2245
|
-
let { port1: mainPort, port2: workerPort } = new worker_threads2.MessageChannel;
|
|
2246
|
-
let worker = new worker_threads2.Worker(__filename, {
|
|
2247
|
-
workerData: { workerPort, defaultWD, esbuildVersion: "0.25.12" },
|
|
2248
|
-
transferList: [workerPort],
|
|
2249
|
-
execArgv: []
|
|
2250
|
-
});
|
|
2251
|
-
let nextID = 0;
|
|
2252
|
-
let fakeBuildError = (text) => {
|
|
2253
|
-
let error = new Error(`Build failed with 1 error:
|
|
2254
|
-
error: ${text}`);
|
|
2255
|
-
let errors = [{ id: "", pluginName: "", text, location: null, notes: [], detail: undefined }];
|
|
2256
|
-
error.errors = errors;
|
|
2257
|
-
error.warnings = [];
|
|
2258
|
-
return error;
|
|
2259
|
-
};
|
|
2260
|
-
let validateBuildSyncOptions = (options) => {
|
|
2261
|
-
if (!options)
|
|
2262
|
-
return;
|
|
2263
|
-
let plugins = options.plugins;
|
|
2264
|
-
if (plugins && plugins.length > 0)
|
|
2265
|
-
throw fakeBuildError(`Cannot use plugins in synchronous API calls`);
|
|
2266
|
-
};
|
|
2267
|
-
let applyProperties = (object, properties) => {
|
|
2268
|
-
for (let key in properties) {
|
|
2269
|
-
object[key] = properties[key];
|
|
2270
|
-
}
|
|
2271
|
-
};
|
|
2272
|
-
let runCallSync = (command, args) => {
|
|
2273
|
-
let id = nextID++;
|
|
2274
|
-
let sharedBuffer = new SharedArrayBuffer(8);
|
|
2275
|
-
let sharedBufferView = new Int32Array(sharedBuffer);
|
|
2276
|
-
let msg = { sharedBuffer, id, command, args };
|
|
2277
|
-
worker.postMessage(msg);
|
|
2278
|
-
let status = Atomics.wait(sharedBufferView, 0, 0);
|
|
2279
|
-
if (status !== "ok" && status !== "not-equal")
|
|
2280
|
-
throw new Error("Internal error: Atomics.wait() failed: " + status);
|
|
2281
|
-
let { message: { id: id2, resolve, reject, properties } } = worker_threads2.receiveMessageOnPort(mainPort);
|
|
2282
|
-
if (id !== id2)
|
|
2283
|
-
throw new Error(`Internal error: Expected id ${id} but got id ${id2}`);
|
|
2284
|
-
if (reject) {
|
|
2285
|
-
applyProperties(reject, properties);
|
|
2286
|
-
throw reject;
|
|
2287
|
-
}
|
|
2288
|
-
return resolve;
|
|
2289
|
-
};
|
|
2290
|
-
worker.unref();
|
|
2291
|
-
return {
|
|
2292
|
-
buildSync(options) {
|
|
2293
|
-
validateBuildSyncOptions(options);
|
|
2294
|
-
return runCallSync("build", [options]);
|
|
2295
|
-
},
|
|
2296
|
-
transformSync(input, options) {
|
|
2297
|
-
return runCallSync("transform", [input, options]);
|
|
2298
|
-
},
|
|
2299
|
-
formatMessagesSync(messages, options) {
|
|
2300
|
-
return runCallSync("formatMessages", [messages, options]);
|
|
2301
|
-
},
|
|
2302
|
-
analyzeMetafileSync(metafile, options) {
|
|
2303
|
-
return runCallSync("analyzeMetafile", [metafile, options]);
|
|
2304
|
-
},
|
|
2305
|
-
stop() {
|
|
2306
|
-
worker.terminate();
|
|
2307
|
-
workerThreadService = null;
|
|
2308
|
-
}
|
|
2309
|
-
};
|
|
2310
|
-
};
|
|
2311
|
-
var startSyncServiceWorker = () => {
|
|
2312
|
-
let workerPort = worker_threads.workerData.workerPort;
|
|
2313
|
-
let parentPort = worker_threads.parentPort;
|
|
2314
|
-
let extractProperties = (object) => {
|
|
2315
|
-
let properties = {};
|
|
2316
|
-
if (object && typeof object === "object") {
|
|
2317
|
-
for (let key in object) {
|
|
2318
|
-
properties[key] = object[key];
|
|
2319
|
-
}
|
|
2320
|
-
}
|
|
2321
|
-
return properties;
|
|
2322
|
-
};
|
|
2323
|
-
try {
|
|
2324
|
-
let service = ensureServiceIsRunning();
|
|
2325
|
-
defaultWD = worker_threads.workerData.defaultWD;
|
|
2326
|
-
parentPort.on("message", (msg) => {
|
|
2327
|
-
(async () => {
|
|
2328
|
-
let { sharedBuffer, id, command, args } = msg;
|
|
2329
|
-
let sharedBufferView = new Int32Array(sharedBuffer);
|
|
2330
|
-
try {
|
|
2331
|
-
switch (command) {
|
|
2332
|
-
case "build":
|
|
2333
|
-
workerPort.postMessage({ id, resolve: await service.build(args[0]) });
|
|
2334
|
-
break;
|
|
2335
|
-
case "transform":
|
|
2336
|
-
workerPort.postMessage({ id, resolve: await service.transform(args[0], args[1]) });
|
|
2337
|
-
break;
|
|
2338
|
-
case "formatMessages":
|
|
2339
|
-
workerPort.postMessage({ id, resolve: await service.formatMessages(args[0], args[1]) });
|
|
2340
|
-
break;
|
|
2341
|
-
case "analyzeMetafile":
|
|
2342
|
-
workerPort.postMessage({ id, resolve: await service.analyzeMetafile(args[0], args[1]) });
|
|
2343
|
-
break;
|
|
2344
|
-
default:
|
|
2345
|
-
throw new Error(`Invalid command: ${command}`);
|
|
2346
|
-
}
|
|
2347
|
-
} catch (reject) {
|
|
2348
|
-
workerPort.postMessage({ id, reject, properties: extractProperties(reject) });
|
|
2349
|
-
}
|
|
2350
|
-
Atomics.add(sharedBufferView, 0, 1);
|
|
2351
|
-
Atomics.notify(sharedBufferView, 0, Infinity);
|
|
2352
|
-
})();
|
|
2353
|
-
});
|
|
2354
|
-
} catch (reject) {
|
|
2355
|
-
parentPort.on("message", (msg) => {
|
|
2356
|
-
let { sharedBuffer, id } = msg;
|
|
2357
|
-
let sharedBufferView = new Int32Array(sharedBuffer);
|
|
2358
|
-
workerPort.postMessage({ id, reject, properties: extractProperties(reject) });
|
|
2359
|
-
Atomics.add(sharedBufferView, 0, 1);
|
|
2360
|
-
Atomics.notify(sharedBufferView, 0, Infinity);
|
|
2361
|
-
});
|
|
2362
|
-
}
|
|
2363
|
-
};
|
|
2364
|
-
if (isInternalWorkerThread) {
|
|
2365
|
-
startSyncServiceWorker();
|
|
2366
|
-
}
|
|
2367
|
-
var node_default = node_exports;
|
|
2368
|
-
});
|
|
2369
|
-
export default require_main();
|
|
2370
|
-
|
|
2371
|
-
//# debugId=F026D32E880DFAD264756E2164756E21
|
|
2372
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2VzYnVpbGQvbGliL21haW4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2dldE93blByb3BEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBfX2dldE93blByb3BOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG4gIGZvciAodmFyIG5hbWUgaW4gYWxsKVxuICAgIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHsgZ2V0OiBhbGxbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9FU00gPSAobW9kLCBpc05vZGVNb2RlLCB0YXJnZXQpID0+ICh0YXJnZXQgPSBtb2QgIT0gbnVsbCA/IF9fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKSA6IHt9LCBfX2NvcHlQcm9wcyhcbiAgLy8gSWYgdGhlIGltcG9ydGVyIGlzIGluIG5vZGUgY29tcGF0aWJpbGl0eSBtb2RlIG9yIHRoaXMgaXMgbm90IGFuIEVTTVxuICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLVxuICAvLyBjb21wYXRpYmxlIHRyYW5zZm9ybSAoaS5lLiBcIl9fZXNNb2R1bGVcIiBoYXMgbm90IGJlZW4gc2V0KSwgdGhlbiBzZXRcbiAgLy8gXCJkZWZhdWx0XCIgdG8gdGhlIENvbW1vbkpTIFwibW9kdWxlLmV4cG9ydHNcIiBmb3Igbm9kZSBjb21wYXRpYmlsaXR5LlxuICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgXCJkZWZhdWx0XCIsIHsgdmFsdWU6IG1vZCwgZW51bWVyYWJsZTogdHJ1ZSB9KSA6IHRhcmdldCxcbiAgbW9kXG4pKTtcbnZhciBfX3RvQ29tbW9uSlMgPSAobW9kKSA9PiBfX2NvcHlQcm9wcyhfX2RlZlByb3Aoe30sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pLCBtb2QpO1xuXG4vLyBsaWIvbnBtL25vZGUudHNcbnZhciBub2RlX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KG5vZGVfZXhwb3J0cywge1xuICBhbmFseXplTWV0YWZpbGU6ICgpID0+IGFuYWx5emVNZXRhZmlsZSxcbiAgYW5hbHl6ZU1ldGFmaWxlU3luYzogKCkgPT4gYW5hbHl6ZU1ldGFmaWxlU3luYyxcbiAgYnVpbGQ6ICgpID0+IGJ1aWxkLFxuICBidWlsZFN5bmM6ICgpID0+IGJ1aWxkU3luYyxcbiAgY29udGV4dDogKCkgPT4gY29udGV4dCxcbiAgZGVmYXVsdDogKCkgPT4gbm9kZV9kZWZhdWx0LFxuICBmb3JtYXRNZXNzYWdlczogKCkgPT4gZm9ybWF0TWVzc2FnZXMsXG4gIGZvcm1hdE1lc3NhZ2VzU3luYzogKCkgPT4gZm9ybWF0TWVzc2FnZXNTeW5jLFxuICBpbml0aWFsaXplOiAoKSA9PiBpbml0aWFsaXplLFxuICBzdG9wOiAoKSA9PiBzdG9wLFxuICB0cmFuc2Zvcm06ICgpID0+IHRyYW5zZm9ybSxcbiAgdHJhbnNmb3JtU3luYzogKCkgPT4gdHJhbnNmb3JtU3luYyxcbiAgdmVyc2lvbjogKCkgPT4gdmVyc2lvblxufSk7XG5tb2R1bGUuZXhwb3J0cyA9IF9fdG9Db21tb25KUyhub2RlX2V4cG9ydHMpO1xuXG4vLyBsaWIvc2hhcmVkL3N0ZGlvX3Byb3RvY29sLnRzXG5mdW5jdGlvbiBlbmNvZGVQYWNrZXQocGFja2V0KSB7XG4gIGxldCB2aXNpdCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgYmIud3JpdGU4KDApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgYmIud3JpdGU4KDEpO1xuICAgICAgYmIud3JpdGU4KCt2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGJiLndyaXRlOCgyKTtcbiAgICAgIGJiLndyaXRlMzIodmFsdWUgfCAwKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgYmIud3JpdGU4KDMpO1xuICAgICAgYmIud3JpdGUoZW5jb2RlVVRGOCh2YWx1ZSkpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICBiYi53cml0ZTgoNCk7XG4gICAgICBiYi53cml0ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBiYi53cml0ZTgoNSk7XG4gICAgICBiYi53cml0ZTMyKHZhbHVlLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIHZpc2l0KGl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgIGJiLndyaXRlOCg2KTtcbiAgICAgIGJiLndyaXRlMzIoa2V5cy5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgYmIud3JpdGUoZW5jb2RlVVRGOChrZXkpKTtcbiAgICAgICAgdmlzaXQodmFsdWVba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBsZXQgYmIgPSBuZXcgQnl0ZUJ1ZmZlcigpO1xuICBiYi53cml0ZTMyKDApO1xuICBiYi53cml0ZTMyKHBhY2tldC5pZCA8PCAxIHwgKyFwYWNrZXQuaXNSZXF1ZXN0KTtcbiAgdmlzaXQocGFja2V0LnZhbHVlKTtcbiAgd3JpdGVVSW50MzJMRShiYi5idWYsIGJiLmxlbiAtIDQsIDApO1xuICByZXR1cm4gYmIuYnVmLnN1YmFycmF5KDAsIGJiLmxlbik7XG59XG5mdW5jdGlvbiBkZWNvZGVQYWNrZXQoYnl0ZXMpIHtcbiAgbGV0IHZpc2l0ID0gKCkgPT4ge1xuICAgIHN3aXRjaCAoYmIucmVhZDgoKSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuICEhYmIucmVhZDgoKTtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIGJiLnJlYWQzMigpO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gZGVjb2RlVVRGOChiYi5yZWFkKCkpO1xuICAgICAgY2FzZSA0OlxuICAgICAgICByZXR1cm4gYmIucmVhZCgpO1xuICAgICAgY2FzZSA1OiB7XG4gICAgICAgIGxldCBjb3VudCA9IGJiLnJlYWQzMigpO1xuICAgICAgICBsZXQgdmFsdWUyID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgIHZhbHVlMi5wdXNoKHZpc2l0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTI7XG4gICAgICB9XG4gICAgICBjYXNlIDY6IHtcbiAgICAgICAgbGV0IGNvdW50ID0gYmIucmVhZDMyKCk7XG4gICAgICAgIGxldCB2YWx1ZTIgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgdmFsdWUyW2RlY29kZVVURjgoYmIucmVhZCgpKV0gPSB2aXNpdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTI7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhY2tldFwiKTtcbiAgICB9XG4gIH07XG4gIGxldCBiYiA9IG5ldyBCeXRlQnVmZmVyKGJ5dGVzKTtcbiAgbGV0IGlkID0gYmIucmVhZDMyKCk7XG4gIGxldCBpc1JlcXVlc3QgPSAoaWQgJiAxKSA9PT0gMDtcbiAgaWQgPj4+PSAxO1xuICBsZXQgdmFsdWUgPSB2aXNpdCgpO1xuICBpZiAoYmIucHRyICE9PSBieXRlcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhY2tldFwiKTtcbiAgfVxuICByZXR1cm4geyBpZCwgaXNSZXF1ZXN0LCB2YWx1ZSB9O1xufVxudmFyIEJ5dGVCdWZmZXIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGJ1ZiA9IG5ldyBVaW50OEFycmF5KDEwMjQpKSB7XG4gICAgdGhpcy5idWYgPSBidWY7XG4gICAgdGhpcy5sZW4gPSAwO1xuICAgIHRoaXMucHRyID0gMDtcbiAgfVxuICBfd3JpdGUoZGVsdGEpIHtcbiAgICBpZiAodGhpcy5sZW4gKyBkZWx0YSA+IHRoaXMuYnVmLmxlbmd0aCkge1xuICAgICAgbGV0IGNsb25lID0gbmV3IFVpbnQ4QXJyYXkoKHRoaXMubGVuICsgZGVsdGEpICogMik7XG4gICAgICBjbG9uZS5zZXQodGhpcy5idWYpO1xuICAgICAgdGhpcy5idWYgPSBjbG9uZTtcbiAgICB9XG4gICAgdGhpcy5sZW4gKz0gZGVsdGE7XG4gICAgcmV0dXJuIHRoaXMubGVuIC0gZGVsdGE7XG4gIH1cbiAgd3JpdGU4KHZhbHVlKSB7XG4gICAgbGV0IG9mZnNldCA9IHRoaXMuX3dyaXRlKDEpO1xuICAgIHRoaXMuYnVmW29mZnNldF0gPSB2YWx1ZTtcbiAgfVxuICB3cml0ZTMyKHZhbHVlKSB7XG4gICAgbGV0IG9mZnNldCA9IHRoaXMuX3dyaXRlKDQpO1xuICAgIHdyaXRlVUludDMyTEUodGhpcy5idWYsIHZhbHVlLCBvZmZzZXQpO1xuICB9XG4gIHdyaXRlKGJ5dGVzKSB7XG4gICAgbGV0IG9mZnNldCA9IHRoaXMuX3dyaXRlKDQgKyBieXRlcy5sZW5ndGgpO1xuICAgIHdyaXRlVUludDMyTEUodGhpcy5idWYsIGJ5dGVzLmxlbmd0aCwgb2Zmc2V0KTtcbiAgICB0aGlzLmJ1Zi5zZXQoYnl0ZXMsIG9mZnNldCArIDQpO1xuICB9XG4gIF9yZWFkKGRlbHRhKSB7XG4gICAgaWYgKHRoaXMucHRyICsgZGVsdGEgPiB0aGlzLmJ1Zi5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFja2V0XCIpO1xuICAgIH1cbiAgICB0aGlzLnB0ciArPSBkZWx0YTtcbiAgICByZXR1cm4gdGhpcy5wdHIgLSBkZWx0YTtcbiAgfVxuICByZWFkOCgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZbdGhpcy5fcmVhZCgxKV07XG4gIH1cbiAgcmVhZDMyKCkge1xuICAgIHJldHVybiByZWFkVUludDMyTEUodGhpcy5idWYsIHRoaXMuX3JlYWQoNCkpO1xuICB9XG4gIHJlYWQoKSB7XG4gICAgbGV0IGxlbmd0aCA9IHRoaXMucmVhZDMyKCk7XG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICBsZXQgcHRyID0gdGhpcy5fcmVhZChieXRlcy5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldCh0aGlzLmJ1Zi5zdWJhcnJheShwdHIsIHB0ciArIGxlbmd0aCkpO1xuICAgIHJldHVybiBieXRlcztcbiAgfVxufTtcbnZhciBlbmNvZGVVVEY4O1xudmFyIGRlY29kZVVURjg7XG52YXIgZW5jb2RlSW52YXJpYW50O1xuaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgVGV4dERlY29kZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgbGV0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgbGV0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgZW5jb2RlVVRGOCA9ICh0ZXh0KSA9PiBlbmNvZGVyLmVuY29kZSh0ZXh0KTtcbiAgZGVjb2RlVVRGOCA9IChieXRlcykgPT4gZGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICBlbmNvZGVJbnZhcmlhbnQgPSAnbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFwiXCIpJztcbn0gZWxzZSBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICBlbmNvZGVVVEY4ID0gKHRleHQpID0+IEJ1ZmZlci5mcm9tKHRleHQpO1xuICBkZWNvZGVVVEY4ID0gKGJ5dGVzKSA9PiB7XG4gICAgbGV0IHsgYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoIH0gPSBieXRlcztcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKS50b1N0cmluZygpO1xuICB9O1xuICBlbmNvZGVJbnZhcmlhbnQgPSAnQnVmZmVyLmZyb20oXCJcIiknO1xufSBlbHNlIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiTm8gVVRGLTggY29kZWMgZm91bmRcIik7XG59XG5pZiAoIShlbmNvZGVVVEY4KFwiXCIpIGluc3RhbmNlb2YgVWludDhBcnJheSkpXG4gIHRocm93IG5ldyBFcnJvcihgSW52YXJpYW50IHZpb2xhdGlvbjogXCIke2VuY29kZUludmFyaWFudH0gaW5zdGFuY2VvZiBVaW50OEFycmF5XCIgaXMgaW5jb3JyZWN0bHkgZmFsc2VcblxuVGhpcyBpbmRpY2F0ZXMgdGhhdCB5b3VyIEphdmFTY3JpcHQgZW52aXJvbm1lbnQgaXMgYnJva2VuLiBZb3UgY2Fubm90IHVzZVxuZXNidWlsZCBpbiB0aGlzIGVudmlyb25tZW50IGJlY2F1c2UgZXNidWlsZCByZWxpZXMgb24gdGhpcyBpbnZhcmlhbnQuIFRoaXNcbmlzIG5vdCBhIHByb2JsZW0gd2l0aCBlc2J1aWxkLiBZb3UgbmVlZCB0byBmaXggeW91ciBlbnZpcm9ubWVudCBpbnN0ZWFkLlxuYCk7XG5mdW5jdGlvbiByZWFkVUludDMyTEUoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIGJ1ZmZlcltvZmZzZXQrK10gfCBidWZmZXJbb2Zmc2V0KytdIDw8IDggfCBidWZmZXJbb2Zmc2V0KytdIDw8IDE2IHwgYnVmZmVyW29mZnNldCsrXSA8PCAyNDtcbn1cbmZ1bmN0aW9uIHdyaXRlVUludDMyTEUoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIGJ1ZmZlcltvZmZzZXQrK10gPSB2YWx1ZTtcbiAgYnVmZmVyW29mZnNldCsrXSA9IHZhbHVlID4+IDg7XG4gIGJ1ZmZlcltvZmZzZXQrK10gPSB2YWx1ZSA+PiAxNjtcbiAgYnVmZmVyW29mZnNldCsrXSA9IHZhbHVlID4+IDI0O1xufVxuXG4vLyBsaWIvc2hhcmVkL2NvbW1vbi50c1xudmFyIHF1b3RlID0gSlNPTi5zdHJpbmdpZnk7XG52YXIgYnVpbGRMb2dMZXZlbERlZmF1bHQgPSBcIndhcm5pbmdcIjtcbnZhciB0cmFuc2Zvcm1Mb2dMZXZlbERlZmF1bHQgPSBcInNpbGVudFwiO1xuZnVuY3Rpb24gdmFsaWRhdGVBbmRKb2luU3RyaW5nQXJyYXkodmFsdWVzLCB3aGF0KSB7XG4gIGNvbnN0IHRvSm9pbiA9IFtdO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIHZhbGlkYXRlU3RyaW5nVmFsdWUodmFsdWUsIHdoYXQpO1xuICAgIGlmICh2YWx1ZS5pbmRleE9mKFwiLFwiKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHt3aGF0fTogJHt2YWx1ZX1gKTtcbiAgICB0b0pvaW4ucHVzaCh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHRvSm9pbi5qb2luKFwiLFwiKTtcbn1cbnZhciBjYW5CZUFueXRoaW5nID0gKCkgPT4gbnVsbDtcbnZhciBtdXN0QmVCb29sZWFuID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiID8gbnVsbCA6IFwiYSBib29sZWFuXCI7XG52YXIgbXVzdEJlU3RyaW5nID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBudWxsIDogXCJhIHN0cmluZ1wiO1xudmFyIG11c3RCZVJlZ0V4cCA9ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgPyBudWxsIDogXCJhIFJlZ0V4cCBvYmplY3RcIjtcbnZhciBtdXN0QmVJbnRlZ2VyID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgdmFsdWUgPT09ICh2YWx1ZSB8IDApID8gbnVsbCA6IFwiYW4gaW50ZWdlclwiO1xudmFyIG11c3RCZVZhbGlkUG9ydE51bWJlciA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIHZhbHVlID09PSAodmFsdWUgfCAwKSAmJiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDY1NTM1ID8gbnVsbCA6IFwiYSB2YWxpZCBwb3J0IG51bWJlclwiO1xudmFyIG11c3RCZUZ1bmN0aW9uID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IG51bGwgOiBcImEgZnVuY3Rpb25cIjtcbnZhciBtdXN0QmVBcnJheSA9ICh2YWx1ZSkgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBudWxsIDogXCJhbiBhcnJheVwiO1xudmFyIG11c3RCZUFycmF5T2ZTdHJpbmdzID0gKHZhbHVlKSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoeCkgPT4gdHlwZW9mIHggPT09IFwic3RyaW5nXCIpID8gbnVsbCA6IFwiYW4gYXJyYXkgb2Ygc3RyaW5nc1wiO1xudmFyIG11c3RCZU9iamVjdCA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSA/IG51bGwgOiBcImFuIG9iamVjdFwiO1xudmFyIG11c3RCZUVudHJ5UG9pbnRzID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgPyBudWxsIDogXCJhbiBhcnJheSBvciBhbiBvYmplY3RcIjtcbnZhciBtdXN0QmVXZWJBc3NlbWJseU1vZHVsZSA9ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5Nb2R1bGUgPyBudWxsIDogXCJhIFdlYkFzc2VtYmx5Lk1vZHVsZVwiO1xudmFyIG11c3RCZU9iamVjdE9yTnVsbCA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSA/IG51bGwgOiBcImFuIG9iamVjdCBvciBudWxsXCI7XG52YXIgbXVzdEJlU3RyaW5nT3JCb29sZWFuID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiA/IG51bGwgOiBcImEgc3RyaW5nIG9yIGEgYm9vbGVhblwiO1xudmFyIG11c3RCZVN0cmluZ09yT2JqZWN0ID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSA/IG51bGwgOiBcImEgc3RyaW5nIG9yIGFuIG9iamVjdFwiO1xudmFyIG11c3RCZVN0cmluZ09yQXJyYXlPZlN0cmluZ3MgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoeCkgPT4gdHlwZW9mIHggPT09IFwic3RyaW5nXCIpID8gbnVsbCA6IFwiYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nc1wiO1xudmFyIG11c3RCZVN0cmluZ09yVWludDhBcnJheSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSA/IG51bGwgOiBcImEgc3RyaW5nIG9yIGEgVWludDhBcnJheVwiO1xudmFyIG11c3RCZVN0cmluZ09yVVJMID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBVUkwgPyBudWxsIDogXCJhIHN0cmluZyBvciBhIFVSTFwiO1xuZnVuY3Rpb24gZ2V0RmxhZyhvYmplY3QsIGtleXMsIGtleSwgbXVzdEJlRm4pIHtcbiAgbGV0IHZhbHVlID0gb2JqZWN0W2tleV07XG4gIGtleXNba2V5ICsgXCJcIl0gPSB0cnVlO1xuICBpZiAodmFsdWUgPT09IHZvaWQgMCkgcmV0dXJuIHZvaWQgMDtcbiAgbGV0IG11c3RCZSA9IG11c3RCZUZuKHZhbHVlKTtcbiAgaWYgKG11c3RCZSAhPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGAke3F1b3RlKGtleSl9IG11c3QgYmUgJHttdXN0QmV9YCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9iamVjdCwga2V5cywgd2hlcmUpIHtcbiAgZm9yIChsZXQga2V5IGluIG9iamVjdCkge1xuICAgIGlmICghKGtleSBpbiBrZXlzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9wdGlvbiAke3doZXJlfTogJHtxdW90ZShrZXkpfWApO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVJbml0aWFsaXplT3B0aW9ucyhvcHRpb25zKSB7XG4gIGxldCBrZXlzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGxldCB3YXNtVVJMID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIndhc21VUkxcIiwgbXVzdEJlU3RyaW5nT3JVUkwpO1xuICBsZXQgd2FzbU1vZHVsZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ3YXNtTW9kdWxlXCIsIG11c3RCZVdlYkFzc2VtYmx5TW9kdWxlKTtcbiAgbGV0IHdvcmtlciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ3b3JrZXJcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMsIFwiaW4gaW5pdGlhbGl6ZSgpIGNhbGxcIik7XG4gIHJldHVybiB7XG4gICAgd2FzbVVSTCxcbiAgICB3YXNtTW9kdWxlLFxuICAgIHdvcmtlclxuICB9O1xufVxuZnVuY3Rpb24gdmFsaWRhdGVNYW5nbGVDYWNoZShtYW5nbGVDYWNoZSkge1xuICBsZXQgdmFsaWRhdGVkO1xuICBpZiAobWFuZ2xlQ2FjaGUgIT09IHZvaWQgMCkge1xuICAgIHZhbGlkYXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGtleSBpbiBtYW5nbGVDYWNoZSkge1xuICAgICAgbGV0IHZhbHVlID0gbWFuZ2xlQ2FjaGVba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHZhbGlkYXRlZFtrZXldID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7cXVvdGUoa2V5KX0gaW4gbWFuZ2xlIGNhY2hlIHRvIG1hcCB0byBlaXRoZXIgYSBzdHJpbmcgb3IgZmFsc2VgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbGlkYXRlZDtcbn1cbmZ1bmN0aW9uIHB1c2hMb2dGbGFncyhmbGFncywgb3B0aW9ucywga2V5cywgaXNUVFkyLCBsb2dMZXZlbERlZmF1bHQpIHtcbiAgbGV0IGNvbG9yID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImNvbG9yXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbG9nTGV2ZWwgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibG9nTGV2ZWxcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGxvZ0xpbWl0ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvZ0xpbWl0XCIsIG11c3RCZUludGVnZXIpO1xuICBpZiAoY29sb3IgIT09IHZvaWQgMCkgZmxhZ3MucHVzaChgLS1jb2xvcj0ke2NvbG9yfWApO1xuICBlbHNlIGlmIChpc1RUWTIpIGZsYWdzLnB1c2goYC0tY29sb3I9dHJ1ZWApO1xuICBmbGFncy5wdXNoKGAtLWxvZy1sZXZlbD0ke2xvZ0xldmVsIHx8IGxvZ0xldmVsRGVmYXVsdH1gKTtcbiAgZmxhZ3MucHVzaChgLS1sb2ctbGltaXQ9JHtsb2dMaW1pdCB8fCAwfWApO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmdWYWx1ZSh2YWx1ZSwgd2hhdCwga2V5KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHZhbHVlIGZvciAke3doYXR9JHtrZXkgIT09IHZvaWQgMCA/IFwiIFwiICsgcXVvdGUoa2V5KSA6IFwiXCJ9IHRvIGJlIGEgc3RyaW5nLCBnb3QgJHt0eXBlb2YgdmFsdWV9IGluc3RlYWRgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBwdXNoQ29tbW9uRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMpIHtcbiAgbGV0IGxlZ2FsQ29tbWVudHMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibGVnYWxDb21tZW50c1wiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgc291cmNlUm9vdCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VSb290XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBzb3VyY2VzQ29udGVudCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VzQ29udGVudFwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IHRhcmdldCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ0YXJnZXRcIiwgbXVzdEJlU3RyaW5nT3JBcnJheU9mU3RyaW5ncyk7XG4gIGxldCBmb3JtYXQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZm9ybWF0XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBnbG9iYWxOYW1lID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImdsb2JhbE5hbWVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IG1hbmdsZVByb3BzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1hbmdsZVByb3BzXCIsIG11c3RCZVJlZ0V4cCk7XG4gIGxldCByZXNlcnZlUHJvcHMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwicmVzZXJ2ZVByb3BzXCIsIG11c3RCZVJlZ0V4cCk7XG4gIGxldCBtYW5nbGVRdW90ZWQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlUXVvdGVkXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWluaWZ5ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1pbmlmeVwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IG1pbmlmeVN5bnRheCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJtaW5pZnlTeW50YXhcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBtaW5pZnlXaGl0ZXNwYWNlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1pbmlmeVdoaXRlc3BhY2VcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBtaW5pZnlJZGVudGlmaWVycyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJtaW5pZnlJZGVudGlmaWVyc1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGxpbmVMaW1pdCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJsaW5lTGltaXRcIiwgbXVzdEJlSW50ZWdlcik7XG4gIGxldCBkcm9wID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImRyb3BcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgZHJvcExhYmVscyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJkcm9wTGFiZWxzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IGNoYXJzZXQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiY2hhcnNldFwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgdHJlZVNoYWtpbmcgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwidHJlZVNoYWtpbmdcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBpZ25vcmVBbm5vdGF0aW9ucyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJpZ25vcmVBbm5vdGF0aW9uc1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGpzeCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGpzeEZhY3RvcnkgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwianN4RmFjdG9yeVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQganN4RnJhZ21lbnQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwianN4RnJhZ21lbnRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGpzeEltcG9ydFNvdXJjZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hJbXBvcnRTb3VyY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGpzeERldiA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hEZXZcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBqc3hTaWRlRWZmZWN0cyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hTaWRlRWZmZWN0c1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGRlZmluZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJkZWZpbmVcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IGxvZ092ZXJyaWRlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvZ092ZXJyaWRlXCIsIG11c3RCZU9iamVjdCk7XG4gIGxldCBzdXBwb3J0ZWQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwic3VwcG9ydGVkXCIsIG11c3RCZU9iamVjdCk7XG4gIGxldCBwdXJlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInB1cmVcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQga2VlcE5hbWVzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImtlZXBOYW1lc1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IHBsYXRmb3JtID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInBsYXRmb3JtXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCB0c2NvbmZpZ1JhdyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ0c2NvbmZpZ1Jhd1wiLCBtdXN0QmVTdHJpbmdPck9iamVjdCk7XG4gIGxldCBhYnNQYXRocyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJhYnNQYXRoc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gIGlmIChsZWdhbENvbW1lbnRzKSBmbGFncy5wdXNoKGAtLWxlZ2FsLWNvbW1lbnRzPSR7bGVnYWxDb21tZW50c31gKTtcbiAgaWYgKHNvdXJjZVJvb3QgIT09IHZvaWQgMCkgZmxhZ3MucHVzaChgLS1zb3VyY2Utcm9vdD0ke3NvdXJjZVJvb3R9YCk7XG4gIGlmIChzb3VyY2VzQ29udGVudCAhPT0gdm9pZCAwKSBmbGFncy5wdXNoKGAtLXNvdXJjZXMtY29udGVudD0ke3NvdXJjZXNDb250ZW50fWApO1xuICBpZiAodGFyZ2V0KSBmbGFncy5wdXNoKGAtLXRhcmdldD0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldCA6IFt0YXJnZXRdLCBcInRhcmdldFwiKX1gKTtcbiAgaWYgKGZvcm1hdCkgZmxhZ3MucHVzaChgLS1mb3JtYXQ9JHtmb3JtYXR9YCk7XG4gIGlmIChnbG9iYWxOYW1lKSBmbGFncy5wdXNoKGAtLWdsb2JhbC1uYW1lPSR7Z2xvYmFsTmFtZX1gKTtcbiAgaWYgKHBsYXRmb3JtKSBmbGFncy5wdXNoKGAtLXBsYXRmb3JtPSR7cGxhdGZvcm19YCk7XG4gIGlmICh0c2NvbmZpZ1JhdykgZmxhZ3MucHVzaChgLS10c2NvbmZpZy1yYXc9JHt0eXBlb2YgdHNjb25maWdSYXcgPT09IFwic3RyaW5nXCIgPyB0c2NvbmZpZ1JhdyA6IEpTT04uc3RyaW5naWZ5KHRzY29uZmlnUmF3KX1gKTtcbiAgaWYgKG1pbmlmeSkgZmxhZ3MucHVzaChcIi0tbWluaWZ5XCIpO1xuICBpZiAobWluaWZ5U3ludGF4KSBmbGFncy5wdXNoKFwiLS1taW5pZnktc3ludGF4XCIpO1xuICBpZiAobWluaWZ5V2hpdGVzcGFjZSkgZmxhZ3MucHVzaChcIi0tbWluaWZ5LXdoaXRlc3BhY2VcIik7XG4gIGlmIChtaW5pZnlJZGVudGlmaWVycykgZmxhZ3MucHVzaChcIi0tbWluaWZ5LWlkZW50aWZpZXJzXCIpO1xuICBpZiAobGluZUxpbWl0KSBmbGFncy5wdXNoKGAtLWxpbmUtbGltaXQ9JHtsaW5lTGltaXR9YCk7XG4gIGlmIChjaGFyc2V0KSBmbGFncy5wdXNoKGAtLWNoYXJzZXQ9JHtjaGFyc2V0fWApO1xuICBpZiAodHJlZVNoYWtpbmcgIT09IHZvaWQgMCkgZmxhZ3MucHVzaChgLS10cmVlLXNoYWtpbmc9JHt0cmVlU2hha2luZ31gKTtcbiAgaWYgKGlnbm9yZUFubm90YXRpb25zKSBmbGFncy5wdXNoKGAtLWlnbm9yZS1hbm5vdGF0aW9uc2ApO1xuICBpZiAoZHJvcCkgZm9yIChsZXQgd2hhdCBvZiBkcm9wKSBmbGFncy5wdXNoKGAtLWRyb3A6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKHdoYXQsIFwiZHJvcFwiKX1gKTtcbiAgaWYgKGRyb3BMYWJlbHMpIGZsYWdzLnB1c2goYC0tZHJvcC1sYWJlbHM9JHt2YWxpZGF0ZUFuZEpvaW5TdHJpbmdBcnJheShkcm9wTGFiZWxzLCBcImRyb3AgbGFiZWxcIil9YCk7XG4gIGlmIChhYnNQYXRocykgZmxhZ3MucHVzaChgLS1hYnMtcGF0aHM9JHt2YWxpZGF0ZUFuZEpvaW5TdHJpbmdBcnJheShhYnNQYXRocywgXCJhYnMgcGF0aHNcIil9YCk7XG4gIGlmIChtYW5nbGVQcm9wcykgZmxhZ3MucHVzaChgLS1tYW5nbGUtcHJvcHM9JHtqc1JlZ0V4cFRvR29SZWdFeHAobWFuZ2xlUHJvcHMpfWApO1xuICBpZiAocmVzZXJ2ZVByb3BzKSBmbGFncy5wdXNoKGAtLXJlc2VydmUtcHJvcHM9JHtqc1JlZ0V4cFRvR29SZWdFeHAocmVzZXJ2ZVByb3BzKX1gKTtcbiAgaWYgKG1hbmdsZVF1b3RlZCAhPT0gdm9pZCAwKSBmbGFncy5wdXNoKGAtLW1hbmdsZS1xdW90ZWQ9JHttYW5nbGVRdW90ZWR9YCk7XG4gIGlmIChqc3gpIGZsYWdzLnB1c2goYC0tanN4PSR7anN4fWApO1xuICBpZiAoanN4RmFjdG9yeSkgZmxhZ3MucHVzaChgLS1qc3gtZmFjdG9yeT0ke2pzeEZhY3Rvcnl9YCk7XG4gIGlmIChqc3hGcmFnbWVudCkgZmxhZ3MucHVzaChgLS1qc3gtZnJhZ21lbnQ9JHtqc3hGcmFnbWVudH1gKTtcbiAgaWYgKGpzeEltcG9ydFNvdXJjZSkgZmxhZ3MucHVzaChgLS1qc3gtaW1wb3J0LXNvdXJjZT0ke2pzeEltcG9ydFNvdXJjZX1gKTtcbiAgaWYgKGpzeERldikgZmxhZ3MucHVzaChgLS1qc3gtZGV2YCk7XG4gIGlmIChqc3hTaWRlRWZmZWN0cykgZmxhZ3MucHVzaChgLS1qc3gtc2lkZS1lZmZlY3RzYCk7XG4gIGlmIChkZWZpbmUpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gZGVmaW5lKSB7XG4gICAgICBpZiAoa2V5LmluZGV4T2YoXCI9XCIpID49IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZWZpbmU6ICR7a2V5fWApO1xuICAgICAgZmxhZ3MucHVzaChgLS1kZWZpbmU6JHtrZXl9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShkZWZpbmVba2V5XSwgXCJkZWZpbmVcIiwga2V5KX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKGxvZ092ZXJyaWRlKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGxvZ092ZXJyaWRlKSB7XG4gICAgICBpZiAoa2V5LmluZGV4T2YoXCI9XCIpID49IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb2cgb3ZlcnJpZGU6ICR7a2V5fWApO1xuICAgICAgZmxhZ3MucHVzaChgLS1sb2ctb3ZlcnJpZGU6JHtrZXl9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShsb2dPdmVycmlkZVtrZXldLCBcImxvZyBvdmVycmlkZVwiLCBrZXkpfWApO1xuICAgIH1cbiAgfVxuICBpZiAoc3VwcG9ydGVkKSB7XG4gICAgZm9yIChsZXQga2V5IGluIHN1cHBvcnRlZCkge1xuICAgICAgaWYgKGtleS5pbmRleE9mKFwiPVwiKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3VwcG9ydGVkOiAke2tleX1gKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gc3VwcG9ydGVkW2tleV07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB2YWx1ZSBmb3Igc3VwcG9ydGVkICR7cXVvdGUoa2V5KX0gdG8gYmUgYSBib29sZWFuLCBnb3QgJHt0eXBlb2YgdmFsdWV9IGluc3RlYWRgKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tc3VwcG9ydGVkOiR7a2V5fT0ke3ZhbHVlfWApO1xuICAgIH1cbiAgfVxuICBpZiAocHVyZSkgZm9yIChsZXQgZm4gb2YgcHVyZSkgZmxhZ3MucHVzaChgLS1wdXJlOiR7dmFsaWRhdGVTdHJpbmdWYWx1ZShmbiwgXCJwdXJlXCIpfWApO1xuICBpZiAoa2VlcE5hbWVzKSBmbGFncy5wdXNoKGAtLWtlZXAtbmFtZXNgKTtcbn1cbmZ1bmN0aW9uIGZsYWdzRm9yQnVpbGRPcHRpb25zKGNhbGxOYW1lLCBvcHRpb25zLCBpc1RUWTIsIGxvZ0xldmVsRGVmYXVsdCwgd3JpdGVEZWZhdWx0KSB7XG4gIHZhciBfYTI7XG4gIGxldCBmbGFncyA9IFtdO1xuICBsZXQgZW50cmllcyA9IFtdO1xuICBsZXQga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgc3RkaW5Db250ZW50cyA9IG51bGw7XG4gIGxldCBzdGRpblJlc29sdmVEaXIgPSBudWxsO1xuICBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMsIGlzVFRZMiwgbG9nTGV2ZWxEZWZhdWx0KTtcbiAgcHVzaENvbW1vbkZsYWdzKGZsYWdzLCBvcHRpb25zLCBrZXlzKTtcbiAgbGV0IHNvdXJjZW1hcCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VtYXBcIiwgbXVzdEJlU3RyaW5nT3JCb29sZWFuKTtcbiAgbGV0IGJ1bmRsZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJidW5kbGVcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBzcGxpdHRpbmcgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwic3BsaXR0aW5nXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgcHJlc2VydmVTeW1saW5rcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJwcmVzZXJ2ZVN5bWxpbmtzXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWV0YWZpbGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWV0YWZpbGVcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBvdXRmaWxlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm91dGZpbGVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IG91dGRpciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJvdXRkaXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IG91dGJhc2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwib3V0YmFzZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgdHNjb25maWcgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwidHNjb25maWdcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IHJlc29sdmVFeHRlbnNpb25zID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInJlc29sdmVFeHRlbnNpb25zXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IG5vZGVQYXRoc0lucHV0ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm5vZGVQYXRoc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gIGxldCBtYWluRmllbGRzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1haW5GaWVsZHNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgY29uZGl0aW9ucyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJjb25kaXRpb25zXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IGV4dGVybmFsID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImV4dGVybmFsXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IHBhY2thZ2VzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInBhY2thZ2VzXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBhbGlhcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJhbGlhc1wiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgbG9hZGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvYWRlclwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgb3V0RXh0ZW5zaW9uID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm91dEV4dGVuc2lvblwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgcHVibGljUGF0aCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJwdWJsaWNQYXRoXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBlbnRyeU5hbWVzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImVudHJ5TmFtZXNcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGNodW5rTmFtZXMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiY2h1bmtOYW1lc1wiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgYXNzZXROYW1lcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJhc3NldE5hbWVzXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBpbmplY3QgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiaW5qZWN0XCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IGJhbm5lciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJiYW5uZXJcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IGZvb3RlciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJmb290ZXJcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IGVudHJ5UG9pbnRzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImVudHJ5UG9pbnRzXCIsIG11c3RCZUVudHJ5UG9pbnRzKTtcbiAgbGV0IGFic1dvcmtpbmdEaXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiYWJzV29ya2luZ0RpclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgc3RkaW4gPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwic3RkaW5cIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IHdyaXRlID0gKF9hMiA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ3cml0ZVwiLCBtdXN0QmVCb29sZWFuKSkgIT0gbnVsbCA/IF9hMiA6IHdyaXRlRGVmYXVsdDtcbiAgbGV0IGFsbG93T3ZlcndyaXRlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImFsbG93T3ZlcndyaXRlXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWFuZ2xlQ2FjaGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlQ2FjaGVcIiwgbXVzdEJlT2JqZWN0KTtcbiAga2V5cy5wbHVnaW5zID0gdHJ1ZTtcbiAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5cywgYGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICBpZiAoc291cmNlbWFwKSBmbGFncy5wdXNoKGAtLXNvdXJjZW1hcCR7c291cmNlbWFwID09PSB0cnVlID8gXCJcIiA6IGA9JHtzb3VyY2VtYXB9YH1gKTtcbiAgaWYgKGJ1bmRsZSkgZmxhZ3MucHVzaChcIi0tYnVuZGxlXCIpO1xuICBpZiAoYWxsb3dPdmVyd3JpdGUpIGZsYWdzLnB1c2goXCItLWFsbG93LW92ZXJ3cml0ZVwiKTtcbiAgaWYgKHNwbGl0dGluZykgZmxhZ3MucHVzaChcIi0tc3BsaXR0aW5nXCIpO1xuICBpZiAocHJlc2VydmVTeW1saW5rcykgZmxhZ3MucHVzaChcIi0tcHJlc2VydmUtc3ltbGlua3NcIik7XG4gIGlmIChtZXRhZmlsZSkgZmxhZ3MucHVzaChgLS1tZXRhZmlsZWApO1xuICBpZiAob3V0ZmlsZSkgZmxhZ3MucHVzaChgLS1vdXRmaWxlPSR7b3V0ZmlsZX1gKTtcbiAgaWYgKG91dGRpcikgZmxhZ3MucHVzaChgLS1vdXRkaXI9JHtvdXRkaXJ9YCk7XG4gIGlmIChvdXRiYXNlKSBmbGFncy5wdXNoKGAtLW91dGJhc2U9JHtvdXRiYXNlfWApO1xuICBpZiAodHNjb25maWcpIGZsYWdzLnB1c2goYC0tdHNjb25maWc9JHt0c2NvbmZpZ31gKTtcbiAgaWYgKHBhY2thZ2VzKSBmbGFncy5wdXNoKGAtLXBhY2thZ2VzPSR7cGFja2FnZXN9YCk7XG4gIGlmIChyZXNvbHZlRXh0ZW5zaW9ucykgZmxhZ3MucHVzaChgLS1yZXNvbHZlLWV4dGVuc2lvbnM9JHt2YWxpZGF0ZUFuZEpvaW5TdHJpbmdBcnJheShyZXNvbHZlRXh0ZW5zaW9ucywgXCJyZXNvbHZlIGV4dGVuc2lvblwiKX1gKTtcbiAgaWYgKHB1YmxpY1BhdGgpIGZsYWdzLnB1c2goYC0tcHVibGljLXBhdGg9JHtwdWJsaWNQYXRofWApO1xuICBpZiAoZW50cnlOYW1lcykgZmxhZ3MucHVzaChgLS1lbnRyeS1uYW1lcz0ke2VudHJ5TmFtZXN9YCk7XG4gIGlmIChjaHVua05hbWVzKSBmbGFncy5wdXNoKGAtLWNodW5rLW5hbWVzPSR7Y2h1bmtOYW1lc31gKTtcbiAgaWYgKGFzc2V0TmFtZXMpIGZsYWdzLnB1c2goYC0tYXNzZXQtbmFtZXM9JHthc3NldE5hbWVzfWApO1xuICBpZiAobWFpbkZpZWxkcykgZmxhZ3MucHVzaChgLS1tYWluLWZpZWxkcz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KG1haW5GaWVsZHMsIFwibWFpbiBmaWVsZFwiKX1gKTtcbiAgaWYgKGNvbmRpdGlvbnMpIGZsYWdzLnB1c2goYC0tY29uZGl0aW9ucz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KGNvbmRpdGlvbnMsIFwiY29uZGl0aW9uXCIpfWApO1xuICBpZiAoZXh0ZXJuYWwpIGZvciAobGV0IG5hbWUgb2YgZXh0ZXJuYWwpIGZsYWdzLnB1c2goYC0tZXh0ZXJuYWw6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKG5hbWUsIFwiZXh0ZXJuYWxcIil9YCk7XG4gIGlmIChhbGlhcykge1xuICAgIGZvciAobGV0IG9sZCBpbiBhbGlhcykge1xuICAgICAgaWYgKG9sZC5pbmRleE9mKFwiPVwiKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFja2FnZSBuYW1lIGluIGFsaWFzOiAke29sZH1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tYWxpYXM6JHtvbGR9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShhbGlhc1tvbGRdLCBcImFsaWFzXCIsIG9sZCl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChiYW5uZXIpIHtcbiAgICBmb3IgKGxldCB0eXBlIGluIGJhbm5lcikge1xuICAgICAgaWYgKHR5cGUuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGJhbm5lciBmaWxlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tYmFubmVyOiR7dHlwZX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGJhbm5lclt0eXBlXSwgXCJiYW5uZXJcIiwgdHlwZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChmb290ZXIpIHtcbiAgICBmb3IgKGxldCB0eXBlIGluIGZvb3Rlcikge1xuICAgICAgaWYgKHR5cGUuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvb3RlciBmaWxlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tZm9vdGVyOiR7dHlwZX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGZvb3Rlclt0eXBlXSwgXCJmb290ZXJcIiwgdHlwZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChpbmplY3QpIGZvciAobGV0IHBhdGgzIG9mIGluamVjdCkgZmxhZ3MucHVzaChgLS1pbmplY3Q6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKHBhdGgzLCBcImluamVjdFwiKX1gKTtcbiAgaWYgKGxvYWRlcikge1xuICAgIGZvciAobGV0IGV4dCBpbiBsb2FkZXIpIHtcbiAgICAgIGlmIChleHQuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGxvYWRlciBleHRlbnNpb246ICR7ZXh0fWApO1xuICAgICAgZmxhZ3MucHVzaChgLS1sb2FkZXI6JHtleHR9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShsb2FkZXJbZXh0XSwgXCJsb2FkZXJcIiwgZXh0KX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKG91dEV4dGVuc2lvbikge1xuICAgIGZvciAobGV0IGV4dCBpbiBvdXRFeHRlbnNpb24pIHtcbiAgICAgIGlmIChleHQuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG91dCBleHRlbnNpb246ICR7ZXh0fWApO1xuICAgICAgZmxhZ3MucHVzaChgLS1vdXQtZXh0ZW5zaW9uOiR7ZXh0fT0ke3ZhbGlkYXRlU3RyaW5nVmFsdWUob3V0RXh0ZW5zaW9uW2V4dF0sIFwib3V0IGV4dGVuc2lvblwiLCBleHQpfWApO1xuICAgIH1cbiAgfVxuICBpZiAoZW50cnlQb2ludHMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeVBvaW50cykpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gZW50cnlQb2ludHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGxldCBlbnRyeVBvaW50ID0gZW50cnlQb2ludHNbaV07XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnlQb2ludCA9PT0gXCJvYmplY3RcIiAmJiBlbnRyeVBvaW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgbGV0IGVudHJ5UG9pbnRLZXlzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgbGV0IGlucHV0ID0gZ2V0RmxhZyhlbnRyeVBvaW50LCBlbnRyeVBvaW50S2V5cywgXCJpblwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBvdXRwdXQgPSBnZXRGbGFnKGVudHJ5UG9pbnQsIGVudHJ5UG9pbnRLZXlzLCBcIm91dFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKGVudHJ5UG9pbnQsIGVudHJ5UG9pbnRLZXlzLCBcImluIGVudHJ5IHBvaW50IGF0IGluZGV4IFwiICsgaSk7XG4gICAgICAgICAgaWYgKGlucHV0ID09PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcm9wZXJ0eSBcImluXCIgZm9yIGVudHJ5IHBvaW50IGF0IGluZGV4ICcgKyBpKTtcbiAgICAgICAgICBpZiAob3V0cHV0ID09PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcm9wZXJ0eSBcIm91dFwiIGZvciBlbnRyeSBwb2ludCBhdCBpbmRleCAnICsgaSk7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtvdXRwdXQsIGlucHV0XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtcIlwiLCB2YWxpZGF0ZVN0cmluZ1ZhbHVlKGVudHJ5UG9pbnQsIFwiZW50cnkgcG9pbnQgYXQgaW5kZXggXCIgKyBpKV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiBlbnRyeVBvaW50cykge1xuICAgICAgICBlbnRyaWVzLnB1c2goW2tleSwgdmFsaWRhdGVTdHJpbmdWYWx1ZShlbnRyeVBvaW50c1trZXldLCBcImVudHJ5IHBvaW50XCIsIGtleSldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHN0ZGluKSB7XG4gICAgbGV0IHN0ZGluS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjb250ZW50cyA9IGdldEZsYWcoc3RkaW4sIHN0ZGluS2V5cywgXCJjb250ZW50c1wiLCBtdXN0QmVTdHJpbmdPclVpbnQ4QXJyYXkpO1xuICAgIGxldCByZXNvbHZlRGlyID0gZ2V0RmxhZyhzdGRpbiwgc3RkaW5LZXlzLCBcInJlc29sdmVEaXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICBsZXQgc291cmNlZmlsZSA9IGdldEZsYWcoc3RkaW4sIHN0ZGluS2V5cywgXCJzb3VyY2VmaWxlXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IGxvYWRlcjIgPSBnZXRGbGFnKHN0ZGluLCBzdGRpbktleXMsIFwibG9hZGVyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Moc3RkaW4sIHN0ZGluS2V5cywgJ2luIFwic3RkaW5cIiBvYmplY3QnKTtcbiAgICBpZiAoc291cmNlZmlsZSkgZmxhZ3MucHVzaChgLS1zb3VyY2VmaWxlPSR7c291cmNlZmlsZX1gKTtcbiAgICBpZiAobG9hZGVyMikgZmxhZ3MucHVzaChgLS1sb2FkZXI9JHtsb2FkZXIyfWApO1xuICAgIGlmIChyZXNvbHZlRGlyKSBzdGRpblJlc29sdmVEaXIgPSByZXNvbHZlRGlyO1xuICAgIGlmICh0eXBlb2YgY29udGVudHMgPT09IFwic3RyaW5nXCIpIHN0ZGluQ29udGVudHMgPSBlbmNvZGVVVEY4KGNvbnRlbnRzKTtcbiAgICBlbHNlIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHN0ZGluQ29udGVudHMgPSBjb250ZW50cztcbiAgfVxuICBsZXQgbm9kZVBhdGhzID0gW107XG4gIGlmIChub2RlUGF0aHNJbnB1dCkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIG5vZGVQYXRoc0lucHV0KSB7XG4gICAgICB2YWx1ZSArPSBcIlwiO1xuICAgICAgbm9kZVBhdGhzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGVudHJpZXMsXG4gICAgZmxhZ3MsXG4gICAgd3JpdGUsXG4gICAgc3RkaW5Db250ZW50cyxcbiAgICBzdGRpblJlc29sdmVEaXIsXG4gICAgYWJzV29ya2luZ0RpcixcbiAgICBub2RlUGF0aHMsXG4gICAgbWFuZ2xlQ2FjaGU6IHZhbGlkYXRlTWFuZ2xlQ2FjaGUobWFuZ2xlQ2FjaGUpXG4gIH07XG59XG5mdW5jdGlvbiBmbGFnc0ZvclRyYW5zZm9ybU9wdGlvbnMoY2FsbE5hbWUsIG9wdGlvbnMsIGlzVFRZMiwgbG9nTGV2ZWxEZWZhdWx0KSB7XG4gIGxldCBmbGFncyA9IFtdO1xuICBsZXQga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMsIGlzVFRZMiwgbG9nTGV2ZWxEZWZhdWx0KTtcbiAgcHVzaENvbW1vbkZsYWdzKGZsYWdzLCBvcHRpb25zLCBrZXlzKTtcbiAgbGV0IHNvdXJjZW1hcCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VtYXBcIiwgbXVzdEJlU3RyaW5nT3JCb29sZWFuKTtcbiAgbGV0IHNvdXJjZWZpbGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwic291cmNlZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgbG9hZGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvYWRlclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgYmFubmVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImJhbm5lclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgZm9vdGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImZvb3RlclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgbWFuZ2xlQ2FjaGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlQ2FjaGVcIiwgbXVzdEJlT2JqZWN0KTtcbiAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5cywgYGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICBpZiAoc291cmNlbWFwKSBmbGFncy5wdXNoKGAtLXNvdXJjZW1hcD0ke3NvdXJjZW1hcCA9PT0gdHJ1ZSA/IFwiZXh0ZXJuYWxcIiA6IHNvdXJjZW1hcH1gKTtcbiAgaWYgKHNvdXJjZWZpbGUpIGZsYWdzLnB1c2goYC0tc291cmNlZmlsZT0ke3NvdXJjZWZpbGV9YCk7XG4gIGlmIChsb2FkZXIpIGZsYWdzLnB1c2goYC0tbG9hZGVyPSR7bG9hZGVyfWApO1xuICBpZiAoYmFubmVyKSBmbGFncy5wdXNoKGAtLWJhbm5lcj0ke2Jhbm5lcn1gKTtcbiAgaWYgKGZvb3RlcikgZmxhZ3MucHVzaChgLS1mb290ZXI9JHtmb290ZXJ9YCk7XG4gIHJldHVybiB7XG4gICAgZmxhZ3MsXG4gICAgbWFuZ2xlQ2FjaGU6IHZhbGlkYXRlTWFuZ2xlQ2FjaGUobWFuZ2xlQ2FjaGUpXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDaGFubmVsKHN0cmVhbUluKSB7XG4gIGNvbnN0IHJlcXVlc3RDYWxsYmFja3NCeUtleSA9IHt9O1xuICBjb25zdCBjbG9zZURhdGEgPSB7IGRpZENsb3NlOiBmYWxzZSwgcmVhc29uOiBcIlwiIH07XG4gIGxldCByZXNwb25zZUNhbGxiYWNrcyA9IHt9O1xuICBsZXQgbmV4dFJlcXVlc3RJRCA9IDA7XG4gIGxldCBuZXh0QnVpbGRLZXkgPSAwO1xuICBsZXQgc3Rkb3V0ID0gbmV3IFVpbnQ4QXJyYXkoMTYgKiAxMDI0KTtcbiAgbGV0IHN0ZG91dFVzZWQgPSAwO1xuICBsZXQgcmVhZEZyb21TdGRvdXQgPSAoY2h1bmspID0+IHtcbiAgICBsZXQgbGltaXQgPSBzdGRvdXRVc2VkICsgY2h1bmsubGVuZ3RoO1xuICAgIGlmIChsaW1pdCA+IHN0ZG91dC5sZW5ndGgpIHtcbiAgICAgIGxldCBzd2FwID0gbmV3IFVpbnQ4QXJyYXkobGltaXQgKiAyKTtcbiAgICAgIHN3YXAuc2V0KHN0ZG91dCk7XG4gICAgICBzdGRvdXQgPSBzd2FwO1xuICAgIH1cbiAgICBzdGRvdXQuc2V0KGNodW5rLCBzdGRvdXRVc2VkKTtcbiAgICBzdGRvdXRVc2VkICs9IGNodW5rLmxlbmd0aDtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICB3aGlsZSAob2Zmc2V0ICsgNCA8PSBzdGRvdXRVc2VkKSB7XG4gICAgICBsZXQgbGVuZ3RoID0gcmVhZFVJbnQzMkxFKHN0ZG91dCwgb2Zmc2V0KTtcbiAgICAgIGlmIChvZmZzZXQgKyA0ICsgbGVuZ3RoID4gc3Rkb3V0VXNlZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG9mZnNldCArPSA0O1xuICAgICAgaGFuZGxlSW5jb21pbmdQYWNrZXQoc3Rkb3V0LnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSk7XG4gICAgICBvZmZzZXQgKz0gbGVuZ3RoO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgc3Rkb3V0LmNvcHlXaXRoaW4oMCwgb2Zmc2V0LCBzdGRvdXRVc2VkKTtcbiAgICAgIHN0ZG91dFVzZWQgLT0gb2Zmc2V0O1xuICAgIH1cbiAgfTtcbiAgbGV0IGFmdGVyQ2xvc2UgPSAoZXJyb3IpID0+IHtcbiAgICBjbG9zZURhdGEuZGlkQ2xvc2UgPSB0cnVlO1xuICAgIGlmIChlcnJvcikgY2xvc2VEYXRhLnJlYXNvbiA9IFwiOiBcIiArIChlcnJvci5tZXNzYWdlIHx8IGVycm9yKTtcbiAgICBjb25zdCB0ZXh0ID0gXCJUaGUgc2VydmljZSB3YXMgc3RvcHBlZFwiICsgY2xvc2VEYXRhLnJlYXNvbjtcbiAgICBmb3IgKGxldCBpZCBpbiByZXNwb25zZUNhbGxiYWNrcykge1xuICAgICAgcmVzcG9uc2VDYWxsYmFja3NbaWRdKHRleHQsIG51bGwpO1xuICAgIH1cbiAgICByZXNwb25zZUNhbGxiYWNrcyA9IHt9O1xuICB9O1xuICBsZXQgc2VuZFJlcXVlc3QgPSAocmVmcywgdmFsdWUsIGNhbGxiYWNrKSA9PiB7XG4gICAgaWYgKGNsb3NlRGF0YS5kaWRDbG9zZSkgcmV0dXJuIGNhbGxiYWNrKFwiVGhlIHNlcnZpY2UgaXMgbm8gbG9uZ2VyIHJ1bm5pbmdcIiArIGNsb3NlRGF0YS5yZWFzb24sIG51bGwpO1xuICAgIGxldCBpZCA9IG5leHRSZXF1ZXN0SUQrKztcbiAgICByZXNwb25zZUNhbGxiYWNrc1tpZF0gPSAoZXJyb3IsIHJlc3BvbnNlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjYWxsYmFjayhlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHJlZnMpIHJlZnMudW5yZWYoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChyZWZzKSByZWZzLnJlZigpO1xuICAgIHN0cmVhbUluLndyaXRlVG9TdGRpbihlbmNvZGVQYWNrZXQoeyBpZCwgaXNSZXF1ZXN0OiB0cnVlLCB2YWx1ZSB9KSk7XG4gIH07XG4gIGxldCBzZW5kUmVzcG9uc2UgPSAoaWQsIHZhbHVlKSA9PiB7XG4gICAgaWYgKGNsb3NlRGF0YS5kaWRDbG9zZSkgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHNlcnZpY2UgaXMgbm8gbG9uZ2VyIHJ1bm5pbmdcIiArIGNsb3NlRGF0YS5yZWFzb24pO1xuICAgIHN0cmVhbUluLndyaXRlVG9TdGRpbihlbmNvZGVQYWNrZXQoeyBpZCwgaXNSZXF1ZXN0OiBmYWxzZSwgdmFsdWUgfSkpO1xuICB9O1xuICBsZXQgaGFuZGxlUmVxdWVzdCA9IGFzeW5jIChpZCwgcmVxdWVzdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAocmVxdWVzdC5jb21tYW5kID09PSBcInBpbmdcIikge1xuICAgICAgICBzZW5kUmVzcG9uc2UoaWQsIHt9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0LmtleSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCByZXF1ZXN0Q2FsbGJhY2tzID0gcmVxdWVzdENhbGxiYWNrc0J5S2V5W3JlcXVlc3Qua2V5XTtcbiAgICAgICAgaWYgKCFyZXF1ZXN0Q2FsbGJhY2tzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcmVxdWVzdENhbGxiYWNrc1tyZXF1ZXN0LmNvbW1hbmRdO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICBhd2FpdCBjYWxsYmFjayhpZCwgcmVxdWVzdCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29tbWFuZDogYCArIHJlcXVlc3QuY29tbWFuZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gW2V4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgbnVsbCwgdm9pZCAwLCBcIlwiKV07XG4gICAgICB0cnkge1xuICAgICAgICBzZW5kUmVzcG9uc2UoaWQsIHsgZXJyb3JzIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBsZXQgaXNGaXJzdFBhY2tldCA9IHRydWU7XG4gIGxldCBoYW5kbGVJbmNvbWluZ1BhY2tldCA9IChieXRlcykgPT4ge1xuICAgIGlmIChpc0ZpcnN0UGFja2V0KSB7XG4gICAgICBpc0ZpcnN0UGFja2V0ID0gZmFsc2U7XG4gICAgICBsZXQgYmluYXJ5VmVyc2lvbiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMpO1xuICAgICAgaWYgKGJpbmFyeVZlcnNpb24gIT09IFwiMC4yNS4xMlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHN0YXJ0IHNlcnZpY2U6IEhvc3QgdmVyc2lvbiBcIiR7XCIwLjI1LjEyXCJ9XCIgZG9lcyBub3QgbWF0Y2ggYmluYXJ5IHZlcnNpb24gJHtxdW90ZShiaW5hcnlWZXJzaW9uKX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHBhY2tldCA9IGRlY29kZVBhY2tldChieXRlcyk7XG4gICAgaWYgKHBhY2tldC5pc1JlcXVlc3QpIHtcbiAgICAgIGhhbmRsZVJlcXVlc3QocGFja2V0LmlkLCBwYWNrZXQudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2FsbGJhY2sgPSByZXNwb25zZUNhbGxiYWNrc1twYWNrZXQuaWRdO1xuICAgICAgZGVsZXRlIHJlc3BvbnNlQ2FsbGJhY2tzW3BhY2tldC5pZF07XG4gICAgICBpZiAocGFja2V0LnZhbHVlLmVycm9yKSBjYWxsYmFjayhwYWNrZXQudmFsdWUuZXJyb3IsIHt9KTtcbiAgICAgIGVsc2UgY2FsbGJhY2sobnVsbCwgcGFja2V0LnZhbHVlKTtcbiAgICB9XG4gIH07XG4gIGxldCBidWlsZE9yQ29udGV4dCA9ICh7IGNhbGxOYW1lLCByZWZzLCBvcHRpb25zLCBpc1RUWTogaXNUVFkyLCBkZWZhdWx0V0Q6IGRlZmF1bHRXRDIsIGNhbGxiYWNrIH0pID0+IHtcbiAgICBsZXQgcmVmQ291bnQgPSAwO1xuICAgIGNvbnN0IGJ1aWxkS2V5ID0gbmV4dEJ1aWxkS2V5Kys7XG4gICAgY29uc3QgcmVxdWVzdENhbGxiYWNrcyA9IHt9O1xuICAgIGNvbnN0IGJ1aWxkUmVmcyA9IHtcbiAgICAgIHJlZigpIHtcbiAgICAgICAgaWYgKCsrcmVmQ291bnQgPT09IDEpIHtcbiAgICAgICAgICBpZiAocmVmcykgcmVmcy5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVucmVmKCkge1xuICAgICAgICBpZiAoLS1yZWZDb3VudCA9PT0gMCkge1xuICAgICAgICAgIGRlbGV0ZSByZXF1ZXN0Q2FsbGJhY2tzQnlLZXlbYnVpbGRLZXldO1xuICAgICAgICAgIGlmIChyZWZzKSByZWZzLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJlcXVlc3RDYWxsYmFja3NCeUtleVtidWlsZEtleV0gPSByZXF1ZXN0Q2FsbGJhY2tzO1xuICAgIGJ1aWxkUmVmcy5yZWYoKTtcbiAgICBidWlsZE9yQ29udGV4dEltcGwoXG4gICAgICBjYWxsTmFtZSxcbiAgICAgIGJ1aWxkS2V5LFxuICAgICAgc2VuZFJlcXVlc3QsXG4gICAgICBzZW5kUmVzcG9uc2UsXG4gICAgICBidWlsZFJlZnMsXG4gICAgICBzdHJlYW1JbixcbiAgICAgIHJlcXVlc3RDYWxsYmFja3MsXG4gICAgICBvcHRpb25zLFxuICAgICAgaXNUVFkyLFxuICAgICAgZGVmYXVsdFdEMixcbiAgICAgIChlcnIsIHJlcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBidWlsZFJlZnMudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH07XG4gIGxldCB0cmFuc2Zvcm0yID0gKHsgY2FsbE5hbWUsIHJlZnMsIGlucHV0LCBvcHRpb25zLCBpc1RUWTogaXNUVFkyLCBmczogZnMzLCBjYWxsYmFjayB9KSA9PiB7XG4gICAgY29uc3QgZGV0YWlscyA9IGNyZWF0ZU9iamVjdFN0YXNoKCk7XG4gICAgbGV0IHN0YXJ0ID0gKGlucHV0UGF0aCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJzdHJpbmdcIiAmJiAhKGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgaW5wdXQgdG8gXCJ0cmFuc2Zvcm1cIiBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgVWludDhBcnJheScpO1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGZsYWdzLFxuICAgICAgICAgIG1hbmdsZUNhY2hlXG4gICAgICAgIH0gPSBmbGFnc0ZvclRyYW5zZm9ybU9wdGlvbnMoY2FsbE5hbWUsIG9wdGlvbnMsIGlzVFRZMiwgdHJhbnNmb3JtTG9nTGV2ZWxEZWZhdWx0KTtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgY29tbWFuZDogXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgICBmbGFncyxcbiAgICAgICAgICBpbnB1dEZTOiBpbnB1dFBhdGggIT09IG51bGwsXG4gICAgICAgICAgaW5wdXQ6IGlucHV0UGF0aCAhPT0gbnVsbCA/IGVuY29kZVVURjgoaW5wdXRQYXRoKSA6IHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiA/IGVuY29kZVVURjgoaW5wdXQpIDogaW5wdXRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG1hbmdsZUNhY2hlKSByZXF1ZXN0Lm1hbmdsZUNhY2hlID0gbWFuZ2xlQ2FjaGU7XG4gICAgICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QsIChlcnJvciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoZXJyb3IpLCBudWxsKTtcbiAgICAgICAgICBsZXQgZXJyb3JzID0gcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLmVycm9ycywgZGV0YWlscyk7XG4gICAgICAgICAgbGV0IHdhcm5pbmdzID0gcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLndhcm5pbmdzLCBkZXRhaWxzKTtcbiAgICAgICAgICBsZXQgb3V0c3RhbmRpbmcgPSAxO1xuICAgICAgICAgIGxldCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKC0tb3V0c3RhbmRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICB3YXJuaW5ncyxcbiAgICAgICAgICAgICAgICBjb2RlOiByZXNwb25zZS5jb2RlLFxuICAgICAgICAgICAgICAgIG1hcDogcmVzcG9uc2UubWFwLFxuICAgICAgICAgICAgICAgIG1hbmdsZUNhY2hlOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgbGVnYWxDb21tZW50czogdm9pZCAwXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGlmIChcImxlZ2FsQ29tbWVudHNcIiBpbiByZXNwb25zZSkgcmVzdWx0LmxlZ2FsQ29tbWVudHMgPSByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UubGVnYWxDb21tZW50cztcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm1hbmdsZUNhY2hlKSByZXN1bHQubWFuZ2xlQ2FjaGUgPSByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UubWFuZ2xlQ2FjaGU7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHJldHVybiBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKFwiVHJhbnNmb3JtIGZhaWxlZFwiLCBlcnJvcnMsIHdhcm5pbmdzKSwgbnVsbCk7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmNvZGVGUykge1xuICAgICAgICAgICAgb3V0c3RhbmRpbmcrKztcbiAgICAgICAgICAgIGZzMy5yZWFkRmlsZShyZXNwb25zZS5jb2RlLCAoZXJyLCBjb250ZW50cykgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBudWxsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZS5jb2RlID0gY29udGVudHM7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLm1hcEZTKSB7XG4gICAgICAgICAgICBvdXRzdGFuZGluZysrO1xuICAgICAgICAgICAgZnMzLnJlYWRGaWxlKHJlc3BvbnNlLm1hcCwgKGVyciwgY29udGVudHMpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVyciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbnVsbCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UubWFwID0gY29udGVudHM7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbGV0IGZsYWdzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcHVzaExvZ0ZsYWdzKGZsYWdzLCBvcHRpb25zLCB7fSwgaXNUVFkyLCB0cmFuc2Zvcm1Mb2dMZXZlbERlZmF1bHQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvciA9IGV4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgdm9pZCAwLCBcIlwiKTtcbiAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgeyBjb21tYW5kOiBcImVycm9yXCIsIGZsYWdzLCBlcnJvciB9LCAoKSA9PiB7XG4gICAgICAgICAgZXJyb3IuZGV0YWlsID0gZGV0YWlscy5sb2FkKGVycm9yLmRldGFpbCk7XG4gICAgICAgICAgY2FsbGJhY2soZmFpbHVyZUVycm9yV2l0aExvZyhcIlRyYW5zZm9ybSBmYWlsZWRcIiwgW2Vycm9yXSwgW10pLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiB8fCBpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpICYmIGlucHV0Lmxlbmd0aCA+IDEwMjQgKiAxMDI0KSB7XG4gICAgICBsZXQgbmV4dCA9IHN0YXJ0O1xuICAgICAgc3RhcnQgPSAoKSA9PiBmczMud3JpdGVGaWxlKGlucHV0LCBuZXh0KTtcbiAgICB9XG4gICAgc3RhcnQobnVsbCk7XG4gIH07XG4gIGxldCBmb3JtYXRNZXNzYWdlczIgPSAoeyBjYWxsTmFtZSwgcmVmcywgbWVzc2FnZXMsIG9wdGlvbnMsIGNhbGxiYWNrIH0pID0+IHtcbiAgICBpZiAoIW9wdGlvbnMpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBzZWNvbmQgYXJndW1lbnQgaW4gJHtjYWxsTmFtZX0oKSBjYWxsYCk7XG4gICAgbGV0IGtleXMgPSB7fTtcbiAgICBsZXQga2luZCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJraW5kXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IGNvbG9yID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImNvbG9yXCIsIG11c3RCZUJvb2xlYW4pO1xuICAgIGxldCB0ZXJtaW5hbFdpZHRoID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInRlcm1pbmFsV2lkdGhcIiwgbXVzdEJlSW50ZWdlcik7XG4gICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5cywgYGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICAgIGlmIChraW5kID09PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBcImtpbmRcIiBpbiAke2NhbGxOYW1lfSgpIGNhbGxgKTtcbiAgICBpZiAoa2luZCAhPT0gXCJlcnJvclwiICYmIGtpbmQgIT09IFwid2FybmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFwia2luZFwiIHRvIGJlIFwiZXJyb3JcIiBvciBcIndhcm5pbmdcIiBpbiAke2NhbGxOYW1lfSgpIGNhbGxgKTtcbiAgICBsZXQgcmVxdWVzdCA9IHtcbiAgICAgIGNvbW1hbmQ6IFwiZm9ybWF0LW1zZ3NcIixcbiAgICAgIG1lc3NhZ2VzOiBzYW5pdGl6ZU1lc3NhZ2VzKG1lc3NhZ2VzLCBcIm1lc3NhZ2VzXCIsIG51bGwsIFwiXCIsIHRlcm1pbmFsV2lkdGgpLFxuICAgICAgaXNXYXJuaW5nOiBraW5kID09PSBcIndhcm5pbmdcIlxuICAgIH07XG4gICAgaWYgKGNvbG9yICE9PSB2b2lkIDApIHJlcXVlc3QuY29sb3IgPSBjb2xvcjtcbiAgICBpZiAodGVybWluYWxXaWR0aCAhPT0gdm9pZCAwKSByZXF1ZXN0LnRlcm1pbmFsV2lkdGggPSB0ZXJtaW5hbFdpZHRoO1xuICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QsIChlcnJvciwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihlcnJvciksIG51bGwpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UubWVzc2FnZXMpO1xuICAgIH0pO1xuICB9O1xuICBsZXQgYW5hbHl6ZU1ldGFmaWxlMiA9ICh7IGNhbGxOYW1lLCByZWZzLCBtZXRhZmlsZSwgb3B0aW9ucywgY2FsbGJhY2sgfSkgPT4ge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIG9wdGlvbnMgPSB7fTtcbiAgICBsZXQga2V5cyA9IHt9O1xuICAgIGxldCBjb2xvciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJjb2xvclwiLCBtdXN0QmVCb29sZWFuKTtcbiAgICBsZXQgdmVyYm9zZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ2ZXJib3NlXCIsIG11c3RCZUJvb2xlYW4pO1xuICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMsIGBpbiAke2NhbGxOYW1lfSgpIGNhbGxgKTtcbiAgICBsZXQgcmVxdWVzdCA9IHtcbiAgICAgIGNvbW1hbmQ6IFwiYW5hbHl6ZS1tZXRhZmlsZVwiLFxuICAgICAgbWV0YWZpbGVcbiAgICB9O1xuICAgIGlmIChjb2xvciAhPT0gdm9pZCAwKSByZXF1ZXN0LmNvbG9yID0gY29sb3I7XG4gICAgaWYgKHZlcmJvc2UgIT09IHZvaWQgMCkgcmVxdWVzdC52ZXJib3NlID0gdmVyYm9zZTtcbiAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0LCAoZXJyb3IsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoZXJyb3IpLCBudWxsKTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLnJlc3VsdCk7XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiB7XG4gICAgcmVhZEZyb21TdGRvdXQsXG4gICAgYWZ0ZXJDbG9zZSxcbiAgICBzZXJ2aWNlOiB7XG4gICAgICBidWlsZE9yQ29udGV4dCxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtMixcbiAgICAgIGZvcm1hdE1lc3NhZ2VzOiBmb3JtYXRNZXNzYWdlczIsXG4gICAgICBhbmFseXplTWV0YWZpbGU6IGFuYWx5emVNZXRhZmlsZTJcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBidWlsZE9yQ29udGV4dEltcGwoY2FsbE5hbWUsIGJ1aWxkS2V5LCBzZW5kUmVxdWVzdCwgc2VuZFJlc3BvbnNlLCByZWZzLCBzdHJlYW1JbiwgcmVxdWVzdENhbGxiYWNrcywgb3B0aW9ucywgaXNUVFkyLCBkZWZhdWx0V0QyLCBjYWxsYmFjaykge1xuICBjb25zdCBkZXRhaWxzID0gY3JlYXRlT2JqZWN0U3Rhc2goKTtcbiAgY29uc3QgaXNDb250ZXh0ID0gY2FsbE5hbWUgPT09IFwiY29udGV4dFwiO1xuICBjb25zdCBoYW5kbGVFcnJvciA9IChlLCBwbHVnaW5OYW1lKSA9PiB7XG4gICAgY29uc3QgZmxhZ3MgPSBbXTtcbiAgICB0cnkge1xuICAgICAgcHVzaExvZ0ZsYWdzKGZsYWdzLCBvcHRpb25zLCB7fSwgaXNUVFkyLCBidWlsZExvZ0xldmVsRGVmYXVsdCk7XG4gICAgfSBjYXRjaCB7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBleHRyYWN0RXJyb3JNZXNzYWdlVjgoZSwgc3RyZWFtSW4sIGRldGFpbHMsIHZvaWQgMCwgcGx1Z2luTmFtZSk7XG4gICAgc2VuZFJlcXVlc3QocmVmcywgeyBjb21tYW5kOiBcImVycm9yXCIsIGZsYWdzLCBlcnJvcjogbWVzc2FnZSB9LCAoKSA9PiB7XG4gICAgICBtZXNzYWdlLmRldGFpbCA9IGRldGFpbHMubG9hZChtZXNzYWdlLmRldGFpbCk7XG4gICAgICBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKGlzQ29udGV4dCA/IFwiQ29udGV4dCBmYWlsZWRcIiA6IFwiQnVpbGQgZmFpbGVkXCIsIFttZXNzYWdlXSwgW10pLCBudWxsKTtcbiAgICB9KTtcbiAgfTtcbiAgbGV0IHBsdWdpbnM7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy5wbHVnaW5zO1xuICAgIGlmICh2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gaGFuZGxlRXJyb3IobmV3IEVycm9yKGBcInBsdWdpbnNcIiBtdXN0IGJlIGFuIGFycmF5YCksIFwiXCIpO1xuICAgICAgcGx1Z2lucyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBpZiAocGx1Z2lucyAmJiBwbHVnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc3RyZWFtSW4uaXNTeW5jKSByZXR1cm4gaGFuZGxlRXJyb3IobmV3IEVycm9yKFwiQ2Fubm90IHVzZSBwbHVnaW5zIGluIHN5bmNocm9ub3VzIEFQSSBjYWxsc1wiKSwgXCJcIik7XG4gICAgaGFuZGxlUGx1Z2lucyhcbiAgICAgIGJ1aWxkS2V5LFxuICAgICAgc2VuZFJlcXVlc3QsXG4gICAgICBzZW5kUmVzcG9uc2UsXG4gICAgICByZWZzLFxuICAgICAgc3RyZWFtSW4sXG4gICAgICByZXF1ZXN0Q2FsbGJhY2tzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHBsdWdpbnMsXG4gICAgICBkZXRhaWxzXG4gICAgKS50aGVuKFxuICAgICAgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykgcmV0dXJuIGhhbmRsZUVycm9yKHJlc3VsdC5lcnJvciwgcmVzdWx0LnBsdWdpbk5hbWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJ1aWxkT3JDb250ZXh0Q29udGludWUocmVzdWx0LnJlcXVlc3RQbHVnaW5zLCByZXN1bHQucnVuT25FbmRDYWxsYmFja3MsIHJlc3VsdC5zY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIChlKSA9PiBoYW5kbGVFcnJvcihlLCBcIlwiKVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgYnVpbGRPckNvbnRleHRDb250aW51ZShudWxsLCAocmVzdWx0LCBkb25lKSA9PiBkb25lKFtdLCBbXSksICgpID0+IHtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhhbmRsZUVycm9yKGUsIFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkT3JDb250ZXh0Q29udGludWUocmVxdWVzdFBsdWdpbnMsIHJ1bk9uRW5kQ2FsbGJhY2tzLCBzY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcykge1xuICAgIGNvbnN0IHdyaXRlRGVmYXVsdCA9IHN0cmVhbUluLmhhc0ZTO1xuICAgIGNvbnN0IHtcbiAgICAgIGVudHJpZXMsXG4gICAgICBmbGFncyxcbiAgICAgIHdyaXRlLFxuICAgICAgc3RkaW5Db250ZW50cyxcbiAgICAgIHN0ZGluUmVzb2x2ZURpcixcbiAgICAgIGFic1dvcmtpbmdEaXIsXG4gICAgICBub2RlUGF0aHMsXG4gICAgICBtYW5nbGVDYWNoZVxuICAgIH0gPSBmbGFnc0ZvckJ1aWxkT3B0aW9ucyhjYWxsTmFtZSwgb3B0aW9ucywgaXNUVFkyLCBidWlsZExvZ0xldmVsRGVmYXVsdCwgd3JpdGVEZWZhdWx0KTtcbiAgICBpZiAod3JpdGUgJiYgIXN0cmVhbUluLmhhc0ZTKSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcIndyaXRlXCIgb3B0aW9uIGlzIHVuYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgY29tbWFuZDogXCJidWlsZFwiLFxuICAgICAga2V5OiBidWlsZEtleSxcbiAgICAgIGVudHJpZXMsXG4gICAgICBmbGFncyxcbiAgICAgIHdyaXRlLFxuICAgICAgc3RkaW5Db250ZW50cyxcbiAgICAgIHN0ZGluUmVzb2x2ZURpcixcbiAgICAgIGFic1dvcmtpbmdEaXI6IGFic1dvcmtpbmdEaXIgfHwgZGVmYXVsdFdEMixcbiAgICAgIG5vZGVQYXRocyxcbiAgICAgIGNvbnRleHQ6IGlzQ29udGV4dFxuICAgIH07XG4gICAgaWYgKHJlcXVlc3RQbHVnaW5zKSByZXF1ZXN0LnBsdWdpbnMgPSByZXF1ZXN0UGx1Z2lucztcbiAgICBpZiAobWFuZ2xlQ2FjaGUpIHJlcXVlc3QubWFuZ2xlQ2FjaGUgPSBtYW5nbGVDYWNoZTtcbiAgICBjb25zdCBidWlsZFJlc3BvbnNlVG9SZXN1bHQgPSAocmVzcG9uc2UsIGNhbGxiYWNrMikgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBlcnJvcnM6IHJlcGxhY2VEZXRhaWxzSW5NZXNzYWdlcyhyZXNwb25zZS5lcnJvcnMsIGRldGFpbHMpLFxuICAgICAgICB3YXJuaW5nczogcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLndhcm5pbmdzLCBkZXRhaWxzKSxcbiAgICAgICAgb3V0cHV0RmlsZXM6IHZvaWQgMCxcbiAgICAgICAgbWV0YWZpbGU6IHZvaWQgMCxcbiAgICAgICAgbWFuZ2xlQ2FjaGU6IHZvaWQgMFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3JzID0gcmVzdWx0LmVycm9ycy5zbGljZSgpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxXYXJuaW5ncyA9IHJlc3VsdC53YXJuaW5ncy5zbGljZSgpO1xuICAgICAgaWYgKHJlc3BvbnNlLm91dHB1dEZpbGVzKSByZXN1bHQub3V0cHV0RmlsZXMgPSByZXNwb25zZS5vdXRwdXRGaWxlcy5tYXAoY29udmVydE91dHB1dEZpbGVzKTtcbiAgICAgIGlmIChyZXNwb25zZS5tZXRhZmlsZSkgcmVzdWx0Lm1ldGFmaWxlID0gSlNPTi5wYXJzZShyZXNwb25zZS5tZXRhZmlsZSk7XG4gICAgICBpZiAocmVzcG9uc2UubWFuZ2xlQ2FjaGUpIHJlc3VsdC5tYW5nbGVDYWNoZSA9IHJlc3BvbnNlLm1hbmdsZUNhY2hlO1xuICAgICAgaWYgKHJlc3BvbnNlLndyaXRlVG9TdGRvdXQgIT09IHZvaWQgMCkgY29uc29sZS5sb2coZGVjb2RlVVRGOChyZXNwb25zZS53cml0ZVRvU3Rkb3V0KS5yZXBsYWNlKC9cXG4kLywgXCJcIikpO1xuICAgICAgcnVuT25FbmRDYWxsYmFja3MocmVzdWx0LCAob25FbmRFcnJvcnMsIG9uRW5kV2FybmluZ3MpID0+IHtcbiAgICAgICAgaWYgKG9yaWdpbmFsRXJyb3JzLmxlbmd0aCA+IDAgfHwgb25FbmRFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gZmFpbHVyZUVycm9yV2l0aExvZyhcIkJ1aWxkIGZhaWxlZFwiLCBvcmlnaW5hbEVycm9ycy5jb25jYXQob25FbmRFcnJvcnMpLCBvcmlnaW5hbFdhcm5pbmdzLmNvbmNhdChvbkVuZFdhcm5pbmdzKSk7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrMihlcnJvciwgbnVsbCwgb25FbmRFcnJvcnMsIG9uRW5kV2FybmluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrMihudWxsLCByZXN1bHQsIG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgbGV0IGxhdGVzdFJlc3VsdFByb21pc2U7XG4gICAgbGV0IHByb3ZpZGVMYXRlc3RSZXN1bHQ7XG4gICAgaWYgKGlzQ29udGV4dClcbiAgICAgIHJlcXVlc3RDYWxsYmFja3NbXCJvbi1lbmRcIl0gPSAoaWQsIHJlcXVlc3QyKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBidWlsZFJlc3BvbnNlVG9SZXN1bHQocmVxdWVzdDIsIChlcnIsIHJlc3VsdCwgb25FbmRFcnJvcnMsIG9uRW5kV2FybmluZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgICAgIGVycm9yczogb25FbmRFcnJvcnMsXG4gICAgICAgICAgICB3YXJuaW5nczogb25FbmRXYXJuaW5nc1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHByb3ZpZGVMYXRlc3RSZXN1bHQpIHByb3ZpZGVMYXRlc3RSZXN1bHQoZXJyLCByZXN1bHQpO1xuICAgICAgICAgIGxhdGVzdFJlc3VsdFByb21pc2UgPSB2b2lkIDA7XG4gICAgICAgICAgcHJvdmlkZUxhdGVzdFJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoaWQsIHJlc3BvbnNlKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdCwgKGVycm9yLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGVycm9yKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGVycm9yKSwgbnVsbCk7XG4gICAgICBpZiAoIWlzQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gYnVpbGRSZXNwb25zZVRvUmVzdWx0KHJlc3BvbnNlLCAoZXJyLCByZXMpID0+IHtcbiAgICAgICAgICBzY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcygpO1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIsIHJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3BvbnNlLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKFwiQ29udGV4dCBmYWlsZWRcIiwgcmVzcG9uc2UuZXJyb3JzLCByZXNwb25zZS53YXJuaW5ncyksIG51bGwpO1xuICAgICAgfVxuICAgICAgbGV0IGRpZERpc3Bvc2UgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgcmVidWlsZDogKCkgPT4ge1xuICAgICAgICAgIGlmICghbGF0ZXN0UmVzdWx0UHJvbWlzZSkgbGF0ZXN0UmVzdWx0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBzZXR0bGVQcm9taXNlO1xuICAgICAgICAgICAgcHJvdmlkZUxhdGVzdFJlc3VsdCA9IChlcnIsIHJlc3VsdDIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFzZXR0bGVQcm9taXNlKSBzZXR0bGVQcm9taXNlID0gKCkgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlc3VsdDIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJBbm90aGVyQnVpbGQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QyID0ge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IFwicmVidWlsZFwiLFxuICAgICAgICAgICAgICAgIGtleTogYnVpbGRLZXlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdDIsIChlcnJvcjIsIHJlc3BvbnNlMikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcjIpIHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IyKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXR0bGVQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICBzZXR0bGVQcm9taXNlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXJBbm90aGVyQnVpbGQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyaWdnZXJBbm90aGVyQnVpbGQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbGF0ZXN0UmVzdWx0UHJvbWlzZTtcbiAgICAgICAgfSxcbiAgICAgICAgd2F0Y2g6IChvcHRpb25zMiA9IHt9KSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgaWYgKCFzdHJlYW1Jbi5oYXNGUykgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlIHRoZSBcIndhdGNoXCIgQVBJIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICAgICAgICBjb25zdCBrZXlzID0ge307XG4gICAgICAgICAgY29uc3QgZGVsYXkgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcImRlbGF5XCIsIG11c3RCZUludGVnZXIpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMyLCBrZXlzLCBgaW4gd2F0Y2goKSBjYWxsYCk7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdDIgPSB7XG4gICAgICAgICAgICBjb21tYW5kOiBcIndhdGNoXCIsXG4gICAgICAgICAgICBrZXk6IGJ1aWxkS2V5XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoZGVsYXkpIHJlcXVlc3QyLmRlbGF5ID0gZGVsYXk7XG4gICAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdDIsIChlcnJvcjIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcjIpIHJlamVjdChuZXcgRXJyb3IoZXJyb3IyKSk7XG4gICAgICAgICAgICBlbHNlIHJlc29sdmUodm9pZCAwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIHNlcnZlOiAob3B0aW9uczIgPSB7fSkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGlmICghc3RyZWFtSW4uaGFzRlMpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVzZSB0aGUgXCJzZXJ2ZVwiIEFQSSBpbiB0aGlzIGVudmlyb25tZW50YCk7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IHt9O1xuICAgICAgICAgIGNvbnN0IHBvcnQgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcInBvcnRcIiwgbXVzdEJlVmFsaWRQb3J0TnVtYmVyKTtcbiAgICAgICAgICBjb25zdCBob3N0ID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJob3N0XCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgY29uc3Qgc2VydmVkaXIgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcInNlcnZlZGlyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgY29uc3Qga2V5ZmlsZSA9IGdldEZsYWcob3B0aW9uczIsIGtleXMsIFwia2V5ZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGNlcnRmaWxlID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJjZXJ0ZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGZhbGxiYWNrID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJmYWxsYmFja1wiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGNvcnMgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcImNvcnNcIiwgbXVzdEJlT2JqZWN0KTtcbiAgICAgICAgICBjb25zdCBvblJlcXVlc3QgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcIm9uUmVxdWVzdFwiLCBtdXN0QmVGdW5jdGlvbik7XG4gICAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9uczIsIGtleXMsIGBpbiBzZXJ2ZSgpIGNhbGxgKTtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0MiA9IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwic2VydmVcIixcbiAgICAgICAgICAgIGtleTogYnVpbGRLZXksXG4gICAgICAgICAgICBvblJlcXVlc3Q6ICEhb25SZXF1ZXN0XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocG9ydCAhPT0gdm9pZCAwKSByZXF1ZXN0Mi5wb3J0ID0gcG9ydDtcbiAgICAgICAgICBpZiAoaG9zdCAhPT0gdm9pZCAwKSByZXF1ZXN0Mi5ob3N0ID0gaG9zdDtcbiAgICAgICAgICBpZiAoc2VydmVkaXIgIT09IHZvaWQgMCkgcmVxdWVzdDIuc2VydmVkaXIgPSBzZXJ2ZWRpcjtcbiAgICAgICAgICBpZiAoa2V5ZmlsZSAhPT0gdm9pZCAwKSByZXF1ZXN0Mi5rZXlmaWxlID0ga2V5ZmlsZTtcbiAgICAgICAgICBpZiAoY2VydGZpbGUgIT09IHZvaWQgMCkgcmVxdWVzdDIuY2VydGZpbGUgPSBjZXJ0ZmlsZTtcbiAgICAgICAgICBpZiAoZmFsbGJhY2sgIT09IHZvaWQgMCkgcmVxdWVzdDIuZmFsbGJhY2sgPSBmYWxsYmFjaztcbiAgICAgICAgICBpZiAoY29ycykge1xuICAgICAgICAgICAgY29uc3QgY29yc0tleXMgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbiA9IGdldEZsYWcoY29ycywgY29yc0tleXMsIFwib3JpZ2luXCIsIG11c3RCZVN0cmluZ09yQXJyYXlPZlN0cmluZ3MpO1xuICAgICAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MoY29ycywgY29yc0tleXMsIGBvbiBcImNvcnNcIiBvYmplY3RgKTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9yaWdpbikpIHJlcXVlc3QyLmNvcnNPcmlnaW4gPSBvcmlnaW47XG4gICAgICAgICAgICBlbHNlIGlmIChvcmlnaW4gIT09IHZvaWQgMCkgcmVxdWVzdDIuY29yc09yaWdpbiA9IFtvcmlnaW5dO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0MiwgKGVycm9yMiwgcmVzcG9uc2UyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IyKSByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihlcnJvcjIpKTtcbiAgICAgICAgICAgIGlmIChvblJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgcmVxdWVzdENhbGxiYWNrc1tcInNlcnZlLXJlcXVlc3RcIl0gPSAoaWQsIHJlcXVlc3QzKSA9PiB7XG4gICAgICAgICAgICAgICAgb25SZXF1ZXN0KHJlcXVlc3QzLmFyZ3MpO1xuICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZShpZCwge30pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZTIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgY2FuY2VsOiAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGlmIChkaWREaXNwb3NlKSByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QyID0ge1xuICAgICAgICAgICAgY29tbWFuZDogXCJjYW5jZWxcIixcbiAgICAgICAgICAgIGtleTogYnVpbGRLZXlcbiAgICAgICAgICB9O1xuICAgICAgICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QyLCAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBkaXNwb3NlOiAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGlmIChkaWREaXNwb3NlKSByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgIGRpZERpc3Bvc2UgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QyID0ge1xuICAgICAgICAgICAgY29tbWFuZDogXCJkaXNwb3NlXCIsXG4gICAgICAgICAgICBrZXk6IGJ1aWxkS2V5XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0MiwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgc2NoZWR1bGVPbkRpc3Bvc2VDYWxsYmFja3MoKTtcbiAgICAgICAgICAgIHJlZnMudW5yZWYoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgICByZWZzLnJlZigpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICB9KTtcbiAgfVxufVxudmFyIGhhbmRsZVBsdWdpbnMgPSBhc3luYyAoYnVpbGRLZXksIHNlbmRSZXF1ZXN0LCBzZW5kUmVzcG9uc2UsIHJlZnMsIHN0cmVhbUluLCByZXF1ZXN0Q2FsbGJhY2tzLCBpbml0aWFsT3B0aW9ucywgcGx1Z2lucywgZGV0YWlscykgPT4ge1xuICBsZXQgb25TdGFydENhbGxiYWNrcyA9IFtdO1xuICBsZXQgb25FbmRDYWxsYmFja3MgPSBbXTtcbiAgbGV0IG9uUmVzb2x2ZUNhbGxiYWNrcyA9IHt9O1xuICBsZXQgb25Mb2FkQ2FsbGJhY2tzID0ge307XG4gIGxldCBvbkRpc3Bvc2VDYWxsYmFja3MgPSBbXTtcbiAgbGV0IG5leHRDYWxsYmFja0lEID0gMDtcbiAgbGV0IGkgPSAwO1xuICBsZXQgcmVxdWVzdFBsdWdpbnMgPSBbXTtcbiAgbGV0IGlzU2V0dXBEb25lID0gZmFsc2U7XG4gIHBsdWdpbnMgPSBbLi4ucGx1Z2luc107XG4gIGZvciAobGV0IGl0ZW0gb2YgcGx1Z2lucykge1xuICAgIGxldCBrZXlzID0ge307XG4gICAgaWYgKHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBhdCBpbmRleCAke2l9IG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gICAgY29uc3QgbmFtZSA9IGdldEZsYWcoaXRlbSwga2V5cywgXCJuYW1lXCIsIG11c3RCZVN0cmluZyk7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiIHx8IG5hbWUgPT09IFwiXCIpIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIGF0IGluZGV4ICR7aX0gaXMgbWlzc2luZyBhIG5hbWVgKTtcbiAgICB0cnkge1xuICAgICAgbGV0IHNldHVwID0gZ2V0RmxhZyhpdGVtLCBrZXlzLCBcInNldHVwXCIsIG11c3RCZUZ1bmN0aW9uKTtcbiAgICAgIGlmICh0eXBlb2Ygc2V0dXAgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gaXMgbWlzc2luZyBhIHNldHVwIGZ1bmN0aW9uYCk7XG4gICAgICBjaGVja0ZvckludmFsaWRGbGFncyhpdGVtLCBrZXlzLCBgb24gcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICBsZXQgcGx1Z2luID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBvblN0YXJ0OiBmYWxzZSxcbiAgICAgICAgb25FbmQ6IGZhbHNlLFxuICAgICAgICBvblJlc29sdmU6IFtdLFxuICAgICAgICBvbkxvYWQ6IFtdXG4gICAgICB9O1xuICAgICAgaSsrO1xuICAgICAgbGV0IHJlc29sdmUgPSAocGF0aDMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBpZiAoIWlzU2V0dXBEb25lKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIFwicmVzb2x2ZVwiIGJlZm9yZSBwbHVnaW4gc2V0dXAgaGFzIGNvbXBsZXRlZCcpO1xuICAgICAgICBpZiAodHlwZW9mIHBhdGgzICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwYXRoIHRvIHJlc29sdmUgbXVzdCBiZSBhIHN0cmluZ2ApO1xuICAgICAgICBsZXQga2V5czIgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IHBsdWdpbk5hbWUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcInBsdWdpbk5hbWVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IGltcG9ydGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJpbXBvcnRlclwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQgbmFtZXNwYWNlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IHJlc29sdmVEaXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcInJlc29sdmVEaXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IGtpbmQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcImtpbmRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IHBsdWdpbkRhdGEgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcInBsdWdpbkRhdGFcIiwgY2FuQmVBbnl0aGluZyk7XG4gICAgICAgIGxldCBpbXBvcnRBdHRyaWJ1dGVzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJ3aXRoXCIsIG11c3RCZU9iamVjdCk7XG4gICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMyLCBcImluIHJlc29sdmUoKSBjYWxsXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICAgICAgY29tbWFuZDogXCJyZXNvbHZlXCIsXG4gICAgICAgICAgICBwYXRoOiBwYXRoMyxcbiAgICAgICAgICAgIGtleTogYnVpbGRLZXksXG4gICAgICAgICAgICBwbHVnaW5OYW1lOiBuYW1lXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocGx1Z2luTmFtZSAhPSBudWxsKSByZXF1ZXN0LnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lO1xuICAgICAgICAgIGlmIChpbXBvcnRlciAhPSBudWxsKSByZXF1ZXN0LmltcG9ydGVyID0gaW1wb3J0ZXI7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKSByZXF1ZXN0Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICAgICAgICBpZiAocmVzb2x2ZURpciAhPSBudWxsKSByZXF1ZXN0LnJlc29sdmVEaXIgPSByZXNvbHZlRGlyO1xuICAgICAgICAgIGlmIChraW5kICE9IG51bGwpIHJlcXVlc3Qua2luZCA9IGtpbmQ7XG4gICAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoYE11c3Qgc3BlY2lmeSBcImtpbmRcIiB3aGVuIGNhbGxpbmcgXCJyZXNvbHZlXCJgKTtcbiAgICAgICAgICBpZiAocGx1Z2luRGF0YSAhPSBudWxsKSByZXF1ZXN0LnBsdWdpbkRhdGEgPSBkZXRhaWxzLnN0b3JlKHBsdWdpbkRhdGEpO1xuICAgICAgICAgIGlmIChpbXBvcnRBdHRyaWJ1dGVzICE9IG51bGwpIHJlcXVlc3Qud2l0aCA9IHNhbml0aXplU3RyaW5nTWFwKGltcG9ydEF0dHJpYnV0ZXMsIFwid2l0aFwiKTtcbiAgICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0LCAoZXJyb3IsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgICAgIGVsc2UgcmVzb2x2ZTIoe1xuICAgICAgICAgICAgICBlcnJvcnM6IHJlcGxhY2VEZXRhaWxzSW5NZXNzYWdlcyhyZXNwb25zZS5lcnJvcnMsIGRldGFpbHMpLFxuICAgICAgICAgICAgICB3YXJuaW5nczogcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLndhcm5pbmdzLCBkZXRhaWxzKSxcbiAgICAgICAgICAgICAgcGF0aDogcmVzcG9uc2UucGF0aCxcbiAgICAgICAgICAgICAgZXh0ZXJuYWw6IHJlc3BvbnNlLmV4dGVybmFsLFxuICAgICAgICAgICAgICBzaWRlRWZmZWN0czogcmVzcG9uc2Uuc2lkZUVmZmVjdHMsXG4gICAgICAgICAgICAgIG5hbWVzcGFjZTogcmVzcG9uc2UubmFtZXNwYWNlLFxuICAgICAgICAgICAgICBzdWZmaXg6IHJlc3BvbnNlLnN1ZmZpeCxcbiAgICAgICAgICAgICAgcGx1Z2luRGF0YTogZGV0YWlscy5sb2FkKHJlc3BvbnNlLnBsdWdpbkRhdGEpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbGV0IHByb21pc2UgPSBzZXR1cCh7XG4gICAgICAgIGluaXRpYWxPcHRpb25zLFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICBvblN0YXJ0KGNhbGxiYWNrKSB7XG4gICAgICAgICAgbGV0IHJlZ2lzdGVyZWRUZXh0ID0gYFRoaXMgZXJyb3IgY2FtZSBmcm9tIHRoZSBcIm9uU3RhcnRcIiBjYWxsYmFjayByZWdpc3RlcmVkIGhlcmU6YDtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZE5vdGUgPSBleHRyYWN0Q2FsbGVyVjgobmV3IEVycm9yKHJlZ2lzdGVyZWRUZXh0KSwgc3RyZWFtSW4sIFwib25TdGFydFwiKTtcbiAgICAgICAgICBvblN0YXJ0Q2FsbGJhY2tzLnB1c2goeyBuYW1lLCBjYWxsYmFjaywgbm90ZTogcmVnaXN0ZXJlZE5vdGUgfSk7XG4gICAgICAgICAgcGx1Z2luLm9uU3RhcnQgPSB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvbkVuZChjYWxsYmFjaykge1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkVGV4dCA9IGBUaGlzIGVycm9yIGNhbWUgZnJvbSB0aGUgXCJvbkVuZFwiIGNhbGxiYWNrIHJlZ2lzdGVyZWQgaGVyZTpgO1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkTm90ZSA9IGV4dHJhY3RDYWxsZXJWOChuZXcgRXJyb3IocmVnaXN0ZXJlZFRleHQpLCBzdHJlYW1JbiwgXCJvbkVuZFwiKTtcbiAgICAgICAgICBvbkVuZENhbGxiYWNrcy5wdXNoKHsgbmFtZSwgY2FsbGJhY2ssIG5vdGU6IHJlZ2lzdGVyZWROb3RlIH0pO1xuICAgICAgICAgIHBsdWdpbi5vbkVuZCA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVzb2x2ZShvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkVGV4dCA9IGBUaGlzIGVycm9yIGNhbWUgZnJvbSB0aGUgXCJvblJlc29sdmVcIiBjYWxsYmFjayByZWdpc3RlcmVkIGhlcmU6YDtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZE5vdGUgPSBleHRyYWN0Q2FsbGVyVjgobmV3IEVycm9yKHJlZ2lzdGVyZWRUZXh0KSwgc3RyZWFtSW4sIFwib25SZXNvbHZlXCIpO1xuICAgICAgICAgIGxldCBrZXlzMiA9IHt9O1xuICAgICAgICAgIGxldCBmaWx0ZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcImZpbHRlclwiLCBtdXN0QmVSZWdFeHApO1xuICAgICAgICAgIGxldCBuYW1lc3BhY2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcIm5hbWVzcGFjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMyLCBgaW4gb25SZXNvbHZlKCkgY2FsbCBmb3IgcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYG9uUmVzb2x2ZSgpIGNhbGwgaXMgbWlzc2luZyBhIGZpbHRlcmApO1xuICAgICAgICAgIGxldCBpZCA9IG5leHRDYWxsYmFja0lEKys7XG4gICAgICAgICAgb25SZXNvbHZlQ2FsbGJhY2tzW2lkXSA9IHsgbmFtZSwgY2FsbGJhY2ssIG5vdGU6IHJlZ2lzdGVyZWROb3RlIH07XG4gICAgICAgICAgcGx1Z2luLm9uUmVzb2x2ZS5wdXNoKHsgaWQsIGZpbHRlcjoganNSZWdFeHBUb0dvUmVnRXhwKGZpbHRlciksIG5hbWVzcGFjZTogbmFtZXNwYWNlIHx8IFwiXCIgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTG9hZChvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkVGV4dCA9IGBUaGlzIGVycm9yIGNhbWUgZnJvbSB0aGUgXCJvbkxvYWRcIiBjYWxsYmFjayByZWdpc3RlcmVkIGhlcmU6YDtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZE5vdGUgPSBleHRyYWN0Q2FsbGVyVjgobmV3IEVycm9yKHJlZ2lzdGVyZWRUZXh0KSwgc3RyZWFtSW4sIFwib25Mb2FkXCIpO1xuICAgICAgICAgIGxldCBrZXlzMiA9IHt9O1xuICAgICAgICAgIGxldCBmaWx0ZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcImZpbHRlclwiLCBtdXN0QmVSZWdFeHApO1xuICAgICAgICAgIGxldCBuYW1lc3BhY2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcIm5hbWVzcGFjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMyLCBgaW4gb25Mb2FkKCkgY2FsbCBmb3IgcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYG9uTG9hZCgpIGNhbGwgaXMgbWlzc2luZyBhIGZpbHRlcmApO1xuICAgICAgICAgIGxldCBpZCA9IG5leHRDYWxsYmFja0lEKys7XG4gICAgICAgICAgb25Mb2FkQ2FsbGJhY2tzW2lkXSA9IHsgbmFtZSwgY2FsbGJhY2ssIG5vdGU6IHJlZ2lzdGVyZWROb3RlIH07XG4gICAgICAgICAgcGx1Z2luLm9uTG9hZC5wdXNoKHsgaWQsIGZpbHRlcjoganNSZWdFeHBUb0dvUmVnRXhwKGZpbHRlciksIG5hbWVzcGFjZTogbmFtZXNwYWNlIHx8IFwiXCIgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRGlzcG9zZShjYWxsYmFjaykge1xuICAgICAgICAgIG9uRGlzcG9zZUNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXNidWlsZDogc3RyZWFtSW4uZXNidWlsZFxuICAgICAgfSk7XG4gICAgICBpZiAocHJvbWlzZSkgYXdhaXQgcHJvbWlzZTtcbiAgICAgIHJlcXVlc3RQbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBlLCBwbHVnaW5OYW1lOiBuYW1lIH07XG4gICAgfVxuICB9XG4gIHJlcXVlc3RDYWxsYmFja3NbXCJvbi1zdGFydFwiXSA9IGFzeW5jIChpZCwgcmVxdWVzdCkgPT4ge1xuICAgIGRldGFpbHMuY2xlYXIoKTtcbiAgICBsZXQgcmVzcG9uc2UgPSB7IGVycm9yczogW10sIHdhcm5pbmdzOiBbXSB9O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKG9uU3RhcnRDYWxsYmFja3MubWFwKGFzeW5jICh7IG5hbWUsIGNhbGxiYWNrLCBub3RlIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBjYWxsYmFjaygpO1xuICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvblN0YXJ0KCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9IHRvIHJldHVybiBhbiBvYmplY3RgKTtcbiAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgIGxldCBlcnJvcnMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJlcnJvcnNcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgIGxldCB3YXJuaW5ncyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIndhcm5pbmdzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhyZXN1bHQsIGtleXMsIGBmcm9tIG9uU3RhcnQoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX1gKTtcbiAgICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpIHJlc3BvbnNlLmVycm9ycy5wdXNoKC4uLnNhbml0aXplTWVzc2FnZXMoZXJyb3JzLCBcImVycm9yc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApKTtcbiAgICAgICAgICBpZiAod2FybmluZ3MgIT0gbnVsbCkgcmVzcG9uc2Uud2FybmluZ3MucHVzaCguLi5zYW5pdGl6ZU1lc3NhZ2VzKHdhcm5pbmdzLCBcIndhcm5pbmdzXCIsIGRldGFpbHMsIG5hbWUsIHZvaWQgMCkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlc3BvbnNlLmVycm9ycy5wdXNoKGV4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgbm90ZSAmJiBub3RlKCksIG5hbWUpKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgc2VuZFJlc3BvbnNlKGlkLCByZXNwb25zZSk7XG4gIH07XG4gIHJlcXVlc3RDYWxsYmFja3NbXCJvbi1yZXNvbHZlXCJdID0gYXN5bmMgKGlkLCByZXF1ZXN0KSA9PiB7XG4gICAgbGV0IHJlc3BvbnNlID0ge30sIG5hbWUgPSBcIlwiLCBjYWxsYmFjaywgbm90ZTtcbiAgICBmb3IgKGxldCBpZDIgb2YgcmVxdWVzdC5pZHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgICh7IG5hbWUsIGNhbGxiYWNrLCBub3RlIH0gPSBvblJlc29sdmVDYWxsYmFja3NbaWQyXSk7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBjYWxsYmFjayh7XG4gICAgICAgICAgcGF0aDogcmVxdWVzdC5wYXRoLFxuICAgICAgICAgIGltcG9ydGVyOiByZXF1ZXN0LmltcG9ydGVyLFxuICAgICAgICAgIG5hbWVzcGFjZTogcmVxdWVzdC5uYW1lc3BhY2UsXG4gICAgICAgICAgcmVzb2x2ZURpcjogcmVxdWVzdC5yZXNvbHZlRGlyLFxuICAgICAgICAgIGtpbmQ6IHJlcXVlc3Qua2luZCxcbiAgICAgICAgICBwbHVnaW5EYXRhOiBkZXRhaWxzLmxvYWQocmVxdWVzdC5wbHVnaW5EYXRhKSxcbiAgICAgICAgICB3aXRoOiByZXF1ZXN0LndpdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9uUmVzb2x2ZSgpIGNhbGxiYWNrIGluIHBsdWdpbiAke3F1b3RlKG5hbWUpfSB0byByZXR1cm4gYW4gb2JqZWN0YCk7XG4gICAgICAgICAgbGV0IGtleXMgPSB7fTtcbiAgICAgICAgICBsZXQgcGx1Z2luTmFtZSA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcInBsdWdpbk5hbWVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgcGF0aDMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJwYXRoXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgbGV0IG5hbWVzcGFjZSA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIm5hbWVzcGFjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBzdWZmaXggPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJzdWZmaXhcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgZXh0ZXJuYWwgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJleHRlcm5hbFwiLCBtdXN0QmVCb29sZWFuKTtcbiAgICAgICAgICBsZXQgc2lkZUVmZmVjdHMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJzaWRlRWZmZWN0c1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgICAgICAgICBsZXQgcGx1Z2luRGF0YSA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcInBsdWdpbkRhdGFcIiwgY2FuQmVBbnl0aGluZyk7XG4gICAgICAgICAgbGV0IGVycm9ycyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcImVycm9yc1wiLCBtdXN0QmVBcnJheSk7XG4gICAgICAgICAgbGV0IHdhcm5pbmdzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwid2FybmluZ3NcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgIGxldCB3YXRjaEZpbGVzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwid2F0Y2hGaWxlc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gICAgICAgICAgbGV0IHdhdGNoRGlycyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIndhdGNoRGlyc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gICAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MocmVzdWx0LCBrZXlzLCBgZnJvbSBvblJlc29sdmUoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX1gKTtcbiAgICAgICAgICByZXNwb25zZS5pZCA9IGlkMjtcbiAgICAgICAgICBpZiAocGx1Z2luTmFtZSAhPSBudWxsKSByZXNwb25zZS5wbHVnaW5OYW1lID0gcGx1Z2luTmFtZTtcbiAgICAgICAgICBpZiAocGF0aDMgIT0gbnVsbCkgcmVzcG9uc2UucGF0aCA9IHBhdGgzO1xuICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgcmVzcG9uc2UubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgICAgICAgIGlmIChzdWZmaXggIT0gbnVsbCkgcmVzcG9uc2Uuc3VmZml4ID0gc3VmZml4O1xuICAgICAgICAgIGlmIChleHRlcm5hbCAhPSBudWxsKSByZXNwb25zZS5leHRlcm5hbCA9IGV4dGVybmFsO1xuICAgICAgICAgIGlmIChzaWRlRWZmZWN0cyAhPSBudWxsKSByZXNwb25zZS5zaWRlRWZmZWN0cyA9IHNpZGVFZmZlY3RzO1xuICAgICAgICAgIGlmIChwbHVnaW5EYXRhICE9IG51bGwpIHJlc3BvbnNlLnBsdWdpbkRhdGEgPSBkZXRhaWxzLnN0b3JlKHBsdWdpbkRhdGEpO1xuICAgICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkgcmVzcG9uc2UuZXJyb3JzID0gc2FuaXRpemVNZXNzYWdlcyhlcnJvcnMsIFwiZXJyb3JzXCIsIGRldGFpbHMsIG5hbWUsIHZvaWQgMCk7XG4gICAgICAgICAgaWYgKHdhcm5pbmdzICE9IG51bGwpIHJlc3BvbnNlLndhcm5pbmdzID0gc2FuaXRpemVNZXNzYWdlcyh3YXJuaW5ncywgXCJ3YXJuaW5nc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApO1xuICAgICAgICAgIGlmICh3YXRjaEZpbGVzICE9IG51bGwpIHJlc3BvbnNlLndhdGNoRmlsZXMgPSBzYW5pdGl6ZVN0cmluZ0FycmF5KHdhdGNoRmlsZXMsIFwid2F0Y2hGaWxlc1wiKTtcbiAgICAgICAgICBpZiAod2F0Y2hEaXJzICE9IG51bGwpIHJlc3BvbnNlLndhdGNoRGlycyA9IHNhbml0aXplU3RyaW5nQXJyYXkod2F0Y2hEaXJzLCBcIndhdGNoRGlyc1wiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXNwb25zZSA9IHsgaWQ6IGlkMiwgZXJyb3JzOiBbZXh0cmFjdEVycm9yTWVzc2FnZVY4KGUsIHN0cmVhbUluLCBkZXRhaWxzLCBub3RlICYmIG5vdGUoKSwgbmFtZSldIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBzZW5kUmVzcG9uc2UoaWQsIHJlc3BvbnNlKTtcbiAgfTtcbiAgcmVxdWVzdENhbGxiYWNrc1tcIm9uLWxvYWRcIl0gPSBhc3luYyAoaWQsIHJlcXVlc3QpID0+IHtcbiAgICBsZXQgcmVzcG9uc2UgPSB7fSwgbmFtZSA9IFwiXCIsIGNhbGxiYWNrLCBub3RlO1xuICAgIGZvciAobGV0IGlkMiBvZiByZXF1ZXN0Lmlkcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHsgbmFtZSwgY2FsbGJhY2ssIG5vdGUgfSA9IG9uTG9hZENhbGxiYWNrc1tpZDJdKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGNhbGxiYWNrKHtcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnBhdGgsXG4gICAgICAgICAgbmFtZXNwYWNlOiByZXF1ZXN0Lm5hbWVzcGFjZSxcbiAgICAgICAgICBzdWZmaXg6IHJlcXVlc3Quc3VmZml4LFxuICAgICAgICAgIHBsdWdpbkRhdGE6IGRldGFpbHMubG9hZChyZXF1ZXN0LnBsdWdpbkRhdGEpLFxuICAgICAgICAgIHdpdGg6IHJlcXVlc3Qud2l0aFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb25Mb2FkKCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9IHRvIHJldHVybiBhbiBvYmplY3RgKTtcbiAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgIGxldCBwbHVnaW5OYW1lID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBjb250ZW50cyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcImNvbnRlbnRzXCIsIG11c3RCZVN0cmluZ09yVWludDhBcnJheSk7XG4gICAgICAgICAgbGV0IHJlc29sdmVEaXIgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJyZXNvbHZlRGlyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgbGV0IHBsdWdpbkRhdGEgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJwbHVnaW5EYXRhXCIsIGNhbkJlQW55dGhpbmcpO1xuICAgICAgICAgIGxldCBsb2FkZXIgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJsb2FkZXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgZXJyb3JzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwiZXJyb3JzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICBsZXQgd2FybmluZ3MgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJ3YXJuaW5nc1wiLCBtdXN0QmVBcnJheSk7XG4gICAgICAgICAgbGV0IHdhdGNoRmlsZXMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJ3YXRjaEZpbGVzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgICAgICAgICBsZXQgd2F0Y2hEaXJzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwid2F0Y2hEaXJzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhyZXN1bHQsIGtleXMsIGBmcm9tIG9uTG9hZCgpIGNhbGxiYWNrIGluIHBsdWdpbiAke3F1b3RlKG5hbWUpfWApO1xuICAgICAgICAgIHJlc3BvbnNlLmlkID0gaWQyO1xuICAgICAgICAgIGlmIChwbHVnaW5OYW1lICE9IG51bGwpIHJlc3BvbnNlLnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lO1xuICAgICAgICAgIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJlc3BvbnNlLmNvbnRlbnRzID0gY29udGVudHM7XG4gICAgICAgICAgZWxzZSBpZiAoY29udGVudHMgIT0gbnVsbCkgcmVzcG9uc2UuY29udGVudHMgPSBlbmNvZGVVVEY4KGNvbnRlbnRzKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZURpciAhPSBudWxsKSByZXNwb25zZS5yZXNvbHZlRGlyID0gcmVzb2x2ZURpcjtcbiAgICAgICAgICBpZiAocGx1Z2luRGF0YSAhPSBudWxsKSByZXNwb25zZS5wbHVnaW5EYXRhID0gZGV0YWlscy5zdG9yZShwbHVnaW5EYXRhKTtcbiAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHJlc3BvbnNlLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpIHJlc3BvbnNlLmVycm9ycyA9IHNhbml0aXplTWVzc2FnZXMoZXJyb3JzLCBcImVycm9yc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApO1xuICAgICAgICAgIGlmICh3YXJuaW5ncyAhPSBudWxsKSByZXNwb25zZS53YXJuaW5ncyA9IHNhbml0aXplTWVzc2FnZXMod2FybmluZ3MsIFwid2FybmluZ3NcIiwgZGV0YWlscywgbmFtZSwgdm9pZCAwKTtcbiAgICAgICAgICBpZiAod2F0Y2hGaWxlcyAhPSBudWxsKSByZXNwb25zZS53YXRjaEZpbGVzID0gc2FuaXRpemVTdHJpbmdBcnJheSh3YXRjaEZpbGVzLCBcIndhdGNoRmlsZXNcIik7XG4gICAgICAgICAgaWYgKHdhdGNoRGlycyAhPSBudWxsKSByZXNwb25zZS53YXRjaERpcnMgPSBzYW5pdGl6ZVN0cmluZ0FycmF5KHdhdGNoRGlycywgXCJ3YXRjaERpcnNcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB7IGlkOiBpZDIsIGVycm9yczogW2V4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgbm90ZSAmJiBub3RlKCksIG5hbWUpXSB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgc2VuZFJlc3BvbnNlKGlkLCByZXNwb25zZSk7XG4gIH07XG4gIGxldCBydW5PbkVuZENhbGxiYWNrcyA9IChyZXN1bHQsIGRvbmUpID0+IGRvbmUoW10sIFtdKTtcbiAgaWYgKG9uRW5kQ2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICBydW5PbkVuZENhbGxiYWNrcyA9IChyZXN1bHQsIGRvbmUpID0+IHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9uRW5kRXJyb3JzID0gW107XG4gICAgICAgIGNvbnN0IG9uRW5kV2FybmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB7IG5hbWUsIGNhbGxiYWNrLCBub3RlIH0gb2Ygb25FbmRDYWxsYmFja3MpIHtcbiAgICAgICAgICBsZXQgbmV3RXJyb3JzO1xuICAgICAgICAgIGxldCBuZXdXYXJuaW5ncztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBjYWxsYmFjayhyZXN1bHQpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbkVuZCgpIGNhbGxiYWNrIGluIHBsdWdpbiAke3F1b3RlKG5hbWUpfSB0byByZXR1cm4gYW4gb2JqZWN0YCk7XG4gICAgICAgICAgICAgIGxldCBrZXlzID0ge307XG4gICAgICAgICAgICAgIGxldCBlcnJvcnMgPSBnZXRGbGFnKHZhbHVlLCBrZXlzLCBcImVycm9yc1wiLCBtdXN0QmVBcnJheSk7XG4gICAgICAgICAgICAgIGxldCB3YXJuaW5ncyA9IGdldEZsYWcodmFsdWUsIGtleXMsIFwid2FybmluZ3NcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyh2YWx1ZSwga2V5cywgYGZyb20gb25FbmQoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX1gKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9ycyAhPSBudWxsKSBuZXdFcnJvcnMgPSBzYW5pdGl6ZU1lc3NhZ2VzKGVycm9ycywgXCJlcnJvcnNcIiwgZGV0YWlscywgbmFtZSwgdm9pZCAwKTtcbiAgICAgICAgICAgICAgaWYgKHdhcm5pbmdzICE9IG51bGwpIG5ld1dhcm5pbmdzID0gc2FuaXRpemVNZXNzYWdlcyh3YXJuaW5ncywgXCJ3YXJuaW5nc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG5ld0Vycm9ycyA9IFtleHRyYWN0RXJyb3JNZXNzYWdlVjgoZSwgc3RyZWFtSW4sIGRldGFpbHMsIG5vdGUgJiYgbm90ZSgpLCBuYW1lKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZXdFcnJvcnMpIHtcbiAgICAgICAgICAgIG9uRW5kRXJyb3JzLnB1c2goLi4ubmV3RXJyb3JzKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCguLi5uZXdFcnJvcnMpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZXdXYXJuaW5ncykge1xuICAgICAgICAgICAgb25FbmRXYXJuaW5ncy5wdXNoKC4uLm5ld1dhcm5pbmdzKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3VsdC53YXJuaW5ncy5wdXNoKC4uLm5ld1dhcm5pbmdzKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkb25lKG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKTtcbiAgICAgIH0pKCk7XG4gICAgfTtcbiAgfVxuICBsZXQgc2NoZWR1bGVPbkRpc3Bvc2VDYWxsYmFja3MgPSAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBjYiBvZiBvbkRpc3Bvc2VDYWxsYmFja3MpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2IoKSwgMCk7XG4gICAgfVxuICB9O1xuICBpc1NldHVwRG9uZSA9IHRydWU7XG4gIHJldHVybiB7XG4gICAgb2s6IHRydWUsXG4gICAgcmVxdWVzdFBsdWdpbnMsXG4gICAgcnVuT25FbmRDYWxsYmFja3MsXG4gICAgc2NoZWR1bGVPbkRpc3Bvc2VDYWxsYmFja3NcbiAgfTtcbn07XG5mdW5jdGlvbiBjcmVhdGVPYmplY3RTdGFzaCgpIHtcbiAgY29uc3QgbWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IG5leHRJRCA9IDA7XG4gIHJldHVybiB7XG4gICAgY2xlYXIoKSB7XG4gICAgICBtYXAuY2xlYXIoKTtcbiAgICB9LFxuICAgIGxvYWQoaWQpIHtcbiAgICAgIHJldHVybiBtYXAuZ2V0KGlkKTtcbiAgICB9LFxuICAgIHN0b3JlKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkgcmV0dXJuIC0xO1xuICAgICAgY29uc3QgaWQgPSBuZXh0SUQrKztcbiAgICAgIG1hcC5zZXQoaWQsIHZhbHVlKTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBleHRyYWN0Q2FsbGVyVjgoZSwgc3RyZWFtSW4sIGlkZW50KSB7XG4gIGxldCBub3RlO1xuICBsZXQgdHJpZWQgPSBmYWxzZTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAodHJpZWQpIHJldHVybiBub3RlO1xuICAgIHRyaWVkID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgbGV0IGxpbmVzID0gKGUuc3RhY2sgKyBcIlwiKS5zcGxpdChcIlxcblwiKTtcbiAgICAgIGxpbmVzLnNwbGljZSgxLCAxKTtcbiAgICAgIGxldCBsb2NhdGlvbiA9IHBhcnNlU3RhY2tMaW5lc1Y4KHN0cmVhbUluLCBsaW5lcywgaWRlbnQpO1xuICAgICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICAgIG5vdGUgPSB7IHRleHQ6IGUubWVzc2FnZSwgbG9jYXRpb24gfTtcbiAgICAgICAgcmV0dXJuIG5vdGU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZXh0cmFjdEVycm9yTWVzc2FnZVY4KGUsIHN0cmVhbUluLCBzdGFzaCwgbm90ZSwgcGx1Z2luTmFtZSkge1xuICBsZXQgdGV4dCA9IFwiSW50ZXJuYWwgZXJyb3JcIjtcbiAgbGV0IGxvY2F0aW9uID0gbnVsbDtcbiAgdHJ5IHtcbiAgICB0ZXh0ID0gKGUgJiYgZS5tZXNzYWdlIHx8IGUpICsgXCJcIjtcbiAgfSBjYXRjaCB7XG4gIH1cbiAgdHJ5IHtcbiAgICBsb2NhdGlvbiA9IHBhcnNlU3RhY2tMaW5lc1Y4KHN0cmVhbUluLCAoZS5zdGFjayArIFwiXCIpLnNwbGl0KFwiXFxuXCIpLCBcIlwiKTtcbiAgfSBjYXRjaCB7XG4gIH1cbiAgcmV0dXJuIHsgaWQ6IFwiXCIsIHBsdWdpbk5hbWUsIHRleHQsIGxvY2F0aW9uLCBub3Rlczogbm90ZSA/IFtub3RlXSA6IFtdLCBkZXRhaWw6IHN0YXNoID8gc3Rhc2guc3RvcmUoZSkgOiAtMSB9O1xufVxuZnVuY3Rpb24gcGFyc2VTdGFja0xpbmVzVjgoc3RyZWFtSW4sIGxpbmVzLCBpZGVudCkge1xuICBsZXQgYXQgPSBcIiAgICBhdCBcIjtcbiAgaWYgKHN0cmVhbUluLnJlYWRGaWxlU3luYyAmJiAhbGluZXNbMF0uc3RhcnRzV2l0aChhdCkgJiYgbGluZXNbMV0uc3RhcnRzV2l0aChhdCkpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoYXQpKSBjb250aW51ZTtcbiAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKGF0Lmxlbmd0aCk7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSAvXig/Om5ldyB8YXN5bmMgKT9cXFMrIFxcKCguKilcXCkkLy5leGVjKGxpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsaW5lID0gbWF0Y2hbMV07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbWF0Y2ggPSAvXmV2YWwgYXQgXFxTKyBcXCgoLiopXFwpKD86LCBcXFMrOlxcZCs6XFxkKyk/JC8uZXhlYyhsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgbGluZSA9IG1hdGNoWzFdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoID0gL14oXFxTKyk6KFxcZCspOihcXGQrKSQvLmV4ZWMobGluZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGxldCBjb250ZW50cztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29udGVudHMgPSBzdHJlYW1Jbi5yZWFkRmlsZVN5bmMobWF0Y2hbMV0sIFwidXRmOFwiKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgbGluZVRleHQgPSBjb250ZW50cy5zcGxpdCgvXFxyXFxufFxccnxcXG58XFx1MjAyOHxcXHUyMDI5LylbK21hdGNoWzJdIC0gMV0gfHwgXCJcIjtcbiAgICAgICAgICBsZXQgY29sdW1uID0gK21hdGNoWzNdIC0gMTtcbiAgICAgICAgICBsZXQgbGVuZ3RoID0gbGluZVRleHQuc2xpY2UoY29sdW1uLCBjb2x1bW4gKyBpZGVudC5sZW5ndGgpID09PSBpZGVudCA/IGlkZW50Lmxlbmd0aCA6IDA7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgbmFtZXNwYWNlOiBcImZpbGVcIixcbiAgICAgICAgICAgIGxpbmU6ICttYXRjaFsyXSxcbiAgICAgICAgICAgIGNvbHVtbjogZW5jb2RlVVRGOChsaW5lVGV4dC5zbGljZSgwLCBjb2x1bW4pKS5sZW5ndGgsXG4gICAgICAgICAgICBsZW5ndGg6IGVuY29kZVVURjgobGluZVRleHQuc2xpY2UoY29sdW1uLCBjb2x1bW4gKyBsZW5ndGgpKS5sZW5ndGgsXG4gICAgICAgICAgICBsaW5lVGV4dDogbGluZVRleHQgKyBcIlxcblwiICsgbGluZXMuc2xpY2UoMSkuam9pbihcIlxcblwiKSxcbiAgICAgICAgICAgIHN1Z2dlc3Rpb246IFwiXCJcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZhaWx1cmVFcnJvcldpdGhMb2codGV4dCwgZXJyb3JzLCB3YXJuaW5ncykge1xuICBsZXQgbGltaXQgPSA1O1xuICB0ZXh0ICs9IGVycm9ycy5sZW5ndGggPCAxID8gXCJcIiA6IGAgd2l0aCAke2Vycm9ycy5sZW5ndGh9IGVycm9yJHtlcnJvcnMubGVuZ3RoIDwgMiA/IFwiXCIgOiBcInNcIn06YCArIGVycm9ycy5zbGljZSgwLCBsaW1pdCArIDEpLm1hcCgoZSwgaSkgPT4ge1xuICAgIGlmIChpID09PSBsaW1pdCkgcmV0dXJuIFwiXFxuLi4uXCI7XG4gICAgaWYgKCFlLmxvY2F0aW9uKSByZXR1cm4gYFxuZXJyb3I6ICR7ZS50ZXh0fWA7XG4gICAgbGV0IHsgZmlsZSwgbGluZSwgY29sdW1uIH0gPSBlLmxvY2F0aW9uO1xuICAgIGxldCBwbHVnaW5UZXh0ID0gZS5wbHVnaW5OYW1lID8gYFtwbHVnaW46ICR7ZS5wbHVnaW5OYW1lfV0gYCA6IFwiXCI7XG4gICAgcmV0dXJuIGBcbiR7ZmlsZX06JHtsaW5lfToke2NvbHVtbn06IEVSUk9SOiAke3BsdWdpblRleHR9JHtlLnRleHR9YDtcbiAgfSkuam9pbihcIlwiKTtcbiAgbGV0IGVycm9yID0gbmV3IEVycm9yKHRleHQpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBbW1wiZXJyb3JzXCIsIGVycm9yc10sIFtcIndhcm5pbmdzXCIsIHdhcm5pbmdzXV0pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogKCkgPT4gdmFsdWUsXG4gICAgICBzZXQ6ICh2YWx1ZTIpID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwga2V5LCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHZhbHVlMlxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5mdW5jdGlvbiByZXBsYWNlRGV0YWlsc0luTWVzc2FnZXMobWVzc2FnZXMsIHN0YXNoKSB7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgIG1lc3NhZ2UuZGV0YWlsID0gc3Rhc2gubG9hZChtZXNzYWdlLmRldGFpbCk7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2VzO1xufVxuZnVuY3Rpb24gc2FuaXRpemVMb2NhdGlvbihsb2NhdGlvbiwgd2hlcmUsIHRlcm1pbmFsV2lkdGgpIHtcbiAgaWYgKGxvY2F0aW9uID09IG51bGwpIHJldHVybiBudWxsO1xuICBsZXQga2V5cyA9IHt9O1xuICBsZXQgZmlsZSA9IGdldEZsYWcobG9jYXRpb24sIGtleXMsIFwiZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgbmFtZXNwYWNlID0gZ2V0RmxhZyhsb2NhdGlvbiwga2V5cywgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGxpbmUgPSBnZXRGbGFnKGxvY2F0aW9uLCBrZXlzLCBcImxpbmVcIiwgbXVzdEJlSW50ZWdlcik7XG4gIGxldCBjb2x1bW4gPSBnZXRGbGFnKGxvY2F0aW9uLCBrZXlzLCBcImNvbHVtblwiLCBtdXN0QmVJbnRlZ2VyKTtcbiAgbGV0IGxlbmd0aCA9IGdldEZsYWcobG9jYXRpb24sIGtleXMsIFwibGVuZ3RoXCIsIG11c3RCZUludGVnZXIpO1xuICBsZXQgbGluZVRleHQgPSBnZXRGbGFnKGxvY2F0aW9uLCBrZXlzLCBcImxpbmVUZXh0XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBzdWdnZXN0aW9uID0gZ2V0RmxhZyhsb2NhdGlvbiwga2V5cywgXCJzdWdnZXN0aW9uXCIsIG11c3RCZVN0cmluZyk7XG4gIGNoZWNrRm9ySW52YWxpZEZsYWdzKGxvY2F0aW9uLCBrZXlzLCB3aGVyZSk7XG4gIGlmIChsaW5lVGV4dCkge1xuICAgIGNvbnN0IHJlbGV2YW50QVNDSUkgPSBsaW5lVGV4dC5zbGljZShcbiAgICAgIDAsXG4gICAgICAoY29sdW1uICYmIGNvbHVtbiA+IDAgPyBjb2x1bW4gOiAwKSArIChsZW5ndGggJiYgbGVuZ3RoID4gMCA/IGxlbmd0aCA6IDApICsgKHRlcm1pbmFsV2lkdGggJiYgdGVybWluYWxXaWR0aCA+IDAgPyB0ZXJtaW5hbFdpZHRoIDogODApXG4gICAgKTtcbiAgICBpZiAoIS9bXFx4N0YtXFx1RkZGRl0vLnRlc3QocmVsZXZhbnRBU0NJSSkgJiYgIS9cXG4vLnRlc3QobGluZVRleHQpKSB7XG4gICAgICBsaW5lVGV4dCA9IHJlbGV2YW50QVNDSUk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZmlsZTogZmlsZSB8fCBcIlwiLFxuICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlIHx8IFwiXCIsXG4gICAgbGluZTogbGluZSB8fCAwLFxuICAgIGNvbHVtbjogY29sdW1uIHx8IDAsXG4gICAgbGVuZ3RoOiBsZW5ndGggfHwgMCxcbiAgICBsaW5lVGV4dDogbGluZVRleHQgfHwgXCJcIixcbiAgICBzdWdnZXN0aW9uOiBzdWdnZXN0aW9uIHx8IFwiXCJcbiAgfTtcbn1cbmZ1bmN0aW9uIHNhbml0aXplTWVzc2FnZXMobWVzc2FnZXMsIHByb3BlcnR5LCBzdGFzaCwgZmFsbGJhY2tQbHVnaW5OYW1lLCB0ZXJtaW5hbFdpZHRoKSB7XG4gIGxldCBtZXNzYWdlc0Nsb25lID0gW107XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgIGxldCBrZXlzID0ge307XG4gICAgbGV0IGlkID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcImlkXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IHBsdWdpbk5hbWUgPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGxldCB0ZXh0ID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcInRleHRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICBsZXQgbG9jYXRpb24gPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwibG9jYXRpb25cIiwgbXVzdEJlT2JqZWN0T3JOdWxsKTtcbiAgICBsZXQgbm90ZXMgPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwibm90ZXNcIiwgbXVzdEJlQXJyYXkpO1xuICAgIGxldCBkZXRhaWwgPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwiZGV0YWlsXCIsIGNhbkJlQW55dGhpbmcpO1xuICAgIGxldCB3aGVyZSA9IGBpbiBlbGVtZW50ICR7aW5kZXh9IG9mIFwiJHtwcm9wZXJ0eX1cImA7XG4gICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MobWVzc2FnZSwga2V5cywgd2hlcmUpO1xuICAgIGxldCBub3Rlc0Nsb25lID0gW107XG4gICAgaWYgKG5vdGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IG5vdGUgb2Ygbm90ZXMpIHtcbiAgICAgICAgbGV0IG5vdGVLZXlzID0ge307XG4gICAgICAgIGxldCBub3RlVGV4dCA9IGdldEZsYWcobm90ZSwgbm90ZUtleXMsIFwidGV4dFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQgbm90ZUxvY2F0aW9uID0gZ2V0RmxhZyhub3RlLCBub3RlS2V5cywgXCJsb2NhdGlvblwiLCBtdXN0QmVPYmplY3RPck51bGwpO1xuICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhub3RlLCBub3RlS2V5cywgd2hlcmUpO1xuICAgICAgICBub3Rlc0Nsb25lLnB1c2goe1xuICAgICAgICAgIHRleHQ6IG5vdGVUZXh0IHx8IFwiXCIsXG4gICAgICAgICAgbG9jYXRpb246IHNhbml0aXplTG9jYXRpb24obm90ZUxvY2F0aW9uLCB3aGVyZSwgdGVybWluYWxXaWR0aClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIG1lc3NhZ2VzQ2xvbmUucHVzaCh7XG4gICAgICBpZDogaWQgfHwgXCJcIixcbiAgICAgIHBsdWdpbk5hbWU6IHBsdWdpbk5hbWUgfHwgZmFsbGJhY2tQbHVnaW5OYW1lLFxuICAgICAgdGV4dDogdGV4dCB8fCBcIlwiLFxuICAgICAgbG9jYXRpb246IHNhbml0aXplTG9jYXRpb24obG9jYXRpb24sIHdoZXJlLCB0ZXJtaW5hbFdpZHRoKSxcbiAgICAgIG5vdGVzOiBub3Rlc0Nsb25lLFxuICAgICAgZGV0YWlsOiBzdGFzaCA/IHN0YXNoLnN0b3JlKGRldGFpbCkgOiAtMVxuICAgIH0pO1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2VzQ2xvbmU7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZVN0cmluZ0FycmF5KHZhbHVlcywgcHJvcGVydHkpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKGAke3F1b3RlKHByb3BlcnR5KX0gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYCk7XG4gICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZVN0cmluZ01hcChtYXAsIHByb3BlcnR5KSB7XG4gIGNvbnN0IHJlc3VsdCA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1hcFtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihga2V5ICR7cXVvdGUoa2V5KX0gaW4gb2JqZWN0ICR7cXVvdGUocHJvcGVydHkpfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG4gICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY29udmVydE91dHB1dEZpbGVzKHsgcGF0aDogcGF0aDMsIGNvbnRlbnRzLCBoYXNoIH0pIHtcbiAgbGV0IHRleHQgPSBudWxsO1xuICByZXR1cm4ge1xuICAgIHBhdGg6IHBhdGgzLFxuICAgIGNvbnRlbnRzLFxuICAgIGhhc2gsXG4gICAgZ2V0IHRleHQoKSB7XG4gICAgICBjb25zdCBiaW5hcnkgPSB0aGlzLmNvbnRlbnRzO1xuICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgYmluYXJ5ICE9PSBjb250ZW50cykge1xuICAgICAgICBjb250ZW50cyA9IGJpbmFyeTtcbiAgICAgICAgdGV4dCA9IGRlY29kZVVURjgoYmluYXJ5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGpzUmVnRXhwVG9Hb1JlZ0V4cChyZWdleHApIHtcbiAgbGV0IHJlc3VsdCA9IHJlZ2V4cC5zb3VyY2U7XG4gIGlmIChyZWdleHAuZmxhZ3MpIHJlc3VsdCA9IGAoPyR7cmVnZXhwLmZsYWdzfSkke3Jlc3VsdH1gO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBsaWIvbnBtL25vZGUtcGxhdGZvcm0udHNcbnZhciBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbnZhciBvcyA9IHJlcXVpcmUoXCJvc1wiKTtcbnZhciBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG52YXIgRVNCVUlMRF9CSU5BUllfUEFUSCA9IHByb2Nlc3MuZW52LkVTQlVJTERfQklOQVJZX1BBVEggfHwgRVNCVUlMRF9CSU5BUllfUEFUSDtcbnZhciBpc1ZhbGlkQmluYXJ5UGF0aCA9ICh4KSA9PiAhIXggJiYgeCAhPT0gXCIvdXNyL2Jpbi9lc2J1aWxkXCI7XG52YXIgcGFja2FnZURhcndpbl9hcm02NCA9IFwiQGVzYnVpbGQvZGFyd2luLWFybTY0XCI7XG52YXIgcGFja2FnZURhcndpbl94NjQgPSBcIkBlc2J1aWxkL2Rhcndpbi14NjRcIjtcbnZhciBrbm93bldpbmRvd3NQYWNrYWdlcyA9IHtcbiAgXCJ3aW4zMiBhcm02NCBMRVwiOiBcIkBlc2J1aWxkL3dpbjMyLWFybTY0XCIsXG4gIFwid2luMzIgaWEzMiBMRVwiOiBcIkBlc2J1aWxkL3dpbjMyLWlhMzJcIixcbiAgXCJ3aW4zMiB4NjQgTEVcIjogXCJAZXNidWlsZC93aW4zMi14NjRcIlxufTtcbnZhciBrbm93blVuaXhsaWtlUGFja2FnZXMgPSB7XG4gIFwiYWl4IHBwYzY0IEJFXCI6IFwiQGVzYnVpbGQvYWl4LXBwYzY0XCIsXG4gIFwiYW5kcm9pZCBhcm02NCBMRVwiOiBcIkBlc2J1aWxkL2FuZHJvaWQtYXJtNjRcIixcbiAgXCJkYXJ3aW4gYXJtNjQgTEVcIjogXCJAZXNidWlsZC9kYXJ3aW4tYXJtNjRcIixcbiAgXCJkYXJ3aW4geDY0IExFXCI6IFwiQGVzYnVpbGQvZGFyd2luLXg2NFwiLFxuICBcImZyZWVic2QgYXJtNjQgTEVcIjogXCJAZXNidWlsZC9mcmVlYnNkLWFybTY0XCIsXG4gIFwiZnJlZWJzZCB4NjQgTEVcIjogXCJAZXNidWlsZC9mcmVlYnNkLXg2NFwiLFxuICBcImxpbnV4IGFybSBMRVwiOiBcIkBlc2J1aWxkL2xpbnV4LWFybVwiLFxuICBcImxpbnV4IGFybTY0IExFXCI6IFwiQGVzYnVpbGQvbGludXgtYXJtNjRcIixcbiAgXCJsaW51eCBpYTMyIExFXCI6IFwiQGVzYnVpbGQvbGludXgtaWEzMlwiLFxuICBcImxpbnV4IG1pcHM2NGVsIExFXCI6IFwiQGVzYnVpbGQvbGludXgtbWlwczY0ZWxcIixcbiAgXCJsaW51eCBwcGM2NCBMRVwiOiBcIkBlc2J1aWxkL2xpbnV4LXBwYzY0XCIsXG4gIFwibGludXggcmlzY3Y2NCBMRVwiOiBcIkBlc2J1aWxkL2xpbnV4LXJpc2N2NjRcIixcbiAgXCJsaW51eCBzMzkweCBCRVwiOiBcIkBlc2J1aWxkL2xpbnV4LXMzOTB4XCIsXG4gIFwibGludXggeDY0IExFXCI6IFwiQGVzYnVpbGQvbGludXgteDY0XCIsXG4gIFwibGludXggbG9vbmc2NCBMRVwiOiBcIkBlc2J1aWxkL2xpbnV4LWxvb25nNjRcIixcbiAgXCJuZXRic2QgYXJtNjQgTEVcIjogXCJAZXNidWlsZC9uZXRic2QtYXJtNjRcIixcbiAgXCJuZXRic2QgeDY0IExFXCI6IFwiQGVzYnVpbGQvbmV0YnNkLXg2NFwiLFxuICBcIm9wZW5ic2QgYXJtNjQgTEVcIjogXCJAZXNidWlsZC9vcGVuYnNkLWFybTY0XCIsXG4gIFwib3BlbmJzZCB4NjQgTEVcIjogXCJAZXNidWlsZC9vcGVuYnNkLXg2NFwiLFxuICBcInN1bm9zIHg2NCBMRVwiOiBcIkBlc2J1aWxkL3N1bm9zLXg2NFwiXG59O1xudmFyIGtub3duV2ViQXNzZW1ibHlGYWxsYmFja1BhY2thZ2VzID0ge1xuICBcImFuZHJvaWQgYXJtIExFXCI6IFwiQGVzYnVpbGQvYW5kcm9pZC1hcm1cIixcbiAgXCJhbmRyb2lkIHg2NCBMRVwiOiBcIkBlc2J1aWxkL2FuZHJvaWQteDY0XCIsXG4gIFwib3Blbmhhcm1vbnkgYXJtNjQgTEVcIjogXCJAZXNidWlsZC9vcGVuaGFybW9ueS1hcm02NFwiXG59O1xuZnVuY3Rpb24gcGtnQW5kU3VicGF0aEZvckN1cnJlbnRQbGF0Zm9ybSgpIHtcbiAgbGV0IHBrZztcbiAgbGV0IHN1YnBhdGg7XG4gIGxldCBpc1dBU00gPSBmYWxzZTtcbiAgbGV0IHBsYXRmb3JtS2V5ID0gYCR7cHJvY2Vzcy5wbGF0Zm9ybX0gJHtvcy5hcmNoKCl9ICR7b3MuZW5kaWFubmVzcygpfWA7XG4gIGlmIChwbGF0Zm9ybUtleSBpbiBrbm93bldpbmRvd3NQYWNrYWdlcykge1xuICAgIHBrZyA9IGtub3duV2luZG93c1BhY2thZ2VzW3BsYXRmb3JtS2V5XTtcbiAgICBzdWJwYXRoID0gXCJlc2J1aWxkLmV4ZVwiO1xuICB9IGVsc2UgaWYgKHBsYXRmb3JtS2V5IGluIGtub3duVW5peGxpa2VQYWNrYWdlcykge1xuICAgIHBrZyA9IGtub3duVW5peGxpa2VQYWNrYWdlc1twbGF0Zm9ybUtleV07XG4gICAgc3VicGF0aCA9IFwiYmluL2VzYnVpbGRcIjtcbiAgfSBlbHNlIGlmIChwbGF0Zm9ybUtleSBpbiBrbm93bldlYkFzc2VtYmx5RmFsbGJhY2tQYWNrYWdlcykge1xuICAgIHBrZyA9IGtub3duV2ViQXNzZW1ibHlGYWxsYmFja1BhY2thZ2VzW3BsYXRmb3JtS2V5XTtcbiAgICBzdWJwYXRoID0gXCJiaW4vZXNidWlsZFwiO1xuICAgIGlzV0FTTSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBwbGF0Zm9ybTogJHtwbGF0Zm9ybUtleX1gKTtcbiAgfVxuICByZXR1cm4geyBwa2csIHN1YnBhdGgsIGlzV0FTTSB9O1xufVxuZnVuY3Rpb24gcGtnRm9yU29tZU90aGVyUGxhdGZvcm0oKSB7XG4gIGNvbnN0IGxpYk1haW5KUyA9IHJlcXVpcmUucmVzb2x2ZShcImVzYnVpbGRcIik7XG4gIGNvbnN0IG5vZGVNb2R1bGVzRGlyZWN0b3J5ID0gcGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUobGliTWFpbkpTKSkpO1xuICBpZiAocGF0aC5iYXNlbmFtZShub2RlTW9kdWxlc0RpcmVjdG9yeSkgPT09IFwibm9kZV9tb2R1bGVzXCIpIHtcbiAgICBmb3IgKGNvbnN0IHVuaXhLZXkgaW4ga25vd25Vbml4bGlrZVBhY2thZ2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwa2cgPSBrbm93blVuaXhsaWtlUGFja2FnZXNbdW5peEtleV07XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihub2RlTW9kdWxlc0RpcmVjdG9yeSwgcGtnKSkpIHJldHVybiBwa2c7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB3aW5kb3dzS2V5IGluIGtub3duV2luZG93c1BhY2thZ2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwa2cgPSBrbm93bldpbmRvd3NQYWNrYWdlc1t3aW5kb3dzS2V5XTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKG5vZGVNb2R1bGVzRGlyZWN0b3J5LCBwa2cpKSkgcmV0dXJuIHBrZztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRvd25sb2FkZWRCaW5QYXRoKHBrZywgc3VicGF0aCkge1xuICBjb25zdCBlc2J1aWxkTGliRGlyID0gcGF0aC5kaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShcImVzYnVpbGRcIikpO1xuICByZXR1cm4gcGF0aC5qb2luKGVzYnVpbGRMaWJEaXIsIGBkb3dubG9hZGVkLSR7cGtnLnJlcGxhY2UoXCIvXCIsIFwiLVwiKX0tJHtwYXRoLmJhc2VuYW1lKHN1YnBhdGgpfWApO1xufVxuZnVuY3Rpb24gZ2VuZXJhdGVCaW5QYXRoKCkge1xuICBpZiAoaXNWYWxpZEJpbmFyeVBhdGgoRVNCVUlMRF9CSU5BUllfUEFUSCkpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoRVNCVUlMRF9CSU5BUllfUEFUSCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2VzYnVpbGRdIElnbm9yaW5nIGJhZCBjb25maWd1cmF0aW9uOiBFU0JVSUxEX0JJTkFSWV9QQVRIPSR7RVNCVUlMRF9CSU5BUllfUEFUSH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHsgYmluUGF0aDogRVNCVUlMRF9CSU5BUllfUEFUSCwgaXNXQVNNOiBmYWxzZSB9O1xuICAgIH1cbiAgfVxuICBjb25zdCB7IHBrZywgc3VicGF0aCwgaXNXQVNNIH0gPSBwa2dBbmRTdWJwYXRoRm9yQ3VycmVudFBsYXRmb3JtKCk7XG4gIGxldCBiaW5QYXRoO1xuICB0cnkge1xuICAgIGJpblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGtnfS8ke3N1YnBhdGh9YCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBiaW5QYXRoID0gZG93bmxvYWRlZEJpblBhdGgocGtnLCBzdWJwYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcXVpcmUucmVzb2x2ZShwa2cpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IG90aGVyUGtnID0gcGtnRm9yU29tZU90aGVyUGxhdGZvcm0oKTtcbiAgICAgICAgaWYgKG90aGVyUGtnKSB7XG4gICAgICAgICAgbGV0IHN1Z2dlc3Rpb25zID0gYFxuU3BlY2lmaWNhbGx5IHRoZSBcIiR7b3RoZXJQa2d9XCIgcGFja2FnZSBpcyBwcmVzZW50IGJ1dCB0aGlzIHBsYXRmb3JtXG5uZWVkcyB0aGUgXCIke3BrZ31cIiBwYWNrYWdlIGluc3RlYWQuIFBlb3BsZSBvZnRlbiBnZXQgaW50byB0aGlzXG5zaXR1YXRpb24gYnkgaW5zdGFsbGluZyBlc2J1aWxkIG9uIFdpbmRvd3Mgb3IgbWFjT1MgYW5kIGNvcHlpbmcgXCJub2RlX21vZHVsZXNcIlxuaW50byBhIERvY2tlciBpbWFnZSB0aGF0IHJ1bnMgTGludXgsIG9yIGJ5IGNvcHlpbmcgXCJub2RlX21vZHVsZXNcIiBiZXR3ZWVuXG5XaW5kb3dzIGFuZCBXU0wgZW52aXJvbm1lbnRzLlxuXG5JZiB5b3UgYXJlIGluc3RhbGxpbmcgd2l0aCBucG0sIHlvdSBjYW4gdHJ5IG5vdCBjb3B5aW5nIHRoZSBcIm5vZGVfbW9kdWxlc1wiXG5kaXJlY3Rvcnkgd2hlbiB5b3UgY29weSB0aGUgZmlsZXMgb3ZlciwgYW5kIHJ1bm5pbmcgXCJucG0gY2lcIiBvciBcIm5wbSBpbnN0YWxsXCJcbm9uIHRoZSBkZXN0aW5hdGlvbiBwbGF0Zm9ybSBhZnRlciB0aGUgY29weS4gT3IgeW91IGNvdWxkIGNvbnNpZGVyIHVzaW5nIHlhcm5cbmluc3RlYWQgb2YgbnBtIHdoaWNoIGhhcyBidWlsdC1pbiBzdXBwb3J0IGZvciBpbnN0YWxsaW5nIGEgcGFja2FnZSBvbiBtdWx0aXBsZVxucGxhdGZvcm1zIHNpbXVsdGFuZW91c2x5LlxuXG5JZiB5b3UgYXJlIGluc3RhbGxpbmcgd2l0aCB5YXJuLCB5b3UgY2FuIHRyeSBsaXN0aW5nIGJvdGggdGhpcyBwbGF0Zm9ybSBhbmQgdGhlXG5vdGhlciBwbGF0Zm9ybSBpbiB5b3VyIFwiLnlhcm5yYy55bWxcIiBmaWxlIHVzaW5nIHRoZSBcInN1cHBvcnRlZEFyY2hpdGVjdHVyZXNcIlxuZmVhdHVyZTogaHR0cHM6Ly95YXJucGtnLmNvbS9jb25maWd1cmF0aW9uL3lhcm5yYy8jc3VwcG9ydGVkQXJjaGl0ZWN0dXJlc1xuS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBtZWFucyBtdWx0aXBsZSBjb3BpZXMgb2YgZXNidWlsZCB3aWxsIGJlIHByZXNlbnQuXG5gO1xuICAgICAgICAgIGlmIChwa2cgPT09IHBhY2thZ2VEYXJ3aW5feDY0ICYmIG90aGVyUGtnID09PSBwYWNrYWdlRGFyd2luX2FybTY0IHx8IHBrZyA9PT0gcGFja2FnZURhcndpbl9hcm02NCAmJiBvdGhlclBrZyA9PT0gcGFja2FnZURhcndpbl94NjQpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zID0gYFxuU3BlY2lmaWNhbGx5IHRoZSBcIiR7b3RoZXJQa2d9XCIgcGFja2FnZSBpcyBwcmVzZW50IGJ1dCB0aGlzIHBsYXRmb3JtXG5uZWVkcyB0aGUgXCIke3BrZ31cIiBwYWNrYWdlIGluc3RlYWQuIFBlb3BsZSBvZnRlbiBnZXQgaW50byB0aGlzXG5zaXR1YXRpb24gYnkgaW5zdGFsbGluZyBlc2J1aWxkIHdpdGggbnBtIHJ1bm5pbmcgaW5zaWRlIG9mIFJvc2V0dGEgMiBhbmQgdGhlblxudHJ5aW5nIHRvIHVzZSBpdCB3aXRoIG5vZGUgcnVubmluZyBvdXRzaWRlIG9mIFJvc2V0dGEgMiwgb3IgdmljZSB2ZXJzYSAoUm9zZXR0YVxuMiBpcyBBcHBsZSdzIG9uLXRoZS1mbHkgeDg2XzY0LXRvLWFybTY0IHRyYW5zbGF0aW9uIHNlcnZpY2UpLlxuXG5JZiB5b3UgYXJlIGluc3RhbGxpbmcgd2l0aCBucG0sIHlvdSBjYW4gdHJ5IGVuc3VyaW5nIHRoYXQgYm90aCBucG0gYW5kIG5vZGUgYXJlXG5ub3QgcnVubmluZyB1bmRlciBSb3NldHRhIDIgYW5kIHRoZW4gcmVpbnN0YWxsaW5nIGVzYnVpbGQuIFRoaXMgbGlrZWx5IGludm9sdmVzXG5jaGFuZ2luZyBob3cgeW91IGluc3RhbGxlZCBucG0gYW5kL29yIG5vZGUuIEZvciBleGFtcGxlLCBpbnN0YWxsaW5nIG5vZGUgd2l0aFxudGhlIHVuaXZlcnNhbCBpbnN0YWxsZXIgaGVyZSBzaG91bGQgd29yazogaHR0cHM6Ly9ub2RlanMub3JnL2VuL2Rvd25sb2FkLy4gT3JcbnlvdSBjb3VsZCBjb25zaWRlciB1c2luZyB5YXJuIGluc3RlYWQgb2YgbnBtIHdoaWNoIGhhcyBidWlsdC1pbiBzdXBwb3J0IGZvclxuaW5zdGFsbGluZyBhIHBhY2thZ2Ugb24gbXVsdGlwbGUgcGxhdGZvcm1zIHNpbXVsdGFuZW91c2x5LlxuXG5JZiB5b3UgYXJlIGluc3RhbGxpbmcgd2l0aCB5YXJuLCB5b3UgY2FuIHRyeSBsaXN0aW5nIGJvdGggXCJhcm02NFwiIGFuZCBcIng2NFwiXG5pbiB5b3VyIFwiLnlhcm5yYy55bWxcIiBmaWxlIHVzaW5nIHRoZSBcInN1cHBvcnRlZEFyY2hpdGVjdHVyZXNcIiBmZWF0dXJlOlxuaHR0cHM6Ly95YXJucGtnLmNvbS9jb25maWd1cmF0aW9uL3lhcm5yYy8jc3VwcG9ydGVkQXJjaGl0ZWN0dXJlc1xuS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBtZWFucyBtdWx0aXBsZSBjb3BpZXMgb2YgZXNidWlsZCB3aWxsIGJlIHByZXNlbnQuXG5gO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuWW91IGluc3RhbGxlZCBlc2J1aWxkIGZvciBhbm90aGVyIHBsYXRmb3JtIHRoYW4gdGhlIG9uZSB5b3UncmUgY3VycmVudGx5IHVzaW5nLlxuVGhpcyB3b24ndCB3b3JrIGJlY2F1c2UgZXNidWlsZCBpcyB3cml0dGVuIHdpdGggbmF0aXZlIGNvZGUgYW5kIG5lZWRzIHRvXG5pbnN0YWxsIGEgcGxhdGZvcm0tc3BlY2lmaWMgYmluYXJ5IGV4ZWN1dGFibGUuXG4ke3N1Z2dlc3Rpb25zfVxuQW5vdGhlciBhbHRlcm5hdGl2ZSBpcyB0byB1c2UgdGhlIFwiZXNidWlsZC13YXNtXCIgcGFja2FnZSBpbnN0ZWFkLCB3aGljaCB3b3Jrc1xudGhlIHNhbWUgd2F5IG9uIGFsbCBwbGF0Zm9ybXMuIEJ1dCBpdCBjb21lcyB3aXRoIGEgaGVhdnkgcGVyZm9ybWFuY2UgY29zdCBhbmRcbmNhbiBzb21ldGltZXMgYmUgMTB4IHNsb3dlciB0aGFuIHRoZSBcImVzYnVpbGRcIiBwYWNrYWdlLCBzbyB5b3UgbWF5IGFsc28gbm90XG53YW50IHRvIGRvIHRoYXQuXG5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwYWNrYWdlIFwiJHtwa2d9XCIgY291bGQgbm90IGJlIGZvdW5kLCBhbmQgaXMgbmVlZGVkIGJ5IGVzYnVpbGQuXG5cbklmIHlvdSBhcmUgaW5zdGFsbGluZyBlc2J1aWxkIHdpdGggbnBtLCBtYWtlIHN1cmUgdGhhdCB5b3UgZG9uJ3Qgc3BlY2lmeSB0aGVcblwiLS1uby1vcHRpb25hbFwiIG9yIFwiLS1vbWl0PW9wdGlvbmFsXCIgZmxhZ3MuIFRoZSBcIm9wdGlvbmFsRGVwZW5kZW5jaWVzXCIgZmVhdHVyZVxub2YgXCJwYWNrYWdlLmpzb25cIiBpcyB1c2VkIGJ5IGVzYnVpbGQgdG8gaW5zdGFsbCB0aGUgY29ycmVjdCBiaW5hcnkgZXhlY3V0YWJsZVxuZm9yIHlvdXIgY3VycmVudCBwbGF0Zm9ybS5gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG4gIGlmICgvXFwuemlwXFwvLy50ZXN0KGJpblBhdGgpKSB7XG4gICAgbGV0IHBucGFwaTtcbiAgICB0cnkge1xuICAgICAgcG5wYXBpID0gcmVxdWlyZShcInBucGFwaVwiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuICAgIGlmIChwbnBhcGkpIHtcbiAgICAgIGNvbnN0IHJvb3QgPSBwbnBhcGkuZ2V0UGFja2FnZUluZm9ybWF0aW9uKHBucGFwaS50b3BMZXZlbCkucGFja2FnZUxvY2F0aW9uO1xuICAgICAgY29uc3QgYmluVGFyZ2V0UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgcm9vdCxcbiAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgXCIuY2FjaGVcIixcbiAgICAgICAgXCJlc2J1aWxkXCIsXG4gICAgICAgIGBwbnBhcGktJHtwa2cucmVwbGFjZShcIi9cIiwgXCItXCIpfS0ke1wiMC4yNS4xMlwifS0ke3BhdGguYmFzZW5hbWUoc3VicGF0aCl9YFxuICAgICAgKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiaW5UYXJnZXRQYXRoKSkge1xuICAgICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKGJpblRhcmdldFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgZnMuY29weUZpbGVTeW5jKGJpblBhdGgsIGJpblRhcmdldFBhdGgpO1xuICAgICAgICBmcy5jaG1vZFN5bmMoYmluVGFyZ2V0UGF0aCwgNDkzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGJpblBhdGg6IGJpblRhcmdldFBhdGgsIGlzV0FTTSB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBiaW5QYXRoLCBpc1dBU00gfTtcbn1cblxuLy8gbGliL25wbS9ub2RlLnRzXG52YXIgY2hpbGRfcHJvY2VzcyA9IHJlcXVpcmUoXCJjaGlsZF9wcm9jZXNzXCIpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoXCJjcnlwdG9cIik7XG52YXIgcGF0aDIgPSByZXF1aXJlKFwicGF0aFwiKTtcbnZhciBmczIgPSByZXF1aXJlKFwiZnNcIik7XG52YXIgb3MyID0gcmVxdWlyZShcIm9zXCIpO1xudmFyIHR0eSA9IHJlcXVpcmUoXCJ0dHlcIik7XG52YXIgd29ya2VyX3RocmVhZHM7XG5pZiAocHJvY2Vzcy5lbnYuRVNCVUlMRF9XT1JLRVJfVEhSRUFEUyAhPT0gXCIwXCIpIHtcbiAgdHJ5IHtcbiAgICB3b3JrZXJfdGhyZWFkcyA9IHJlcXVpcmUoXCJ3b3JrZXJfdGhyZWFkc1wiKTtcbiAgfSBjYXRjaCB7XG4gIH1cbiAgbGV0IFttYWpvciwgbWlub3JdID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KFwiLlwiKTtcbiAgaWYgKFxuICAgIC8vIDx2MTIuMTcuMCBkb2VzIG5vdCB3b3JrXG4gICAgK21ham9yIDwgMTIgfHwgK21ham9yID09PSAxMiAmJiArbWlub3IgPCAxNyB8fCArbWFqb3IgPT09IDEzICYmICttaW5vciA8IDEzXG4gICkge1xuICAgIHdvcmtlcl90aHJlYWRzID0gdm9pZCAwO1xuICB9XG59XG52YXIgX2E7XG52YXIgaXNJbnRlcm5hbFdvcmtlclRocmVhZCA9ICgoX2EgPSB3b3JrZXJfdGhyZWFkcyA9PSBudWxsID8gdm9pZCAwIDogd29ya2VyX3RocmVhZHMud29ya2VyRGF0YSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmVzYnVpbGRWZXJzaW9uKSA9PT0gXCIwLjI1LjEyXCI7XG52YXIgZXNidWlsZENvbW1hbmRBbmRBcmdzID0gKCkgPT4ge1xuICBpZiAoKCFFU0JVSUxEX0JJTkFSWV9QQVRIIHx8IGZhbHNlKSAmJiAocGF0aDIuYmFzZW5hbWUoX19maWxlbmFtZSkgIT09IFwibWFpbi5qc1wiIHx8IHBhdGgyLmJhc2VuYW1lKF9fZGlybmFtZSkgIT09IFwibGliXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBlc2J1aWxkIEphdmFTY3JpcHQgQVBJIGNhbm5vdCBiZSBidW5kbGVkLiBQbGVhc2UgbWFyayB0aGUgXCJlc2J1aWxkXCIgcGFja2FnZSBhcyBleHRlcm5hbCBzbyBpdCdzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYnVuZGxlLlxuXG5Nb3JlIGluZm9ybWF0aW9uOiBUaGUgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGZvciBlc2J1aWxkJ3MgSmF2YVNjcmlwdCBBUEkgKCR7X19maWxlbmFtZX0pIGRvZXMgbm90IGFwcGVhciB0byBiZSBpbnNpZGUgdGhlIGVzYnVpbGQgcGFja2FnZSBvbiB0aGUgZmlsZSBzeXN0ZW0sIHdoaWNoIHVzdWFsbHkgbWVhbnMgdGhhdCB0aGUgZXNidWlsZCBwYWNrYWdlIHdhcyBidW5kbGVkIGludG8gYW5vdGhlciBmaWxlLiBUaGlzIGlzIHByb2JsZW1hdGljIGJlY2F1c2UgdGhlIEFQSSBuZWVkcyB0byBydW4gYSBiaW5hcnkgZXhlY3V0YWJsZSBpbnNpZGUgdGhlIGVzYnVpbGQgcGFja2FnZSB3aGljaCBpcyBsb2NhdGVkIHVzaW5nIGEgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBBUEkgY29kZSB0byB0aGUgZXhlY3V0YWJsZS4gSWYgdGhlIGVzYnVpbGQgcGFja2FnZSBpcyBidW5kbGVkLCB0aGUgcmVsYXRpdmUgcGF0aCB3aWxsIGJlIGluY29ycmVjdCBhbmQgdGhlIGV4ZWN1dGFibGUgd29uJ3QgYmUgZm91bmQuYFxuICAgICk7XG4gIH1cbiAgaWYgKGZhbHNlKSB7XG4gICAgcmV0dXJuIFtcIm5vZGVcIiwgW3BhdGgyLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwiYmluXCIsIFwiZXNidWlsZFwiKV1dO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHsgYmluUGF0aCwgaXNXQVNNIH0gPSBnZW5lcmF0ZUJpblBhdGgoKTtcbiAgICBpZiAoaXNXQVNNKSB7XG4gICAgICByZXR1cm4gW1wibm9kZVwiLCBbYmluUGF0aF1dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW2JpblBhdGgsIFtdXTtcbiAgICB9XG4gIH1cbn07XG52YXIgaXNUVFkgPSAoKSA9PiB0dHkuaXNhdHR5KDIpO1xudmFyIGZzU3luYyA9IHtcbiAgcmVhZEZpbGUodGVtcEZpbGUsIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50cyA9IGZzMi5yZWFkRmlsZVN5bmModGVtcEZpbGUsIFwidXRmOFwiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZzMi51bmxpbmtTeW5jKHRlbXBGaWxlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgY29udGVudHMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyLCBudWxsKTtcbiAgICB9XG4gIH0sXG4gIHdyaXRlRmlsZShjb250ZW50cywgY2FsbGJhY2spIHtcbiAgICB0cnkge1xuICAgICAgbGV0IHRlbXBGaWxlID0gcmFuZG9tRmlsZU5hbWUoKTtcbiAgICAgIGZzMi53cml0ZUZpbGVTeW5jKHRlbXBGaWxlLCBjb250ZW50cyk7XG4gICAgICBjYWxsYmFjayh0ZW1wRmlsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjYWxsYmFjayhudWxsKTtcbiAgICB9XG4gIH1cbn07XG52YXIgZnNBc3luYyA9IHtcbiAgcmVhZEZpbGUodGVtcEZpbGUsIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZzMi5yZWFkRmlsZSh0ZW1wRmlsZSwgXCJ1dGY4XCIsIChlcnIsIGNvbnRlbnRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZnMyLnVubGluayh0ZW1wRmlsZSwgKCkgPT4gY2FsbGJhY2soZXJyLCBjb250ZW50cykpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIsIGNvbnRlbnRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIsIG51bGwpO1xuICAgIH1cbiAgfSxcbiAgd3JpdGVGaWxlKGNvbnRlbnRzLCBjYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICBsZXQgdGVtcEZpbGUgPSByYW5kb21GaWxlTmFtZSgpO1xuICAgICAgZnMyLndyaXRlRmlsZSh0ZW1wRmlsZSwgY29udGVudHMsIChlcnIpID0+IGVyciAhPT0gbnVsbCA/IGNhbGxiYWNrKG51bGwpIDogY2FsbGJhY2sodGVtcEZpbGUpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgIH1cbiAgfVxufTtcbnZhciB2ZXJzaW9uID0gXCIwLjI1LjEyXCI7XG52YXIgYnVpbGQgPSAob3B0aW9ucykgPT4gZW5zdXJlU2VydmljZUlzUnVubmluZygpLmJ1aWxkKG9wdGlvbnMpO1xudmFyIGNvbnRleHQgPSAoYnVpbGRPcHRpb25zKSA9PiBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCkuY29udGV4dChidWlsZE9wdGlvbnMpO1xudmFyIHRyYW5zZm9ybSA9IChpbnB1dCwgb3B0aW9ucykgPT4gZW5zdXJlU2VydmljZUlzUnVubmluZygpLnRyYW5zZm9ybShpbnB1dCwgb3B0aW9ucyk7XG52YXIgZm9ybWF0TWVzc2FnZXMgPSAobWVzc2FnZXMsIG9wdGlvbnMpID0+IGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcoKS5mb3JtYXRNZXNzYWdlcyhtZXNzYWdlcywgb3B0aW9ucyk7XG52YXIgYW5hbHl6ZU1ldGFmaWxlID0gKG1lc3NhZ2VzLCBvcHRpb25zKSA9PiBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCkuYW5hbHl6ZU1ldGFmaWxlKG1lc3NhZ2VzLCBvcHRpb25zKTtcbnZhciBidWlsZFN5bmMgPSAob3B0aW9ucykgPT4ge1xuICBpZiAod29ya2VyX3RocmVhZHMgJiYgIWlzSW50ZXJuYWxXb3JrZXJUaHJlYWQpIHtcbiAgICBpZiAoIXdvcmtlclRocmVhZFNlcnZpY2UpIHdvcmtlclRocmVhZFNlcnZpY2UgPSBzdGFydFdvcmtlclRocmVhZFNlcnZpY2Uod29ya2VyX3RocmVhZHMpO1xuICAgIHJldHVybiB3b3JrZXJUaHJlYWRTZXJ2aWNlLmJ1aWxkU3luYyhvcHRpb25zKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICBydW5TZXJ2aWNlU3luYygoc2VydmljZSkgPT4gc2VydmljZS5idWlsZE9yQ29udGV4dCh7XG4gICAgY2FsbE5hbWU6IFwiYnVpbGRTeW5jXCIsXG4gICAgcmVmczogbnVsbCxcbiAgICBvcHRpb25zLFxuICAgIGlzVFRZOiBpc1RUWSgpLFxuICAgIGRlZmF1bHRXRCxcbiAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiB7XG4gICAgICBpZiAoZXJyKSB0aHJvdyBlcnI7XG4gICAgICByZXN1bHQgPSByZXM7XG4gICAgfVxuICB9KSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIHRyYW5zZm9ybVN5bmMgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHdvcmtlcl90aHJlYWRzICYmICFpc0ludGVybmFsV29ya2VyVGhyZWFkKSB7XG4gICAgaWYgKCF3b3JrZXJUaHJlYWRTZXJ2aWNlKSB3b3JrZXJUaHJlYWRTZXJ2aWNlID0gc3RhcnRXb3JrZXJUaHJlYWRTZXJ2aWNlKHdvcmtlcl90aHJlYWRzKTtcbiAgICByZXR1cm4gd29ya2VyVGhyZWFkU2VydmljZS50cmFuc2Zvcm1TeW5jKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICBydW5TZXJ2aWNlU3luYygoc2VydmljZSkgPT4gc2VydmljZS50cmFuc2Zvcm0oe1xuICAgIGNhbGxOYW1lOiBcInRyYW5zZm9ybVN5bmNcIixcbiAgICByZWZzOiBudWxsLFxuICAgIGlucHV0LFxuICAgIG9wdGlvbnM6IG9wdGlvbnMgfHwge30sXG4gICAgaXNUVFk6IGlzVFRZKCksXG4gICAgZnM6IGZzU3luYyxcbiAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiB7XG4gICAgICBpZiAoZXJyKSB0aHJvdyBlcnI7XG4gICAgICByZXN1bHQgPSByZXM7XG4gICAgfVxuICB9KSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIGZvcm1hdE1lc3NhZ2VzU3luYyA9IChtZXNzYWdlcywgb3B0aW9ucykgPT4ge1xuICBpZiAod29ya2VyX3RocmVhZHMgJiYgIWlzSW50ZXJuYWxXb3JrZXJUaHJlYWQpIHtcbiAgICBpZiAoIXdvcmtlclRocmVhZFNlcnZpY2UpIHdvcmtlclRocmVhZFNlcnZpY2UgPSBzdGFydFdvcmtlclRocmVhZFNlcnZpY2Uod29ya2VyX3RocmVhZHMpO1xuICAgIHJldHVybiB3b3JrZXJUaHJlYWRTZXJ2aWNlLmZvcm1hdE1lc3NhZ2VzU3luYyhtZXNzYWdlcywgb3B0aW9ucyk7XG4gIH1cbiAgbGV0IHJlc3VsdDtcbiAgcnVuU2VydmljZVN5bmMoKHNlcnZpY2UpID0+IHNlcnZpY2UuZm9ybWF0TWVzc2FnZXMoe1xuICAgIGNhbGxOYW1lOiBcImZvcm1hdE1lc3NhZ2VzU3luY1wiLFxuICAgIHJlZnM6IG51bGwsXG4gICAgbWVzc2FnZXMsXG4gICAgb3B0aW9ucyxcbiAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiB7XG4gICAgICBpZiAoZXJyKSB0aHJvdyBlcnI7XG4gICAgICByZXN1bHQgPSByZXM7XG4gICAgfVxuICB9KSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIGFuYWx5emVNZXRhZmlsZVN5bmMgPSAobWV0YWZpbGUsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHdvcmtlcl90aHJlYWRzICYmICFpc0ludGVybmFsV29ya2VyVGhyZWFkKSB7XG4gICAgaWYgKCF3b3JrZXJUaHJlYWRTZXJ2aWNlKSB3b3JrZXJUaHJlYWRTZXJ2aWNlID0gc3RhcnRXb3JrZXJUaHJlYWRTZXJ2aWNlKHdvcmtlcl90aHJlYWRzKTtcbiAgICByZXR1cm4gd29ya2VyVGhyZWFkU2VydmljZS5hbmFseXplTWV0YWZpbGVTeW5jKG1ldGFmaWxlLCBvcHRpb25zKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICBydW5TZXJ2aWNlU3luYygoc2VydmljZSkgPT4gc2VydmljZS5hbmFseXplTWV0YWZpbGUoe1xuICAgIGNhbGxOYW1lOiBcImFuYWx5emVNZXRhZmlsZVN5bmNcIixcbiAgICByZWZzOiBudWxsLFxuICAgIG1ldGFmaWxlOiB0eXBlb2YgbWV0YWZpbGUgPT09IFwic3RyaW5nXCIgPyBtZXRhZmlsZSA6IEpTT04uc3RyaW5naWZ5KG1ldGFmaWxlKSxcbiAgICBvcHRpb25zLFxuICAgIGNhbGxiYWNrOiAoZXJyLCByZXMpID0+IHtcbiAgICAgIGlmIChlcnIpIHRocm93IGVycjtcbiAgICAgIHJlc3VsdCA9IHJlcztcbiAgICB9XG4gIH0pKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgc3RvcCA9ICgpID0+IHtcbiAgaWYgKHN0b3BTZXJ2aWNlKSBzdG9wU2VydmljZSgpO1xuICBpZiAod29ya2VyVGhyZWFkU2VydmljZSkgd29ya2VyVGhyZWFkU2VydmljZS5zdG9wKCk7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn07XG52YXIgaW5pdGlhbGl6ZVdhc0NhbGxlZCA9IGZhbHNlO1xudmFyIGluaXRpYWxpemUgPSAob3B0aW9ucykgPT4ge1xuICBvcHRpb25zID0gdmFsaWRhdGVJbml0aWFsaXplT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgaWYgKG9wdGlvbnMud2FzbVVSTCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgXCJ3YXNtVVJMXCIgb3B0aW9uIG9ubHkgd29ya3MgaW4gdGhlIGJyb3dzZXJgKTtcbiAgaWYgKG9wdGlvbnMud2FzbU1vZHVsZSkgdGhyb3cgbmV3IEVycm9yKGBUaGUgXCJ3YXNtTW9kdWxlXCIgb3B0aW9uIG9ubHkgd29ya3MgaW4gdGhlIGJyb3dzZXJgKTtcbiAgaWYgKG9wdGlvbnMud29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcIndvcmtlclwiIG9wdGlvbiBvbmx5IHdvcmtzIGluIHRoZSBicm93c2VyYCk7XG4gIGlmIChpbml0aWFsaXplV2FzQ2FsbGVkKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIFwiaW5pdGlhbGl6ZVwiIG1vcmUgdGhhbiBvbmNlJyk7XG4gIGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcoKTtcbiAgaW5pdGlhbGl6ZVdhc0NhbGxlZCA9IHRydWU7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn07XG52YXIgZGVmYXVsdFdEID0gcHJvY2Vzcy5jd2QoKTtcbnZhciBsb25nTGl2ZWRTZXJ2aWNlO1xudmFyIHN0b3BTZXJ2aWNlO1xudmFyIGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcgPSAoKSA9PiB7XG4gIGlmIChsb25nTGl2ZWRTZXJ2aWNlKSByZXR1cm4gbG9uZ0xpdmVkU2VydmljZTtcbiAgbGV0IFtjb21tYW5kLCBhcmdzXSA9IGVzYnVpbGRDb21tYW5kQW5kQXJncygpO1xuICBsZXQgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIGFyZ3MuY29uY2F0KGAtLXNlcnZpY2U9JHtcIjAuMjUuMTJcIn1gLCBcIi0tcGluZ1wiKSwge1xuICAgIHdpbmRvd3NIaWRlOiB0cnVlLFxuICAgIHN0ZGlvOiBbXCJwaXBlXCIsIFwicGlwZVwiLCBcImluaGVyaXRcIl0sXG4gICAgY3dkOiBkZWZhdWx0V0RcbiAgfSk7XG4gIGxldCB7IHJlYWRGcm9tU3Rkb3V0LCBhZnRlckNsb3NlLCBzZXJ2aWNlIH0gPSBjcmVhdGVDaGFubmVsKHtcbiAgICB3cml0ZVRvU3RkaW4oYnl0ZXMpIHtcbiAgICAgIGNoaWxkLnN0ZGluLndyaXRlKGJ5dGVzLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIGFmdGVyQ2xvc2UoZXJyKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcmVhZEZpbGVTeW5jOiBmczIucmVhZEZpbGVTeW5jLFxuICAgIGlzU3luYzogZmFsc2UsXG4gICAgaGFzRlM6IHRydWUsXG4gICAgZXNidWlsZDogbm9kZV9leHBvcnRzXG4gIH0pO1xuICBjaGlsZC5zdGRpbi5vbihcImVycm9yXCIsIGFmdGVyQ2xvc2UpO1xuICBjaGlsZC5vbihcImVycm9yXCIsIGFmdGVyQ2xvc2UpO1xuICBjb25zdCBzdGRpbiA9IGNoaWxkLnN0ZGluO1xuICBjb25zdCBzdGRvdXQgPSBjaGlsZC5zdGRvdXQ7XG4gIHN0ZG91dC5vbihcImRhdGFcIiwgcmVhZEZyb21TdGRvdXQpO1xuICBzdGRvdXQub24oXCJlbmRcIiwgYWZ0ZXJDbG9zZSk7XG4gIHN0b3BTZXJ2aWNlID0gKCkgPT4ge1xuICAgIHN0ZGluLmRlc3Ryb3koKTtcbiAgICBzdGRvdXQuZGVzdHJveSgpO1xuICAgIGNoaWxkLmtpbGwoKTtcbiAgICBpbml0aWFsaXplV2FzQ2FsbGVkID0gZmFsc2U7XG4gICAgbG9uZ0xpdmVkU2VydmljZSA9IHZvaWQgMDtcbiAgICBzdG9wU2VydmljZSA9IHZvaWQgMDtcbiAgfTtcbiAgbGV0IHJlZkNvdW50ID0gMDtcbiAgY2hpbGQudW5yZWYoKTtcbiAgaWYgKHN0ZGluLnVucmVmKSB7XG4gICAgc3RkaW4udW5yZWYoKTtcbiAgfVxuICBpZiAoc3Rkb3V0LnVucmVmKSB7XG4gICAgc3Rkb3V0LnVucmVmKCk7XG4gIH1cbiAgY29uc3QgcmVmcyA9IHtcbiAgICByZWYoKSB7XG4gICAgICBpZiAoKytyZWZDb3VudCA9PT0gMSkgY2hpbGQucmVmKCk7XG4gICAgfSxcbiAgICB1bnJlZigpIHtcbiAgICAgIGlmICgtLXJlZkNvdW50ID09PSAwKSBjaGlsZC51bnJlZigpO1xuICAgIH1cbiAgfTtcbiAgbG9uZ0xpdmVkU2VydmljZSA9IHtcbiAgICBidWlsZDogKG9wdGlvbnMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNlcnZpY2UuYnVpbGRPckNvbnRleHQoe1xuICAgICAgICBjYWxsTmFtZTogXCJidWlsZFwiLFxuICAgICAgICByZWZzLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBpc1RUWTogaXNUVFkoKSxcbiAgICAgICAgZGVmYXVsdFdELFxuICAgICAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUocmVzKVxuICAgICAgfSk7XG4gICAgfSksXG4gICAgY29udGV4dDogKG9wdGlvbnMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHNlcnZpY2UuYnVpbGRPckNvbnRleHQoe1xuICAgICAgY2FsbE5hbWU6IFwiY29udGV4dFwiLFxuICAgICAgcmVmcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBpc1RUWTogaXNUVFkoKSxcbiAgICAgIGRlZmF1bHRXRCxcbiAgICAgIGNhbGxiYWNrOiAoZXJyLCByZXMpID0+IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShyZXMpXG4gICAgfSkpLFxuICAgIHRyYW5zZm9ybTogKGlucHV0LCBvcHRpb25zKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBzZXJ2aWNlLnRyYW5zZm9ybSh7XG4gICAgICBjYWxsTmFtZTogXCJ0cmFuc2Zvcm1cIixcbiAgICAgIHJlZnMsXG4gICAgICBpbnB1dCxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMgfHwge30sXG4gICAgICBpc1RUWTogaXNUVFkoKSxcbiAgICAgIGZzOiBmc0FzeW5jLFxuICAgICAgY2FsbGJhY2s6IChlcnIsIHJlcykgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlcylcbiAgICB9KSksXG4gICAgZm9ybWF0TWVzc2FnZXM6IChtZXNzYWdlcywgb3B0aW9ucykgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2VydmljZS5mb3JtYXRNZXNzYWdlcyh7XG4gICAgICBjYWxsTmFtZTogXCJmb3JtYXRNZXNzYWdlc1wiLFxuICAgICAgcmVmcyxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGNhbGxiYWNrOiAoZXJyLCByZXMpID0+IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShyZXMpXG4gICAgfSkpLFxuICAgIGFuYWx5emVNZXRhZmlsZTogKG1ldGFmaWxlLCBvcHRpb25zKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBzZXJ2aWNlLmFuYWx5emVNZXRhZmlsZSh7XG4gICAgICBjYWxsTmFtZTogXCJhbmFseXplTWV0YWZpbGVcIixcbiAgICAgIHJlZnMsXG4gICAgICBtZXRhZmlsZTogdHlwZW9mIG1ldGFmaWxlID09PSBcInN0cmluZ1wiID8gbWV0YWZpbGUgOiBKU09OLnN0cmluZ2lmeShtZXRhZmlsZSksXG4gICAgICBvcHRpb25zLFxuICAgICAgY2FsbGJhY2s6IChlcnIsIHJlcykgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlcylcbiAgICB9KSlcbiAgfTtcbiAgcmV0dXJuIGxvbmdMaXZlZFNlcnZpY2U7XG59O1xudmFyIHJ1blNlcnZpY2VTeW5jID0gKGNhbGxiYWNrKSA9PiB7XG4gIGxldCBbY29tbWFuZCwgYXJnc10gPSBlc2J1aWxkQ29tbWFuZEFuZEFyZ3MoKTtcbiAgbGV0IHN0ZGluID0gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgbGV0IHsgcmVhZEZyb21TdGRvdXQsIGFmdGVyQ2xvc2UsIHNlcnZpY2UgfSA9IGNyZWF0ZUNoYW5uZWwoe1xuICAgIHdyaXRlVG9TdGRpbihieXRlcykge1xuICAgICAgaWYgKHN0ZGluLmxlbmd0aCAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBydW4gYXQgbW9zdCBvbmUgY29tbWFuZFwiKTtcbiAgICAgIHN0ZGluID0gYnl0ZXM7XG4gICAgfSxcbiAgICBpc1N5bmM6IHRydWUsXG4gICAgaGFzRlM6IHRydWUsXG4gICAgZXNidWlsZDogbm9kZV9leHBvcnRzXG4gIH0pO1xuICBjYWxsYmFjayhzZXJ2aWNlKTtcbiAgbGV0IHN0ZG91dCA9IGNoaWxkX3Byb2Nlc3MuZXhlY0ZpbGVTeW5jKGNvbW1hbmQsIGFyZ3MuY29uY2F0KGAtLXNlcnZpY2U9JHtcIjAuMjUuMTJcIn1gKSwge1xuICAgIGN3ZDogZGVmYXVsdFdELFxuICAgIHdpbmRvd3NIaWRlOiB0cnVlLFxuICAgIGlucHV0OiBzdGRpbixcbiAgICAvLyBXZSBkb24ndCBrbm93IGhvdyBsYXJnZSB0aGUgb3V0cHV0IGNvdWxkIGJlLiBJZiBpdCdzIHRvbyBsYXJnZSwgdGhlXG4gICAgLy8gY29tbWFuZCB3aWxsIGZhaWwgd2l0aCBFTk9CVUZTLiBSZXNlcnZlIDE2bWIgZm9yIG5vdyBzaW5jZSB0aGF0IGZlZWxzXG4gICAgLy8gbGlrZSBpdCBzaG91bGQgYmUgZW5vdWdoLiBBbHNvIGFsbG93IG92ZXJyaWRpbmcgdGhpcyB3aXRoIGFuIGVudmlyb25tZW50XG4gICAgLy8gdmFyaWFibGUuXG4gICAgbWF4QnVmZmVyOiArcHJvY2Vzcy5lbnYuRVNCVUlMRF9NQVhfQlVGRkVSIHx8IDE2ICogMTAyNCAqIDEwMjRcbiAgfSk7XG4gIHJlYWRGcm9tU3Rkb3V0KHN0ZG91dCk7XG4gIGFmdGVyQ2xvc2UobnVsbCk7XG59O1xudmFyIHJhbmRvbUZpbGVOYW1lID0gKCkgPT4ge1xuICByZXR1cm4gcGF0aDIuam9pbihvczIudG1wZGlyKCksIGBlc2J1aWxkLSR7Y3J5cHRvLnJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZyhcImhleFwiKX1gKTtcbn07XG52YXIgd29ya2VyVGhyZWFkU2VydmljZSA9IG51bGw7XG52YXIgc3RhcnRXb3JrZXJUaHJlYWRTZXJ2aWNlID0gKHdvcmtlcl90aHJlYWRzMikgPT4ge1xuICBsZXQgeyBwb3J0MTogbWFpblBvcnQsIHBvcnQyOiB3b3JrZXJQb3J0IH0gPSBuZXcgd29ya2VyX3RocmVhZHMyLk1lc3NhZ2VDaGFubmVsKCk7XG4gIGxldCB3b3JrZXIgPSBuZXcgd29ya2VyX3RocmVhZHMyLldvcmtlcihfX2ZpbGVuYW1lLCB7XG4gICAgd29ya2VyRGF0YTogeyB3b3JrZXJQb3J0LCBkZWZhdWx0V0QsIGVzYnVpbGRWZXJzaW9uOiBcIjAuMjUuMTJcIiB9LFxuICAgIHRyYW5zZmVyTGlzdDogW3dvcmtlclBvcnRdLFxuICAgIC8vIEZyb20gbm9kZSdzIGRvY3VtZW50YXRpb246IGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvd29ya2VyX3RocmVhZHMuaHRtbFxuICAgIC8vXG4gICAgLy8gICBUYWtlIGNhcmUgd2hlbiBsYXVuY2hpbmcgd29ya2VyIHRocmVhZHMgZnJvbSBwcmVsb2FkIHNjcmlwdHMgKHNjcmlwdHMgbG9hZGVkXG4gICAgLy8gICBhbmQgcnVuIHVzaW5nIHRoZSBgLXJgIGNvbW1hbmQgbGluZSBmbGFnKS4gVW5sZXNzIHRoZSBgZXhlY0FyZ3ZgIG9wdGlvbiBpc1xuICAgIC8vICAgZXhwbGljaXRseSBzZXQsIG5ldyBXb3JrZXIgdGhyZWFkcyBhdXRvbWF0aWNhbGx5IGluaGVyaXQgdGhlIGNvbW1hbmQgbGluZSBmbGFnc1xuICAgIC8vICAgZnJvbSB0aGUgcnVubmluZyBwcm9jZXNzIGFuZCB3aWxsIHByZWxvYWQgdGhlIHNhbWUgcHJlbG9hZCBzY3JpcHRzIGFzIHRoZSBtYWluXG4gICAgLy8gICB0aHJlYWQuIElmIHRoZSBwcmVsb2FkIHNjcmlwdCB1bmNvbmRpdGlvbmFsbHkgbGF1bmNoZXMgYSB3b3JrZXIgdGhyZWFkLCBldmVyeVxuICAgIC8vICAgdGhyZWFkIHNwYXduZWQgd2lsbCBzcGF3biBhbm90aGVyIHVudGlsIHRoZSBhcHBsaWNhdGlvbiBjcmFzaGVzLlxuICAgIC8vXG4gICAgZXhlY0FyZ3Y6IFtdXG4gIH0pO1xuICBsZXQgbmV4dElEID0gMDtcbiAgbGV0IGZha2VCdWlsZEVycm9yID0gKHRleHQpID0+IHtcbiAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYEJ1aWxkIGZhaWxlZCB3aXRoIDEgZXJyb3I6XG5lcnJvcjogJHt0ZXh0fWApO1xuICAgIGxldCBlcnJvcnMgPSBbeyBpZDogXCJcIiwgcGx1Z2luTmFtZTogXCJcIiwgdGV4dCwgbG9jYXRpb246IG51bGwsIG5vdGVzOiBbXSwgZGV0YWlsOiB2b2lkIDAgfV07XG4gICAgZXJyb3IuZXJyb3JzID0gZXJyb3JzO1xuICAgIGVycm9yLndhcm5pbmdzID0gW107XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xuICBsZXQgdmFsaWRhdGVCdWlsZFN5bmNPcHRpb25zID0gKG9wdGlvbnMpID0+IHtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybjtcbiAgICBsZXQgcGx1Z2lucyA9IG9wdGlvbnMucGx1Z2lucztcbiAgICBpZiAocGx1Z2lucyAmJiBwbHVnaW5zLmxlbmd0aCA+IDApIHRocm93IGZha2VCdWlsZEVycm9yKGBDYW5ub3QgdXNlIHBsdWdpbnMgaW4gc3luY2hyb25vdXMgQVBJIGNhbGxzYCk7XG4gIH07XG4gIGxldCBhcHBseVByb3BlcnRpZXMgPSAob2JqZWN0LCBwcm9wZXJ0aWVzKSA9PiB7XG4gICAgZm9yIChsZXQga2V5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgIG9iamVjdFtrZXldID0gcHJvcGVydGllc1trZXldO1xuICAgIH1cbiAgfTtcbiAgbGV0IHJ1bkNhbGxTeW5jID0gKGNvbW1hbmQsIGFyZ3MpID0+IHtcbiAgICBsZXQgaWQgPSBuZXh0SUQrKztcbiAgICBsZXQgc2hhcmVkQnVmZmVyID0gbmV3IFNoYXJlZEFycmF5QnVmZmVyKDgpO1xuICAgIGxldCBzaGFyZWRCdWZmZXJWaWV3ID0gbmV3IEludDMyQXJyYXkoc2hhcmVkQnVmZmVyKTtcbiAgICBsZXQgbXNnID0geyBzaGFyZWRCdWZmZXIsIGlkLCBjb21tYW5kLCBhcmdzIH07XG4gICAgd29ya2VyLnBvc3RNZXNzYWdlKG1zZyk7XG4gICAgbGV0IHN0YXR1cyA9IEF0b21pY3Mud2FpdChzaGFyZWRCdWZmZXJWaWV3LCAwLCAwKTtcbiAgICBpZiAoc3RhdHVzICE9PSBcIm9rXCIgJiYgc3RhdHVzICE9PSBcIm5vdC1lcXVhbFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBlcnJvcjogQXRvbWljcy53YWl0KCkgZmFpbGVkOiBcIiArIHN0YXR1cyk7XG4gICAgbGV0IHsgbWVzc2FnZTogeyBpZDogaWQyLCByZXNvbHZlLCByZWplY3QsIHByb3BlcnRpZXMgfSB9ID0gd29ya2VyX3RocmVhZHMyLnJlY2VpdmVNZXNzYWdlT25Qb3J0KG1haW5Qb3J0KTtcbiAgICBpZiAoaWQgIT09IGlkMikgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvcjogRXhwZWN0ZWQgaWQgJHtpZH0gYnV0IGdvdCBpZCAke2lkMn1gKTtcbiAgICBpZiAocmVqZWN0KSB7XG4gICAgICBhcHBseVByb3BlcnRpZXMocmVqZWN0LCBwcm9wZXJ0aWVzKTtcbiAgICAgIHRocm93IHJlamVjdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmU7XG4gIH07XG4gIHdvcmtlci51bnJlZigpO1xuICByZXR1cm4ge1xuICAgIGJ1aWxkU3luYyhvcHRpb25zKSB7XG4gICAgICB2YWxpZGF0ZUJ1aWxkU3luY09wdGlvbnMob3B0aW9ucyk7XG4gICAgICByZXR1cm4gcnVuQ2FsbFN5bmMoXCJidWlsZFwiLCBbb3B0aW9uc10pO1xuICAgIH0sXG4gICAgdHJhbnNmb3JtU3luYyhpbnB1dCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIHJ1bkNhbGxTeW5jKFwidHJhbnNmb3JtXCIsIFtpbnB1dCwgb3B0aW9uc10pO1xuICAgIH0sXG4gICAgZm9ybWF0TWVzc2FnZXNTeW5jKG1lc3NhZ2VzLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gcnVuQ2FsbFN5bmMoXCJmb3JtYXRNZXNzYWdlc1wiLCBbbWVzc2FnZXMsIG9wdGlvbnNdKTtcbiAgICB9LFxuICAgIGFuYWx5emVNZXRhZmlsZVN5bmMobWV0YWZpbGUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBydW5DYWxsU3luYyhcImFuYWx5emVNZXRhZmlsZVwiLCBbbWV0YWZpbGUsIG9wdGlvbnNdKTtcbiAgICB9LFxuICAgIHN0b3AoKSB7XG4gICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICB3b3JrZXJUaHJlYWRTZXJ2aWNlID0gbnVsbDtcbiAgICB9XG4gIH07XG59O1xudmFyIHN0YXJ0U3luY1NlcnZpY2VXb3JrZXIgPSAoKSA9PiB7XG4gIGxldCB3b3JrZXJQb3J0ID0gd29ya2VyX3RocmVhZHMud29ya2VyRGF0YS53b3JrZXJQb3J0O1xuICBsZXQgcGFyZW50UG9ydCA9IHdvcmtlcl90aHJlYWRzLnBhcmVudFBvcnQ7XG4gIGxldCBleHRyYWN0UHJvcGVydGllcyA9IChvYmplY3QpID0+IHtcbiAgICBsZXQgcHJvcGVydGllcyA9IHt9O1xuICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZm9yIChsZXQga2V5IGluIG9iamVjdCkge1xuICAgICAgICBwcm9wZXJ0aWVzW2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gIH07XG4gIHRyeSB7XG4gICAgbGV0IHNlcnZpY2UgPSBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCk7XG4gICAgZGVmYXVsdFdEID0gd29ya2VyX3RocmVhZHMud29ya2VyRGF0YS5kZWZhdWx0V0Q7XG4gICAgcGFyZW50UG9ydC5vbihcIm1lc3NhZ2VcIiwgKG1zZykgPT4ge1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IHsgc2hhcmVkQnVmZmVyLCBpZCwgY29tbWFuZCwgYXJncyB9ID0gbXNnO1xuICAgICAgICBsZXQgc2hhcmVkQnVmZmVyVmlldyA9IG5ldyBJbnQzMkFycmF5KHNoYXJlZEJ1ZmZlcik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiYnVpbGRcIjpcbiAgICAgICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZXNvbHZlOiBhd2FpdCBzZXJ2aWNlLmJ1aWxkKGFyZ3NbMF0pIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ0cmFuc2Zvcm1cIjpcbiAgICAgICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZXNvbHZlOiBhd2FpdCBzZXJ2aWNlLnRyYW5zZm9ybShhcmdzWzBdLCBhcmdzWzFdKSB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZm9ybWF0TWVzc2FnZXNcIjpcbiAgICAgICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZXNvbHZlOiBhd2FpdCBzZXJ2aWNlLmZvcm1hdE1lc3NhZ2VzKGFyZ3NbMF0sIGFyZ3NbMV0pIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJhbmFseXplTWV0YWZpbGVcIjpcbiAgICAgICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZXNvbHZlOiBhd2FpdCBzZXJ2aWNlLmFuYWx5emVNZXRhZmlsZShhcmdzWzBdLCBhcmdzWzFdKSB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29tbWFuZDogJHtjb21tYW5kfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAocmVqZWN0KSB7XG4gICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZWplY3QsIHByb3BlcnRpZXM6IGV4dHJhY3RQcm9wZXJ0aWVzKHJlamVjdCkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgQXRvbWljcy5hZGQoc2hhcmVkQnVmZmVyVmlldywgMCwgMSk7XG4gICAgICAgIEF0b21pY3Mubm90aWZ5KHNoYXJlZEJ1ZmZlclZpZXcsIDAsIEluZmluaXR5KTtcbiAgICAgIH0pKCk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKHJlamVjdCkge1xuICAgIHBhcmVudFBvcnQub24oXCJtZXNzYWdlXCIsIChtc2cpID0+IHtcbiAgICAgIGxldCB7IHNoYXJlZEJ1ZmZlciwgaWQgfSA9IG1zZztcbiAgICAgIGxldCBzaGFyZWRCdWZmZXJWaWV3ID0gbmV3IEludDMyQXJyYXkoc2hhcmVkQnVmZmVyKTtcbiAgICAgIHdvcmtlclBvcnQucG9zdE1lc3NhZ2UoeyBpZCwgcmVqZWN0LCBwcm9wZXJ0aWVzOiBleHRyYWN0UHJvcGVydGllcyhyZWplY3QpIH0pO1xuICAgICAgQXRvbWljcy5hZGQoc2hhcmVkQnVmZmVyVmlldywgMCwgMSk7XG4gICAgICBBdG9taWNzLm5vdGlmeShzaGFyZWRCdWZmZXJWaWV3LCAwLCBJbmZpbml0eSk7XG4gICAgfSk7XG4gIH1cbn07XG5pZiAoaXNJbnRlcm5hbFdvcmtlclRocmVhZCkge1xuICBzdGFydFN5bmNTZXJ2aWNlV29ya2VyKCk7XG59XG52YXIgbm9kZV9kZWZhdWx0ID0gbm9kZV9leHBvcnRzO1xuLy8gQW5ub3RhdGUgdGhlIENvbW1vbkpTIGV4cG9ydCBuYW1lcyBmb3IgRVNNIGltcG9ydCBpbiBub2RlOlxuMCAmJiAobW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFuYWx5emVNZXRhZmlsZSxcbiAgYW5hbHl6ZU1ldGFmaWxlU3luYyxcbiAgYnVpbGQsXG4gIGJ1aWxkU3luYyxcbiAgY29udGV4dCxcbiAgZm9ybWF0TWVzc2FnZXMsXG4gIGZvcm1hdE1lc3NhZ2VzU3luYyxcbiAgaW5pdGlhbGl6ZSxcbiAgc3RvcCxcbiAgdHJhbnNmb3JtLFxuICB0cmFuc2Zvcm1TeW5jLFxuICB2ZXJzaW9uXG59KTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7OztFQUVBLElBQUksWUFBWSxPQUFPO0FBQUEsRUFDdkIsSUFBSSxtQkFBbUIsT0FBTztBQUFBLEVBQzlCLElBQUksb0JBQW9CLE9BQU87QUFBQSxFQUUvQixJQUFJLGVBQWUsT0FBTyxVQUFVO0FBQUEsRUFDcEMsSUFBSSxXQUFXLENBQUMsUUFBUSxRQUFRO0FBQUEsSUFDOUIsU0FBUyxRQUFRO0FBQUEsTUFDZixVQUFVLFFBQVEsTUFBTSxFQUFFLEtBQUssSUFBSSxPQUFPLFlBQVksS0FBSyxDQUFDO0FBQUE7QUFBQSxFQUVoRSxJQUFJLGNBQWMsQ0FBQyxJQUFJLE1BQU0sUUFBUSxTQUFTO0FBQUEsSUFDNUMsSUFBSSxRQUFRLE9BQU8sU0FBUyxZQUFZLE9BQU8sU0FBUyxZQUFZO0FBQUEsTUFDbEUsU0FBUyxPQUFPLGtCQUFrQixJQUFJO0FBQUEsUUFDcEMsSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEdBQUcsS0FBSyxRQUFRO0FBQUEsVUFDekMsVUFBVSxJQUFJLEtBQUssRUFBRSxLQUFLLE1BQU0sS0FBSyxNQUFNLFlBQVksRUFBRSxPQUFP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QVEsWUFBWSxrQkFBa0IsTUFBTSxFQUFFLENBQUM7QUFBQTtBQUFBLFVBRTlFLFFBQVEsSUFBSSxrQkFBa0IsR0FBRyxDQUFDO0FBQUEsVUFDbEMsUUFBUSxPQUFPLGtCQUFrQixHQUFHLFFBQVE7QUFBQSxXQUMzQztBQUFBLE9BQ0o7QUFBQSxNQUNELE9BQU8sUUFBUTtBQUFBLE1BQ2YsV0FBVyxHQUFHLFdBQVcsQ0FBQyxRQUFRO0FBQUEsUUFDaEMsTUFBTSxjQUFjLE9BQU87QUFBQSxRQUMzQixJQUFJLG1CQUFtQixJQUFJLFdBQVcsWUFBWTtBQUFBLFFBQ2xELFdBQVcsWUFBWSxFQUFFLElBQUksUUFBUSxZQUFZLGtCQUFrQixNQUFNLEVBQUUsQ0FBQztBQUFBLFFBQzVFLFFBQVEsSUFBSSxrQkFBa0IsR0FBRyxDQUFDO0FBQUEsUUFDbEMsUUFBUSxPQUFPLGtCQUFrQixHQUFHLFFBQVE7QUFBQSxPQUM3QztBQUFBO0FBQUE7QUFBQSxFQUdMLElBQUksd0JBQXdCO0FBQUEsSUFDMUIsdUJBQXVCO0FBQUEsRUFDekI7QUFBQSxFQUNBLElBQUksZUFBZTtBQUFBOyIsCiAgImRlYnVnSWQiOiAiRjAyNkQzMkU4ODBERkFEMjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|