@1money/component-ui 0.0.75 → 0.0.77

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 (153) hide show
  1. package/es/components/ProForm/ProForm.d.ts +1 -1
  2. package/es/components/ProForm/ProForm.js +46 -34
  3. package/es/components/ProForm/ProFormDependency.d.ts +2 -1
  4. package/es/components/ProForm/ProFormDependency.js +6 -16
  5. package/es/components/ProForm/ProFormItem.d.ts +7 -2
  6. package/es/components/ProForm/ProFormItem.js +5 -7
  7. package/es/components/ProForm/ProFormList.d.ts +6 -1
  8. package/es/components/ProForm/ProFormList.js +122 -42
  9. package/es/components/ProForm/SchemaForm.d.ts +1 -1
  10. package/es/components/ProForm/SchemaForm.js +8 -5
  11. package/es/components/ProForm/context.d.ts +8 -7
  12. package/es/components/ProForm/context.js +1 -1
  13. package/es/components/ProForm/core/constants.d.ts +3 -1
  14. package/es/components/ProForm/core/constants.js +8 -2
  15. package/es/components/ProForm/core/devWarning.d.ts +3 -0
  16. package/es/components/ProForm/core/devWarning.js +22 -0
  17. package/es/components/ProForm/core/formStore.d.ts +14 -6
  18. package/es/components/ProForm/core/formStore.js +21 -2
  19. package/es/components/ProForm/core/hooks/useForm.d.ts +1 -1
  20. package/es/components/ProForm/core/hooks/useForm.js +275 -107
  21. package/es/components/ProForm/core/hooks/useFormCore.d.ts +2 -2
  22. package/es/components/ProForm/core/hooks/useFormCore.js +121 -121
  23. package/es/components/ProForm/core/interface.d.ts +157 -103
  24. package/es/components/ProForm/core/namePathType.d.ts +25 -0
  25. package/es/components/ProForm/core/namePathType.js +2 -0
  26. package/es/components/ProForm/core/pathUtils.d.ts +5 -3
  27. package/es/components/ProForm/core/pathUtils.js +19 -1
  28. package/es/components/ProForm/core/runRules.d.ts +40 -17
  29. package/es/components/ProForm/core/runRules.js +480 -136
  30. package/es/components/ProForm/core/useFormItem.d.ts +7 -8
  31. package/es/components/ProForm/core/useFormItem.js +52 -82
  32. package/es/components/ProForm/core/validationError.d.ts +13 -0
  33. package/es/components/ProForm/core/validationError.js +29 -0
  34. package/es/components/ProForm/fields/ProFormCheckbox.d.ts +1 -1
  35. package/es/components/ProForm/fields/ProFormCheckboxGroup.d.ts +1 -1
  36. package/es/components/ProForm/fields/ProFormCheckboxGroup.js +19 -5
  37. package/es/components/ProForm/fields/ProFormDatePicker.d.ts +1 -1
  38. package/es/components/ProForm/fields/ProFormDatePicker.js +1 -1
  39. package/es/components/ProForm/fields/ProFormFieldSet.d.ts +7 -2
  40. package/es/components/ProForm/fields/ProFormFieldSet.js +49 -12
  41. package/es/components/ProForm/fields/ProFormPassword.d.ts +1 -1
  42. package/es/components/ProForm/fields/ProFormRadioGroup.d.ts +1 -1
  43. package/es/components/ProForm/fields/ProFormRadioGroup.js +8 -3
  44. package/es/components/ProForm/fields/ProFormSelect.d.ts +1 -1
  45. package/es/components/ProForm/fields/ProFormSelect.js +13 -7
  46. package/es/components/ProForm/fields/ProFormSlider.d.ts +1 -1
  47. package/es/components/ProForm/fields/ProFormSwitch.d.ts +1 -1
  48. package/es/components/ProForm/fields/ProFormText.d.ts +1 -1
  49. package/es/components/ProForm/fields/ProFormTextArea.d.ts +1 -1
  50. package/es/components/ProForm/fields/ProFormUpload.d.ts +1 -1
  51. package/es/components/ProForm/fields/ProFormUpload.js +1 -1
  52. package/es/components/ProForm/fields/createProFormField.d.ts +8 -2
  53. package/es/components/ProForm/fields/createProFormField.js +20 -27
  54. package/es/components/ProForm/hooks/useFieldRequest.d.ts +1 -1
  55. package/es/components/ProForm/hooks/useFieldRequest.js +10 -8
  56. package/es/components/ProForm/hooks/useUrlSync.d.ts +8 -7
  57. package/es/components/ProForm/hooks/useUrlSync.js +1 -1
  58. package/es/components/ProForm/index.d.ts +37 -27
  59. package/es/components/ProForm/index.js +4 -1
  60. package/es/components/ProForm/interface.d.ts +115 -119
  61. package/es/components/ProForm/layouts/DialogForm.d.ts +1 -1
  62. package/es/components/ProForm/layouts/DialogForm.js +1 -1
  63. package/es/components/ProForm/layouts/DrawerForm.d.ts +1 -1
  64. package/es/components/ProForm/layouts/DrawerForm.js +1 -1
  65. package/es/components/ProForm/layouts/QueryFilter.d.ts +1 -1
  66. package/es/components/ProForm/layouts/QueryFilter.js +24 -16
  67. package/es/components/ProForm/layouts/useOverlayForm.d.ts +2 -2
  68. package/es/components/ProForm/layouts/useOverlayForm.js +1 -1
  69. package/es/components/ProForm/utils.d.ts +15 -7
  70. package/es/components/ProForm/utils.js +51 -3
  71. package/es/components/Table/core/useTableSetup.js +2 -2
  72. package/es/components/Table/interface.d.ts +1 -1
  73. package/es/index.css +1 -1
  74. package/es/index.d.ts +1 -1
  75. package/es/index.js +1 -1
  76. package/lib/components/ProForm/ProForm.d.ts +1 -1
  77. package/lib/components/ProForm/ProForm.js +45 -33
  78. package/lib/components/ProForm/ProFormDependency.d.ts +2 -1
  79. package/lib/components/ProForm/ProFormDependency.js +5 -15
  80. package/lib/components/ProForm/ProFormItem.d.ts +7 -2
  81. package/lib/components/ProForm/ProFormItem.js +5 -7
  82. package/lib/components/ProForm/ProFormList.d.ts +6 -1
  83. package/lib/components/ProForm/ProFormList.js +120 -40
  84. package/lib/components/ProForm/SchemaForm.d.ts +1 -1
  85. package/lib/components/ProForm/SchemaForm.js +8 -5
  86. package/lib/components/ProForm/context.d.ts +8 -7
  87. package/lib/components/ProForm/context.js +1 -1
  88. package/lib/components/ProForm/core/constants.d.ts +3 -1
  89. package/lib/components/ProForm/core/constants.js +9 -3
  90. package/lib/components/ProForm/core/devWarning.d.ts +3 -0
  91. package/lib/components/ProForm/core/devWarning.js +29 -0
  92. package/lib/components/ProForm/core/formStore.d.ts +14 -6
  93. package/lib/components/ProForm/core/formStore.js +23 -2
  94. package/lib/components/ProForm/core/hooks/useForm.d.ts +1 -1
  95. package/lib/components/ProForm/core/hooks/useForm.js +271 -103
  96. package/lib/components/ProForm/core/hooks/useFormCore.d.ts +2 -2
  97. package/lib/components/ProForm/core/hooks/useFormCore.js +119 -119
  98. package/lib/components/ProForm/core/interface.d.ts +157 -103
  99. package/lib/components/ProForm/core/namePathType.d.ts +25 -0
  100. package/lib/components/ProForm/core/namePathType.js +6 -0
  101. package/lib/components/ProForm/core/pathUtils.d.ts +5 -3
  102. package/lib/components/ProForm/core/pathUtils.js +20 -1
  103. package/lib/components/ProForm/core/runRules.d.ts +40 -17
  104. package/lib/components/ProForm/core/runRules.js +483 -137
  105. package/lib/components/ProForm/core/useFormItem.d.ts +7 -8
  106. package/lib/components/ProForm/core/useFormItem.js +54 -84
  107. package/lib/components/ProForm/core/validationError.d.ts +13 -0
  108. package/lib/components/ProForm/core/validationError.js +36 -0
  109. package/lib/components/ProForm/fields/ProFormCheckbox.d.ts +1 -1
  110. package/lib/components/ProForm/fields/ProFormCheckboxGroup.d.ts +1 -1
  111. package/lib/components/ProForm/fields/ProFormCheckboxGroup.js +18 -4
  112. package/lib/components/ProForm/fields/ProFormDatePicker.d.ts +1 -1
  113. package/lib/components/ProForm/fields/ProFormDatePicker.js +1 -1
  114. package/lib/components/ProForm/fields/ProFormFieldSet.d.ts +7 -2
  115. package/lib/components/ProForm/fields/ProFormFieldSet.js +49 -12
  116. package/lib/components/ProForm/fields/ProFormPassword.d.ts +1 -1
  117. package/lib/components/ProForm/fields/ProFormRadioGroup.d.ts +1 -1
  118. package/lib/components/ProForm/fields/ProFormRadioGroup.js +7 -2
  119. package/lib/components/ProForm/fields/ProFormSelect.d.ts +1 -1
  120. package/lib/components/ProForm/fields/ProFormSelect.js +13 -7
  121. package/lib/components/ProForm/fields/ProFormSlider.d.ts +1 -1
  122. package/lib/components/ProForm/fields/ProFormSwitch.d.ts +1 -1
  123. package/lib/components/ProForm/fields/ProFormText.d.ts +1 -1
  124. package/lib/components/ProForm/fields/ProFormTextArea.d.ts +1 -1
  125. package/lib/components/ProForm/fields/ProFormUpload.d.ts +1 -1
  126. package/lib/components/ProForm/fields/ProFormUpload.js +1 -1
  127. package/lib/components/ProForm/fields/createProFormField.d.ts +8 -2
  128. package/lib/components/ProForm/fields/createProFormField.js +20 -27
  129. package/lib/components/ProForm/hooks/useFieldRequest.d.ts +1 -1
  130. package/lib/components/ProForm/hooks/useFieldRequest.js +10 -8
  131. package/lib/components/ProForm/hooks/useUrlSync.d.ts +8 -7
  132. package/lib/components/ProForm/hooks/useUrlSync.js +1 -1
  133. package/lib/components/ProForm/index.d.ts +37 -27
  134. package/lib/components/ProForm/index.js +10 -1
  135. package/lib/components/ProForm/interface.d.ts +115 -119
  136. package/lib/components/ProForm/layouts/DialogForm.d.ts +1 -1
  137. package/lib/components/ProForm/layouts/DialogForm.js +1 -1
  138. package/lib/components/ProForm/layouts/DrawerForm.d.ts +1 -1
  139. package/lib/components/ProForm/layouts/DrawerForm.js +1 -1
  140. package/lib/components/ProForm/layouts/QueryFilter.d.ts +1 -1
  141. package/lib/components/ProForm/layouts/QueryFilter.js +24 -16
  142. package/lib/components/ProForm/layouts/useOverlayForm.d.ts +2 -2
  143. package/lib/components/ProForm/layouts/useOverlayForm.js +1 -1
  144. package/lib/components/ProForm/utils.d.ts +15 -7
  145. package/lib/components/ProForm/utils.js +52 -3
  146. package/lib/components/Table/core/useTableSetup.js +2 -2
  147. package/lib/components/Table/interface.d.ts +1 -1
  148. package/lib/index.css +1 -1
  149. package/lib/index.d.ts +1 -1
  150. package/lib/index.js +1 -1
  151. package/package.json +1 -1
  152. package/scripts/mcp-server/examples.generated.json +95 -53
  153. package/scripts/mcp-server/index.generated.json +1715 -185
@@ -18,6 +18,7 @@ var _useFormCore = require("./useFormCore");
18
18
  var _pathUtils = require("../pathUtils");
19
19
  var _runRules = require("../runRules");
20
20
  var _formStore = require("../formStore");
21
+ var _validationError = require("../validationError");
21
22
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
22
23
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
23
24
  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; } } }; }
@@ -61,12 +62,34 @@ var __rest = void 0 && (void 0).__rest || function (s, e) {
61
62
  /**
62
63
  * Only rules with a custom `validator` can be genuinely asynchronous —
63
64
  * builtin rules resolve within a microtask, so flipping `validating` for
64
- * them would only churn subscribers without ever being visible.
65
+ * them would only churn subscribers without ever being visible. Decided on
66
+ * RESOLVED rules: a function-form rule that resolves to builtin-only checks
67
+ * must not flicker the flag.
68
+ *
69
+ * The async engine awaits validators nested inside `fields` / `defaultField`
70
+ * too, so the decision must descend the same way — otherwise a deep-only
71
+ * validator (e.g. `{ defaultField: { validator } }`) runs pending with the
72
+ * flag stuck false, and `isFieldValidating(name)` under-reports for the whole
73
+ * window. Over-flagging when the deep validator won't actually fire (empty /
74
+ * primitive value) is acceptable: the flag is decided on rule SHAPE, exactly
75
+ * as the top-level case already over-flags a validator short-circuited by an
76
+ * earlier builtin failure; the run clears it on settle either way.
65
77
  */
66
- var hasCustomValidator = function hasCustomValidator(rules) {
67
- return rules.some(function (rule) {
68
- return typeof rule.validator === 'function';
69
- });
78
+ var asRuleArray = function asRuleArray(rule) {
79
+ return rule ? Array.isArray(rule) ? rule : [rule] : [];
80
+ };
81
+ var _ruleHasValidator = function ruleHasValidator(rule) {
82
+ if (typeof rule.validator === 'function') return true;
83
+ if (asRuleArray(rule.defaultField).some(_ruleHasValidator)) return true;
84
+ if (rule.fields) {
85
+ return Object.values(rule.fields).some(function (sub) {
86
+ return asRuleArray(sub).some(_ruleHasValidator);
87
+ });
88
+ }
89
+ return false;
90
+ };
91
+ var hasResolvedValidator = function hasResolvedValidator(resolved) {
92
+ return resolved.some(_ruleHasValidator);
70
93
  };
71
94
  // ---------------------------------------------------------------------------
72
95
  // useForm
@@ -80,6 +103,12 @@ var useForm = exports.useForm = function useForm() {
80
103
  validateTrigger = _config$validateTrigg === void 0 ? 'onChange' : _config$validateTrigg;
81
104
  var formCore = (0, _useFormCore.useFormCore)(config);
82
105
  var store = formCore.store;
106
+ // Epoch of the LATEST async run that raised each field's `validating` flag.
107
+ // A settling run clears the flag only while it is still the latest raiser —
108
+ // an older run must not blank the spinner of a newer one, and a run
109
+ // superseded by a SYNC commit (which never touches flags) must still clean
110
+ // up after itself.
111
+ var lastAsyncEpochRef = (0, _react.useRef)({});
83
112
  // Mark fields as validating in ONE commit. validating / touched live in the
84
113
  // store alongside values — flipping them (e.g. async validation around a
85
114
  // blur) must not re-render the form root, only the fields that subscribed.
@@ -117,7 +146,7 @@ var useForm = exports.useForm = function useForm() {
117
146
  delete newErrors[name];
118
147
  errorsChanged = true;
119
148
  }
120
- } else if (newErrors[name] !== error) {
149
+ } else if (!(0, _formStore.sameValidationNode)(newErrors[name], error)) {
121
150
  newErrors[name] = error;
122
151
  errorsChanged = true;
123
152
  }
@@ -126,7 +155,7 @@ var useForm = exports.useForm = function useForm() {
126
155
  delete newWarnings[name];
127
156
  warningsChanged = true;
128
157
  }
129
- } else if (newWarnings[name] !== warning) {
158
+ } else if (!(0, _formStore.sameValidationNode)(newWarnings[name], warning)) {
130
159
  newWarnings[name] = warning;
131
160
  warningsChanged = true;
132
161
  }
@@ -156,7 +185,7 @@ var useForm = exports.useForm = function useForm() {
156
185
  // ---------------------------------------------------------------------------
157
186
  var validateFieldAsync = (0, _useMemoizedFn["default"])(function (name, value, rules) {
158
187
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regenerator["default"].mark(function _callee() {
159
- var flagged, outcome, _yield$runRulesAsync, error, warning;
188
+ var _a, epoch, values, resolved, flagged, outcome, _yield$runRulesAsync, error, warning, isCurrent, clearFlags, _t;
160
189
  return _regenerator["default"].wrap(function (_context) {
161
190
  while (1) switch (_context.prev = _context.next) {
162
191
  case 0:
@@ -169,8 +198,18 @@ var useForm = exports.useForm = function useForm() {
169
198
  error: null
170
199
  });
171
200
  case 1:
172
- flagged = hasCustomValidator(rules) ? [name] : [];
201
+ // Capture this run's epoch: if a NEWER run (sync or async) starts for
202
+ // the field before this one settles, the outcome below is stale and is
203
+ // discarded instead of overwriting the newer result.
204
+ epoch = formCore.beginValidationRun(name); // Resolve once: the flag decision needs resolved rules, and passing the
205
+ // resolved array onward spares the engine a re-resolution.
206
+ values = formCore.getFieldsValue();
207
+ resolved = (0, _runRules.resolveRules)(rules, values, formCore.getRuleContextInstance());
208
+ flagged = hasResolvedValidator(resolved) ? [name] : [];
173
209
  markValidating(flagged);
210
+ flagged.forEach(function (flaggedName) {
211
+ lastAsyncEpochRef.current[flaggedName] = epoch;
212
+ });
174
213
  outcome = {
175
214
  name: name,
176
215
  error: null,
@@ -178,7 +217,7 @@ var useForm = exports.useForm = function useForm() {
178
217
  };
179
218
  _context.prev = 2;
180
219
  _context.next = 3;
181
- return (0, _runRules.runRulesAsync)(name, value, formCore.getFieldsValue(), rules);
220
+ return (0, _runRules.runRulesAsync)(name, value, values, resolved, formCore.getRuleContextInstance());
182
221
  case 3:
183
222
  _yield$runRulesAsync = _context.sent;
184
223
  error = _yield$runRulesAsync.error;
@@ -188,28 +227,45 @@ var useForm = exports.useForm = function useForm() {
188
227
  error: error,
189
228
  warning: warning
190
229
  };
230
+ _context.next = 5;
231
+ break;
191
232
  case 4:
192
233
  _context.prev = 4;
193
- commitRuleOutcomes([outcome], flagged);
194
- return _context.finish(4);
234
+ _t = _context["catch"](2);
235
+ // The engine contains rule-level throws itself; this is a last-resort
236
+ // net so an unexpected failure surfaces as a field error instead of
237
+ // leaving the field marked valid.
238
+ outcome = {
239
+ name: name,
240
+ error: (_a = (0, _runRules.coerceFailureReason)(_t)) !== null && _a !== void 0 ? _a : 'Validation failed',
241
+ warning: null
242
+ };
195
243
  case 5:
244
+ _context.prev = 5;
245
+ isCurrent = formCore.isValidationRunCurrent(name, epoch);
246
+ clearFlags = flagged.filter(function (flaggedName) {
247
+ return lastAsyncEpochRef.current[flaggedName] === epoch;
248
+ });
249
+ commitRuleOutcomes(isCurrent ? [outcome] : [], clearFlags);
250
+ return _context.finish(5);
251
+ case 6:
196
252
  return _context.abrupt("return", {
197
253
  isValid: outcome.error === null,
198
254
  error: outcome.error
199
255
  });
200
- case 6:
256
+ case 7:
201
257
  case "end":
202
258
  return _context.stop();
203
259
  }
204
- }, _callee, null, [[2,, 4, 5]]);
260
+ }, _callee, null, [[2, 4, 5, 6]]);
205
261
  }));
206
262
  });
207
263
  // ---------------------------------------------------------------------------
208
264
  // Async field blur handler
209
265
  // ---------------------------------------------------------------------------
210
- var handleFieldBlur = (0, _useEventCallback["default"])(function (name) {
266
+ var handleFieldBlur = (0, _useEventCallback["default"])(function (name, fieldTrigger) {
211
267
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
212
- var touched, rules;
268
+ var touched, rules, values, applicable;
213
269
  return _regenerator["default"].wrap(function (_context2) {
214
270
  while (1) switch (_context2.prev = _context2.next) {
215
271
  case 0:
@@ -220,13 +276,21 @@ var useForm = exports.useForm = function useForm() {
220
276
  });
221
277
  }
222
278
  rules = formCore.getFieldRules(name);
223
- if (!(rules && validateTrigger === 'onBlur')) {
279
+ if (rules) {
224
280
  _context2.next = 1;
225
281
  break;
226
282
  }
227
- _context2.next = 1;
228
- return validateFieldAsync(name, (0, _pathUtils.resolveValue)(formCore.getFieldsValue(), name), rules);
283
+ return _context2.abrupt("return");
229
284
  case 1:
285
+ values = formCore.getFieldsValue();
286
+ applicable = (0, _runRules.filterRulesByTrigger)((0, _runRules.resolveRules)(rules, values, formCore.getRuleContextInstance()), 'onBlur', (0, _runRules.normalizeTriggers)(fieldTrigger, validateTrigger), name);
287
+ if (!(applicable.length > 0)) {
288
+ _context2.next = 2;
289
+ break;
290
+ }
291
+ _context2.next = 2;
292
+ return validateFieldAsync(name, (0, _pathUtils.resolveValue)(values, name), applicable);
293
+ case 2:
230
294
  case "end":
231
295
  return _context2.stop();
232
296
  }
@@ -238,68 +302,111 @@ var useForm = exports.useForm = function useForm() {
238
302
  // ---------------------------------------------------------------------------
239
303
  var validateFieldsAsync = (0, _useMemoizedFn["default"])(function (nameList) {
240
304
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
241
- var fieldsToValidate, fieldErrors, flagged, outcomes, error;
305
+ var fieldsToValidate, fieldErrors, resolvedByField, epochByField, _iterator2, _step2, name, rules, flagged, outcomes, clearFlags;
242
306
  return _regenerator["default"].wrap(function (_context4) {
243
307
  while (1) switch (_context4.prev = _context4.next) {
244
308
  case 0:
245
309
  fieldsToValidate = nameList || Object.keys(formCore.fieldRules);
246
- fieldErrors = {}; // One commit to raise the validating flags (validator-bearing fields
247
- // only), one commit to land every error/warning and clear the flags.
310
+ fieldErrors = {}; // Resolve every field once up front: the flag decision needs resolved
311
+ // rules, and the resolved arrays are reused for the actual runs. Each
312
+ // field also captures its validation epoch — a field whose value
313
+ // changes mid-submit gets a newer run, and this run's stale outcome
314
+ // must not overwrite it in the store.
315
+ resolvedByField = new Map();
316
+ epochByField = new Map();
317
+ _iterator2 = _createForOfIteratorHelper(fieldsToValidate);
318
+ try {
319
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
320
+ name = _step2.value;
321
+ rules = formCore.fieldRules[name];
322
+ if (rules) {
323
+ epochByField.set(name, formCore.beginValidationRun(name));
324
+ resolvedByField.set(name, (0, _runRules.resolveRules)(rules, formCore.getFieldsValue(), formCore.getRuleContextInstance()));
325
+ }
326
+ }
327
+ // One commit to raise the validating flags (validator-bearing fields
328
+ // only), one commit to land every error/warning and clear the flags.
329
+ } catch (err) {
330
+ _iterator2.e(err);
331
+ } finally {
332
+ _iterator2.f();
333
+ }
248
334
  flagged = fieldsToValidate.filter(function (name) {
249
- var rules = formCore.fieldRules[name];
250
- return rules ? hasCustomValidator(rules) : false;
335
+ var resolved = resolvedByField.get(name);
336
+ return resolved ? hasResolvedValidator(resolved) : false;
251
337
  });
252
338
  markValidating(flagged);
339
+ flagged.forEach(function (name) {
340
+ lastAsyncEpochRef.current[name] = epochByField.get(name);
341
+ });
253
342
  outcomes = [];
254
343
  _context4.prev = 1;
255
344
  _context4.next = 2;
256
345
  return Promise.all(fieldsToValidate.map(function (name) {
257
346
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
258
- var rules, _yield$runRulesAsync2, error, warning;
347
+ var _a, resolved, error, warning, _yield$runRulesAsync2, epoch, _t2;
259
348
  return _regenerator["default"].wrap(function (_context3) {
260
349
  while (1) switch (_context3.prev = _context3.next) {
261
350
  case 0:
262
- rules = formCore.fieldRules[name];
263
- if (rules) {
351
+ resolved = resolvedByField.get(name);
352
+ if (resolved) {
264
353
  _context3.next = 1;
265
354
  break;
266
355
  }
267
356
  return _context3.abrupt("return");
268
357
  case 1:
269
- _context3.next = 2;
270
- return (0, _runRules.runRulesAsync)(name, (0, _pathUtils.resolveValue)(formCore.getFieldsValue(), name), formCore.getFieldsValue(), rules);
271
- case 2:
358
+ error = null;
359
+ warning = null;
360
+ _context3.prev = 2;
361
+ _context3.next = 3;
362
+ return (0, _runRules.runRulesAsync)(name, (0, _pathUtils.resolveValue)(formCore.getFieldsValue(), name), formCore.getFieldsValue(), resolved, formCore.getRuleContextInstance());
363
+ case 3:
272
364
  _yield$runRulesAsync2 = _context3.sent;
273
365
  error = _yield$runRulesAsync2.error;
274
366
  warning = _yield$runRulesAsync2.warning;
275
- outcomes.push({
276
- name: name,
277
- error: error,
278
- warning: warning
279
- });
367
+ _context3.next = 5;
368
+ break;
369
+ case 4:
370
+ _context3.prev = 4;
371
+ _t2 = _context3["catch"](2);
372
+ // Last-resort net (see validateFieldAsync) — keep the normal
373
+ // constructed-error flow so onFinishFailed gets a real payload.
374
+ error = (_a = (0, _runRules.coerceFailureReason)(_t2)) !== null && _a !== void 0 ? _a : 'Validation failed';
375
+ case 5:
376
+ // The store commit is staleness-guarded; the SUBMIT decision
377
+ // (fieldErrors / the thrown FormValidationError) still reflects
378
+ // this run's own results for the values it validated.
379
+ epoch = epochByField.get(name);
380
+ if (epoch !== undefined && formCore.isValidationRunCurrent(name, epoch)) {
381
+ outcomes.push({
382
+ name: name,
383
+ error: error,
384
+ warning: warning
385
+ });
386
+ }
280
387
  if (error !== null) {
281
388
  fieldErrors[name] = error;
282
389
  }
283
- case 3:
390
+ case 6:
284
391
  case "end":
285
392
  return _context3.stop();
286
393
  }
287
- }, _callee3);
394
+ }, _callee3, null, [[2, 4]]);
288
395
  }));
289
396
  }));
290
397
  case 2:
291
398
  _context4.prev = 2;
292
- commitRuleOutcomes(outcomes, flagged);
399
+ clearFlags = flagged.filter(function (name) {
400
+ return lastAsyncEpochRef.current[name] === epochByField.get(name);
401
+ });
402
+ commitRuleOutcomes(outcomes, clearFlags);
293
403
  return _context4.finish(2);
294
404
  case 3:
295
405
  if (!(Object.keys(fieldErrors).length > 0)) {
296
406
  _context4.next = 4;
297
407
  break;
298
408
  }
299
- error = new Error('Validation failed');
300
- error.values = formCore.getFieldsValue();
301
- error.errors = fieldErrors;
302
- throw error;
409
+ throw new _validationError.FormValidationError(formCore.getFieldsValue(), fieldErrors);
303
410
  case 4:
304
411
  if (!nameList) {
305
412
  _context4.next = 5;
@@ -330,10 +437,11 @@ var useForm = exports.useForm = function useForm() {
330
437
  render = _a.render,
331
438
  props = __rest(_a, ["children", "render"]);
332
439
  // Per-field store subscription: this field re-renders only when its
333
- // own value/error/touched/validating slice changes.
440
+ // own value/error/touched/validating slice changes. Dot-paths
441
+ // resolve into the nested values like everywhere else.
334
442
  var _useStoreSelector = (0, _formStore.useStoreSelector)(store, function (state) {
335
443
  var _a;
336
- return [(_a = state.values[name]) !== null && _a !== void 0 ? _a : '', state.errors[name], state.touched[name], state.validating[name]];
444
+ return [(_a = (0, _pathUtils.resolveValue)(state.values, name)) !== null && _a !== void 0 ? _a : '', state.errors[name], state.touched[name], state.validating[name]];
337
445
  }, _formStore.shallowEqualArrays),
338
446
  _useStoreSelector2 = (0, _slicedToArray2["default"])(_useStoreSelector, 4),
339
447
  fieldValue = _useStoreSelector2[0],
@@ -341,22 +449,39 @@ var useForm = exports.useForm = function useForm() {
341
449
  fieldTouched = _useStoreSelector2[2],
342
450
  fieldValidating = _useStoreSelector2[3];
343
451
  (0, _react.useEffect)(function () {
452
+ // Mount-counted: releaseField removes the rules only when the
453
+ // LAST same-name instance unmounts — an instance that piggybacked
454
+ // on an existing registration (e.g. a ProForm.Item's) can never
455
+ // wipe it on its own unmount.
456
+ formCore.retainField(name);
344
457
  var existingRules = formCore.getFieldRules(name);
345
458
  if (!existingRules && rules.length > 0) {
346
459
  formCore.registerField(name, rules);
347
460
  }
348
461
  return function () {
349
- formCore.unregisterField(name);
462
+ formCore.releaseField(name);
350
463
  };
351
464
  }, []); // Only register on mount
352
465
  var handleFieldChange = (0, _useEventCallback["default"])(function (value) {
353
466
  formCore.setFieldValue(name, value);
354
- if (validateTrigger === 'onChange') {
355
- formCore.validateField(name, rules, value);
467
+ // Touched is set by the user change trigger (matching the
468
+ // ProForm.Item path) — programmatic setFieldsValue does not.
469
+ var touched = store.getState().touched;
470
+ if (!touched[name]) {
471
+ store.setState({
472
+ touched: Object.assign(Object.assign({}, touched), (0, _defineProperty2["default"])({}, name, true))
473
+ });
474
+ }
475
+ var applicable = (0, _runRules.filterRulesByTrigger)((0, _runRules.resolveRules)(rules, formCore.getFieldsValue(), formCore.getRuleContextInstance()), 'onChange', (0, _runRules.normalizeTriggers)(fieldOptions.validateTrigger, validateTrigger), name);
476
+ if (applicable.length > 0) {
477
+ // Async path (matching ProForm.Item) so a Promise-returning
478
+ // validator is honored on change instead of being silently
479
+ // skipped; fire-and-forget — the result lands on the store.
480
+ validateFieldAsync(name, value, applicable);
356
481
  }
357
482
  });
358
483
  var handleBlur = (0, _useEventCallback["default"])(function () {
359
- handleFieldBlur(name);
484
+ handleFieldBlur(name, fieldOptions.validateTrigger);
360
485
  });
361
486
  var fieldProps = Object.assign({
362
487
  name: name,
@@ -388,22 +513,25 @@ var useForm = exports.useForm = function useForm() {
388
513
  if (typeof children === 'function') {
389
514
  return children(fieldProps);
390
515
  }
516
+ // Element children receive only DOM-safe props — error/touched/
517
+ // validating are field META, not control props; spreading them onto
518
+ // a host element would leak any attributes. Render-prop and
519
+ // function children keep the full fieldProps.
520
+ var domSafeProps = Object.assign({
521
+ name: name,
522
+ value: fieldValue,
523
+ onChange: handleMergeChange,
524
+ onBlur: handleMergeBlur
525
+ }, props);
391
526
  if (/*#__PURE__*/_react["default"].isValidElement(children)) {
392
- var mergedProps = Object.assign(Object.assign({}, fieldProps), {
393
- onChange: handleMergeChange,
394
- onBlur: handleMergeBlur
395
- });
396
- return /*#__PURE__*/_react["default"].cloneElement(children, mergedProps);
527
+ return /*#__PURE__*/_react["default"].cloneElement(children, domSafeProps);
397
528
  }
398
529
  if (Array.isArray(children)) {
399
530
  return /*#__PURE__*/_react["default"].createElement.apply(_react["default"], [_react.Fragment, null].concat((0, _toConsumableArray2["default"])(children.map(function (child, index) {
400
531
  if (/*#__PURE__*/_react["default"].isValidElement(child)) {
401
- var _mergedProps = Object.assign(Object.assign({}, fieldProps), {
402
- key: child.key || index,
403
- onChange: handleMergeChange,
404
- onBlur: handleMergeBlur
405
- });
406
- return /*#__PURE__*/_react["default"].cloneElement(child, _mergedProps);
532
+ return /*#__PURE__*/_react["default"].cloneElement(child, Object.assign(Object.assign({}, domSafeProps), {
533
+ key: child.key || index
534
+ }));
407
535
  }
408
536
  return child;
409
537
  }))));
@@ -418,7 +546,7 @@ var useForm = exports.useForm = function useForm() {
418
546
  // ---------------------------------------------------------------------------
419
547
  var handleSubmit = (0, _useEventCallback["default"])(function (e) {
420
548
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
421
- var validatedValues, typed, _t;
549
+ var validatedValues, _t3;
422
550
  return _regenerator["default"].wrap(function (_context5) {
423
551
  while (1) switch (_context5.prev = _context5.next) {
424
552
  case 0:
@@ -433,12 +561,18 @@ var useForm = exports.useForm = function useForm() {
433
561
  break;
434
562
  case 3:
435
563
  _context5.prev = 3;
436
- _t = _context5["catch"](1);
437
- typed = _t;
438
- onFinishFailed === null || onFinishFailed === void 0 ? void 0 : onFinishFailed({
439
- values: typed.values,
440
- errors: typed.errors
441
- });
564
+ _t3 = _context5["catch"](1);
565
+ // Only a VALIDATION failure reaches onFinishFailed — an exception out
566
+ // of the consumer's own onFinish is not a validation result and is
567
+ // surfaced instead of being misreported.
568
+ if (_t3 instanceof _validationError.FormValidationError) {
569
+ onFinishFailed === null || onFinishFailed === void 0 ? void 0 : onFinishFailed({
570
+ values: _t3.values,
571
+ errors: _t3.errors
572
+ });
573
+ } else {
574
+ console.error('[ProForm] onFinish threw during submit:', _t3);
575
+ }
442
576
  case 4:
443
577
  case "end":
444
578
  return _context5.stop();
@@ -521,34 +655,45 @@ var useForm = exports.useForm = function useForm() {
521
655
  var resetFormFields = (0, _useMemoizedFn["default"])(function (fields) {
522
656
  if (!fields) {
523
657
  formCore.resetFields();
524
- } else {
525
- var resetValues = {};
526
- fields.forEach(function (field) {
527
- // Mount-frozen initialValues — consistent with the full resetFields.
528
- resetValues[field] = formCore.getInitialValues()[field];
529
- });
530
- formCore.setFieldsValue(resetValues);
531
- var _store$getState = store.getState(),
532
- touched = _store$getState.touched,
533
- validating = _store$getState.validating;
534
- var newTouched = Object.assign({}, touched);
535
- var newValidating = Object.assign({}, validating);
536
- fields.forEach(function (field) {
537
- delete newTouched[field];
538
- delete newValidating[field];
539
- });
540
- store.setState({
541
- touched: newTouched,
542
- validating: newValidating
543
- });
544
- fields.forEach(function (field) {
545
- formCore.setFieldError(field, null);
546
- });
658
+ return;
547
659
  }
660
+ // Mount-frozen initialValues — consistent with the full resetFields.
661
+ // Reads AND writes are nested-path aware, so dot-path names
662
+ // (`address.city`, `items.0.title`) reset correctly instead of probing a
663
+ // literal key and shallow-merging one back.
664
+ var initialValues = formCore.getInitialValues();
665
+ var state = store.getState();
666
+ var newValues = state.values;
667
+ fields.forEach(function (field) {
668
+ var initial = (0, _pathUtils.resolveValue)(initialValues, field);
669
+ newValues = field.includes('.') ? (0, _pathUtils.setNestedValue)(newValues, field, initial) : Object.assign(Object.assign({}, newValues), (0, _defineProperty2["default"])({}, field, initial));
670
+ });
671
+ // Like the full reset: clear ALL per-field meta (errors AND warnings AND
672
+ // touched/validating), invalidate in-flight validation runs, and land
673
+ // everything in ONE commit. No onValuesChange — reset is not a change
674
+ // event on either path.
675
+ formCore.invalidateValidationRuns(fields);
676
+ var newErrors = Object.assign({}, state.errors);
677
+ var newWarnings = Object.assign({}, state.warnings);
678
+ var newTouched = Object.assign({}, state.touched);
679
+ var newValidating = Object.assign({}, state.validating);
680
+ fields.forEach(function (field) {
681
+ delete newErrors[field];
682
+ delete newWarnings[field];
683
+ delete newTouched[field];
684
+ delete newValidating[field];
685
+ });
686
+ store.setState({
687
+ values: newValues,
688
+ errors: newErrors,
689
+ warnings: newWarnings,
690
+ touched: newTouched,
691
+ validating: newValidating
692
+ });
548
693
  });
549
694
  var submitWithValidation = (0, _useMemoizedFn["default"])(function (callback) {
550
695
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
551
- var validatedValues, _t2;
696
+ var validatedValues, _t4, _t5;
552
697
  return _regenerator["default"].wrap(function (_context6) {
553
698
  while (1) switch (_context6.prev = _context6.next) {
554
699
  case 0:
@@ -557,29 +702,47 @@ var useForm = exports.useForm = function useForm() {
557
702
  return validateFieldsAsync();
558
703
  case 1:
559
704
  validatedValues = _context6.sent;
705
+ _context6.next = 3;
706
+ break;
707
+ case 2:
708
+ _context6.prev = 2;
709
+ _t4 = _context6["catch"](0);
710
+ return _context6.abrupt("return", undefined);
711
+ case 3:
560
712
  if (!callback) {
561
- _context6.next = 2;
713
+ _context6.next = 7;
562
714
  break;
563
715
  }
564
- _context6.next = 2;
716
+ _context6.prev = 4;
717
+ _context6.next = 5;
565
718
  return callback(validatedValues);
566
- case 2:
567
- return _context6.abrupt("return", validatedValues);
568
- case 3:
569
- _context6.prev = 3;
570
- _t2 = _context6["catch"](0);
719
+ case 5:
720
+ _context6.next = 7;
721
+ break;
722
+ case 6:
723
+ _context6.prev = 6;
724
+ _t5 = _context6["catch"](4);
725
+ // A throwing callback is a consumer bug, not a validation failure —
726
+ // surface it (mirroring rc-field-form's onFinish handling) instead
727
+ // of swallowing it silently.
728
+ console.error('[ProForm] submit callback threw:', _t5);
571
729
  return _context6.abrupt("return", undefined);
572
- case 4:
730
+ case 7:
731
+ return _context6.abrupt("return", validatedValues);
732
+ case 8:
573
733
  case "end":
574
734
  return _context6.stop();
575
735
  }
576
- }, _callee6, null, [[0, 3]]);
736
+ }, _callee6, null, [[0, 2], [4, 6]]);
577
737
  }));
578
738
  });
579
739
  var formInstance = (0, _react.useMemo)(function () {
580
740
  return Object.assign(Object.assign({}, formCore.formInstance), {
741
+ getFieldValue: formCore.getFieldValue,
742
+ getFieldsValue: formCore.getFieldsValue,
581
743
  validateFields: validateFieldsAsync,
582
744
  setFieldValue: formCore.setFieldValue,
745
+ setFieldsValue: formCore.setFieldsValue,
583
746
  getFieldError: getFieldError,
584
747
  getFieldWarning: getFieldWarning,
585
748
  getFieldsError: getFieldsError,
@@ -596,7 +759,11 @@ var useForm = exports.useForm = function useForm() {
596
759
  registerField: formCore.registerField,
597
760
  unregisterField: formCore.unregisterField
598
761
  });
599
- }, [formCore.formInstance, formCore.setFieldValue, formCore.setFieldError, formCore.registerField, formCore.unregisterField, validateFieldsAsync, getFieldError, getFieldWarning, getFieldsError, isFieldTouched, isFieldsTouched, isFieldValidating, setFieldsError, setFieldTouched, setFieldsTouched, resetFormFields, submitWithValidation, defineField]);
762
+ }, [formCore.formInstance, formCore.getFieldValue, formCore.getFieldsValue, formCore.setFieldValue, formCore.setFieldsValue, formCore.setFieldError, formCore.registerField, formCore.unregisterField, validateFieldsAsync, getFieldError, getFieldWarning, getFieldsError, isFieldTouched, isFieldsTouched, isFieldValidating, setFieldsError, setFieldTouched, setFieldsTouched, resetFormFields, submitWithValidation, defineField]);
763
+ // Function-form rules get the FULL form instance (error getters, touched
764
+ // state, mutators) instead of the bare core methods. Ref write — cheap and
765
+ // idempotent per render.
766
+ formCore.setRuleContextInstance(formInstance);
600
767
  // ---------------------------------------------------------------------------
601
768
  // Internals – exposed for ProForm integration. Data fields are GETTERS that
602
769
  // read the live store, so the object is identity-stable yet never stale.
@@ -622,14 +789,15 @@ var useForm = exports.useForm = function useForm() {
622
789
  setFieldValue: formCore.setFieldValue,
623
790
  setFieldError: formCore.setFieldError,
624
791
  setFieldWarning: formCore.setFieldWarning,
625
- validateField: formCore.validateField,
626
792
  validateFieldAsync: validateFieldAsync,
627
793
  registerField: formCore.registerField,
628
794
  unregisterField: formCore.unregisterField,
795
+ retainField: formCore.retainField,
796
+ releaseField: formCore.releaseField,
629
797
  handleSubmit: handleSubmit,
630
798
  handleReset: handleReset
631
799
  };
632
- }, [store, formCore.fieldRules, formCore.setFieldValue, formCore.setFieldError, formCore.setFieldWarning, formCore.validateField, validateFieldAsync, formCore.registerField, formCore.unregisterField, handleSubmit, handleReset]);
800
+ }, [store, formCore.fieldRules, formCore.setFieldValue, formCore.setFieldError, formCore.setFieldWarning, validateFieldAsync, formCore.registerField, formCore.unregisterField, formCore.retainField, formCore.releaseField, handleSubmit, handleReset]);
633
801
  return {
634
802
  formInstance: formInstance,
635
803
  internals: internals,
@@ -637,4 +805,4 @@ var useForm = exports.useForm = function useForm() {
637
805
  };
638
806
  };
639
807
  var _default = exports["default"] = useForm;
640
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL3NyYy9jb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ob29rcy91c2VGb3JtLnRzIiwiY29tcG9uZW50cy9Qcm9Gb3JtL2NvcmUvaG9va3MvdXNlRm9ybS5qcyJdLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfdXNlRXZlbnRDYWxsYmFjayIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdXNlTWVtb2l6ZWRGbiIsIl91c2VGb3JtQ29yZSIsIl9wYXRoVXRpbHMiLCJfcnVuUnVsZXMiLCJfZm9ybVN0b3JlIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mMyIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsInJlc29sdmUiLCJQcm9taXNlIiwicmVqZWN0IiwiZnVsZmlsbGVkIiwic3RlcCIsInJlamVjdGVkIiwicmVzdWx0IiwidGhlbiIsImFwcGx5IiwiX19yZXN0IiwicCIsInByb3RvdHlwZSIsImluZGV4T2YiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImhhc0N1c3RvbVZhbGlkYXRvciIsInJ1bGVzIiwic29tZSIsInJ1bGUiLCJ2YWxpZGF0b3IiLCJ1c2VGb3JtIiwiZXhwb3J0cyIsImNvbmZpZyIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsIm9uRmluaXNoIiwib25GaW5pc2hGYWlsZWQiLCJvblJlc2V0IiwiX2NvbmZpZyR2YWxpZGF0ZVRyaWdnIiwidmFsaWRhdGVUcmlnZ2VyIiwiZm9ybUNvcmUiLCJ1c2VGb3JtQ29yZSIsInN0b3JlIiwibWFya1ZhbGlkYXRpbmciLCJ1c2VNZW1vaXplZEZuIiwibmFtZXMiLCJhc3NpZ24iLCJnZXRTdGF0ZSIsInZhbGlkYXRpbmciLCJmb3JFYWNoIiwic2V0U3RhdGUiLCJjb21taXRSdWxlT3V0Y29tZXMiLCJvdXRjb21lcyIsImNsZWFyVmFsaWRhdGluZyIsInN0YXRlIiwiZXJyb3JzQ2hhbmdlZCIsIndhcm5pbmdzQ2hhbmdlZCIsIm5ld0Vycm9ycyIsImVycm9ycyIsIm5ld1dhcm5pbmdzIiwid2FybmluZ3MiLCJfaXRlcmF0b3IiLCJfc3RlcCIsIl9zdGVwJHZhbHVlIiwiZXJyb3IiLCJ3YXJuaW5nIiwiZXJyIiwiZmxhZ3NUb0NsZWFyIiwiZmlsdGVyIiwicGF0Y2giLCJuZXdWYWxpZGF0aW5nIiwia2V5cyIsInZhbGlkYXRlRmllbGRBc3luYyIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiZmxhZ2dlZCIsIm91dGNvbWUiLCJfeWllbGQkcnVuUnVsZXNBc3luYyIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJhYnJ1cHQiLCJpc1ZhbGlkIiwicnVuUnVsZXNBc3luYyIsImdldEZpZWxkc1ZhbHVlIiwic2VudCIsImZpbmlzaCIsInN0b3AiLCJoYW5kbGVGaWVsZEJsdXIiLCJ1c2VFdmVudENhbGxiYWNrIiwiX2NhbGxlZTIiLCJ0b3VjaGVkIiwiX2NvbnRleHQyIiwiX2RlZmluZVByb3BlcnR5MiIsImdldEZpZWxkUnVsZXMiLCJyZXNvbHZlVmFsdWUiLCJ2YWxpZGF0ZUZpZWxkc0FzeW5jIiwibmFtZUxpc3QiLCJfY2FsbGVlNCIsImZpZWxkc1RvVmFsaWRhdGUiLCJmaWVsZEVycm9ycyIsIl9jb250ZXh0NCIsImZpZWxkUnVsZXMiLCJhbGwiLCJtYXAiLCJfY2FsbGVlMyIsIl95aWVsZCRydW5SdWxlc0FzeW5jMiIsIl9jb250ZXh0MyIsInB1c2giLCJFcnJvciIsInZhbHVlcyIsInJlZHVjZSIsImFjYyIsImRlZmluZUZpZWxkIiwiZmllbGRPcHRpb25zIiwiX2ZpZWxkT3B0aW9ucyRydWxlcyIsIkZpZWxkQ29tcG9uZW50IiwibWVtbyIsIl9hIiwiY2hpbGRyZW4iLCJyZW5kZXIiLCJwcm9wcyIsIl91c2VTdG9yZVNlbGVjdG9yIiwidXNlU3RvcmVTZWxlY3RvciIsInNoYWxsb3dFcXVhbEFycmF5cyIsIl91c2VTdG9yZVNlbGVjdG9yMiIsIl9zbGljZWRUb0FycmF5MiIsImZpZWxkVmFsdWUiLCJmaWVsZEVycm9yIiwiZmllbGRUb3VjaGVkIiwiZmllbGRWYWxpZGF0aW5nIiwidXNlRWZmZWN0IiwiZXhpc3RpbmdSdWxlcyIsInJlZ2lzdGVyRmllbGQiLCJ1bnJlZ2lzdGVyRmllbGQiLCJoYW5kbGVGaWVsZENoYW5nZSIsInNldEZpZWxkVmFsdWUiLCJ2YWxpZGF0ZUZpZWxkIiwiaGFuZGxlQmx1ciIsImZpZWxkUHJvcHMiLCJvbkNoYW5nZSIsIm9uQmx1ciIsImhhbmRsZU1lcmdlQ2hhbmdlIiwiX3R5cGVvZjIiLCJ0YXJnZXQiLCJSZWFjdCIsImlzVmFsaWRFbGVtZW50IiwiaGFuZGxlTWVyZ2VCbHVyIiwibWVyZ2VkUHJvcHMiLCJjbG9uZUVsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiRnJhZ21lbnQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiY2hpbGQiLCJpbmRleCIsImtleSIsImRpc3BsYXlOYW1lIiwiaGFuZGxlU3VibWl0IiwiX2NhbGxlZTUiLCJ2YWxpZGF0ZWRWYWx1ZXMiLCJ0eXBlZCIsIl90IiwiX2NvbnRleHQ1IiwicHJldmVudERlZmF1bHQiLCJoYW5kbGVSZXNldCIsInJlc2V0RmllbGRzIiwiZ2V0RmllbGRFcnJvciIsImdldEZpZWxkV2FybmluZyIsImdldEZpZWxkc0Vycm9yIiwiaXNGaWVsZFRvdWNoZWQiLCJpc0ZpZWxkc1RvdWNoZWQiLCJhbGxGaWVsZHNUb3VjaGVkIiwiZXZlcnkiLCJpc0ZpZWxkVmFsaWRhdGluZyIsInNldEZpZWxkc0Vycm9yIiwiZmllbGRzRXJyb3IiLCJlbnRyaWVzIiwiX3JlZiIsIl9yZWYyIiwic2V0RmllbGRFcnJvciIsInNldEZpZWxkVG91Y2hlZCIsImlzVG91Y2hlZCIsInNldEZpZWxkc1RvdWNoZWQiLCJmaWVsZHNUb3VjaCIsInJlc2V0Rm9ybUZpZWxkcyIsImZpZWxkcyIsInJlc2V0VmFsdWVzIiwiZmllbGQiLCJnZXRJbml0aWFsVmFsdWVzIiwic2V0RmllbGRzVmFsdWUiLCJfc3RvcmUkZ2V0U3RhdGUiLCJuZXdUb3VjaGVkIiwic3VibWl0V2l0aFZhbGlkYXRpb24iLCJjYWxsYmFjayIsIl9jYWxsZWU2IiwiX3QyIiwiX2NvbnRleHQ2IiwiZm9ybUluc3RhbmNlIiwidXNlTWVtbyIsInZhbGlkYXRlRmllbGRzIiwic3VibWl0IiwiaW50ZXJuYWxzIiwic2V0RmllbGRXYXJuaW5nIiwiX2RlZmF1bHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFHQSxJQUFBQyxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsY0FBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksWUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sU0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sVUFBQSxHQUFBUCxPQUFBO0FBQW9FLFNBQUFRLHlCQUFB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cy9Qcm9Gb3JtL2NvcmUvaG9va3MvdXNlRm9ybS5qcyIsInNvdXJjZXNDb250ZW50IjpbbnVsbCwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyB1c2VNZW1vLCB1c2VFZmZlY3QsIG1lbW8sIEZyYWdtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0AxbW9uZXkvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgdXNlTWVtb2l6ZWRGbiBmcm9tICdAMW1vbmV5L2hvb2tzL3VzZU1lbW9pemVkRm4nO1xuaW1wb3J0IHsgdXNlRm9ybUNvcmUgfSBmcm9tICcuL3VzZUZvcm1Db3JlJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJy4uL3BhdGhVdGlscyc7XG5pbXBvcnQgeyBydW5SdWxlc0FzeW5jIH0gZnJvbSAnLi4vcnVuUnVsZXMnO1xuaW1wb3J0IHsgdXNlU3RvcmVTZWxlY3Rvciwgc2hhbGxvd0VxdWFsQXJyYXlzIH0gZnJvbSAnLi4vZm9ybVN0b3JlJztcbi8qKlxuICogT25seSBydWxlcyB3aXRoIGEgY3VzdG9tIGB2YWxpZGF0b3JgIGNhbiBiZSBnZW51aW5lbHkgYXN5bmNocm9ub3VzIOKAlFxuICogYnVpbHRpbiBydWxlcyByZXNvbHZlIHdpdGhpbiBhIG1pY3JvdGFzaywgc28gZmxpcHBpbmcgYHZhbGlkYXRpbmdgIGZvclxuICogdGhlbSB3b3VsZCBvbmx5IGNodXJuIHN1YnNjcmliZXJzIHdpdGhvdXQgZXZlciBiZWluZyB2aXNpYmxlLlxuICovXG5jb25zdCBoYXNDdXN0b21WYWxpZGF0b3IgPSAocnVsZXMpID0+IHJ1bGVzLnNvbWUoKHJ1bGUpID0+IHR5cGVvZiBydWxlLnZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJyk7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIHVzZUZvcm1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNvbnN0IHVzZUZvcm0gPSAoY29uZmlnID0ge30pID0+IHtcbiAgICBjb25zdCB7IG9uRmluaXNoLCBvbkZpbmlzaEZhaWxlZCwgb25SZXNldCwgdmFsaWRhdGVUcmlnZ2VyID0gJ29uQ2hhbmdlJywgfSA9IGNvbmZpZztcbiAgICBjb25zdCBmb3JtQ29yZSA9IHVzZUZvcm1Db3JlKGNvbmZpZyk7XG4gICAgY29uc3QgeyBzdG9yZSB9ID0gZm9ybUNvcmU7XG4gICAgLy8gTWFyayBmaWVsZHMgYXMgdmFsaWRhdGluZyBpbiBPTkUgY29tbWl0LiB2YWxpZGF0aW5nIC8gdG91Y2hlZCBsaXZlIGluIHRoZVxuICAgIC8vIHN0b3JlIGFsb25nc2lkZSB2YWx1ZXMg4oCUIGZsaXBwaW5nIHRoZW0gKGUuZy4gYXN5bmMgdmFsaWRhdGlvbiBhcm91bmQgYVxuICAgIC8vIGJsdXIpIG11c3Qgbm90IHJlLXJlbmRlciB0aGUgZm9ybSByb290LCBvbmx5IHRoZSBmaWVsZHMgdGhhdCBzdWJzY3JpYmVkLlxuICAgIGNvbnN0IG1hcmtWYWxpZGF0aW5nID0gdXNlTWVtb2l6ZWRGbigobmFtZXMpID0+IHtcbiAgICAgICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV4dCA9IE9iamVjdC5hc3NpZ24oe30sIHN0b3JlLmdldFN0YXRlKCkudmFsaWRhdGluZyk7XG4gICAgICAgIG5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgIG5leHRbbmFtZV0gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB2YWxpZGF0aW5nOiBuZXh0IH0pO1xuICAgIH0pO1xuICAgIC8vIEZvbGQgcGVyLWZpZWxkIHJ1bGUgb3V0Y29tZXMgaW50byBBVCBNT1NUIG9uZSBzdG9yZSBjb21taXQ6IGVycm9ycyBhbmRcbiAgICAvLyB3YXJuaW5ncyBhcmUgbWVyZ2VkIG92ZXIgdGhlIGN1cnJlbnQgbWFwcyBhbmQgdGhlIGBjbGVhclZhbGlkYXRpbmdgIGZsYWdzXG4gICAgLy8gYXJlIHJlbW92ZWQgaW4gdGhlIFNBTUUgcGF0Y2guIEEgbm8tb3Agb3V0Y29tZSBjb21taXRzIG5vdGhpbmcgYXQgYWxsIOKAlFxuICAgIC8vIHBlci1maWVsZCBjb21taXRzIGhlcmUgcHJldmlvdXNseSBtYWRlIHN1Ym1pdC10aW1lIHZhbGlkYXRpb24gc3dlZXAgZXZlcnlcbiAgICAvLyBzdWJzY3JpYmVyIE8oZmllbGRzKSB0aW1lcy5cbiAgICBjb25zdCBjb21taXRSdWxlT3V0Y29tZXMgPSB1c2VNZW1vaXplZEZuKChvdXRjb21lcywgY2xlYXJWYWxpZGF0aW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IGVycm9yc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHdhcm5pbmdzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBuZXdFcnJvcnMgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5lcnJvcnMpO1xuICAgICAgICBjb25zdCBuZXdXYXJuaW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLndhcm5pbmdzKTtcbiAgICAgICAgZm9yIChjb25zdCB7IG5hbWUsIGVycm9yLCB3YXJuaW5nIH0gb2Ygb3V0Y29tZXMpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lIGluIG5ld0Vycm9ycykge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbmV3RXJyb3JzW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChuZXdFcnJvcnNbbmFtZV0gIT09IGVycm9yKSB7XG4gICAgICAgICAgICAgICAgbmV3RXJyb3JzW25hbWVdID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgZXJyb3JzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FybmluZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lIGluIG5ld1dhcm5pbmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdXYXJuaW5nc1tuYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3NDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChuZXdXYXJuaW5nc1tuYW1lXSAhPT0gd2FybmluZykge1xuICAgICAgICAgICAgICAgIG5ld1dhcm5pbmdzW25hbWVdID0gd2FybmluZztcbiAgICAgICAgICAgICAgICB3YXJuaW5nc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZsYWdzVG9DbGVhciA9IGNsZWFyVmFsaWRhdGluZy5maWx0ZXIoKG5hbWUpID0+IG5hbWUgaW4gc3RhdGUudmFsaWRhdGluZyk7XG4gICAgICAgIGNvbnN0IHBhdGNoID0ge307XG4gICAgICAgIGlmIChlcnJvcnNDaGFuZ2VkKVxuICAgICAgICAgICAgcGF0Y2guZXJyb3JzID0gbmV3RXJyb3JzO1xuICAgICAgICBpZiAod2FybmluZ3NDaGFuZ2VkKVxuICAgICAgICAgICAgcGF0Y2gud2FybmluZ3MgPSBuZXdXYXJuaW5ncztcbiAgICAgICAgaWYgKGZsYWdzVG9DbGVhci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWxpZGF0aW5nID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUudmFsaWRhdGluZyk7XG4gICAgICAgICAgICBmbGFnc1RvQ2xlYXIuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdWYWxpZGF0aW5nW25hbWVdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYXRjaC52YWxpZGF0aW5nID0gbmV3VmFsaWRhdGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZShwYXRjaCk7XG4gICAgfSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQXN5bmMgZmllbGQgdmFsaWRhdGlvbiDigJMgZWFjaCBydWxlIGlzIHByb2Nlc3NlZCBleGFjdGx5IG9uY2VcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCB2YWxpZGF0ZUZpZWxkQXN5bmMgPSB1c2VNZW1vaXplZEZuKChuYW1lLCB2YWx1ZSwgcnVsZXMpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoIXJ1bGVzIHx8IHJ1bGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUsIGVycm9yOiBudWxsIH07XG4gICAgICAgIGNvbnN0IGZsYWdnZWQgPSBoYXNDdXN0b21WYWxpZGF0b3IocnVsZXMpID8gW25hbWVdIDogW107XG4gICAgICAgIG1hcmtWYWxpZGF0aW5nKGZsYWdnZWQpO1xuICAgICAgICBsZXQgb3V0Y29tZSA9IHsgbmFtZSwgZXJyb3I6IG51bGwsIHdhcm5pbmc6IG51bGwgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IsIHdhcm5pbmcgfSA9IHlpZWxkIHJ1blJ1bGVzQXN5bmMobmFtZSwgdmFsdWUsIGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlKCksIHJ1bGVzKTtcbiAgICAgICAgICAgIG91dGNvbWUgPSB7IG5hbWUsIGVycm9yLCB3YXJuaW5nIH07XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBjb21taXRSdWxlT3V0Y29tZXMoW291dGNvbWVdLCBmbGFnZ2VkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBvdXRjb21lLmVycm9yID09PSBudWxsLCBlcnJvcjogb3V0Y29tZS5lcnJvciB9O1xuICAgIH0pKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBBc3luYyBmaWVsZCBibHVyIGhhbmRsZXJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBoYW5kbGVGaWVsZEJsdXIgPSB1c2VFdmVudENhbGxiYWNrKChuYW1lKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgdG91Y2hlZCA9IHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZDtcbiAgICAgICAgaWYgKCF0b3VjaGVkW25hbWVdKSB7XG4gICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHRvdWNoZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdG91Y2hlZCksIHsgW25hbWVdOiB0cnVlIH0pIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVzID0gZm9ybUNvcmUuZ2V0RmllbGRSdWxlcyhuYW1lKTtcbiAgICAgICAgaWYgKHJ1bGVzICYmIHZhbGlkYXRlVHJpZ2dlciA9PT0gJ29uQmx1cicpIHtcbiAgICAgICAgICAgIHlpZWxkIHZhbGlkYXRlRmllbGRBc3luYyhuYW1lLCByZXNvbHZlVmFsdWUoZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKSwgbmFtZSksIHJ1bGVzKTtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBWYWxpZGF0ZSBhbGwgZmllbGRzIGFzeW5jXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3QgdmFsaWRhdGVGaWVsZHNBc3luYyA9IHVzZU1lbW9pemVkRm4oKG5hbWVMaXN0KSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZmllbGRzVG9WYWxpZGF0ZSA9IG5hbWVMaXN0IHx8IE9iamVjdC5rZXlzKGZvcm1Db3JlLmZpZWxkUnVsZXMpO1xuICAgICAgICBjb25zdCBmaWVsZEVycm9ycyA9IHt9O1xuICAgICAgICAvLyBPbmUgY29tbWl0IHRvIHJhaXNlIHRoZSB2YWxpZGF0aW5nIGZsYWdzICh2YWxpZGF0b3ItYmVhcmluZyBmaWVsZHNcbiAgICAgICAgLy8gb25seSksIG9uZSBjb21taXQgdG8gbGFuZCBldmVyeSBlcnJvci93YXJuaW5nIGFuZCBjbGVhciB0aGUgZmxhZ3MuXG4gICAgICAgIGNvbnN0IGZsYWdnZWQgPSBmaWVsZHNUb1ZhbGlkYXRlLmZpbHRlcigobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVsZXMgPSBmb3JtQ29yZS5maWVsZFJ1bGVzW25hbWVdO1xuICAgICAgICAgICAgcmV0dXJuIHJ1bGVzID8gaGFzQ3VzdG9tVmFsaWRhdG9yKHJ1bGVzKSA6IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgbWFya1ZhbGlkYXRpbmcoZmxhZ2dlZCk7XG4gICAgICAgIGNvbnN0IG91dGNvbWVzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB5aWVsZCBQcm9taXNlLmFsbChmaWVsZHNUb1ZhbGlkYXRlLm1hcCgobmFtZSkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcnVsZXMgPSBmb3JtQ29yZS5maWVsZFJ1bGVzW25hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghcnVsZXMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVycm9yLCB3YXJuaW5nIH0gPSB5aWVsZCBydW5SdWxlc0FzeW5jKG5hbWUsIHJlc29sdmVWYWx1ZShmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCBuYW1lKSwgZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKSwgcnVsZXMpO1xuICAgICAgICAgICAgICAgIG91dGNvbWVzLnB1c2goeyBuYW1lLCBlcnJvciwgd2FybmluZyB9KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRFcnJvcnNbbmFtZV0gPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgY29tbWl0UnVsZU91dGNvbWVzKG91dGNvbWVzLCBmbGFnZ2VkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZmllbGRFcnJvcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdWYWxpZGF0aW9uIGZhaWxlZCcpO1xuICAgICAgICAgICAgZXJyb3IudmFsdWVzID0gZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKTtcbiAgICAgICAgICAgIGVycm9yLmVycm9ycyA9IGZpZWxkRXJyb3JzO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWVMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmFtZUxpc3QucmVkdWNlKChhY2MsIG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBhY2NbbmFtZV0gPSByZXNvbHZlVmFsdWUoZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKSwgbmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKTtcbiAgICB9KSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gZGVmaW5lRmllbGQg4oCTIHVzZWQgYnkgc3RhbmRhbG9uZSAobm9uLVByb0Zvcm0pIGNvbnN1bWVyc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGRlZmluZUZpZWxkID0gdXNlTWVtb2l6ZWRGbigobmFtZSwgZmllbGRPcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgeyBydWxlcyA9IFtdIH0gPSBmaWVsZE9wdGlvbnM7XG4gICAgICAgIGNvbnN0IEZpZWxkQ29tcG9uZW50ID0gbWVtbygoX2EpID0+IHtcbiAgICAgICAgICAgIHZhciB7IGNoaWxkcmVuLCByZW5kZXIgfSA9IF9hLCBwcm9wcyA9IF9fcmVzdChfYSwgW1wiY2hpbGRyZW5cIiwgXCJyZW5kZXJcIl0pO1xuICAgICAgICAgICAgLy8gUGVyLWZpZWxkIHN0b3JlIHN1YnNjcmlwdGlvbjogdGhpcyBmaWVsZCByZS1yZW5kZXJzIG9ubHkgd2hlbiBpdHNcbiAgICAgICAgICAgIC8vIG93biB2YWx1ZS9lcnJvci90b3VjaGVkL3ZhbGlkYXRpbmcgc2xpY2UgY2hhbmdlcy5cbiAgICAgICAgICAgIGNvbnN0IFtmaWVsZFZhbHVlLCBmaWVsZEVycm9yLCBmaWVsZFRvdWNoZWQsIGZpZWxkVmFsaWRhdGluZ10gPSB1c2VTdG9yZVNlbGVjdG9yKHN0b3JlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgKF9hID0gc3RhdGUudmFsdWVzW25hbWVdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3JzW25hbWVdLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50b3VjaGVkW25hbWVdLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS52YWxpZGF0aW5nW25hbWVdLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9LCBzaGFsbG93RXF1YWxBcnJheXMpO1xuICAgICAgICAgICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1J1bGVzID0gZm9ybUNvcmUuZ2V0RmllbGRSdWxlcyhuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nUnVsZXMgJiYgcnVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3JtQ29yZS5yZWdpc3RlckZpZWxkKG5hbWUsIHJ1bGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvcmUudW5yZWdpc3RlckZpZWxkKG5hbWUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LCBbXSk7IC8vIE9ubHkgcmVnaXN0ZXIgb24gbW91bnRcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUZpZWxkQ2hhbmdlID0gdXNlRXZlbnRDYWxsYmFjaygodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVUcmlnZ2VyID09PSAnb25DaGFuZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db3JlLnZhbGlkYXRlRmllbGQobmFtZSwgcnVsZXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUJsdXIgPSB1c2VFdmVudENhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVGaWVsZEJsdXIobmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkUHJvcHMgPSBPYmplY3QuYXNzaWduKHsgbmFtZSwgdmFsdWU6IGZpZWxkVmFsdWUsIGVycm9yOiBmaWVsZEVycm9yLCB0b3VjaGVkOiBmaWVsZFRvdWNoZWQsIHZhbGlkYXRpbmc6IGZpZWxkVmFsaWRhdGluZywgb25DaGFuZ2U6IGhhbmRsZUZpZWxkQ2hhbmdlLCBvbkJsdXI6IGhhbmRsZUJsdXIgfSwgcHJvcHMpO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlTWVyZ2VDaGFuZ2UgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGUgJiYgdHlwZW9mIGUgPT09ICdvYmplY3QnICYmICd0YXJnZXQnIGluIGVcbiAgICAgICAgICAgICAgICAgICAgPyBlLnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGU7XG4gICAgICAgICAgICAgICAgaGFuZGxlRmllbGRDaGFuZ2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikgJiZcbiAgICAgICAgICAgICAgICAgICAgKChfYSA9IGNoaWxkcmVuLnByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25DaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlTWVyZ2VCbHVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBoYW5kbGVCbHVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSAmJlxuICAgICAgICAgICAgICAgICAgICAoKF9hID0gY2hpbGRyZW4ucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkJsdXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnByb3BzLm9uQmx1cigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocmVuZGVyICYmIHR5cGVvZiByZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyKGZpZWxkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbihmaWVsZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZmllbGRQcm9wcyksIHsgb25DaGFuZ2U6IGhhbmRsZU1lcmdlQ2hhbmdlLCBvbkJsdXI6IGhhbmRsZU1lcmdlQmx1ciB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCBtZXJnZWRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgLi4uY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkUHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZpZWxkUHJvcHMpLCB7IGtleTogY2hpbGQua2V5IHx8IGluZGV4LCBvbkNoYW5nZTogaGFuZGxlTWVyZ2VDaGFuZ2UsIG9uQmx1cjogaGFuZGxlTWVyZ2VCbHVyIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwgbWVyZ2VkUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIEZpZWxkQ29tcG9uZW50LmRpc3BsYXlOYW1lID0gYEZpZWxkKCR7bmFtZX0pYDtcbiAgICAgICAgcmV0dXJuIEZpZWxkQ29tcG9uZW50O1xuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIGhhbmRsZVN1Ym1pdCAvIGhhbmRsZVJlc2V0IOKAkyBmb3IgPGZvcm0+IGV2ZW50IGhhbmRsZXJzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3QgaGFuZGxlU3VibWl0ID0gdXNlRXZlbnRDYWxsYmFjaygoZSkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVkVmFsdWVzID0geWllbGQgdmFsaWRhdGVGaWVsZHNBc3luYygpO1xuICAgICAgICAgICAgb25GaW5pc2ggPT09IG51bGwgfHwgb25GaW5pc2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRmluaXNoKHZhbGlkYXRlZFZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc3QgdHlwZWQgPSBlcnI7XG4gICAgICAgICAgICBvbkZpbmlzaEZhaWxlZCA9PT0gbnVsbCB8fCBvbkZpbmlzaEZhaWxlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25GaW5pc2hGYWlsZWQoeyB2YWx1ZXM6IHR5cGVkLnZhbHVlcywgZXJyb3JzOiB0eXBlZC5lcnJvcnMgfSk7XG4gICAgICAgIH1cbiAgICB9KSk7XG4gICAgY29uc3QgaGFuZGxlUmVzZXQgPSB1c2VFdmVudENhbGxiYWNrKChlKSA9PiB7XG4gICAgICAgIGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBmb3JtQ29yZS5yZXNldEZpZWxkcygpO1xuICAgICAgICBvblJlc2V0ID09PSBudWxsIHx8IG9uUmVzZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUmVzZXQoKTtcbiAgICB9KTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBGb3JtSW5zdGFuY2Ug4oCTIGVuaGFuY2VkIEFQSSBmb3IgY29uc3VtZXJzLlxuICAgIC8vXG4gICAgLy8gRXZlcnkgbWV0aG9kIGlzIHdyYXBwZWQgaW4gdXNlTWVtb2l6ZWRGbiAoc3RhYmxlIGlkZW50aXR5LCBhbHdheXMgcmVhZHMgdGhlXG4gICAgLy8gbGF0ZXN0IHN0b3JlIHN0YXRlKSBzbyB0aGUgaW5zdGFuY2Ugb2JqZWN0IGl0c2VsZiBpcyBJREVOVElUWS1TVEFCTEUgZm9yXG4gICAgLy8gdGhlIGxpZmV0aW1lIG9mIHRoZSBmb3JtIOKAlCB0aGlzIGlzIHdoYXQgbGV0cyBQcm9Gb3JtIHB1Ymxpc2ggaXQgdGhyb3VnaCB0aGVcbiAgICAvLyBzdGFibGUgY29udGV4dCB3aXRob3V0IHJlLXJlbmRlcmluZyBzdWJzY3JpYmVycyBvbiBlYWNoIGtleXN0cm9rZS5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBnZXRGaWVsZEVycm9yID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4gc3RvcmUuZ2V0U3RhdGUoKS5lcnJvcnNbbmFtZV0pO1xuICAgIGNvbnN0IGdldEZpZWxkV2FybmluZyA9IHVzZU1lbW9pemVkRm4oKG5hbWUpID0+IHN0b3JlLmdldFN0YXRlKCkud2FybmluZ3NbbmFtZV0pO1xuICAgIGNvbnN0IGdldEZpZWxkc0Vycm9yID0gdXNlTWVtb2l6ZWRGbigobmFtZUxpc3QpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gc3RvcmUuZ2V0U3RhdGUoKS5lcnJvcnM7XG4gICAgICAgIGlmICghbmFtZUxpc3QpXG4gICAgICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgbmFtZUxpc3QuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IGVycm9yc1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gICAgY29uc3QgaXNGaWVsZFRvdWNoZWQgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLnRvdWNoZWRbbmFtZV0gfHwgZmFsc2UpO1xuICAgIGNvbnN0IGlzRmllbGRzVG91Y2hlZCA9IHVzZU1lbW9pemVkRm4oKG5hbWVMaXN0LCBhbGxGaWVsZHNUb3VjaGVkID0gZmFsc2UpID0+IHtcbiAgICAgICAgY29uc3QgdG91Y2hlZCA9IHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZDtcbiAgICAgICAgaWYgKCFuYW1lTGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRvdWNoZWQpLnNvbWUoKGtleSkgPT4gdG91Y2hlZFtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsRmllbGRzVG91Y2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVMaXN0LmV2ZXJ5KChuYW1lKSA9PiB0b3VjaGVkW25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmFtZUxpc3Quc29tZSgobmFtZSkgPT4gdG91Y2hlZFtuYW1lXSk7XG4gICAgfSk7XG4gICAgY29uc3QgaXNGaWVsZFZhbGlkYXRpbmcgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLnZhbGlkYXRpbmdbbmFtZV0gfHwgZmFsc2UpO1xuICAgIGNvbnN0IHNldEZpZWxkc0Vycm9yID0gdXNlTWVtb2l6ZWRGbigoZmllbGRzRXJyb3IpID0+IHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZmllbGRzRXJyb3IpLmZvckVhY2goKFtuYW1lLCBlcnJvcl0pID0+IHtcbiAgICAgICAgICAgIGZvcm1Db3JlLnNldEZpZWxkRXJyb3IobmFtZSwgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBzZXRGaWVsZFRvdWNoZWQgPSB1c2VNZW1vaXplZEZuKChuYW1lLCBpc1RvdWNoZWQgPSB0cnVlKSA9PiB7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdG91Y2hlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdG9yZS5nZXRTdGF0ZSgpLnRvdWNoZWQpLCB7IFtuYW1lXTogaXNUb3VjaGVkIH0pIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldEZpZWxkc1RvdWNoZWQgPSB1c2VNZW1vaXplZEZuKChmaWVsZHNUb3VjaCkgPT4ge1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHRvdWNoZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkKSwgZmllbGRzVG91Y2gpIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlc2V0Rm9ybUZpZWxkcyA9IHVzZU1lbW9pemVkRm4oKGZpZWxkcykgPT4ge1xuICAgICAgICBpZiAoIWZpZWxkcykge1xuICAgICAgICAgICAgZm9ybUNvcmUucmVzZXRGaWVsZHMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc2V0VmFsdWVzID0ge307XG4gICAgICAgICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBNb3VudC1mcm96ZW4gaW5pdGlhbFZhbHVlcyDigJQgY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIHJlc2V0RmllbGRzLlxuICAgICAgICAgICAgICAgIHJlc2V0VmFsdWVzW2ZpZWxkXSA9IGZvcm1Db3JlLmdldEluaXRpYWxWYWx1ZXMoKVtmaWVsZF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvcm1Db3JlLnNldEZpZWxkc1ZhbHVlKHJlc2V0VmFsdWVzKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdG91Y2hlZCwgdmFsaWRhdGluZyB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1RvdWNoZWQgPSBPYmplY3QuYXNzaWduKHt9LCB0b3VjaGVkKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbGlkYXRpbmcgPSBPYmplY3QuYXNzaWduKHt9LCB2YWxpZGF0aW5nKTtcbiAgICAgICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdUb3VjaGVkW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV3VmFsaWRhdGluZ1tmaWVsZF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdG91Y2hlZDogbmV3VG91Y2hlZCwgdmFsaWRhdGluZzogbmV3VmFsaWRhdGluZyB9KTtcbiAgICAgICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvcm1Db3JlLnNldEZpZWxkRXJyb3IoZmllbGQsIG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzdWJtaXRXaXRoVmFsaWRhdGlvbiA9IHVzZU1lbW9pemVkRm4oKGNhbGxiYWNrKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZFZhbHVlcyA9IHlpZWxkIHZhbGlkYXRlRmllbGRzQXN5bmMoKTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHlpZWxkIGNhbGxiYWNrKHZhbGlkYXRlZFZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVkVmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCBmb3JtSW5zdGFuY2UgPSB1c2VNZW1vKCgpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZvcm1Db3JlLmZvcm1JbnN0YW5jZSksIHsgdmFsaWRhdGVGaWVsZHM6IHZhbGlkYXRlRmllbGRzQXN5bmMsIHNldEZpZWxkVmFsdWU6IGZvcm1Db3JlLnNldEZpZWxkVmFsdWUsIGdldEZpZWxkRXJyb3IsXG4gICAgICAgIGdldEZpZWxkV2FybmluZyxcbiAgICAgICAgZ2V0RmllbGRzRXJyb3IsXG4gICAgICAgIGlzRmllbGRUb3VjaGVkLFxuICAgICAgICBpc0ZpZWxkc1RvdWNoZWQsXG4gICAgICAgIGlzRmllbGRWYWxpZGF0aW5nLCBzZXRGaWVsZEVycm9yOiBmb3JtQ29yZS5zZXRGaWVsZEVycm9yLCBzZXRGaWVsZHNFcnJvcixcbiAgICAgICAgc2V0RmllbGRUb3VjaGVkLFxuICAgICAgICBzZXRGaWVsZHNUb3VjaGVkLCByZXNldEZpZWxkczogcmVzZXRGb3JtRmllbGRzLCBzdWJtaXQ6IHN1Ym1pdFdpdGhWYWxpZGF0aW9uLCBkZWZpbmVGaWVsZCwgcmVnaXN0ZXJGaWVsZDogZm9ybUNvcmUucmVnaXN0ZXJGaWVsZCwgdW5yZWdpc3RlckZpZWxkOiBmb3JtQ29yZS51bnJlZ2lzdGVyRmllbGQgfSkpLCBbXG4gICAgICAgIGZvcm1Db3JlLmZvcm1JbnN0YW5jZSxcbiAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRWYWx1ZSxcbiAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRFcnJvcixcbiAgICAgICAgZm9ybUNvcmUucmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgZm9ybUNvcmUudW5yZWdpc3RlckZpZWxkLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkc0FzeW5jLFxuICAgICAgICBnZXRGaWVsZEVycm9yLFxuICAgICAgICBnZXRGaWVsZFdhcm5pbmcsXG4gICAgICAgIGdldEZpZWxkc0Vycm9yLFxuICAgICAgICBpc0ZpZWxkVG91Y2hlZCxcbiAgICAgICAgaXNGaWVsZHNUb3VjaGVkLFxuICAgICAgICBpc0ZpZWxkVmFsaWRhdGluZyxcbiAgICAgICAgc2V0RmllbGRzRXJyb3IsXG4gICAgICAgIHNldEZpZWxkVG91Y2hlZCxcbiAgICAgICAgc2V0RmllbGRzVG91Y2hlZCxcbiAgICAgICAgcmVzZXRGb3JtRmllbGRzLFxuICAgICAgICBzdWJtaXRXaXRoVmFsaWRhdGlvbixcbiAgICAgICAgZGVmaW5lRmllbGQsXG4gICAgXSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gSW50ZXJuYWxzIOKAkyBleHBvc2VkIGZvciBQcm9Gb3JtIGludGVncmF0aW9uLiBEYXRhIGZpZWxkcyBhcmUgR0VUVEVSUyB0aGF0XG4gICAgLy8gcmVhZCB0aGUgbGl2ZSBzdG9yZSwgc28gdGhlIG9iamVjdCBpcyBpZGVudGl0eS1zdGFibGUgeWV0IG5ldmVyIHN0YWxlLlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGludGVybmFscyA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICAgICAgZ2V0IHZhbHVlcygpIHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5nZXRTdGF0ZSgpLnZhbHVlcztcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGVycm9ycygpIHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5nZXRTdGF0ZSgpLmVycm9ycztcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHdhcm5pbmdzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkud2FybmluZ3M7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB0b3VjaGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHZhbGlkYXRpbmcoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuZ2V0U3RhdGUoKS52YWxpZGF0aW5nO1xuICAgICAgICB9LFxuICAgICAgICBmaWVsZFJ1bGVzOiBmb3JtQ29yZS5maWVsZFJ1bGVzLFxuICAgICAgICBzZXRGaWVsZFZhbHVlOiBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlLFxuICAgICAgICBzZXRGaWVsZEVycm9yOiBmb3JtQ29yZS5zZXRGaWVsZEVycm9yLFxuICAgICAgICBzZXRGaWVsZFdhcm5pbmc6IGZvcm1Db3JlLnNldEZpZWxkV2FybmluZyxcbiAgICAgICAgdmFsaWRhdGVGaWVsZDogZm9ybUNvcmUudmFsaWRhdGVGaWVsZCxcbiAgICAgICAgdmFsaWRhdGVGaWVsZEFzeW5jLFxuICAgICAgICByZWdpc3RlckZpZWxkOiBmb3JtQ29yZS5yZWdpc3RlckZpZWxkLFxuICAgICAgICB1bnJlZ2lzdGVyRmllbGQ6IGZvcm1Db3JlLnVucmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgaGFuZGxlU3VibWl0LFxuICAgICAgICBoYW5kbGVSZXNldCxcbiAgICB9KSwgW1xuICAgICAgICBzdG9yZSxcbiAgICAgICAgZm9ybUNvcmUuZmllbGRSdWxlcyxcbiAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRWYWx1ZSxcbiAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRFcnJvcixcbiAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRXYXJuaW5nLFxuICAgICAgICBmb3JtQ29yZS52YWxpZGF0ZUZpZWxkLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkQXN5bmMsXG4gICAgICAgIGZvcm1Db3JlLnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIGZvcm1Db3JlLnVucmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgaGFuZGxlU3VibWl0LFxuICAgICAgICBoYW5kbGVSZXNldCxcbiAgICBdKTtcbiAgICByZXR1cm4geyBmb3JtSW5zdGFuY2UsIGludGVybmFscywgc3RvcmUgfTtcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VGb3JtOyJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjIn0=
808
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL3NyYy9jb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ob29rcy91c2VGb3JtLnRzIiwiY29tcG9uZW50cy9Qcm9Gb3JtL2NvcmUvaG9va3MvdXNlRm9ybS5qcyJdLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfdXNlRXZlbnRDYWxsYmFjayIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdXNlTWVtb2l6ZWRGbiIsIl91c2VGb3JtQ29yZSIsIl9wYXRoVXRpbHMiLCJfcnVuUnVsZXMiLCJfZm9ybVN0b3JlIiwiX3ZhbGlkYXRpb25FcnJvciIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZjMiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiYWRvcHQiLCJyZXNvbHZlIiwiUHJvbWlzZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInN0ZXAiLCJyZWplY3RlZCIsInJlc3VsdCIsInRoZW4iLCJhcHBseSIsIl9fcmVzdCIsInAiLCJwcm90b3R5cGUiLCJpbmRleE9mIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJhc1J1bGVBcnJheSIsInJ1bGUiLCJydWxlSGFzVmFsaWRhdG9yIiwidmFsaWRhdG9yIiwiZGVmYXVsdEZpZWxkIiwic29tZSIsImZpZWxkcyIsInZhbHVlcyIsInN1YiIsImhhc1Jlc29sdmVkVmFsaWRhdG9yIiwicmVzb2x2ZWQiLCJ1c2VGb3JtIiwiZXhwb3J0cyIsImNvbmZpZyIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsIm9uRmluaXNoIiwib25GaW5pc2hGYWlsZWQiLCJvblJlc2V0IiwiX2NvbmZpZyR2YWxpZGF0ZVRyaWdnIiwidmFsaWRhdGVUcmlnZ2VyIiwiZm9ybUNvcmUiLCJ1c2VGb3JtQ29yZSIsInN0b3JlIiwibGFzdEFzeW5jRXBvY2hSZWYiLCJ1c2VSZWYiLCJtYXJrVmFsaWRhdGluZyIsInVzZU1lbW9pemVkRm4iLCJuYW1lcyIsImFzc2lnbiIsImdldFN0YXRlIiwidmFsaWRhdGluZyIsImZvckVhY2giLCJzZXRTdGF0ZSIsImNvbW1pdFJ1bGVPdXRjb21lcyIsIm91dGNvbWVzIiwiY2xlYXJWYWxpZGF0aW5nIiwic3RhdGUiLCJlcnJvcnNDaGFuZ2VkIiwid2FybmluZ3NDaGFuZ2VkIiwibmV3RXJyb3JzIiwiZXJyb3JzIiwibmV3V2FybmluZ3MiLCJ3YXJuaW5ncyIsIl9pdGVyYXRvciIsIl9zdGVwIiwiX3N0ZXAkdmFsdWUiLCJlcnJvciIsIndhcm5pbmciLCJzYW1lVmFsaWRhdGlvbk5vZGUiLCJlcnIiLCJmbGFnc1RvQ2xlYXIiLCJmaWx0ZXIiLCJwYXRjaCIsIm5ld1ZhbGlkYXRpbmciLCJrZXlzIiwidmFsaWRhdGVGaWVsZEFzeW5jIiwicnVsZXMiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIl9hIiwiZXBvY2giLCJmbGFnZ2VkIiwib3V0Y29tZSIsIl95aWVsZCRydW5SdWxlc0FzeW5jIiwiaXNDdXJyZW50IiwiY2xlYXJGbGFncyIsIl90Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsImFicnVwdCIsImlzVmFsaWQiLCJiZWdpblZhbGlkYXRpb25SdW4iLCJnZXRGaWVsZHNWYWx1ZSIsInJlc29sdmVSdWxlcyIsImdldFJ1bGVDb250ZXh0SW5zdGFuY2UiLCJmbGFnZ2VkTmFtZSIsImN1cnJlbnQiLCJydW5SdWxlc0FzeW5jIiwic2VudCIsImNvZXJjZUZhaWx1cmVSZWFzb24iLCJpc1ZhbGlkYXRpb25SdW5DdXJyZW50IiwiZmluaXNoIiwic3RvcCIsImhhbmRsZUZpZWxkQmx1ciIsInVzZUV2ZW50Q2FsbGJhY2siLCJmaWVsZFRyaWdnZXIiLCJfY2FsbGVlMiIsInRvdWNoZWQiLCJhcHBsaWNhYmxlIiwiX2NvbnRleHQyIiwiX2RlZmluZVByb3BlcnR5MiIsImdldEZpZWxkUnVsZXMiLCJmaWx0ZXJSdWxlc0J5VHJpZ2dlciIsIm5vcm1hbGl6ZVRyaWdnZXJzIiwicmVzb2x2ZVZhbHVlIiwidmFsaWRhdGVGaWVsZHNBc3luYyIsIm5hbWVMaXN0IiwiX2NhbGxlZTQiLCJmaWVsZHNUb1ZhbGlkYXRlIiwiZmllbGRFcnJvcnMiLCJyZXNvbHZlZEJ5RmllbGQiLCJlcG9jaEJ5RmllbGQiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiX2NvbnRleHQ0IiwiZmllbGRSdWxlcyIsIk1hcCIsImFsbCIsIm1hcCIsIl9jYWxsZWUzIiwiX3lpZWxkJHJ1blJ1bGVzQXN5bmMyIiwiX3QyIiwiX2NvbnRleHQzIiwicHVzaCIsIkZvcm1WYWxpZGF0aW9uRXJyb3IiLCJyZWR1Y2UiLCJhY2MiLCJkZWZpbmVGaWVsZCIsImZpZWxkT3B0aW9ucyIsIl9maWVsZE9wdGlvbnMkcnVsZXMiLCJGaWVsZENvbXBvbmVudCIsIm1lbW8iLCJjaGlsZHJlbiIsInJlbmRlciIsInByb3BzIiwiX3VzZVN0b3JlU2VsZWN0b3IiLCJ1c2VTdG9yZVNlbGVjdG9yIiwic2hhbGxvd0VxdWFsQXJyYXlzIiwiX3VzZVN0b3JlU2VsZWN0b3IyIiwiX3NsaWNlZFRvQXJyYXkyIiwiZmllbGRWYWx1ZSIsImZpZWxkRXJyb3IiLCJmaWVsZFRvdWNoZWQiLCJmaWVsZFZhbGlkYXRpbmciLCJ1c2VFZmZlY3QiLCJyZXRhaW5GaWVsZCIsImV4aXN0aW5nUnVsZXMiLCJyZWdpc3RlckZpZWxkIiwicmVsZWFzZUZpZWxkIiwiaGFuZGxlRmllbGRDaGFuZ2UiLCJzZXRGaWVsZFZhbHVlIiwiaGFuZGxlQmx1ciIsImZpZWxkUHJvcHMiLCJvbkNoYW5nZSIsIm9uQmx1ciIsImhhbmRsZU1lcmdlQ2hhbmdlIiwiX3R5cGVvZjIiLCJ0YXJnZXQiLCJSZWFjdCIsImlzVmFsaWRFbGVtZW50IiwiaGFuZGxlTWVyZ2VCbHVyIiwiZG9tU2FmZVByb3BzIiwiY2xvbmVFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsIkZyYWdtZW50IiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImNoaWxkIiwiaW5kZXgiLCJrZXkiLCJkaXNwbGF5TmFtZSIsImhhbmRsZVN1Ym1pdCIsIl9jYWxsZWU1IiwidmFsaWRhdGVkVmFsdWVzIiwiX3QzIiwiX2NvbnRleHQ1IiwicHJldmVudERlZmF1bHQiLCJjb25zb2xlIiwiaGFuZGxlUmVzZXQiLCJyZXNldEZpZWxkcyIsImdldEZpZWxkRXJyb3IiLCJnZXRGaWVsZFdhcm5pbmciLCJnZXRGaWVsZHNFcnJvciIsImlzRmllbGRUb3VjaGVkIiwiaXNGaWVsZHNUb3VjaGVkIiwiYWxsRmllbGRzVG91Y2hlZCIsImV2ZXJ5IiwiaXNGaWVsZFZhbGlkYXRpbmciLCJzZXRGaWVsZHNFcnJvciIsImZpZWxkc0Vycm9yIiwiZW50cmllcyIsIl9yZWYiLCJfcmVmMiIsInNldEZpZWxkRXJyb3IiLCJzZXRGaWVsZFRvdWNoZWQiLCJpc1RvdWNoZWQiLCJzZXRGaWVsZHNUb3VjaGVkIiwiZmllbGRzVG91Y2giLCJyZXNldEZvcm1GaWVsZHMiLCJpbml0aWFsVmFsdWVzIiwiZ2V0SW5pdGlhbFZhbHVlcyIsIm5ld1ZhbHVlcyIsImZpZWxkIiwiaW5pdGlhbCIsImluY2x1ZGVzIiwic2V0TmVzdGVkVmFsdWUiLCJpbnZhbGlkYXRlVmFsaWRhdGlvblJ1bnMiLCJuZXdUb3VjaGVkIiwic3VibWl0V2l0aFZhbGlkYXRpb24iLCJjYWxsYmFjayIsIl9jYWxsZWU2IiwiX3Q0IiwiX3Q1IiwiX2NvbnRleHQ2IiwiZm9ybUluc3RhbmNlIiwidXNlTWVtbyIsImdldEZpZWxkVmFsdWUiLCJ2YWxpZGF0ZUZpZWxkcyIsInNldEZpZWxkc1ZhbHVlIiwic3VibWl0IiwidW5yZWdpc3RlckZpZWxkIiwic2V0UnVsZUNvbnRleHRJbnN0YW5jZSIsImludGVybmFscyIsInNldEZpZWxkV2FybmluZyIsIl9kZWZhdWx0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBR0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGNBQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFVBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFNBQUEsR0FBQU4sT0FBQTtBQU9BLElBQUFPLFVBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLGdCQUFBLEdBQUFSLE9BQUE7QUFBeUQsU0FBQVMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFYLHdCQUFBVyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLFFBQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFB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QUFZLEVBQVpBLFlBQVk7TUFDWk8sV0FBVyxFQUFYQTtJQzVKRixDRDZKQztFQUFBLENBQUMsRUFDRixDQUNFcEosS0FBSyxFQUNMRixRQUFRLENBQUN1RixVQUFVLEVBQ25CdkYsUUFBUSxDQUFDMEgsYUFBYSxFQUN0QjFILFFBQVEsQ0FBQ3FLLGFBQWEsRUFDdEJySyxRQUFRLENBQUNtTSxlQUFlLEVBQ3hCaEssa0JBQWtCLEVBQ2xCbkMsUUFBUSxDQUFDdUgsYUFBYSxFQUN0QnZILFFBQVEsQ0FBQ2dNLGVBQWUsRUFDeEJoTSxRQUFRLENBQUNxSCxXQUFXLEVBQ3BCckgsUUFBUSxDQUFDd0gsWUFBWSxFQUNyQnVCLFlBQVksRUFDWk8sV0FBVyxDQUNaLENBQ0Y7RUFFRCxPQUFPO0lBQUVvQyxZQUFZLEVBQVpBLFlBQVk7SUFBRVEsU0FBUyxFQUFUQSxTQUFTO0lBQUVoTSxLQUFLLEVBQUxBO0VBQUssQ0FBRTtBQUMzQyxDQUFDO0FBQUMsSUFBQWtNLFFBQUEsR0FBQTdNLE9BQUEsY0FFYUQsT0FBTyIsImZpbGUiOiJjb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ob29rcy91c2VGb3JtLmpzIiwic291cmNlc0NvbnRlbnQiOltudWxsLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IHVzZU1lbW8sIHVzZUVmZmVjdCwgdXNlUmVmLCBtZW1vLCBGcmFnbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlRXZlbnRDYWxsYmFjayBmcm9tICdAMW1vbmV5L2hvb2tzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IHVzZU1lbW9pemVkRm4gZnJvbSAnQDFtb25leS9ob29rcy91c2VNZW1vaXplZEZuJztcbmltcG9ydCB7IHVzZUZvcm1Db3JlIH0gZnJvbSAnLi91c2VGb3JtQ29yZSc7XG5pbXBvcnQgeyByZXNvbHZlVmFsdWUsIHNldE5lc3RlZFZhbHVlIH0gZnJvbSAnLi4vcGF0aFV0aWxzJztcbmltcG9ydCB7IGNvZXJjZUZhaWx1cmVSZWFzb24sIGZpbHRlclJ1bGVzQnlUcmlnZ2VyLCBub3JtYWxpemVUcmlnZ2VycywgcmVzb2x2ZVJ1bGVzLCBydW5SdWxlc0FzeW5jLCB9IGZyb20gJy4uL3J1blJ1bGVzJztcbmltcG9ydCB7IHVzZVN0b3JlU2VsZWN0b3IsIHNoYWxsb3dFcXVhbEFycmF5cywgc2FtZVZhbGlkYXRpb25Ob2RlIH0gZnJvbSAnLi4vZm9ybVN0b3JlJztcbmltcG9ydCB7IEZvcm1WYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuLi92YWxpZGF0aW9uRXJyb3InO1xuLyoqXG4gKiBPbmx5IHJ1bGVzIHdpdGggYSBjdXN0b20gYHZhbGlkYXRvcmAgY2FuIGJlIGdlbnVpbmVseSBhc3luY2hyb25vdXMg4oCUXG4gKiBidWlsdGluIHJ1bGVzIHJlc29sdmUgd2l0aGluIGEgbWljcm90YXNrLCBzbyBmbGlwcGluZyBgdmFsaWRhdGluZ2AgZm9yXG4gKiB0aGVtIHdvdWxkIG9ubHkgY2h1cm4gc3Vic2NyaWJlcnMgd2l0aG91dCBldmVyIGJlaW5nIHZpc2libGUuIERlY2lkZWQgb25cbiAqIFJFU09MVkVEIHJ1bGVzOiBhIGZ1bmN0aW9uLWZvcm0gcnVsZSB0aGF0IHJlc29sdmVzIHRvIGJ1aWx0aW4tb25seSBjaGVja3NcbiAqIG11c3Qgbm90IGZsaWNrZXIgdGhlIGZsYWcuXG4gKlxuICogVGhlIGFzeW5jIGVuZ2luZSBhd2FpdHMgdmFsaWRhdG9ycyBuZXN0ZWQgaW5zaWRlIGBmaWVsZHNgIC8gYGRlZmF1bHRGaWVsZGBcbiAqIHRvbywgc28gdGhlIGRlY2lzaW9uIG11c3QgZGVzY2VuZCB0aGUgc2FtZSB3YXkg4oCUIG90aGVyd2lzZSBhIGRlZXAtb25seVxuICogdmFsaWRhdG9yIChlLmcuIGB7IGRlZmF1bHRGaWVsZDogeyB2YWxpZGF0b3IgfSB9YCkgcnVucyBwZW5kaW5nIHdpdGggdGhlXG4gKiBmbGFnIHN0dWNrIGZhbHNlLCBhbmQgYGlzRmllbGRWYWxpZGF0aW5nKG5hbWUpYCB1bmRlci1yZXBvcnRzIGZvciB0aGUgd2hvbGVcbiAqIHdpbmRvdy4gT3Zlci1mbGFnZ2luZyB3aGVuIHRoZSBkZWVwIHZhbGlkYXRvciB3b24ndCBhY3R1YWxseSBmaXJlIChlbXB0eSAvXG4gKiBwcmltaXRpdmUgdmFsdWUpIGlzIGFjY2VwdGFibGU6IHRoZSBmbGFnIGlzIGRlY2lkZWQgb24gcnVsZSBTSEFQRSwgZXhhY3RseVxuICogYXMgdGhlIHRvcC1sZXZlbCBjYXNlIGFscmVhZHkgb3Zlci1mbGFncyBhIHZhbGlkYXRvciBzaG9ydC1jaXJjdWl0ZWQgYnkgYW5cbiAqIGVhcmxpZXIgYnVpbHRpbiBmYWlsdXJlOyB0aGUgcnVuIGNsZWFycyBpdCBvbiBzZXR0bGUgZWl0aGVyIHdheS5cbiAqL1xuY29uc3QgYXNSdWxlQXJyYXkgPSAocnVsZSkgPT4gcnVsZSA/IChBcnJheS5pc0FycmF5KHJ1bGUpID8gcnVsZSA6IFtydWxlXSkgOiBbXTtcbmNvbnN0IHJ1bGVIYXNWYWxpZGF0b3IgPSAocnVsZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgcnVsZS52YWxpZGF0b3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChhc1J1bGVBcnJheShydWxlLmRlZmF1bHRGaWVsZCkuc29tZShydWxlSGFzVmFsaWRhdG9yKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKHJ1bGUuZmllbGRzKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJ1bGUuZmllbGRzKS5zb21lKChzdWIpID0+IGFzUnVsZUFycmF5KHN1Yikuc29tZShydWxlSGFzVmFsaWRhdG9yKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5jb25zdCBoYXNSZXNvbHZlZFZhbGlkYXRvciA9IChyZXNvbHZlZCkgPT4gcmVzb2x2ZWQuc29tZShydWxlSGFzVmFsaWRhdG9yKTtcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gdXNlRm9ybVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY29uc3QgdXNlRm9ybSA9IChjb25maWcgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgb25GaW5pc2gsIG9uRmluaXNoRmFpbGVkLCBvblJlc2V0LCB2YWxpZGF0ZVRyaWdnZXIgPSAnb25DaGFuZ2UnLCB9ID0gY29uZmlnO1xuICAgIGNvbnN0IGZvcm1Db3JlID0gdXNlRm9ybUNvcmUoY29uZmlnKTtcbiAgICBjb25zdCB7IHN0b3JlIH0gPSBmb3JtQ29yZTtcbiAgICAvLyBFcG9jaCBvZiB0aGUgTEFURVNUIGFzeW5jIHJ1biB0aGF0IHJhaXNlZCBlYWNoIGZpZWxkJ3MgYHZhbGlkYXRpbmdgIGZsYWcuXG4gICAgLy8gQSBzZXR0bGluZyBydW4gY2xlYXJzIHRoZSBmbGFnIG9ubHkgd2hpbGUgaXQgaXMgc3RpbGwgdGhlIGxhdGVzdCByYWlzZXIg4oCUXG4gICAgLy8gYW4gb2xkZXIgcnVuIG11c3Qgbm90IGJsYW5rIHRoZSBzcGlubmVyIG9mIGEgbmV3ZXIgb25lLCBhbmQgYSBydW5cbiAgICAvLyBzdXBlcnNlZGVkIGJ5IGEgU1lOQyBjb21taXQgKHdoaWNoIG5ldmVyIHRvdWNoZXMgZmxhZ3MpIG11c3Qgc3RpbGwgY2xlYW5cbiAgICAvLyB1cCBhZnRlciBpdHNlbGYuXG4gICAgY29uc3QgbGFzdEFzeW5jRXBvY2hSZWYgPSB1c2VSZWYoe30pO1xuICAgIC8vIE1hcmsgZmllbGRzIGFzIHZhbGlkYXRpbmcgaW4gT05FIGNvbW1pdC4gdmFsaWRhdGluZyAvIHRvdWNoZWQgbGl2ZSBpbiB0aGVcbiAgICAvLyBzdG9yZSBhbG9uZ3NpZGUgdmFsdWVzIOKAlCBmbGlwcGluZyB0aGVtIChlLmcuIGFzeW5jIHZhbGlkYXRpb24gYXJvdW5kIGFcbiAgICAvLyBibHVyKSBtdXN0IG5vdCByZS1yZW5kZXIgdGhlIGZvcm0gcm9vdCwgb25seSB0aGUgZmllbGRzIHRoYXQgc3Vic2NyaWJlZC5cbiAgICBjb25zdCBtYXJrVmFsaWRhdGluZyA9IHVzZU1lbW9pemVkRm4oKG5hbWVzKSA9PiB7XG4gICAgICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IG5leHQgPSBPYmplY3QuYXNzaWduKHt9LCBzdG9yZS5nZXRTdGF0ZSgpLnZhbGlkYXRpbmcpO1xuICAgICAgICBuYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBuZXh0W25hbWVdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdmFsaWRhdGluZzogbmV4dCB9KTtcbiAgICB9KTtcbiAgICAvLyBGb2xkIHBlci1maWVsZCBydWxlIG91dGNvbWVzIGludG8gQVQgTU9TVCBvbmUgc3RvcmUgY29tbWl0OiBlcnJvcnMgYW5kXG4gICAgLy8gd2FybmluZ3MgYXJlIG1lcmdlZCBvdmVyIHRoZSBjdXJyZW50IG1hcHMgYW5kIHRoZSBgY2xlYXJWYWxpZGF0aW5nYCBmbGFnc1xuICAgIC8vIGFyZSByZW1vdmVkIGluIHRoZSBTQU1FIHBhdGNoLiBBIG5vLW9wIG91dGNvbWUgY29tbWl0cyBub3RoaW5nIGF0IGFsbCDigJRcbiAgICAvLyBwZXItZmllbGQgY29tbWl0cyBoZXJlIHByZXZpb3VzbHkgbWFkZSBzdWJtaXQtdGltZSB2YWxpZGF0aW9uIHN3ZWVwIGV2ZXJ5XG4gICAgLy8gc3Vic2NyaWJlciBPKGZpZWxkcykgdGltZXMuXG4gICAgY29uc3QgY29tbWl0UnVsZU91dGNvbWVzID0gdXNlTWVtb2l6ZWRGbigob3V0Y29tZXMsIGNsZWFyVmFsaWRhdGluZykgPT4ge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCBlcnJvcnNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCB3YXJuaW5nc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgbmV3RXJyb3JzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXJyb3JzKTtcbiAgICAgICAgY29uc3QgbmV3V2FybmluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS53YXJuaW5ncyk7XG4gICAgICAgIGZvciAoY29uc3QgeyBuYW1lLCBlcnJvciwgd2FybmluZyB9IG9mIG91dGNvbWVzKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSBpbiBuZXdFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5ld0Vycm9yc1tuYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIXNhbWVWYWxpZGF0aW9uTm9kZShuZXdFcnJvcnNbbmFtZV0sIGVycm9yKSkge1xuICAgICAgICAgICAgICAgIG5ld0Vycm9yc1tuYW1lXSA9IGVycm9yO1xuICAgICAgICAgICAgICAgIGVycm9yc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdhcm5pbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSBpbiBuZXdXYXJuaW5ncykge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbmV3V2FybmluZ3NbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIXNhbWVWYWxpZGF0aW9uTm9kZShuZXdXYXJuaW5nc1tuYW1lXSwgd2FybmluZykpIHtcbiAgICAgICAgICAgICAgICBuZXdXYXJuaW5nc1tuYW1lXSA9IHdhcm5pbmc7XG4gICAgICAgICAgICAgICAgd2FybmluZ3NDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmbGFnc1RvQ2xlYXIgPSBjbGVhclZhbGlkYXRpbmcuZmlsdGVyKChuYW1lKSA9PiBuYW1lIGluIHN0YXRlLnZhbGlkYXRpbmcpO1xuICAgICAgICBjb25zdCBwYXRjaCA9IHt9O1xuICAgICAgICBpZiAoZXJyb3JzQ2hhbmdlZClcbiAgICAgICAgICAgIHBhdGNoLmVycm9ycyA9IG5ld0Vycm9ycztcbiAgICAgICAgaWYgKHdhcm5pbmdzQ2hhbmdlZClcbiAgICAgICAgICAgIHBhdGNoLndhcm5pbmdzID0gbmV3V2FybmluZ3M7XG4gICAgICAgIGlmIChmbGFnc1RvQ2xlYXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsaWRhdGluZyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnZhbGlkYXRpbmcpO1xuICAgICAgICAgICAgZmxhZ3NUb0NsZWFyLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV3VmFsaWRhdGluZ1tuYW1lXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGF0Y2gudmFsaWRhdGluZyA9IG5ld1ZhbGlkYXRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUocGF0Y2gpO1xuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEFzeW5jIGZpZWxkIHZhbGlkYXRpb24g4oCTIGVhY2ggcnVsZSBpcyBwcm9jZXNzZWQgZXhhY3RseSBvbmNlXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3QgdmFsaWRhdGVGaWVsZEFzeW5jID0gdXNlTWVtb2l6ZWRGbigobmFtZSwgdmFsdWUsIHJ1bGVzKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXJ1bGVzIHx8IHJ1bGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUsIGVycm9yOiBudWxsIH07XG4gICAgICAgIC8vIENhcHR1cmUgdGhpcyBydW4ncyBlcG9jaDogaWYgYSBORVdFUiBydW4gKHN5bmMgb3IgYXN5bmMpIHN0YXJ0cyBmb3JcbiAgICAgICAgLy8gdGhlIGZpZWxkIGJlZm9yZSB0aGlzIG9uZSBzZXR0bGVzLCB0aGUgb3V0Y29tZSBiZWxvdyBpcyBzdGFsZSBhbmQgaXNcbiAgICAgICAgLy8gZGlzY2FyZGVkIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgdGhlIG5ld2VyIHJlc3VsdC5cbiAgICAgICAgY29uc3QgZXBvY2ggPSBmb3JtQ29yZS5iZWdpblZhbGlkYXRpb25SdW4obmFtZSk7XG4gICAgICAgIC8vIFJlc29sdmUgb25jZTogdGhlIGZsYWcgZGVjaXNpb24gbmVlZHMgcmVzb2x2ZWQgcnVsZXMsIGFuZCBwYXNzaW5nIHRoZVxuICAgICAgICAvLyByZXNvbHZlZCBhcnJheSBvbndhcmQgc3BhcmVzIHRoZSBlbmdpbmUgYSByZS1yZXNvbHV0aW9uLlxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpO1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVSdWxlcyhydWxlcywgdmFsdWVzLCBmb3JtQ29yZS5nZXRSdWxlQ29udGV4dEluc3RhbmNlKCkpO1xuICAgICAgICBjb25zdCBmbGFnZ2VkID0gaGFzUmVzb2x2ZWRWYWxpZGF0b3IocmVzb2x2ZWQpID8gW25hbWVdIDogW107XG4gICAgICAgIG1hcmtWYWxpZGF0aW5nKGZsYWdnZWQpO1xuICAgICAgICBmbGFnZ2VkLmZvckVhY2goKGZsYWdnZWROYW1lKSA9PiB7XG4gICAgICAgICAgICBsYXN0QXN5bmNFcG9jaFJlZi5jdXJyZW50W2ZsYWdnZWROYW1lXSA9IGVwb2NoO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IG91dGNvbWUgPSB7IG5hbWUsIGVycm9yOiBudWxsLCB3YXJuaW5nOiBudWxsIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGVycm9yLCB3YXJuaW5nIH0gPSB5aWVsZCBydW5SdWxlc0FzeW5jKG5hbWUsIHZhbHVlLCB2YWx1ZXMsIHJlc29sdmVkLCBmb3JtQ29yZS5nZXRSdWxlQ29udGV4dEluc3RhbmNlKCkpO1xuICAgICAgICAgICAgb3V0Y29tZSA9IHsgbmFtZSwgZXJyb3IsIHdhcm5pbmcgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBUaGUgZW5naW5lIGNvbnRhaW5zIHJ1bGUtbGV2ZWwgdGhyb3dzIGl0c2VsZjsgdGhpcyBpcyBhIGxhc3QtcmVzb3J0XG4gICAgICAgICAgICAvLyBuZXQgc28gYW4gdW5leHBlY3RlZCBmYWlsdXJlIHN1cmZhY2VzIGFzIGEgZmllbGQgZXJyb3IgaW5zdGVhZCBvZlxuICAgICAgICAgICAgLy8gbGVhdmluZyB0aGUgZmllbGQgbWFya2VkIHZhbGlkLlxuICAgICAgICAgICAgb3V0Y29tZSA9IHsgbmFtZSwgZXJyb3I6IChfYSA9IGNvZXJjZUZhaWx1cmVSZWFzb24oZXJyKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJ1ZhbGlkYXRpb24gZmFpbGVkJywgd2FybmluZzogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50ID0gZm9ybUNvcmUuaXNWYWxpZGF0aW9uUnVuQ3VycmVudChuYW1lLCBlcG9jaCk7XG4gICAgICAgICAgICBjb25zdCBjbGVhckZsYWdzID0gZmxhZ2dlZC5maWx0ZXIoKGZsYWdnZWROYW1lKSA9PiBsYXN0QXN5bmNFcG9jaFJlZi5jdXJyZW50W2ZsYWdnZWROYW1lXSA9PT0gZXBvY2gpO1xuICAgICAgICAgICAgY29tbWl0UnVsZU91dGNvbWVzKGlzQ3VycmVudCA/IFtvdXRjb21lXSA6IFtdLCBjbGVhckZsYWdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgQ0FMTEVSIGdldHMgdGhpcyBydW4ncyBvd24gcmVzdWx0IGVpdGhlciB3YXkgKGl0cyBwcm9taXNlIGlzXG4gICAgICAgIC8vIGFib3V0IHRoZSB2YWx1ZSBpdCB3YXMgYXNrZWQgdG8gdmFsaWRhdGUpOyBvbmx5IHRoZSBTVE9SRSBjb21taXQgaXNcbiAgICAgICAgLy8gc3RhbGVuZXNzLWd1YXJkZWQuXG4gICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IG91dGNvbWUuZXJyb3IgPT09IG51bGwsIGVycm9yOiBvdXRjb21lLmVycm9yIH07XG4gICAgfSkpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEFzeW5jIGZpZWxkIGJsdXIgaGFuZGxlclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGhhbmRsZUZpZWxkQmx1ciA9IHVzZUV2ZW50Q2FsbGJhY2soKG5hbWUsIGZpZWxkVHJpZ2dlcikgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHRvdWNoZWQgPSBzdG9yZS5nZXRTdGF0ZSgpLnRvdWNoZWQ7XG4gICAgICAgIGlmICghdG91Y2hlZFtuYW1lXSkge1xuICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB0b3VjaGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRvdWNoZWQpLCB7IFtuYW1lXTogdHJ1ZSB9KSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlcyA9IGZvcm1Db3JlLmdldEZpZWxkUnVsZXMobmFtZSk7XG4gICAgICAgIGlmICghcnVsZXMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlKCk7XG4gICAgICAgIGNvbnN0IGFwcGxpY2FibGUgPSBmaWx0ZXJSdWxlc0J5VHJpZ2dlcihyZXNvbHZlUnVsZXMocnVsZXMsIHZhbHVlcywgZm9ybUNvcmUuZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSgpKSwgJ29uQmx1cicsIG5vcm1hbGl6ZVRyaWdnZXJzKGZpZWxkVHJpZ2dlciwgdmFsaWRhdGVUcmlnZ2VyKSwgbmFtZSk7XG4gICAgICAgIGlmIChhcHBsaWNhYmxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHlpZWxkIHZhbGlkYXRlRmllbGRBc3luYyhuYW1lLCByZXNvbHZlVmFsdWUodmFsdWVzLCBuYW1lKSwgYXBwbGljYWJsZSk7XG4gICAgICAgIH1cbiAgICB9KSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gVmFsaWRhdGUgYWxsIGZpZWxkcyBhc3luY1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IHZhbGlkYXRlRmllbGRzQXN5bmMgPSB1c2VNZW1vaXplZEZuKChuYW1lTGlzdCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkc1RvVmFsaWRhdGUgPSBuYW1lTGlzdCB8fCBPYmplY3Qua2V5cyhmb3JtQ29yZS5maWVsZFJ1bGVzKTtcbiAgICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7fTtcbiAgICAgICAgLy8gUmVzb2x2ZSBldmVyeSBmaWVsZCBvbmNlIHVwIGZyb250OiB0aGUgZmxhZyBkZWNpc2lvbiBuZWVkcyByZXNvbHZlZFxuICAgICAgICAvLyBydWxlcywgYW5kIHRoZSByZXNvbHZlZCBhcnJheXMgYXJlIHJldXNlZCBmb3IgdGhlIGFjdHVhbCBydW5zLiBFYWNoXG4gICAgICAgIC8vIGZpZWxkIGFsc28gY2FwdHVyZXMgaXRzIHZhbGlkYXRpb24gZXBvY2gg4oCUIGEgZmllbGQgd2hvc2UgdmFsdWVcbiAgICAgICAgLy8gY2hhbmdlcyBtaWQtc3VibWl0IGdldHMgYSBuZXdlciBydW4sIGFuZCB0aGlzIHJ1bidzIHN0YWxlIG91dGNvbWVcbiAgICAgICAgLy8gbXVzdCBub3Qgb3ZlcndyaXRlIGl0IGluIHRoZSBzdG9yZS5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRCeUZpZWxkID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBlcG9jaEJ5RmllbGQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBmaWVsZHNUb1ZhbGlkYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBydWxlcyA9IGZvcm1Db3JlLmZpZWxkUnVsZXNbbmFtZV07XG4gICAgICAgICAgICBpZiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICBlcG9jaEJ5RmllbGQuc2V0KG5hbWUsIGZvcm1Db3JlLmJlZ2luVmFsaWRhdGlvblJ1bihuYW1lKSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRCeUZpZWxkLnNldChuYW1lLCByZXNvbHZlUnVsZXMocnVsZXMsIGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlKCksIGZvcm1Db3JlLmdldFJ1bGVDb250ZXh0SW5zdGFuY2UoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE9uZSBjb21taXQgdG8gcmFpc2UgdGhlIHZhbGlkYXRpbmcgZmxhZ3MgKHZhbGlkYXRvci1iZWFyaW5nIGZpZWxkc1xuICAgICAgICAvLyBvbmx5KSwgb25lIGNvbW1pdCB0byBsYW5kIGV2ZXJ5IGVycm9yL3dhcm5pbmcgYW5kIGNsZWFyIHRoZSBmbGFncy5cbiAgICAgICAgY29uc3QgZmxhZ2dlZCA9IGZpZWxkc1RvVmFsaWRhdGUuZmlsdGVyKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVkQnlGaWVsZC5nZXQobmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQgPyBoYXNSZXNvbHZlZFZhbGlkYXRvcihyZXNvbHZlZCkgOiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1hcmtWYWxpZGF0aW5nKGZsYWdnZWQpO1xuICAgICAgICBmbGFnZ2VkLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGxhc3RBc3luY0Vwb2NoUmVmLmN1cnJlbnRbbmFtZV0gPSBlcG9jaEJ5RmllbGQuZ2V0KG5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb3V0Y29tZXMgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHlpZWxkIFByb21pc2UuYWxsKGZpZWxkc1RvVmFsaWRhdGUubWFwKChuYW1lKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlZEJ5RmllbGQuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCB3YXJuaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAoeyBlcnJvciwgd2FybmluZyB9ID0geWllbGQgcnVuUnVsZXNBc3luYyhuYW1lLCByZXNvbHZlVmFsdWUoZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKSwgbmFtZSksIGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlKCksIHJlc29sdmVkLCBmb3JtQ29yZS5nZXRSdWxlQ29udGV4dEluc3RhbmNlKCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAvLyBMYXN0LXJlc29ydCBuZXQgKHNlZSB2YWxpZGF0ZUZpZWxkQXN5bmMpIOKAlCBrZWVwIHRoZSBub3JtYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RydWN0ZWQtZXJyb3IgZmxvdyBzbyBvbkZpbmlzaEZhaWxlZCBnZXRzIGEgcmVhbCBwYXlsb2FkLlxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IChfYSA9IGNvZXJjZUZhaWx1cmVSZWFzb24oZXJyKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJ1ZhbGlkYXRpb24gZmFpbGVkJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVGhlIHN0b3JlIGNvbW1pdCBpcyBzdGFsZW5lc3MtZ3VhcmRlZDsgdGhlIFNVQk1JVCBkZWNpc2lvblxuICAgICAgICAgICAgICAgIC8vIChmaWVsZEVycm9ycyAvIHRoZSB0aHJvd24gRm9ybVZhbGlkYXRpb25FcnJvcikgc3RpbGwgcmVmbGVjdHNcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHJ1bidzIG93biByZXN1bHRzIGZvciB0aGUgdmFsdWVzIGl0IHZhbGlkYXRlZC5cbiAgICAgICAgICAgICAgICBjb25zdCBlcG9jaCA9IGVwb2NoQnlGaWVsZC5nZXQobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGVwb2NoICE9PSB1bmRlZmluZWQgJiYgZm9ybUNvcmUuaXNWYWxpZGF0aW9uUnVuQ3VycmVudChuYW1lLCBlcG9jaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0Y29tZXMucHVzaCh7IG5hbWUsIGVycm9yLCB3YXJuaW5nIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRFcnJvcnNbbmFtZV0gPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgY29uc3QgY2xlYXJGbGFncyA9IGZsYWdnZWQuZmlsdGVyKChuYW1lKSA9PiBsYXN0QXN5bmNFcG9jaFJlZi5jdXJyZW50W25hbWVdID09PSBlcG9jaEJ5RmllbGQuZ2V0KG5hbWUpKTtcbiAgICAgICAgICAgIGNvbW1pdFJ1bGVPdXRjb21lcyhvdXRjb21lcywgY2xlYXJGbGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGZpZWxkRXJyb3JzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybVZhbGlkYXRpb25FcnJvcihmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCBmaWVsZEVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWVMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmFtZUxpc3QucmVkdWNlKChhY2MsIG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBhY2NbbmFtZV0gPSByZXNvbHZlVmFsdWUoZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKSwgbmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKTtcbiAgICB9KSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gZGVmaW5lRmllbGQg4oCTIHVzZWQgYnkgc3RhbmRhbG9uZSAobm9uLVByb0Zvcm0pIGNvbnN1bWVyc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGRlZmluZUZpZWxkID0gdXNlTWVtb2l6ZWRGbigobmFtZSwgZmllbGRPcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgeyBydWxlcyA9IFtdIH0gPSBmaWVsZE9wdGlvbnM7XG4gICAgICAgIGNvbnN0IEZpZWxkQ29tcG9uZW50ID0gbWVtbygoX2EpID0+IHtcbiAgICAgICAgICAgIHZhciB7IGNoaWxkcmVuLCByZW5kZXIgfSA9IF9hLCBwcm9wcyA9IF9fcmVzdChfYSwgW1wiY2hpbGRyZW5cIiwgXCJyZW5kZXJcIl0pO1xuICAgICAgICAgICAgLy8gUGVyLWZpZWxkIHN0b3JlIHN1YnNjcmlwdGlvbjogdGhpcyBmaWVsZCByZS1yZW5kZXJzIG9ubHkgd2hlbiBpdHNcbiAgICAgICAgICAgIC8vIG93biB2YWx1ZS9lcnJvci90b3VjaGVkL3ZhbGlkYXRpbmcgc2xpY2UgY2hhbmdlcy4gRG90LXBhdGhzXG4gICAgICAgICAgICAvLyByZXNvbHZlIGludG8gdGhlIG5lc3RlZCB2YWx1ZXMgbGlrZSBldmVyeXdoZXJlIGVsc2UuXG4gICAgICAgICAgICBjb25zdCBbZmllbGRWYWx1ZSwgZmllbGRFcnJvciwgZmllbGRUb3VjaGVkLCBmaWVsZFZhbGlkYXRpbmddID0gdXNlU3RvcmVTZWxlY3RvcihzdG9yZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIChfYSA9IHJlc29sdmVWYWx1ZShzdGF0ZS52YWx1ZXMsIG5hbWUpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3JzW25hbWVdLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50b3VjaGVkW25hbWVdLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS52YWxpZGF0aW5nW25hbWVdLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9LCBzaGFsbG93RXF1YWxBcnJheXMpO1xuICAgICAgICAgICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBNb3VudC1jb3VudGVkOiByZWxlYXNlRmllbGQgcmVtb3ZlcyB0aGUgcnVsZXMgb25seSB3aGVuIHRoZVxuICAgICAgICAgICAgICAgIC8vIExBU1Qgc2FtZS1uYW1lIGluc3RhbmNlIHVubW91bnRzIOKAlCBhbiBpbnN0YW5jZSB0aGF0IHBpZ2d5YmFja2VkXG4gICAgICAgICAgICAgICAgLy8gb24gYW4gZXhpc3RpbmcgcmVnaXN0cmF0aW9uIChlLmcuIGEgUHJvRm9ybS5JdGVtJ3MpIGNhbiBuZXZlclxuICAgICAgICAgICAgICAgIC8vIHdpcGUgaXQgb24gaXRzIG93biB1bm1vdW50LlxuICAgICAgICAgICAgICAgIGZvcm1Db3JlLnJldGFpbkZpZWxkKG5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUnVsZXMgPSBmb3JtQ29yZS5nZXRGaWVsZFJ1bGVzKG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmdSdWxlcyAmJiBydWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db3JlLnJlZ2lzdGVyRmllbGQobmFtZSwgcnVsZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3JtQ29yZS5yZWxlYXNlRmllbGQobmFtZSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sIFtdKTsgLy8gT25seSByZWdpc3RlciBvbiBtb3VudFxuICAgICAgICAgICAgY29uc3QgaGFuZGxlRmllbGRDaGFuZ2UgPSB1c2VFdmVudENhbGxiYWNrKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGZvcm1Db3JlLnNldEZpZWxkVmFsdWUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRvdWNoZWQgaXMgc2V0IGJ5IHRoZSB1c2VyIGNoYW5nZSB0cmlnZ2VyIChtYXRjaGluZyB0aGVcbiAgICAgICAgICAgICAgICAvLyBQcm9Gb3JtLkl0ZW0gcGF0aCkg4oCUIHByb2dyYW1tYXRpYyBzZXRGaWVsZHNWYWx1ZSBkb2VzIG5vdC5cbiAgICAgICAgICAgICAgICBjb25zdCB0b3VjaGVkID0gc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkO1xuICAgICAgICAgICAgICAgIGlmICghdG91Y2hlZFtuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHRvdWNoZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdG91Y2hlZCksIHsgW25hbWVdOiB0cnVlIH0pIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBhcHBsaWNhYmxlID0gZmlsdGVyUnVsZXNCeVRyaWdnZXIocmVzb2x2ZVJ1bGVzKHJ1bGVzLCBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCBmb3JtQ29yZS5nZXRSdWxlQ29udGV4dEluc3RhbmNlKCkpLCAnb25DaGFuZ2UnLCBub3JtYWxpemVUcmlnZ2VycyhmaWVsZE9wdGlvbnMudmFsaWRhdGVUcmlnZ2VyLCB2YWxpZGF0ZVRyaWdnZXIpLCBuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoYXBwbGljYWJsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFzeW5jIHBhdGggKG1hdGNoaW5nIFByb0Zvcm0uSXRlbSkgc28gYSBQcm9taXNlLXJldHVybmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyB2YWxpZGF0b3IgaXMgaG9ub3JlZCBvbiBjaGFuZ2UgaW5zdGVhZCBvZiBiZWluZyBzaWxlbnRseVxuICAgICAgICAgICAgICAgICAgICAvLyBza2lwcGVkOyBmaXJlLWFuZC1mb3JnZXQg4oCUIHRoZSByZXN1bHQgbGFuZHMgb24gdGhlIHN0b3JlLlxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZpZWxkQXN5bmMobmFtZSwgdmFsdWUsIGFwcGxpY2FibGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlQmx1ciA9IHVzZUV2ZW50Q2FsbGJhY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZUZpZWxkQmx1cihuYW1lLCBmaWVsZE9wdGlvbnMudmFsaWRhdGVUcmlnZ2VyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZmllbGRQcm9wcyA9IE9iamVjdC5hc3NpZ24oeyBuYW1lLCB2YWx1ZTogZmllbGRWYWx1ZSwgZXJyb3I6IGZpZWxkRXJyb3IsIHRvdWNoZWQ6IGZpZWxkVG91Y2hlZCwgdmFsaWRhdGluZzogZmllbGRWYWxpZGF0aW5nLCBvbkNoYW5nZTogaGFuZGxlRmllbGRDaGFuZ2UsIG9uQmx1cjogaGFuZGxlQmx1ciB9LCBwcm9wcyk7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVNZXJnZUNoYW5nZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZSAmJiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgJ3RhcmdldCcgaW4gZVxuICAgICAgICAgICAgICAgICAgICA/IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogZTtcbiAgICAgICAgICAgICAgICBoYW5kbGVGaWVsZENoYW5nZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSAmJlxuICAgICAgICAgICAgICAgICAgICAoKF9hID0gY2hpbGRyZW4ucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkNoYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHJvcHMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVNZXJnZUJsdXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGhhbmRsZUJsdXIoKTtcbiAgICAgICAgICAgICAgICBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pICYmXG4gICAgICAgICAgICAgICAgICAgICgoX2EgPSBjaGlsZHJlbi5wcm9wcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uQmx1cikpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHJvcHMub25CbHVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChyZW5kZXIgJiYgdHlwZW9mIHJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXIoZmllbGRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKGZpZWxkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRWxlbWVudCBjaGlsZHJlbiByZWNlaXZlIG9ubHkgRE9NLXNhZmUgcHJvcHMg4oCUIGVycm9yL3RvdWNoZWQvXG4gICAgICAgICAgICAvLyB2YWxpZGF0aW5nIGFyZSBmaWVsZCBNRVRBLCBub3QgY29udHJvbCBwcm9wczsgc3ByZWFkaW5nIHRoZW0gb250b1xuICAgICAgICAgICAgLy8gYSBob3N0IGVsZW1lbnQgd291bGQgbGVhayBhbnkgYXR0cmlidXRlcy4gUmVuZGVyLXByb3AgYW5kXG4gICAgICAgICAgICAvLyBmdW5jdGlvbiBjaGlsZHJlbiBrZWVwIHRoZSBmdWxsIGZpZWxkUHJvcHMuXG4gICAgICAgICAgICBjb25zdCBkb21TYWZlUHJvcHMgPSBPYmplY3QuYXNzaWduKHsgbmFtZSwgdmFsdWU6IGZpZWxkVmFsdWUsIG9uQ2hhbmdlOiBoYW5kbGVNZXJnZUNoYW5nZSwgb25CbHVyOiBoYW5kbGVNZXJnZUJsdXIgfSwgcHJvcHMpO1xuICAgICAgICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIGRvbVNhZmVQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgLi4uY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkb21TYWZlUHJvcHMpLCB7IGtleTogY2hpbGQua2V5IHx8IGluZGV4IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICBGaWVsZENvbXBvbmVudC5kaXNwbGF5TmFtZSA9IGBGaWVsZCgke25hbWV9KWA7XG4gICAgICAgIHJldHVybiBGaWVsZENvbXBvbmVudDtcbiAgICB9KTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBoYW5kbGVTdWJtaXQgLyBoYW5kbGVSZXNldCDigJMgZm9yIDxmb3JtPiBldmVudCBoYW5kbGVyc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IHVzZUV2ZW50Q2FsbGJhY2soKGUpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZFZhbHVlcyA9IHlpZWxkIHZhbGlkYXRlRmllbGRzQXN5bmMoKTtcbiAgICAgICAgICAgIG9uRmluaXNoID09PSBudWxsIHx8IG9uRmluaXNoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZpbmlzaCh2YWxpZGF0ZWRWYWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgYSBWQUxJREFUSU9OIGZhaWx1cmUgcmVhY2hlcyBvbkZpbmlzaEZhaWxlZCDigJQgYW4gZXhjZXB0aW9uIG91dFxuICAgICAgICAgICAgLy8gb2YgdGhlIGNvbnN1bWVyJ3Mgb3duIG9uRmluaXNoIGlzIG5vdCBhIHZhbGlkYXRpb24gcmVzdWx0IGFuZCBpc1xuICAgICAgICAgICAgLy8gc3VyZmFjZWQgaW5zdGVhZCBvZiBiZWluZyBtaXNyZXBvcnRlZC5cbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBGb3JtVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgb25GaW5pc2hGYWlsZWQgPT09IG51bGwgfHwgb25GaW5pc2hGYWlsZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRmluaXNoRmFpbGVkKHsgdmFsdWVzOiBlcnIudmFsdWVzLCBlcnJvcnM6IGVyci5lcnJvcnMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbUHJvRm9ybV0gb25GaW5pc2ggdGhyZXcgZHVyaW5nIHN1Ym1pdDonLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSkpO1xuICAgIGNvbnN0IGhhbmRsZVJlc2V0ID0gdXNlRXZlbnRDYWxsYmFjaygoZSkgPT4ge1xuICAgICAgICBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZm9ybUNvcmUucmVzZXRGaWVsZHMoKTtcbiAgICAgICAgb25SZXNldCA9PT0gbnVsbCB8fCBvblJlc2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblJlc2V0KCk7XG4gICAgfSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gRm9ybUluc3RhbmNlIOKAkyBlbmhhbmNlZCBBUEkgZm9yIGNvbnN1bWVycy5cbiAgICAvL1xuICAgIC8vIEV2ZXJ5IG1ldGhvZCBpcyB3cmFwcGVkIGluIHVzZU1lbW9pemVkRm4gKHN0YWJsZSBpZGVudGl0eSwgYWx3YXlzIHJlYWRzIHRoZVxuICAgIC8vIGxhdGVzdCBzdG9yZSBzdGF0ZSkgc28gdGhlIGluc3RhbmNlIG9iamVjdCBpdHNlbGYgaXMgSURFTlRJVFktU1RBQkxFIGZvclxuICAgIC8vIHRoZSBsaWZldGltZSBvZiB0aGUgZm9ybSDigJQgdGhpcyBpcyB3aGF0IGxldHMgUHJvRm9ybSBwdWJsaXNoIGl0IHRocm91Z2ggdGhlXG4gICAgLy8gc3RhYmxlIGNvbnRleHQgd2l0aG91dCByZS1yZW5kZXJpbmcgc3Vic2NyaWJlcnMgb24gZWFjaCBrZXlzdHJva2UuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3QgZ2V0RmllbGRFcnJvciA9IHVzZU1lbW9pemVkRm4oKG5hbWUpID0+IHN0b3JlLmdldFN0YXRlKCkuZXJyb3JzW25hbWVdKTtcbiAgICBjb25zdCBnZXRGaWVsZFdhcm5pbmcgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLndhcm5pbmdzW25hbWVdKTtcbiAgICBjb25zdCBnZXRGaWVsZHNFcnJvciA9IHVzZU1lbW9pemVkRm4oKG5hbWVMaXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IHN0b3JlLmdldFN0YXRlKCkuZXJyb3JzO1xuICAgICAgICBpZiAoIW5hbWVMaXN0KVxuICAgICAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIG5hbWVMaXN0LmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcnNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBlcnJvcnNbbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICAgIGNvbnN0IGlzRmllbGRUb3VjaGVkID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4gc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkW25hbWVdIHx8IGZhbHNlKTtcbiAgICBjb25zdCBpc0ZpZWxkc1RvdWNoZWQgPSB1c2VNZW1vaXplZEZuKChuYW1lTGlzdCwgYWxsRmllbGRzVG91Y2hlZCA9IGZhbHNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvdWNoZWQgPSBzdG9yZS5nZXRTdGF0ZSgpLnRvdWNoZWQ7XG4gICAgICAgIGlmICghbmFtZUxpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0b3VjaGVkKS5zb21lKChrZXkpID0+IHRvdWNoZWRba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbEZpZWxkc1RvdWNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBuYW1lTGlzdC5ldmVyeSgobmFtZSkgPT4gdG91Y2hlZFtuYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hbWVMaXN0LnNvbWUoKG5hbWUpID0+IHRvdWNoZWRbbmFtZV0pO1xuICAgIH0pO1xuICAgIGNvbnN0IGlzRmllbGRWYWxpZGF0aW5nID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4gc3RvcmUuZ2V0U3RhdGUoKS52YWxpZGF0aW5nW25hbWVdIHx8IGZhbHNlKTtcbiAgICBjb25zdCBzZXRGaWVsZHNFcnJvciA9IHVzZU1lbW9pemVkRm4oKGZpZWxkc0Vycm9yKSA9PiB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkc0Vycm9yKS5mb3JFYWNoKChbbmFtZSwgZXJyb3JdKSA9PiB7XG4gICAgICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZEVycm9yKG5hbWUsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2V0RmllbGRUb3VjaGVkID0gdXNlTWVtb2l6ZWRGbigobmFtZSwgaXNUb3VjaGVkID0gdHJ1ZSkgPT4ge1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHRvdWNoZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkKSwgeyBbbmFtZV06IGlzVG91Y2hlZCB9KSB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBzZXRGaWVsZHNUb3VjaGVkID0gdXNlTWVtb2l6ZWRGbigoZmllbGRzVG91Y2gpID0+IHtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB0b3VjaGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZCksIGZpZWxkc1RvdWNoKSB9KTtcbiAgICB9KTtcbiAgICBjb25zdCByZXNldEZvcm1GaWVsZHMgPSB1c2VNZW1vaXplZEZuKChmaWVsZHMpID0+IHtcbiAgICAgICAgaWYgKCFmaWVsZHMpIHtcbiAgICAgICAgICAgIGZvcm1Db3JlLnJlc2V0RmllbGRzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTW91bnQtZnJvemVuIGluaXRpYWxWYWx1ZXMg4oCUIGNvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCByZXNldEZpZWxkcy5cbiAgICAgICAgLy8gUmVhZHMgQU5EIHdyaXRlcyBhcmUgbmVzdGVkLXBhdGggYXdhcmUsIHNvIGRvdC1wYXRoIG5hbWVzXG4gICAgICAgIC8vIChgYWRkcmVzcy5jaXR5YCwgYGl0ZW1zLjAudGl0bGVgKSByZXNldCBjb3JyZWN0bHkgaW5zdGVhZCBvZiBwcm9iaW5nIGFcbiAgICAgICAgLy8gbGl0ZXJhbCBrZXkgYW5kIHNoYWxsb3ctbWVyZ2luZyBvbmUgYmFjay5cbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlcyA9IGZvcm1Db3JlLmdldEluaXRpYWxWYWx1ZXMoKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgbmV3VmFsdWVzID0gc3RhdGUudmFsdWVzO1xuICAgICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWwgPSByZXNvbHZlVmFsdWUoaW5pdGlhbFZhbHVlcywgZmllbGQpO1xuICAgICAgICAgICAgbmV3VmFsdWVzID0gZmllbGQuaW5jbHVkZXMoJy4nKVxuICAgICAgICAgICAgICAgID8gc2V0TmVzdGVkVmFsdWUobmV3VmFsdWVzLCBmaWVsZCwgaW5pdGlhbClcbiAgICAgICAgICAgICAgICA6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbmV3VmFsdWVzKSwgeyBbZmllbGRdOiBpbml0aWFsIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gTGlrZSB0aGUgZnVsbCByZXNldDogY2xlYXIgQUxMIHBlci1maWVsZCBtZXRhIChlcnJvcnMgQU5EIHdhcm5pbmdzIEFORFxuICAgICAgICAvLyB0b3VjaGVkL3ZhbGlkYXRpbmcpLCBpbnZhbGlkYXRlIGluLWZsaWdodCB2YWxpZGF0aW9uIHJ1bnMsIGFuZCBsYW5kXG4gICAgICAgIC8vIGV2ZXJ5dGhpbmcgaW4gT05FIGNvbW1pdC4gTm8gb25WYWx1ZXNDaGFuZ2Ug4oCUIHJlc2V0IGlzIG5vdCBhIGNoYW5nZVxuICAgICAgICAvLyBldmVudCBvbiBlaXRoZXIgcGF0aC5cbiAgICAgICAgZm9ybUNvcmUuaW52YWxpZGF0ZVZhbGlkYXRpb25SdW5zKGZpZWxkcyk7XG4gICAgICAgIGNvbnN0IG5ld0Vycm9ycyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmVycm9ycyk7XG4gICAgICAgIGNvbnN0IG5ld1dhcm5pbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUud2FybmluZ3MpO1xuICAgICAgICBjb25zdCBuZXdUb3VjaGVkID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUudG91Y2hlZCk7XG4gICAgICAgIGNvbnN0IG5ld1ZhbGlkYXRpbmcgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS52YWxpZGF0aW5nKTtcbiAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgbmV3RXJyb3JzW2ZpZWxkXTtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXdXYXJuaW5nc1tmaWVsZF07XG4gICAgICAgICAgICBkZWxldGUgbmV3VG91Y2hlZFtmaWVsZF07XG4gICAgICAgICAgICBkZWxldGUgbmV3VmFsaWRhdGluZ1tmaWVsZF07XG4gICAgICAgIH0pO1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB2YWx1ZXM6IG5ld1ZhbHVlcyxcbiAgICAgICAgICAgIGVycm9yczogbmV3RXJyb3JzLFxuICAgICAgICAgICAgd2FybmluZ3M6IG5ld1dhcm5pbmdzLFxuICAgICAgICAgICAgdG91Y2hlZDogbmV3VG91Y2hlZCxcbiAgICAgICAgICAgIHZhbGlkYXRpbmc6IG5ld1ZhbGlkYXRpbmcsXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHN1Ym1pdFdpdGhWYWxpZGF0aW9uID0gdXNlTWVtb2l6ZWRGbigoY2FsbGJhY2spID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgdmFsaWRhdGVkVmFsdWVzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsaWRhdGVkVmFsdWVzID0geWllbGQgdmFsaWRhdGVGaWVsZHNBc3luYygpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgLy8gVmFsaWRhdGlvbiBmYWlsdXJlIOKAlCB0aGUgZmllbGQgZXJyb3JzIGFyZSBhbHJlYWR5IGluIHRoZSBzdG9yZS5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGNhbGxiYWNrKHZhbGlkYXRlZFZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gQSB0aHJvd2luZyBjYWxsYmFjayBpcyBhIGNvbnN1bWVyIGJ1Zywgbm90IGEgdmFsaWRhdGlvbiBmYWlsdXJlIOKAlFxuICAgICAgICAgICAgICAgIC8vIHN1cmZhY2UgaXQgKG1pcnJvcmluZyByYy1maWVsZC1mb3JtJ3Mgb25GaW5pc2ggaGFuZGxpbmcpIGluc3RlYWRcbiAgICAgICAgICAgICAgICAvLyBvZiBzd2FsbG93aW5nIGl0IHNpbGVudGx5LlxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tQcm9Gb3JtXSBzdWJtaXQgY2FsbGJhY2sgdGhyZXc6JywgZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZWRWYWx1ZXM7XG4gICAgfSkpO1xuICAgIGNvbnN0IGZvcm1JbnN0YW5jZSA9IHVzZU1lbW8oKCkgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZm9ybUNvcmUuZm9ybUluc3RhbmNlKSwgeyBnZXRGaWVsZFZhbHVlOiBmb3JtQ29yZS5nZXRGaWVsZFZhbHVlLCBnZXRGaWVsZHNWYWx1ZTogZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUsIHZhbGlkYXRlRmllbGRzOiB2YWxpZGF0ZUZpZWxkc0FzeW5jLCBzZXRGaWVsZFZhbHVlOiBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlLCBzZXRGaWVsZHNWYWx1ZTogZm9ybUNvcmUuc2V0RmllbGRzVmFsdWUsIGdldEZpZWxkRXJyb3I6IGdldEZpZWxkRXJyb3IsIGdldEZpZWxkV2FybmluZzogZ2V0RmllbGRXYXJuaW5nLCBnZXRGaWVsZHNFcnJvcjogZ2V0RmllbGRzRXJyb3IsIGlzRmllbGRUb3VjaGVkOiBpc0ZpZWxkVG91Y2hlZCwgaXNGaWVsZHNUb3VjaGVkOiBpc0ZpZWxkc1RvdWNoZWQsIGlzRmllbGRWYWxpZGF0aW5nOiBpc0ZpZWxkVmFsaWRhdGluZywgc2V0RmllbGRFcnJvcjogZm9ybUNvcmUuc2V0RmllbGRFcnJvciwgc2V0RmllbGRzRXJyb3IsIHNldEZpZWxkVG91Y2hlZDogc2V0RmllbGRUb3VjaGVkLCBzZXRGaWVsZHNUb3VjaGVkLCByZXNldEZpZWxkczogcmVzZXRGb3JtRmllbGRzLCBzdWJtaXQ6IHN1Ym1pdFdpdGhWYWxpZGF0aW9uLCBkZWZpbmVGaWVsZCwgcmVnaXN0ZXJGaWVsZDogZm9ybUNvcmUucmVnaXN0ZXJGaWVsZCwgdW5yZWdpc3RlckZpZWxkOiBmb3JtQ29yZS51bnJlZ2lzdGVyRmllbGQgfSkpLCBbXG4gICAgICAgIGZvcm1Db3JlLmZvcm1JbnN0YW5jZSxcbiAgICAgICAgZm9ybUNvcmUuZ2V0RmllbGRWYWx1ZSxcbiAgICAgICAgZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUsXG4gICAgICAgIGZvcm1Db3JlLnNldEZpZWxkVmFsdWUsXG4gICAgICAgIGZvcm1Db3JlLnNldEZpZWxkc1ZhbHVlLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZEVycm9yLFxuICAgICAgICBmb3JtQ29yZS5yZWdpc3RlckZpZWxkLFxuICAgICAgICBmb3JtQ29yZS51bnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIHZhbGlkYXRlRmllbGRzQXN5bmMsXG4gICAgICAgIGdldEZpZWxkRXJyb3IsXG4gICAgICAgIGdldEZpZWxkV2FybmluZyxcbiAgICAgICAgZ2V0RmllbGRzRXJyb3IsXG4gICAgICAgIGlzRmllbGRUb3VjaGVkLFxuICAgICAgICBpc0ZpZWxkc1RvdWNoZWQsXG4gICAgICAgIGlzRmllbGRWYWxpZGF0aW5nLFxuICAgICAgICBzZXRGaWVsZHNFcnJvcixcbiAgICAgICAgc2V0RmllbGRUb3VjaGVkLFxuICAgICAgICBzZXRGaWVsZHNUb3VjaGVkLFxuICAgICAgICByZXNldEZvcm1GaWVsZHMsXG4gICAgICAgIHN1Ym1pdFdpdGhWYWxpZGF0aW9uLFxuICAgICAgICBkZWZpbmVGaWVsZCxcbiAgICBdKTtcbiAgICAvLyBGdW5jdGlvbi1mb3JtIHJ1bGVzIGdldCB0aGUgRlVMTCBmb3JtIGluc3RhbmNlIChlcnJvciBnZXR0ZXJzLCB0b3VjaGVkXG4gICAgLy8gc3RhdGUsIG11dGF0b3JzKSBpbnN0ZWFkIG9mIHRoZSBiYXJlIGNvcmUgbWV0aG9kcy4gUmVmIHdyaXRlIOKAlCBjaGVhcCBhbmRcbiAgICAvLyBpZGVtcG90ZW50IHBlciByZW5kZXIuXG4gICAgZm9ybUNvcmUuc2V0UnVsZUNvbnRleHRJbnN0YW5jZShmb3JtSW5zdGFuY2UpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEludGVybmFscyDigJMgZXhwb3NlZCBmb3IgUHJvRm9ybSBpbnRlZ3JhdGlvbi4gRGF0YSBmaWVsZHMgYXJlIEdFVFRFUlMgdGhhdFxuICAgIC8vIHJlYWQgdGhlIGxpdmUgc3RvcmUsIHNvIHRoZSBvYmplY3QgaXMgaWRlbnRpdHktc3RhYmxlIHlldCBuZXZlciBzdGFsZS5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBpbnRlcm5hbHMgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgICAgIGdldCB2YWx1ZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuZ2V0U3RhdGUoKS52YWx1ZXM7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBlcnJvcnMoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuZ2V0U3RhdGUoKS5lcnJvcnM7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB3YXJuaW5ncygpIHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5nZXRTdGF0ZSgpLndhcm5pbmdzO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgdG91Y2hlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5nZXRTdGF0ZSgpLnRvdWNoZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB2YWxpZGF0aW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkudmFsaWRhdGluZztcbiAgICAgICAgfSxcbiAgICAgICAgZmllbGRSdWxlczogZm9ybUNvcmUuZmllbGRSdWxlcyxcbiAgICAgICAgc2V0RmllbGRWYWx1ZTogZm9ybUNvcmUuc2V0RmllbGRWYWx1ZSxcbiAgICAgICAgc2V0RmllbGRFcnJvcjogZm9ybUNvcmUuc2V0RmllbGRFcnJvcixcbiAgICAgICAgc2V0RmllbGRXYXJuaW5nOiBmb3JtQ29yZS5zZXRGaWVsZFdhcm5pbmcsXG4gICAgICAgIHZhbGlkYXRlRmllbGRBc3luYyxcbiAgICAgICAgcmVnaXN0ZXJGaWVsZDogZm9ybUNvcmUucmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgdW5yZWdpc3RlckZpZWxkOiBmb3JtQ29yZS51bnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIHJldGFpbkZpZWxkOiBmb3JtQ29yZS5yZXRhaW5GaWVsZCxcbiAgICAgICAgcmVsZWFzZUZpZWxkOiBmb3JtQ29yZS5yZWxlYXNlRmllbGQsXG4gICAgICAgIGhhbmRsZVN1Ym1pdCxcbiAgICAgICAgaGFuZGxlUmVzZXQsXG4gICAgfSksIFtcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIGZvcm1Db3JlLmZpZWxkUnVsZXMsXG4gICAgICAgIGZvcm1Db3JlLnNldEZpZWxkVmFsdWUsXG4gICAgICAgIGZvcm1Db3JlLnNldEZpZWxkRXJyb3IsXG4gICAgICAgIGZvcm1Db3JlLnNldEZpZWxkV2FybmluZyxcbiAgICAgICAgdmFsaWRhdGVGaWVsZEFzeW5jLFxuICAgICAgICBmb3JtQ29yZS5yZWdpc3RlckZpZWxkLFxuICAgICAgICBmb3JtQ29yZS51bnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIGZvcm1Db3JlLnJldGFpbkZpZWxkLFxuICAgICAgICBmb3JtQ29yZS5yZWxlYXNlRmllbGQsXG4gICAgICAgIGhhbmRsZVN1Ym1pdCxcbiAgICAgICAgaGFuZGxlUmVzZXQsXG4gICAgXSk7XG4gICAgcmV0dXJuIHsgZm9ybUluc3RhbmNlLCBpbnRlcm5hbHMsIHN0b3JlIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgdXNlRm9ybTsiXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYyJ9