stoop 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,1433 +1,39 @@
1
- var __create = Object.create;
2
- var __getProtoOf = Object.getPrototypeOf;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __toESM = (mod, isNodeMode, target) => {
7
- target = mod != null ? __create(__getProtoOf(mod)) : {};
8
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
9
- for (let key of __getOwnPropNames(mod))
10
- if (!__hasOwnProp.call(to, key))
11
- __defProp(to, key, {
12
- get: () => mod[key],
13
- enumerable: true
14
- });
15
- return to;
16
- };
17
- var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
18
-
19
- // node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react.development.js
20
- var require_react_development = __commonJS((exports, module) => {
21
- (function() {
22
- function defineDeprecationWarning(methodName, info) {
23
- Object.defineProperty(Component.prototype, methodName, {
24
- get: function() {
25
- console.warn("%s(...) is deprecated in plain JavaScript React classes. %s", info[0], info[1]);
26
- }
27
- });
28
- }
29
- function getIteratorFn(maybeIterable) {
30
- if (maybeIterable === null || typeof maybeIterable !== "object")
31
- return null;
32
- maybeIterable = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable["@@iterator"];
33
- return typeof maybeIterable === "function" ? maybeIterable : null;
34
- }
35
- function warnNoop(publicInstance, callerName) {
36
- publicInstance = (publicInstance = publicInstance.constructor) && (publicInstance.displayName || publicInstance.name) || "ReactClass";
37
- var warningKey = publicInstance + "." + callerName;
38
- didWarnStateUpdateForUnmountedComponent[warningKey] || (console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.", callerName, publicInstance), didWarnStateUpdateForUnmountedComponent[warningKey] = true);
39
- }
40
- function Component(props, context, updater) {
41
- this.props = props;
42
- this.context = context;
43
- this.refs = emptyObject;
44
- this.updater = updater || ReactNoopUpdateQueue;
45
- }
46
- function ComponentDummy() {
47
- }
48
- function PureComponent(props, context, updater) {
49
- this.props = props;
50
- this.context = context;
51
- this.refs = emptyObject;
52
- this.updater = updater || ReactNoopUpdateQueue;
53
- }
54
- function testStringCoercion(value) {
55
- return "" + value;
56
- }
57
- function checkKeyStringCoercion(value) {
58
- try {
59
- testStringCoercion(value);
60
- var JSCompiler_inline_result = false;
61
- } catch (e) {
62
- JSCompiler_inline_result = true;
63
- }
64
- if (JSCompiler_inline_result) {
65
- JSCompiler_inline_result = console;
66
- var JSCompiler_temp_const = JSCompiler_inline_result.error;
67
- var JSCompiler_inline_result$jscomp$0 = typeof Symbol === "function" && Symbol.toStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object";
68
- JSCompiler_temp_const.call(JSCompiler_inline_result, "The provided key is an unsupported type %s. This value must be coerced to a string before using it here.", JSCompiler_inline_result$jscomp$0);
69
- return testStringCoercion(value);
70
- }
71
- }
72
- function getComponentNameFromType(type) {
73
- if (type == null)
74
- return null;
75
- if (typeof type === "function")
76
- return type.$$typeof === REACT_CLIENT_REFERENCE$2 ? null : type.displayName || type.name || null;
77
- if (typeof type === "string")
78
- return type;
79
- switch (type) {
80
- case REACT_FRAGMENT_TYPE:
81
- return "Fragment";
82
- case REACT_PORTAL_TYPE:
83
- return "Portal";
84
- case REACT_PROFILER_TYPE:
85
- return "Profiler";
86
- case REACT_STRICT_MODE_TYPE:
87
- return "StrictMode";
88
- case REACT_SUSPENSE_TYPE:
89
- return "Suspense";
90
- case REACT_SUSPENSE_LIST_TYPE:
91
- return "SuspenseList";
92
- }
93
- if (typeof type === "object")
94
- switch (typeof type.tag === "number" && console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."), type.$$typeof) {
95
- case REACT_CONTEXT_TYPE:
96
- return (type.displayName || "Context") + ".Provider";
97
- case REACT_CONSUMER_TYPE:
98
- return (type._context.displayName || "Context") + ".Consumer";
99
- case REACT_FORWARD_REF_TYPE:
100
- var innerType = type.render;
101
- type = type.displayName;
102
- type || (type = innerType.displayName || innerType.name || "", type = type !== "" ? "ForwardRef(" + type + ")" : "ForwardRef");
103
- return type;
104
- case REACT_MEMO_TYPE:
105
- return innerType = type.displayName || null, innerType !== null ? innerType : getComponentNameFromType(type.type) || "Memo";
106
- case REACT_LAZY_TYPE:
107
- innerType = type._payload;
108
- type = type._init;
109
- try {
110
- return getComponentNameFromType(type(innerType));
111
- } catch (x) {
112
- }
113
- }
114
- return null;
115
- }
116
- function isValidElementType(type) {
117
- return typeof type === "string" || typeof type === "function" || type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_OFFSCREEN_TYPE || typeof type === "object" && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_CONSUMER_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_CLIENT_REFERENCE$1 || type.getModuleId !== undefined) ? true : false;
118
- }
119
- function disabledLog() {
120
- }
121
- function disableLogs() {
122
- if (disabledDepth === 0) {
123
- prevLog = console.log;
124
- prevInfo = console.info;
125
- prevWarn = console.warn;
126
- prevError = console.error;
127
- prevGroup = console.group;
128
- prevGroupCollapsed = console.groupCollapsed;
129
- prevGroupEnd = console.groupEnd;
130
- var props = {
131
- configurable: true,
132
- enumerable: true,
133
- value: disabledLog,
134
- writable: true
135
- };
136
- Object.defineProperties(console, {
137
- info: props,
138
- log: props,
139
- warn: props,
140
- error: props,
141
- group: props,
142
- groupCollapsed: props,
143
- groupEnd: props
144
- });
145
- }
146
- disabledDepth++;
147
- }
148
- function reenableLogs() {
149
- disabledDepth--;
150
- if (disabledDepth === 0) {
151
- var props = { configurable: true, enumerable: true, writable: true };
152
- Object.defineProperties(console, {
153
- log: assign({}, props, { value: prevLog }),
154
- info: assign({}, props, { value: prevInfo }),
155
- warn: assign({}, props, { value: prevWarn }),
156
- error: assign({}, props, { value: prevError }),
157
- group: assign({}, props, { value: prevGroup }),
158
- groupCollapsed: assign({}, props, { value: prevGroupCollapsed }),
159
- groupEnd: assign({}, props, { value: prevGroupEnd })
160
- });
161
- }
162
- 0 > disabledDepth && console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.");
163
- }
164
- function describeBuiltInComponentFrame(name) {
165
- if (prefix === undefined)
166
- try {
167
- throw Error();
168
- } catch (x) {
169
- var match = x.stack.trim().match(/\n( *(at )?)/);
170
- prefix = match && match[1] || "";
171
- suffix = -1 < x.stack.indexOf("\n at") ? " (<anonymous>)" : -1 < x.stack.indexOf("@") ? "@unknown:0:0" : "";
172
- }
173
- return "\n" + prefix + name + suffix;
174
- }
175
- function describeNativeComponentFrame(fn, construct) {
176
- if (!fn || reentry)
177
- return "";
178
- var frame = componentFrameCache.get(fn);
179
- if (frame !== undefined)
180
- return frame;
181
- reentry = true;
182
- frame = Error.prepareStackTrace;
183
- Error.prepareStackTrace = undefined;
184
- var previousDispatcher = null;
185
- previousDispatcher = ReactSharedInternals.H;
186
- ReactSharedInternals.H = null;
187
- disableLogs();
188
- try {
189
- var RunInRootFrame = {
190
- DetermineComponentFrameRoot: function() {
191
- try {
192
- if (construct) {
193
- var Fake = function() {
194
- throw Error();
195
- };
196
- Object.defineProperty(Fake.prototype, "props", {
197
- set: function() {
198
- throw Error();
199
- }
200
- });
201
- if (typeof Reflect === "object" && Reflect.construct) {
202
- try {
203
- Reflect.construct(Fake, []);
204
- } catch (x) {
205
- var control = x;
206
- }
207
- Reflect.construct(fn, [], Fake);
208
- } else {
209
- try {
210
- Fake.call();
211
- } catch (x$0) {
212
- control = x$0;
213
- }
214
- fn.call(Fake.prototype);
215
- }
216
- } else {
217
- try {
218
- throw Error();
219
- } catch (x$1) {
220
- control = x$1;
221
- }
222
- (Fake = fn()) && typeof Fake.catch === "function" && Fake.catch(function() {
223
- });
224
- }
225
- } catch (sample) {
226
- if (sample && control && typeof sample.stack === "string")
227
- return [sample.stack, control.stack];
228
- }
229
- return [null, null];
230
- }
231
- };
232
- RunInRootFrame.DetermineComponentFrameRoot.displayName = "DetermineComponentFrameRoot";
233
- var namePropDescriptor = Object.getOwnPropertyDescriptor(RunInRootFrame.DetermineComponentFrameRoot, "name");
234
- namePropDescriptor && namePropDescriptor.configurable && Object.defineProperty(RunInRootFrame.DetermineComponentFrameRoot, "name", { value: "DetermineComponentFrameRoot" });
235
- var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(), sampleStack = _RunInRootFrame$Deter[0], controlStack = _RunInRootFrame$Deter[1];
236
- if (sampleStack && controlStack) {
237
- var sampleLines = sampleStack.split("\n"), controlLines = controlStack.split("\n");
238
- for (_RunInRootFrame$Deter = namePropDescriptor = 0;namePropDescriptor < sampleLines.length && !sampleLines[namePropDescriptor].includes("DetermineComponentFrameRoot"); )
239
- namePropDescriptor++;
240
- for (;_RunInRootFrame$Deter < controlLines.length && !controlLines[_RunInRootFrame$Deter].includes("DetermineComponentFrameRoot"); )
241
- _RunInRootFrame$Deter++;
242
- if (namePropDescriptor === sampleLines.length || _RunInRootFrame$Deter === controlLines.length)
243
- for (namePropDescriptor = sampleLines.length - 1, _RunInRootFrame$Deter = controlLines.length - 1;1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter && sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]; )
244
- _RunInRootFrame$Deter--;
245
- for (;1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter; namePropDescriptor--, _RunInRootFrame$Deter--)
246
- if (sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]) {
247
- if (namePropDescriptor !== 1 || _RunInRootFrame$Deter !== 1) {
248
- do
249
- if (namePropDescriptor--, _RunInRootFrame$Deter--, 0 > _RunInRootFrame$Deter || sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]) {
250
- var _frame = "\n" + sampleLines[namePropDescriptor].replace(" at new ", " at ");
251
- fn.displayName && _frame.includes("<anonymous>") && (_frame = _frame.replace("<anonymous>", fn.displayName));
252
- typeof fn === "function" && componentFrameCache.set(fn, _frame);
253
- return _frame;
254
- }
255
- while (1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter);
256
- }
257
- break;
258
- }
259
- }
260
- } finally {
261
- reentry = false, ReactSharedInternals.H = previousDispatcher, reenableLogs(), Error.prepareStackTrace = frame;
262
- }
263
- sampleLines = (sampleLines = fn ? fn.displayName || fn.name : "") ? describeBuiltInComponentFrame(sampleLines) : "";
264
- typeof fn === "function" && componentFrameCache.set(fn, sampleLines);
265
- return sampleLines;
266
- }
267
- function describeUnknownElementTypeFrameInDEV(type) {
268
- if (type == null)
269
- return "";
270
- if (typeof type === "function") {
271
- var prototype = type.prototype;
272
- return describeNativeComponentFrame(type, !(!prototype || !prototype.isReactComponent));
273
- }
274
- if (typeof type === "string")
275
- return describeBuiltInComponentFrame(type);
276
- switch (type) {
277
- case REACT_SUSPENSE_TYPE:
278
- return describeBuiltInComponentFrame("Suspense");
279
- case REACT_SUSPENSE_LIST_TYPE:
280
- return describeBuiltInComponentFrame("SuspenseList");
281
- }
282
- if (typeof type === "object")
283
- switch (type.$$typeof) {
284
- case REACT_FORWARD_REF_TYPE:
285
- return type = describeNativeComponentFrame(type.render, false), type;
286
- case REACT_MEMO_TYPE:
287
- return describeUnknownElementTypeFrameInDEV(type.type);
288
- case REACT_LAZY_TYPE:
289
- prototype = type._payload;
290
- type = type._init;
291
- try {
292
- return describeUnknownElementTypeFrameInDEV(type(prototype));
293
- } catch (x) {
294
- }
295
- }
296
- return "";
297
- }
298
- function getOwner() {
299
- var dispatcher = ReactSharedInternals.A;
300
- return dispatcher === null ? null : dispatcher.getOwner();
301
- }
302
- function hasValidKey(config) {
303
- if (hasOwnProperty.call(config, "key")) {
304
- var getter = Object.getOwnPropertyDescriptor(config, "key").get;
305
- if (getter && getter.isReactWarning)
306
- return false;
307
- }
308
- return config.key !== undefined;
309
- }
310
- function defineKeyPropWarningGetter(props, displayName) {
311
- function warnAboutAccessingKey() {
312
- specialPropKeyWarningShown || (specialPropKeyWarningShown = true, console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)", displayName));
313
- }
314
- warnAboutAccessingKey.isReactWarning = true;
315
- Object.defineProperty(props, "key", {
316
- get: warnAboutAccessingKey,
317
- configurable: true
318
- });
319
- }
320
- function elementRefGetterWithDeprecationWarning() {
321
- var componentName = getComponentNameFromType(this.type);
322
- didWarnAboutElementRef[componentName] || (didWarnAboutElementRef[componentName] = true, console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release."));
323
- componentName = this.props.ref;
324
- return componentName !== undefined ? componentName : null;
325
- }
326
- function ReactElement(type, key, self, source, owner, props) {
327
- self = props.ref;
328
- type = {
329
- $$typeof: REACT_ELEMENT_TYPE,
330
- type,
331
- key,
332
- props,
333
- _owner: owner
334
- };
335
- (self !== undefined ? self : null) !== null ? Object.defineProperty(type, "ref", {
336
- enumerable: false,
337
- get: elementRefGetterWithDeprecationWarning
338
- }) : Object.defineProperty(type, "ref", { enumerable: false, value: null });
339
- type._store = {};
340
- Object.defineProperty(type._store, "validated", {
341
- configurable: false,
342
- enumerable: false,
343
- writable: true,
344
- value: 0
345
- });
346
- Object.defineProperty(type, "_debugInfo", {
347
- configurable: false,
348
- enumerable: false,
349
- writable: true,
350
- value: null
351
- });
352
- Object.freeze && (Object.freeze(type.props), Object.freeze(type));
353
- return type;
354
- }
355
- function cloneAndReplaceKey(oldElement, newKey) {
356
- newKey = ReactElement(oldElement.type, newKey, undefined, undefined, oldElement._owner, oldElement.props);
357
- newKey._store.validated = oldElement._store.validated;
358
- return newKey;
359
- }
360
- function validateChildKeys(node, parentType) {
361
- if (typeof node === "object" && node && node.$$typeof !== REACT_CLIENT_REFERENCE) {
362
- if (isArrayImpl(node))
363
- for (var i = 0;i < node.length; i++) {
364
- var child = node[i];
365
- isValidElement(child) && validateExplicitKey(child, parentType);
366
- }
367
- else if (isValidElement(node))
368
- node._store && (node._store.validated = 1);
369
- else if (i = getIteratorFn(node), typeof i === "function" && i !== node.entries && (i = i.call(node), i !== node))
370
- for (;!(node = i.next()).done; )
371
- isValidElement(node.value) && validateExplicitKey(node.value, parentType);
372
- }
373
- }
374
- function isValidElement(object) {
375
- return typeof object === "object" && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
376
- }
377
- function validateExplicitKey(element, parentType) {
378
- if (element._store && !element._store.validated && element.key == null && (element._store.validated = 1, parentType = getCurrentComponentErrorInfo(parentType), !ownerHasKeyUseWarning[parentType])) {
379
- ownerHasKeyUseWarning[parentType] = true;
380
- var childOwner = "";
381
- element && element._owner != null && element._owner !== getOwner() && (childOwner = null, typeof element._owner.tag === "number" ? childOwner = getComponentNameFromType(element._owner.type) : typeof element._owner.name === "string" && (childOwner = element._owner.name), childOwner = " It was passed a child from " + childOwner + ".");
382
- var prevGetCurrentStack = ReactSharedInternals.getCurrentStack;
383
- ReactSharedInternals.getCurrentStack = function() {
384
- var stack = describeUnknownElementTypeFrameInDEV(element.type);
385
- prevGetCurrentStack && (stack += prevGetCurrentStack() || "");
386
- return stack;
387
- };
388
- console.error('Each child in a list should have a unique "key" prop.%s%s See https://react.dev/link/warning-keys for more information.', parentType, childOwner);
389
- ReactSharedInternals.getCurrentStack = prevGetCurrentStack;
390
- }
391
- }
392
- function getCurrentComponentErrorInfo(parentType) {
393
- var info = "", owner = getOwner();
394
- owner && (owner = getComponentNameFromType(owner.type)) && (info = "\n\nCheck the render method of `" + owner + "`.");
395
- info || (parentType = getComponentNameFromType(parentType)) && (info = "\n\nCheck the top-level render call using <" + parentType + ">.");
396
- return info;
397
- }
398
- function escape(key) {
399
- var escaperLookup = { "=": "=0", ":": "=2" };
400
- return "$" + key.replace(/[=:]/g, function(match) {
401
- return escaperLookup[match];
402
- });
403
- }
404
- function getElementKey(element, index) {
405
- return typeof element === "object" && element !== null && element.key != null ? (checkKeyStringCoercion(element.key), escape("" + element.key)) : index.toString(36);
406
- }
407
- function noop$1() {
408
- }
409
- function resolveThenable(thenable) {
410
- switch (thenable.status) {
411
- case "fulfilled":
412
- return thenable.value;
413
- case "rejected":
414
- throw thenable.reason;
415
- default:
416
- switch (typeof thenable.status === "string" ? thenable.then(noop$1, noop$1) : (thenable.status = "pending", thenable.then(function(fulfilledValue) {
417
- thenable.status === "pending" && (thenable.status = "fulfilled", thenable.value = fulfilledValue);
418
- }, function(error) {
419
- thenable.status === "pending" && (thenable.status = "rejected", thenable.reason = error);
420
- })), thenable.status) {
421
- case "fulfilled":
422
- return thenable.value;
423
- case "rejected":
424
- throw thenable.reason;
425
- }
426
- }
427
- throw thenable;
428
- }
429
- function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {
430
- var type = typeof children;
431
- if (type === "undefined" || type === "boolean")
432
- children = null;
433
- var invokeCallback = false;
434
- if (children === null)
435
- invokeCallback = true;
436
- else
437
- switch (type) {
438
- case "bigint":
439
- case "string":
440
- case "number":
441
- invokeCallback = true;
442
- break;
443
- case "object":
444
- switch (children.$$typeof) {
445
- case REACT_ELEMENT_TYPE:
446
- case REACT_PORTAL_TYPE:
447
- invokeCallback = true;
448
- break;
449
- case REACT_LAZY_TYPE:
450
- return invokeCallback = children._init, mapIntoArray(invokeCallback(children._payload), array, escapedPrefix, nameSoFar, callback);
451
- }
452
- }
453
- if (invokeCallback) {
454
- invokeCallback = children;
455
- callback = callback(invokeCallback);
456
- var childKey = nameSoFar === "" ? "." + getElementKey(invokeCallback, 0) : nameSoFar;
457
- isArrayImpl(callback) ? (escapedPrefix = "", childKey != null && (escapedPrefix = childKey.replace(userProvidedKeyEscapeRegex, "$&/") + "/"), mapIntoArray(callback, array, escapedPrefix, "", function(c) {
458
- return c;
459
- })) : callback != null && (isValidElement(callback) && (callback.key != null && (invokeCallback && invokeCallback.key === callback.key || checkKeyStringCoercion(callback.key)), escapedPrefix = cloneAndReplaceKey(callback, escapedPrefix + (callback.key == null || invokeCallback && invokeCallback.key === callback.key ? "" : ("" + callback.key).replace(userProvidedKeyEscapeRegex, "$&/") + "/") + childKey), nameSoFar !== "" && invokeCallback != null && isValidElement(invokeCallback) && invokeCallback.key == null && invokeCallback._store && !invokeCallback._store.validated && (escapedPrefix._store.validated = 2), callback = escapedPrefix), array.push(callback));
460
- return 1;
461
- }
462
- invokeCallback = 0;
463
- childKey = nameSoFar === "" ? "." : nameSoFar + ":";
464
- if (isArrayImpl(children))
465
- for (var i = 0;i < children.length; i++)
466
- nameSoFar = children[i], type = childKey + getElementKey(nameSoFar, i), invokeCallback += mapIntoArray(nameSoFar, array, escapedPrefix, type, callback);
467
- else if (i = getIteratorFn(children), typeof i === "function")
468
- for (i === children.entries && (didWarnAboutMaps || console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."), didWarnAboutMaps = true), children = i.call(children), i = 0;!(nameSoFar = children.next()).done; )
469
- nameSoFar = nameSoFar.value, type = childKey + getElementKey(nameSoFar, i++), invokeCallback += mapIntoArray(nameSoFar, array, escapedPrefix, type, callback);
470
- else if (type === "object") {
471
- if (typeof children.then === "function")
472
- return mapIntoArray(resolveThenable(children), array, escapedPrefix, nameSoFar, callback);
473
- array = String(children);
474
- throw Error("Objects are not valid as a React child (found: " + (array === "[object Object]" ? "object with keys {" + Object.keys(children).join(", ") + "}" : array) + "). If you meant to render a collection of children, use an array instead.");
475
- }
476
- return invokeCallback;
477
- }
478
- function mapChildren(children, func, context) {
479
- if (children == null)
480
- return children;
481
- var result = [], count = 0;
482
- mapIntoArray(children, result, "", "", function(child) {
483
- return func.call(context, child, count++);
484
- });
485
- return result;
486
- }
487
- function lazyInitializer(payload) {
488
- if (payload._status === -1) {
489
- var ctor = payload._result;
490
- ctor = ctor();
491
- ctor.then(function(moduleObject) {
492
- if (payload._status === 0 || payload._status === -1)
493
- payload._status = 1, payload._result = moduleObject;
494
- }, function(error) {
495
- if (payload._status === 0 || payload._status === -1)
496
- payload._status = 2, payload._result = error;
497
- });
498
- payload._status === -1 && (payload._status = 0, payload._result = ctor);
499
- }
500
- if (payload._status === 1)
501
- return ctor = payload._result, ctor === undefined && console.error("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))\n\nDid you accidentally put curly braces around the import?", ctor), "default" in ctor || console.error("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))", ctor), ctor.default;
502
- throw payload._result;
503
- }
504
- function resolveDispatcher() {
505
- var dispatcher = ReactSharedInternals.H;
506
- dispatcher === null && console.error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.");
507
- return dispatcher;
508
- }
509
- function noop() {
510
- }
511
- function enqueueTask(task) {
512
- if (enqueueTaskImpl === null)
513
- try {
514
- var requireString = ("require" + Math.random()).slice(0, 7);
515
- enqueueTaskImpl = (module && module[requireString]).call(module, "timers").setImmediate;
516
- } catch (_err) {
517
- enqueueTaskImpl = function(callback) {
518
- didWarnAboutMessageChannel === false && (didWarnAboutMessageChannel = true, typeof MessageChannel === "undefined" && console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));
519
- var channel = new MessageChannel;
520
- channel.port1.onmessage = callback;
521
- channel.port2.postMessage(undefined);
522
- };
523
- }
524
- return enqueueTaskImpl(task);
525
- }
526
- function aggregateErrors(errors) {
527
- return 1 < errors.length && typeof AggregateError === "function" ? new AggregateError(errors) : errors[0];
528
- }
529
- function popActScope(prevActQueue, prevActScopeDepth) {
530
- prevActScopeDepth !== actScopeDepth - 1 && console.error("You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. ");
531
- actScopeDepth = prevActScopeDepth;
532
- }
533
- function recursivelyFlushAsyncActWork(returnValue, resolve, reject) {
534
- var queue = ReactSharedInternals.actQueue;
535
- if (queue !== null)
536
- if (queue.length !== 0)
537
- try {
538
- flushActQueue(queue);
539
- enqueueTask(function() {
540
- return recursivelyFlushAsyncActWork(returnValue, resolve, reject);
541
- });
542
- return;
543
- } catch (error) {
544
- ReactSharedInternals.thrownErrors.push(error);
545
- }
546
- else
547
- ReactSharedInternals.actQueue = null;
548
- 0 < ReactSharedInternals.thrownErrors.length ? (queue = aggregateErrors(ReactSharedInternals.thrownErrors), ReactSharedInternals.thrownErrors.length = 0, reject(queue)) : resolve(returnValue);
549
- }
550
- function flushActQueue(queue) {
551
- if (!isFlushing) {
552
- isFlushing = true;
553
- var i = 0;
554
- try {
555
- for (;i < queue.length; i++) {
556
- var callback = queue[i];
557
- do {
558
- ReactSharedInternals.didUsePromise = false;
559
- var continuation = callback(false);
560
- if (continuation !== null) {
561
- if (ReactSharedInternals.didUsePromise) {
562
- queue[i] = callback;
563
- queue.splice(0, i);
564
- return;
565
- }
566
- callback = continuation;
567
- } else
568
- break;
569
- } while (1);
570
- }
571
- queue.length = 0;
572
- } catch (error) {
573
- queue.splice(0, i + 1), ReactSharedInternals.thrownErrors.push(error);
574
- } finally {
575
- isFlushing = false;
576
- }
577
- }
578
- }
579
- typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function" && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
580
- var REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = Symbol.for("react.profiler");
581
- Symbol.for("react.provider");
582
- var REACT_CONSUMER_TYPE = Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"), REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"), REACT_MEMO_TYPE = Symbol.for("react.memo"), REACT_LAZY_TYPE = Symbol.for("react.lazy"), REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"), MAYBE_ITERATOR_SYMBOL = Symbol.iterator, didWarnStateUpdateForUnmountedComponent = {}, ReactNoopUpdateQueue = {
583
- isMounted: function() {
584
- return false;
585
- },
586
- enqueueForceUpdate: function(publicInstance) {
587
- warnNoop(publicInstance, "forceUpdate");
588
- },
589
- enqueueReplaceState: function(publicInstance) {
590
- warnNoop(publicInstance, "replaceState");
591
- },
592
- enqueueSetState: function(publicInstance) {
593
- warnNoop(publicInstance, "setState");
594
- }
595
- }, assign = Object.assign, emptyObject = {};
596
- Object.freeze(emptyObject);
597
- Component.prototype.isReactComponent = {};
598
- Component.prototype.setState = function(partialState, callback) {
599
- if (typeof partialState !== "object" && typeof partialState !== "function" && partialState != null)
600
- throw Error("takes an object of state variables to update or a function which returns an object of state variables.");
601
- this.updater.enqueueSetState(this, partialState, callback, "setState");
602
- };
603
- Component.prototype.forceUpdate = function(callback) {
604
- this.updater.enqueueForceUpdate(this, callback, "forceUpdate");
605
- };
606
- var deprecatedAPIs = {
607
- isMounted: [
608
- "isMounted",
609
- "Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."
610
- ],
611
- replaceState: [
612
- "replaceState",
613
- "Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."
614
- ]
615
- }, fnName;
616
- for (fnName in deprecatedAPIs)
617
- deprecatedAPIs.hasOwnProperty(fnName) && defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);
618
- ComponentDummy.prototype = Component.prototype;
619
- deprecatedAPIs = PureComponent.prototype = new ComponentDummy;
620
- deprecatedAPIs.constructor = PureComponent;
621
- assign(deprecatedAPIs, Component.prototype);
622
- deprecatedAPIs.isPureReactComponent = true;
623
- var isArrayImpl = Array.isArray, REACT_CLIENT_REFERENCE$2 = Symbol.for("react.client.reference"), ReactSharedInternals = {
624
- H: null,
625
- A: null,
626
- T: null,
627
- S: null,
628
- actQueue: null,
629
- isBatchingLegacy: false,
630
- didScheduleLegacyUpdate: false,
631
- didUsePromise: false,
632
- thrownErrors: [],
633
- getCurrentStack: null
634
- }, hasOwnProperty = Object.prototype.hasOwnProperty, REACT_CLIENT_REFERENCE$1 = Symbol.for("react.client.reference"), disabledDepth = 0, prevLog, prevInfo, prevWarn, prevError, prevGroup, prevGroupCollapsed, prevGroupEnd;
635
- disabledLog.__reactDisabledLog = true;
636
- var prefix, suffix, reentry = false;
637
- var componentFrameCache = new (typeof WeakMap === "function" ? WeakMap : Map);
638
- var REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference"), specialPropKeyWarningShown, didWarnAboutOldJSXRuntime;
639
- var didWarnAboutElementRef = {};
640
- var ownerHasKeyUseWarning = {}, didWarnAboutMaps = false, userProvidedKeyEscapeRegex = /\/+/g, reportGlobalError = typeof reportError === "function" ? reportError : function(error) {
641
- if (typeof window === "object" && typeof window.ErrorEvent === "function") {
642
- var event = new window.ErrorEvent("error", {
643
- bubbles: true,
644
- cancelable: true,
645
- message: typeof error === "object" && error !== null && typeof error.message === "string" ? String(error.message) : String(error),
646
- error
647
- });
648
- if (!window.dispatchEvent(event))
649
- return;
650
- } else if (typeof process === "object" && typeof process.emit === "function") {
651
- process.emit("uncaughtException", error);
652
- return;
653
- }
654
- console.error(error);
655
- }, didWarnAboutMessageChannel = false, enqueueTaskImpl = null, actScopeDepth = 0, didWarnNoAwaitAct = false, isFlushing = false, queueSeveralMicrotasks = typeof queueMicrotask === "function" ? function(callback) {
656
- queueMicrotask(function() {
657
- return queueMicrotask(callback);
658
- });
659
- } : enqueueTask;
660
- exports.Children = {
661
- map: mapChildren,
662
- forEach: function(children, forEachFunc, forEachContext) {
663
- mapChildren(children, function() {
664
- forEachFunc.apply(this, arguments);
665
- }, forEachContext);
666
- },
667
- count: function(children) {
668
- var n = 0;
669
- mapChildren(children, function() {
670
- n++;
671
- });
672
- return n;
673
- },
674
- toArray: function(children) {
675
- return mapChildren(children, function(child) {
676
- return child;
677
- }) || [];
678
- },
679
- only: function(children) {
680
- if (!isValidElement(children))
681
- throw Error("React.Children.only expected to receive a single React element child.");
682
- return children;
683
- }
684
- };
685
- exports.Component = Component;
686
- exports.Fragment = REACT_FRAGMENT_TYPE;
687
- exports.Profiler = REACT_PROFILER_TYPE;
688
- exports.PureComponent = PureComponent;
689
- exports.StrictMode = REACT_STRICT_MODE_TYPE;
690
- exports.Suspense = REACT_SUSPENSE_TYPE;
691
- exports.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE = ReactSharedInternals;
692
- exports.act = function(callback) {
693
- var prevActQueue = ReactSharedInternals.actQueue, prevActScopeDepth = actScopeDepth;
694
- actScopeDepth++;
695
- var queue = ReactSharedInternals.actQueue = prevActQueue !== null ? prevActQueue : [], didAwaitActCall = false;
696
- try {
697
- var result = callback();
698
- } catch (error) {
699
- ReactSharedInternals.thrownErrors.push(error);
700
- }
701
- if (0 < ReactSharedInternals.thrownErrors.length)
702
- throw popActScope(prevActQueue, prevActScopeDepth), callback = aggregateErrors(ReactSharedInternals.thrownErrors), ReactSharedInternals.thrownErrors.length = 0, callback;
703
- if (result !== null && typeof result === "object" && typeof result.then === "function") {
704
- var thenable = result;
705
- queueSeveralMicrotasks(function() {
706
- didAwaitActCall || didWarnNoAwaitAct || (didWarnNoAwaitAct = true, console.error("You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"));
707
- });
708
- return {
709
- then: function(resolve, reject) {
710
- didAwaitActCall = true;
711
- thenable.then(function(returnValue) {
712
- popActScope(prevActQueue, prevActScopeDepth);
713
- if (prevActScopeDepth === 0) {
714
- try {
715
- flushActQueue(queue), enqueueTask(function() {
716
- return recursivelyFlushAsyncActWork(returnValue, resolve, reject);
717
- });
718
- } catch (error$2) {
719
- ReactSharedInternals.thrownErrors.push(error$2);
720
- }
721
- if (0 < ReactSharedInternals.thrownErrors.length) {
722
- var _thrownError = aggregateErrors(ReactSharedInternals.thrownErrors);
723
- ReactSharedInternals.thrownErrors.length = 0;
724
- reject(_thrownError);
725
- }
726
- } else
727
- resolve(returnValue);
728
- }, function(error) {
729
- popActScope(prevActQueue, prevActScopeDepth);
730
- 0 < ReactSharedInternals.thrownErrors.length ? (error = aggregateErrors(ReactSharedInternals.thrownErrors), ReactSharedInternals.thrownErrors.length = 0, reject(error)) : reject(error);
731
- });
732
- }
733
- };
734
- }
735
- var returnValue$jscomp$0 = result;
736
- popActScope(prevActQueue, prevActScopeDepth);
737
- prevActScopeDepth === 0 && (flushActQueue(queue), queue.length !== 0 && queueSeveralMicrotasks(function() {
738
- didAwaitActCall || didWarnNoAwaitAct || (didWarnNoAwaitAct = true, console.error("A component suspended inside an `act` scope, but the `act` call was not awaited. When testing React components that depend on asynchronous data, you must await the result:\n\nawait act(() => ...)"));
739
- }), ReactSharedInternals.actQueue = null);
740
- if (0 < ReactSharedInternals.thrownErrors.length)
741
- throw callback = aggregateErrors(ReactSharedInternals.thrownErrors), ReactSharedInternals.thrownErrors.length = 0, callback;
742
- return {
743
- then: function(resolve, reject) {
744
- didAwaitActCall = true;
745
- prevActScopeDepth === 0 ? (ReactSharedInternals.actQueue = queue, enqueueTask(function() {
746
- return recursivelyFlushAsyncActWork(returnValue$jscomp$0, resolve, reject);
747
- })) : resolve(returnValue$jscomp$0);
748
- }
749
- };
750
- };
751
- exports.cache = function(fn) {
752
- return function() {
753
- return fn.apply(null, arguments);
754
- };
755
- };
756
- exports.cloneElement = function(element, config, children) {
757
- if (element === null || element === undefined)
758
- throw Error("The argument must be a React element, but you passed " + element + ".");
759
- var props = assign({}, element.props), key = element.key, owner = element._owner;
760
- if (config != null) {
761
- var JSCompiler_inline_result;
762
- a: {
763
- if (hasOwnProperty.call(config, "ref") && (JSCompiler_inline_result = Object.getOwnPropertyDescriptor(config, "ref").get) && JSCompiler_inline_result.isReactWarning) {
764
- JSCompiler_inline_result = false;
765
- break a;
766
- }
767
- JSCompiler_inline_result = config.ref !== undefined;
768
- }
769
- JSCompiler_inline_result && (owner = getOwner());
770
- hasValidKey(config) && (checkKeyStringCoercion(config.key), key = "" + config.key);
771
- for (propName in config)
772
- !hasOwnProperty.call(config, propName) || propName === "key" || propName === "__self" || propName === "__source" || propName === "ref" && config.ref === undefined || (props[propName] = config[propName]);
773
- }
774
- var propName = arguments.length - 2;
775
- if (propName === 1)
776
- props.children = children;
777
- else if (1 < propName) {
778
- JSCompiler_inline_result = Array(propName);
779
- for (var i = 0;i < propName; i++)
780
- JSCompiler_inline_result[i] = arguments[i + 2];
781
- props.children = JSCompiler_inline_result;
782
- }
783
- props = ReactElement(element.type, key, undefined, undefined, owner, props);
784
- for (key = 2;key < arguments.length; key++)
785
- validateChildKeys(arguments[key], props.type);
786
- return props;
787
- };
788
- exports.createContext = function(defaultValue) {
789
- defaultValue = {
790
- $$typeof: REACT_CONTEXT_TYPE,
791
- _currentValue: defaultValue,
792
- _currentValue2: defaultValue,
793
- _threadCount: 0,
794
- Provider: null,
795
- Consumer: null
796
- };
797
- defaultValue.Provider = defaultValue;
798
- defaultValue.Consumer = {
799
- $$typeof: REACT_CONSUMER_TYPE,
800
- _context: defaultValue
801
- };
802
- defaultValue._currentRenderer = null;
803
- defaultValue._currentRenderer2 = null;
804
- return defaultValue;
805
- };
806
- exports.createElement = function(type, config, children) {
807
- if (isValidElementType(type))
808
- for (var i = 2;i < arguments.length; i++)
809
- validateChildKeys(arguments[i], type);
810
- else {
811
- i = "";
812
- if (type === undefined || typeof type === "object" && type !== null && Object.keys(type).length === 0)
813
- i += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.";
814
- if (type === null)
815
- var typeString = "null";
816
- else
817
- isArrayImpl(type) ? typeString = "array" : type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE ? (typeString = "<" + (getComponentNameFromType(type.type) || "Unknown") + " />", i = " Did you accidentally export a JSX literal instead of a component?") : typeString = typeof type;
818
- console.error("React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", typeString, i);
819
- }
820
- var propName;
821
- i = {};
822
- typeString = null;
823
- if (config != null)
824
- for (propName in didWarnAboutOldJSXRuntime || !("__self" in config) || "key" in config || (didWarnAboutOldJSXRuntime = true, console.warn("Your app (or one of its dependencies) is using an outdated JSX transform. Update to the modern JSX transform for faster performance: https://react.dev/link/new-jsx-transform")), hasValidKey(config) && (checkKeyStringCoercion(config.key), typeString = "" + config.key), config)
825
- hasOwnProperty.call(config, propName) && propName !== "key" && propName !== "__self" && propName !== "__source" && (i[propName] = config[propName]);
826
- var childrenLength = arguments.length - 2;
827
- if (childrenLength === 1)
828
- i.children = children;
829
- else if (1 < childrenLength) {
830
- for (var childArray = Array(childrenLength), _i = 0;_i < childrenLength; _i++)
831
- childArray[_i] = arguments[_i + 2];
832
- Object.freeze && Object.freeze(childArray);
833
- i.children = childArray;
834
- }
835
- if (type && type.defaultProps)
836
- for (propName in childrenLength = type.defaultProps, childrenLength)
837
- i[propName] === undefined && (i[propName] = childrenLength[propName]);
838
- typeString && defineKeyPropWarningGetter(i, typeof type === "function" ? type.displayName || type.name || "Unknown" : type);
839
- return ReactElement(type, typeString, undefined, undefined, getOwner(), i);
840
- };
841
- exports.createRef = function() {
842
- var refObject = { current: null };
843
- Object.seal(refObject);
844
- return refObject;
845
- };
846
- exports.forwardRef = function(render) {
847
- render != null && render.$$typeof === REACT_MEMO_TYPE ? console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...)).") : typeof render !== "function" ? console.error("forwardRef requires a render function but was given %s.", render === null ? "null" : typeof render) : render.length !== 0 && render.length !== 2 && console.error("forwardRef render functions accept exactly two parameters: props and ref. %s", render.length === 1 ? "Did you forget to use the ref parameter?" : "Any additional parameter will be undefined.");
848
- render != null && render.defaultProps != null && console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");
849
- var elementType = { $$typeof: REACT_FORWARD_REF_TYPE, render }, ownName;
850
- Object.defineProperty(elementType, "displayName", {
851
- enumerable: false,
852
- configurable: true,
853
- get: function() {
854
- return ownName;
855
- },
856
- set: function(name) {
857
- ownName = name;
858
- render.name || render.displayName || (Object.defineProperty(render, "name", { value: name }), render.displayName = name);
859
- }
860
- });
861
- return elementType;
862
- };
863
- exports.isValidElement = isValidElement;
864
- exports.lazy = function(ctor) {
865
- return {
866
- $$typeof: REACT_LAZY_TYPE,
867
- _payload: { _status: -1, _result: ctor },
868
- _init: lazyInitializer
869
- };
870
- };
871
- exports.memo = function(type, compare) {
872
- isValidElementType(type) || console.error("memo: The first argument must be a component. Instead received: %s", type === null ? "null" : typeof type);
873
- compare = {
874
- $$typeof: REACT_MEMO_TYPE,
875
- type,
876
- compare: compare === undefined ? null : compare
877
- };
878
- var ownName;
879
- Object.defineProperty(compare, "displayName", {
880
- enumerable: false,
881
- configurable: true,
882
- get: function() {
883
- return ownName;
884
- },
885
- set: function(name) {
886
- ownName = name;
887
- type.name || type.displayName || (Object.defineProperty(type, "name", { value: name }), type.displayName = name);
888
- }
889
- });
890
- return compare;
891
- };
892
- exports.startTransition = function(scope) {
893
- var prevTransition = ReactSharedInternals.T, currentTransition = {};
894
- ReactSharedInternals.T = currentTransition;
895
- currentTransition._updatedFibers = new Set;
896
- try {
897
- var returnValue = scope(), onStartTransitionFinish = ReactSharedInternals.S;
898
- onStartTransitionFinish !== null && onStartTransitionFinish(currentTransition, returnValue);
899
- typeof returnValue === "object" && returnValue !== null && typeof returnValue.then === "function" && returnValue.then(noop, reportGlobalError);
900
- } catch (error) {
901
- reportGlobalError(error);
902
- } finally {
903
- prevTransition === null && currentTransition._updatedFibers && (scope = currentTransition._updatedFibers.size, currentTransition._updatedFibers.clear(), 10 < scope && console.warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table.")), ReactSharedInternals.T = prevTransition;
904
- }
905
- };
906
- exports.unstable_useCacheRefresh = function() {
907
- return resolveDispatcher().useCacheRefresh();
908
- };
909
- exports.use = function(usable) {
910
- return resolveDispatcher().use(usable);
911
- };
912
- exports.useActionState = function(action, initialState, permalink) {
913
- return resolveDispatcher().useActionState(action, initialState, permalink);
914
- };
915
- exports.useCallback = function(callback, deps) {
916
- return resolveDispatcher().useCallback(callback, deps);
917
- };
918
- exports.useContext = function(Context) {
919
- var dispatcher = resolveDispatcher();
920
- Context.$$typeof === REACT_CONSUMER_TYPE && console.error("Calling useContext(Context.Consumer) is not supported and will cause bugs. Did you mean to call useContext(Context) instead?");
921
- return dispatcher.useContext(Context);
922
- };
923
- exports.useDebugValue = function(value, formatterFn) {
924
- return resolveDispatcher().useDebugValue(value, formatterFn);
925
- };
926
- exports.useDeferredValue = function(value, initialValue) {
927
- return resolveDispatcher().useDeferredValue(value, initialValue);
928
- };
929
- exports.useEffect = function(create, deps) {
930
- return resolveDispatcher().useEffect(create, deps);
931
- };
932
- exports.useId = function() {
933
- return resolveDispatcher().useId();
934
- };
935
- exports.useImperativeHandle = function(ref, create, deps) {
936
- return resolveDispatcher().useImperativeHandle(ref, create, deps);
937
- };
938
- exports.useInsertionEffect = function(create, deps) {
939
- return resolveDispatcher().useInsertionEffect(create, deps);
940
- };
941
- exports.useLayoutEffect = function(create, deps) {
942
- return resolveDispatcher().useLayoutEffect(create, deps);
943
- };
944
- exports.useMemo = function(create, deps) {
945
- return resolveDispatcher().useMemo(create, deps);
946
- };
947
- exports.useOptimistic = function(passthrough, reducer) {
948
- return resolveDispatcher().useOptimistic(passthrough, reducer);
949
- };
950
- exports.useReducer = function(reducer, initialArg, init) {
951
- return resolveDispatcher().useReducer(reducer, initialArg, init);
952
- };
953
- exports.useRef = function(initialValue) {
954
- return resolveDispatcher().useRef(initialValue);
955
- };
956
- exports.useState = function(initialState) {
957
- return resolveDispatcher().useState(initialState);
958
- };
959
- exports.useSyncExternalStore = function(subscribe, getSnapshot, getServerSnapshot) {
960
- return resolveDispatcher().useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
961
- };
962
- exports.useTransition = function() {
963
- return resolveDispatcher().useTransition();
964
- };
965
- exports.version = "19.0.0";
966
- typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === "function" && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
967
- })();
968
- });
969
-
970
- // /Users/dolmios/GitHub/personal/stoop/node_modules/react/index.js
971
- var require_react = __commonJS((exports, module) => {
972
- var react_development = __toESM(require_react_development(), 1);
973
- if (false) {
974
- } else {
975
- module.exports = react_development;
976
- }
977
- });
978
-
979
- // node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-dev-runtime.development.js
980
- var require_react_jsx_dev_runtime_development = __commonJS((exports) => {
981
- var React = __toESM(require_react(), 1);
982
- (function() {
983
- function getComponentNameFromType(type) {
984
- if (type == null)
985
- return null;
986
- if (typeof type === "function")
987
- return type.$$typeof === REACT_CLIENT_REFERENCE$2 ? null : type.displayName || type.name || null;
988
- if (typeof type === "string")
989
- return type;
990
- switch (type) {
991
- case REACT_FRAGMENT_TYPE:
992
- return "Fragment";
993
- case REACT_PORTAL_TYPE:
994
- return "Portal";
995
- case REACT_PROFILER_TYPE:
996
- return "Profiler";
997
- case REACT_STRICT_MODE_TYPE:
998
- return "StrictMode";
999
- case REACT_SUSPENSE_TYPE:
1000
- return "Suspense";
1001
- case REACT_SUSPENSE_LIST_TYPE:
1002
- return "SuspenseList";
1003
- }
1004
- if (typeof type === "object")
1005
- switch (typeof type.tag === "number" && console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."), type.$$typeof) {
1006
- case REACT_CONTEXT_TYPE:
1007
- return (type.displayName || "Context") + ".Provider";
1008
- case REACT_CONSUMER_TYPE:
1009
- return (type._context.displayName || "Context") + ".Consumer";
1010
- case REACT_FORWARD_REF_TYPE:
1011
- var innerType = type.render;
1012
- type = type.displayName;
1013
- type || (type = innerType.displayName || innerType.name || "", type = type !== "" ? "ForwardRef(" + type + ")" : "ForwardRef");
1014
- return type;
1015
- case REACT_MEMO_TYPE:
1016
- return innerType = type.displayName || null, innerType !== null ? innerType : getComponentNameFromType(type.type) || "Memo";
1017
- case REACT_LAZY_TYPE:
1018
- innerType = type._payload;
1019
- type = type._init;
1020
- try {
1021
- return getComponentNameFromType(type(innerType));
1022
- } catch (x) {
1023
- }
1024
- }
1025
- return null;
1026
- }
1027
- function testStringCoercion(value) {
1028
- return "" + value;
1029
- }
1030
- function checkKeyStringCoercion(value) {
1031
- try {
1032
- testStringCoercion(value);
1033
- var JSCompiler_inline_result = false;
1034
- } catch (e) {
1035
- JSCompiler_inline_result = true;
1036
- }
1037
- if (JSCompiler_inline_result) {
1038
- JSCompiler_inline_result = console;
1039
- var JSCompiler_temp_const = JSCompiler_inline_result.error;
1040
- var JSCompiler_inline_result$jscomp$0 = typeof Symbol === "function" && Symbol.toStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object";
1041
- JSCompiler_temp_const.call(JSCompiler_inline_result, "The provided key is an unsupported type %s. This value must be coerced to a string before using it here.", JSCompiler_inline_result$jscomp$0);
1042
- return testStringCoercion(value);
1043
- }
1044
- }
1045
- function disabledLog() {
1046
- }
1047
- function disableLogs() {
1048
- if (disabledDepth === 0) {
1049
- prevLog = console.log;
1050
- prevInfo = console.info;
1051
- prevWarn = console.warn;
1052
- prevError = console.error;
1053
- prevGroup = console.group;
1054
- prevGroupCollapsed = console.groupCollapsed;
1055
- prevGroupEnd = console.groupEnd;
1056
- var props = {
1057
- configurable: true,
1058
- enumerable: true,
1059
- value: disabledLog,
1060
- writable: true
1061
- };
1062
- Object.defineProperties(console, {
1063
- info: props,
1064
- log: props,
1065
- warn: props,
1066
- error: props,
1067
- group: props,
1068
- groupCollapsed: props,
1069
- groupEnd: props
1070
- });
1071
- }
1072
- disabledDepth++;
1073
- }
1074
- function reenableLogs() {
1075
- disabledDepth--;
1076
- if (disabledDepth === 0) {
1077
- var props = { configurable: true, enumerable: true, writable: true };
1078
- Object.defineProperties(console, {
1079
- log: assign({}, props, { value: prevLog }),
1080
- info: assign({}, props, { value: prevInfo }),
1081
- warn: assign({}, props, { value: prevWarn }),
1082
- error: assign({}, props, { value: prevError }),
1083
- group: assign({}, props, { value: prevGroup }),
1084
- groupCollapsed: assign({}, props, { value: prevGroupCollapsed }),
1085
- groupEnd: assign({}, props, { value: prevGroupEnd })
1086
- });
1087
- }
1088
- 0 > disabledDepth && console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.");
1089
- }
1090
- function describeBuiltInComponentFrame(name) {
1091
- if (prefix === undefined)
1092
- try {
1093
- throw Error();
1094
- } catch (x) {
1095
- var match = x.stack.trim().match(/\n( *(at )?)/);
1096
- prefix = match && match[1] || "";
1097
- suffix = -1 < x.stack.indexOf("\n at") ? " (<anonymous>)" : -1 < x.stack.indexOf("@") ? "@unknown:0:0" : "";
1098
- }
1099
- return "\n" + prefix + name + suffix;
1100
- }
1101
- function describeNativeComponentFrame(fn, construct) {
1102
- if (!fn || reentry)
1103
- return "";
1104
- var frame = componentFrameCache.get(fn);
1105
- if (frame !== undefined)
1106
- return frame;
1107
- reentry = true;
1108
- frame = Error.prepareStackTrace;
1109
- Error.prepareStackTrace = undefined;
1110
- var previousDispatcher = null;
1111
- previousDispatcher = ReactSharedInternals.H;
1112
- ReactSharedInternals.H = null;
1113
- disableLogs();
1114
- try {
1115
- var RunInRootFrame = {
1116
- DetermineComponentFrameRoot: function() {
1117
- try {
1118
- if (construct) {
1119
- var Fake = function() {
1120
- throw Error();
1121
- };
1122
- Object.defineProperty(Fake.prototype, "props", {
1123
- set: function() {
1124
- throw Error();
1125
- }
1126
- });
1127
- if (typeof Reflect === "object" && Reflect.construct) {
1128
- try {
1129
- Reflect.construct(Fake, []);
1130
- } catch (x) {
1131
- var control = x;
1132
- }
1133
- Reflect.construct(fn, [], Fake);
1134
- } else {
1135
- try {
1136
- Fake.call();
1137
- } catch (x$0) {
1138
- control = x$0;
1139
- }
1140
- fn.call(Fake.prototype);
1141
- }
1142
- } else {
1143
- try {
1144
- throw Error();
1145
- } catch (x$1) {
1146
- control = x$1;
1147
- }
1148
- (Fake = fn()) && typeof Fake.catch === "function" && Fake.catch(function() {
1149
- });
1150
- }
1151
- } catch (sample) {
1152
- if (sample && control && typeof sample.stack === "string")
1153
- return [sample.stack, control.stack];
1154
- }
1155
- return [null, null];
1156
- }
1157
- };
1158
- RunInRootFrame.DetermineComponentFrameRoot.displayName = "DetermineComponentFrameRoot";
1159
- var namePropDescriptor = Object.getOwnPropertyDescriptor(RunInRootFrame.DetermineComponentFrameRoot, "name");
1160
- namePropDescriptor && namePropDescriptor.configurable && Object.defineProperty(RunInRootFrame.DetermineComponentFrameRoot, "name", { value: "DetermineComponentFrameRoot" });
1161
- var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(), sampleStack = _RunInRootFrame$Deter[0], controlStack = _RunInRootFrame$Deter[1];
1162
- if (sampleStack && controlStack) {
1163
- var sampleLines = sampleStack.split("\n"), controlLines = controlStack.split("\n");
1164
- for (_RunInRootFrame$Deter = namePropDescriptor = 0;namePropDescriptor < sampleLines.length && !sampleLines[namePropDescriptor].includes("DetermineComponentFrameRoot"); )
1165
- namePropDescriptor++;
1166
- for (;_RunInRootFrame$Deter < controlLines.length && !controlLines[_RunInRootFrame$Deter].includes("DetermineComponentFrameRoot"); )
1167
- _RunInRootFrame$Deter++;
1168
- if (namePropDescriptor === sampleLines.length || _RunInRootFrame$Deter === controlLines.length)
1169
- for (namePropDescriptor = sampleLines.length - 1, _RunInRootFrame$Deter = controlLines.length - 1;1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter && sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]; )
1170
- _RunInRootFrame$Deter--;
1171
- for (;1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter; namePropDescriptor--, _RunInRootFrame$Deter--)
1172
- if (sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]) {
1173
- if (namePropDescriptor !== 1 || _RunInRootFrame$Deter !== 1) {
1174
- do
1175
- if (namePropDescriptor--, _RunInRootFrame$Deter--, 0 > _RunInRootFrame$Deter || sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]) {
1176
- var _frame = "\n" + sampleLines[namePropDescriptor].replace(" at new ", " at ");
1177
- fn.displayName && _frame.includes("<anonymous>") && (_frame = _frame.replace("<anonymous>", fn.displayName));
1178
- typeof fn === "function" && componentFrameCache.set(fn, _frame);
1179
- return _frame;
1180
- }
1181
- while (1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter);
1182
- }
1183
- break;
1184
- }
1185
- }
1186
- } finally {
1187
- reentry = false, ReactSharedInternals.H = previousDispatcher, reenableLogs(), Error.prepareStackTrace = frame;
1188
- }
1189
- sampleLines = (sampleLines = fn ? fn.displayName || fn.name : "") ? describeBuiltInComponentFrame(sampleLines) : "";
1190
- typeof fn === "function" && componentFrameCache.set(fn, sampleLines);
1191
- return sampleLines;
1192
- }
1193
- function describeUnknownElementTypeFrameInDEV(type) {
1194
- if (type == null)
1195
- return "";
1196
- if (typeof type === "function") {
1197
- var prototype = type.prototype;
1198
- return describeNativeComponentFrame(type, !(!prototype || !prototype.isReactComponent));
1199
- }
1200
- if (typeof type === "string")
1201
- return describeBuiltInComponentFrame(type);
1202
- switch (type) {
1203
- case REACT_SUSPENSE_TYPE:
1204
- return describeBuiltInComponentFrame("Suspense");
1205
- case REACT_SUSPENSE_LIST_TYPE:
1206
- return describeBuiltInComponentFrame("SuspenseList");
1207
- }
1208
- if (typeof type === "object")
1209
- switch (type.$$typeof) {
1210
- case REACT_FORWARD_REF_TYPE:
1211
- return type = describeNativeComponentFrame(type.render, false), type;
1212
- case REACT_MEMO_TYPE:
1213
- return describeUnknownElementTypeFrameInDEV(type.type);
1214
- case REACT_LAZY_TYPE:
1215
- prototype = type._payload;
1216
- type = type._init;
1217
- try {
1218
- return describeUnknownElementTypeFrameInDEV(type(prototype));
1219
- } catch (x) {
1220
- }
1221
- }
1222
- return "";
1223
- }
1224
- function getOwner() {
1225
- var dispatcher = ReactSharedInternals.A;
1226
- return dispatcher === null ? null : dispatcher.getOwner();
1227
- }
1228
- function hasValidKey(config) {
1229
- if (hasOwnProperty.call(config, "key")) {
1230
- var getter = Object.getOwnPropertyDescriptor(config, "key").get;
1231
- if (getter && getter.isReactWarning)
1232
- return false;
1233
- }
1234
- return config.key !== undefined;
1235
- }
1236
- function defineKeyPropWarningGetter(props, displayName) {
1237
- function warnAboutAccessingKey() {
1238
- specialPropKeyWarningShown || (specialPropKeyWarningShown = true, console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)", displayName));
1239
- }
1240
- warnAboutAccessingKey.isReactWarning = true;
1241
- Object.defineProperty(props, "key", {
1242
- get: warnAboutAccessingKey,
1243
- configurable: true
1244
- });
1245
- }
1246
- function elementRefGetterWithDeprecationWarning() {
1247
- var componentName = getComponentNameFromType(this.type);
1248
- didWarnAboutElementRef[componentName] || (didWarnAboutElementRef[componentName] = true, console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release."));
1249
- componentName = this.props.ref;
1250
- return componentName !== undefined ? componentName : null;
1251
- }
1252
- function ReactElement(type, key, self, source, owner, props) {
1253
- self = props.ref;
1254
- type = {
1255
- $$typeof: REACT_ELEMENT_TYPE,
1256
- type,
1257
- key,
1258
- props,
1259
- _owner: owner
1260
- };
1261
- (self !== undefined ? self : null) !== null ? Object.defineProperty(type, "ref", {
1262
- enumerable: false,
1263
- get: elementRefGetterWithDeprecationWarning
1264
- }) : Object.defineProperty(type, "ref", { enumerable: false, value: null });
1265
- type._store = {};
1266
- Object.defineProperty(type._store, "validated", {
1267
- configurable: false,
1268
- enumerable: false,
1269
- writable: true,
1270
- value: 0
1271
- });
1272
- Object.defineProperty(type, "_debugInfo", {
1273
- configurable: false,
1274
- enumerable: false,
1275
- writable: true,
1276
- value: null
1277
- });
1278
- Object.freeze && (Object.freeze(type.props), Object.freeze(type));
1279
- return type;
1280
- }
1281
- function jsxDEVImpl(type, config, maybeKey, isStaticChildren, source, self) {
1282
- if (typeof type === "string" || typeof type === "function" || type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_OFFSCREEN_TYPE || typeof type === "object" && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_CONSUMER_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_CLIENT_REFERENCE$1 || type.getModuleId !== undefined)) {
1283
- var children = config.children;
1284
- if (children !== undefined)
1285
- if (isStaticChildren)
1286
- if (isArrayImpl(children)) {
1287
- for (isStaticChildren = 0;isStaticChildren < children.length; isStaticChildren++)
1288
- validateChildKeys(children[isStaticChildren], type);
1289
- Object.freeze && Object.freeze(children);
1290
- } else
1291
- console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");
1292
- else
1293
- validateChildKeys(children, type);
1294
- } else {
1295
- children = "";
1296
- if (type === undefined || typeof type === "object" && type !== null && Object.keys(type).length === 0)
1297
- children += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.";
1298
- type === null ? isStaticChildren = "null" : isArrayImpl(type) ? isStaticChildren = "array" : type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE ? (isStaticChildren = "<" + (getComponentNameFromType(type.type) || "Unknown") + " />", children = " Did you accidentally export a JSX literal instead of a component?") : isStaticChildren = typeof type;
1299
- console.error("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", isStaticChildren, children);
1300
- }
1301
- if (hasOwnProperty.call(config, "key")) {
1302
- children = getComponentNameFromType(type);
1303
- var keys = Object.keys(config).filter(function(k) {
1304
- return k !== "key";
1305
- });
1306
- isStaticChildren = 0 < keys.length ? "{key: someKey, " + keys.join(": ..., ") + ": ...}" : "{key: someKey}";
1307
- didWarnAboutKeySpread[children + isStaticChildren] || (keys = 0 < keys.length ? "{" + keys.join(": ..., ") + ": ...}" : "{}", console.error('A props object containing a "key" prop is being spread into JSX:\n let props = %s;\n <%s {...props} />\nReact keys must be passed directly to JSX without using spread:\n let props = %s;\n <%s key={someKey} {...props} />', isStaticChildren, children, keys, children), didWarnAboutKeySpread[children + isStaticChildren] = true);
1308
- }
1309
- children = null;
1310
- maybeKey !== undefined && (checkKeyStringCoercion(maybeKey), children = "" + maybeKey);
1311
- hasValidKey(config) && (checkKeyStringCoercion(config.key), children = "" + config.key);
1312
- if ("key" in config) {
1313
- maybeKey = {};
1314
- for (var propName in config)
1315
- propName !== "key" && (maybeKey[propName] = config[propName]);
1316
- } else
1317
- maybeKey = config;
1318
- children && defineKeyPropWarningGetter(maybeKey, typeof type === "function" ? type.displayName || type.name || "Unknown" : type);
1319
- return ReactElement(type, children, self, source, getOwner(), maybeKey);
1320
- }
1321
- function validateChildKeys(node, parentType) {
1322
- if (typeof node === "object" && node && node.$$typeof !== REACT_CLIENT_REFERENCE) {
1323
- if (isArrayImpl(node))
1324
- for (var i = 0;i < node.length; i++) {
1325
- var child = node[i];
1326
- isValidElement(child) && validateExplicitKey(child, parentType);
1327
- }
1328
- else if (isValidElement(node))
1329
- node._store && (node._store.validated = 1);
1330
- else if (node === null || typeof node !== "object" ? i = null : (i = MAYBE_ITERATOR_SYMBOL && node[MAYBE_ITERATOR_SYMBOL] || node["@@iterator"], i = typeof i === "function" ? i : null), typeof i === "function" && i !== node.entries && (i = i.call(node), i !== node))
1331
- for (;!(node = i.next()).done; )
1332
- isValidElement(node.value) && validateExplicitKey(node.value, parentType);
1333
- }
1334
- }
1335
- function isValidElement(object) {
1336
- return typeof object === "object" && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
1337
- }
1338
- function validateExplicitKey(element, parentType) {
1339
- if (element._store && !element._store.validated && element.key == null && (element._store.validated = 1, parentType = getCurrentComponentErrorInfo(parentType), !ownerHasKeyUseWarning[parentType])) {
1340
- ownerHasKeyUseWarning[parentType] = true;
1341
- var childOwner = "";
1342
- element && element._owner != null && element._owner !== getOwner() && (childOwner = null, typeof element._owner.tag === "number" ? childOwner = getComponentNameFromType(element._owner.type) : typeof element._owner.name === "string" && (childOwner = element._owner.name), childOwner = " It was passed a child from " + childOwner + ".");
1343
- var prevGetCurrentStack = ReactSharedInternals.getCurrentStack;
1344
- ReactSharedInternals.getCurrentStack = function() {
1345
- var stack = describeUnknownElementTypeFrameInDEV(element.type);
1346
- prevGetCurrentStack && (stack += prevGetCurrentStack() || "");
1347
- return stack;
1348
- };
1349
- console.error('Each child in a list should have a unique "key" prop.%s%s See https://react.dev/link/warning-keys for more information.', parentType, childOwner);
1350
- ReactSharedInternals.getCurrentStack = prevGetCurrentStack;
1351
- }
1352
- }
1353
- function getCurrentComponentErrorInfo(parentType) {
1354
- var info = "", owner = getOwner();
1355
- owner && (owner = getComponentNameFromType(owner.type)) && (info = "\n\nCheck the render method of `" + owner + "`.");
1356
- info || (parentType = getComponentNameFromType(parentType)) && (info = "\n\nCheck the top-level render call using <" + parentType + ">.");
1357
- return info;
1358
- }
1359
- var REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = Symbol.for("react.profiler");
1360
- Symbol.for("react.provider");
1361
- var REACT_CONSUMER_TYPE = Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"), REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"), REACT_MEMO_TYPE = Symbol.for("react.memo"), REACT_LAZY_TYPE = Symbol.for("react.lazy"), REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"), MAYBE_ITERATOR_SYMBOL = Symbol.iterator, REACT_CLIENT_REFERENCE$2 = Symbol.for("react.client.reference"), ReactSharedInternals = React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, hasOwnProperty = Object.prototype.hasOwnProperty, assign = Object.assign, REACT_CLIENT_REFERENCE$1 = Symbol.for("react.client.reference"), isArrayImpl = Array.isArray, disabledDepth = 0, prevLog, prevInfo, prevWarn, prevError, prevGroup, prevGroupCollapsed, prevGroupEnd;
1362
- disabledLog.__reactDisabledLog = true;
1363
- var prefix, suffix, reentry = false;
1364
- var componentFrameCache = new (typeof WeakMap === "function" ? WeakMap : Map);
1365
- var REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference"), specialPropKeyWarningShown;
1366
- var didWarnAboutElementRef = {};
1367
- var didWarnAboutKeySpread = {}, ownerHasKeyUseWarning = {};
1368
- exports.Fragment = REACT_FRAGMENT_TYPE;
1369
- exports.jsxDEV = function(type, config, maybeKey, isStaticChildren, source, self) {
1370
- return jsxDEVImpl(type, config, maybeKey, isStaticChildren, source, self);
1371
- };
1372
- })();
1373
- });
1
+ // node_modules/clsx/dist/clsx.mjs
2
+ function r(e) {
3
+ var t, f, n = "";
4
+ if (typeof e == "string" || typeof e == "number")
5
+ n += e;
6
+ else if (typeof e == "object")
7
+ if (Array.isArray(e)) {
8
+ var o = e.length;
9
+ for (t = 0;t < o; t++)
10
+ e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
11
+ } else
12
+ for (f in e)
13
+ e[f] && (n && (n += " "), n += f);
14
+ return n;
15
+ }
16
+ function clsx() {
17
+ for (var e, t, f = 0, n = "", o = arguments.length;f < o; f++)
18
+ (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
19
+ return n;
20
+ }
1374
21
 
1375
- // /Users/dolmios/GitHub/personal/stoop/node_modules/react/jsx-dev-runtime.js
1376
- var require_jsx_dev_runtime = __commonJS((exports, module) => {
1377
- var react_jsx_dev_runtime_development = __toESM(require_react_jsx_dev_runtime_development(), 1);
1378
- if (false) {
1379
- } else {
1380
- module.exports = react_jsx_dev_runtime_development;
1381
- }
1382
- });
22
+ // src/components/Button/Button.module.css
23
+ var Button_module_default = "./Button.module-h78z3dbd.css";
1383
24
 
1384
- // src/components/ThemeProvider.tsx
1385
- var import_react = __toESM(require_react(), 1);
1386
- var jsx_dev_runtime = __toESM(require_jsx_dev_runtime(), 1);
1387
- "use client";
1388
- var ThemeContext = import_react.createContext(undefined);
1389
- function ThemeProvider({ children }) {
1390
- const [mounted, setMounted] = import_react.useState(false);
1391
- const [mode, setMode] = import_react.useState("light");
1392
- import_react.useEffect(() => {
1393
- const stored = localStorage.getItem("theme");
1394
- if (stored) {
1395
- setMode(stored);
1396
- setMounted(true);
1397
- return;
1398
- }
1399
- const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
1400
- setMode(prefersDark ? "dark" : "light");
1401
- setMounted(true);
1402
- }, []);
1403
- import_react.useEffect(() => {
1404
- if (!mounted)
1405
- return;
1406
- document.documentElement.setAttribute("data-theme", mode);
1407
- localStorage.setItem("theme", mode);
1408
- }, [mode, mounted]);
1409
- const toggleTheme = () => setMode((prev) => prev === "light" ? "dark" : "light");
1410
- if (!mounted) {
1411
- return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(jsx_dev_runtime.Fragment, {
1412
- children: " "
1413
- }, undefined, false, undefined, this);
1414
- }
1415
- return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemeContext.Provider, {
1416
- value: { mode, toggleTheme },
1417
- children
25
+ // src/components/Button/Button.tsx
26
+ import { jsxDEV as jsxDEV_7x81h0kn } from "react/jsx-dev-runtime";
27
+ function Button({ className, ...props }) {
28
+ return /* @__PURE__ */ jsxDEV_7x81h0kn("button", {
29
+ className: clsx(Button_module_default["button"], className),
30
+ type: "button",
31
+ ...props
1418
32
  }, undefined, false, undefined, this);
1419
33
  }
1420
- function useTheme() {
1421
- const context = import_react.useContext(ThemeContext);
1422
- if (!context) {
1423
- throw new Error("useTheme must be used within ThemeProvider");
1424
- }
1425
- return context;
1426
- }
1427
34
  export {
1428
- useTheme,
1429
- ThemeProvider
35
+ Button
1430
36
  };
1431
37
 
1432
- //# debugId=C27478A813AB596464756E2164756E21
1433
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JlYWN0QDE5LjAuMC9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9yZWFjdEAxOS4wLjAvbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9yZWFjdEAxOS4wLjAvbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC1qc3gtZGV2LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JlYWN0QDE5LjAuMC9ub2RlX21vZHVsZXMvcmVhY3QvanN4LWRldi1ydW50aW1lLmpzIiwgIi4uL3NyYy9jb21wb25lbnRzL1RoZW1lUHJvdmlkZXIudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyhtZXRob2ROYW1lLCBpbmZvKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIiVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzXCIsXG4gICAgICAgICAgICBpbmZvWzBdLFxuICAgICAgICAgICAgaW5mb1sxXVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICAgIGlmIChudWxsID09PSBtYXliZUl0ZXJhYmxlIHx8IFwib2JqZWN0XCIgIT09IHR5cGVvZiBtYXliZUl0ZXJhYmxlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIG1heWJlSXRlcmFibGUgPVxuICAgICAgICAoTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSkgfHxcbiAgICAgICAgbWF5YmVJdGVyYWJsZVtcIkBAaXRlcmF0b3JcIl07XG4gICAgICByZXR1cm4gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgbWF5YmVJdGVyYWJsZSA/IG1heWJlSXRlcmFibGUgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFtZSkge1xuICAgICAgcHVibGljSW5zdGFuY2UgPVxuICAgICAgICAoKHB1YmxpY0luc3RhbmNlID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3IpICYmXG4gICAgICAgICAgKHB1YmxpY0luc3RhbmNlLmRpc3BsYXlOYW1lIHx8IHB1YmxpY0luc3RhbmNlLm5hbWUpKSB8fFxuICAgICAgICBcIlJlYWN0Q2xhc3NcIjtcbiAgICAgIHZhciB3YXJuaW5nS2V5ID0gcHVibGljSW5zdGFuY2UgKyBcIi5cIiArIGNhbGxlck5hbWU7XG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gfHxcbiAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJDYW4ndCBjYWxsICVzIG9uIGEgY29tcG9uZW50IHRoYXQgaXMgbm90IHlldCBtb3VudGVkLiBUaGlzIGlzIGEgbm8tb3AsIGJ1dCBpdCBtaWdodCBpbmRpY2F0ZSBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgY2xhc3MgcHJvcGVydHkgd2l0aCB0aGUgZGVzaXJlZCBzdGF0ZSBpbiB0aGUgJXMgY29tcG9uZW50LlwiLFxuICAgICAgICAgIGNhbGxlck5hbWUsXG4gICAgICAgICAgcHVibGljSW5zdGFuY2VcbiAgICAgICAgKSxcbiAgICAgICAgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSA9ICEwKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICAgICAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuICAgIGZ1bmN0aW9uIFB1cmVDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgICAgIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIFwiXCIgKyB2YWx1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9ICExO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSAhMDtcbiAgICAgIH1cbiAgICAgIGlmIChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQpIHtcbiAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gY29uc29sZTtcbiAgICAgICAgdmFyIEpTQ29tcGlsZXJfdGVtcF9jb25zdCA9IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdC5lcnJvcjtcbiAgICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCRqc2NvbXAkMCA9XG4gICAgICAgICAgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFN5bWJvbCAmJlxuICAgICAgICAgICAgU3ltYm9sLnRvU3RyaW5nVGFnICYmXG4gICAgICAgICAgICB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddKSB8fFxuICAgICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHxcbiAgICAgICAgICBcIk9iamVjdFwiO1xuICAgICAgICBKU0NvbXBpbGVyX3RlbXBfY29uc3QuY2FsbChcbiAgICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQsXG4gICAgICAgICAgXCJUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSB1c2luZyBpdCBoZXJlLlwiLFxuICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCRqc2NvbXAkMFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgICAgIGlmIChudWxsID09IHR5cGUpIHJldHVybiBudWxsO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHR5cGUpXG4gICAgICAgIHJldHVybiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DTElFTlRfUkVGRVJFTkNFJDJcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gICAgICBpZiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHR5cGUpIHJldHVybiB0eXBlO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJGcmFnbWVudFwiO1xuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIlBvcnRhbFwiO1xuICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiUHJvZmlsZXJcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIlN0cmljdE1vZGVcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIlN1c3BlbnNlXCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIlN1c3BlbnNlTGlzdFwiO1xuICAgICAgfVxuICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICBzd2l0Y2ggKFxuICAgICAgICAgIChcIm51bWJlclwiID09PSB0eXBlb2YgdHlwZS50YWcgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB0eXBlLiQkdHlwZW9mKVxuICAgICAgICApIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAodHlwZS5kaXNwbGF5TmFtZSB8fCBcIkNvbnRleHRcIikgKyBcIi5Qcm92aWRlclwiO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OU1VNRVJfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAodHlwZS5fY29udGV4dC5kaXNwbGF5TmFtZSB8fCBcIkNvbnRleHRcIikgKyBcIi5Db25zdW1lclwiO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgIHZhciBpbm5lclR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgICAgdHlwZSB8fFxuICAgICAgICAgICAgICAoKHR5cGUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgXCJcIiksXG4gICAgICAgICAgICAgICh0eXBlID0gXCJcIiAhPT0gdHlwZSA/IFwiRm9yd2FyZFJlZihcIiArIHR5cGUgKyBcIilcIiA6IFwiRm9yd2FyZFJlZlwiKSk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChpbm5lclR5cGUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGwpLFxuICAgICAgICAgICAgICBudWxsICE9PSBpbm5lclR5cGVcbiAgICAgICAgICAgICAgICA/IGlubmVyVHlwZVxuICAgICAgICAgICAgICAgIDogZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgXCJNZW1vXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICBpbm5lclR5cGUgPSB0eXBlLl9wYXlsb2FkO1xuICAgICAgICAgICAgdHlwZSA9IHR5cGUuX2luaXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUoaW5uZXJUeXBlKSk7XG4gICAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSB8fFxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHxcbiAgICAgICAgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fFxuICAgICAgICB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHxcbiAgICAgICAgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8XG4gICAgICAgIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSAmJlxuICAgICAgICAgIG51bGwgIT09IHR5cGUgJiZcbiAgICAgICAgICAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8XG4gICAgICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHxcbiAgICAgICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OU1VNRVJfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQxIHx8XG4gICAgICAgICAgICB2b2lkIDAgIT09IHR5cGUuZ2V0TW9kdWxlSWQpKVxuICAgICAgICA/ICEwXG4gICAgICAgIDogITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cbiAgICBmdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAgICAgIGlmICgwID09PSBkaXNhYmxlZERlcHRoKSB7XG4gICAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kO1xuICAgICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgICAgd3JpdGFibGU6ICEwXG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRpc2FibGVkRGVwdGgrKztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICAgICAgZGlzYWJsZWREZXB0aC0tO1xuICAgICAgaWYgKDAgPT09IGRpc2FibGVkRGVwdGgpIHtcbiAgICAgICAgdmFyIHByb3BzID0geyBjb25maWd1cmFibGU6ICEwLCBlbnVtZXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZMb2cgfSksXG4gICAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkluZm8gfSksXG4gICAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldldhcm4gfSksXG4gICAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZFcnJvciB9KSxcbiAgICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkdyb3VwIH0pLFxuICAgICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7IHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWQgfSksXG4gICAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZHcm91cEVuZCB9KVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIDAgPiBkaXNhYmxlZERlcHRoICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkge1xuICAgICAgaWYgKHZvaWQgMCA9PT0gcHJlZml4KVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICAgIHByZWZpeCA9IChtYXRjaCAmJiBtYXRjaFsxXSkgfHwgXCJcIjtcbiAgICAgICAgICBzdWZmaXggPVxuICAgICAgICAgICAgLTEgPCB4LnN0YWNrLmluZGV4T2YoXCJcXG4gICAgYXRcIilcbiAgICAgICAgICAgICAgPyBcIiAoPGFub255bW91cz4pXCJcbiAgICAgICAgICAgICAgOiAtMSA8IHguc3RhY2suaW5kZXhPZihcIkBcIilcbiAgICAgICAgICAgICAgICA/IFwiQHVua25vd246MDowXCJcbiAgICAgICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBcIlxcblwiICsgcHJlZml4ICsgbmFtZSArIHN1ZmZpeDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gICAgICBpZiAoIWZuIHx8IHJlZW50cnkpIHJldHVybiBcIlwiO1xuICAgICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuICAgICAgaWYgKHZvaWQgMCAhPT0gZnJhbWUpIHJldHVybiBmcmFtZTtcbiAgICAgIHJlZW50cnkgPSAhMDtcbiAgICAgIGZyYW1lID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XG4gICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcmV2aW91c0Rpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBudWxsO1xuICAgICAgZGlzYWJsZUxvZ3MoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBSdW5JblJvb3RGcmFtZSA9IHtcbiAgICAgICAgICBEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsIFwicHJvcHNcIiwge1xuICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBSZWZsZWN0ICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0geDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoeCQwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSB4JDA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoeCQxKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sID0geCQxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAoRmFrZSA9IGZuKCkpICYmXG4gICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBGYWtlLmNhdGNoICYmXG4gICAgICAgICAgICAgICAgICBGYWtlLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgICAgICAgICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiBcInN0cmluZ1wiID09PSB0eXBlb2Ygc2FtcGxlLnN0YWNrKVxuICAgICAgICAgICAgICAgIHJldHVybiBbc2FtcGxlLnN0YWNrLCBjb250cm9sLnN0YWNrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QuZGlzcGxheU5hbWUgPVxuICAgICAgICAgIFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCI7XG4gICAgICAgIHZhciBuYW1lUHJvcERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCxcbiAgICAgICAgICBcIm5hbWVcIlxuICAgICAgICApO1xuICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IgJiZcbiAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IuY29uZmlndXJhYmxlICYmXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LFxuICAgICAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgICAgICB7IHZhbHVlOiBcIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdFwiIH1cbiAgICAgICAgICApO1xuICAgICAgICB2YXIgX1J1bkluUm9vdEZyYW1lJERldGVyID1cbiAgICAgICAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCgpLFxuICAgICAgICAgIHNhbXBsZVN0YWNrID0gX1J1bkluUm9vdEZyYW1lJERldGVyWzBdLFxuICAgICAgICAgIGNvbnRyb2xTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlclsxXTtcbiAgICAgICAgaWYgKHNhbXBsZVN0YWNrICYmIGNvbnRyb2xTdGFjaykge1xuICAgICAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZVN0YWNrLnNwbGl0KFwiXFxuXCIpLFxuICAgICAgICAgICAgY29udHJvbExpbmVzID0gY29udHJvbFN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPSBuYW1lUHJvcERlc2NyaXB0b3IgPSAwO1xuICAgICAgICAgICAgbmFtZVByb3BEZXNjcmlwdG9yIDwgc2FtcGxlTGluZXMubGVuZ3RoICYmXG4gICAgICAgICAgICAhc2FtcGxlTGluZXNbbmFtZVByb3BEZXNjcmlwdG9yXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIlxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIClcbiAgICAgICAgICAgIG5hbWVQcm9wRGVzY3JpcHRvcisrO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICA7XG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPCBjb250cm9sTGluZXMubGVuZ3RoICYmXG4gICAgICAgICAgICAhY29udHJvbExpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgIFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCJcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICApXG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIrKztcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IgPT09IHNhbXBsZUxpbmVzLmxlbmd0aCB8fFxuICAgICAgICAgICAgX1J1bkluUm9vdEZyYW1lJERldGVyID09PSBjb250cm9sTGluZXMubGVuZ3RoXG4gICAgICAgICAgKVxuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgbmFtZVByb3BEZXNjcmlwdG9yID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgMSA8PSBuYW1lUHJvcERlc2NyaXB0b3IgJiZcbiAgICAgICAgICAgICAgMCA8PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgJiZcbiAgICAgICAgICAgICAgc2FtcGxlTGluZXNbbmFtZVByb3BEZXNjcmlwdG9yXSAhPT1cbiAgICAgICAgICAgICAgICBjb250cm9sTGluZXNbX1J1bkluUm9vdEZyYW1lJERldGVyXTtcblxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXItLTtcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgO1xuICAgICAgICAgICAgMSA8PSBuYW1lUHJvcERlc2NyaXB0b3IgJiYgMCA8PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXI7XG4gICAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3ItLSwgX1J1bkluUm9vdEZyYW1lJERldGVyLS1cbiAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHNhbXBsZUxpbmVzW25hbWVQcm9wRGVzY3JpcHRvcl0gIT09XG4gICAgICAgICAgICAgIGNvbnRyb2xMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKDEgIT09IG5hbWVQcm9wRGVzY3JpcHRvciB8fCAxICE9PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIpIHtcbiAgICAgICAgICAgICAgICBkb1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAobmFtZVByb3BEZXNjcmlwdG9yLS0sXG4gICAgICAgICAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlci0tLFxuICAgICAgICAgICAgICAgICAgICAwID4gX1J1bkluUm9vdEZyYW1lJERldGVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgc2FtcGxlTGluZXNbbmFtZVByb3BEZXNjcmlwdG9yXSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPVxuICAgICAgICAgICAgICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUxpbmVzW25hbWVQcm9wRGVzY3JpcHRvcl0ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IG5ldyBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IFwiXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZm4uZGlzcGxheU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICBfZnJhbWUuaW5jbHVkZXMoXCI8YW5vbnltb3VzPlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgIChfZnJhbWUgPSBfZnJhbWUucmVwbGFjZShcIjxhbm9ueW1vdXM+XCIsIGZuLmRpc3BsYXlOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGZuICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEgPD0gbmFtZVByb3BEZXNjcmlwdG9yICYmIDAgPD0gX1J1bkluUm9vdEZyYW1lJERldGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgKHJlZW50cnkgPSAhMSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2aW91c0Rpc3BhdGNoZXIpLFxuICAgICAgICAgIHJlZW5hYmxlTG9ncygpLFxuICAgICAgICAgIChFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IGZyYW1lKTtcbiAgICAgIH1cbiAgICAgIHNhbXBsZUxpbmVzID0gKHNhbXBsZUxpbmVzID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogXCJcIilcbiAgICAgICAgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShzYW1wbGVMaW5lcylcbiAgICAgICAgOiBcIlwiO1xuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZm4gJiYgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHNhbXBsZUxpbmVzKTtcbiAgICAgIHJldHVybiBzYW1wbGVMaW5lcztcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUpIHtcbiAgICAgIGlmIChudWxsID09IHR5cGUpIHJldHVybiBcIlwiO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHR5cGUpIHtcbiAgICAgICAgdmFyIHByb3RvdHlwZSA9IHR5cGUucHJvdG90eXBlO1xuICAgICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgICEoIXByb3RvdHlwZSB8fCAhcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHR5cGUpIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSh0eXBlKTtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKFwiU3VzcGVuc2VcIik7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShcIlN1c3BlbnNlTGlzdFwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSlcbiAgICAgICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuICh0eXBlID0gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLnJlbmRlciwgITEpKSwgdHlwZTtcbiAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlKTtcbiAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgIHByb3RvdHlwZSA9IHR5cGUuX3BheWxvYWQ7XG4gICAgICAgICAgICB0eXBlID0gdHlwZS5faW5pdDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZShwcm90b3R5cGUpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRPd25lcigpIHtcbiAgICAgIHZhciBkaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuQTtcbiAgICAgIHJldHVybiBudWxsID09PSBkaXNwYXRjaGVyID8gbnVsbCA6IGRpc3BhdGNoZXIuZ2V0T3duZXIoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIFwia2V5XCIpKSB7XG4gICAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgXCJrZXlcIikuZ2V0O1xuICAgICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykgcmV0dXJuICExO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gY29uZmlnLmtleTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gICAgICBmdW5jdGlvbiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkoKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duIHx8XG4gICAgICAgICAgKChzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9ICEwKSxcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lIHZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgcHJvcC4gKGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvc3BlY2lhbC1wcm9wcylcIixcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSAhMDtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgXCJrZXlcIiwge1xuICAgICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVsZW1lbnRSZWZHZXR0ZXJXaXRoRGVwcmVjYXRpb25XYXJuaW5nKCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodGhpcy50eXBlKTtcbiAgICAgIGRpZFdhcm5BYm91dEVsZW1lbnRSZWZbY29tcG9uZW50TmFtZV0gfHxcbiAgICAgICAgKChkaWRXYXJuQWJvdXRFbGVtZW50UmVmW2NvbXBvbmVudE5hbWVdID0gITApLFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiQWNjZXNzaW5nIGVsZW1lbnQucmVmIHdhcyByZW1vdmVkIGluIFJlYWN0IDE5LiByZWYgaXMgbm93IGEgcmVndWxhciBwcm9wLiBJdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgSlNYIEVsZW1lbnQgdHlwZSBpbiBhIGZ1dHVyZSByZWxlYXNlLlwiXG4gICAgICAgICkpO1xuICAgICAgY29tcG9uZW50TmFtZSA9IHRoaXMucHJvcHMucmVmO1xuICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gY29tcG9uZW50TmFtZSA/IGNvbXBvbmVudE5hbWUgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICAgICAgc2VsZiA9IHByb3BzLnJlZjtcbiAgICAgIHR5cGUgPSB7XG4gICAgICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBwcm9wczogcHJvcHMsXG4gICAgICAgIF9vd25lcjogb3duZXJcbiAgICAgIH07XG4gICAgICBudWxsICE9PSAodm9pZCAwICE9PSBzZWxmID8gc2VsZiA6IG51bGwpXG4gICAgICAgID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIFwicmVmXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICAgICAgZ2V0OiBlbGVtZW50UmVmR2V0dGVyV2l0aERlcHJlY2F0aW9uV2FybmluZ1xuICAgICAgICAgIH0pXG4gICAgICAgIDogT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIFwicmVmXCIsIHsgZW51bWVyYWJsZTogITEsIHZhbHVlOiBudWxsIH0pO1xuICAgICAgdHlwZS5fc3RvcmUgPSB7fTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLl9zdG9yZSwgXCJ2YWxpZGF0ZWRcIiwge1xuICAgICAgICBjb25maWd1cmFibGU6ICExLFxuICAgICAgICBlbnVtZXJhYmxlOiAhMSxcbiAgICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgICB2YWx1ZTogMFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgXCJfZGVidWdJbmZvXCIsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMSxcbiAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmZyZWV6ZSAmJiAoT2JqZWN0LmZyZWV6ZSh0eXBlLnByb3BzKSwgT2JqZWN0LmZyZWV6ZSh0eXBlKSk7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICAgICAgbmV3S2V5ID0gUmVhY3RFbGVtZW50KFxuICAgICAgICBvbGRFbGVtZW50LnR5cGUsXG4gICAgICAgIG5ld0tleSxcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIG9sZEVsZW1lbnQuX293bmVyLFxuICAgICAgICBvbGRFbGVtZW50LnByb3BzXG4gICAgICApO1xuICAgICAgbmV3S2V5Ll9zdG9yZS52YWxpZGF0ZWQgPSBvbGRFbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQ7XG4gICAgICByZXR1cm4gbmV3S2V5O1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBub2RlICYmXG4gICAgICAgIG5vZGUgJiZcbiAgICAgICAgbm9kZS4kJHR5cGVvZiAhPT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRVxuICAgICAgKVxuICAgICAgICBpZiAoaXNBcnJheUltcGwobm9kZSkpXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuICAgICAgICAgICAgaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpXG4gICAgICAgICAgbm9kZS5fc3RvcmUgJiYgKG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IDEpO1xuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAoKGkgPSBnZXRJdGVyYXRvckZuKG5vZGUpKSxcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpICYmXG4gICAgICAgICAgICBpICE9PSBub2RlLmVudHJpZXMgJiZcbiAgICAgICAgICAgICgoaSA9IGkuY2FsbChub2RlKSksIGkgIT09IG5vZGUpKVxuICAgICAgICApXG4gICAgICAgICAgZm9yICg7ICEobm9kZSA9IGkubmV4dCgpKS5kb25lOyApXG4gICAgICAgICAgICBpc1ZhbGlkRWxlbWVudChub2RlLnZhbHVlKSAmJlxuICAgICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KG5vZGUudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBvYmplY3QgJiZcbiAgICAgICAgbnVsbCAhPT0gb2JqZWN0ICYmXG4gICAgICAgIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZWxlbWVudC5fc3RvcmUgJiZcbiAgICAgICAgIWVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCAmJlxuICAgICAgICBudWxsID09IGVsZW1lbnQua2V5ICYmXG4gICAgICAgICgoZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gMSksXG4gICAgICAgIChwYXJlbnRUeXBlID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSksXG4gICAgICAgICFvd25lckhhc0tleVVzZVdhcm5pbmdbcGFyZW50VHlwZV0pXG4gICAgICApIHtcbiAgICAgICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW3BhcmVudFR5cGVdID0gITA7XG4gICAgICAgIHZhciBjaGlsZE93bmVyID0gXCJcIjtcbiAgICAgICAgZWxlbWVudCAmJlxuICAgICAgICAgIG51bGwgIT0gZWxlbWVudC5fb3duZXIgJiZcbiAgICAgICAgICBlbGVtZW50Ll9vd25lciAhPT0gZ2V0T3duZXIoKSAmJlxuICAgICAgICAgICgoY2hpbGRPd25lciA9IG51bGwpLFxuICAgICAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiBlbGVtZW50Ll9vd25lci50YWdcbiAgICAgICAgICAgID8gKGNoaWxkT3duZXIgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoZWxlbWVudC5fb3duZXIudHlwZSkpXG4gICAgICAgICAgICA6IFwic3RyaW5nXCIgPT09IHR5cGVvZiBlbGVtZW50Ll9vd25lci5uYW1lICYmXG4gICAgICAgICAgICAgIChjaGlsZE93bmVyID0gZWxlbWVudC5fb3duZXIubmFtZSksXG4gICAgICAgICAgKGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGNoaWxkT3duZXIgKyBcIi5cIikpO1xuICAgICAgICB2YXIgcHJldkdldEN1cnJlbnRTdGFjayA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLmdldEN1cnJlbnRTdGFjaztcbiAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuZ2V0Q3VycmVudFN0YWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUpO1xuICAgICAgICAgIHByZXZHZXRDdXJyZW50U3RhY2sgJiYgKHN0YWNrICs9IHByZXZHZXRDdXJyZW50U3RhY2soKSB8fCBcIlwiKTtcbiAgICAgICAgICByZXR1cm4gc3RhY2s7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4lcyVzIFNlZSBodHRwczovL3JlYWN0LmRldi9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgICAgICAgIHBhcmVudFR5cGUsXG4gICAgICAgICAgY2hpbGRPd25lclxuICAgICAgICApO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2sgPSBwcmV2R2V0Q3VycmVudFN0YWNrO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAgICAgIHZhciBpbmZvID0gXCJcIixcbiAgICAgICAgb3duZXIgPSBnZXRPd25lcigpO1xuICAgICAgb3duZXIgJiZcbiAgICAgICAgKG93bmVyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG93bmVyLnR5cGUpKSAmJlxuICAgICAgICAoaW5mbyA9IFwiXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYFwiICsgb3duZXIgKyBcImAuXCIpO1xuICAgICAgaW5mbyB8fFxuICAgICAgICAoKHBhcmVudFR5cGUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUocGFyZW50VHlwZSkpICYmXG4gICAgICAgICAgKGluZm8gPVxuICAgICAgICAgICAgXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudFR5cGUgKyBcIj4uXCIpKTtcbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cbiAgICBmdW5jdGlvbiBlc2NhcGUoa2V5KSB7XG4gICAgICB2YXIgZXNjYXBlckxvb2t1cCA9IHsgXCI9XCI6IFwiPTBcIiwgXCI6XCI6IFwiPTJcIiB9O1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgXCIkXCIgK1xuICAgICAgICBrZXkucmVwbGFjZSgvWz06XS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRFbGVtZW50S2V5KGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gXCJvYmplY3RcIiA9PT0gdHlwZW9mIGVsZW1lbnQgJiZcbiAgICAgICAgbnVsbCAhPT0gZWxlbWVudCAmJlxuICAgICAgICBudWxsICE9IGVsZW1lbnQua2V5XG4gICAgICAgID8gKGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oZWxlbWVudC5rZXkpLCBlc2NhcGUoXCJcIiArIGVsZW1lbnQua2V5KSlcbiAgICAgICAgOiBpbmRleC50b1N0cmluZygzNik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5vb3AkMSgpIHt9XG4gICAgZnVuY3Rpb24gcmVzb2x2ZVRoZW5hYmxlKHRoZW5hYmxlKSB7XG4gICAgICBzd2l0Y2ggKHRoZW5hYmxlLnN0YXR1cykge1xuICAgICAgICBjYXNlIFwiZnVsZmlsbGVkXCI6XG4gICAgICAgICAgcmV0dXJuIHRoZW5hYmxlLnZhbHVlO1xuICAgICAgICBjYXNlIFwicmVqZWN0ZWRcIjpcbiAgICAgICAgICB0aHJvdyB0aGVuYWJsZS5yZWFzb247XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgc3dpdGNoIChcbiAgICAgICAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgdGhlbmFibGUuc3RhdHVzXG4gICAgICAgICAgICAgID8gdGhlbmFibGUudGhlbihub29wJDEsIG5vb3AkMSlcbiAgICAgICAgICAgICAgOiAoKHRoZW5hYmxlLnN0YXR1cyA9IFwicGVuZGluZ1wiKSxcbiAgICAgICAgICAgICAgICB0aGVuYWJsZS50aGVuKFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGZ1bGZpbGxlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIFwicGVuZGluZ1wiID09PSB0aGVuYWJsZS5zdGF0dXMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoKHRoZW5hYmxlLnN0YXR1cyA9IFwiZnVsZmlsbGVkXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICh0aGVuYWJsZS52YWx1ZSA9IGZ1bGZpbGxlZFZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIFwicGVuZGluZ1wiID09PSB0aGVuYWJsZS5zdGF0dXMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoKHRoZW5hYmxlLnN0YXR1cyA9IFwicmVqZWN0ZWRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgKHRoZW5hYmxlLnJlYXNvbiA9IGVycm9yKSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICB0aGVuYWJsZS5zdGF0dXMpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjYXNlIFwiZnVsZmlsbGVkXCI6XG4gICAgICAgICAgICAgIHJldHVybiB0aGVuYWJsZS52YWx1ZTtcbiAgICAgICAgICAgIGNhc2UgXCJyZWplY3RlZFwiOlxuICAgICAgICAgICAgICB0aHJvdyB0aGVuYWJsZS5yZWFzb247XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgdGhlbmFibGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1hcEludG9BcnJheShjaGlsZHJlbiwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5hbWVTb0ZhciwgY2FsbGJhY2spIHtcbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuICAgICAgaWYgKFwidW5kZWZpbmVkXCIgPT09IHR5cGUgfHwgXCJib29sZWFuXCIgPT09IHR5cGUpIGNoaWxkcmVuID0gbnVsbDtcbiAgICAgIHZhciBpbnZva2VDYWxsYmFjayA9ICExO1xuICAgICAgaWYgKG51bGwgPT09IGNoaWxkcmVuKSBpbnZva2VDYWxsYmFjayA9ICEwO1xuICAgICAgZWxzZVxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gITA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICBzd2l0Y2ggKGNoaWxkcmVuLiQkdHlwZW9mKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gITA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAoaW52b2tlQ2FsbGJhY2sgPSBjaGlsZHJlbi5faW5pdCksXG4gICAgICAgICAgICAgICAgICBtYXBJbnRvQXJyYXkoXG4gICAgICAgICAgICAgICAgICAgIGludm9rZUNhbGxiYWNrKGNoaWxkcmVuLl9wYXlsb2FkKSxcbiAgICAgICAgICAgICAgICAgICAgYXJyYXksXG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRQcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgIG5hbWVTb0ZhcixcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBpZiAoaW52b2tlQ2FsbGJhY2spIHtcbiAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSBjaGlsZHJlbjtcbiAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayhpbnZva2VDYWxsYmFjayk7XG4gICAgICAgIHZhciBjaGlsZEtleSA9XG4gICAgICAgICAgXCJcIiA9PT0gbmFtZVNvRmFyID8gXCIuXCIgKyBnZXRFbGVtZW50S2V5KGludm9rZUNhbGxiYWNrLCAwKSA6IG5hbWVTb0ZhcjtcbiAgICAgICAgaXNBcnJheUltcGwoY2FsbGJhY2spXG4gICAgICAgICAgPyAoKGVzY2FwZWRQcmVmaXggPSBcIlwiKSxcbiAgICAgICAgICAgIG51bGwgIT0gY2hpbGRLZXkgJiZcbiAgICAgICAgICAgICAgKGVzY2FwZWRQcmVmaXggPVxuICAgICAgICAgICAgICAgIGNoaWxkS2V5LnJlcGxhY2UodXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsIFwiJCYvXCIpICsgXCIvXCIpLFxuICAgICAgICAgICAgbWFwSW50b0FycmF5KGNhbGxiYWNrLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgXCJcIiwgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICA6IG51bGwgIT0gY2FsbGJhY2sgJiZcbiAgICAgICAgICAgIChpc1ZhbGlkRWxlbWVudChjYWxsYmFjaykgJiZcbiAgICAgICAgICAgICAgKG51bGwgIT0gY2FsbGJhY2sua2V5ICYmXG4gICAgICAgICAgICAgICAgKChpbnZva2VDYWxsYmFjayAmJiBpbnZva2VDYWxsYmFjay5rZXkgPT09IGNhbGxiYWNrLmtleSkgfHxcbiAgICAgICAgICAgICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY2FsbGJhY2sua2V5KSksXG4gICAgICAgICAgICAgIChlc2NhcGVkUHJlZml4ID0gY2xvbmVBbmRSZXBsYWNlS2V5KFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgICAgIGVzY2FwZWRQcmVmaXggK1xuICAgICAgICAgICAgICAgICAgKG51bGwgPT0gY2FsbGJhY2sua2V5IHx8XG4gICAgICAgICAgICAgICAgICAoaW52b2tlQ2FsbGJhY2sgJiYgaW52b2tlQ2FsbGJhY2sua2V5ID09PSBjYWxsYmFjay5rZXkpXG4gICAgICAgICAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgICAgICAgICA6IChcIlwiICsgY2FsbGJhY2sua2V5KS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiQmL1wiXG4gICAgICAgICAgICAgICAgICAgICAgKSArIFwiL1wiKSArXG4gICAgICAgICAgICAgICAgICBjaGlsZEtleVxuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgXCJcIiAhPT0gbmFtZVNvRmFyICYmXG4gICAgICAgICAgICAgICAgbnVsbCAhPSBpbnZva2VDYWxsYmFjayAmJlxuICAgICAgICAgICAgICAgIGlzVmFsaWRFbGVtZW50KGludm9rZUNhbGxiYWNrKSAmJlxuICAgICAgICAgICAgICAgIG51bGwgPT0gaW52b2tlQ2FsbGJhY2sua2V5ICYmXG4gICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2suX3N0b3JlICYmXG4gICAgICAgICAgICAgICAgIWludm9rZUNhbGxiYWNrLl9zdG9yZS52YWxpZGF0ZWQgJiZcbiAgICAgICAgICAgICAgICAoZXNjYXBlZFByZWZpeC5fc3RvcmUudmFsaWRhdGVkID0gMiksXG4gICAgICAgICAgICAgIChjYWxsYmFjayA9IGVzY2FwZWRQcmVmaXgpKSxcbiAgICAgICAgICAgIGFycmF5LnB1c2goY2FsbGJhY2spKTtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICBpbnZva2VDYWxsYmFjayA9IDA7XG4gICAgICBjaGlsZEtleSA9IFwiXCIgPT09IG5hbWVTb0ZhciA/IFwiLlwiIDogbmFtZVNvRmFyICsgXCI6XCI7XG4gICAgICBpZiAoaXNBcnJheUltcGwoY2hpbGRyZW4pKVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuICAgICAgICAgIChuYW1lU29GYXIgPSBjaGlsZHJlbltpXSksXG4gICAgICAgICAgICAodHlwZSA9IGNoaWxkS2V5ICsgZ2V0RWxlbWVudEtleShuYW1lU29GYXIsIGkpKSxcbiAgICAgICAgICAgIChpbnZva2VDYWxsYmFjayArPSBtYXBJbnRvQXJyYXkoXG4gICAgICAgICAgICAgIG5hbWVTb0ZhcixcbiAgICAgICAgICAgICAgYXJyYXksXG4gICAgICAgICAgICAgIGVzY2FwZWRQcmVmaXgsXG4gICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgICApKTtcbiAgICAgIGVsc2UgaWYgKCgoaSA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pKSwgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaSkpXG4gICAgICAgIGZvciAoXG4gICAgICAgICAgaSA9PT0gY2hpbGRyZW4uZW50cmllcyAmJlxuICAgICAgICAgICAgKGRpZFdhcm5BYm91dE1hcHMgfHxcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIFwiVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLlwiXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAoZGlkV2FybkFib3V0TWFwcyA9ICEwKSksXG4gICAgICAgICAgICBjaGlsZHJlbiA9IGkuY2FsbChjaGlsZHJlbiksXG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAhKG5hbWVTb0ZhciA9IGNoaWxkcmVuLm5leHQoKSkuZG9uZTtcblxuICAgICAgICApXG4gICAgICAgICAgKG5hbWVTb0ZhciA9IG5hbWVTb0Zhci52YWx1ZSksXG4gICAgICAgICAgICAodHlwZSA9IGNoaWxkS2V5ICsgZ2V0RWxlbWVudEtleShuYW1lU29GYXIsIGkrKykpLFxuICAgICAgICAgICAgKGludm9rZUNhbGxiYWNrICs9IG1hcEludG9BcnJheShcbiAgICAgICAgICAgICAgbmFtZVNvRmFyLFxuICAgICAgICAgICAgICBhcnJheSxcbiAgICAgICAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICkpO1xuICAgICAgZWxzZSBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZSkge1xuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY2hpbGRyZW4udGhlbilcbiAgICAgICAgICByZXR1cm4gbWFwSW50b0FycmF5KFxuICAgICAgICAgICAgcmVzb2x2ZVRoZW5hYmxlKGNoaWxkcmVuKSxcbiAgICAgICAgICAgIGFycmF5LFxuICAgICAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgICAgICAgIG5hbWVTb0ZhcixcbiAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgKTtcbiAgICAgICAgYXJyYXkgPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgK1xuICAgICAgICAgICAgKFwiW29iamVjdCBPYmplY3RdXCIgPT09IGFycmF5XG4gICAgICAgICAgICAgID8gXCJvYmplY3Qgd2l0aCBrZXlzIHtcIiArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKFwiLCBcIikgKyBcIn1cIlxuICAgICAgICAgICAgICA6IGFycmF5KSArXG4gICAgICAgICAgICBcIikuIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgaW5zdGVhZC5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGludm9rZUNhbGxiYWNrO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICAgICAgaWYgKG51bGwgPT0gY2hpbGRyZW4pIHJldHVybiBjaGlsZHJlbjtcbiAgICAgIHZhciByZXN1bHQgPSBbXSxcbiAgICAgICAgY291bnQgPSAwO1xuICAgICAgbWFwSW50b0FycmF5KGNoaWxkcmVuLCByZXN1bHQsIFwiXCIsIFwiXCIsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGF6eUluaXRpYWxpemVyKHBheWxvYWQpIHtcbiAgICAgIGlmICgtMSA9PT0gcGF5bG9hZC5fc3RhdHVzKSB7XG4gICAgICAgIHZhciBjdG9yID0gcGF5bG9hZC5fcmVzdWx0O1xuICAgICAgICBjdG9yID0gY3RvcigpO1xuICAgICAgICBjdG9yLnRoZW4oXG4gICAgICAgICAgZnVuY3Rpb24gKG1vZHVsZU9iamVjdCkge1xuICAgICAgICAgICAgaWYgKDAgPT09IHBheWxvYWQuX3N0YXR1cyB8fCAtMSA9PT0gcGF5bG9hZC5fc3RhdHVzKVxuICAgICAgICAgICAgICAocGF5bG9hZC5fc3RhdHVzID0gMSksIChwYXlsb2FkLl9yZXN1bHQgPSBtb2R1bGVPYmplY3QpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoMCA9PT0gcGF5bG9hZC5fc3RhdHVzIHx8IC0xID09PSBwYXlsb2FkLl9zdGF0dXMpXG4gICAgICAgICAgICAgIChwYXlsb2FkLl9zdGF0dXMgPSAyKSwgKHBheWxvYWQuX3Jlc3VsdCA9IGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIC0xID09PSBwYXlsb2FkLl9zdGF0dXMgJiZcbiAgICAgICAgICAoKHBheWxvYWQuX3N0YXR1cyA9IDApLCAocGF5bG9hZC5fcmVzdWx0ID0gY3RvcikpO1xuICAgICAgfVxuICAgICAgaWYgKDEgPT09IHBheWxvYWQuX3N0YXR1cylcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAoY3RvciA9IHBheWxvYWQuX3Jlc3VsdCksXG4gICAgICAgICAgdm9pZCAwID09PSBjdG9yICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcImxhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcG9ydCgpIGNhbGwuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcG9ydCgnLi9NeUNvbXBvbmVudCcpKVxcblxcbkRpZCB5b3UgYWNjaWRlbnRhbGx5IHB1dCBjdXJseSBicmFjZXMgYXJvdW5kIHRoZSBpbXBvcnQ/XCIsXG4gICAgICAgICAgICAgIGN0b3JcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXCJkZWZhdWx0XCIgaW4gY3RvciB8fFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXBvcnQoKSBjYWxsLiBJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gIGNvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXBvcnQoJy4vTXlDb21wb25lbnQnKSlcIixcbiAgICAgICAgICAgICAgY3RvclxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBjdG9yLmRlZmF1bHRcbiAgICAgICAgKTtcbiAgICAgIHRocm93IHBheWxvYWQuX3Jlc3VsdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzb2x2ZURpc3BhdGNoZXIoKSB7XG4gICAgICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICBudWxsID09PSBkaXNwYXRjaGVyICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbjMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG5TZWUgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uXCJcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBkaXNwYXRjaGVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBub29wKCkge31cbiAgICBmdW5jdGlvbiBlbnF1ZXVlVGFzayh0YXNrKSB7XG4gICAgICBpZiAobnVsbCA9PT0gZW5xdWV1ZVRhc2tJbXBsKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciByZXF1aXJlU3RyaW5nID0gKFwicmVxdWlyZVwiICsgTWF0aC5yYW5kb20oKSkuc2xpY2UoMCwgNyk7XG4gICAgICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gKG1vZHVsZSAmJiBtb2R1bGVbcmVxdWlyZVN0cmluZ10pLmNhbGwoXG4gICAgICAgICAgICBtb2R1bGUsXG4gICAgICAgICAgICBcInRpbWVyc1wiXG4gICAgICAgICAgKS5zZXRJbW1lZGlhdGU7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICBlbnF1ZXVlVGFza0ltcGwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICExID09PSBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCAmJlxuICAgICAgICAgICAgICAoKGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gITApLFxuICAgICAgICAgICAgICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJUaGlzIGJyb3dzZXIgZG9lcyBub3QgaGF2ZSBhIE1lc3NhZ2VDaGFubmVsIGltcGxlbWVudGF0aW9uLCBzbyBlbnF1ZXVpbmcgdGFza3MgdmlhIGF3YWl0IGFjdChhc3luYyAoKSA9PiAuLi4pIHdpbGwgZmFpbC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUgYXQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3VlcyBpZiB5b3UgZW5jb3VudGVyIHRoaXMgd2FybmluZy5cIlxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gY2FsbGJhY2s7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKHZvaWQgMCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgcmV0dXJuIGVucXVldWVUYXNrSW1wbCh0YXNrKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWdncmVnYXRlRXJyb3JzKGVycm9ycykge1xuICAgICAgcmV0dXJuIDEgPCBlcnJvcnMubGVuZ3RoICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIEFnZ3JlZ2F0ZUVycm9yXG4gICAgICAgID8gbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycylcbiAgICAgICAgOiBlcnJvcnNbMF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvcEFjdFNjb3BlKHByZXZBY3RRdWV1ZSwgcHJldkFjdFNjb3BlRGVwdGgpIHtcbiAgICAgIHByZXZBY3RTY29wZURlcHRoICE9PSBhY3RTY29wZURlcHRoIC0gMSAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiWW91IHNlZW0gdG8gaGF2ZSBvdmVybGFwcGluZyBhY3QoKSBjYWxscywgdGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBCZSBzdXJlIHRvIGF3YWl0IHByZXZpb3VzIGFjdCgpIGNhbGxzIGJlZm9yZSBtYWtpbmcgYSBuZXcgb25lLiBcIlxuICAgICAgICApO1xuICAgICAgYWN0U2NvcGVEZXB0aCA9IHByZXZBY3RTY29wZURlcHRoO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBxdWV1ZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLmFjdFF1ZXVlO1xuICAgICAgaWYgKG51bGwgIT09IHF1ZXVlKVxuICAgICAgICBpZiAoMCAhPT0gcXVldWUubGVuZ3RoKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmbHVzaEFjdFF1ZXVlKHF1ZXVlKTtcbiAgICAgICAgICAgIGVucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgZWxzZSBSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSA9IG51bGw7XG4gICAgICAwIDwgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aFxuICAgICAgICA/ICgocXVldWUgPSBhZ2dyZWdhdGVFcnJvcnMoUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzKSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5sZW5ndGggPSAwKSxcbiAgICAgICAgICByZWplY3QocXVldWUpKVxuICAgICAgICA6IHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaEFjdFF1ZXVlKHF1ZXVlKSB7XG4gICAgICBpZiAoIWlzRmx1c2hpbmcpIHtcbiAgICAgICAgaXNGbHVzaGluZyA9ICEwO1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICg7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLmRpZFVzZVByb21pc2UgPSAhMTtcbiAgICAgICAgICAgICAgdmFyIGNvbnRpbnVhdGlvbiA9IGNhbGxiYWNrKCExKTtcbiAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGNvbnRpbnVhdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChSZWFjdFNoYXJlZEludGVybmFscy5kaWRVc2VQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICBxdWV1ZVtpXSA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgICAgICAgcXVldWUuc3BsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGNvbnRpbnVhdGlvbjtcbiAgICAgICAgICAgICAgfSBlbHNlIGJyZWFrO1xuICAgICAgICAgICAgfSB3aGlsZSAoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcXVldWUuc3BsaWNlKDAsIGkgKyAxKSwgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlzRmx1c2hpbmcgPSAhMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09XG4gICAgICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ICYmXG4gICAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KEVycm9yKCkpO1xuICAgIHZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QudHJhbnNpdGlvbmFsLmVsZW1lbnRcIiksXG4gICAgICBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIiksXG4gICAgICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLFxuICAgICAgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKSxcbiAgICAgIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIik7XG4gICAgU3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpO1xuICAgIHZhciBSRUFDVF9DT05TVU1FUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnN1bWVyXCIpLFxuICAgICAgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnRleHRcIiksXG4gICAgICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpLFxuICAgICAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSxcbiAgICAgIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpLFxuICAgICAgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIiksXG4gICAgICBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSxcbiAgICAgIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0Lm9mZnNjcmVlblwiKSxcbiAgICAgIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcixcbiAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCA9IHt9LFxuICAgICAgUmVhY3ROb29wVXBkYXRlUXVldWUgPSB7XG4gICAgICAgIGlzTW91bnRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfSxcbiAgICAgICAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICAgICAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgXCJmb3JjZVVwZGF0ZVwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgICAgICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIFwicmVwbGFjZVN0YXRlXCIpO1xuICAgICAgICB9LFxuICAgICAgICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgICAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBcInNldFN0YXRlXCIpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXNzaWduID0gT2JqZWN0LmFzc2lnbixcbiAgICAgIGVtcHR5T2JqZWN0ID0ge307XG4gICAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwib2JqZWN0XCIgIT09IHR5cGVvZiBwYXJ0aWFsU3RhdGUgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgcGFydGlhbFN0YXRlICYmXG4gICAgICAgIG51bGwgIT0gcGFydGlhbFN0YXRlXG4gICAgICApXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIFwidGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3IgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuXCJcbiAgICAgICAgKTtcbiAgICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcywgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgXCJzZXRTdGF0ZVwiKTtcbiAgICB9O1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcywgY2FsbGJhY2ssIFwiZm9yY2VVcGRhdGVcIik7XG4gICAgfTtcbiAgICB2YXIgZGVwcmVjYXRlZEFQSXMgPSB7XG4gICAgICAgIGlzTW91bnRlZDogW1xuICAgICAgICAgIFwiaXNNb3VudGVkXCIsXG4gICAgICAgICAgXCJJbnN0ZWFkLCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAgc3Vic2NyaXB0aW9ucyBhbmQgcGVuZGluZyByZXF1ZXN0cyBpbiBjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cIlxuICAgICAgICBdLFxuICAgICAgICByZXBsYWNlU3RhdGU6IFtcbiAgICAgICAgICBcInJlcGxhY2VTdGF0ZVwiLFxuICAgICAgICAgIFwiUmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBzZXRTdGF0ZSBpbnN0ZWFkIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS5cIlxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgZm5OYW1lO1xuICAgIGZvciAoZm5OYW1lIGluIGRlcHJlY2F0ZWRBUElzKVxuICAgICAgZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSAmJlxuICAgICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICBDb21wb25lbnREdW1teS5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICAgIGRlcHJlY2F0ZWRBUElzID0gUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50RHVtbXkoKTtcbiAgICBkZXByZWNhdGVkQVBJcy5jb25zdHJ1Y3RvciA9IFB1cmVDb21wb25lbnQ7XG4gICAgYXNzaWduKGRlcHJlY2F0ZWRBUElzLCBDb21wb25lbnQucHJvdG90eXBlKTtcbiAgICBkZXByZWNhdGVkQVBJcy5pc1B1cmVSZWFjdENvbXBvbmVudCA9ICEwO1xuICAgIHZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXksXG4gICAgICBSRUFDVF9DTElFTlRfUkVGRVJFTkNFJDIgPSBTeW1ib2wuZm9yKFwicmVhY3QuY2xpZW50LnJlZmVyZW5jZVwiKSxcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0ge1xuICAgICAgICBIOiBudWxsLFxuICAgICAgICBBOiBudWxsLFxuICAgICAgICBUOiBudWxsLFxuICAgICAgICBTOiBudWxsLFxuICAgICAgICBhY3RRdWV1ZTogbnVsbCxcbiAgICAgICAgaXNCYXRjaGluZ0xlZ2FjeTogITEsXG4gICAgICAgIGRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlOiAhMSxcbiAgICAgICAgZGlkVXNlUHJvbWlzZTogITEsXG4gICAgICAgIHRocm93bkVycm9yczogW10sXG4gICAgICAgIGdldEN1cnJlbnRTdGFjazogbnVsbFxuICAgICAgfSxcbiAgICAgIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgIFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UkMSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jbGllbnQucmVmZXJlbmNlXCIpLFxuICAgICAgZGlzYWJsZWREZXB0aCA9IDAsXG4gICAgICBwcmV2TG9nLFxuICAgICAgcHJldkluZm8sXG4gICAgICBwcmV2V2FybixcbiAgICAgIHByZXZFcnJvcixcbiAgICAgIHByZXZHcm91cCxcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCxcbiAgICAgIHByZXZHcm91cEVuZDtcbiAgICBkaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSAhMDtcbiAgICB2YXIgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgcmVlbnRyeSA9ICExO1xuICAgIHZhciBjb21wb25lbnRGcmFtZUNhY2hlID0gbmV3IChcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFdlYWtNYXAgPyBXZWFrTWFwIDogTWFwXG4gICAgKSgpO1xuICAgIHZhciBSRUFDVF9DTElFTlRfUkVGRVJFTkNFID0gU3ltYm9sLmZvcihcInJlYWN0LmNsaWVudC5yZWZlcmVuY2VcIiksXG4gICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bixcbiAgICAgIGRpZFdhcm5BYm91dE9sZEpTWFJ1bnRpbWU7XG4gICAgdmFyIGRpZFdhcm5BYm91dEVsZW1lbnRSZWYgPSB7fTtcbiAgICB2YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge30sXG4gICAgICBkaWRXYXJuQWJvdXRNYXBzID0gITEsXG4gICAgICB1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCA9IC9cXC8rL2csXG4gICAgICByZXBvcnRHbG9iYWxFcnJvciA9XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJlcG9ydEVycm9yXG4gICAgICAgICAgPyByZXBvcnRFcnJvclxuICAgICAgICAgIDogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2Ygd2luZG93ICYmXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygd2luZG93LkVycm9yRXZlbnRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gbmV3IHdpbmRvdy5FcnJvckV2ZW50KFwiZXJyb3JcIiwge1xuICAgICAgICAgICAgICAgICAgYnViYmxlczogITAsXG4gICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiAhMCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBlcnJvciAmJlxuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSBlcnJvciAmJlxuICAgICAgICAgICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgID8gU3RyaW5nKGVycm9yLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudCkpIHJldHVybjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgcHJvY2VzcyAmJlxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHByb2Nlc3MuZW1pdFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVtaXQoXCJ1bmNhdWdodEV4Y2VwdGlvblwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfSxcbiAgICAgIGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gITEsXG4gICAgICBlbnF1ZXVlVGFza0ltcGwgPSBudWxsLFxuICAgICAgYWN0U2NvcGVEZXB0aCA9IDAsXG4gICAgICBkaWRXYXJuTm9Bd2FpdEFjdCA9ICExLFxuICAgICAgaXNGbHVzaGluZyA9ICExLFxuICAgICAgcXVldWVTZXZlcmFsTWljcm90YXNrcyA9XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHF1ZXVlTWljcm90YXNrXG4gICAgICAgICAgPyBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBxdWV1ZU1pY3JvdGFzayhjYWxsYmFjayk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIDogZW5xdWV1ZVRhc2s7XG4gICAgZXhwb3J0cy5DaGlsZHJlbiA9IHtcbiAgICAgIG1hcDogbWFwQ2hpbGRyZW4sXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiAoY2hpbGRyZW4sIGZvckVhY2hGdW5jLCBmb3JFYWNoQ29udGV4dCkge1xuICAgICAgICBtYXBDaGlsZHJlbihcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBmb3JFYWNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZm9yRWFjaENvbnRleHRcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBjb3VudDogZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gICAgICAgIHZhciBuID0gMDtcbiAgICAgICAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBuKys7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH0sXG4gICAgICB0b0FycmF5OiBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICAgICAgfSkgfHwgW11cbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvbmx5OiBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKCFpc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIlJlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgfVxuICAgIH07XG4gICAgZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG4gICAgZXhwb3J0cy5GcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG4gICAgZXhwb3J0cy5Qcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG4gICAgZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gUHVyZUNvbXBvbmVudDtcbiAgICBleHBvcnRzLlN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xuICAgIGV4cG9ydHMuU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuICAgIGV4cG9ydHMuX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFID1cbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzO1xuICAgIGV4cG9ydHMuYWN0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICB2YXIgcHJldkFjdFF1ZXVlID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUsXG4gICAgICAgIHByZXZBY3RTY29wZURlcHRoID0gYWN0U2NvcGVEZXB0aDtcbiAgICAgIGFjdFNjb3BlRGVwdGgrKztcbiAgICAgIHZhciBxdWV1ZSA9IChSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSA9XG4gICAgICAgICAgbnVsbCAhPT0gcHJldkFjdFF1ZXVlID8gcHJldkFjdFF1ZXVlIDogW10pLFxuICAgICAgICBkaWRBd2FpdEFjdENhbGwgPSAhMTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjYWxsYmFjaygpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgfVxuICAgICAgaWYgKDAgPCBSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgKHBvcEFjdFNjb3BlKHByZXZBY3RRdWV1ZSwgcHJldkFjdFNjb3BlRGVwdGgpLFxuICAgICAgICAgIChjYWxsYmFjayA9IGFnZ3JlZ2F0ZUVycm9ycyhSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMpKSxcbiAgICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aCA9IDApLFxuICAgICAgICAgIGNhbGxiYWNrKVxuICAgICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBudWxsICE9PSByZXN1bHQgJiZcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHJlc3VsdCAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZXN1bHQudGhlblxuICAgICAgKSB7XG4gICAgICAgIHZhciB0aGVuYWJsZSA9IHJlc3VsdDtcbiAgICAgICAgcXVldWVTZXZlcmFsTWljcm90YXNrcyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZGlkQXdhaXRBY3RDYWxsIHx8XG4gICAgICAgICAgICBkaWRXYXJuTm9Bd2FpdEFjdCB8fFxuICAgICAgICAgICAgKChkaWRXYXJuTm9Bd2FpdEFjdCA9ICEwKSxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiWW91IGNhbGxlZCBhY3QoYXN5bmMgKCkgPT4gLi4uKSB3aXRob3V0IGF3YWl0LiBUaGlzIGNvdWxkIGxlYWQgdG8gdW5leHBlY3RlZCB0ZXN0aW5nIGJlaGF2aW91ciwgaW50ZXJsZWF2aW5nIG11bHRpcGxlIGFjdCBjYWxscyBhbmQgbWl4aW5nIHRoZWlyIHNjb3Blcy4gWW91IHNob3VsZCAtIGF3YWl0IGFjdChhc3luYyAoKSA9PiAuLi4pO1wiXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgZGlkQXdhaXRBY3RDYWxsID0gITA7XG4gICAgICAgICAgICB0aGVuYWJsZS50aGVuKFxuICAgICAgICAgICAgICBmdW5jdGlvbiAocmV0dXJuVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0UXVldWUsIHByZXZBY3RTY29wZURlcHRoKTtcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gcHJldkFjdFNjb3BlRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZsdXNoQWN0UXVldWUocXVldWUpLFxuICAgICAgICAgICAgICAgICAgICAgIGVucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IkMikge1xuICAgICAgICAgICAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMucHVzaChlcnJvciQyKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmICgwIDwgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX3Rocm93bkVycm9yID0gYWdncmVnYXRlRXJyb3JzKFxuICAgICAgICAgICAgICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9yc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KF90aHJvd25FcnJvcik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0UXVldWUsIHByZXZBY3RTY29wZURlcHRoKTtcbiAgICAgICAgICAgICAgICAwIDwgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgPyAoKGVycm9yID0gYWdncmVnYXRlRXJyb3JzKFxuICAgICAgICAgICAgICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9yc1xuICAgICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5sZW5ndGggPSAwKSxcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKSlcbiAgICAgICAgICAgICAgICAgIDogcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgcmV0dXJuVmFsdWUkanNjb21wJDAgPSByZXN1bHQ7XG4gICAgICBwb3BBY3RTY29wZShwcmV2QWN0UXVldWUsIHByZXZBY3RTY29wZURlcHRoKTtcbiAgICAgIDAgPT09IHByZXZBY3RTY29wZURlcHRoICYmXG4gICAgICAgIChmbHVzaEFjdFF1ZXVlKHF1ZXVlKSxcbiAgICAgICAgMCAhPT0gcXVldWUubGVuZ3RoICYmXG4gICAgICAgICAgcXVldWVTZXZlcmFsTWljcm90YXNrcyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkaWRBd2FpdEFjdENhbGwgfHxcbiAgICAgICAgICAgICAgZGlkV2Fybk5vQXdhaXRBY3QgfHxcbiAgICAgICAgICAgICAgKChkaWRXYXJuTm9Bd2FpdEFjdCA9ICEwKSxcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIkEgY29tcG9uZW50IHN1c3BlbmRlZCBpbnNpZGUgYW4gYGFjdGAgc2NvcGUsIGJ1dCB0aGUgYGFjdGAgY2FsbCB3YXMgbm90IGF3YWl0ZWQuIFdoZW4gdGVzdGluZyBSZWFjdCBjb21wb25lbnRzIHRoYXQgZGVwZW5kIG9uIGFzeW5jaHJvbm91cyBkYXRhLCB5b3UgbXVzdCBhd2FpdCB0aGUgcmVzdWx0OlxcblxcbmF3YWl0IGFjdCgoKSA9PiAuLi4pXCJcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgfSksXG4gICAgICAgIChSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSA9IG51bGwpKTtcbiAgICAgIGlmICgwIDwgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgKFxuICAgICAgICAgICgoY2FsbGJhY2sgPSBhZ2dyZWdhdGVFcnJvcnMoUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzKSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5sZW5ndGggPSAwKSxcbiAgICAgICAgICBjYWxsYmFjaylcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBkaWRBd2FpdEFjdENhbGwgPSAhMDtcbiAgICAgICAgICAwID09PSBwcmV2QWN0U2NvcGVEZXB0aFxuICAgICAgICAgICAgPyAoKFJlYWN0U2hhcmVkSW50ZXJuYWxzLmFjdFF1ZXVlID0gcXVldWUpLFxuICAgICAgICAgICAgICBlbnF1ZXVlVGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsoXG4gICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSRqc2NvbXAkMCxcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgICAgICByZWplY3RcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIDogcmVzb2x2ZShyZXR1cm5WYWx1ZSRqc2NvbXAkMCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICBleHBvcnRzLmNhY2hlID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfTtcbiAgICBleHBvcnRzLmNsb25lRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gICAgICBpZiAobnVsbCA9PT0gZWxlbWVudCB8fCB2b2lkIDAgPT09IGVsZW1lbnQpXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIFwiVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCBcIiArXG4gICAgICAgICAgICBlbGVtZW50ICtcbiAgICAgICAgICAgIFwiLlwiXG4gICAgICAgICk7XG4gICAgICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpLFxuICAgICAgICBrZXkgPSBlbGVtZW50LmtleSxcbiAgICAgICAgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIGlmIChudWxsICE9IGNvbmZpZykge1xuICAgICAgICB2YXIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0O1xuICAgICAgICBhOiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIFwicmVmXCIpICYmXG4gICAgICAgICAgICAoSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICBcInJlZlwiXG4gICAgICAgICAgICApLmdldCkgJiZcbiAgICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdC5pc1JlYWN0V2FybmluZ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gITE7XG4gICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgIH1cbiAgICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSB2b2lkIDAgIT09IGNvbmZpZy5yZWY7XG4gICAgICAgIH1cbiAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ICYmIChvd25lciA9IGdldE93bmVyKCkpO1xuICAgICAgICBoYXNWYWxpZEtleShjb25maWcpICYmXG4gICAgICAgICAgKGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSksIChrZXkgPSBcIlwiICsgY29uZmlnLmtleSkpO1xuICAgICAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZylcbiAgICAgICAgICAhaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSB8fFxuICAgICAgICAgICAgXCJrZXlcIiA9PT0gcHJvcE5hbWUgfHxcbiAgICAgICAgICAgIFwiX19zZWxmXCIgPT09IHByb3BOYW1lIHx8XG4gICAgICAgICAgICBcIl9fc291cmNlXCIgPT09IHByb3BOYW1lIHx8XG4gICAgICAgICAgICAoXCJyZWZcIiA9PT0gcHJvcE5hbWUgJiYgdm9pZCAwID09PSBjb25maWcucmVmKSB8fFxuICAgICAgICAgICAgKHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV0pO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BOYW1lID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG4gICAgICBpZiAoMSA9PT0gcHJvcE5hbWUpIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICBlbHNlIGlmICgxIDwgcHJvcE5hbWUpIHtcbiAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gQXJyYXkocHJvcE5hbWUpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BOYW1lOyBpKyspXG4gICAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICAgICAgcHJvcHMuY2hpbGRyZW4gPSBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQ7XG4gICAgICB9XG4gICAgICBwcm9wcyA9IFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUsIGtleSwgdm9pZCAwLCB2b2lkIDAsIG93bmVyLCBwcm9wcyk7XG4gICAgICBmb3IgKGtleSA9IDI7IGtleSA8IGFyZ3VtZW50cy5sZW5ndGg7IGtleSsrKVxuICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNba2V5XSwgcHJvcHMudHlwZSk7XG4gICAgICByZXR1cm4gcHJvcHM7XG4gICAgfTtcbiAgICBleHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBmdW5jdGlvbiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICBkZWZhdWx0VmFsdWUgPSB7XG4gICAgICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgICAgIF9jdXJyZW50VmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgX2N1cnJlbnRWYWx1ZTI6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgX3RocmVhZENvdW50OiAwLFxuICAgICAgICBQcm92aWRlcjogbnVsbCxcbiAgICAgICAgQ29uc3VtZXI6IG51bGxcbiAgICAgIH07XG4gICAgICBkZWZhdWx0VmFsdWUuUHJvdmlkZXIgPSBkZWZhdWx0VmFsdWU7XG4gICAgICBkZWZhdWx0VmFsdWUuQ29uc3VtZXIgPSB7XG4gICAgICAgICQkdHlwZW9mOiBSRUFDVF9DT05TVU1FUl9UWVBFLFxuICAgICAgICBfY29udGV4dDogZGVmYXVsdFZhbHVlXG4gICAgICB9O1xuICAgICAgZGVmYXVsdFZhbHVlLl9jdXJyZW50UmVuZGVyZXIgPSBudWxsO1xuICAgICAgZGVmYXVsdFZhbHVlLl9jdXJyZW50UmVuZGVyZXIyID0gbnVsbDtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfTtcbiAgICBleHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwgY29uZmlnLCBjaGlsZHJlbikge1xuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSlcbiAgICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpID0gXCJcIjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHZvaWQgMCA9PT0gdHlwZSB8fFxuICAgICAgICAgIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gdHlwZSAmJlxuICAgICAgICAgICAgMCA9PT0gT2JqZWN0LmtleXModHlwZSkubGVuZ3RoKVxuICAgICAgICApXG4gICAgICAgICAgaSArPVxuICAgICAgICAgICAgXCIgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgICAgICBpZiAobnVsbCA9PT0gdHlwZSkgdmFyIHR5cGVTdHJpbmcgPSBcIm51bGxcIjtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGlzQXJyYXlJbXBsKHR5cGUpXG4gICAgICAgICAgICA/ICh0eXBlU3RyaW5nID0gXCJhcnJheVwiKVxuICAgICAgICAgICAgOiB2b2lkIDAgIT09IHR5cGUgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFXG4gICAgICAgICAgICAgID8gKCh0eXBlU3RyaW5nID1cbiAgICAgICAgICAgICAgICAgIFwiPFwiICtcbiAgICAgICAgICAgICAgICAgIChnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCBcIlVua25vd25cIikgK1xuICAgICAgICAgICAgICAgICAgXCIgLz5cIiksXG4gICAgICAgICAgICAgICAgKGkgPVxuICAgICAgICAgICAgICAgICAgXCIgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD9cIikpXG4gICAgICAgICAgICAgIDogKHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJSZWFjdC5jcmVhdGVFbGVtZW50OiB0eXBlIGlzIGludmFsaWQgLS0gZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzXCIsXG4gICAgICAgICAgdHlwZVN0cmluZyxcbiAgICAgICAgICBpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcE5hbWU7XG4gICAgICBpID0ge307XG4gICAgICB0eXBlU3RyaW5nID0gbnVsbDtcbiAgICAgIGlmIChudWxsICE9IGNvbmZpZylcbiAgICAgICAgZm9yIChwcm9wTmFtZSBpbiAoZGlkV2FybkFib3V0T2xkSlNYUnVudGltZSB8fFxuICAgICAgICAgICEoXCJfX3NlbGZcIiBpbiBjb25maWcpIHx8XG4gICAgICAgICAgXCJrZXlcIiBpbiBjb25maWcgfHxcbiAgICAgICAgICAoKGRpZFdhcm5BYm91dE9sZEpTWFJ1bnRpbWUgPSAhMCksXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJZb3VyIGFwcCAob3Igb25lIG9mIGl0cyBkZXBlbmRlbmNpZXMpIGlzIHVzaW5nIGFuIG91dGRhdGVkIEpTWCB0cmFuc2Zvcm0uIFVwZGF0ZSB0byB0aGUgbW9kZXJuIEpTWCB0cmFuc2Zvcm0gZm9yIGZhc3RlciBwZXJmb3JtYW5jZTogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9uZXctanN4LXRyYW5zZm9ybVwiXG4gICAgICAgICAgKSksXG4gICAgICAgIGhhc1ZhbGlkS2V5KGNvbmZpZykgJiZcbiAgICAgICAgICAoY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KSwgKHR5cGVTdHJpbmcgPSBcIlwiICsgY29uZmlnLmtleSkpLFxuICAgICAgICBjb25maWcpKVxuICAgICAgICAgIGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiZcbiAgICAgICAgICAgIFwia2V5XCIgIT09IHByb3BOYW1lICYmXG4gICAgICAgICAgICBcIl9fc2VsZlwiICE9PSBwcm9wTmFtZSAmJlxuICAgICAgICAgICAgXCJfX3NvdXJjZVwiICE9PSBwcm9wTmFtZSAmJlxuICAgICAgICAgICAgKGlbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXSk7XG4gICAgICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgICAgIGlmICgxID09PSBjaGlsZHJlbkxlbmd0aCkgaS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgZWxzZSBpZiAoMSA8IGNoaWxkcmVuTGVuZ3RoKSB7XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCksIF9pID0gMDtcbiAgICAgICAgICBfaSA8IGNoaWxkcmVuTGVuZ3RoO1xuICAgICAgICAgIF9pKytcbiAgICAgICAgKVxuICAgICAgICAgIGNoaWxkQXJyYXlbX2ldID0gYXJndW1lbnRzW19pICsgMl07XG4gICAgICAgIE9iamVjdC5mcmVlemUgJiYgT2JqZWN0LmZyZWV6ZShjaGlsZEFycmF5KTtcbiAgICAgICAgaS5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9wcylcbiAgICAgICAgZm9yIChwcm9wTmFtZSBpbiAoKGNoaWxkcmVuTGVuZ3RoID0gdHlwZS5kZWZhdWx0UHJvcHMpLCBjaGlsZHJlbkxlbmd0aCkpXG4gICAgICAgICAgdm9pZCAwID09PSBpW3Byb3BOYW1lXSAmJiAoaVtwcm9wTmFtZV0gPSBjaGlsZHJlbkxlbmd0aFtwcm9wTmFtZV0pO1xuICAgICAgdHlwZVN0cmluZyAmJlxuICAgICAgICBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihcbiAgICAgICAgICBpLFxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHR5cGVcbiAgICAgICAgICAgID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgXCJVbmtub3duXCJcbiAgICAgICAgICAgIDogdHlwZVxuICAgICAgICApO1xuICAgICAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCB0eXBlU3RyaW5nLCB2b2lkIDAsIHZvaWQgMCwgZ2V0T3duZXIoKSwgaSk7XG4gICAgfTtcbiAgICBleHBvcnRzLmNyZWF0ZVJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByZWZPYmplY3QgPSB7IGN1cnJlbnQ6IG51bGwgfTtcbiAgICAgIE9iamVjdC5zZWFsKHJlZk9iamVjdCk7XG4gICAgICByZXR1cm4gcmVmT2JqZWN0O1xuICAgIH07XG4gICAgZXhwb3J0cy5mb3J3YXJkUmVmID0gZnVuY3Rpb24gKHJlbmRlcikge1xuICAgICAgbnVsbCAhPSByZW5kZXIgJiYgcmVuZGVyLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEVcbiAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCByZWNlaXZlZCBhIGBtZW1vYCBjb21wb25lbnQuIEluc3RlYWQgb2YgZm9yd2FyZFJlZihtZW1vKC4uLikpLCB1c2UgbWVtbyhmb3J3YXJkUmVmKC4uLikpLlwiXG4gICAgICAgICAgKVxuICAgICAgICA6IFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHJlbmRlclxuICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCB3YXMgZ2l2ZW4gJXMuXCIsXG4gICAgICAgICAgICAgIG51bGwgPT09IHJlbmRlciA/IFwibnVsbFwiIDogdHlwZW9mIHJlbmRlclxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogMCAhPT0gcmVuZGVyLmxlbmd0aCAmJlxuICAgICAgICAgICAgMiAhPT0gcmVuZGVyLmxlbmd0aCAmJlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgYWNjZXB0IGV4YWN0bHkgdHdvIHBhcmFtZXRlcnM6IHByb3BzIGFuZCByZWYuICVzXCIsXG4gICAgICAgICAgICAgIDEgPT09IHJlbmRlci5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IFwiRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyP1wiXG4gICAgICAgICAgICAgICAgOiBcIkFueSBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aWxsIGJlIHVuZGVmaW5lZC5cIlxuICAgICAgICAgICAgKTtcbiAgICAgIG51bGwgIT0gcmVuZGVyICYmXG4gICAgICAgIG51bGwgIT0gcmVuZGVyLmRlZmF1bHRQcm9wcyAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGRvIG5vdCBzdXBwb3J0IGRlZmF1bHRQcm9wcy4gRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyBhIFJlYWN0IGNvbXBvbmVudD9cIlxuICAgICAgICApO1xuICAgICAgdmFyIGVsZW1lbnRUeXBlID0geyAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSwgcmVuZGVyOiByZW5kZXIgfSxcbiAgICAgICAgb3duTmFtZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgXCJkaXNwbGF5TmFtZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gb3duTmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgIG93bk5hbWUgPSBuYW1lO1xuICAgICAgICAgIHJlbmRlci5uYW1lIHx8XG4gICAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgfHxcbiAgICAgICAgICAgIChPYmplY3QuZGVmaW5lUHJvcGVydHkocmVuZGVyLCBcIm5hbWVcIiwgeyB2YWx1ZTogbmFtZSB9KSxcbiAgICAgICAgICAgIChyZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGVsZW1lbnRUeXBlO1xuICAgIH07XG4gICAgZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuICAgIGV4cG9ydHMubGF6eSA9IGZ1bmN0aW9uIChjdG9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfTEFaWV9UWVBFLFxuICAgICAgICBfcGF5bG9hZDogeyBfc3RhdHVzOiAtMSwgX3Jlc3VsdDogY3RvciB9LFxuICAgICAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gICAgICB9O1xuICAgIH07XG4gICAgZXhwb3J0cy5tZW1vID0gZnVuY3Rpb24gKHR5cGUsIGNvbXBhcmUpIHtcbiAgICAgIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB8fFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwibWVtbzogVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBjb21wb25lbnQuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzXCIsXG4gICAgICAgICAgbnVsbCA9PT0gdHlwZSA/IFwibnVsbFwiIDogdHlwZW9mIHR5cGVcbiAgICAgICAgKTtcbiAgICAgIGNvbXBhcmUgPSB7XG4gICAgICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGNvbXBhcmU6IHZvaWQgMCA9PT0gY29tcGFyZSA/IG51bGwgOiBjb21wYXJlXG4gICAgICB9O1xuICAgICAgdmFyIG93bk5hbWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29tcGFyZSwgXCJkaXNwbGF5TmFtZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gb3duTmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgIG93bk5hbWUgPSBuYW1lO1xuICAgICAgICAgIHR5cGUubmFtZSB8fFxuICAgICAgICAgICAgdHlwZS5kaXNwbGF5TmFtZSB8fFxuICAgICAgICAgICAgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcIm5hbWVcIiwgeyB2YWx1ZTogbmFtZSB9KSxcbiAgICAgICAgICAgICh0eXBlLmRpc3BsYXlOYW1lID0gbmFtZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb21wYXJlO1xuICAgIH07XG4gICAgZXhwb3J0cy5zdGFydFRyYW5zaXRpb24gPSBmdW5jdGlvbiAoc2NvcGUpIHtcbiAgICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQsXG4gICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uID0ge307XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gY3VycmVudFRyYW5zaXRpb247XG4gICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHNjb3BlKCksXG4gICAgICAgICAgb25TdGFydFRyYW5zaXRpb25GaW5pc2ggPSBSZWFjdFNoYXJlZEludGVybmFscy5TO1xuICAgICAgICBudWxsICE9PSBvblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCAmJlxuICAgICAgICAgIG9uU3RhcnRUcmFuc2l0aW9uRmluaXNoKGN1cnJlbnRUcmFuc2l0aW9uLCByZXR1cm5WYWx1ZSk7XG4gICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiByZXR1cm5WYWx1ZSAmJlxuICAgICAgICAgIG51bGwgIT09IHJldHVyblZhbHVlICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcmV0dXJuVmFsdWUudGhlbiAmJlxuICAgICAgICAgIHJldHVyblZhbHVlLnRoZW4obm9vcCwgcmVwb3J0R2xvYmFsRXJyb3IpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVwb3J0R2xvYmFsRXJyb3IoZXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgbnVsbCA9PT0gcHJldlRyYW5zaXRpb24gJiZcbiAgICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyAmJlxuICAgICAgICAgICgoc2NvcGUgPSBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5zaXplKSxcbiAgICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpLFxuICAgICAgICAgIDEwIDwgc2NvcGUgJiZcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgXCJEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uIElmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuIE90aGVyd2lzZSBjb25jdXJyZW50IG1vZGUgZ3VhcmFudGVlcyBhcmUgb2ZmIHRoZSB0YWJsZS5cIlxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBwcmV2VHJhbnNpdGlvbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX3VzZUNhY2hlUmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZUNhY2hlUmVmcmVzaCgpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2UgPSBmdW5jdGlvbiAodXNhYmxlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2UodXNhYmxlKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlQWN0aW9uU3RhdGUgPSBmdW5jdGlvbiAoYWN0aW9uLCBpbml0aWFsU3RhdGUsIHBlcm1hbGluaykge1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXNwYXRjaGVyKCkudXNlQWN0aW9uU3RhdGUoXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgICBwZXJtYWxpbmtcbiAgICAgICk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZUNhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZUNvbnRleHQgPSBmdW5jdGlvbiAoQ29udGV4dCkge1xuICAgICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICAgICAgQ29udGV4dC4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OU1VNRVJfVFlQRSAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuQ29uc3VtZXIpIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgYnVncy4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkP1wiXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlID0gZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXNwYXRjaGVyKCkudXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VEZWZlcnJlZFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZURlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZUVmZmVjdCA9IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VJZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZUlkKCk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGUgPSBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VJbnNlcnRpb25FZmZlY3QgPSBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlTGF5b3V0RWZmZWN0ID0gZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXNwYXRjaGVyKCkudXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZU1lbW8gPSBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZU9wdGltaXN0aWMgPSBmdW5jdGlvbiAocGFzc3Rocm91Z2gsIHJlZHVjZXIpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZU9wdGltaXN0aWMocGFzc3Rocm91Z2gsIHJlZHVjZXIpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VSZWR1Y2VyID0gZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZVJlZiA9IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZVJlZihpbml0aWFsVmFsdWUpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VTdGF0ZSA9IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlID0gZnVuY3Rpb24gKFxuICAgICAgc3Vic2NyaWJlLFxuICAgICAgZ2V0U25hcHNob3QsXG4gICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICkge1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXNwYXRjaGVyKCkudXNlU3luY0V4dGVybmFsU3RvcmUoXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgIGdldFNlcnZlclNuYXBzaG90XG4gICAgICApO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VUcmFuc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXNwYXRjaGVyKCkudXNlVHJhbnNpdGlvbigpO1xuICAgIH07XG4gICAgZXhwb3J0cy52ZXJzaW9uID0gXCIxOS4wLjBcIjtcbiAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09XG4gICAgICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChFcnJvcigpKTtcbiAgfSkoKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtanN4LWRldi1ydW50aW1lLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gICAgICBpZiAobnVsbCA9PSB0eXBlKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICByZXR1cm4gdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQyXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICAgICAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiB0eXBlKSByZXR1cm4gdHlwZTtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiRnJhZ21lbnRcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJQb3J0YWxcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIlByb2ZpbGVyXCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJTdHJpY3RNb2RlXCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJTdXNwZW5zZVwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJTdXNwZW5zZUxpc3RcIjtcbiAgICAgIH1cbiAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSlcbiAgICAgICAgc3dpdGNoIChcbiAgICAgICAgICAoXCJudW1iZXJcIiA9PT0gdHlwZW9mIHR5cGUudGFnICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIlJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICAgICksXG4gICAgICAgICAgdHlwZS4kJHR5cGVvZilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKHR5cGUuZGlzcGxheU5hbWUgfHwgXCJDb250ZXh0XCIpICsgXCIuUHJvdmlkZXJcIjtcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTlNVTUVSX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKHR5cGUuX2NvbnRleHQuZGlzcGxheU5hbWUgfHwgXCJDb250ZXh0XCIpICsgXCIuQ29uc3VtZXJcIjtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICB2YXIgaW5uZXJUeXBlID0gdHlwZS5yZW5kZXI7XG4gICAgICAgICAgICB0eXBlID0gdHlwZS5kaXNwbGF5TmFtZTtcbiAgICAgICAgICAgIHR5cGUgfHxcbiAgICAgICAgICAgICAgKCh0eXBlID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8IFwiXCIpLFxuICAgICAgICAgICAgICAodHlwZSA9IFwiXCIgIT09IHR5cGUgPyBcIkZvcndhcmRSZWYoXCIgKyB0eXBlICsgXCIpXCIgOiBcIkZvcndhcmRSZWZcIikpO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoaW5uZXJUeXBlID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gaW5uZXJUeXBlXG4gICAgICAgICAgICAgICAgPyBpbm5lclR5cGVcbiAgICAgICAgICAgICAgICA6IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8IFwiTWVtb1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgaW5uZXJUeXBlID0gdHlwZS5fcGF5bG9hZDtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLl9pbml0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKGlubmVyVHlwZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIFwiXCIgKyB2YWx1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9ICExO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSAhMDtcbiAgICAgIH1cbiAgICAgIGlmIChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQpIHtcbiAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gY29uc29sZTtcbiAgICAgICAgdmFyIEpTQ29tcGlsZXJfdGVtcF9jb25zdCA9IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdC5lcnJvcjtcbiAgICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCRqc2NvbXAkMCA9XG4gICAgICAgICAgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFN5bWJvbCAmJlxuICAgICAgICAgICAgU3ltYm9sLnRvU3RyaW5nVGFnICYmXG4gICAgICAgICAgICB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddKSB8fFxuICAgICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHxcbiAgICAgICAgICBcIk9iamVjdFwiO1xuICAgICAgICBKU0NvbXBpbGVyX3RlbXBfY29uc3QuY2FsbChcbiAgICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQsXG4gICAgICAgICAgXCJUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSB1c2luZyBpdCBoZXJlLlwiLFxuICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCRqc2NvbXAkMFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuICAgIGZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICAgICAgaWYgKDAgPT09IGRpc2FibGVkRGVwdGgpIHtcbiAgICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7XG4gICAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgICB3cml0YWJsZTogITBcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZGlzYWJsZWREZXB0aCsrO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gICAgICBkaXNhYmxlZERlcHRoLS07XG4gICAgICBpZiAoMCA9PT0gZGlzYWJsZWREZXB0aCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB7IGNvbmZpZ3VyYWJsZTogITAsIGVudW1lcmFibGU6ICEwLCB3cml0YWJsZTogITAgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICAgIGxvZzogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkxvZyB9KSxcbiAgICAgICAgICBpbmZvOiBhc3NpZ24oe30sIHByb3BzLCB7IHZhbHVlOiBwcmV2SW5mbyB9KSxcbiAgICAgICAgICB3YXJuOiBhc3NpZ24oe30sIHByb3BzLCB7IHZhbHVlOiBwcmV2V2FybiB9KSxcbiAgICAgICAgICBlcnJvcjogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkVycm9yIH0pLFxuICAgICAgICAgIGdyb3VwOiBhc3NpZ24oe30sIHByb3BzLCB7IHZhbHVlOiBwcmV2R3JvdXAgfSksXG4gICAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZCB9KSxcbiAgICAgICAgICBncm91cEVuZDogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkdyb3VwRW5kIH0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgMCA+IGRpc2FibGVkRGVwdGggJiZcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcImRpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSB7XG4gICAgICBpZiAodm9pZCAwID09PSBwcmVmaXgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIHZhciBtYXRjaCA9IHguc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7XG4gICAgICAgICAgcHJlZml4ID0gKG1hdGNoICYmIG1hdGNoWzFdKSB8fCBcIlwiO1xuICAgICAgICAgIHN1ZmZpeCA9XG4gICAgICAgICAgICAtMSA8IHguc3RhY2suaW5kZXhPZihcIlxcbiAgICBhdFwiKVxuICAgICAgICAgICAgICA/IFwiICg8YW5vbnltb3VzPilcIlxuICAgICAgICAgICAgICA6IC0xIDwgeC5zdGFjay5pbmRleE9mKFwiQFwiKVxuICAgICAgICAgICAgICAgID8gXCJAdW5rbm93bjowOjBcIlxuICAgICAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgfVxuICAgICAgcmV0dXJuIFwiXFxuXCIgKyBwcmVmaXggKyBuYW1lICsgc3VmZml4O1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgICAgIGlmICghZm4gfHwgcmVlbnRyeSkgcmV0dXJuIFwiXCI7XG4gICAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG4gICAgICBpZiAodm9pZCAwICE9PSBmcmFtZSkgcmV0dXJuIGZyYW1lO1xuICAgICAgcmVlbnRyeSA9ICEwO1xuICAgICAgZnJhbWUgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtcbiAgICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdm9pZCAwO1xuICAgICAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlciA9IG51bGw7XG4gICAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IG51bGw7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIFJ1bkluUm9vdEZyYW1lID0ge1xuICAgICAgICAgIERldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgICAgICAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgXCJwcm9wc1wiLCB7XG4gICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIFJlZmxlY3QgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRyb2wgPSB4O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoICh4JDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IHgkMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoICh4JDEpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSB4JDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIChGYWtlID0gZm4oKSkgJiZcbiAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIEZha2UuY2F0Y2ggJiZcbiAgICAgICAgICAgICAgICAgIEZha2UuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAgICAgICAgICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIFwic3RyaW5nXCIgPT09IHR5cGVvZiBzYW1wbGUuc3RhY2spXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtzYW1wbGUuc3RhY2ssIGNvbnRyb2wuc3RhY2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdC5kaXNwbGF5TmFtZSA9XG4gICAgICAgICAgXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIjtcbiAgICAgICAgdmFyIG5hbWVQcm9wRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LFxuICAgICAgICAgIFwibmFtZVwiXG4gICAgICAgICk7XG4gICAgICAgIG5hbWVQcm9wRGVzY3JpcHRvciAmJlxuICAgICAgICAgIG5hbWVQcm9wRGVzY3JpcHRvci5jb25maWd1cmFibGUgJiZcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QsXG4gICAgICAgICAgICBcIm5hbWVcIixcbiAgICAgICAgICAgIHsgdmFsdWU6IFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCIgfVxuICAgICAgICAgICk7XG4gICAgICAgIHZhciBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPVxuICAgICAgICAgICAgUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290KCksXG4gICAgICAgICAgc2FtcGxlU3RhY2sgPSBfUnVuSW5Sb290RnJhbWUkRGV0ZXJbMF0sXG4gICAgICAgICAgY29udHJvbFN0YWNrID0gX1J1bkluUm9vdEZyYW1lJERldGVyWzFdO1xuICAgICAgICBpZiAoc2FtcGxlU3RhY2sgJiYgY29udHJvbFN0YWNrKSB7XG4gICAgICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlU3RhY2suc3BsaXQoXCJcXG5cIiksXG4gICAgICAgICAgICBjb250cm9sTGluZXMgPSBjb250cm9sU3RhY2suc3BsaXQoXCJcXG5cIik7XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlciA9IG5hbWVQcm9wRGVzY3JpcHRvciA9IDA7XG4gICAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IgPCBzYW1wbGVMaW5lcy5sZW5ndGggJiZcbiAgICAgICAgICAgICFzYW1wbGVMaW5lc1tuYW1lUHJvcERlc2NyaXB0b3JdLmluY2x1ZGVzKFxuICAgICAgICAgICAgICBcIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdFwiXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbmFtZVByb3BEZXNjcmlwdG9yKys7XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlciA8IGNvbnRyb2xMaW5lcy5sZW5ndGggJiZcbiAgICAgICAgICAgICFjb250cm9sTGluZXNbX1J1bkluUm9vdEZyYW1lJERldGVyXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIlxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIClcbiAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlcisrO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG5hbWVQcm9wRGVzY3JpcHRvciA9PT0gc2FtcGxlTGluZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPT09IGNvbnRyb2xMaW5lcy5sZW5ndGhcbiAgICAgICAgICApXG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxLFxuICAgICAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlciA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAxIDw9IG5hbWVQcm9wRGVzY3JpcHRvciAmJlxuICAgICAgICAgICAgICAwIDw9IF9SdW5JblJvb3RGcmFtZSREZXRlciAmJlxuICAgICAgICAgICAgICBzYW1wbGVMaW5lc1tuYW1lUHJvcERlc2NyaXB0b3JdICE9PVxuICAgICAgICAgICAgICAgIGNvbnRyb2xMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdO1xuXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlci0tO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICA7XG4gICAgICAgICAgICAxIDw9IG5hbWVQcm9wRGVzY3JpcHRvciAmJiAwIDw9IF9SdW5JblJvb3RGcmFtZSREZXRlcjtcbiAgICAgICAgICAgIG5hbWVQcm9wRGVzY3JpcHRvci0tLCBfUnVuSW5Sb290RnJhbWUkRGV0ZXItLVxuICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgc2FtcGxlTGluZXNbbmFtZVByb3BEZXNjcmlwdG9yXSAhPT1cbiAgICAgICAgICAgICAgY29udHJvbExpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl1cbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpZiAoMSAhPT0gbmFtZVByb3BEZXNjcmlwdG9yIHx8IDEgIT09IF9SdW5JblJvb3RGcmFtZSREZXRlcikge1xuICAgICAgICAgICAgICAgIGRvXG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIChuYW1lUHJvcERlc2NyaXB0b3ItLSxcbiAgICAgICAgICAgICAgICAgICAgX1J1bkluUm9vdEZyYW1lJERldGVyLS0sXG4gICAgICAgICAgICAgICAgICAgIDAgPiBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVMaW5lc1tuYW1lUHJvcERlc2NyaXB0b3JdICE9PVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbExpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl0pXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgXCJcXG5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgc2FtcGxlTGluZXNbbmFtZVByb3BEZXNjcmlwdG9yXS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgYXQgbmV3IFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgYXQgXCJcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBmbi5kaXNwbGF5TmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgIF9mcmFtZS5pbmNsdWRlcyhcIjxhbm9ueW1vdXM+XCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgKF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKFwiPGFub255bW91cz5cIiwgZm4uZGlzcGxheU5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZm4gJiZcbiAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAoMSA8PSBuYW1lUHJvcERlc2NyaXB0b3IgJiYgMCA8PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAocmVlbnRyeSA9ICExKSxcbiAgICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZpb3VzRGlzcGF0Y2hlciksXG4gICAgICAgICAgcmVlbmFibGVMb2dzKCksXG4gICAgICAgICAgKEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gZnJhbWUpO1xuICAgICAgfVxuICAgICAgc2FtcGxlTGluZXMgPSAoc2FtcGxlTGluZXMgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiBcIlwiKVxuICAgICAgICA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHNhbXBsZUxpbmVzKVxuICAgICAgICA6IFwiXCI7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBmbiAmJiBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc2FtcGxlTGluZXMpO1xuICAgICAgcmV0dXJuIHNhbXBsZUxpbmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSkge1xuICAgICAgaWYgKG51bGwgPT0gdHlwZSkgcmV0dXJuIFwiXCI7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdHlwZSkge1xuICAgICAgICB2YXIgcHJvdG90eXBlID0gdHlwZS5wcm90b3R5cGU7XG4gICAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgISghcHJvdG90eXBlIHx8ICFwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSkgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJTdXNwZW5zZVwiKTtcbiAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKFwiU3VzcGVuc2VMaXN0XCIpO1xuICAgICAgfVxuICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKHR5cGUgPSBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyLCAhMSkpLCB0eXBlO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUpO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgcHJvdG90eXBlID0gdHlwZS5fcGF5bG9hZDtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLl9pbml0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlKHByb3RvdHlwZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldE93bmVyKCkge1xuICAgICAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5BO1xuICAgICAgcmV0dXJuIG51bGwgPT09IGRpc3BhdGNoZXIgPyBudWxsIDogZGlzcGF0Y2hlci5nZXRPd25lcigpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJrZXlcIikpIHtcbiAgICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCBcImtleVwiKS5nZXQ7XG4gICAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSByZXR1cm4gITE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwICE9PSBjb25maWcua2V5O1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgICAgIGZ1bmN0aW9uIHdhcm5BYm91dEFjY2Vzc2luZ0tleSgpIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gfHxcbiAgICAgICAgICAoKHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gITApLFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIiVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgdmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCBwcm9wLiAoaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9zcGVjaWFsLXByb3BzKVwiLFxuICAgICAgICAgICAgZGlzcGxheU5hbWVcbiAgICAgICAgICApKTtcbiAgICAgIH1cbiAgICAgIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9ICEwO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCBcImtleVwiLCB7XG4gICAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZWxlbWVudFJlZkdldHRlcldpdGhEZXByZWNhdGlvbldhcm5pbmcoKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0aGlzLnR5cGUpO1xuICAgICAgZGlkV2FybkFib3V0RWxlbWVudFJlZltjb21wb25lbnROYW1lXSB8fFxuICAgICAgICAoKGRpZFdhcm5BYm91dEVsZW1lbnRSZWZbY29tcG9uZW50TmFtZV0gPSAhMCksXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJBY2Nlc3NpbmcgZWxlbWVudC5yZWYgd2FzIHJlbW92ZWQgaW4gUmVhY3QgMTkuIHJlZiBpcyBub3cgYSByZWd1bGFyIHByb3AuIEl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBKU1ggRWxlbWVudCB0eXBlIGluIGEgZnV0dXJlIHJlbGVhc2UuXCJcbiAgICAgICAgKSk7XG4gICAgICBjb21wb25lbnROYW1lID0gdGhpcy5wcm9wcy5yZWY7XG4gICAgICByZXR1cm4gdm9pZCAwICE9PSBjb21wb25lbnROYW1lID8gY29tcG9uZW50TmFtZSA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gICAgICBzZWxmID0gcHJvcHMucmVmO1xuICAgICAgdHlwZSA9IHtcbiAgICAgICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIHByb3BzOiBwcm9wcyxcbiAgICAgICAgX293bmVyOiBvd25lclxuICAgICAgfTtcbiAgICAgIG51bGwgIT09ICh2b2lkIDAgIT09IHNlbGYgPyBzZWxmIDogbnVsbClcbiAgICAgICAgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgXCJyZWZcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgICAgICBnZXQ6IGVsZW1lbnRSZWZHZXR0ZXJXaXRoRGVwcmVjYXRpb25XYXJuaW5nXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgXCJyZWZcIiwgeyBlbnVtZXJhYmxlOiAhMSwgdmFsdWU6IG51bGwgfSk7XG4gICAgICB0eXBlLl9zdG9yZSA9IHt9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUuX3N0b3JlLCBcInZhbGlkYXRlZFwiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITEsXG4gICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICB3cml0YWJsZTogITAsXG4gICAgICAgIHZhbHVlOiAwXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcIl9kZWJ1Z0luZm9cIiwge1xuICAgICAgICBjb25maWd1cmFibGU6ICExLFxuICAgICAgICBlbnVtZXJhYmxlOiAhMSxcbiAgICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZnJlZXplICYmIChPYmplY3QuZnJlZXplKHR5cGUucHJvcHMpLCBPYmplY3QuZnJlZXplKHR5cGUpKTtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBqc3hERVZJbXBsKFxuICAgICAgdHlwZSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIG1heWJlS2V5LFxuICAgICAgaXNTdGF0aWNDaGlsZHJlbixcbiAgICAgIHNvdXJjZSxcbiAgICAgIHNlbGZcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHR5cGUgfHxcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdHlwZSB8fFxuICAgICAgICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHxcbiAgICAgICAgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fFxuICAgICAgICB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fFxuICAgICAgICB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fFxuICAgICAgICAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHR5cGUgJiZcbiAgICAgICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAgICAgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8XG4gICAgICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHxcbiAgICAgICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlNVTUVSX1RZUEUgfHxcbiAgICAgICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHxcbiAgICAgICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UkMSB8fFxuICAgICAgICAgICAgdm9pZCAwICE9PSB0eXBlLmdldE1vZHVsZUlkKSlcbiAgICAgICkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBjb25maWcuY2hpbGRyZW47XG4gICAgICAgIGlmICh2b2lkIDAgIT09IGNoaWxkcmVuKVxuICAgICAgICAgIGlmIChpc1N0YXRpY0NoaWxkcmVuKVxuICAgICAgICAgICAgaWYgKGlzQXJyYXlJbXBsKGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgIGlzU3RhdGljQ2hpbGRyZW4gPSAwO1xuICAgICAgICAgICAgICAgIGlzU3RhdGljQ2hpbGRyZW4gPCBjaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaXNTdGF0aWNDaGlsZHJlbisrXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhjaGlsZHJlbltpc1N0YXRpY0NoaWxkcmVuXSwgdHlwZSk7XG4gICAgICAgICAgICAgIE9iamVjdC5mcmVlemUgJiYgT2JqZWN0LmZyZWV6ZShjaGlsZHJlbik7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlJlYWN0LmpzeDogU3RhdGljIGNoaWxkcmVuIHNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXkuIFlvdSBhcmUgbGlrZWx5IGV4cGxpY2l0bHkgY2FsbGluZyBSZWFjdC5qc3hzIG9yIFJlYWN0LmpzeERFVi4gVXNlIHRoZSBCYWJlbCB0cmFuc2Zvcm0gaW5zdGVhZC5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIGVsc2UgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW4sIHR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGRyZW4gPSBcIlwiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdm9pZCAwID09PSB0eXBlIHx8XG4gICAgICAgICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlICYmXG4gICAgICAgICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAgICAgICAwID09PSBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGgpXG4gICAgICAgIClcbiAgICAgICAgICBjaGlsZHJlbiArPVxuICAgICAgICAgICAgXCIgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgICAgICBudWxsID09PSB0eXBlXG4gICAgICAgICAgPyAoaXNTdGF0aWNDaGlsZHJlbiA9IFwibnVsbFwiKVxuICAgICAgICAgIDogaXNBcnJheUltcGwodHlwZSlcbiAgICAgICAgICAgID8gKGlzU3RhdGljQ2hpbGRyZW4gPSBcImFycmF5XCIpXG4gICAgICAgICAgICA6IHZvaWQgMCAhPT0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVcbiAgICAgICAgICAgICAgPyAoKGlzU3RhdGljQ2hpbGRyZW4gPVxuICAgICAgICAgICAgICAgICAgXCI8XCIgK1xuICAgICAgICAgICAgICAgICAgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8IFwiVW5rbm93blwiKSArXG4gICAgICAgICAgICAgICAgICBcIiAvPlwiKSxcbiAgICAgICAgICAgICAgICAoY2hpbGRyZW4gPVxuICAgICAgICAgICAgICAgICAgXCIgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD9cIikpXG4gICAgICAgICAgICAgIDogKGlzU3RhdGljQ2hpbGRyZW4gPSB0eXBlb2YgdHlwZSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJSZWFjdC5qc3g6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yIGJ1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXNcIixcbiAgICAgICAgICBpc1N0YXRpY0NoaWxkcmVuLFxuICAgICAgICAgIGNoaWxkcmVuXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIFwia2V5XCIpKSB7XG4gICAgICAgIGNoaWxkcmVuID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGNvbmZpZykuZmlsdGVyKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgcmV0dXJuIFwia2V5XCIgIT09IGs7XG4gICAgICAgIH0pO1xuICAgICAgICBpc1N0YXRpY0NoaWxkcmVuID1cbiAgICAgICAgICAwIDwga2V5cy5sZW5ndGhcbiAgICAgICAgICAgID8gXCJ7a2V5OiBzb21lS2V5LCBcIiArIGtleXMuam9pbihcIjogLi4uLCBcIikgKyBcIjogLi4ufVwiXG4gICAgICAgICAgICA6IFwie2tleTogc29tZUtleX1cIjtcbiAgICAgICAgZGlkV2FybkFib3V0S2V5U3ByZWFkW2NoaWxkcmVuICsgaXNTdGF0aWNDaGlsZHJlbl0gfHxcbiAgICAgICAgICAoKGtleXMgPVxuICAgICAgICAgICAgMCA8IGtleXMubGVuZ3RoID8gXCJ7XCIgKyBrZXlzLmpvaW4oXCI6IC4uLiwgXCIpICsgXCI6IC4uLn1cIiA6IFwie31cIiksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICdBIHByb3BzIG9iamVjdCBjb250YWluaW5nIGEgXCJrZXlcIiBwcm9wIGlzIGJlaW5nIHNwcmVhZCBpbnRvIEpTWDpcXG4gIGxldCBwcm9wcyA9ICVzO1xcbiAgPCVzIHsuLi5wcm9wc30gLz5cXG5SZWFjdCBrZXlzIG11c3QgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIEpTWCB3aXRob3V0IHVzaW5nIHNwcmVhZDpcXG4gIGxldCBwcm9wcyA9ICVzO1xcbiAgPCVzIGtleT17c29tZUtleX0gey4uLnByb3BzfSAvPicsXG4gICAgICAgICAgICBpc1N0YXRpY0NoaWxkcmVuLFxuICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgICApLFxuICAgICAgICAgIChkaWRXYXJuQWJvdXRLZXlTcHJlYWRbY2hpbGRyZW4gKyBpc1N0YXRpY0NoaWxkcmVuXSA9ICEwKSk7XG4gICAgICB9XG4gICAgICBjaGlsZHJlbiA9IG51bGw7XG4gICAgICB2b2lkIDAgIT09IG1heWJlS2V5ICYmXG4gICAgICAgIChjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1heWJlS2V5KSwgKGNoaWxkcmVuID0gXCJcIiArIG1heWJlS2V5KSk7XG4gICAgICBoYXNWYWxpZEtleShjb25maWcpICYmXG4gICAgICAgIChjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpLCAoY2hpbGRyZW4gPSBcIlwiICsgY29uZmlnLmtleSkpO1xuICAgICAgaWYgKFwia2V5XCIgaW4gY29uZmlnKSB7XG4gICAgICAgIG1heWJlS2V5ID0ge307XG4gICAgICAgIGZvciAodmFyIHByb3BOYW1lIGluIGNvbmZpZylcbiAgICAgICAgICBcImtleVwiICE9PSBwcm9wTmFtZSAmJiAobWF5YmVLZXlbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXSk7XG4gICAgICB9IGVsc2UgbWF5YmVLZXkgPSBjb25maWc7XG4gICAgICBjaGlsZHJlbiAmJlxuICAgICAgICBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihcbiAgICAgICAgICBtYXliZUtleSxcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlXG4gICAgICAgICAgICA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IFwiVW5rbm93blwiXG4gICAgICAgICAgICA6IHR5cGVcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwgY2hpbGRyZW4sIHNlbGYsIHNvdXJjZSwgZ2V0T3duZXIoKSwgbWF5YmVLZXkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBub2RlICYmXG4gICAgICAgIG5vZGUgJiZcbiAgICAgICAgbm9kZS4kJHR5cGVvZiAhPT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRVxuICAgICAgKVxuICAgICAgICBpZiAoaXNBcnJheUltcGwobm9kZSkpXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuICAgICAgICAgICAgaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpXG4gICAgICAgICAgbm9kZS5fc3RvcmUgJiYgKG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IDEpO1xuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAobnVsbCA9PT0gbm9kZSB8fCBcIm9iamVjdFwiICE9PSB0eXBlb2Ygbm9kZVxuICAgICAgICAgICAgPyAoaSA9IG51bGwpXG4gICAgICAgICAgICA6ICgoaSA9XG4gICAgICAgICAgICAgICAgKE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBub2RlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0pIHx8XG4gICAgICAgICAgICAgICAgbm9kZVtcIkBAaXRlcmF0b3JcIl0pLFxuICAgICAgICAgICAgICAoaSA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGkgPyBpIDogbnVsbCkpLFxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGkgJiZcbiAgICAgICAgICAgIGkgIT09IG5vZGUuZW50cmllcyAmJlxuICAgICAgICAgICAgKChpID0gaS5jYWxsKG5vZGUpKSwgaSAhPT0gbm9kZSkpXG4gICAgICAgIClcbiAgICAgICAgICBmb3IgKDsgIShub2RlID0gaS5uZXh0KCkpLmRvbmU7IClcbiAgICAgICAgICAgIGlzVmFsaWRFbGVtZW50KG5vZGUudmFsdWUpICYmXG4gICAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkobm9kZS52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG9iamVjdCAmJlxuICAgICAgICBudWxsICE9PSBvYmplY3QgJiZcbiAgICAgICAgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICAgICAgaWYgKFxuICAgICAgICBlbGVtZW50Ll9zdG9yZSAmJlxuICAgICAgICAhZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkICYmXG4gICAgICAgIG51bGwgPT0gZWxlbWVudC5rZXkgJiZcbiAgICAgICAgKChlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSAxKSxcbiAgICAgICAgKHBhcmVudFR5cGUgPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpKSxcbiAgICAgICAgIW93bmVySGFzS2V5VXNlV2FybmluZ1twYXJlbnRUeXBlXSlcbiAgICAgICkge1xuICAgICAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbcGFyZW50VHlwZV0gPSAhMDtcbiAgICAgICAgdmFyIGNoaWxkT3duZXIgPSBcIlwiO1xuICAgICAgICBlbGVtZW50ICYmXG4gICAgICAgICAgbnVsbCAhPSBlbGVtZW50Ll9vd25lciAmJlxuICAgICAgICAgIGVsZW1lbnQuX293bmVyICE9PSBnZXRPd25lcigpICYmXG4gICAgICAgICAgKChjaGlsZE93bmVyID0gbnVsbCksXG4gICAgICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIGVsZW1lbnQuX293bmVyLnRhZ1xuICAgICAgICAgICAgPyAoY2hpbGRPd25lciA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShlbGVtZW50Ll9vd25lci50eXBlKSlcbiAgICAgICAgICAgIDogXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVsZW1lbnQuX293bmVyLm5hbWUgJiZcbiAgICAgICAgICAgICAgKGNoaWxkT3duZXIgPSBlbGVtZW50Ll9vd25lci5uYW1lKSxcbiAgICAgICAgICAoY2hpbGRPd25lciA9IFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgY2hpbGRPd25lciArIFwiLlwiKSk7XG4gICAgICAgIHZhciBwcmV2R2V0Q3VycmVudFN0YWNrID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuZ2V0Q3VycmVudFN0YWNrO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSk7XG4gICAgICAgICAgcHJldkdldEN1cnJlbnRTdGFjayAmJiAoc3RhY2sgKz0gcHJldkdldEN1cnJlbnRTdGFjaygpIHx8IFwiXCIpO1xuICAgICAgICAgIHJldHVybiBzdGFjaztcbiAgICAgICAgfTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAnRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLiVzJXMgU2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgICAgICAgcGFyZW50VHlwZSxcbiAgICAgICAgICBjaGlsZE93bmVyXG4gICAgICAgICk7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLmdldEN1cnJlbnRTdGFjayA9IHByZXZHZXRDdXJyZW50U3RhY2s7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICAgICAgdmFyIGluZm8gPSBcIlwiLFxuICAgICAgICBvd25lciA9IGdldE93bmVyKCk7XG4gICAgICBvd25lciAmJlxuICAgICAgICAob3duZXIgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3duZXIudHlwZSkpICYmXG4gICAgICAgIChpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgXCIgKyBvd25lciArIFwiYC5cIik7XG4gICAgICBpbmZvIHx8XG4gICAgICAgICgocGFyZW50VHlwZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShwYXJlbnRUeXBlKSkgJiZcbiAgICAgICAgICAoaW5mbyA9XG4gICAgICAgICAgICBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50VHlwZSArIFwiPi5cIikpO1xuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuICAgIHZhciBSZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKSxcbiAgICAgIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC50cmFuc2l0aW9uYWwuZWxlbWVudFwiKSxcbiAgICAgIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKSxcbiAgICAgIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuZnJhZ21lbnRcIiksXG4gICAgICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpLFxuICAgICAgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTtcbiAgICBTeW1ib2wuZm9yKFwicmVhY3QucHJvdmlkZXJcIik7XG4gICAgdmFyIFJFQUNUX0NPTlNVTUVSX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuY29uc3VtZXJcIiksXG4gICAgICBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxcbiAgICAgIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIiksXG4gICAgICBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpLFxuICAgICAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIiksXG4gICAgICBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKSxcbiAgICAgIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpLFxuICAgICAgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Qub2Zmc2NyZWVuXCIpLFxuICAgICAgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yLFxuICAgICAgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQyID0gU3ltYm9sLmZvcihcInJlYWN0LmNsaWVudC5yZWZlcmVuY2VcIiksXG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscyA9XG4gICAgICAgIFJlYWN0Ll9fQ0xJRU5UX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1dBUk5fVVNFUlNfVEhFWV9DQU5OT1RfVVBHUkFERSxcbiAgICAgIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgIGFzc2lnbiA9IE9iamVjdC5hc3NpZ24sXG4gICAgICBSRUFDVF9DTElFTlRfUkVGRVJFTkNFJDEgPSBTeW1ib2wuZm9yKFwicmVhY3QuY2xpZW50LnJlZmVyZW5jZVwiKSxcbiAgICAgIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheSxcbiAgICAgIGRpc2FibGVkRGVwdGggPSAwLFxuICAgICAgcHJldkxvZyxcbiAgICAgIHByZXZJbmZvLFxuICAgICAgcHJldldhcm4sXG4gICAgICBwcmV2RXJyb3IsXG4gICAgICBwcmV2R3JvdXAsXG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQsXG4gICAgICBwcmV2R3JvdXBFbmQ7XG4gICAgZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gITA7XG4gICAgdmFyIHByZWZpeCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIHJlZW50cnkgPSAhMTtcbiAgICB2YXIgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyAoXG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBXZWFrTWFwID8gV2Vha01hcCA6IE1hcFxuICAgICkoKTtcbiAgICB2YXIgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jbGllbnQucmVmZXJlbmNlXCIpLFxuICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd247XG4gICAgdmFyIGRpZFdhcm5BYm91dEVsZW1lbnRSZWYgPSB7fTtcbiAgICB2YXIgZGlkV2FybkFib3V0S2V5U3ByZWFkID0ge30sXG4gICAgICBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcbiAgICBleHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbiAgICBleHBvcnRzLmpzeERFViA9IGZ1bmN0aW9uIChcbiAgICAgIHR5cGUsXG4gICAgICBjb25maWcsXG4gICAgICBtYXliZUtleSxcbiAgICAgIGlzU3RhdGljQ2hpbGRyZW4sXG4gICAgICBzb3VyY2UsXG4gICAgICBzZWxmXG4gICAgKSB7XG4gICAgICByZXR1cm4ganN4REVWSW1wbCh0eXBlLCBjb25maWcsIG1heWJlS2V5LCBpc1N0YXRpY0NoaWxkcmVuLCBzb3VyY2UsIHNlbGYpO1xuICAgIH07XG4gIH0pKCk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtZGV2LXJ1bnRpbWUucHJvZHVjdGlvbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtZGV2LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsCiAgICAiXCJ1c2UgY2xpZW50XCI7XG5pbXBvcnQgUmVhY3QsIHsgdHlwZSBKU1gsIGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IFwiLi4vc3R5bGVzL2dsb2JhbHMuY3NzXCI7XG5cbnR5cGUgVGhlbWVNb2RlID0gXCJsaWdodFwiIHwgXCJkYXJrXCI7XG5cbnR5cGUgVGhlbWVDb250ZXh0VHlwZSA9IHtcbiAgbW9kZTogVGhlbWVNb2RlO1xuICB0b2dnbGVUaGVtZTogKCkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IFRoZW1lQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8VGhlbWVDb250ZXh0VHlwZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuZXhwb3J0IGZ1bmN0aW9uIFRoZW1lUHJvdmlkZXIoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfSk6IEpTWC5FbGVtZW50IHtcbiAgY29uc3QgW21vdW50ZWQsIHNldE1vdW50ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbbW9kZSwgc2V0TW9kZV0gPSB1c2VTdGF0ZTxUaGVtZU1vZGU+KFwibGlnaHRcIik7XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGVtZSBvbiBjbGllbnQtc2lkZSBvbmx5XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc3RvcmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ0aGVtZVwiKSBhcyBUaGVtZU1vZGU7XG5cbiAgICBpZiAoc3RvcmVkKSB7XG4gICAgICBzZXRNb2RlKHN0b3JlZCk7XG4gICAgICBzZXRNb3VudGVkKHRydWUpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmVyc0RhcmsgPSB3aW5kb3cubWF0Y2hNZWRpYShcIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaylcIikubWF0Y2hlcztcblxuICAgIHNldE1vZGUocHJlZmVyc0RhcmsgPyBcImRhcmtcIiA6IFwibGlnaHRcIik7XG4gICAgc2V0TW91bnRlZCh0cnVlKTtcbiAgfSwgW10pO1xuXG4gIC8vIFVwZGF0ZSB0aGVtZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghbW91bnRlZCkgcmV0dXJuO1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXRoZW1lXCIsIG1vZGUpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidGhlbWVcIiwgbW9kZSk7XG4gIH0sIFttb2RlLCBtb3VudGVkXSk7XG5cbiAgY29uc3QgdG9nZ2xlVGhlbWUgPSAoKTogdm9pZCA9PiBzZXRNb2RlKChwcmV2KSA9PiAocHJldiA9PT0gXCJsaWdodFwiID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIpKTtcblxuICBpZiAoIW1vdW50ZWQpIHtcbiAgICByZXR1cm4gPD4gPC8+O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8VGhlbWVDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IG1vZGUsIHRvZ2dsZVRoZW1lIH19PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvVGhlbWVDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVGhlbWUoKTogVGhlbWVDb250ZXh0VHlwZSB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFRoZW1lQ29udGV4dCk7XG5cbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlVGhlbWUgbXVzdCBiZSB1c2VkIHdpdGhpbiBUaGVtZVByb3ZpZGVyXCIpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVdBLFdBQ1ksR0FBRztBQUNYLGFBQVMsd0JBQXdCLENBQUMsWUFBWSxNQUFNO0FBQ2xELGFBQU8sZUFBZSxVQUFVLFdBQVcsWUFBWTtBQUFBLFFBQ3JELGFBQWMsR0FBRztBQUNmLGtCQUFRLEtBQ04sK0RBQ0EsS0FBSyxJQUNMLEtBQUssRUFDUDtBQUFBO0FBQUEsTUFFSixDQUFDO0FBQUE7QUFFSCxhQUFTLGFBQWEsQ0FBQyxlQUFlO0FBQ3BDLFVBQWEsa0JBQVQsZUFBOEMsa0JBQXBCO0FBQzVCLGVBQU87QUFDVCxzQkFDRyx5QkFBeUIsY0FBYywwQkFDeEMsY0FBYztBQUNoQixvQkFBNkIsa0JBQXRCLGFBQXNDLGdCQUFnQjtBQUFBO0FBRS9ELGFBQVMsUUFBUSxDQUFDLGdCQUFnQixZQUFZO0FBQzVDLHdCQUNJLGlCQUFpQixlQUFlLGlCQUMvQixlQUFlLGVBQWUsZUFBZSxTQUNoRDtBQUNGLFVBQUksYUFBYSxpQkFBaUIsTUFBTTtBQUN4Qyw4Q0FBd0MsZ0JBQ3JDLFFBQVEsTUFDUCx5UEFDQSxZQUNBLGNBQ0YsR0FDQyx3Q0FBd0MsY0FBYztBQUFBO0FBRTNELGFBQVMsU0FBUyxDQUFDLE9BQU8sU0FBUyxTQUFTO0FBQzFDLFdBQUssUUFBUTtBQUNiLFdBQUssVUFBVTtBQUNmLFdBQUssT0FBTztBQUNaLFdBQUssVUFBVSxXQUFXO0FBQUE7QUFFNUIsYUFBUyxjQUFjLEdBQUc7QUFBQTtBQUMxQixhQUFTLGFB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
38
+ //# debugId=B2E16B1B1C4F855164756E2164756E21
39
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2Nsc3gvZGlzdC9jbHN4Lm1qcyIsICIuLi9zcmMvY29tcG9uZW50cy9CdXR0b24vQnV0dG9uLnRzeCJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJmdW5jdGlvbiByKGUpe3ZhciB0LGYsbj1cIlwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlfHxcIm51bWJlclwiPT10eXBlb2YgZSluKz1lO2Vsc2UgaWYoXCJvYmplY3RcIj09dHlwZW9mIGUpaWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIG89ZS5sZW5ndGg7Zm9yKHQ9MDt0PG87dCsrKWVbdF0mJihmPXIoZVt0XSkpJiYobiYmKG4rPVwiIFwiKSxuKz1mKX1lbHNlIGZvcihmIGluIGUpZVtmXSYmKG4mJihuKz1cIiBcIiksbis9Zik7cmV0dXJuIG59ZXhwb3J0IGZ1bmN0aW9uIGNsc3goKXtmb3IodmFyIGUsdCxmPTAsbj1cIlwiLG89YXJndW1lbnRzLmxlbmd0aDtmPG87ZisrKShlPWFyZ3VtZW50c1tmXSkmJih0PXIoZSkpJiYobiYmKG4rPVwiIFwiKSxuKz10KTtyZXR1cm4gbn1leHBvcnQgZGVmYXVsdCBjbHN4OyIsCiAgICAiaW1wb3J0IHsgY2xzeCB9IGZyb20gXCJjbHN4XCI7XG5pbXBvcnQgeyB0eXBlIEJ1dHRvbkhUTUxBdHRyaWJ1dGVzLCB0eXBlIEpTWCB9IGZyb20gXCJyZWFjdFwiO1xuXG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5cbnR5cGUgQnV0dG9uUHJvcHMgPSBCdXR0b25IVE1MQXR0cmlidXRlczxIVE1MQnV0dG9uRWxlbWVudD47XG5cbmV4cG9ydCBmdW5jdGlvbiBCdXR0b24oeyBjbGFzc05hbWUsIC4uLnByb3BzIH06IEJ1dHRvblByb3BzKTogSlNYLkVsZW1lbnQge1xuICAvLyBAdHMtaWdub3JlIC0gQ1NTIG1vZHVsZSB0eXBlcyBhcmUgY29ycmVjdCBhdCBydW50aW1lXG4gIHJldHVybiA8YnV0dG9uIGNsYXNzTmFtZT17Y2xzeChzdHlsZXNbXCJidXR0b25cIl0sIGNsYXNzTmFtZSl9IHR5cGU9XCJidXR0b25cIiB7Li4ucHJvcHN9IC8+O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsQ0FBQyxDQUFDLEdBQUU7QUFBQyxNQUFJLEdBQUUsR0FBRSxJQUFFO0FBQUcsYUFBb0IsS0FBakIsbUJBQXFDLEtBQWpCO0FBQW1CLFNBQUc7QUFBQSxrQkFBMkIsS0FBakI7QUFBbUIsUUFBRyxNQUFNLFFBQVEsQ0FBQyxHQUFFO0FBQUMsVUFBSSxJQUFFLEVBQUU7QUFBTyxXQUFJLElBQUUsRUFBRSxJQUFFLEdBQUU7QUFBSSxVQUFFLE9BQUssSUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFLLE1BQUksS0FBRyxNQUFLLEtBQUc7QUFBQSxJQUFFO0FBQU0sV0FBSSxLQUFLO0FBQUUsVUFBRSxPQUFLLE1BQUksS0FBRyxNQUFLLEtBQUc7QUFBRyxTQUFPO0FBQUE7QUFBUyxTQUFTLElBQUksR0FBRTtBQUFDLFdBQVEsR0FBRSxHQUFFLElBQUUsR0FBRSxJQUFFLElBQUcsSUFBRSxVQUFVLE9BQU8sSUFBRSxHQUFFO0FBQUksS0FBQyxJQUFFLFVBQVUsUUFBTSxJQUFFLEVBQUUsQ0FBQyxPQUFLLE1BQUksS0FBRyxNQUFLLEtBQUc7QUFBRyxTQUFPO0FBQUE7Ozs7Ozs7QUNPdlcsU0FBUyxNQUFNLEdBQUcsY0FBYyxTQUFtQztBQUV4RSx5QkFBTyxnQkFBQyxVQUFEO0FBQUEsSUFBUSxXQUFXLEtBQUssc0JBQU8sV0FBVyxTQUFTO0FBQUEsSUFBRyxNQUFLO0FBQUEsT0FBYTtBQUFBLEtBQXhFLGlDQUErRTtBQUFBOyIsCiAgImRlYnVnSWQiOiAiQjJFMTZCMUIxQzRGODU1MTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=