@1money/component-ui 0.0.75 → 0.0.76

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.
Files changed (71) hide show
  1. package/es/components/ProForm/ProForm.js +46 -33
  2. package/es/components/ProForm/ProFormDependency.js +6 -16
  3. package/es/components/ProForm/ProFormItem.js +5 -7
  4. package/es/components/ProForm/ProFormList.js +112 -40
  5. package/es/components/ProForm/core/constants.d.ts +2 -0
  6. package/es/components/ProForm/core/constants.js +7 -1
  7. package/es/components/ProForm/core/devWarning.d.ts +3 -0
  8. package/es/components/ProForm/core/devWarning.js +22 -0
  9. package/es/components/ProForm/core/formStore.d.ts +10 -2
  10. package/es/components/ProForm/core/formStore.js +21 -2
  11. package/es/components/ProForm/core/hooks/useForm.js +246 -103
  12. package/es/components/ProForm/core/hooks/useFormCore.js +134 -28
  13. package/es/components/ProForm/core/interface.d.ts +124 -49
  14. package/es/components/ProForm/core/runRules.d.ts +44 -12
  15. package/es/components/ProForm/core/runRules.js +584 -133
  16. package/es/components/ProForm/core/useFormItem.d.ts +6 -7
  17. package/es/components/ProForm/core/useFormItem.js +44 -22
  18. package/es/components/ProForm/core/validationError.d.ts +13 -0
  19. package/es/components/ProForm/core/validationError.js +29 -0
  20. package/es/components/ProForm/fields/ProFormCheckboxGroup.js +19 -5
  21. package/es/components/ProForm/fields/ProFormFieldSet.js +51 -12
  22. package/es/components/ProForm/fields/ProFormRadioGroup.js +8 -3
  23. package/es/components/ProForm/fields/ProFormSelect.js +13 -7
  24. package/es/components/ProForm/fields/createProFormField.js +18 -25
  25. package/es/components/ProForm/hooks/useFieldRequest.js +10 -8
  26. package/es/components/ProForm/index.d.ts +2 -1
  27. package/es/components/ProForm/index.js +4 -1
  28. package/es/components/ProForm/interface.d.ts +31 -40
  29. package/es/components/ProForm/layouts/QueryFilter.js +24 -16
  30. package/es/components/ProForm/utils.d.ts +8 -0
  31. package/es/components/ProForm/utils.js +51 -3
  32. package/es/components/Table/core/useTableSetup.js +2 -2
  33. package/es/components/Table/interface.d.ts +1 -1
  34. package/es/index.css +1 -1
  35. package/lib/components/ProForm/ProForm.js +45 -32
  36. package/lib/components/ProForm/ProFormDependency.js +5 -15
  37. package/lib/components/ProForm/ProFormItem.js +5 -7
  38. package/lib/components/ProForm/ProFormList.js +110 -38
  39. package/lib/components/ProForm/core/constants.d.ts +2 -0
  40. package/lib/components/ProForm/core/constants.js +8 -2
  41. package/lib/components/ProForm/core/devWarning.d.ts +3 -0
  42. package/lib/components/ProForm/core/devWarning.js +29 -0
  43. package/lib/components/ProForm/core/formStore.d.ts +10 -2
  44. package/lib/components/ProForm/core/formStore.js +23 -2
  45. package/lib/components/ProForm/core/hooks/useForm.js +242 -99
  46. package/lib/components/ProForm/core/hooks/useFormCore.js +133 -27
  47. package/lib/components/ProForm/core/interface.d.ts +124 -49
  48. package/lib/components/ProForm/core/runRules.d.ts +44 -12
  49. package/lib/components/ProForm/core/runRules.js +587 -133
  50. package/lib/components/ProForm/core/useFormItem.d.ts +6 -7
  51. package/lib/components/ProForm/core/useFormItem.js +43 -21
  52. package/lib/components/ProForm/core/validationError.d.ts +13 -0
  53. package/lib/components/ProForm/core/validationError.js +36 -0
  54. package/lib/components/ProForm/fields/ProFormCheckboxGroup.js +18 -4
  55. package/lib/components/ProForm/fields/ProFormFieldSet.js +51 -12
  56. package/lib/components/ProForm/fields/ProFormRadioGroup.js +7 -2
  57. package/lib/components/ProForm/fields/ProFormSelect.js +13 -7
  58. package/lib/components/ProForm/fields/createProFormField.js +18 -25
  59. package/lib/components/ProForm/hooks/useFieldRequest.js +10 -8
  60. package/lib/components/ProForm/index.d.ts +2 -1
  61. package/lib/components/ProForm/index.js +10 -1
  62. package/lib/components/ProForm/interface.d.ts +31 -40
  63. package/lib/components/ProForm/layouts/QueryFilter.js +24 -16
  64. package/lib/components/ProForm/utils.d.ts +8 -0
  65. package/lib/components/ProForm/utils.js +52 -3
  66. package/lib/components/Table/core/useTableSetup.js +2 -2
  67. package/lib/components/Table/interface.d.ts +1 -1
  68. package/lib/index.css +1 -1
  69. package/package.json +1 -1
  70. package/scripts/mcp-server/examples.generated.json +42 -36
  71. package/scripts/mcp-server/index.generated.json +23 -67
@@ -1,3 +1,4 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
1
2
  import _typeof from "@babel/runtime/helpers/esm/typeof";
2
3
  import _regeneratorRuntime from "@babel/runtime/regenerator";
3
4
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
@@ -30,6 +31,8 @@ var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, gene
30
31
  step((generator = generator.apply(thisArg, _arguments || [])).next());
31
32
  });
32
33
  };
34
+ import { resolveValue } from './pathUtils';
35
+ import { devWarnOnce } from './devWarning';
33
36
  function isThenable(value) {
34
37
  return value !== null && _typeof(value) === 'object' && typeof value.then === 'function';
35
38
  }
@@ -38,75 +41,534 @@ function isEmptyValue(value) {
38
41
  return value === undefined || value === null || value === '' || Array.isArray(value) && value.length === 0;
39
42
  }
40
43
  /**
41
- * Filter rules applicable to an interactive trigger. A rule WITHOUT an
42
- * explicit `validateTrigger` follows the form-level trigger; a rule WITH one
43
- * runs on exactly those trigger(s), regardless of the form-level setting.
44
- * Submit-time validation bypasses this filter and runs every rule.
44
+ * Coerce a thrown/rejected reason into displayable failure content:
45
+ * a non-empty Error.message or a non-empty plain string otherwise null
46
+ * (caller picks its fallback). Shared with the form-level last-resort nets.
45
47
  */
46
- export function filterRulesByTrigger(rules, trigger, formTrigger) {
48
+ export function coerceFailureReason(reason) {
49
+ if (reason instanceof Error && reason.message) return reason.message;
50
+ if (typeof reason === 'string' && reason) return reason;
51
+ return null;
52
+ }
53
+ /**
54
+ * Failure message for a rejected/thrown custom validator:
55
+ * Error.message → plain string reason → rule.message → generic fallback.
56
+ */
57
+ function resolveFailureMessage(reason, rule) {
58
+ var _a;
59
+ return (_a = coerceFailureReason(reason)) !== null && _a !== void 0 ? _a : rule.message || 'Validation failed';
60
+ }
61
+ /**
62
+ * Resolve function-form rules into static rules. The
63
+ * context exposes the value snapshot the run was invoked with; function rules
64
+ * must be cheap and side-effect free — they may be resolved more than once
65
+ * per validation pass.
66
+ */
67
+ export function resolveRules(rules, values, instance) {
68
+ // Fast path: no function rules → nothing to resolve, no ctx allocation.
69
+ // This also makes the engine-internal re-resolution of already-resolved
70
+ // arrays free.
71
+ if (!rules.some(function (rule) {
72
+ return typeof rule === 'function';
73
+ })) {
74
+ return rules;
75
+ }
76
+ // Live-instance members (setFieldsValue, getFieldError, …) are spread in
77
+ // when available; the reads always come from the validation-time snapshot.
78
+ var ctx = Object.assign(Object.assign({}, instance), {
79
+ getFieldValue: function getFieldValue(name) {
80
+ return resolveValue(values, name);
81
+ },
82
+ getFieldsValue: function getFieldsValue() {
83
+ return values;
84
+ }
85
+ });
86
+ return rules.map(function (rule) {
87
+ if (typeof rule !== 'function') return rule;
88
+ try {
89
+ return rule(ctx);
90
+ } catch (err) {
91
+ // A throwing rule factory must not crash rendering or validation —
92
+ // surface it as a rule that always fails with the thrown reason.
93
+ return {
94
+ validator: function validator() {
95
+ throw err;
96
+ }
97
+ };
98
+ }
99
+ });
100
+ }
101
+ /**
102
+ * Normalize a form/item-level validateTrigger config into the effective
103
+ * interactive event list: item-level (when present) overrides form-level;
104
+ * `false` disables interactive validation entirely.
105
+ */
106
+ export function normalizeTriggers(itemTrigger, formTrigger) {
107
+ var effective = itemTrigger === undefined ? formTrigger : itemTrigger;
108
+ if (effective === false) return [];
109
+ return Array.isArray(effective) ? effective : [effective];
110
+ }
111
+ /**
112
+ * Filter rules applicable to an interactive event: the event
113
+ * validates only when it is in the item's effective trigger set. Within the
114
+ * set, a rule WITHOUT `validateTrigger` runs on every event; a rule WITH one
115
+ * runs only on matching events — so a rule trigger outside the item's set
116
+ * never fires interactively. Submit-time validation bypasses this filter and
117
+ * runs every rule.
118
+ *
119
+ * Dev guard: a rule whose (non-empty) trigger set is fully OUTSIDE the
120
+ * active set can never fire interactively — usually a leftover of the
121
+ * pre-0.0.76 override semantics, so it warns once. `validateTrigger: []`
122
+ * is the deliberate submit-only idiom and stays silent.
123
+ */
124
+ export function filterRulesByTrigger(rules, trigger, activeTriggers, fieldName) {
125
+ if (!activeTriggers.includes(trigger)) return [];
47
126
  return rules.filter(function (rule) {
48
127
  var ruleTrigger = rule.validateTrigger;
49
- if (!ruleTrigger) return formTrigger === trigger;
50
- return Array.isArray(ruleTrigger) ? ruleTrigger.includes(trigger) : ruleTrigger === trigger;
128
+ if (ruleTrigger === undefined) return true;
129
+ var ruleTriggers = Array.isArray(ruleTrigger) ? ruleTrigger : [ruleTrigger];
130
+ var matches = ruleTriggers.includes(trigger);
131
+ if (!matches && ruleTriggers.length > 0 && !ruleTriggers.some(function (t) {
132
+ return activeTriggers.includes(t);
133
+ })) {
134
+ var name = fieldName !== null && fieldName !== void 0 ? fieldName : '(unknown)';
135
+ devWarnOnce("trigger:".concat(name, ":").concat(ruleTriggers.join(',')), "[ProForm] Field \"".concat(name, "\": rule validateTrigger [").concat(ruleTriggers.join(', '), "] is outside this field's active trigger set [").concat(activeTriggers.join(', '), "] \u2014 the rule will only run on submit. Include it in the item/form validateTrigger to run it interactively."));
136
+ }
137
+ return matches;
51
138
  });
52
139
  }
140
+ /** Built-in `type` checks. `enum` is handled separately against `rule.enum`. */
141
+ var TYPE_CHECKS = {
142
+ string: function string(v) {
143
+ return typeof v === 'string';
144
+ },
145
+ number: function number(v) {
146
+ return typeof v === 'number' && !Number.isNaN(v);
147
+ },
148
+ "boolean": function boolean(v) {
149
+ return typeof v === 'boolean';
150
+ },
151
+ method: function method(v) {
152
+ return typeof v === 'function';
153
+ },
154
+ integer: function integer(v) {
155
+ return typeof v === 'number' && Number.isInteger(v);
156
+ },
157
+ "float": function float(v) {
158
+ return typeof v === 'number' && !Number.isNaN(v) && !Number.isInteger(v);
159
+ },
160
+ array: function array(v) {
161
+ return Array.isArray(v);
162
+ },
163
+ object: function object(v) {
164
+ return _typeof(v) === 'object' && v !== null && !Array.isArray(v);
165
+ },
166
+ date: function date(v) {
167
+ return v instanceof Date ? !Number.isNaN(v.getTime()) : typeof (v === null || v === void 0 ? void 0 : v.getTime) === 'function' && !Number.isNaN(v.getTime());
168
+ },
169
+ regexp: function regexp(v) {
170
+ if (v instanceof RegExp) return true;
171
+ if (typeof v !== 'string') return false;
172
+ try {
173
+ new RegExp(v);
174
+ return true;
175
+ } catch (_a) {
176
+ return false;
177
+ }
178
+ },
179
+ hex: function hex(v) {
180
+ return typeof v === 'string' && /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i.test(v);
181
+ },
182
+ // String-only: coercing via String() would let e.g. ['a@b.co'] stringify
183
+ // into a passing value.
184
+ email: function email(v) {
185
+ return typeof v === 'string' && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v);
186
+ },
187
+ url: function url(v) {
188
+ if (typeof v !== 'string') return false;
189
+ try {
190
+ new URL(v);
191
+ return true;
192
+ } catch (_a) {
193
+ return false;
194
+ }
195
+ }
196
+ };
197
+ /** Friendly generated messages for the legacy type names; others get a generic one. */
198
+ function typeFailureMessage(name, type) {
199
+ if (type === 'number') return "".concat(name, " must be a number");
200
+ if (type === 'email') return "".concat(name, " must be a valid email");
201
+ if (type === 'url') return "".concat(name, " must be a valid URL");
202
+ return "".concat(name, " is not a valid ").concat(type);
203
+ }
204
+ /** Measure a value for len/min/max: string → length, array → count, number → value. */
205
+ function measureValue(value) {
206
+ if (typeof value === 'string') return {
207
+ measured: value.length,
208
+ unit: ' characters'
209
+ };
210
+ if (Array.isArray(value)) return {
211
+ measured: value.length,
212
+ unit: ' items'
213
+ };
214
+ if (typeof value === 'number' && !Number.isNaN(value)) return {
215
+ measured: value,
216
+ unit: ''
217
+ };
218
+ return null;
219
+ }
53
220
  /**
54
221
  * Evaluate every built-in (non-`validator`) rule kind for a single rule.
55
- * Returns the error message for the first failing check, or null.
222
+ * Returns the error content for the first failing check, or null.
223
+ *
224
+ * Empty values (undefined / null / '' / empty array) are only checked by
225
+ * `required` — every other builtin check is skipped, so optional fields
226
+ * don't error until they have content. Custom validators are NOT subject to
227
+ * this skip (they receive the empty value and decide themselves).
56
228
  */
57
229
  function checkBuiltinRules(rule, value, name) {
58
230
  if (rule.required && isEmptyValue(value)) {
59
231
  return rule.message || "".concat(name, " is required");
60
232
  }
61
- // min/max: string → length, array → item count, number → numeric value
62
- if (rule.min !== undefined || rule.max !== undefined) {
63
- var measured = null;
64
- var unit = '';
65
- if (typeof value === 'string') {
66
- measured = value.length;
67
- unit = ' characters';
68
- } else if (Array.isArray(value)) {
69
- measured = value.length;
70
- unit = ' items';
71
- } else if (typeof value === 'number' && !Number.isNaN(value)) {
72
- measured = value;
73
- }
74
- if (measured !== null) {
75
- if (rule.min !== undefined && measured < rule.min) {
76
- return rule.message || "".concat(name, " must be at least ").concat(rule.min).concat(unit);
233
+ if (isEmptyValue(value)) return null;
234
+ // Non-empty string of only whitespace (the required+whitespace trim idiom).
235
+ if (rule.whitespace && typeof value === 'string' && value.trim() === '') {
236
+ return rule.message || "".concat(name, " cannot be blank");
237
+ }
238
+ // len: exact length/count/value — takes precedence over min/max.
239
+ if (rule.len !== undefined) {
240
+ var m = measureValue(value);
241
+ if (m !== null && m.measured !== rule.len) {
242
+ return rule.message || "".concat(name, " must be exactly ").concat(rule.len).concat(m.unit);
243
+ }
244
+ } else if (rule.min !== undefined || rule.max !== undefined) {
245
+ var _m = measureValue(value);
246
+ if (_m !== null) {
247
+ if (rule.min !== undefined && _m.measured < rule.min) {
248
+ return rule.message || "".concat(name, " must be at least ").concat(rule.min).concat(_m.unit);
77
249
  }
78
- if (rule.max !== undefined && measured > rule.max) {
79
- return rule.message || "".concat(name, " must be no more than ").concat(rule.max).concat(unit);
250
+ if (rule.max !== undefined && _m.measured > rule.max) {
251
+ return rule.message || "".concat(name, " must be no more than ").concat(rule.max).concat(_m.unit);
80
252
  }
81
253
  }
82
254
  }
83
- if (rule.pattern && typeof value === 'string' && !rule.pattern.test(value)) {
84
- return rule.message || "".concat(name, " format is invalid");
255
+ if (rule.pattern && typeof value === 'string') {
256
+ // A /g or /y regex is stateful: lastIndex persists across .test() calls,
257
+ // so repeated runs would alternate pass/fail — reset it every run.
258
+ if (rule.pattern.global || rule.pattern.sticky) rule.pattern.lastIndex = 0;
259
+ if (!rule.pattern.test(value)) {
260
+ return rule.message || "".concat(name, " format is invalid");
261
+ }
262
+ }
263
+ if (rule.type && rule.type !== 'enum' && !TYPE_CHECKS[rule.type](value)) {
264
+ return rule.message || typeFailureMessage(name, rule.type);
85
265
  }
86
- if (rule["enum"] && Array.isArray(rule["enum"]) && value) {
87
- if (!rule["enum"].includes(value)) {
88
- return rule.message || "".concat(name, " must be one of ").concat(rule["enum"].join(', '));
266
+ // enum membership: applies for type 'enum' or whenever rule.enum is present.
267
+ if (rule["enum"] && Array.isArray(rule["enum"]) && !rule["enum"].includes(value)) {
268
+ return rule.message || "".concat(name, " must be one of ").concat(rule["enum"].join(', '));
269
+ }
270
+ return null;
271
+ }
272
+ function toRuleArray(rules) {
273
+ if (!rules) return [];
274
+ return Array.isArray(rules) ? rules : [rules];
275
+ }
276
+ /** Members for deep rules: array → indexed entries, plain object → key entries. */
277
+ function deepMembers(value) {
278
+ if (Array.isArray(value)) return value.map(function (member, index) {
279
+ return [String(index), member];
280
+ });
281
+ if (value && _typeof(value) === 'object') return Object.entries(value);
282
+ return [];
283
+ }
284
+ var PASS = {
285
+ error: null,
286
+ warning: null
287
+ };
288
+ /**
289
+ * Dev guard for the pre-0.0.76 validator contract: returning a string or
290
+ * `false` used to FAIL the rule — under the `(rule, value)` contract return
291
+ * values are ignored and only throw/reject fails. Such a return is almost
292
+ * certainly a legacy validator silently passing, so it warns once.
293
+ */
294
+ function warnLegacyValidatorReturn(name, result) {
295
+ if (typeof result !== 'string' && result !== false) return;
296
+ devWarnOnce("validator-return:".concat(name), "[ProForm] Field \"".concat(name, "\": a custom validator returned ").concat(typeof result === 'string' ? 'a string' : 'false', " \u2014 return values are IGNORED; validators fail by throwing or rejecting (a thrown Error's message becomes the field error)."));
297
+ }
298
+ /** Run a rule's transform, containing throws as a rule failure. */
299
+ function applyTransform(rule, rawValue) {
300
+ if (typeof rule.transform !== 'function') return {
301
+ ok: true,
302
+ value: rawValue
303
+ };
304
+ try {
305
+ return {
306
+ ok: true,
307
+ value: rule.transform(rawValue)
308
+ };
309
+ } catch (err) {
310
+ return {
311
+ ok: false,
312
+ failure: resolveFailureMessage(err, rule)
313
+ };
314
+ }
315
+ }
316
+ /**
317
+ * Flatten a rule's deep sources (`fields` per key, then `defaultField` per
318
+ * member) into [subRule, memberValue, memberName] tuples — the single place
319
+ * that knows how deep rules map onto a container value.
320
+ */
321
+ function deepRuleEntries(rule, value, name) {
322
+ var entries = [];
323
+ if (rule.fields) {
324
+ var source = value;
325
+ for (var _i = 0, _Object$entries = Object.entries(rule.fields); _i < _Object$entries.length; _i++) {
326
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
327
+ key = _Object$entries$_i[0],
328
+ subRules = _Object$entries$_i[1];
329
+ var _iterator = _createForOfIteratorHelper(toRuleArray(subRules)),
330
+ _step;
331
+ try {
332
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
333
+ var subRule = _step.value;
334
+ entries.push([subRule, source[key], "".concat(name, ".").concat(key)]);
335
+ }
336
+ } catch (err) {
337
+ _iterator.e(err);
338
+ } finally {
339
+ _iterator.f();
340
+ }
89
341
  }
90
342
  }
91
- if (rule.type === 'number' && value !== undefined && value !== null && value !== '') {
92
- if (typeof value !== 'number' || isNaN(value)) {
93
- return rule.message || "".concat(name, " must be a number");
343
+ if (rule.defaultField) {
344
+ var _iterator2 = _createForOfIteratorHelper(deepMembers(value)),
345
+ _step2;
346
+ try {
347
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
348
+ var _step2$value = _slicedToArray(_step2.value, 2),
349
+ _key = _step2$value[0],
350
+ member = _step2$value[1];
351
+ var _iterator3 = _createForOfIteratorHelper(toRuleArray(rule.defaultField)),
352
+ _step3;
353
+ try {
354
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
355
+ var _subRule = _step3.value;
356
+ entries.push([_subRule, member, "".concat(name, ".").concat(_key)]);
357
+ }
358
+ } catch (err) {
359
+ _iterator3.e(err);
360
+ } finally {
361
+ _iterator3.f();
362
+ }
363
+ }
364
+ } catch (err) {
365
+ _iterator2.e(err);
366
+ } finally {
367
+ _iterator2.f();
94
368
  }
95
369
  }
96
- if (rule.type === 'email' && value) {
97
- var emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
98
- if (!emailPattern.test(String(value))) {
99
- return rule.message || "".concat(name, " must be a valid email");
370
+ return entries;
371
+ }
372
+ /**
373
+ * Merge a sub-rule's outcome into the parent's channels. A sub-rule flagged
374
+ * `warningOnly` contributes its failure as a WARNING; otherwise its error
375
+ * blocks. Returns true when a blocking error landed (stop walking).
376
+ */
377
+ function mergeSubResult(acc, subRule, sub) {
378
+ if (sub.warning !== null && acc.warning === null) acc.warning = sub.warning;
379
+ if (sub.error !== null) {
380
+ if (subRule.warningOnly) {
381
+ if (acc.warning === null) acc.warning = sub.error;
382
+ } else {
383
+ acc.error = sub.error;
384
+ return true;
100
385
  }
101
386
  }
102
- if (rule.type === 'url' && value) {
387
+ return false;
388
+ }
389
+ /**
390
+ * Fold one rule's outcome into the run-level channels. A rule flagged
391
+ * `warningOnly` downgrades everything it produced (own checks AND deep
392
+ * sub-rules) to a warning. Returns the blocking error to surface, or null.
393
+ */
394
+ function foldRuleResult(rule, result, state) {
395
+ var _a;
396
+ if (rule.warningOnly) {
397
+ var content = (_a = result.error) !== null && _a !== void 0 ? _a : result.warning;
398
+ if (content !== null && state.warning === null) state.warning = content;
399
+ return null;
400
+ }
401
+ if (result.warning !== null && state.warning === null) state.warning = result.warning;
402
+ return result.error;
403
+ }
404
+ /**
405
+ * Evaluate ONE rule (transform → builtin checks → validator → deep rules)
406
+ * synchronously. Promise-returning validators are deferred (see runRulesSync).
407
+ */
408
+ function evalRuleSync(rule, rawValue, name) {
409
+ var prep = applyTransform(rule, rawValue);
410
+ if (!prep.ok) return {
411
+ error: prep.failure,
412
+ warning: null
413
+ };
414
+ var value = prep.value;
415
+ var failure = checkBuiltinRules(rule, value, name);
416
+ if (failure === null && typeof rule.validator === 'function') {
103
417
  try {
104
- new URL(String(value));
105
- } catch (_a) {
106
- return rule.message || "".concat(name, " must be a valid URL");
418
+ var result = rule.validator(rule, value);
419
+ if (isThenable(result)) {
420
+ result.then(function (resolved) {
421
+ return warnLegacyValidatorReturn(name, resolved);
422
+ }, function () {});
423
+ } else {
424
+ warnLegacyValidatorReturn(name, result);
425
+ }
426
+ } catch (err) {
427
+ failure = resolveFailureMessage(err, rule);
107
428
  }
108
429
  }
109
- return null;
430
+ if (failure !== null) return {
431
+ error: failure,
432
+ warning: null
433
+ };
434
+ if ((rule.fields || rule.defaultField) && !isEmptyValue(value)) {
435
+ // Deep rules need a container; a non-empty primitive fails the PARENT
436
+ // (clear attribution) instead of producing confusing child errors.
437
+ if (_typeof(value) !== 'object' || value === null) {
438
+ return {
439
+ error: rule.message || "".concat(name, " must be an object or an array"),
440
+ warning: null
441
+ };
442
+ }
443
+ var acc = {
444
+ error: null,
445
+ warning: null
446
+ };
447
+ var _iterator4 = _createForOfIteratorHelper(deepRuleEntries(rule, value, name)),
448
+ _step4;
449
+ try {
450
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
451
+ var _step4$value = _slicedToArray(_step4.value, 3),
452
+ subRule = _step4$value[0],
453
+ subValue = _step4$value[1],
454
+ subName = _step4$value[2];
455
+ if (mergeSubResult(acc, subRule, evalRuleSync(subRule, subValue, subName))) break;
456
+ }
457
+ } catch (err) {
458
+ _iterator4.e(err);
459
+ } finally {
460
+ _iterator4.f();
461
+ }
462
+ return acc;
463
+ }
464
+ return PASS;
465
+ }
466
+ /** Async counterpart of evalRuleSync — custom validators are awaited. */
467
+ function evalRuleAsync(rule, rawValue, name) {
468
+ return __awaiter(this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
469
+ var prep, value, failure, result, acc, _iterator5, _step5, _step5$value, subRule, subValue, subName, _t, _t2, _t3, _t4, _t5;
470
+ return _regeneratorRuntime.wrap(function (_context) {
471
+ while (1) switch (_context.prev = _context.next) {
472
+ case 0:
473
+ prep = applyTransform(rule, rawValue);
474
+ if (prep.ok) {
475
+ _context.next = 1;
476
+ break;
477
+ }
478
+ return _context.abrupt("return", {
479
+ error: prep.failure,
480
+ warning: null
481
+ });
482
+ case 1:
483
+ value = prep.value;
484
+ failure = checkBuiltinRules(rule, value, name);
485
+ if (!(failure === null && typeof rule.validator === 'function')) {
486
+ _context.next = 5;
487
+ break;
488
+ }
489
+ _context.prev = 2;
490
+ _context.next = 3;
491
+ return rule.validator(rule, value);
492
+ case 3:
493
+ result = _context.sent;
494
+ warnLegacyValidatorReturn(name, result);
495
+ _context.next = 5;
496
+ break;
497
+ case 4:
498
+ _context.prev = 4;
499
+ _t = _context["catch"](2);
500
+ failure = resolveFailureMessage(_t, rule);
501
+ case 5:
502
+ if (!(failure !== null)) {
503
+ _context.next = 6;
504
+ break;
505
+ }
506
+ return _context.abrupt("return", {
507
+ error: failure,
508
+ warning: null
509
+ });
510
+ case 6:
511
+ if (!((rule.fields || rule.defaultField) && !isEmptyValue(value))) {
512
+ _context.next = 16;
513
+ break;
514
+ }
515
+ if (!(_typeof(value) !== 'object' || value === null)) {
516
+ _context.next = 7;
517
+ break;
518
+ }
519
+ return _context.abrupt("return", {
520
+ error: rule.message || "".concat(name, " must be an object or an array"),
521
+ warning: null
522
+ });
523
+ case 7:
524
+ acc = {
525
+ error: null,
526
+ warning: null
527
+ };
528
+ _iterator5 = _createForOfIteratorHelper(deepRuleEntries(rule, value, name));
529
+ _context.prev = 8;
530
+ _iterator5.s();
531
+ case 9:
532
+ if ((_step5 = _iterator5.n()).done) {
533
+ _context.next = 12;
534
+ break;
535
+ }
536
+ _step5$value = _slicedToArray(_step5.value, 3), subRule = _step5$value[0], subValue = _step5$value[1], subName = _step5$value[2];
537
+ _t2 = mergeSubResult;
538
+ _t3 = acc;
539
+ _t4 = subRule;
540
+ _context.next = 10;
541
+ return evalRuleAsync(subRule, subValue, subName);
542
+ case 10:
543
+ if (!_t2(_t3, _t4, _context.sent)) {
544
+ _context.next = 11;
545
+ break;
546
+ }
547
+ return _context.abrupt("continue", 12);
548
+ case 11:
549
+ _context.next = 9;
550
+ break;
551
+ case 12:
552
+ _context.next = 14;
553
+ break;
554
+ case 13:
555
+ _context.prev = 13;
556
+ _t5 = _context["catch"](8);
557
+ _iterator5.e(_t5);
558
+ case 14:
559
+ _context.prev = 14;
560
+ _iterator5.f();
561
+ return _context.finish(14);
562
+ case 15:
563
+ return _context.abrupt("return", acc);
564
+ case 16:
565
+ return _context.abrupt("return", PASS);
566
+ case 17:
567
+ case "end":
568
+ return _context.stop();
569
+ }
570
+ }, _callee, null, [[2, 4], [8, 13, 14, 15]]);
571
+ }));
110
572
  }
111
573
  /**
112
574
  * Synchronous rule run. A Promise-returning validator CANNOT be evaluated
@@ -114,128 +576,117 @@ function checkBuiltinRules(rule, value, name) {
114
576
  * swallowed) and left to the async runs (blur/submit), which always await it.
115
577
  * Failing it instead would mis-report "Validation failed" on every keystroke
116
578
  * for perfectly valid input.
579
+ *
580
+ * The per-rule try/catch is the engine's totality choke point: NO input —
581
+ * including exotic values that break a builtin check — may escape as a throw;
582
+ * every failure surfaces through the error/warning channels.
117
583
  */
118
- export function runRulesSync(name, value, values, rules) {
119
- var warning = null;
120
- var _iterator = _createForOfIteratorHelper(rules),
121
- _step;
584
+ export function runRulesSync(name, value, values, rules, instance) {
585
+ var state = {
586
+ warning: null
587
+ };
588
+ var _iterator6 = _createForOfIteratorHelper(resolveRules(rules, values, instance)),
589
+ _step6;
122
590
  try {
123
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
124
- var rule = _step.value;
125
- var failure = checkBuiltinRules(rule, value, name);
126
- if (failure === null && typeof rule.validator === 'function') {
127
- try {
128
- var result = rule.validator(value, values);
129
- if (isThenable(result)) {
130
- result.then(undefined, function () {});
131
- } else if (result !== true) {
132
- failure = typeof result === 'string' ? result : 'Validation failed';
133
- }
134
- } catch (err) {
135
- failure = err instanceof Error ? err.message : 'Validation error';
136
- }
137
- }
138
- if (failure !== null) {
139
- if (rule.warningOnly) {
140
- warning = warning !== null && warning !== void 0 ? warning : failure;
141
- } else {
142
- return {
143
- error: failure,
144
- warning: warning
145
- };
146
- }
591
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
592
+ var rule = _step6.value;
593
+ var result = void 0;
594
+ try {
595
+ result = evalRuleSync(rule, value, name);
596
+ } catch (err) {
597
+ result = {
598
+ error: resolveFailureMessage(err, rule),
599
+ warning: null
600
+ };
147
601
  }
602
+ var error = foldRuleResult(rule, result, state);
603
+ if (error !== null) return {
604
+ error: error,
605
+ warning: state.warning
606
+ };
148
607
  }
149
608
  } catch (err) {
150
- _iterator.e(err);
609
+ _iterator6.e(err);
151
610
  } finally {
152
- _iterator.f();
611
+ _iterator6.f();
153
612
  }
154
613
  return {
155
614
  error: null,
156
- warning: warning
615
+ warning: state.warning
157
616
  };
158
617
  }
159
618
  /**
160
- * Asynchronous rule run. Custom validators are awaited (sync or async). A
161
- * validator returning `undefined` is treated as passing.
619
+ * Asynchronous rule run. Custom validators are awaited (sync or async):
620
+ * resolving passes, rejecting/throwing fails. Return values are ignored.
621
+ * Shares the totality choke point with runRulesSync.
162
622
  */
163
- export function runRulesAsync(name, value, values, rules) {
164
- return __awaiter(this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
165
- var warning, _iterator2, _step2, rule, failure, result, _t, _t2;
166
- return _regeneratorRuntime.wrap(function (_context) {
167
- while (1) switch (_context.prev = _context.next) {
623
+ export function runRulesAsync(name, value, values, rules, instance) {
624
+ return __awaiter(this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
625
+ var state, _iterator7, _step7, rule, result, error, _t6, _t7;
626
+ return _regeneratorRuntime.wrap(function (_context2) {
627
+ while (1) switch (_context2.prev = _context2.next) {
168
628
  case 0:
169
- warning = null;
170
- _iterator2 = _createForOfIteratorHelper(rules);
171
- _context.prev = 1;
172
- _iterator2.s();
629
+ state = {
630
+ warning: null
631
+ };
632
+ _iterator7 = _createForOfIteratorHelper(resolveRules(rules, values, instance));
633
+ _context2.prev = 1;
634
+ _iterator7.s();
173
635
  case 2:
174
- if ((_step2 = _iterator2.n()).done) {
175
- _context.next = 9;
636
+ if ((_step7 = _iterator7.n()).done) {
637
+ _context2.next = 8;
176
638
  break;
177
639
  }
178
- rule = _step2.value;
179
- failure = checkBuiltinRules(rule, value, name);
180
- if (!(failure === null && typeof rule.validator === 'function')) {
181
- _context.next = 6;
182
- break;
183
- }
184
- _context.prev = 3;
185
- _context.next = 4;
186
- return Promise.resolve(rule.validator(value, values));
640
+ rule = _step7.value;
641
+ result = void 0;
642
+ _context2.prev = 3;
643
+ _context2.next = 4;
644
+ return evalRuleAsync(rule, value, name);
187
645
  case 4:
188
- result = _context.sent;
189
- if (result !== true && result !== undefined) {
190
- failure = typeof result === 'string' ? result : 'Validation failed';
191
- }
192
- _context.next = 6;
646
+ result = _context2.sent;
647
+ _context2.next = 6;
193
648
  break;
194
649
  case 5:
195
- _context.prev = 5;
196
- _t = _context["catch"](3);
197
- failure = _t instanceof Error ? _t.message : 'Validation error';
650
+ _context2.prev = 5;
651
+ _t6 = _context2["catch"](3);
652
+ result = {
653
+ error: resolveFailureMessage(_t6, rule),
654
+ warning: null
655
+ };
198
656
  case 6:
199
- if (!(failure !== null)) {
200
- _context.next = 8;
657
+ error = foldRuleResult(rule, result, state);
658
+ if (!(error !== null)) {
659
+ _context2.next = 7;
201
660
  break;
202
661
  }
203
- if (!rule.warningOnly) {
204
- _context.next = 7;
205
- break;
206
- }
207
- warning = warning !== null && warning !== void 0 ? warning : failure;
208
- _context.next = 8;
209
- break;
210
- case 7:
211
- return _context.abrupt("return", {
212
- error: failure,
213
- warning: warning
662
+ return _context2.abrupt("return", {
663
+ error: error,
664
+ warning: state.warning
214
665
  });
666
+ case 7:
667
+ _context2.next = 2;
668
+ break;
215
669
  case 8:
216
- _context.next = 2;
670
+ _context2.next = 10;
217
671
  break;
218
672
  case 9:
219
- _context.next = 11;
220
- break;
673
+ _context2.prev = 9;
674
+ _t7 = _context2["catch"](1);
675
+ _iterator7.e(_t7);
221
676
  case 10:
222
- _context.prev = 10;
223
- _t2 = _context["catch"](1);
224
- _iterator2.e(_t2);
677
+ _context2.prev = 10;
678
+ _iterator7.f();
679
+ return _context2.finish(10);
225
680
  case 11:
226
- _context.prev = 11;
227
- _iterator2.f();
228
- return _context.finish(11);
229
- case 12:
230
- return _context.abrupt("return", {
681
+ return _context2.abrupt("return", {
231
682
  error: null,
232
- warning: warning
683
+ warning: state.warning
233
684
  });
234
- case 13:
685
+ case 12:
235
686
  case "end":
236
- return _context.stop();
687
+ return _context2.stop();
237
688
  }
238
- }, _callee, null, [[1, 10, 11, 12], [3, 5]]);
689
+ }, _callee2, null, [[1, 9, 10, 11], [3, 5]]);
239
690
  }));
240
691
  }
241
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL3J1blJ1bGVzLmpzIiwiY29tcG9uZW50cy9Qcm9Gb3JtL3NyYy9jb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ydW5SdWxlcy50cyJdLCJuYW1lcyI6WyJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsInZhbHVlIiwicmVzb2x2ZSIsIlByb21pc2UiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJpc1RoZW5hYmxlIiwiX3R5cGVvZiIsImlzRW1wdHlWYWx1ZSIsInVuZGVmaW5lZCIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsImZpbHRlclJ1bGVzQnlUcmlnZ2VyIiwicnVsZXMiLCJ0cmlnZ2VyIiwiZm9ybVRyaWdnZXIiLCJmaWx0ZXIiLCJydWxlIiwicnVsZVRyaWdnZXIiLCJ2YWxpZGF0ZVRyaWdnZXIiLCJpbmNsdWRlcyIsImNoZWNrQnVpbHRpblJ1bGVzIiwibmFtZSIsInJlcXVpcmVkIiwibWVzc2FnZSIsImNvbmNhdCIsIm1pbiIsIm1heCIsIm1lYXN1cmVkIiwidW5pdCIsIk51bWJlciIsImlzTmFOIiwicGF0dGVybiIsInRlc3QiLCJqb2luIiwidHlwZSIsImVtYWlsUGF0dGVybiIsIlN0cmluZyIsIlVSTCIsIl9hIiwicnVuUnVsZXNTeW5jIiwidmFsdWVzIiwid2FybmluZyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJzIiwibiIsImZhaWx1cmUiLCJ2YWxpZGF0b3IiLCJlcnIiLCJFcnJvciIsIndhcm5pbmdPbmx5IiwiZXJyb3IiLCJmIiwicnVuUnVsZXNBc3luYyIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfdCIsIl90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O0lBQUEsR0FBQVgsT0FBQTtFQUFBLENBQ2hDLEVBQUE7QURsQ0QiLCJmaWxlIjoiY29tcG9uZW50cy9Qcm9Gb3JtL2NvcmUvcnVuUnVsZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmZ1bmN0aW9uIGlzVGhlbmFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpO1xufVxuLyoqIEVtcHR5IGZvciBgcmVxdWlyZWRgOiB1bmRlZmluZWQgLyBudWxsIC8gJycgLyBlbXB0eSBhcnJheS4gKi9cbmZ1bmN0aW9uIGlzRW1wdHlWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgICB2YWx1ZSA9PT0gJycgfHxcbiAgICAgICAgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpO1xufVxuLyoqXG4gKiBGaWx0ZXIgcnVsZXMgYXBwbGljYWJsZSB0byBhbiBpbnRlcmFjdGl2ZSB0cmlnZ2VyLiBBIHJ1bGUgV0lUSE9VVCBhblxuICogZXhwbGljaXQgYHZhbGlkYXRlVHJpZ2dlcmAgZm9sbG93cyB0aGUgZm9ybS1sZXZlbCB0cmlnZ2VyOyBhIHJ1bGUgV0lUSCBvbmVcbiAqIHJ1bnMgb24gZXhhY3RseSB0aG9zZSB0cmlnZ2VyKHMpLCByZWdhcmRsZXNzIG9mIHRoZSBmb3JtLWxldmVsIHNldHRpbmcuXG4gKiBTdWJtaXQtdGltZSB2YWxpZGF0aW9uIGJ5cGFzc2VzIHRoaXMgZmlsdGVyIGFuZCBydW5zIGV2ZXJ5IHJ1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJSdWxlc0J5VHJpZ2dlcihydWxlcywgdHJpZ2dlciwgZm9ybVRyaWdnZXIpIHtcbiAgICByZXR1cm4gcnVsZXMuZmlsdGVyKChydWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVUcmlnZ2VyID0gcnVsZS52YWxpZGF0ZVRyaWdnZXI7XG4gICAgICAgIGlmICghcnVsZVRyaWdnZXIpXG4gICAgICAgICAgICByZXR1cm4gZm9ybVRyaWdnZXIgPT09IHRyaWdnZXI7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJ1bGVUcmlnZ2VyKVxuICAgICAgICAgICAgPyBydWxlVHJpZ2dlci5pbmNsdWRlcyh0cmlnZ2VyKVxuICAgICAgICAgICAgOiBydWxlVHJpZ2dlciA9PT0gdHJpZ2dlcjtcbiAgICB9KTtcbn1cbi8qKlxuICogRXZhbHVhdGUgZXZlcnkgYnVpbHQtaW4gKG5vbi1gdmFsaWRhdG9yYCkgcnVsZSBraW5kIGZvciBhIHNpbmdsZSBydWxlLlxuICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGZpcnN0IGZhaWxpbmcgY2hlY2ssIG9yIG51bGwuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQnVpbHRpblJ1bGVzKHJ1bGUsIHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gcnVsZS5tZXNzYWdlIHx8IGAke25hbWV9IGlzIHJlcXVpcmVkYDtcbiAgICB9XG4gICAgLy8gbWluL21heDogc3RyaW5nIOKGkiBsZW5ndGgsIGFycmF5IOKGkiBpdGVtIGNvdW50LCBudW1iZXIg4oaSIG51bWVyaWMgdmFsdWVcbiAgICBpZiAocnVsZS5taW4gIT09IHVuZGVmaW5lZCB8fCBydWxlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBtZWFzdXJlZCA9IG51bGw7XG4gICAgICAgIGxldCB1bml0ID0gJyc7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBtZWFzdXJlZCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIHVuaXQgPSAnIGNoYXJhY3RlcnMnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBtZWFzdXJlZCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIHVuaXQgPSAnIGl0ZW1zJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICBtZWFzdXJlZCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZWFzdXJlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHJ1bGUubWluICE9PSB1bmRlZmluZWQgJiYgbWVhc3VyZWQgPCBydWxlLm1pbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7bmFtZX0gbXVzdCBiZSBhdCBsZWFzdCAke3J1bGUubWlufSR7dW5pdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGUubWF4ICE9PSB1bmRlZmluZWQgJiYgbWVhc3VyZWQgPiBydWxlLm1heCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7bmFtZX0gbXVzdCBiZSBubyBtb3JlIHRoYW4gJHtydWxlLm1heH0ke3VuaXR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocnVsZS5wYXR0ZXJuICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIXJ1bGUucGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gcnVsZS5tZXNzYWdlIHx8IGAke25hbWV9IGZvcm1hdCBpcyBpbnZhbGlkYDtcbiAgICB9XG4gICAgaWYgKHJ1bGUuZW51bSAmJiBBcnJheS5pc0FycmF5KHJ1bGUuZW51bSkgJiYgdmFsdWUpIHtcbiAgICAgICAgaWYgKCFydWxlLmVudW0uaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gcnVsZS5tZXNzYWdlIHx8IGAke25hbWV9IG11c3QgYmUgb25lIG9mICR7cnVsZS5lbnVtLmpvaW4oJywgJyl9YDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocnVsZS50eXBlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSAnJykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCBpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7bmFtZX0gbXVzdCBiZSBhIG51bWJlcmA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJ1bGUudHlwZSA9PT0gJ2VtYWlsJyAmJiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBlbWFpbFBhdHRlcm4gPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLztcbiAgICAgICAgaWYgKCFlbWFpbFBhdHRlcm4udGVzdChTdHJpbmcodmFsdWUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bGUubWVzc2FnZSB8fCBgJHtuYW1lfSBtdXN0IGJlIGEgdmFsaWQgZW1haWxgO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChydWxlLnR5cGUgPT09ICd1cmwnICYmIHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgVVJMKFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bGUubWVzc2FnZSB8fCBgJHtuYW1lfSBtdXN0IGJlIGEgdmFsaWQgVVJMYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogU3luY2hyb25vdXMgcnVsZSBydW4uIEEgUHJvbWlzZS1yZXR1cm5pbmcgdmFsaWRhdG9yIENBTk5PVCBiZSBldmFsdWF0ZWRcbiAqIGhlcmUg4oCUIGl0IGlzIGRlZmVycmVkICh0cmVhdGVkIGFzIHBhc3NpbmcgZm9yIHRoaXMgcnVuOyBpdHMgcmVqZWN0aW9uIGlzXG4gKiBzd2FsbG93ZWQpIGFuZCBsZWZ0IHRvIHRoZSBhc3luYyBydW5zIChibHVyL3N1Ym1pdCksIHdoaWNoIGFsd2F5cyBhd2FpdCBpdC5cbiAqIEZhaWxpbmcgaXQgaW5zdGVhZCB3b3VsZCBtaXMtcmVwb3J0IFwiVmFsaWRhdGlvbiBmYWlsZWRcIiBvbiBldmVyeSBrZXlzdHJva2VcbiAqIGZvciBwZXJmZWN0bHkgdmFsaWQgaW5wdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5SdWxlc1N5bmMobmFtZSwgdmFsdWUsIHZhbHVlcywgcnVsZXMpIHtcbiAgICBsZXQgd2FybmluZyA9IG51bGw7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICAgIGxldCBmYWlsdXJlID0gY2hlY2tCdWlsdGluUnVsZXMocnVsZSwgdmFsdWUsIG5hbWUpO1xuICAgICAgICBpZiAoZmFpbHVyZSA9PT0gbnVsbCAmJiB0eXBlb2YgcnVsZS52YWxpZGF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcnVsZS52YWxpZGF0b3IodmFsdWUsIHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgaWYgKGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbih1bmRlZmluZWQsICgpID0+IHsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsdXJlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgPyByZXN1bHQgOiAnVmFsaWRhdGlvbiBmYWlsZWQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBmYWlsdXJlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICdWYWxpZGF0aW9uIGVycm9yJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmFpbHVyZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHJ1bGUud2FybmluZ09ubHkpIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nID0gd2FybmluZyAhPT0gbnVsbCAmJiB3YXJuaW5nICE9PSB2b2lkIDAgPyB3YXJuaW5nIDogZmFpbHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBmYWlsdXJlLCB3YXJuaW5nIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZXJyb3I6IG51bGwsIHdhcm5pbmcgfTtcbn1cbi8qKlxuICogQXN5bmNocm9ub3VzIHJ1bGUgcnVuLiBDdXN0b20gdmFsaWRhdG9ycyBhcmUgYXdhaXRlZCAoc3luYyBvciBhc3luYykuIEFcbiAqIHZhbGlkYXRvciByZXR1cm5pbmcgYHVuZGVmaW5lZGAgaXMgdHJlYXRlZCBhcyBwYXNzaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuUnVsZXNBc3luYyhuYW1lLCB2YWx1ZSwgdmFsdWVzLCBydWxlcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCB3YXJuaW5nID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICAgICAgICBsZXQgZmFpbHVyZSA9IGNoZWNrQnVpbHRpblJ1bGVzKHJ1bGUsIHZhbHVlLCBuYW1lKTtcbiAgICAgICAgICAgIGlmIChmYWlsdXJlID09PSBudWxsICYmIHR5cGVvZiBydWxlLnZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIFByb21pc2UucmVzb2x2ZShydWxlLnZhbGlkYXRvcih2YWx1ZSwgdmFsdWVzKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHRydWUgJiYgcmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgPSB0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/IHJlc3VsdCA6ICdWYWxpZGF0aW9uIGZhaWxlZCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBmYWlsdXJlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICdWYWxpZGF0aW9uIGVycm9yJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmFpbHVyZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLndhcm5pbmdPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSB3YXJuaW5nICE9PSBudWxsICYmIHdhcm5pbmcgIT09IHZvaWQgMCA/IHdhcm5pbmcgOiBmYWlsdXJlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGZhaWx1cmUsIHdhcm5pbmcgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG51bGwsIHdhcm5pbmcgfTtcbiAgICB9KTtcbn0iLG51bGxdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjIn0=
692
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL3J1blJ1bGVzLmpzIiwiY29tcG9uZW50cy9Qcm9Gb3JtL3NyYy9jb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ydW5SdWxlcy50cyJdLCJuYW1lcyI6WyJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsInZhbHVlIiwicmVzb2x2ZSIsIlByb21pc2UiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJyZXNvbHZlVmFsdWUiLCJkZXZXYXJuT25jZSIsImlzVGhlbmFibGUiLCJfdHlwZW9mIiwiaXNFbXB0eVZhbHVlIiwidW5kZWZpbmVkIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiY29lcmNlRmFpbHVyZVJlYXNvbiIsInJlYXNvbiIsIkVycm9yIiwibWVzc2FnZSIsInJlc29sdmVGYWlsdXJlTWVzc2FnZSIsInJ1bGUiLCJfYSIsInJlc29sdmVSdWxlcyIsInJ1bGVzIiwidmFsdWVzIiwiaW5zdGFuY2UiLCJzb21lIiwiY3R4IiwiT2JqZWN0IiwiYXNzaWduIiwiZ2V0RmllbGRWYWx1ZSIsIm5hbWUiLCJnZXRGaWVsZHNWYWx1ZSIsIm1hcCIsImVyciIsInZhbGlkYXRvciIsIm5vcm1hbGl6ZVRyaWdnZXJzIiwiaXRlbVRyaWdnZXIiLCJmb3JtVHJpZ2dlciIsImVmZmVjdGl2ZSIsImZpbHRlclJ1bGVzQnlUcmlnZ2VyIiwidHJpZ2dlciIsImFjdGl2ZVRyaWdnZXJzIiwiZmllbGROYW1lIiwiaW5jbHVkZXMiLCJmaWx0ZXIiLCJydWxlVHJpZ2dlciIsInZhbGlkYXRlVHJpZ2dlciIsInJ1bGVUcmlnZ2VycyIsIm1hdGNoZXMiLCJ0IiwiY29uY2F0Iiwiam9pbiIsIlRZUEVfQ0hFQ0tTIiwic3RyaW5nIiwidiIsIm51bWJlciIsIk51bWJlciIsImlzTmFOIiwiYm9vbGVhbiIsIm1ldGhvZCIsImludGVnZXIiLCJpc0ludGVnZXIiLCJmbG9hdCIsImFycmF5Iiwib2JqZWN0IiwiZGF0ZSIsIkRhdGUiLCJnZXRUaW1lIiwicmVnZXhwIiwiUmVnRXhwIiwiaGV4IiwidGVzdCIsImVtYWlsIiwidXJsIiwiVVJMIiwidHlwZUZhaWx1cmVNZXNzYWdlIiwidHlwZSIsIm1lYXN1cmVWYWx1ZSIsIm1lYXN1cmVkIiwidW5pdCIsImNoZWNrQnVpbHRpblJ1bGVzIiwicmVxdWlyZWQiLCJ3aGl0ZXNwYWNlIiwidHJpbSIsImxlbiIsIm0iLCJtaW4iLCJtYXgiLCJwYXR0ZXJuIiwiZ2xvYmFsIiwic3RpY2t5IiwibGFzdEluZGV4IiwidG9SdWxlQXJyYXkiLCJkZWVwTWVtYmVycyIsIm1lbWJlciIsImluZGV4IiwiU3RyaW5nIiwiZW50cmllcyIsIlBBU1MiLCJlcnJvciIsIndhcm5pbmciLCJ3YXJuTGVnYWN5VmFsaWRhdG9yUmV0dXJuIiwiYXBwbHlUcmFuc2Zvcm0iLCJyYXdWYWx1ZSIsInRyYW5zZm9ybSIsIm9rIiwiZmFpbHVyZSIsImRlZXBSdWxlRW50cmllcyIsImZpZWxkcyIsInNvdXJjZSIsIl9pIiwiX09iamVjdCRlbnRyaWVzIiwiX09iamVjdCRlbnRyaWVzJF9pIiwiX3NsaWNlZFRvQXJyYXkiLCJrZXkiLCJzdWJSdWxlcyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJzIiwibiIsInN1YlJ1bGUiLCJwdXNoIiwiZiIsImRlZmF1bHRGaWVsZCIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfc3RlcDIkdmFsdWUiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwibWVyZ2VTdWJSZXN1bHQiLCJhY2MiLCJzdWIiLCJ3YXJuaW5nT25seSIsImZvbGRSdWxlUmVzdWx0Iiwic3RhdGUiLCJjb250ZW50IiwiZXZhbFJ1bGVTeW5jIiwicHJlcCIsInJlc29sdmVkIiwiX2l0ZXJhdG9yNCIsIl9zdGVwNCIsIl9zdGVwNCR2YWx1ZSIsInN1YlZhbHVlIiwic3ViTmFtZSIsImV2YWxSdWxlQXN5bmMiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJfaXRlcmF0b3I1IiwiX3N0ZXA1IiwiX3N0ZXA1JHZhbHVlIiwiX3QiLCJfdDIiLCJfdDMiLCJfdDQiLCJfdDUiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwiYWJydXB0Iiwic2VudCIsImZpbmlzaCIsInN0b3AiLCJydW5SdWxlc1N5bmMiLCJfaXRlcmF0b3I2IiwiX3N0ZXA2IiwicnVuUnVsZXNBc3luYyIsIl9jYWxsZWUyIiwiX2l0ZXJhdG9yNyIsIl9zdGVwNyIsIl90NiIsIl90NyIsIl9jb250ZXh0MiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBSUEsU0FBUyxHQUFJLElBQUksSUFBSSxJQUFJLENBQUNBLFNBQVMsSUFBSyxVQUFVQyxPQUFPLEVBQUVDLFVBQVUsRUFBRUMsQ0FBQyxFQUFFQyxTQUFTLEVBQUU7RUFDckYsU0FBU0MsS0FBS0EsQ0FBQ0MsS0FBSyxFQUFFO0lBQUUsT0FBT0EsS0FBSyxZQUFZSCxDQUFDLEdBQUdHLEtBQUssR0FBRyxJQUFJSCxDQUFDLENBQUMsVUFBVUksT0FBTyxFQUFFO01BQUVBLE9BQU8sQ0FBQ0QsS0FBSyxDQUFDO0lBQUUsQ0FBQyxDQUFDO0VBQUU7RUFDM0csT0FBTyxLQUFLSCxDQUFDLEtBQUtBLENBQUMsR0FBR0ssT0FBTyxDQUFDLEVBQUUsVUFBVUQsT0FBTyxFQUFFRSxNQUFNLEVBQUU7SUFDdkQsU0FBU0MsU0FBU0EsQ0FBQ0osS0FBSyxFQUFFO01BQUUsSUFBSTtRQUFFSyxJQUFJLENBQUNQLFNBQVMsQ0FBQ1EsSUFBSSxDQUFDTixLQUFLLENBQUMsQ0FBQztNQUFFLENBQUMsQ0FBQyxPQUFPTyxDQUFDLEVBQUU7UUFBRUosTUFBTSxDQUFDSSxDQUFDLENBQUM7TUFBRTtJQUFFO0lBQzFGLFNBQVNDLFFBQVFBLENBQUNSLEtBQUssRUFBRTtNQUFFLElBQUk7UUFBRUssSUFBSSxDQUFDUCxTQUFT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VUFBTyxDQUFFO1FBQUE7VUFBQXlFLFNBQUEsQ0FBQS9LLElBQUE7VUFBQTtRQUFBO1VBQUErSyxTQUFBLENBQUEvSyxJQUFBO1VBQUE7UUFBQTtVQUFBK0ssU0FBQSxDQUFBZCxJQUFBO1VBQUFhLEdBQUEsR0FBQUMsU0FBQTtVQUFBSixVQUFBLENBQUExSyxDQUFBLENBQUE2SyxHQUFBO1FBQUE7VUFBQUMsU0FBQSxDQUFBZCxJQUFBO1VBQUFVLFVBQUEsQ0FBQTlDLENBQUE7VUFBQSxPQUFBa0QsU0FBQSxDQUFBWCxNQUFBO1FBQUE7VUFBQSxPQUFBVyxTQUFBLENBQUFiLE1BQUEsV0FFdkQ7WUFBRTdELEtBQUssRUFBRSxJQUFJO1lBQUVDLE9BQU8sRUFBRW1DLEtBQUssQ0FBQ25DO1VBQU8sQ0FBRTtRQUFBO1FBQUE7VUFBQSxPQUFBeUUsU0FBQSxDQUFBVixJQUFBO01BQUE7SUFBQSxHQUFBSyxRQUFBO0VBQUEsQ0FDL0MsRUFBQTtBRHRFRCIsImZpbGUiOiJjb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ydW5SdWxlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnLi9wYXRoVXRpbHMnO1xuaW1wb3J0IHsgZGV2V2Fybk9uY2UgfSBmcm9tICcuL2Rldldhcm5pbmcnO1xuZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJyk7XG59XG4vKiogRW1wdHkgZm9yIGByZXF1aXJlZGA6IHVuZGVmaW5lZCAvIG51bGwgLyAnJyAvIGVtcHR5IGFycmF5LiAqL1xuZnVuY3Rpb24gaXNFbXB0eVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICAgIHZhbHVlID09PSAnJyB8fFxuICAgICAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSk7XG59XG4vKipcbiAqIENvZXJjZSBhIHRocm93bi9yZWplY3RlZCByZWFzb24gaW50byBkaXNwbGF5YWJsZSBmYWlsdXJlIGNvbnRlbnQ6XG4gKiBhIG5vbi1lbXB0eSBFcnJvci5tZXNzYWdlIG9yIGEgbm9uLWVtcHR5IHBsYWluIHN0cmluZyDigJQgb3RoZXJ3aXNlIG51bGxcbiAqIChjYWxsZXIgcGlja3MgaXRzIGZhbGxiYWNrKS4gU2hhcmVkIHdpdGggdGhlIGZvcm0tbGV2ZWwgbGFzdC1yZXNvcnQgbmV0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvZXJjZUZhaWx1cmVSZWFzb24ocmVhc29uKSB7XG4gICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yICYmIHJlYXNvbi5tZXNzYWdlKVxuICAgICAgICByZXR1cm4gcmVhc29uLm1lc3NhZ2U7XG4gICAgaWYgKHR5cGVvZiByZWFzb24gPT09ICdzdHJpbmcnICYmIHJlYXNvbilcbiAgICAgICAgcmV0dXJuIHJlYXNvbjtcbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogRmFpbHVyZSBtZXNzYWdlIGZvciBhIHJlamVjdGVkL3Rocm93biBjdXN0b20gdmFsaWRhdG9yOlxuICogRXJyb3IubWVzc2FnZSDihpIgcGxhaW4gc3RyaW5nIHJlYXNvbiDihpIgcnVsZS5tZXNzYWdlIOKGkiBnZW5lcmljIGZhbGxiYWNrLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRmFpbHVyZU1lc3NhZ2UocmVhc29uLCBydWxlKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBjb2VyY2VGYWlsdXJlUmVhc29uKHJlYXNvbikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChydWxlLm1lc3NhZ2UgfHwgJ1ZhbGlkYXRpb24gZmFpbGVkJyk7XG59XG4vKipcbiAqIFJlc29sdmUgZnVuY3Rpb24tZm9ybSBydWxlcyBpbnRvIHN0YXRpYyBydWxlcy4gVGhlXG4gKiBjb250ZXh0IGV4cG9zZXMgdGhlIHZhbHVlIHNuYXBzaG90IHRoZSBydW4gd2FzIGludm9rZWQgd2l0aDsgZnVuY3Rpb24gcnVsZXNcbiAqIG11c3QgYmUgY2hlYXAgYW5kIHNpZGUtZWZmZWN0IGZyZWUg4oCUIHRoZXkgbWF5IGJlIHJlc29sdmVkIG1vcmUgdGhhbiBvbmNlXG4gKiBwZXIgdmFsaWRhdGlvbiBwYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJ1bGVzKHJ1bGVzLCB2YWx1ZXMsIGluc3RhbmNlKSB7XG4gICAgLy8gRmFzdCBwYXRoOiBubyBmdW5jdGlvbiBydWxlcyDihpIgbm90aGluZyB0byByZXNvbHZlLCBubyBjdHggYWxsb2NhdGlvbi5cbiAgICAvLyBUaGlzIGFsc28gbWFrZXMgdGhlIGVuZ2luZS1pbnRlcm5hbCByZS1yZXNvbHV0aW9uIG9mIGFscmVhZHktcmVzb2x2ZWRcbiAgICAvLyBhcnJheXMgZnJlZS5cbiAgICBpZiAoIXJ1bGVzLnNvbWUoKHJ1bGUpID0+IHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuICAgIC8vIExpdmUtaW5zdGFuY2UgbWVtYmVycyAoc2V0RmllbGRzVmFsdWUsIGdldEZpZWxkRXJyb3IsIOKApikgYXJlIHNwcmVhZCBpblxuICAgIC8vIHdoZW4gYXZhaWxhYmxlOyB0aGUgcmVhZHMgYWx3YXlzIGNvbWUgZnJvbSB0aGUgdmFsaWRhdGlvbi10aW1lIHNuYXBzaG90LlxuICAgIGNvbnN0IGN0eCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW5zdGFuY2UpLCB7IGdldEZpZWxkVmFsdWU6IChuYW1lKSA9PiByZXNvbHZlVmFsdWUodmFsdWVzLCBuYW1lKSwgZ2V0RmllbGRzVmFsdWU6ICgpID0+IHZhbHVlcyB9KTtcbiAgICByZXR1cm4gcnVsZXMubWFwKChydWxlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcnVsZSAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHJldHVybiBydWxlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bGUoY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBBIHRocm93aW5nIHJ1bGUgZmFjdG9yeSBtdXN0IG5vdCBjcmFzaCByZW5kZXJpbmcgb3IgdmFsaWRhdGlvbiDigJRcbiAgICAgICAgICAgIC8vIHN1cmZhY2UgaXQgYXMgYSBydWxlIHRoYXQgYWx3YXlzIGZhaWxzIHdpdGggdGhlIHRocm93biByZWFzb24uXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRvcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogTm9ybWFsaXplIGEgZm9ybS9pdGVtLWxldmVsIHZhbGlkYXRlVHJpZ2dlciBjb25maWcgaW50byB0aGUgZWZmZWN0aXZlXG4gKiBpbnRlcmFjdGl2ZSBldmVudCBsaXN0OiBpdGVtLWxldmVsICh3aGVuIHByZXNlbnQpIG92ZXJyaWRlcyBmb3JtLWxldmVsO1xuICogYGZhbHNlYCBkaXNhYmxlcyBpbnRlcmFjdGl2ZSB2YWxpZGF0aW9uIGVudGlyZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVHJpZ2dlcnMoaXRlbVRyaWdnZXIsIGZvcm1UcmlnZ2VyKSB7XG4gICAgY29uc3QgZWZmZWN0aXZlID0gaXRlbVRyaWdnZXIgPT09IHVuZGVmaW5lZCA/IGZvcm1UcmlnZ2VyIDogaXRlbVRyaWdnZXI7XG4gICAgaWYgKGVmZmVjdGl2ZSA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlZmZlY3RpdmUpID8gZWZmZWN0aXZlIDogW2VmZmVjdGl2ZV07XG59XG4vKipcbiAqIEZpbHRlciBydWxlcyBhcHBsaWNhYmxlIHRvIGFuIGludGVyYWN0aXZlIGV2ZW50OiB0aGUgZXZlbnRcbiAqIHZhbGlkYXRlcyBvbmx5IHdoZW4gaXQgaXMgaW4gdGhlIGl0ZW0ncyBlZmZlY3RpdmUgdHJpZ2dlciBzZXQuIFdpdGhpbiB0aGVcbiAqIHNldCwgYSBydWxlIFdJVEhPVVQgYHZhbGlkYXRlVHJpZ2dlcmAgcnVucyBvbiBldmVyeSBldmVudDsgYSBydWxlIFdJVEggb25lXG4gKiBydW5zIG9ubHkgb24gbWF0Y2hpbmcgZXZlbnRzIOKAlCBzbyBhIHJ1bGUgdHJpZ2dlciBvdXRzaWRlIHRoZSBpdGVtJ3Mgc2V0XG4gKiBuZXZlciBmaXJlcyBpbnRlcmFjdGl2ZWx5LiBTdWJtaXQtdGltZSB2YWxpZGF0aW9uIGJ5cGFzc2VzIHRoaXMgZmlsdGVyIGFuZFxuICogcnVucyBldmVyeSBydWxlLlxuICpcbiAqIERldiBndWFyZDogYSBydWxlIHdob3NlIChub24tZW1wdHkpIHRyaWdnZXIgc2V0IGlzIGZ1bGx5IE9VVFNJREUgdGhlXG4gKiBhY3RpdmUgc2V0IGNhbiBuZXZlciBmaXJlIGludGVyYWN0aXZlbHkg4oCUIHVzdWFsbHkgYSBsZWZ0b3ZlciBvZiB0aGVcbiAqIHByZS0wLjAuNzYgb3ZlcnJpZGUgc2VtYW50aWNzLCBzbyBpdCB3YXJucyBvbmNlLiBgdmFsaWRhdGVUcmlnZ2VyOiBbXWBcbiAqIGlzIHRoZSBkZWxpYmVyYXRlIHN1Ym1pdC1vbmx5IGlkaW9tIGFuZCBzdGF5cyBzaWxlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJSdWxlc0J5VHJpZ2dlcihydWxlcywgdHJpZ2dlciwgYWN0aXZlVHJpZ2dlcnMsIGZpZWxkTmFtZSkge1xuICAgIGlmICghYWN0aXZlVHJpZ2dlcnMuaW5jbHVkZXModHJpZ2dlcikpXG4gICAgICAgIHJldHVybiBbXTtcbiAgICByZXR1cm4gcnVsZXMuZmlsdGVyKChydWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVUcmlnZ2VyID0gcnVsZS52YWxpZGF0ZVRyaWdnZXI7XG4gICAgICAgIGlmIChydWxlVHJpZ2dlciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IHJ1bGVUcmlnZ2VycyA9IEFycmF5LmlzQXJyYXkocnVsZVRyaWdnZXIpID8gcnVsZVRyaWdnZXIgOiBbcnVsZVRyaWdnZXJdO1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gcnVsZVRyaWdnZXJzLmluY2x1ZGVzKHRyaWdnZXIpO1xuICAgICAgICBpZiAoIW1hdGNoZXMgJiZcbiAgICAgICAgICAgIHJ1bGVUcmlnZ2Vycy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAhcnVsZVRyaWdnZXJzLnNvbWUoKHQpID0+IGFjdGl2ZVRyaWdnZXJzLmluY2x1ZGVzKHQpKSkge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGZpZWxkTmFtZSAhPT0gbnVsbCAmJiBmaWVsZE5hbWUgIT09IHZvaWQgMCA/IGZpZWxkTmFtZSA6ICcodW5rbm93biknO1xuICAgICAgICAgICAgZGV2V2Fybk9uY2UoYHRyaWdnZXI6JHtuYW1lfToke3J1bGVUcmlnZ2Vycy5qb2luKCcsJyl9YCwgYFtQcm9Gb3JtXSBGaWVsZCBcIiR7bmFtZX1cIjogcnVsZSB2YWxpZGF0ZVRyaWdnZXIgWyR7cnVsZVRyaWdnZXJzLmpvaW4oJywgJyl9XSBpcyBvdXRzaWRlIHRoaXMgZmllbGQncyBhY3RpdmUgdHJpZ2dlciBzZXQgWyR7YWN0aXZlVHJpZ2dlcnMuam9pbignLCAnKX1dIOKAlCB0aGUgcnVsZSB3aWxsIG9ubHkgcnVuIG9uIHN1Ym1pdC4gSW5jbHVkZSBpdCBpbiB0aGUgaXRlbS9mb3JtIHZhbGlkYXRlVHJpZ2dlciB0byBydW4gaXQgaW50ZXJhY3RpdmVseS5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9KTtcbn1cbi8qKiBCdWlsdC1pbiBgdHlwZWAgY2hlY2tzLiBgZW51bWAgaXMgaGFuZGxlZCBzZXBhcmF0ZWx5IGFnYWluc3QgYHJ1bGUuZW51bWAuICovXG5jb25zdCBUWVBFX0NIRUNLUyA9IHtcbiAgICBzdHJpbmc6ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycsXG4gICAgbnVtYmVyOiAodikgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odiksXG4gICAgYm9vbGVhbjogKHYpID0+IHR5cGVvZiB2ID09PSAnYm9vbGVhbicsXG4gICAgbWV0aG9kOiAodikgPT4gdHlwZW9mIHYgPT09ICdmdW5jdGlvbicsXG4gICAgaW50ZWdlcjogKHYpID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKHYpLFxuICAgIGZsb2F0OiAodikgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odikgJiYgIU51bWJlci5pc0ludGVnZXIodiksXG4gICAgYXJyYXk6ICh2KSA9PiBBcnJheS5pc0FycmF5KHYpLFxuICAgIG9iamVjdDogKHYpID0+IHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpLFxuICAgIGRhdGU6ICh2KSA9PiB2IGluc3RhbmNlb2YgRGF0ZVxuICAgICAgICA/ICFOdW1iZXIuaXNOYU4odi5nZXRUaW1lKCkpXG4gICAgICAgIDogdHlwZW9mICh2ID09PSBudWxsIHx8IHYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHYuZ2V0VGltZSkgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgICAgICFOdW1iZXIuaXNOYU4odi5nZXRUaW1lKCkpLFxuICAgIHJlZ2V4cDogKHYpID0+IHtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiB2ICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyBSZWdFeHAodik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGV4OiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIC9eIz8oW2EtZjAtOV17Nn18W2EtZjAtOV17M30pJC9pLnRlc3QodiksXG4gICAgLy8gU3RyaW5nLW9ubHk6IGNvZXJjaW5nIHZpYSBTdHJpbmcoKSB3b3VsZCBsZXQgZS5nLiBbJ2FAYi5jbyddIHN0cmluZ2lmeVxuICAgIC8vIGludG8gYSBwYXNzaW5nIHZhbHVlLlxuICAgIGVtYWlsOiAodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvLnRlc3QodiksXG4gICAgdXJsOiAodikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHYgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmV3IFVSTCh2KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcbn07XG4vKiogRnJpZW5kbHkgZ2VuZXJhdGVkIG1lc3NhZ2VzIGZvciB0aGUgbGVnYWN5IHR5cGUgbmFtZXM7IG90aGVycyBnZXQgYSBnZW5lcmljIG9uZS4gKi9cbmZ1bmN0aW9uIHR5cGVGYWlsdXJlTWVzc2FnZShuYW1lLCB0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKVxuICAgICAgICByZXR1cm4gYCR7bmFtZX0gbXVzdCBiZSBhIG51bWJlcmA7XG4gICAgaWYgKHR5cGUgPT09ICdlbWFpbCcpXG4gICAgICAgIHJldHVybiBgJHtuYW1lfSBtdXN0IGJlIGEgdmFsaWQgZW1haWxgO1xuICAgIGlmICh0eXBlID09PSAndXJsJylcbiAgICAgICAgcmV0dXJuIGAke25hbWV9IG11c3QgYmUgYSB2YWxpZCBVUkxgO1xuICAgIHJldHVybiBgJHtuYW1lfSBpcyBub3QgYSB2YWxpZCAke3R5cGV9YDtcbn1cbi8qKiBNZWFzdXJlIGEgdmFsdWUgZm9yIGxlbi9taW4vbWF4OiBzdHJpbmcg4oaSIGxlbmd0aCwgYXJyYXkg4oaSIGNvdW50LCBudW1iZXIg4oaSIHZhbHVlLiAqL1xuZnVuY3Rpb24gbWVhc3VyZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgIHJldHVybiB7IG1lYXN1cmVkOiB2YWx1ZS5sZW5ndGgsIHVuaXQ6ICcgY2hhcmFjdGVycycgfTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB7IG1lYXN1cmVkOiB2YWx1ZS5sZW5ndGgsIHVuaXQ6ICcgaXRlbXMnIH07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgIU51bWJlci5pc05hTih2YWx1ZSkpXG4gICAgICAgIHJldHVybiB7IG1lYXN1cmVkOiB2YWx1ZSwgdW5pdDogJycgfTtcbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogRXZhbHVhdGUgZXZlcnkgYnVpbHQtaW4gKG5vbi1gdmFsaWRhdG9yYCkgcnVsZSBraW5kIGZvciBhIHNpbmdsZSBydWxlLlxuICogUmV0dXJucyB0aGUgZXJyb3IgY29udGVudCBmb3IgdGhlIGZpcnN0IGZhaWxpbmcgY2hlY2ssIG9yIG51bGwuXG4gKlxuICogRW1wdHkgdmFsdWVzICh1bmRlZmluZWQgLyBudWxsIC8gJycgLyBlbXB0eSBhcnJheSkgYXJlIG9ubHkgY2hlY2tlZCBieVxuICogYHJlcXVpcmVkYCDigJQgZXZlcnkgb3RoZXIgYnVpbHRpbiBjaGVjayBpcyBza2lwcGVkLCBzbyBvcHRpb25hbCBmaWVsZHNcbiAqIGRvbid0IGVycm9yIHVudGlsIHRoZXkgaGF2ZSBjb250ZW50LiBDdXN0b20gdmFsaWRhdG9ycyBhcmUgTk9UIHN1YmplY3QgdG9cbiAqIHRoaXMgc2tpcCAodGhleSByZWNlaXZlIHRoZSBlbXB0eSB2YWx1ZSBhbmQgZGVjaWRlIHRoZW1zZWx2ZXMpLlxuICovXG5mdW5jdGlvbiBjaGVja0J1aWx0aW5SdWxlcyhydWxlLCB2YWx1ZSwgbmFtZSkge1xuICAgIGlmIChydWxlLnJlcXVpcmVkICYmIGlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHJ1bGUubWVzc2FnZSB8fCBgJHtuYW1lfSBpcyByZXF1aXJlZGA7XG4gICAgfVxuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAvLyBOb24tZW1wdHkgc3RyaW5nIG9mIG9ubHkgd2hpdGVzcGFjZSAodGhlIHJlcXVpcmVkK3doaXRlc3BhY2UgdHJpbSBpZGlvbSkuXG4gICAgaWYgKHJ1bGUud2hpdGVzcGFjZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHJ1bGUubWVzc2FnZSB8fCBgJHtuYW1lfSBjYW5ub3QgYmUgYmxhbmtgO1xuICAgIH1cbiAgICAvLyBsZW46IGV4YWN0IGxlbmd0aC9jb3VudC92YWx1ZSDigJQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIG1pbi9tYXguXG4gICAgaWYgKHJ1bGUubGVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbSA9IG1lYXN1cmVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGlmIChtICE9PSBudWxsICYmIG0ubWVhc3VyZWQgIT09IHJ1bGUubGVuKSB7XG4gICAgICAgICAgICByZXR1cm4gcnVsZS5tZXNzYWdlIHx8IGAke25hbWV9IG11c3QgYmUgZXhhY3RseSAke3J1bGUubGVufSR7bS51bml0fWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAocnVsZS5taW4gIT09IHVuZGVmaW5lZCB8fCBydWxlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG0gPSBtZWFzdXJlVmFsdWUodmFsdWUpO1xuICAgICAgICBpZiAobSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHJ1bGUubWluICE9PSB1bmRlZmluZWQgJiYgbS5tZWFzdXJlZCA8IHJ1bGUubWluKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGUubWVzc2FnZSB8fCBgJHtuYW1lfSBtdXN0IGJlIGF0IGxlYXN0ICR7cnVsZS5taW59JHttLnVuaXR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlLm1heCAhPT0gdW5kZWZpbmVkICYmIG0ubWVhc3VyZWQgPiBydWxlLm1heCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7bmFtZX0gbXVzdCBiZSBubyBtb3JlIHRoYW4gJHtydWxlLm1heH0ke20udW5pdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChydWxlLnBhdHRlcm4gJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBBIC9nIG9yIC95IHJlZ2V4IGlzIHN0YXRlZnVsOiBsYXN0SW5kZXggcGVyc2lzdHMgYWNyb3NzIC50ZXN0KCkgY2FsbHMsXG4gICAgICAgIC8vIHNvIHJlcGVhdGVkIHJ1bnMgd291bGQgYWx0ZXJuYXRlIHBhc3MvZmFpbCDigJQgcmVzZXQgaXQgZXZlcnkgcnVuLlxuICAgICAgICBpZiAocnVsZS5wYXR0ZXJuLmdsb2JhbCB8fCBydWxlLnBhdHRlcm4uc3RpY2t5KVxuICAgICAgICAgICAgcnVsZS5wYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIGlmICghcnVsZS5wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gcnVsZS5tZXNzYWdlIHx8IGAke25hbWV9IGZvcm1hdCBpcyBpbnZhbGlkYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocnVsZS50eXBlICYmIHJ1bGUudHlwZSAhPT0gJ2VudW0nICYmICFUWVBFX0NIRUNLU1tydWxlLnR5cGVdKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gcnVsZS5tZXNzYWdlIHx8IHR5cGVGYWlsdXJlTWVzc2FnZShuYW1lLCBydWxlLnR5cGUpO1xuICAgIH1cbiAgICAvLyBlbnVtIG1lbWJlcnNoaXA6IGFwcGxpZXMgZm9yIHR5cGUgJ2VudW0nIG9yIHdoZW5ldmVyIHJ1bGUuZW51bSBpcyBwcmVzZW50LlxuICAgIGlmIChydWxlLmVudW0gJiYgQXJyYXkuaXNBcnJheShydWxlLmVudW0pICYmICFydWxlLmVudW0uaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7bmFtZX0gbXVzdCBiZSBvbmUgb2YgJHtydWxlLmVudW0uam9pbignLCAnKX1gO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHRvUnVsZUFycmF5KHJ1bGVzKSB7XG4gICAgaWYgKCFydWxlcylcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJ1bGVzKSA/IHJ1bGVzIDogW3J1bGVzXTtcbn1cbi8qKiBNZW1iZXJzIGZvciBkZWVwIHJ1bGVzOiBhcnJheSDihpIgaW5kZXhlZCBlbnRyaWVzLCBwbGFpbiBvYmplY3Qg4oaSIGtleSBlbnRyaWVzLiAqL1xuZnVuY3Rpb24gZGVlcE1lbWJlcnModmFsdWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKG1lbWJlciwgaW5kZXgpID0+IFtTdHJpbmcoaW5kZXgpLCBtZW1iZXJdKTtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JylcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHZhbHVlKTtcbiAgICByZXR1cm4gW107XG59XG5jb25zdCBQQVNTID0geyBlcnJvcjogbnVsbCwgd2FybmluZzogbnVsbCB9O1xuLyoqXG4gKiBEZXYgZ3VhcmQgZm9yIHRoZSBwcmUtMC4wLjc2IHZhbGlkYXRvciBjb250cmFjdDogcmV0dXJuaW5nIGEgc3RyaW5nIG9yXG4gKiBgZmFsc2VgIHVzZWQgdG8gRkFJTCB0aGUgcnVsZSDigJQgdW5kZXIgdGhlIGAocnVsZSwgdmFsdWUpYCBjb250cmFjdCByZXR1cm5cbiAqIHZhbHVlcyBhcmUgaWdub3JlZCBhbmQgb25seSB0aHJvdy9yZWplY3QgZmFpbHMuIFN1Y2ggYSByZXR1cm4gaXMgYWxtb3N0XG4gKiBjZXJ0YWlubHkgYSBsZWdhY3kgdmFsaWRhdG9yIHNpbGVudGx5IHBhc3NpbmcsIHNvIGl0IHdhcm5zIG9uY2UuXG4gKi9cbmZ1bmN0aW9uIHdhcm5MZWdhY3lWYWxpZGF0b3JSZXR1cm4obmFtZSwgcmVzdWx0KSB7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICdzdHJpbmcnICYmIHJlc3VsdCAhPT0gZmFsc2UpXG4gICAgICAgIHJldHVybjtcbiAgICBkZXZXYXJuT25jZShgdmFsaWRhdG9yLXJldHVybjoke25hbWV9YCwgYFtQcm9Gb3JtXSBGaWVsZCBcIiR7bmFtZX1cIjogYSBjdXN0b20gdmFsaWRhdG9yIHJldHVybmVkICR7dHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgPyAnYSBzdHJpbmcnIDogJ2ZhbHNlJ30g4oCUIHJldHVybiB2YWx1ZXMgYXJlIElHTk9SRUQ7IHZhbGlkYXRvcnMgZmFpbCBieSB0aHJvd2luZyBvciByZWplY3RpbmcgKGEgdGhyb3duIEVycm9yJ3MgbWVzc2FnZSBiZWNvbWVzIHRoZSBmaWVsZCBlcnJvcikuYCk7XG59XG4vKiogUnVuIGEgcnVsZSdzIHRyYW5zZm9ybSwgY29udGFpbmluZyB0aHJvd3MgYXMgYSBydWxlIGZhaWx1cmUuICovXG5mdW5jdGlvbiBhcHBseVRyYW5zZm9ybShydWxlLCByYXdWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcnVsZS50cmFuc2Zvcm0gIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogcmF3VmFsdWUgfTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IHJ1bGUudHJhbnNmb3JtKHJhd1ZhbHVlKSB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZmFpbHVyZTogcmVzb2x2ZUZhaWx1cmVNZXNzYWdlKGVyciwgcnVsZSkgfTtcbiAgICB9XG59XG4vKipcbiAqIEZsYXR0ZW4gYSBydWxlJ3MgZGVlcCBzb3VyY2VzIChgZmllbGRzYCBwZXIga2V5LCB0aGVuIGBkZWZhdWx0RmllbGRgIHBlclxuICogbWVtYmVyKSBpbnRvIFtzdWJSdWxlLCBtZW1iZXJWYWx1ZSwgbWVtYmVyTmFtZV0gdHVwbGVzIOKAlCB0aGUgc2luZ2xlIHBsYWNlXG4gKiB0aGF0IGtub3dzIGhvdyBkZWVwIHJ1bGVzIG1hcCBvbnRvIGEgY29udGFpbmVyIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZWVwUnVsZUVudHJpZXMocnVsZSwgdmFsdWUsIG5hbWUpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gW107XG4gICAgaWYgKHJ1bGUuZmllbGRzKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHZhbHVlO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHN1YlJ1bGVzXSBvZiBPYmplY3QuZW50cmllcyhydWxlLmZpZWxkcykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViUnVsZSBvZiB0b1J1bGVBcnJheShzdWJSdWxlcykpIHtcbiAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goW3N1YlJ1bGUsIHNvdXJjZVtrZXldLCBgJHtuYW1lfS4ke2tleX1gXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJ1bGUuZGVmYXVsdEZpZWxkKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgbWVtYmVyXSBvZiBkZWVwTWVtYmVycyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViUnVsZSBvZiB0b1J1bGVBcnJheShydWxlLmRlZmF1bHRGaWVsZCkpIHtcbiAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goW3N1YlJ1bGUsIG1lbWJlciwgYCR7bmFtZX0uJHtrZXl9YF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnRyaWVzO1xufVxuLyoqXG4gKiBNZXJnZSBhIHN1Yi1ydWxlJ3Mgb3V0Y29tZSBpbnRvIHRoZSBwYXJlbnQncyBjaGFubmVscy4gQSBzdWItcnVsZSBmbGFnZ2VkXG4gKiBgd2FybmluZ09ubHlgIGNvbnRyaWJ1dGVzIGl0cyBmYWlsdXJlIGFzIGEgV0FSTklORzsgb3RoZXJ3aXNlIGl0cyBlcnJvclxuICogYmxvY2tzLiBSZXR1cm5zIHRydWUgd2hlbiBhIGJsb2NraW5nIGVycm9yIGxhbmRlZCAoc3RvcCB3YWxraW5nKS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VTdWJSZXN1bHQoYWNjLCBzdWJSdWxlLCBzdWIpIHtcbiAgICBpZiAoc3ViLndhcm5pbmcgIT09IG51bGwgJiYgYWNjLndhcm5pbmcgPT09IG51bGwpXG4gICAgICAgIGFjYy53YXJuaW5nID0gc3ViLndhcm5pbmc7XG4gICAgaWYgKHN1Yi5lcnJvciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc3ViUnVsZS53YXJuaW5nT25seSkge1xuICAgICAgICAgICAgaWYgKGFjYy53YXJuaW5nID09PSBudWxsKVxuICAgICAgICAgICAgICAgIGFjYy53YXJuaW5nID0gc3ViLmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWNjLmVycm9yID0gc3ViLmVycm9yO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBGb2xkIG9uZSBydWxlJ3Mgb3V0Y29tZSBpbnRvIHRoZSBydW4tbGV2ZWwgY2hhbm5lbHMuIEEgcnVsZSBmbGFnZ2VkXG4gKiBgd2FybmluZ09ubHlgIGRvd25ncmFkZXMgZXZlcnl0aGluZyBpdCBwcm9kdWNlZCAob3duIGNoZWNrcyBBTkQgZGVlcFxuICogc3ViLXJ1bGVzKSB0byBhIHdhcm5pbmcuIFJldHVybnMgdGhlIGJsb2NraW5nIGVycm9yIHRvIHN1cmZhY2UsIG9yIG51bGwuXG4gKi9cbmZ1bmN0aW9uIGZvbGRSdWxlUmVzdWx0KHJ1bGUsIHJlc3VsdCwgc3RhdGUpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHJ1bGUud2FybmluZ09ubHkpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IChfYSA9IHJlc3VsdC5lcnJvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogcmVzdWx0Lndhcm5pbmc7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBudWxsICYmIHN0YXRlLndhcm5pbmcgPT09IG51bGwpXG4gICAgICAgICAgICBzdGF0ZS53YXJuaW5nID0gY29udGVudDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChyZXN1bHQud2FybmluZyAhPT0gbnVsbCAmJiBzdGF0ZS53YXJuaW5nID09PSBudWxsKVxuICAgICAgICBzdGF0ZS53YXJuaW5nID0gcmVzdWx0Lndhcm5pbmc7XG4gICAgcmV0dXJuIHJlc3VsdC5lcnJvcjtcbn1cbi8qKlxuICogRXZhbHVhdGUgT05FIHJ1bGUgKHRyYW5zZm9ybSDihpIgYnVpbHRpbiBjaGVja3Mg4oaSIHZhbGlkYXRvciDihpIgZGVlcCBydWxlcylcbiAqIHN5bmNocm9ub3VzbHkuIFByb21pc2UtcmV0dXJuaW5nIHZhbGlkYXRvcnMgYXJlIGRlZmVycmVkIChzZWUgcnVuUnVsZXNTeW5jKS5cbiAqL1xuZnVuY3Rpb24gZXZhbFJ1bGVTeW5jKHJ1bGUsIHJhd1ZhbHVlLCBuYW1lKSB7XG4gICAgY29uc3QgcHJlcCA9IGFwcGx5VHJhbnNmb3JtKHJ1bGUsIHJhd1ZhbHVlKTtcbiAgICBpZiAoIXByZXAub2spXG4gICAgICAgIHJldHVybiB7IGVycm9yOiBwcmVwLmZhaWx1cmUsIHdhcm5pbmc6IG51bGwgfTtcbiAgICBjb25zdCB2YWx1ZSA9IHByZXAudmFsdWU7XG4gICAgbGV0IGZhaWx1cmUgPSBjaGVja0J1aWx0aW5SdWxlcyhydWxlLCB2YWx1ZSwgbmFtZSk7XG4gICAgaWYgKGZhaWx1cmUgPT09IG51bGwgJiYgdHlwZW9mIHJ1bGUudmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBydWxlLnZhbGlkYXRvcihydWxlLCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnRoZW4oKHJlc29sdmVkKSA9PiB3YXJuTGVnYWN5VmFsaWRhdG9yUmV0dXJuKG5hbWUsIHJlc29sdmVkKSwgKCkgPT4geyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHdhcm5MZWdhY3lWYWxpZGF0b3JSZXR1cm4obmFtZSwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBmYWlsdXJlID0gcmVzb2x2ZUZhaWx1cmVNZXNzYWdlKGVyciwgcnVsZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZhaWx1cmUgIT09IG51bGwpXG4gICAgICAgIHJldHVybiB7IGVycm9yOiBmYWlsdXJlLCB3YXJuaW5nOiBudWxsIH07XG4gICAgaWYgKChydWxlLmZpZWxkcyB8fCBydWxlLmRlZmF1bHRGaWVsZCkgJiYgIWlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gRGVlcCBydWxlcyBuZWVkIGEgY29udGFpbmVyOyBhIG5vbi1lbXB0eSBwcmltaXRpdmUgZmFpbHMgdGhlIFBBUkVOVFxuICAgICAgICAvLyAoY2xlYXIgYXR0cmlidXRpb24pIGluc3RlYWQgb2YgcHJvZHVjaW5nIGNvbmZ1c2luZyBjaGlsZCBlcnJvcnMuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogcnVsZS5tZXNzYWdlIHx8IGAke25hbWV9IG11c3QgYmUgYW4gb2JqZWN0IG9yIGFuIGFycmF5YCwgd2FybmluZzogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjYyA9IHsgZXJyb3I6IG51bGwsIHdhcm5pbmc6IG51bGwgfTtcbiAgICAgICAgZm9yIChjb25zdCBbc3ViUnVsZSwgc3ViVmFsdWUsIHN1Yk5hbWVdIG9mIGRlZXBSdWxlRW50cmllcyhydWxlLCB2YWx1ZSwgbmFtZSkpIHtcbiAgICAgICAgICAgIGlmIChtZXJnZVN1YlJlc3VsdChhY2MsIHN1YlJ1bGUsIGV2YWxSdWxlU3luYyhzdWJSdWxlLCBzdWJWYWx1ZSwgc3ViTmFtZSkpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuICAgIHJldHVybiBQQVNTO1xufVxuLyoqIEFzeW5jIGNvdW50ZXJwYXJ0IG9mIGV2YWxSdWxlU3luYyDigJQgY3VzdG9tIHZhbGlkYXRvcnMgYXJlIGF3YWl0ZWQuICovXG5mdW5jdGlvbiBldmFsUnVsZUFzeW5jKHJ1bGUsIHJhd1ZhbHVlLCBuYW1lKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgcHJlcCA9IGFwcGx5VHJhbnNmb3JtKHJ1bGUsIHJhd1ZhbHVlKTtcbiAgICAgICAgaWYgKCFwcmVwLm9rKVxuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHByZXAuZmFpbHVyZSwgd2FybmluZzogbnVsbCB9O1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHByZXAudmFsdWU7XG4gICAgICAgIGxldCBmYWlsdXJlID0gY2hlY2tCdWlsdGluUnVsZXMocnVsZSwgdmFsdWUsIG5hbWUpO1xuICAgICAgICBpZiAoZmFpbHVyZSA9PT0gbnVsbCAmJiB0eXBlb2YgcnVsZS52YWxpZGF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gKHlpZWxkIHJ1bGUudmFsaWRhdG9yKHJ1bGUsIHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgd2FybkxlZ2FjeVZhbGlkYXRvclJldHVybihuYW1lLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGZhaWx1cmUgPSByZXNvbHZlRmFpbHVyZU1lc3NhZ2UoZXJyLCBydWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmFpbHVyZSAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBmYWlsdXJlLCB3YXJuaW5nOiBudWxsIH07XG4gICAgICAgIGlmICgocnVsZS5maWVsZHMgfHwgcnVsZS5kZWZhdWx0RmllbGQpICYmICFpc0VtcHR5VmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBEZWVwIHJ1bGVzIG5lZWQgYSBjb250YWluZXI7IGEgbm9uLWVtcHR5IHByaW1pdGl2ZSBmYWlscyB0aGUgUEFSRU5UXG4gICAgICAgICAgICAvLyAoY2xlYXIgYXR0cmlidXRpb24pIGluc3RlYWQgb2YgcHJvZHVjaW5nIGNvbmZ1c2luZyBjaGlsZCBlcnJvcnMuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBydWxlLm1lc3NhZ2UgfHwgYCR7bmFtZX0gbXVzdCBiZSBhbiBvYmplY3Qgb3IgYW4gYXJyYXlgLCB3YXJuaW5nOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhY2MgPSB7IGVycm9yOiBudWxsLCB3YXJuaW5nOiBudWxsIH07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtzdWJSdWxlLCBzdWJWYWx1ZSwgc3ViTmFtZV0gb2YgZGVlcFJ1bGVFbnRyaWVzKHJ1bGUsIHZhbHVlLCBuYW1lKSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXJnZVN1YlJlc3VsdChhY2MsIHN1YlJ1bGUsIHlpZWxkIGV2YWxSdWxlQXN5bmMoc3ViUnVsZSwgc3ViVmFsdWUsIHN1Yk5hbWUpKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQQVNTO1xuICAgIH0pO1xufVxuLyoqXG4gKiBTeW5jaHJvbm91cyBydWxlIHJ1bi4gQSBQcm9taXNlLXJldHVybmluZyB2YWxpZGF0b3IgQ0FOTk9UIGJlIGV2YWx1YXRlZFxuICogaGVyZSDigJQgaXQgaXMgZGVmZXJyZWQgKHRyZWF0ZWQgYXMgcGFzc2luZyBmb3IgdGhpcyBydW47IGl0cyByZWplY3Rpb24gaXNcbiAqIHN3YWxsb3dlZCkgYW5kIGxlZnQgdG8gdGhlIGFzeW5jIHJ1bnMgKGJsdXIvc3VibWl0KSwgd2hpY2ggYWx3YXlzIGF3YWl0IGl0LlxuICogRmFpbGluZyBpdCBpbnN0ZWFkIHdvdWxkIG1pcy1yZXBvcnQgXCJWYWxpZGF0aW9uIGZhaWxlZFwiIG9uIGV2ZXJ5IGtleXN0cm9rZVxuICogZm9yIHBlcmZlY3RseSB2YWxpZCBpbnB1dC5cbiAqXG4gKiBUaGUgcGVyLXJ1bGUgdHJ5L2NhdGNoIGlzIHRoZSBlbmdpbmUncyB0b3RhbGl0eSBjaG9rZSBwb2ludDogTk8gaW5wdXQg4oCUXG4gKiBpbmNsdWRpbmcgZXhvdGljIHZhbHVlcyB0aGF0IGJyZWFrIGEgYnVpbHRpbiBjaGVjayDigJQgbWF5IGVzY2FwZSBhcyBhIHRocm93O1xuICogZXZlcnkgZmFpbHVyZSBzdXJmYWNlcyB0aHJvdWdoIHRoZSBlcnJvci93YXJuaW5nIGNoYW5uZWxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuUnVsZXNTeW5jKG5hbWUsIHZhbHVlLCB2YWx1ZXMsIHJ1bGVzLCBpbnN0YW5jZSkge1xuICAgIGNvbnN0IHN0YXRlID0geyB3YXJuaW5nOiBudWxsIH07XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJlc29sdmVSdWxlcyhydWxlcywgdmFsdWVzLCBpbnN0YW5jZSkpIHtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGV2YWxSdWxlU3luYyhydWxlLCB2YWx1ZSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmVzdWx0ID0geyBlcnJvcjogcmVzb2x2ZUZhaWx1cmVNZXNzYWdlKGVyciwgcnVsZSksIHdhcm5pbmc6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvciA9IGZvbGRSdWxlUmVzdWx0KHJ1bGUsIHJlc3VsdCwgc3RhdGUpO1xuICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4geyBlcnJvciwgd2FybmluZzogc3RhdGUud2FybmluZyB9O1xuICAgIH1cbiAgICByZXR1cm4geyBlcnJvcjogbnVsbCwgd2FybmluZzogc3RhdGUud2FybmluZyB9O1xufVxuLyoqXG4gKiBBc3luY2hyb25vdXMgcnVsZSBydW4uIEN1c3RvbSB2YWxpZGF0b3JzIGFyZSBhd2FpdGVkIChzeW5jIG9yIGFzeW5jKTpcbiAqIHJlc29sdmluZyBwYXNzZXMsIHJlamVjdGluZy90aHJvd2luZyBmYWlscy4gUmV0dXJuIHZhbHVlcyBhcmUgaWdub3JlZC5cbiAqIFNoYXJlcyB0aGUgdG90YWxpdHkgY2hva2UgcG9pbnQgd2l0aCBydW5SdWxlc1N5bmMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5SdWxlc0FzeW5jKG5hbWUsIHZhbHVlLCB2YWx1ZXMsIHJ1bGVzLCBpbnN0YW5jZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0geyB3YXJuaW5nOiBudWxsIH07XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiByZXNvbHZlUnVsZXMocnVsZXMsIHZhbHVlcywgaW5zdGFuY2UpKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB5aWVsZCBldmFsUnVsZUFzeW5jKHJ1bGUsIHZhbHVlLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7IGVycm9yOiByZXNvbHZlRmFpbHVyZU1lc3NhZ2UoZXJyLCBydWxlKSwgd2FybmluZzogbnVsbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBmb2xkUnVsZVJlc3VsdChydWxlLCByZXN1bHQsIHN0YXRlKTtcbiAgICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvciwgd2FybmluZzogc3RhdGUud2FybmluZyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBudWxsLCB3YXJuaW5nOiBzdGF0ZS53YXJuaW5nIH07XG4gICAgfSk7XG59IixudWxsXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYyJ9