@1money/component-ui 0.0.74 → 0.0.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/es/components/Dialog/Dialog.js +7 -39
  2. package/es/components/Dialog/constants.d.ts +0 -3
  3. package/es/components/Dialog/constants.js +1 -4
  4. package/es/components/Dialog/style/Dialog.css +0 -21
  5. package/es/components/ProForm/ProForm.js +46 -33
  6. package/es/components/ProForm/ProFormDependency.js +6 -16
  7. package/es/components/ProForm/ProFormItem.js +5 -7
  8. package/es/components/ProForm/ProFormList.js +112 -40
  9. package/es/components/ProForm/core/constants.d.ts +2 -0
  10. package/es/components/ProForm/core/constants.js +7 -1
  11. package/es/components/ProForm/core/devWarning.d.ts +3 -0
  12. package/es/components/ProForm/core/devWarning.js +22 -0
  13. package/es/components/ProForm/core/formStore.d.ts +10 -2
  14. package/es/components/ProForm/core/formStore.js +21 -2
  15. package/es/components/ProForm/core/hooks/useForm.js +246 -103
  16. package/es/components/ProForm/core/hooks/useFormCore.js +134 -28
  17. package/es/components/ProForm/core/interface.d.ts +124 -49
  18. package/es/components/ProForm/core/runRules.d.ts +44 -12
  19. package/es/components/ProForm/core/runRules.js +584 -133
  20. package/es/components/ProForm/core/useFormItem.d.ts +6 -7
  21. package/es/components/ProForm/core/useFormItem.js +44 -22
  22. package/es/components/ProForm/core/validationError.d.ts +13 -0
  23. package/es/components/ProForm/core/validationError.js +29 -0
  24. package/es/components/ProForm/fields/ProFormCheckboxGroup.js +19 -5
  25. package/es/components/ProForm/fields/ProFormFieldSet.js +51 -12
  26. package/es/components/ProForm/fields/ProFormRadioGroup.js +8 -3
  27. package/es/components/ProForm/fields/ProFormSelect.js +13 -7
  28. package/es/components/ProForm/fields/createProFormField.js +18 -25
  29. package/es/components/ProForm/hooks/useFieldRequest.js +10 -8
  30. package/es/components/ProForm/index.d.ts +2 -1
  31. package/es/components/ProForm/index.js +4 -1
  32. package/es/components/ProForm/interface.d.ts +31 -40
  33. package/es/components/ProForm/layouts/QueryFilter.js +24 -16
  34. package/es/components/ProForm/style/ProForm.css +0 -1
  35. package/es/components/ProForm/utils.d.ts +8 -0
  36. package/es/components/ProForm/utils.js +51 -3
  37. package/es/components/Table/core/useTableSetup.js +2 -2
  38. package/es/components/Table/interface.d.ts +1 -1
  39. package/es/index.css +1 -1
  40. package/lib/components/Dialog/Dialog.js +6 -38
  41. package/lib/components/Dialog/constants.d.ts +0 -3
  42. package/lib/components/Dialog/constants.js +1 -4
  43. package/lib/components/Dialog/style/Dialog.css +0 -21
  44. package/lib/components/ProForm/ProForm.js +45 -32
  45. package/lib/components/ProForm/ProFormDependency.js +5 -15
  46. package/lib/components/ProForm/ProFormItem.js +5 -7
  47. package/lib/components/ProForm/ProFormList.js +110 -38
  48. package/lib/components/ProForm/core/constants.d.ts +2 -0
  49. package/lib/components/ProForm/core/constants.js +8 -2
  50. package/lib/components/ProForm/core/devWarning.d.ts +3 -0
  51. package/lib/components/ProForm/core/devWarning.js +29 -0
  52. package/lib/components/ProForm/core/formStore.d.ts +10 -2
  53. package/lib/components/ProForm/core/formStore.js +23 -2
  54. package/lib/components/ProForm/core/hooks/useForm.js +242 -99
  55. package/lib/components/ProForm/core/hooks/useFormCore.js +133 -27
  56. package/lib/components/ProForm/core/interface.d.ts +124 -49
  57. package/lib/components/ProForm/core/runRules.d.ts +44 -12
  58. package/lib/components/ProForm/core/runRules.js +587 -133
  59. package/lib/components/ProForm/core/useFormItem.d.ts +6 -7
  60. package/lib/components/ProForm/core/useFormItem.js +43 -21
  61. package/lib/components/ProForm/core/validationError.d.ts +13 -0
  62. package/lib/components/ProForm/core/validationError.js +36 -0
  63. package/lib/components/ProForm/fields/ProFormCheckboxGroup.js +18 -4
  64. package/lib/components/ProForm/fields/ProFormFieldSet.js +51 -12
  65. package/lib/components/ProForm/fields/ProFormRadioGroup.js +7 -2
  66. package/lib/components/ProForm/fields/ProFormSelect.js +13 -7
  67. package/lib/components/ProForm/fields/createProFormField.js +18 -25
  68. package/lib/components/ProForm/hooks/useFieldRequest.js +10 -8
  69. package/lib/components/ProForm/index.d.ts +2 -1
  70. package/lib/components/ProForm/index.js +10 -1
  71. package/lib/components/ProForm/interface.d.ts +31 -40
  72. package/lib/components/ProForm/layouts/QueryFilter.js +24 -16
  73. package/lib/components/ProForm/style/ProForm.css +0 -1
  74. package/lib/components/ProForm/utils.d.ts +8 -0
  75. package/lib/components/ProForm/utils.js +52 -3
  76. package/lib/components/Table/core/useTableSetup.js +2 -2
  77. package/lib/components/Table/interface.d.ts +1 -1
  78. package/lib/index.css +1 -1
  79. package/package.json +1 -1
  80. package/scripts/mcp-server/examples.generated.json +42 -36
  81. package/scripts/mcp-server/index.generated.json +23 -67
@@ -41,21 +41,24 @@ var __rest = this && this.__rest || function (s, e) {
41
41
  }
42
42
  return t;
43
43
  };
44
- import { useMemo, useEffect, memo, Fragment } from 'react';
44
+ import { useMemo, useEffect, useRef, memo, Fragment } from 'react';
45
45
  import React from 'react';
46
46
  import useEventCallback from '@1money/hooks/useEventCallback';
47
47
  import useMemoizedFn from '@1money/hooks/useMemoizedFn';
48
48
  import { useFormCore } from './useFormCore';
49
- import { resolveValue } from '../pathUtils';
50
- import { runRulesAsync } from '../runRules';
51
- import { useStoreSelector, shallowEqualArrays } from '../formStore';
49
+ import { resolveValue, setNestedValue } from '../pathUtils';
50
+ import { coerceFailureReason, filterRulesByTrigger, normalizeTriggers, resolveRules, runRulesAsync } from '../runRules';
51
+ import { useStoreSelector, shallowEqualArrays, sameValidationNode } from '../formStore';
52
+ import { FormValidationError } from '../validationError';
52
53
  /**
53
54
  * Only rules with a custom `validator` can be genuinely asynchronous —
54
55
  * builtin rules resolve within a microtask, so flipping `validating` for
55
- * them would only churn subscribers without ever being visible.
56
+ * them would only churn subscribers without ever being visible. Decided on
57
+ * RESOLVED rules: a function-form rule that resolves to builtin-only checks
58
+ * must not flicker the flag.
56
59
  */
57
- var hasCustomValidator = function hasCustomValidator(rules) {
58
- return rules.some(function (rule) {
60
+ var hasResolvedValidator = function hasResolvedValidator(resolved) {
61
+ return resolved.some(function (rule) {
59
62
  return typeof rule.validator === 'function';
60
63
  });
61
64
  };
@@ -71,6 +74,12 @@ export var useForm = function useForm() {
71
74
  validateTrigger = _config$validateTrigg === void 0 ? 'onChange' : _config$validateTrigg;
72
75
  var formCore = useFormCore(config);
73
76
  var store = formCore.store;
77
+ // Epoch of the LATEST async run that raised each field's `validating` flag.
78
+ // A settling run clears the flag only while it is still the latest raiser —
79
+ // an older run must not blank the spinner of a newer one, and a run
80
+ // superseded by a SYNC commit (which never touches flags) must still clean
81
+ // up after itself.
82
+ var lastAsyncEpochRef = useRef({});
74
83
  // Mark fields as validating in ONE commit. validating / touched live in the
75
84
  // store alongside values — flipping them (e.g. async validation around a
76
85
  // blur) must not re-render the form root, only the fields that subscribed.
@@ -108,7 +117,7 @@ export var useForm = function useForm() {
108
117
  delete newErrors[name];
109
118
  errorsChanged = true;
110
119
  }
111
- } else if (newErrors[name] !== error) {
120
+ } else if (!sameValidationNode(newErrors[name], error)) {
112
121
  newErrors[name] = error;
113
122
  errorsChanged = true;
114
123
  }
@@ -117,7 +126,7 @@ export var useForm = function useForm() {
117
126
  delete newWarnings[name];
118
127
  warningsChanged = true;
119
128
  }
120
- } else if (newWarnings[name] !== warning) {
129
+ } else if (!sameValidationNode(newWarnings[name], warning)) {
121
130
  newWarnings[name] = warning;
122
131
  warningsChanged = true;
123
132
  }
@@ -147,7 +156,7 @@ export var useForm = function useForm() {
147
156
  // ---------------------------------------------------------------------------
148
157
  var validateFieldAsync = useMemoizedFn(function (name, value, rules) {
149
158
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
150
- var flagged, outcome, _yield$runRulesAsync, error, warning;
159
+ var _a, epoch, values, resolved, flagged, outcome, _yield$runRulesAsync, error, warning, isCurrent, clearFlags, _t;
151
160
  return _regeneratorRuntime.wrap(function (_context) {
152
161
  while (1) switch (_context.prev = _context.next) {
153
162
  case 0:
@@ -160,8 +169,18 @@ export var useForm = function useForm() {
160
169
  error: null
161
170
  });
162
171
  case 1:
163
- flagged = hasCustomValidator(rules) ? [name] : [];
172
+ // Capture this run's epoch: if a NEWER run (sync or async) starts for
173
+ // the field before this one settles, the outcome below is stale and is
174
+ // discarded instead of overwriting the newer result.
175
+ epoch = formCore.beginValidationRun(name); // Resolve once: the flag decision needs resolved rules, and passing the
176
+ // resolved array onward spares the engine a re-resolution.
177
+ values = formCore.getFieldsValue();
178
+ resolved = resolveRules(rules, values, formCore.getRuleContextInstance());
179
+ flagged = hasResolvedValidator(resolved) ? [name] : [];
164
180
  markValidating(flagged);
181
+ flagged.forEach(function (flaggedName) {
182
+ lastAsyncEpochRef.current[flaggedName] = epoch;
183
+ });
165
184
  outcome = {
166
185
  name: name,
167
186
  error: null,
@@ -169,7 +188,7 @@ export var useForm = function useForm() {
169
188
  };
170
189
  _context.prev = 2;
171
190
  _context.next = 3;
172
- return runRulesAsync(name, value, formCore.getFieldsValue(), rules);
191
+ return runRulesAsync(name, value, values, resolved, formCore.getRuleContextInstance());
173
192
  case 3:
174
193
  _yield$runRulesAsync = _context.sent;
175
194
  error = _yield$runRulesAsync.error;
@@ -179,28 +198,45 @@ export var useForm = function useForm() {
179
198
  error: error,
180
199
  warning: warning
181
200
  };
201
+ _context.next = 5;
202
+ break;
182
203
  case 4:
183
204
  _context.prev = 4;
184
- commitRuleOutcomes([outcome], flagged);
185
- return _context.finish(4);
205
+ _t = _context["catch"](2);
206
+ // The engine contains rule-level throws itself; this is a last-resort
207
+ // net so an unexpected failure surfaces as a field error instead of
208
+ // leaving the field marked valid.
209
+ outcome = {
210
+ name: name,
211
+ error: (_a = coerceFailureReason(_t)) !== null && _a !== void 0 ? _a : 'Validation failed',
212
+ warning: null
213
+ };
186
214
  case 5:
215
+ _context.prev = 5;
216
+ isCurrent = formCore.isValidationRunCurrent(name, epoch);
217
+ clearFlags = flagged.filter(function (flaggedName) {
218
+ return lastAsyncEpochRef.current[flaggedName] === epoch;
219
+ });
220
+ commitRuleOutcomes(isCurrent ? [outcome] : [], clearFlags);
221
+ return _context.finish(5);
222
+ case 6:
187
223
  return _context.abrupt("return", {
188
224
  isValid: outcome.error === null,
189
225
  error: outcome.error
190
226
  });
191
- case 6:
227
+ case 7:
192
228
  case "end":
193
229
  return _context.stop();
194
230
  }
195
- }, _callee, null, [[2,, 4, 5]]);
231
+ }, _callee, null, [[2, 4, 5, 6]]);
196
232
  }));
197
233
  });
198
234
  // ---------------------------------------------------------------------------
199
235
  // Async field blur handler
200
236
  // ---------------------------------------------------------------------------
201
- var handleFieldBlur = useEventCallback(function (name) {
237
+ var handleFieldBlur = useEventCallback(function (name, fieldTrigger) {
202
238
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
203
- var touched, rules;
239
+ var touched, rules, values, applicable;
204
240
  return _regeneratorRuntime.wrap(function (_context2) {
205
241
  while (1) switch (_context2.prev = _context2.next) {
206
242
  case 0:
@@ -211,13 +247,21 @@ export var useForm = function useForm() {
211
247
  });
212
248
  }
213
249
  rules = formCore.getFieldRules(name);
214
- if (!(rules && validateTrigger === 'onBlur')) {
250
+ if (rules) {
215
251
  _context2.next = 1;
216
252
  break;
217
253
  }
218
- _context2.next = 1;
219
- return validateFieldAsync(name, resolveValue(formCore.getFieldsValue(), name), rules);
254
+ return _context2.abrupt("return");
220
255
  case 1:
256
+ values = formCore.getFieldsValue();
257
+ applicable = filterRulesByTrigger(resolveRules(rules, values, formCore.getRuleContextInstance()), 'onBlur', normalizeTriggers(fieldTrigger, validateTrigger), name);
258
+ if (!(applicable.length > 0)) {
259
+ _context2.next = 2;
260
+ break;
261
+ }
262
+ _context2.next = 2;
263
+ return validateFieldAsync(name, resolveValue(values, name), applicable);
264
+ case 2:
221
265
  case "end":
222
266
  return _context2.stop();
223
267
  }
@@ -229,68 +273,111 @@ export var useForm = function useForm() {
229
273
  // ---------------------------------------------------------------------------
230
274
  var validateFieldsAsync = useMemoizedFn(function (nameList) {
231
275
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
232
- var fieldsToValidate, fieldErrors, flagged, outcomes, error;
276
+ var fieldsToValidate, fieldErrors, resolvedByField, epochByField, _iterator2, _step2, name, rules, flagged, outcomes, clearFlags;
233
277
  return _regeneratorRuntime.wrap(function (_context4) {
234
278
  while (1) switch (_context4.prev = _context4.next) {
235
279
  case 0:
236
280
  fieldsToValidate = nameList || Object.keys(formCore.fieldRules);
237
- fieldErrors = {}; // One commit to raise the validating flags (validator-bearing fields
238
- // only), one commit to land every error/warning and clear the flags.
281
+ fieldErrors = {}; // Resolve every field once up front: the flag decision needs resolved
282
+ // rules, and the resolved arrays are reused for the actual runs. Each
283
+ // field also captures its validation epoch — a field whose value
284
+ // changes mid-submit gets a newer run, and this run's stale outcome
285
+ // must not overwrite it in the store.
286
+ resolvedByField = new Map();
287
+ epochByField = new Map();
288
+ _iterator2 = _createForOfIteratorHelper(fieldsToValidate);
289
+ try {
290
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
291
+ name = _step2.value;
292
+ rules = formCore.fieldRules[name];
293
+ if (rules) {
294
+ epochByField.set(name, formCore.beginValidationRun(name));
295
+ resolvedByField.set(name, resolveRules(rules, formCore.getFieldsValue(), formCore.getRuleContextInstance()));
296
+ }
297
+ }
298
+ // One commit to raise the validating flags (validator-bearing fields
299
+ // only), one commit to land every error/warning and clear the flags.
300
+ } catch (err) {
301
+ _iterator2.e(err);
302
+ } finally {
303
+ _iterator2.f();
304
+ }
239
305
  flagged = fieldsToValidate.filter(function (name) {
240
- var rules = formCore.fieldRules[name];
241
- return rules ? hasCustomValidator(rules) : false;
306
+ var resolved = resolvedByField.get(name);
307
+ return resolved ? hasResolvedValidator(resolved) : false;
242
308
  });
243
309
  markValidating(flagged);
310
+ flagged.forEach(function (name) {
311
+ lastAsyncEpochRef.current[name] = epochByField.get(name);
312
+ });
244
313
  outcomes = [];
245
314
  _context4.prev = 1;
246
315
  _context4.next = 2;
247
316
  return Promise.all(fieldsToValidate.map(function (name) {
248
317
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
249
- var rules, _yield$runRulesAsync2, error, warning;
318
+ var _a, resolved, error, warning, _yield$runRulesAsync2, epoch, _t2;
250
319
  return _regeneratorRuntime.wrap(function (_context3) {
251
320
  while (1) switch (_context3.prev = _context3.next) {
252
321
  case 0:
253
- rules = formCore.fieldRules[name];
254
- if (rules) {
322
+ resolved = resolvedByField.get(name);
323
+ if (resolved) {
255
324
  _context3.next = 1;
256
325
  break;
257
326
  }
258
327
  return _context3.abrupt("return");
259
328
  case 1:
260
- _context3.next = 2;
261
- return runRulesAsync(name, resolveValue(formCore.getFieldsValue(), name), formCore.getFieldsValue(), rules);
262
- case 2:
329
+ error = null;
330
+ warning = null;
331
+ _context3.prev = 2;
332
+ _context3.next = 3;
333
+ return runRulesAsync(name, resolveValue(formCore.getFieldsValue(), name), formCore.getFieldsValue(), resolved, formCore.getRuleContextInstance());
334
+ case 3:
263
335
  _yield$runRulesAsync2 = _context3.sent;
264
336
  error = _yield$runRulesAsync2.error;
265
337
  warning = _yield$runRulesAsync2.warning;
266
- outcomes.push({
267
- name: name,
268
- error: error,
269
- warning: warning
270
- });
338
+ _context3.next = 5;
339
+ break;
340
+ case 4:
341
+ _context3.prev = 4;
342
+ _t2 = _context3["catch"](2);
343
+ // Last-resort net (see validateFieldAsync) — keep the normal
344
+ // constructed-error flow so onFinishFailed gets a real payload.
345
+ error = (_a = coerceFailureReason(_t2)) !== null && _a !== void 0 ? _a : 'Validation failed';
346
+ case 5:
347
+ // The store commit is staleness-guarded; the SUBMIT decision
348
+ // (fieldErrors / the thrown FormValidationError) still reflects
349
+ // this run's own results for the values it validated.
350
+ epoch = epochByField.get(name);
351
+ if (epoch !== undefined && formCore.isValidationRunCurrent(name, epoch)) {
352
+ outcomes.push({
353
+ name: name,
354
+ error: error,
355
+ warning: warning
356
+ });
357
+ }
271
358
  if (error !== null) {
272
359
  fieldErrors[name] = error;
273
360
  }
274
- case 3:
361
+ case 6:
275
362
  case "end":
276
363
  return _context3.stop();
277
364
  }
278
- }, _callee3);
365
+ }, _callee3, null, [[2, 4]]);
279
366
  }));
280
367
  }));
281
368
  case 2:
282
369
  _context4.prev = 2;
283
- commitRuleOutcomes(outcomes, flagged);
370
+ clearFlags = flagged.filter(function (name) {
371
+ return lastAsyncEpochRef.current[name] === epochByField.get(name);
372
+ });
373
+ commitRuleOutcomes(outcomes, clearFlags);
284
374
  return _context4.finish(2);
285
375
  case 3:
286
376
  if (!(Object.keys(fieldErrors).length > 0)) {
287
377
  _context4.next = 4;
288
378
  break;
289
379
  }
290
- error = new Error('Validation failed');
291
- error.values = formCore.getFieldsValue();
292
- error.errors = fieldErrors;
293
- throw error;
380
+ throw new FormValidationError(formCore.getFieldsValue(), fieldErrors);
294
381
  case 4:
295
382
  if (!nameList) {
296
383
  _context4.next = 5;
@@ -321,10 +408,11 @@ export var useForm = function useForm() {
321
408
  render = _a.render,
322
409
  props = __rest(_a, ["children", "render"]);
323
410
  // Per-field store subscription: this field re-renders only when its
324
- // own value/error/touched/validating slice changes.
411
+ // own value/error/touched/validating slice changes. Dot-paths
412
+ // resolve into the nested values like everywhere else.
325
413
  var _useStoreSelector = useStoreSelector(store, function (state) {
326
414
  var _a;
327
- return [(_a = state.values[name]) !== null && _a !== void 0 ? _a : '', state.errors[name], state.touched[name], state.validating[name]];
415
+ return [(_a = resolveValue(state.values, name)) !== null && _a !== void 0 ? _a : '', state.errors[name], state.touched[name], state.validating[name]];
328
416
  }, shallowEqualArrays),
329
417
  _useStoreSelector2 = _slicedToArray(_useStoreSelector, 4),
330
418
  fieldValue = _useStoreSelector2[0],
@@ -332,22 +420,36 @@ export var useForm = function useForm() {
332
420
  fieldTouched = _useStoreSelector2[2],
333
421
  fieldValidating = _useStoreSelector2[3];
334
422
  useEffect(function () {
423
+ // Mount-counted: releaseField removes the rules only when the
424
+ // LAST same-name instance unmounts — an instance that piggybacked
425
+ // on an existing registration (e.g. a ProForm.Item's) can never
426
+ // wipe it on its own unmount.
427
+ formCore.retainField(name);
335
428
  var existingRules = formCore.getFieldRules(name);
336
429
  if (!existingRules && rules.length > 0) {
337
430
  formCore.registerField(name, rules);
338
431
  }
339
432
  return function () {
340
- formCore.unregisterField(name);
433
+ formCore.releaseField(name);
341
434
  };
342
435
  }, []); // Only register on mount
343
436
  var handleFieldChange = useEventCallback(function (value) {
344
437
  formCore.setFieldValue(name, value);
345
- if (validateTrigger === 'onChange') {
346
- formCore.validateField(name, rules, value);
438
+ // Touched is set by the user change trigger (matching the
439
+ // ProForm.Item path) — programmatic setFieldsValue does not.
440
+ var touched = store.getState().touched;
441
+ if (!touched[name]) {
442
+ store.setState({
443
+ touched: Object.assign(Object.assign({}, touched), _defineProperty({}, name, true))
444
+ });
445
+ }
446
+ var applicable = filterRulesByTrigger(resolveRules(rules, formCore.getFieldsValue(), formCore.getRuleContextInstance()), 'onChange', normalizeTriggers(fieldOptions.validateTrigger, validateTrigger), name);
447
+ if (applicable.length > 0) {
448
+ formCore.validateField(name, applicable, value);
347
449
  }
348
450
  });
349
451
  var handleBlur = useEventCallback(function () {
350
- handleFieldBlur(name);
452
+ handleFieldBlur(name, fieldOptions.validateTrigger);
351
453
  });
352
454
  var fieldProps = Object.assign({
353
455
  name: name,
@@ -379,22 +481,25 @@ export var useForm = function useForm() {
379
481
  if (typeof children === 'function') {
380
482
  return children(fieldProps);
381
483
  }
484
+ // Element children receive only DOM-safe props — error/touched/
485
+ // validating are field META, not control props; spreading them onto
486
+ // a host element would leak unknown attributes. Render-prop and
487
+ // function children keep the full fieldProps.
488
+ var domSafeProps = Object.assign({
489
+ name: name,
490
+ value: fieldValue,
491
+ onChange: handleMergeChange,
492
+ onBlur: handleMergeBlur
493
+ }, props);
382
494
  if (/*#__PURE__*/React.isValidElement(children)) {
383
- var mergedProps = Object.assign(Object.assign({}, fieldProps), {
384
- onChange: handleMergeChange,
385
- onBlur: handleMergeBlur
386
- });
387
- return /*#__PURE__*/React.cloneElement(children, mergedProps);
495
+ return /*#__PURE__*/React.cloneElement(children, domSafeProps);
388
496
  }
389
497
  if (Array.isArray(children)) {
390
498
  return /*#__PURE__*/React.createElement.apply(React, [Fragment, null].concat(_toConsumableArray(children.map(function (child, index) {
391
499
  if (/*#__PURE__*/React.isValidElement(child)) {
392
- var _mergedProps = Object.assign(Object.assign({}, fieldProps), {
393
- key: child.key || index,
394
- onChange: handleMergeChange,
395
- onBlur: handleMergeBlur
396
- });
397
- return /*#__PURE__*/React.cloneElement(child, _mergedProps);
500
+ return /*#__PURE__*/React.cloneElement(child, Object.assign(Object.assign({}, domSafeProps), {
501
+ key: child.key || index
502
+ }));
398
503
  }
399
504
  return child;
400
505
  }))));
@@ -409,7 +514,7 @@ export var useForm = function useForm() {
409
514
  // ---------------------------------------------------------------------------
410
515
  var handleSubmit = useEventCallback(function (e) {
411
516
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
412
- var validatedValues, typed, _t;
517
+ var validatedValues, _t3;
413
518
  return _regeneratorRuntime.wrap(function (_context5) {
414
519
  while (1) switch (_context5.prev = _context5.next) {
415
520
  case 0:
@@ -424,12 +529,18 @@ export var useForm = function useForm() {
424
529
  break;
425
530
  case 3:
426
531
  _context5.prev = 3;
427
- _t = _context5["catch"](1);
428
- typed = _t;
429
- onFinishFailed === null || onFinishFailed === void 0 ? void 0 : onFinishFailed({
430
- values: typed.values,
431
- errors: typed.errors
432
- });
532
+ _t3 = _context5["catch"](1);
533
+ // Only a VALIDATION failure reaches onFinishFailed — an exception out
534
+ // of the consumer's own onFinish is not a validation result and is
535
+ // surfaced instead of being misreported.
536
+ if (_t3 instanceof FormValidationError) {
537
+ onFinishFailed === null || onFinishFailed === void 0 ? void 0 : onFinishFailed({
538
+ values: _t3.values,
539
+ errors: _t3.errors
540
+ });
541
+ } else {
542
+ console.error('[ProForm] onFinish threw during submit:', _t3);
543
+ }
433
544
  case 4:
434
545
  case "end":
435
546
  return _context5.stop();
@@ -512,34 +623,45 @@ export var useForm = function useForm() {
512
623
  var resetFormFields = useMemoizedFn(function (fields) {
513
624
  if (!fields) {
514
625
  formCore.resetFields();
515
- } else {
516
- var resetValues = {};
517
- fields.forEach(function (field) {
518
- // Mount-frozen initialValues — consistent with the full resetFields.
519
- resetValues[field] = formCore.getInitialValues()[field];
520
- });
521
- formCore.setFieldsValue(resetValues);
522
- var _store$getState = store.getState(),
523
- touched = _store$getState.touched,
524
- validating = _store$getState.validating;
525
- var newTouched = Object.assign({}, touched);
526
- var newValidating = Object.assign({}, validating);
527
- fields.forEach(function (field) {
528
- delete newTouched[field];
529
- delete newValidating[field];
530
- });
531
- store.setState({
532
- touched: newTouched,
533
- validating: newValidating
534
- });
535
- fields.forEach(function (field) {
536
- formCore.setFieldError(field, null);
537
- });
626
+ return;
538
627
  }
628
+ // Mount-frozen initialValues — consistent with the full resetFields.
629
+ // Reads AND writes are nested-path aware, so dot-path names
630
+ // (`address.city`, `items.0.title`) reset correctly instead of probing a
631
+ // literal key and shallow-merging one back.
632
+ var initialValues = formCore.getInitialValues();
633
+ var state = store.getState();
634
+ var newValues = state.values;
635
+ fields.forEach(function (field) {
636
+ var initial = resolveValue(initialValues, field);
637
+ newValues = field.includes('.') ? setNestedValue(newValues, field, initial) : Object.assign(Object.assign({}, newValues), _defineProperty({}, field, initial));
638
+ });
639
+ // Like the full reset: clear ALL per-field meta (errors AND warnings AND
640
+ // touched/validating), invalidate in-flight validation runs, and land
641
+ // everything in ONE commit. No onValuesChange — reset is not a change
642
+ // event on either path.
643
+ formCore.invalidateValidationRuns(fields);
644
+ var newErrors = Object.assign({}, state.errors);
645
+ var newWarnings = Object.assign({}, state.warnings);
646
+ var newTouched = Object.assign({}, state.touched);
647
+ var newValidating = Object.assign({}, state.validating);
648
+ fields.forEach(function (field) {
649
+ delete newErrors[field];
650
+ delete newWarnings[field];
651
+ delete newTouched[field];
652
+ delete newValidating[field];
653
+ });
654
+ store.setState({
655
+ values: newValues,
656
+ errors: newErrors,
657
+ warnings: newWarnings,
658
+ touched: newTouched,
659
+ validating: newValidating
660
+ });
539
661
  });
540
662
  var submitWithValidation = useMemoizedFn(function (callback) {
541
663
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
542
- var validatedValues, _t2;
664
+ var validatedValues, _t4, _t5;
543
665
  return _regeneratorRuntime.wrap(function (_context6) {
544
666
  while (1) switch (_context6.prev = _context6.next) {
545
667
  case 0:
@@ -548,23 +670,38 @@ export var useForm = function useForm() {
548
670
  return validateFieldsAsync();
549
671
  case 1:
550
672
  validatedValues = _context6.sent;
673
+ _context6.next = 3;
674
+ break;
675
+ case 2:
676
+ _context6.prev = 2;
677
+ _t4 = _context6["catch"](0);
678
+ return _context6.abrupt("return", undefined);
679
+ case 3:
551
680
  if (!callback) {
552
- _context6.next = 2;
681
+ _context6.next = 7;
553
682
  break;
554
683
  }
555
- _context6.next = 2;
684
+ _context6.prev = 4;
685
+ _context6.next = 5;
556
686
  return callback(validatedValues);
557
- case 2:
558
- return _context6.abrupt("return", validatedValues);
559
- case 3:
560
- _context6.prev = 3;
561
- _t2 = _context6["catch"](0);
687
+ case 5:
688
+ _context6.next = 7;
689
+ break;
690
+ case 6:
691
+ _context6.prev = 6;
692
+ _t5 = _context6["catch"](4);
693
+ // A throwing callback is a consumer bug, not a validation failure —
694
+ // surface it (mirroring rc-field-form's onFinish handling) instead
695
+ // of swallowing it silently.
696
+ console.error('[ProForm] submit callback threw:', _t5);
562
697
  return _context6.abrupt("return", undefined);
563
- case 4:
698
+ case 7:
699
+ return _context6.abrupt("return", validatedValues);
700
+ case 8:
564
701
  case "end":
565
702
  return _context6.stop();
566
703
  }
567
- }, _callee6, null, [[0, 3]]);
704
+ }, _callee6, null, [[0, 2], [4, 6]]);
568
705
  }));
569
706
  });
570
707
  var formInstance = useMemo(function () {
@@ -588,6 +725,10 @@ export var useForm = function useForm() {
588
725
  unregisterField: formCore.unregisterField
589
726
  });
590
727
  }, [formCore.formInstance, formCore.setFieldValue, formCore.setFieldError, formCore.registerField, formCore.unregisterField, validateFieldsAsync, getFieldError, getFieldWarning, getFieldsError, isFieldTouched, isFieldsTouched, isFieldValidating, setFieldsError, setFieldTouched, setFieldsTouched, resetFormFields, submitWithValidation, defineField]);
728
+ // Function-form rules get the FULL form instance (error getters, touched
729
+ // state, mutators) instead of the bare core methods. Ref write — cheap and
730
+ // idempotent per render.
731
+ formCore.setRuleContextInstance(formInstance);
591
732
  // ---------------------------------------------------------------------------
592
733
  // Internals – exposed for ProForm integration. Data fields are GETTERS that
593
734
  // read the live store, so the object is identity-stable yet never stale.
@@ -617,10 +758,12 @@ export var useForm = function useForm() {
617
758
  validateFieldAsync: validateFieldAsync,
618
759
  registerField: formCore.registerField,
619
760
  unregisterField: formCore.unregisterField,
761
+ retainField: formCore.retainField,
762
+ releaseField: formCore.releaseField,
620
763
  handleSubmit: handleSubmit,
621
764
  handleReset: handleReset
622
765
  };
623
- }, [store, formCore.fieldRules, formCore.setFieldValue, formCore.setFieldError, formCore.setFieldWarning, formCore.validateField, validateFieldAsync, formCore.registerField, formCore.unregisterField, handleSubmit, handleReset]);
766
+ }, [store, formCore.fieldRules, formCore.setFieldValue, formCore.setFieldError, formCore.setFieldWarning, formCore.validateField, validateFieldAsync, formCore.registerField, formCore.unregisterField, formCore.retainField, formCore.releaseField, handleSubmit, handleReset]);
624
767
  return {
625
768
  formInstance: formInstance,
626
769
  internals: internals,
@@ -628,4 +771,4 @@ export var useForm = function useForm() {
628
771
  };
629
772
  };
630
773
  export default useForm;
631
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL2hvb2tzL3VzZUZvcm0uanMiLCJjb21wb25lbnRzL1Byb0Zvcm0vY29yZS9zcmMvY29tcG9uZW50cy9Qcm9Gb3JtL2NvcmUvaG9va3MvdXNlRm9ybS50cyJdLCJuYW1lcyI6WyJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsInZhbHVlIiwicmVzb2x2ZSIsIlByb21pc2UiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJfX3Jlc3QiLCJzIiwidCIsInAiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpbmRleE9mIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiaSIsImxlbmd0aCIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwidXNlTWVtbyIsInVzZUVmZmVjdCIsIm1lbW8iLCJGcmFnbWVudCIsIlJlYWN0IiwidXNlRXZlbnRDYWxsYmFjayIsInVzZU1lbW9pemVkRm4iLCJ1c2VGb3JtQ29yZSIsInJlc29sdmVWYWx1ZSIsInJ1blJ1bGVzQXN5bmMiLCJ1c2VTdG9yZVNlbGVjdG9yIiwic2hhbGxvd0VxdWFsQXJyYXlzIiwiaGFzQ3VzdG9tVmFsaWRhdG9yIiwicnVsZXMiLCJzb21lIiwicnVsZSIsInZhbGlkYXRvciIsInVzZUZvcm0iLCJjb25maWciLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJvbkZpbmlzaCIsIm9uRmluaXNoRmFpbGVkIiwib25SZXNldCIsIl9jb25maWckdmFsaWRhdGVUcmlnZyIsInZhbGlkYXRlVHJpZ2dlciIsImZvcm1Db3JlIiwic3RvcmUiLCJtYXJrVmFsaWRhdGluZyIsIm5hbWVzIiwiYXNzaWduIiwiZ2V0U3RhdGUiLCJ2YWxpZGF0aW5nIiwiZm9yRWFjaCIsIm5hbWUiLCJzZXRTdGF0ZSIsImNvbW1pdFJ1bGVPdXRjb21lcyIsIm91dGNvbWVzIiwiY2xlYXJWYWxpZGF0aW5nIiwic3RhdGUiLCJlcnJvcnNDaGFuZ2VkIiwid2FybmluZ3NDaGFuZ2VkIiwibmV3RXJyb3JzIiwiZXJyb3JzIiwibmV3V2FybmluZ3MiLCJ3YXJuaW5ncyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJuIiwiX3N0ZXAkdmFsdWUiLCJlcnJvciIsIndhcm5pbmciLCJlcnIiLCJmIiwiZmxhZ3NUb0NsZWFyIiwiZmlsdGVyIiwicGF0Y2giLCJuZXdWYWxpZGF0aW5nIiwia2V5cyIsInZhbGlkYXRlRmllbGRBc3luYyIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsImZsYWdnZWQiLCJvdXRjb21lIiwiX3lpZWxkJHJ1blJ1bGVzQXN5bmMiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwiYWJydXB0IiwiaXNWYWxpZCIsImdldEZpZWxkc1ZhbHVlIiwic2VudCIsImZpbmlzaCIsInN0b3AiLCJoYW5kbGVGaWVsZEJsdXIiLCJfY2FsbGVlMiIsInRvdWNoZWQiLCJfY29udGV4dDIiLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRGaWVsZFJ1bGVzIiwidmFsaWRhdGVGaWVsZHNBc3luYyIsIm5hbWVMaXN0IiwiX2NhbGxlZTQiLCJmaWVsZHNUb1ZhbGlkYXRlIiwiZmllbGRFcnJvcnMiLCJfY29udGV4dDQiLCJmaWVsZFJ1bGVzIiwiYWxsIiwibWFwIiwiX2NhbGxlZTMiLCJfeWllbGQkcnVuUnVsZXNBc3luYzIiLCJfY29udGV4dDMiLCJwdXNoIiwiRXJyb3IiLCJ2YWx1ZXMiLCJyZWR1Y2UiLCJhY2MiLCJkZWZpbmVGaWVsZCIsImZpZWxkT3B0aW9ucyIsIl9maWVsZE9wdGlvbnMkcnVsZXMiLCJGaWVsZENvbXBvbmVudCIsIl9hIiwiY2hpbGRyZW4iLCJyZW5kZXIiLCJwcm9wcyIsIl91c2VTdG9yZVNlbGVjdG9yIiwiX3VzZVN0b3JlU2VsZWN0b3IyIiwiX3NsaWNlZFRvQXJyYXkiLCJmaWVsZFZhbHVlIiwiZmllbGRFcnJvciIsImZpZWxkVG91Y2hlZCIsImZpZWxkVmFsaWRhdGluZyIsImV4aXN0aW5nUnVsZXMiLCJyZWdpc3RlckZpZWxkIiwidW5yZWdpc3RlckZpZWxkIiwiaGFuZGxlRmllbGRDaGFuZ2UiLCJzZXRGaWVsZFZhbHVlIiwidmFsaWRhdGVGaWVsZCIsImhhbmRsZUJsdXIiLCJmaWVsZFByb3BzIiwib25DaGFuZ2UiLCJvbkJsdXIiLCJoYW5kbGVNZXJnZUNoYW5nZSIsIl90eXBlb2YiLCJ0YXJnZXQiLCJpc1ZhbGlkRWxlbWVudCIsImhhbmRsZU1lcmdlQmx1ciIsIm1lcmdlZFByb3BzIiwiY2xvbmVFbGVtZW50IiwiQXJyYXkiLCJpc0FycmF5IiwiY3JlYXRlRWxlbWVudCIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheSIsImNoaWxkIiwiaW5kZXgiLCJrZXkiLCJkaXNwbGF5TmFtZSIsImhhbmRsZVN1Ym1pdCIsIl9jYWxsZWU1IiwidmFsaWRhdGVkVmFsdWVzIiwidHlwZWQiLCJfdCIsIl9jb250ZXh0NSIsInByZXZlbnREZWZhdWx0IiwiaGFuZGxlUmVzZXQiLCJyZXNldEZpZWxkcyIsImdldEZpZWxkRXJyb3IiLCJnZXRGaWVsZFdhcm5pbmciLCJnZXRGaWVsZHNFcnJvciIsImlzRmllbGRUb3VjaGVkIiwiaXNGaWVsZHNUb3VjaGVkIiwiYWxsRmllbGRzVG91Y2hlZCIsImV2ZXJ5IiwiaXNGaWVsZFZhbGlkYXRpbmciLCJzZXRGaWVsZHNFcnJvciIsImZpZWxkc0Vycm9yIiwiZW50cmllcyIsIl9yZWYiLCJfcmVmMiIsInNldEZpZWxkRXJyb3IiLCJzZXRGaWVsZFRvdWNoZWQiLCJpc1RvdWNoZWQiLCJzZXRGaWVsZHNUb3VjaGVkIiwiZmllbGRzVG91Y2giLCJyZXNldEZvcm1GaWVsZHMiLCJmaWVsZHMiLCJyZXNldFZhbHVlcyIsImZpZWxkIiwiZ2V0SW5pdGlhbFZhbHVlcyIsInNldEZpZWxkc1ZhbHVlIiwiX3N0b3JlJGdldFN0YXRlIiwibmV3VG91Y2hlZCIsInN1Ym1pdFdpdGhWYWxpZGF0aW9uIiwiY2FsbGJhY2siLCJfY2FsbGVlNiIsIl90MiIsIl9jb250ZXh0NiIsImZvcm1JbnN0YW5jZSIsInZhbGlkYXRlRmllbGRzIiwic3VibWl0IiwiaW50ZXJuYWxzIiwic2V0RmllbGRXYXJuaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUlBLFNBQVMsR0FBSSxJQUFJLElBQUksSUFBSSxDQUFDQSxTQUFTLElBQUssVUFBVUMsT0FBTyxFQUFFQyxVQUFVLEVBQUVDLENBQUMsRUFBRUMsU0FBUyxFQUFFO0VBQ3JGLFNBQVNDLEtBQUtBLENBQUNDLEtBQUssRUFBRTtJQUFFLE9BQU9BLEtBQUssWUFBWUgsQ0FBQyxHQUFHRyxLQUFLLEdBQUcsSUFBSUgsQ0FBQyxDQUFDLFVBQVVJLE9BQU8sRUFBRTtNQUFFQSxPQUFPLENBQUNELEtBQUssQ0FBQztJQUFFLENBQUMsQ0FBQztFQUFFO0VBQzNHLE9BQU8sS0FBS0gsQ0FBQyxLQUFLQSxDQUFDLEdBQUdLLE9BQU8sQ0FBQyxFQUFFLFVBQVVELE9BQU8sRUFBRUUsTUFBTSxFQUFFO0lBQ3ZELFNBQVNDLFNBQVNBLENBQUNKLEtBQUssRUFBRTtNQUFFLElBQUk7UUFBRUssSUFBSSxDQUFDUCxTQUFTLENBQUNRLElBQUksQ0FBQ04sS0FBSyxDQUFDLENBQUM7TUFBRSxDQUFDLENBQUMsT0FBT08sQ0FBQyxFQUFFO1FBQUVKLE1BQU0sQ0FBQ0ksQ0FBQyxDQUFDO01BQUU7SUFBRTtJQUMxRixTQUFTQyxRQUFRQSxDQUFDUixLQUFLLEVBQUU7TUFBRSxJQUFJO1FBQUVLLElBQUksQ0FBQ1AsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDRSxLQUFLLENBQUMsQ0FBQztNQUFFLENBQUMsQ0FBQyxPQUFPTyxDQUFDLEVBQUU7UUFBRUosTUFBTSxDQUFDSSxDQUFDLENBQUM7TUFBRTtJQUFFO0lBQzdGLFNBQVNGLElBQUlBLENBQUNJLE1BQU0sRUFBRTtNQUFFQSxN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QzZGLGFBQWE7TUFDckMzRCxrQkFBa0IsRUFBbEJBLGtCQUFrQjtNQUNsQnVELGFBQWEsRUFBRXpGLFFBQVEsQ0FBQ3lGLGFBQWE7TUFDckNDLGVBQWUsRUFBRTFGLFFBQVEsQ0FBQzBGLGVBQWU7TUFDekN3QixZQUFZLEVBQVpBLFlBQVk7TUFDWk8sV0FBVyxFQUFYQTtJRDFHRixDQzJHQztFQUFBLENBQUMsRUFDRixDQUNFeEgsS0FBSyxFQUNMRCxRQUFRLENBQUM4RCxVQUFVLEVBQ25COUQsUUFBUSxDQUFDNEYsYUFBYSxFQUN0QjVGLFFBQVEsQ0FBQ3dJLGFBQWEsRUFDdEJ4SSxRQUFRLENBQUM4SixlQUFlLEVBQ3hCOUosUUFBUSxDQUFDNkYsYUFBYSxFQUN0QjNELGtCQUFrQixFQUNsQmxDLFFBQVEsQ0FBQ3lGLGFBQWEsRUFDdEJ6RixRQUFRLENBQUMwRixlQUFlLEVBQ3hCd0IsWUFBWSxFQUNaTyxXQUFXLENBQ1osQ0FDRjtFQUVELE9BQU87SUFBRWlDLFlBQVksRUFBWkEsWUFBWTtJQUFFRyxTQUFTLEVBQVRBLFNBQVM7SUFBRTVKLEtBQUssRUFBTEE7RUFBSyxDQUFFO0FBQzNDLENBQUM7QUFFRCxlQUFlVixPQUFPIiwiZmlsZSI6ImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL2hvb2tzL3VzZUZvcm0uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IHVzZU1lbW8sIHVzZUVmZmVjdCwgbWVtbywgRnJhZ21lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQDFtb25leS9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCB1c2VNZW1vaXplZEZuIGZyb20gJ0AxbW9uZXkvaG9va3MvdXNlTWVtb2l6ZWRGbic7XG5pbXBvcnQgeyB1c2VGb3JtQ29yZSB9IGZyb20gJy4vdXNlRm9ybUNvcmUnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnLi4vcGF0aFV0aWxzJztcbmltcG9ydCB7IHJ1blJ1bGVzQXN5bmMgfSBmcm9tICcuLi9ydW5SdWxlcyc7XG5pbXBvcnQgeyB1c2VTdG9yZVNlbGVjdG9yLCBzaGFsbG93RXF1YWxBcnJheXMgfSBmcm9tICcuLi9mb3JtU3RvcmUnO1xuLyoqXG4gKiBPbmx5IHJ1bGVzIHdpdGggYSBjdXN0b20gYHZhbGlkYXRvcmAgY2FuIGJlIGdlbnVpbmVseSBhc3luY2hyb25vdXMg4oCUXG4gKiBidWlsdGluIHJ1bGVzIHJlc29sdmUgd2l0aGluIGEgbWljcm90YXNrLCBzbyBmbGlwcGluZyBgdmFsaWRhdGluZ2AgZm9yXG4gKiB0aGVtIHdvdWxkIG9ubHkgY2h1cm4gc3Vic2NyaWJlcnMgd2l0aG91dCBldmVyIGJlaW5nIHZpc2libGUuXG4gKi9cbmNvbnN0IGhhc0N1c3RvbVZhbGlkYXRvciA9IChydWxlcykgPT4gcnVsZXMuc29tZSgocnVsZSkgPT4gdHlwZW9mIHJ1bGUudmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKTtcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gdXNlRm9ybVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY29uc3QgdXNlRm9ybSA9IChjb25maWcgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgb25GaW5pc2gsIG9uRmluaXNoRmFpbGVkLCBvblJlc2V0LCB2YWxpZGF0ZVRyaWdnZXIgPSAnb25DaGFuZ2UnLCB9ID0gY29uZmlnO1xuICAgIGNvbnN0IGZvcm1Db3JlID0gdXNlRm9ybUNvcmUoY29uZmlnKTtcbiAgICBjb25zdCB7IHN0b3JlIH0gPSBmb3JtQ29yZTtcbiAgICAvLyBNYXJrIGZpZWxkcyBhcyB2YWxpZGF0aW5nIGluIE9ORSBjb21taXQuIHZhbGlkYXRpbmcgLyB0b3VjaGVkIGxpdmUgaW4gdGhlXG4gICAgLy8gc3RvcmUgYWxvbmdzaWRlIHZhbHVlcyDigJQgZmxpcHBpbmcgdGhlbSAoZS5nLiBhc3luYyB2YWxpZGF0aW9uIGFyb3VuZCBhXG4gICAgLy8gYmx1cikgbXVzdCBub3QgcmUtcmVuZGVyIHRoZSBmb3JtIHJvb3QsIG9ubHkgdGhlIGZpZWxkcyB0aGF0IHN1YnNjcmliZWQuXG4gICAgY29uc3QgbWFya1ZhbGlkYXRpbmcgPSB1c2VNZW1vaXplZEZuKChuYW1lcykgPT4ge1xuICAgICAgICBpZiAobmFtZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBuZXh0ID0gT2JqZWN0LmFzc2lnbih7fSwgc3RvcmUuZ2V0U3RhdGUoKS52YWxpZGF0aW5nKTtcbiAgICAgICAgbmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgbmV4dFtuYW1lXSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHZhbGlkYXRpbmc6IG5leHQgfSk7XG4gICAgfSk7XG4gICAgLy8gRm9sZCBwZXItZmllbGQgcnVsZSBvdXRjb21lcyBpbnRvIEFUIE1PU1Qgb25lIHN0b3JlIGNvbW1pdDogZXJyb3JzIGFuZFxuICAgIC8vIHdhcm5pbmdzIGFyZSBtZXJnZWQgb3ZlciB0aGUgY3VycmVudCBtYXBzIGFuZCB0aGUgYGNsZWFyVmFsaWRhdGluZ2AgZmxhZ3NcbiAgICAvLyBhcmUgcmVtb3ZlZCBpbiB0aGUgU0FNRSBwYXRjaC4gQSBuby1vcCBvdXRjb21lIGNvbW1pdHMgbm90aGluZyBhdCBhbGwg4oCUXG4gICAgLy8gcGVyLWZpZWxkIGNvbW1pdHMgaGVyZSBwcmV2aW91c2x5IG1hZGUgc3VibWl0LXRpbWUgdmFsaWRhdGlvbiBzd2VlcCBldmVyeVxuICAgIC8vIHN1YnNjcmliZXIgTyhmaWVsZHMpIHRpbWVzLlxuICAgIGNvbnN0IGNvbW1pdFJ1bGVPdXRjb21lcyA9IHVzZU1lbW9pemVkRm4oKG91dGNvbWVzLCBjbGVhclZhbGlkYXRpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgZXJyb3JzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgd2FybmluZ3NDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG5ld0Vycm9ycyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmVycm9ycyk7XG4gICAgICAgIGNvbnN0IG5ld1dhcm5pbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUud2FybmluZ3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHsgbmFtZSwgZXJyb3IsIHdhcm5pbmcgfSBvZiBvdXRjb21lcykge1xuICAgICAgICAgICAgaWYgKGVycm9yID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgaW4gbmV3RXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdFcnJvcnNbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGVycm9yc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5ld0Vycm9yc1tuYW1lXSAhPT0gZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBuZXdFcnJvcnNbbmFtZV0gPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBlcnJvcnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3YXJuaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgaW4gbmV3V2FybmluZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5ld1dhcm5pbmdzW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5ld1dhcm5pbmdzW25hbWVdICE9PSB3YXJuaW5nKSB7XG4gICAgICAgICAgICAgICAgbmV3V2FybmluZ3NbbmFtZV0gPSB3YXJuaW5nO1xuICAgICAgICAgICAgICAgIHdhcm5pbmdzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmxhZ3NUb0NsZWFyID0gY2xlYXJWYWxpZGF0aW5nLmZpbHRlcigobmFtZSkgPT4gbmFtZSBpbiBzdGF0ZS52YWxpZGF0aW5nKTtcbiAgICAgICAgY29uc3QgcGF0Y2ggPSB7fTtcbiAgICAgICAgaWYgKGVycm9yc0NoYW5nZWQpXG4gICAgICAgICAgICBwYXRjaC5lcnJvcnMgPSBuZXdFcnJvcnM7XG4gICAgICAgIGlmICh3YXJuaW5nc0NoYW5nZWQpXG4gICAgICAgICAgICBwYXRjaC53YXJuaW5ncyA9IG5ld1dhcm5pbmdzO1xuICAgICAgICBpZiAoZmxhZ3NUb0NsZWFyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbGlkYXRpbmcgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS52YWxpZGF0aW5nKTtcbiAgICAgICAgICAgIGZsYWdzVG9DbGVhci5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld1ZhbGlkYXRpbmdbbmFtZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhdGNoLnZhbGlkYXRpbmcgPSBuZXdWYWxpZGF0aW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHBhdGNoKTtcbiAgICB9KTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBBc3luYyBmaWVsZCB2YWxpZGF0aW9uIOKAkyBlYWNoIHJ1bGUgaXMgcHJvY2Vzc2VkIGV4YWN0bHkgb25jZVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IHZhbGlkYXRlRmllbGRBc3luYyA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIHZhbHVlLCBydWxlcykgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghcnVsZXMgfHwgcnVsZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgY29uc3QgZmxhZ2dlZCA9IGhhc0N1c3RvbVZhbGlkYXRvcihydWxlcykgPyBbbmFtZV0gOiBbXTtcbiAgICAgICAgbWFya1ZhbGlkYXRpbmcoZmxhZ2dlZCk7XG4gICAgICAgIGxldCBvdXRjb21lID0geyBuYW1lLCBlcnJvcjogbnVsbCwgd2FybmluZzogbnVsbCB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBlcnJvciwgd2FybmluZyB9ID0geWllbGQgcnVuUnVsZXNBc3luYyhuYW1lLCB2YWx1ZSwgZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKSwgcnVsZXMpO1xuICAgICAgICAgICAgb3V0Y29tZSA9IHsgbmFtZSwgZXJyb3IsIHdhcm5pbmcgfTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNvbW1pdFJ1bGVPdXRjb21lcyhbb3V0Y29tZV0sIGZsYWdnZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IG91dGNvbWUuZXJyb3IgPT09IG51bGwsIGVycm9yOiBvdXRjb21lLmVycm9yIH07XG4gICAgfSkpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEFzeW5jIGZpZWxkIGJsdXIgaGFuZGxlclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGhhbmRsZUZpZWxkQmx1ciA9IHVzZUV2ZW50Q2FsbGJhY2soKG5hbWUpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB0b3VjaGVkID0gc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkO1xuICAgICAgICBpZiAoIXRvdWNoZWRbbmFtZV0pIHtcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdG91Y2hlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0b3VjaGVkKSwgeyBbbmFtZV06IHRydWUgfSkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZXMgPSBmb3JtQ29yZS5nZXRGaWVsZFJ1bGVzKG5hbWUpO1xuICAgICAgICBpZiAocnVsZXMgJiYgdmFsaWRhdGVUcmlnZ2VyID09PSAnb25CbHVyJykge1xuICAgICAgICAgICAgeWllbGQgdmFsaWRhdGVGaWVsZEFzeW5jKG5hbWUsIHJlc29sdmVWYWx1ZShmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCBuYW1lKSwgcnVsZXMpO1xuICAgICAgICB9XG4gICAgfSkpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFZhbGlkYXRlIGFsbCBmaWVsZHMgYXN5bmNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCB2YWxpZGF0ZUZpZWxkc0FzeW5jID0gdXNlTWVtb2l6ZWRGbigobmFtZUxpc3QpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBmaWVsZHNUb1ZhbGlkYXRlID0gbmFtZUxpc3QgfHwgT2JqZWN0LmtleXMoZm9ybUNvcmUuZmllbGRSdWxlcyk7XG4gICAgICAgIGNvbnN0IGZpZWxkRXJyb3JzID0ge307XG4gICAgICAgIC8vIE9uZSBjb21taXQgdG8gcmFpc2UgdGhlIHZhbGlkYXRpbmcgZmxhZ3MgKHZhbGlkYXRvci1iZWFyaW5nIGZpZWxkc1xuICAgICAgICAvLyBvbmx5KSwgb25lIGNvbW1pdCB0byBsYW5kIGV2ZXJ5IGVycm9yL3dhcm5pbmcgYW5kIGNsZWFyIHRoZSBmbGFncy5cbiAgICAgICAgY29uc3QgZmxhZ2dlZCA9IGZpZWxkc1RvVmFsaWRhdGUuZmlsdGVyKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBydWxlcyA9IGZvcm1Db3JlLmZpZWxkUnVsZXNbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gcnVsZXMgPyBoYXNDdXN0b21WYWxpZGF0b3IocnVsZXMpIDogZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBtYXJrVmFsaWRhdGluZyhmbGFnZ2VkKTtcbiAgICAgICAgY29uc3Qgb3V0Y29tZXMgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHlpZWxkIFByb21pc2UuYWxsKGZpZWxkc1RvVmFsaWRhdGUubWFwKChuYW1lKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBydWxlcyA9IGZvcm1Db3JlLmZpZWxkUnVsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKCFydWxlcylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IsIHdhcm5pbmcgfSA9IHlpZWxkIHJ1blJ1bGVzQXN5bmMobmFtZSwgcmVzb2x2ZVZhbHVlKGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlKCksIG5hbWUpLCBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCBydWxlcyk7XG4gICAgICAgICAgICAgICAgb3V0Y29tZXMucHVzaCh7IG5hbWUsIGVycm9yLCB3YXJuaW5nIH0pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZEVycm9yc1tuYW1lXSA9IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBjb21taXRSdWxlT3V0Y29tZXMob3V0Y29tZXMsIGZsYWdnZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhmaWVsZEVycm9ycykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ1ZhbGlkYXRpb24gZmFpbGVkJyk7XG4gICAgICAgICAgICBlcnJvci52YWx1ZXMgPSBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpO1xuICAgICAgICAgICAgZXJyb3IuZXJyb3JzID0gZmllbGRFcnJvcnM7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZUxpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBuYW1lTGlzdC5yZWR1Y2UoKGFjYywgbmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGFjY1tuYW1lXSA9IHJlc29sdmVWYWx1ZShmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCBuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpO1xuICAgIH0pKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBkZWZpbmVGaWVsZCDigJMgdXNlZCBieSBzdGFuZGFsb25lIChub24tUHJvRm9ybSkgY29uc3VtZXJzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3QgZGVmaW5lRmllbGQgPSB1c2VNZW1vaXplZEZuKChuYW1lLCBmaWVsZE9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCB7IHJ1bGVzID0gW10gfSA9IGZpZWxkT3B0aW9ucztcbiAgICAgICAgY29uc3QgRmllbGRDb21wb25lbnQgPSBtZW1vKChfYSkgPT4ge1xuICAgICAgICAgICAgdmFyIHsgY2hpbGRyZW4sIHJlbmRlciB9ID0gX2EsIHByb3BzID0gX19yZXN0KF9hLCBbXCJjaGlsZHJlblwiLCBcInJlbmRlclwiXSk7XG4gICAgICAgICAgICAvLyBQZXItZmllbGQgc3RvcmUgc3Vic2NyaXB0aW9uOiB0aGlzIGZpZWxkIHJlLXJlbmRlcnMgb25seSB3aGVuIGl0c1xuICAgICAgICAgICAgLy8gb3duIHZhbHVlL2Vycm9yL3RvdWNoZWQvdmFsaWRhdGluZyBzbGljZSBjaGFuZ2VzLlxuICAgICAgICAgICAgY29uc3QgW2ZpZWxkVmFsdWUsIGZpZWxkRXJyb3IsIGZpZWxkVG91Y2hlZCwgZmllbGRWYWxpZGF0aW5nXSA9IHVzZVN0b3JlU2VsZWN0b3Ioc3RvcmUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSBzdGF0ZS52YWx1ZXNbbmFtZV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcnNbbmFtZV0sXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnRvdWNoZWRbbmFtZV0sXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhbGlkYXRpbmdbbmFtZV0sXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0sIHNoYWxsb3dFcXVhbEFycmF5cyk7XG4gICAgICAgICAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUnVsZXMgPSBmb3JtQ29yZS5nZXRGaWVsZFJ1bGVzKG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmdSdWxlcyAmJiBydWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db3JlLnJlZ2lzdGVyRmllbGQobmFtZSwgcnVsZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3JtQ29yZS51bnJlZ2lzdGVyRmllbGQobmFtZSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sIFtdKTsgLy8gT25seSByZWdpc3RlciBvbiBtb3VudFxuICAgICAgICAgICAgY29uc3QgaGFuZGxlRmllbGRDaGFuZ2UgPSB1c2VFdmVudENhbGxiYWNrKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGZvcm1Db3JlLnNldEZpZWxkVmFsdWUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZVRyaWdnZXIgPT09ICdvbkNoYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvcmUudmFsaWRhdGVGaWVsZChuYW1lLCBydWxlcywgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlQmx1ciA9IHVzZUV2ZW50Q2FsbGJhY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZUZpZWxkQmx1cihuYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZmllbGRQcm9wcyA9IE9iamVjdC5hc3NpZ24oeyBuYW1lLCB2YWx1ZTogZmllbGRWYWx1ZSwgZXJyb3I6IGZpZWxkRXJyb3IsIHRvdWNoZWQ6IGZpZWxkVG91Y2hlZCwgdmFsaWRhdGluZzogZmllbGRWYWxpZGF0aW5nLCBvbkNoYW5nZTogaGFuZGxlRmllbGRDaGFuZ2UsIG9uQmx1cjogaGFuZGxlQmx1ciB9LCBwcm9wcyk7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVNZXJnZUNoYW5nZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZSAmJiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgJ3RhcmdldCcgaW4gZVxuICAgICAgICAgICAgICAgICAgICA/IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogZTtcbiAgICAgICAgICAgICAgICBoYW5kbGVGaWVsZENoYW5nZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSAmJlxuICAgICAgICAgICAgICAgICAgICAoKF9hID0gY2hpbGRyZW4ucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkNoYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHJvcHMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVNZXJnZUJsdXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGhhbmRsZUJsdXIoKTtcbiAgICAgICAgICAgICAgICBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pICYmXG4gICAgICAgICAgICAgICAgICAgICgoX2EgPSBjaGlsZHJlbi5wcm9wcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uQmx1cikpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHJvcHMub25CbHVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChyZW5kZXIgJiYgdHlwZW9mIHJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXIoZmllbGRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKGZpZWxkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmaWVsZFByb3BzKSwgeyBvbkNoYW5nZTogaGFuZGxlTWVyZ2VDaGFuZ2UsIG9uQmx1cjogaGFuZGxlTWVyZ2VCbHVyIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIG1lcmdlZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCAuLi5jaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZmllbGRQcm9wcyksIHsga2V5OiBjaGlsZC5rZXkgfHwgaW5kZXgsIG9uQ2hhbmdlOiBoYW5kbGVNZXJnZUNoYW5nZSwgb25CbHVyOiBoYW5kbGVNZXJnZUJsdXIgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCBtZXJnZWRQcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgICAgRmllbGRDb21wb25lbnQuZGlzcGxheU5hbWUgPSBgRmllbGQoJHtuYW1lfSlgO1xuICAgICAgICByZXR1cm4gRmllbGRDb21wb25lbnQ7XG4gICAgfSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gaGFuZGxlU3VibWl0IC8gaGFuZGxlUmVzZXQg4oCTIGZvciA8Zm9ybT4gZXZlbnQgaGFuZGxlcnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBoYW5kbGVTdWJtaXQgPSB1c2VFdmVudENhbGxiYWNrKChlKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRWYWx1ZXMgPSB5aWVsZCB2YWxpZGF0ZUZpZWxkc0FzeW5jKCk7XG4gICAgICAgICAgICBvbkZpbmlzaCA9PT0gbnVsbCB8fCBvbkZpbmlzaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25GaW5pc2godmFsaWRhdGVkVmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZCA9IGVycjtcbiAgICAgICAgICAgIG9uRmluaXNoRmFpbGVkID09PSBudWxsIHx8IG9uRmluaXNoRmFpbGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZpbmlzaEZhaWxlZCh7IHZhbHVlczogdHlwZWQudmFsdWVzLCBlcnJvcnM6IHR5cGVkLmVycm9ycyB9KTtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCBoYW5kbGVSZXNldCA9IHVzZUV2ZW50Q2FsbGJhY2soKGUpID0+IHtcbiAgICAgICAgZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGZvcm1Db3JlLnJlc2V0RmllbGRzKCk7XG4gICAgICAgIG9uUmVzZXQgPT09IG51bGwgfHwgb25SZXNldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25SZXNldCgpO1xuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEZvcm1JbnN0YW5jZSDigJMgZW5oYW5jZWQgQVBJIGZvciBjb25zdW1lcnMuXG4gICAgLy9cbiAgICAvLyBFdmVyeSBtZXRob2QgaXMgd3JhcHBlZCBpbiB1c2VNZW1vaXplZEZuIChzdGFibGUgaWRlbnRpdHksIGFsd2F5cyByZWFkcyB0aGVcbiAgICAvLyBsYXRlc3Qgc3RvcmUgc3RhdGUpIHNvIHRoZSBpbnN0YW5jZSBvYmplY3QgaXRzZWxmIGlzIElERU5USVRZLVNUQUJMRSBmb3JcbiAgICAvLyB0aGUgbGlmZXRpbWUgb2YgdGhlIGZvcm0g4oCUIHRoaXMgaXMgd2hhdCBsZXRzIFByb0Zvcm0gcHVibGlzaCBpdCB0aHJvdWdoIHRoZVxuICAgIC8vIHN0YWJsZSBjb250ZXh0IHdpdGhvdXQgcmUtcmVuZGVyaW5nIHN1YnNjcmliZXJzIG9uIGVhY2gga2V5c3Ryb2tlLlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGdldEZpZWxkRXJyb3IgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLmVycm9yc1tuYW1lXSk7XG4gICAgY29uc3QgZ2V0RmllbGRXYXJuaW5nID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4gc3RvcmUuZ2V0U3RhdGUoKS53YXJuaW5nc1tuYW1lXSk7XG4gICAgY29uc3QgZ2V0RmllbGRzRXJyb3IgPSB1c2VNZW1vaXplZEZuKChuYW1lTGlzdCkgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSBzdG9yZS5nZXRTdGF0ZSgpLmVycm9ycztcbiAgICAgICAgaWYgKCFuYW1lTGlzdClcbiAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBuYW1lTGlzdC5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3JzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gZXJyb3JzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgICBjb25zdCBpc0ZpZWxkVG91Y2hlZCA9IHVzZU1lbW9pemVkRm4oKG5hbWUpID0+IHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZFtuYW1lXSB8fCBmYWxzZSk7XG4gICAgY29uc3QgaXNGaWVsZHNUb3VjaGVkID0gdXNlTWVtb2l6ZWRGbigobmFtZUxpc3QsIGFsbEZpZWxkc1RvdWNoZWQgPSBmYWxzZSkgPT4ge1xuICAgICAgICBjb25zdCB0b3VjaGVkID0gc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkO1xuICAgICAgICBpZiAoIW5hbWVMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModG91Y2hlZCkuc29tZSgoa2V5KSA9PiB0b3VjaGVkW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxGaWVsZHNUb3VjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmFtZUxpc3QuZXZlcnkoKG5hbWUpID0+IHRvdWNoZWRbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lTGlzdC5zb21lKChuYW1lKSA9PiB0b3VjaGVkW25hbWVdKTtcbiAgICB9KTtcbiAgICBjb25zdCBpc0ZpZWxkVmFsaWRhdGluZyA9IHVzZU1lbW9pemVkRm4oKG5hbWUpID0+IHN0b3JlLmdldFN0YXRlKCkudmFsaWRhdGluZ1tuYW1lXSB8fCBmYWxzZSk7XG4gICAgY29uc3Qgc2V0RmllbGRzRXJyb3IgPSB1c2VNZW1vaXplZEZuKChmaWVsZHNFcnJvcikgPT4ge1xuICAgICAgICBPYmplY3QuZW50cmllcyhmaWVsZHNFcnJvcikuZm9yRWFjaCgoW25hbWUsIGVycm9yXSkgPT4ge1xuICAgICAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRFcnJvcihuYW1lLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldEZpZWxkVG91Y2hlZCA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIGlzVG91Y2hlZCA9IHRydWUpID0+IHtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB0b3VjaGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZCksIHsgW25hbWVdOiBpc1RvdWNoZWQgfSkgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2V0RmllbGRzVG91Y2hlZCA9IHVzZU1lbW9pemVkRm4oKGZpZWxkc1RvdWNoKSA9PiB7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdG91Y2hlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdG9yZS5nZXRTdGF0ZSgpLnRvdWNoZWQpLCBmaWVsZHNUb3VjaCkgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgcmVzZXRGb3JtRmllbGRzID0gdXNlTWVtb2l6ZWRGbigoZmllbGRzKSA9PiB7XG4gICAgICAgIGlmICghZmllbGRzKSB7XG4gICAgICAgICAgICBmb3JtQ29yZS5yZXNldEZpZWxkcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVzZXRWYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE1vdW50LWZyb3plbiBpbml0aWFsVmFsdWVzIOKAlCBjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgcmVzZXRGaWVsZHMuXG4gICAgICAgICAgICAgICAgcmVzZXRWYWx1ZXNbZmllbGRdID0gZm9ybUNvcmUuZ2V0SW5pdGlhbFZhbHVlcygpW2ZpZWxkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRzVmFsdWUocmVzZXRWYWx1ZXMpO1xuICAgICAgICAgICAgY29uc3QgeyB0b3VjaGVkLCB2YWxpZGF0aW5nIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgbmV3VG91Y2hlZCA9IE9iamVjdC5hc3NpZ24oe30sIHRvdWNoZWQpO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsaWRhdGluZyA9IE9iamVjdC5hc3NpZ24oe30sIHZhbGlkYXRpbmcpO1xuICAgICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld1RvdWNoZWRbZmllbGRdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdWYWxpZGF0aW5nW2ZpZWxkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB0b3VjaGVkOiBuZXdUb3VjaGVkLCB2YWxpZGF0aW5nOiBuZXdWYWxpZGF0aW5nIH0pO1xuICAgICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRFcnJvcihmaWVsZCwgbnVsbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHN1Ym1pdFdpdGhWYWxpZGF0aW9uID0gdXNlTWVtb2l6ZWRGbigoY2FsbGJhY2spID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVkVmFsdWVzID0geWllbGQgdmFsaWRhdGVGaWVsZHNBc3luYygpO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgY2FsbGJhY2sodmFsaWRhdGVkVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZWRWYWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfSkpO1xuICAgIGNvbnN0IGZvcm1JbnN0YW5jZSA9IHVzZU1lbW8oKCkgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZm9ybUNvcmUuZm9ybUluc3RhbmNlKSwgeyB2YWxpZGF0ZUZpZWxkczogdmFsaWRhdGVGaWVsZHNBc3luYywgc2V0RmllbGRWYWx1ZTogZm9ybUNvcmUuc2V0RmllbGRWYWx1ZSwgZ2V0RmllbGRFcnJvcixcbiAgICAgICAgZ2V0RmllbGRXYXJuaW5nLFxuICAgICAgICBnZXRGaWVsZHNFcnJvcixcbiAgICAgICAgaXNGaWVsZFRvdWNoZWQsXG4gICAgICAgIGlzRmllbGRzVG91Y2hlZCxcbiAgICAgICAgaXNGaWVsZFZhbGlkYXRpbmcsIHNldEZpZWxkRXJyb3I6IGZvcm1Db3JlLnNldEZpZWxkRXJyb3IsIHNldEZpZWxkc0Vycm9yLFxuICAgICAgICBzZXRGaWVsZFRvdWNoZWQsXG4gICAgICAgIHNldEZpZWxkc1RvdWNoZWQsIHJlc2V0RmllbGRzOiByZXNldEZvcm1GaWVsZHMsIHN1Ym1pdDogc3VibWl0V2l0aFZhbGlkYXRpb24sIGRlZmluZUZpZWxkLCByZWdpc3RlckZpZWxkOiBmb3JtQ29yZS5yZWdpc3RlckZpZWxkLCB1bnJlZ2lzdGVyRmllbGQ6IGZvcm1Db3JlLnVucmVnaXN0ZXJGaWVsZCB9KSksIFtcbiAgICAgICAgZm9ybUNvcmUuZm9ybUluc3RhbmNlLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZEVycm9yLFxuICAgICAgICBmb3JtQ29yZS5yZWdpc3RlckZpZWxkLFxuICAgICAgICBmb3JtQ29yZS51bnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIHZhbGlkYXRlRmllbGRzQXN5bmMsXG4gICAgICAgIGdldEZpZWxkRXJyb3IsXG4gICAgICAgIGdldEZpZWxkV2FybmluZyxcbiAgICAgICAgZ2V0RmllbGRzRXJyb3IsXG4gICAgICAgIGlzRmllbGRUb3VjaGVkLFxuICAgICAgICBpc0ZpZWxkc1RvdWNoZWQsXG4gICAgICAgIGlzRmllbGRWYWxpZGF0aW5nLFxuICAgICAgICBzZXRGaWVsZHNFcnJvcixcbiAgICAgICAgc2V0RmllbGRUb3VjaGVkLFxuICAgICAgICBzZXRGaWVsZHNUb3VjaGVkLFxuICAgICAgICByZXNldEZvcm1GaWVsZHMsXG4gICAgICAgIHN1Ym1pdFdpdGhWYWxpZGF0aW9uLFxuICAgICAgICBkZWZpbmVGaWVsZCxcbiAgICBdKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBJbnRlcm5hbHMg4oCTIGV4cG9zZWQgZm9yIFByb0Zvcm0gaW50ZWdyYXRpb24uIERhdGEgZmllbGRzIGFyZSBHRVRURVJTIHRoYXRcbiAgICAvLyByZWFkIHRoZSBsaXZlIHN0b3JlLCBzbyB0aGUgb2JqZWN0IGlzIGlkZW50aXR5LXN0YWJsZSB5ZXQgbmV2ZXIgc3RhbGUuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3QgaW50ZXJuYWxzID0gdXNlTWVtbygoKSA9PiAoe1xuICAgICAgICBnZXQgdmFsdWVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkudmFsdWVzO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgZXJyb3JzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkuZXJyb3JzO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgd2FybmluZ3MoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuZ2V0U3RhdGUoKS53YXJuaW5ncztcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHRvdWNoZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgdmFsaWRhdGluZygpIHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5nZXRTdGF0ZSgpLnZhbGlkYXRpbmc7XG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkUnVsZXM6IGZvcm1Db3JlLmZpZWxkUnVsZXMsXG4gICAgICAgIHNldEZpZWxkVmFsdWU6IGZvcm1Db3JlLnNldEZpZWxkVmFsdWUsXG4gICAgICAgIHNldEZpZWxkRXJyb3I6IGZvcm1Db3JlLnNldEZpZWxkRXJyb3IsXG4gICAgICAgIHNldEZpZWxkV2FybmluZzogZm9ybUNvcmUuc2V0RmllbGRXYXJuaW5nLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkOiBmb3JtQ29yZS52YWxpZGF0ZUZpZWxkLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkQXN5bmMsXG4gICAgICAgIHJlZ2lzdGVyRmllbGQ6IGZvcm1Db3JlLnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIHVucmVnaXN0ZXJGaWVsZDogZm9ybUNvcmUudW5yZWdpc3RlckZpZWxkLFxuICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgIGhhbmRsZVJlc2V0LFxuICAgIH0pLCBbXG4gICAgICAgIHN0b3JlLFxuICAgICAgICBmb3JtQ29yZS5maWVsZFJ1bGVzLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZEVycm9yLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZFdhcm5pbmcsXG4gICAgICAgIGZvcm1Db3JlLnZhbGlkYXRlRmllbGQsXG4gICAgICAgIHZhbGlkYXRlRmllbGRBc3luYyxcbiAgICAgICAgZm9ybUNvcmUucmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgZm9ybUNvcmUudW5yZWdpc3RlckZpZWxkLFxuICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgIGhhbmRsZVJlc2V0LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGZvcm1JbnN0YW5jZSwgaW50ZXJuYWxzLCBzdG9yZSB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZUZvcm07IixudWxsXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYyJ9
774
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL2hvb2tzL3VzZUZvcm0uanMiLCJjb21wb25lbnRzL1Byb0Zvcm0vY29yZS9zcmMvY29tcG9uZW50cy9Qcm9Gb3JtL2NvcmUvaG9va3MvdXNlRm9ybS50cyJdLCJuYW1lcyI6WyJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsInZhbHVlIiwicmVzb2x2ZSIsIlByb21pc2UiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJfX3Jlc3QiLCJzIiwidCIsInAiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpbmRleE9mIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiaSIsImxlbmd0aCIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwidXNlTWVtbyIsInVzZUVmZmVjdCIsInVzZVJlZiIsIm1lbW8iLCJGcmFnbWVudCIsIlJlYWN0IiwidXNlRXZlbnRDYWxsYmFjayIsInVzZU1lbW9pemVkRm4iLCJ1c2VGb3JtQ29yZSIsInJlc29sdmVWYWx1ZSIsInNldE5lc3RlZFZhbHVlIiwiY29lcmNlRmFpbHVyZVJlYXNvbiIsImZpbHRlclJ1bGVzQnlUcmlnZ2VyIiwibm9ybWFsaXplVHJpZ2dlcnMiLCJyZXNvbHZlUnVsZXMiLCJydW5SdWxlc0FzeW5jIiwidXNlU3RvcmVTZWxlY3RvciIsInNoYWxsb3dFcXVhbEFycmF5cyIsInNhbWVWYWxpZGF0aW9uTm9kZSIsIkZvcm1WYWxpZGF0aW9uRXJyb3IiLCJoYXNSZXNvbHZlZFZhbGlkYXRvciIsInJlc29sdmVkIiwic29tZSIsInJ1bGUiLCJ2YWxpZGF0b3IiLCJ1c2VGb3JtIiwiY29uZmlnIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwib25GaW5pc2giLCJvbkZpbmlzaEZhaWxlZCIsIm9uUmVzZXQiLCJfY29uZmlnJHZhbGlkYXRlVHJpZ2ciLCJ2YWxpZGF0ZVRyaWdnZXIiLCJmb3JtQ29yZSIsInN0b3JlIiwibGFzdEFzeW5jRXBvY2hSZWYiLCJtYXJrVmFsaWRhdGluZyIsIm5hbWVzIiwiYXNzaWduIiwiZ2V0U3RhdGUiLCJ2YWxpZGF0aW5nIiwiZm9yRWFjaCIsIm5hbWUiLCJzZXRTdGF0ZSIsImNvbW1pdFJ1bGVPdXRjb21lcyIsIm91dGNvbWVzIiwiY2xlYXJWYWxpZGF0aW5nIiwic3RhdGUiLCJlcnJvcnNDaGFuZ2VkIiwid2FybmluZ3NDaGFuZ2VkIiwibmV3RXJyb3JzIiwiZXJyb3JzIiwibmV3V2FybmluZ3MiLCJ3YXJuaW5ncyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJuIiwiX3N0ZXAkdmFsdWUiLCJlcnJvciIsIndhcm5pbmciLCJlcnIiLCJmIiwiZmxhZ3NUb0NsZWFyIiwiZmlsdGVyIiwicGF0Y2giLCJuZXdWYWxpZGF0aW5nIiwia2V5cyIsInZhbGlkYXRlRmllbGRBc3luYyIsInJ1bGVzIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiX2EiLCJlcG9jaCIsInZhbHVlcyIsImZsYWdnZWQiLCJvdXRjb21lIiwiX3lpZWxkJHJ1blJ1bGVzQXN5bmMiLCJpc0N1cnJlbnQiLCJjbGVhckZsYWdzIiwiX3QiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwiYWJydXB0IiwiaXNWYWxpZCIsImJlZ2luVmFsaWRhdGlvblJ1biIsImdldEZpZWxkc1ZhbHVlIiwiZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSIsImZsYWdnZWROYW1lIiwiY3VycmVudCIsInNlbnQiLCJpc1ZhbGlkYXRpb25SdW5DdXJyZW50IiwiZmluaXNoIiwic3RvcCIsImhhbmRsZUZpZWxkQmx1ciIsImZpZWxkVHJpZ2dlciIsIl9jYWxsZWUyIiwidG91Y2hlZCIsImFwcGxpY2FibGUiLCJfY29udGV4dDIiLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRGaWVsZFJ1bGVzIiwidmFsaWRhdGVGaWVsZHNBc3luYyIsIm5hbWVMaXN0IiwiX2NhbGxlZTQiLCJmaWVsZHNUb1ZhbGlkYXRlIiwiZmllbGRFcnJvcnMiLCJyZXNvbHZlZEJ5RmllbGQiLCJlcG9jaEJ5RmllbGQiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiX2NvbnRleHQ0IiwiZmllbGRSdWxlcyIsIk1hcCIsInNldCIsImdldCIsImFsbCIsIm1hcCIsIl9jYWxsZWUzIiwiX3lpZWxkJHJ1blJ1bGVzQXN5bmMyIiwiX3QyIiwiX2NvbnRleHQzIiwicHVzaCIsInJlZHVjZSIsImFjYyIsImRlZmluZUZpZWxkIiwiZmllbGRPcHRpb25zIiwiX2ZpZWxkT3B0aW9ucyRydWxlcyIsIkZpZWxkQ29tcG9uZW50IiwiY2hpbGRyZW4iLCJyZW5kZXIiLCJwcm9wcyIsIl91c2VTdG9yZVNlbGVjdG9yIiwiX3VzZVN0b3JlU2VsZWN0b3IyIiwiX3NsaWNlZFRvQXJyYXkiLCJmaWVsZFZhbHVlIiwiZmllbGRFcnJvciIsImZpZWxkVG91Y2hlZCIsImZpZWxkVmFsaWRhdGluZyIsInJldGFpbkZpZWxkIiwiZXhpc3RpbmdSdWxlcyIsInJlZ2lzdGVyRmllbGQiLCJyZWxlYXNlRmllbGQiLCJoYW5kbGVGaWVsZENoYW5nZSIsInNldEZpZWxkVmFsdWUiLCJ2YWxpZGF0ZUZpZWxkIiwiaGFuZGxlQmx1ciIsImZpZWxkUHJvcHMiLCJvbkNoYW5nZSIsIm9uQmx1ciIsImhhbmRsZU1lcmdlQ2hhbmdlIiwiX3R5cGVvZiIsInRhcmdldCIsImlzVmFsaWRFbGVtZW50IiwiaGFuZGxlTWVyZ2VCbHVyIiwiZG9tU2FmZVByb3BzIiwiY2xvbmVFbGVtZW50IiwiQXJyYXkiLCJpc0FycmF5IiwiY3JlYXRlRWxlbWVudCIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheSIsImNoaWxkIiwiaW5kZXgiLCJrZXkiLCJkaXNwbGF5TmFtZSIsImhhbmRsZVN1Ym1pdCIsIl9jYWxsZWU1IiwidmFsaWRhdGVkVmFsdWVzIiwiX3QzIiwiX2NvbnRleHQ1IiwicHJldmVudERlZmF1bHQiLCJjb25zb2xlIiwiaGFuZGxlUmVzZXQiLCJyZXNldEZpZWxkcyIsImdldEZpZWxkRXJyb3IiLCJnZXRGaWVsZFdhcm5pbmciLCJnZXRGaWVsZHNFcnJvciIsImlzRmllbGRUb3VjaGVkIiwiaXNGaWVsZHNUb3VjaGVkIiwiYWxsRmllbGRzVG91Y2hlZCIsImV2ZXJ5IiwiaXNGaWVsZFZhbGlkYXRpbmciLCJzZXRGaWVsZHNFcnJvciIsImZpZWxkc0Vycm9yIiwiZW50cmllcyIsIl9yZWYiLCJfcmVmMiIsInNldEZpZWxkRXJyb3IiLCJzZXRGaWVsZFRvdWNoZWQiLCJpc1RvdWNoZWQiLCJzZXRGaWVsZHNUb3VjaGVkIiwiZmllbGRzVG91Y2giLCJyZXNldEZvcm1GaWVsZHMiLCJmaWVsZHMiLCJpbml0aWFsVmFsdWVzIiwiZ2V0SW5pdGlhbFZhbHVlcyIsIm5ld1ZhbHVlcyIsImZpZWxkIiwiaW5pdGlhbCIsImluY2x1ZGVzIiwiaW52YWxpZGF0ZVZhbGlkYXRpb25SdW5zIiwibmV3VG91Y2hlZCIsInN1Ym1pdFdpdGhWYWxpZGF0aW9uIiwiY2FsbGJhY2siLCJfY2FsbGVlNiIsIl90NCIsIl90NSIsIl9jb250ZXh0NiIsImZvcm1JbnN0YW5jZSIsInZhbGlkYXRlRmllbGRzIiwic3VibWl0IiwidW5yZWdpc3RlckZpZWxkIiwic2V0UnVsZUNvbnRleHRJbnN0YW5jZSIsImludGVybmFscyIsInNldEZpZWxkV2FybmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFJQSxTQUFTLEdBQUksSUFBSSxJQUFJLElBQUksQ0FBQ0EsU0FBUyxJQUFLLFVBQVVDLE9BQU8sRUFBRUMsVUFBVSxFQUFFQyxDQUFDLEVBQUVDLFNBQVMsRUFBRTtFQUNyRixTQUFTQyxLQUFLQSxDQUFDQyxLQUFLLEVBQUU7SUFBRSxPQUFPQSxLQUFLLFlBQVlILENBQUMsR0FBR0csS0FBSyxHQUFHLElBQUlILENBQUMsQ0FBQyxVQUFVSSxPQUFPLEVBQUU7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USxDQUFDNEcsV0FBVyxFQUNwQjVHLFFBQVEsQ0FBQytHLFlBQVksRUFDckJ3QixZQUFZLEVBQ1pPLFdBQVcsQ0FDWixDQUNGO0VBRUQsT0FBTztJQUFFb0MsWUFBWSxFQUFaQSxZQUFZO0lBQUVLLFNBQVMsRUFBVEEsU0FBUztJQUFFdEwsS0FBSyxFQUFMQTtFQUFLLENBQUU7QUFDM0MsQ0FBQztBQUVELGVBQWVWLE9BQU8iLCJmaWxlIjoiY29tcG9uZW50cy9Qcm9Gb3JtL2NvcmUvaG9va3MvdXNlRm9ybS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IHsgdXNlTWVtbywgdXNlRWZmZWN0LCB1c2VSZWYsIG1lbW8sIEZyYWdtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJ0AxbW9uZXkvaG9va3MvdXNlRXZlbnRDYWxsYmFjayc7XG5pbXBvcnQgdXNlTWVtb2l6ZWRGbiBmcm9tICdAMW1vbmV5L2hvb2tzL3VzZU1lbW9pemVkRm4nO1xuaW1wb3J0IHsgdXNlRm9ybUNvcmUgfSBmcm9tICcuL3VzZUZvcm1Db3JlJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSwgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICcuLi9wYXRoVXRpbHMnO1xuaW1wb3J0IHsgY29lcmNlRmFpbHVyZVJlYXNvbiwgZmlsdGVyUnVsZXNCeVRyaWdnZXIsIG5vcm1hbGl6ZVRyaWdnZXJzLCByZXNvbHZlUnVsZXMsIHJ1blJ1bGVzQXN5bmMsIH0gZnJvbSAnLi4vcnVuUnVsZXMnO1xuaW1wb3J0IHsgdXNlU3RvcmVTZWxlY3Rvciwgc2hhbGxvd0VxdWFsQXJyYXlzLCBzYW1lVmFsaWRhdGlvbk5vZGUgfSBmcm9tICcuLi9mb3JtU3RvcmUnO1xuaW1wb3J0IHsgRm9ybVZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4uL3ZhbGlkYXRpb25FcnJvcic7XG4vKipcbiAqIE9ubHkgcnVsZXMgd2l0aCBhIGN1c3RvbSBgdmFsaWRhdG9yYCBjYW4gYmUgZ2VudWluZWx5IGFzeW5jaHJvbm91cyDigJRcbiAqIGJ1aWx0aW4gcnVsZXMgcmVzb2x2ZSB3aXRoaW4gYSBtaWNyb3Rhc2ssIHNvIGZsaXBwaW5nIGB2YWxpZGF0aW5nYCBmb3JcbiAqIHRoZW0gd291bGQgb25seSBjaHVybiBzdWJzY3JpYmVycyB3aXRob3V0IGV2ZXIgYmVpbmcgdmlzaWJsZS4gRGVjaWRlZCBvblxuICogUkVTT0xWRUQgcnVsZXM6IGEgZnVuY3Rpb24tZm9ybSBydWxlIHRoYXQgcmVzb2x2ZXMgdG8gYnVpbHRpbi1vbmx5IGNoZWNrc1xuICogbXVzdCBub3QgZmxpY2tlciB0aGUgZmxhZy5cbiAqL1xuY29uc3QgaGFzUmVzb2x2ZWRWYWxpZGF0b3IgPSAocmVzb2x2ZWQpID0+IHJlc29sdmVkLnNvbWUoKHJ1bGUpID0+IHR5cGVvZiBydWxlLnZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJyk7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIHVzZUZvcm1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNvbnN0IHVzZUZvcm0gPSAoY29uZmlnID0ge30pID0+IHtcbiAgICBjb25zdCB7IG9uRmluaXNoLCBvbkZpbmlzaEZhaWxlZCwgb25SZXNldCwgdmFsaWRhdGVUcmlnZ2VyID0gJ29uQ2hhbmdlJywgfSA9IGNvbmZpZztcbiAgICBjb25zdCBmb3JtQ29yZSA9IHVzZUZvcm1Db3JlKGNvbmZpZyk7XG4gICAgY29uc3QgeyBzdG9yZSB9ID0gZm9ybUNvcmU7XG4gICAgLy8gRXBvY2ggb2YgdGhlIExBVEVTVCBhc3luYyBydW4gdGhhdCByYWlzZWQgZWFjaCBmaWVsZCdzIGB2YWxpZGF0aW5nYCBmbGFnLlxuICAgIC8vIEEgc2V0dGxpbmcgcnVuIGNsZWFycyB0aGUgZmxhZyBvbmx5IHdoaWxlIGl0IGlzIHN0aWxsIHRoZSBsYXRlc3QgcmFpc2VyIOKAlFxuICAgIC8vIGFuIG9sZGVyIHJ1biBtdXN0IG5vdCBibGFuayB0aGUgc3Bpbm5lciBvZiBhIG5ld2VyIG9uZSwgYW5kIGEgcnVuXG4gICAgLy8gc3VwZXJzZWRlZCBieSBhIFNZTkMgY29tbWl0ICh3aGljaCBuZXZlciB0b3VjaGVzIGZsYWdzKSBtdXN0IHN0aWxsIGNsZWFuXG4gICAgLy8gdXAgYWZ0ZXIgaXRzZWxmLlxuICAgIGNvbnN0IGxhc3RBc3luY0Vwb2NoUmVmID0gdXNlUmVmKHt9KTtcbiAgICAvLyBNYXJrIGZpZWxkcyBhcyB2YWxpZGF0aW5nIGluIE9ORSBjb21taXQuIHZhbGlkYXRpbmcgLyB0b3VjaGVkIGxpdmUgaW4gdGhlXG4gICAgLy8gc3RvcmUgYWxvbmdzaWRlIHZhbHVlcyDigJQgZmxpcHBpbmcgdGhlbSAoZS5nLiBhc3luYyB2YWxpZGF0aW9uIGFyb3VuZCBhXG4gICAgLy8gYmx1cikgbXVzdCBub3QgcmUtcmVuZGVyIHRoZSBmb3JtIHJvb3QsIG9ubHkgdGhlIGZpZWxkcyB0aGF0IHN1YnNjcmliZWQuXG4gICAgY29uc3QgbWFya1ZhbGlkYXRpbmcgPSB1c2VNZW1vaXplZEZuKChuYW1lcykgPT4ge1xuICAgICAgICBpZiAobmFtZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBuZXh0ID0gT2JqZWN0LmFzc2lnbih7fSwgc3RvcmUuZ2V0U3RhdGUoKS52YWxpZGF0aW5nKTtcbiAgICAgICAgbmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgbmV4dFtuYW1lXSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHZhbGlkYXRpbmc6IG5leHQgfSk7XG4gICAgfSk7XG4gICAgLy8gRm9sZCBwZXItZmllbGQgcnVsZSBvdXRjb21lcyBpbnRvIEFUIE1PU1Qgb25lIHN0b3JlIGNvbW1pdDogZXJyb3JzIGFuZFxuICAgIC8vIHdhcm5pbmdzIGFyZSBtZXJnZWQgb3ZlciB0aGUgY3VycmVudCBtYXBzIGFuZCB0aGUgYGNsZWFyVmFsaWRhdGluZ2AgZmxhZ3NcbiAgICAvLyBhcmUgcmVtb3ZlZCBpbiB0aGUgU0FNRSBwYXRjaC4gQSBuby1vcCBvdXRjb21lIGNvbW1pdHMgbm90aGluZyBhdCBhbGwg4oCUXG4gICAgLy8gcGVyLWZpZWxkIGNvbW1pdHMgaGVyZSBwcmV2aW91c2x5IG1hZGUgc3VibWl0LXRpbWUgdmFsaWRhdGlvbiBzd2VlcCBldmVyeVxuICAgIC8vIHN1YnNjcmliZXIgTyhmaWVsZHMpIHRpbWVzLlxuICAgIGNvbnN0IGNvbW1pdFJ1bGVPdXRjb21lcyA9IHVzZU1lbW9pemVkRm4oKG91dGNvbWVzLCBjbGVhclZhbGlkYXRpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgZXJyb3JzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgd2FybmluZ3NDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG5ld0Vycm9ycyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmVycm9ycyk7XG4gICAgICAgIGNvbnN0IG5ld1dhcm5pbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUud2FybmluZ3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHsgbmFtZSwgZXJyb3IsIHdhcm5pbmcgfSBvZiBvdXRjb21lcykge1xuICAgICAgICAgICAgaWYgKGVycm9yID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgaW4gbmV3RXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdFcnJvcnNbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGVycm9yc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFzYW1lVmFsaWRhdGlvbk5vZGUobmV3RXJyb3JzW25hbWVdLCBlcnJvcikpIHtcbiAgICAgICAgICAgICAgICBuZXdFcnJvcnNbbmFtZV0gPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBlcnJvcnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3YXJuaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgaW4gbmV3V2FybmluZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5ld1dhcm5pbmdzW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFzYW1lVmFsaWRhdGlvbk5vZGUobmV3V2FybmluZ3NbbmFtZV0sIHdhcm5pbmcpKSB7XG4gICAgICAgICAgICAgICAgbmV3V2FybmluZ3NbbmFtZV0gPSB3YXJuaW5nO1xuICAgICAgICAgICAgICAgIHdhcm5pbmdzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmxhZ3NUb0NsZWFyID0gY2xlYXJWYWxpZGF0aW5nLmZpbHRlcigobmFtZSkgPT4gbmFtZSBpbiBzdGF0ZS52YWxpZGF0aW5nKTtcbiAgICAgICAgY29uc3QgcGF0Y2ggPSB7fTtcbiAgICAgICAgaWYgKGVycm9yc0NoYW5nZWQpXG4gICAgICAgICAgICBwYXRjaC5lcnJvcnMgPSBuZXdFcnJvcnM7XG4gICAgICAgIGlmICh3YXJuaW5nc0NoYW5nZWQpXG4gICAgICAgICAgICBwYXRjaC53YXJuaW5ncyA9IG5ld1dhcm5pbmdzO1xuICAgICAgICBpZiAoZmxhZ3NUb0NsZWFyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbGlkYXRpbmcgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS52YWxpZGF0aW5nKTtcbiAgICAgICAgICAgIGZsYWdzVG9DbGVhci5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld1ZhbGlkYXRpbmdbbmFtZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhdGNoLnZhbGlkYXRpbmcgPSBuZXdWYWxpZGF0aW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHBhdGNoKTtcbiAgICB9KTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBBc3luYyBmaWVsZCB2YWxpZGF0aW9uIOKAkyBlYWNoIHJ1bGUgaXMgcHJvY2Vzc2VkIGV4YWN0bHkgb25jZVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IHZhbGlkYXRlRmllbGRBc3luYyA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIHZhbHVlLCBydWxlcykgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCFydWxlcyB8fCBydWxlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAvLyBDYXB0dXJlIHRoaXMgcnVuJ3MgZXBvY2g6IGlmIGEgTkVXRVIgcnVuIChzeW5jIG9yIGFzeW5jKSBzdGFydHMgZm9yXG4gICAgICAgIC8vIHRoZSBmaWVsZCBiZWZvcmUgdGhpcyBvbmUgc2V0dGxlcywgdGhlIG91dGNvbWUgYmVsb3cgaXMgc3RhbGUgYW5kIGlzXG4gICAgICAgIC8vIGRpc2NhcmRlZCBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIHRoZSBuZXdlciByZXN1bHQuXG4gICAgICAgIGNvbnN0IGVwb2NoID0gZm9ybUNvcmUuYmVnaW5WYWxpZGF0aW9uUnVuKG5hbWUpO1xuICAgICAgICAvLyBSZXNvbHZlIG9uY2U6IHRoZSBmbGFnIGRlY2lzaW9uIG5lZWRzIHJlc29sdmVkIHJ1bGVzLCBhbmQgcGFzc2luZyB0aGVcbiAgICAgICAgLy8gcmVzb2x2ZWQgYXJyYXkgb253YXJkIHNwYXJlcyB0aGUgZW5naW5lIGEgcmUtcmVzb2x1dGlvbi5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlUnVsZXMocnVsZXMsIHZhbHVlcywgZm9ybUNvcmUuZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSgpKTtcbiAgICAgICAgY29uc3QgZmxhZ2dlZCA9IGhhc1Jlc29sdmVkVmFsaWRhdG9yKHJlc29sdmVkKSA/IFtuYW1lXSA6IFtdO1xuICAgICAgICBtYXJrVmFsaWRhdGluZyhmbGFnZ2VkKTtcbiAgICAgICAgZmxhZ2dlZC5mb3JFYWNoKChmbGFnZ2VkTmFtZSkgPT4ge1xuICAgICAgICAgICAgbGFzdEFzeW5jRXBvY2hSZWYuY3VycmVudFtmbGFnZ2VkTmFtZV0gPSBlcG9jaDtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBvdXRjb21lID0geyBuYW1lLCBlcnJvcjogbnVsbCwgd2FybmluZzogbnVsbCB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBlcnJvciwgd2FybmluZyB9ID0geWllbGQgcnVuUnVsZXNBc3luYyhuYW1lLCB2YWx1ZSwgdmFsdWVzLCByZXNvbHZlZCwgZm9ybUNvcmUuZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSgpKTtcbiAgICAgICAgICAgIG91dGNvbWUgPSB7IG5hbWUsIGVycm9yLCB3YXJuaW5nIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gVGhlIGVuZ2luZSBjb250YWlucyBydWxlLWxldmVsIHRocm93cyBpdHNlbGY7IHRoaXMgaXMgYSBsYXN0LXJlc29ydFxuICAgICAgICAgICAgLy8gbmV0IHNvIGFuIHVuZXhwZWN0ZWQgZmFpbHVyZSBzdXJmYWNlcyBhcyBhIGZpZWxkIGVycm9yIGluc3RlYWQgb2ZcbiAgICAgICAgICAgIC8vIGxlYXZpbmcgdGhlIGZpZWxkIG1hcmtlZCB2YWxpZC5cbiAgICAgICAgICAgIG91dGNvbWUgPSB7IG5hbWUsIGVycm9yOiAoX2EgPSBjb2VyY2VGYWlsdXJlUmVhc29uKGVycikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdWYWxpZGF0aW9uIGZhaWxlZCcsIHdhcm5pbmc6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudCA9IGZvcm1Db3JlLmlzVmFsaWRhdGlvblJ1bkN1cnJlbnQobmFtZSwgZXBvY2gpO1xuICAgICAgICAgICAgY29uc3QgY2xlYXJGbGFncyA9IGZsYWdnZWQuZmlsdGVyKChmbGFnZ2VkTmFtZSkgPT4gbGFzdEFzeW5jRXBvY2hSZWYuY3VycmVudFtmbGFnZ2VkTmFtZV0gPT09IGVwb2NoKTtcbiAgICAgICAgICAgIGNvbW1pdFJ1bGVPdXRjb21lcyhpc0N1cnJlbnQgPyBbb3V0Y29tZV0gOiBbXSwgY2xlYXJGbGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIENBTExFUiBnZXRzIHRoaXMgcnVuJ3Mgb3duIHJlc3VsdCBlaXRoZXIgd2F5IChpdHMgcHJvbWlzZSBpc1xuICAgICAgICAvLyBhYm91dCB0aGUgdmFsdWUgaXQgd2FzIGFza2VkIHRvIHZhbGlkYXRlKTsgb25seSB0aGUgU1RPUkUgY29tbWl0IGlzXG4gICAgICAgIC8vIHN0YWxlbmVzcy1ndWFyZGVkLlxuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBvdXRjb21lLmVycm9yID09PSBudWxsLCBlcnJvcjogb3V0Y29tZS5lcnJvciB9O1xuICAgIH0pKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBBc3luYyBmaWVsZCBibHVyIGhhbmRsZXJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBoYW5kbGVGaWVsZEJsdXIgPSB1c2VFdmVudENhbGxiYWNrKChuYW1lLCBmaWVsZFRyaWdnZXIpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB0b3VjaGVkID0gc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkO1xuICAgICAgICBpZiAoIXRvdWNoZWRbbmFtZV0pIHtcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdG91Y2hlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0b3VjaGVkKSwgeyBbbmFtZV06IHRydWUgfSkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZXMgPSBmb3JtQ29yZS5nZXRGaWVsZFJ1bGVzKG5hbWUpO1xuICAgICAgICBpZiAoIXJ1bGVzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpO1xuICAgICAgICBjb25zdCBhcHBsaWNhYmxlID0gZmlsdGVyUnVsZXNCeVRyaWdnZXIocmVzb2x2ZVJ1bGVzKHJ1bGVzLCB2YWx1ZXMsIGZvcm1Db3JlLmdldFJ1bGVDb250ZXh0SW5zdGFuY2UoKSksICdvbkJsdXInLCBub3JtYWxpemVUcmlnZ2VycyhmaWVsZFRyaWdnZXIsIHZhbGlkYXRlVHJpZ2dlciksIG5hbWUpO1xuICAgICAgICBpZiAoYXBwbGljYWJsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB5aWVsZCB2YWxpZGF0ZUZpZWxkQXN5bmMobmFtZSwgcmVzb2x2ZVZhbHVlKHZhbHVlcywgbmFtZSksIGFwcGxpY2FibGUpO1xuICAgICAgICB9XG4gICAgfSkpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFZhbGlkYXRlIGFsbCBmaWVsZHMgYXN5bmNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCB2YWxpZGF0ZUZpZWxkc0FzeW5jID0gdXNlTWVtb2l6ZWRGbigobmFtZUxpc3QpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBmaWVsZHNUb1ZhbGlkYXRlID0gbmFtZUxpc3QgfHwgT2JqZWN0LmtleXMoZm9ybUNvcmUuZmllbGRSdWxlcyk7XG4gICAgICAgIGNvbnN0IGZpZWxkRXJyb3JzID0ge307XG4gICAgICAgIC8vIFJlc29sdmUgZXZlcnkgZmllbGQgb25jZSB1cCBmcm9udDogdGhlIGZsYWcgZGVjaXNpb24gbmVlZHMgcmVzb2x2ZWRcbiAgICAgICAgLy8gcnVsZXMsIGFuZCB0aGUgcmVzb2x2ZWQgYXJyYXlzIGFyZSByZXVzZWQgZm9yIHRoZSBhY3R1YWwgcnVucy4gRWFjaFxuICAgICAgICAvLyBmaWVsZCBhbHNvIGNhcHR1cmVzIGl0cyB2YWxpZGF0aW9uIGVwb2NoIOKAlCBhIGZpZWxkIHdob3NlIHZhbHVlXG4gICAgICAgIC8vIGNoYW5nZXMgbWlkLXN1Ym1pdCBnZXRzIGEgbmV3ZXIgcnVuLCBhbmQgdGhpcyBydW4ncyBzdGFsZSBvdXRjb21lXG4gICAgICAgIC8vIG11c3Qgbm90IG92ZXJ3cml0ZSBpdCBpbiB0aGUgc3RvcmUuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkQnlGaWVsZCA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgZXBvY2hCeUZpZWxkID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgZmllbGRzVG9WYWxpZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgcnVsZXMgPSBmb3JtQ29yZS5maWVsZFJ1bGVzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgZXBvY2hCeUZpZWxkLnNldChuYW1lLCBmb3JtQ29yZS5iZWdpblZhbGlkYXRpb25SdW4obmFtZSkpO1xuICAgICAgICAgICAgICAgIHJlc29sdmVkQnlGaWVsZC5zZXQobmFtZSwgcmVzb2x2ZVJ1bGVzKHJ1bGVzLCBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCBmb3JtQ29yZS5nZXRSdWxlQ29udGV4dEluc3RhbmNlKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPbmUgY29tbWl0IHRvIHJhaXNlIHRoZSB2YWxpZGF0aW5nIGZsYWdzICh2YWxpZGF0b3ItYmVhcmluZyBmaWVsZHNcbiAgICAgICAgLy8gb25seSksIG9uZSBjb21taXQgdG8gbGFuZCBldmVyeSBlcnJvci93YXJuaW5nIGFuZCBjbGVhciB0aGUgZmxhZ3MuXG4gICAgICAgIGNvbnN0IGZsYWdnZWQgPSBmaWVsZHNUb1ZhbGlkYXRlLmZpbHRlcigobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlZEJ5RmllbGQuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkID8gaGFzUmVzb2x2ZWRWYWxpZGF0b3IocmVzb2x2ZWQpIDogZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBtYXJrVmFsaWRhdGluZyhmbGFnZ2VkKTtcbiAgICAgICAgZmxhZ2dlZC5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBsYXN0QXN5bmNFcG9jaFJlZi5jdXJyZW50W25hbWVdID0gZXBvY2hCeUZpZWxkLmdldChuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG91dGNvbWVzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB5aWVsZCBQcm9taXNlLmFsbChmaWVsZHNUb1ZhbGlkYXRlLm1hcCgobmFtZSkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZWRCeUZpZWxkLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgd2FybmluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgKHsgZXJyb3IsIHdhcm5pbmcgfSA9IHlpZWxkIHJ1blJ1bGVzQXN5bmMobmFtZSwgcmVzb2x2ZVZhbHVlKGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlKCksIG5hbWUpLCBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCByZXNvbHZlZCwgZm9ybUNvcmUuZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSgpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTGFzdC1yZXNvcnQgbmV0IChzZWUgdmFsaWRhdGVGaWVsZEFzeW5jKSDigJQga2VlcCB0aGUgbm9ybWFsXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdGVkLWVycm9yIGZsb3cgc28gb25GaW5pc2hGYWlsZWQgZ2V0cyBhIHJlYWwgcGF5bG9hZC5cbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAoX2EgPSBjb2VyY2VGYWlsdXJlUmVhc29uKGVycikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdWYWxpZGF0aW9uIGZhaWxlZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoZSBzdG9yZSBjb21taXQgaXMgc3RhbGVuZXNzLWd1YXJkZWQ7IHRoZSBTVUJNSVQgZGVjaXNpb25cbiAgICAgICAgICAgICAgICAvLyAoZmllbGRFcnJvcnMgLyB0aGUgdGhyb3duIEZvcm1WYWxpZGF0aW9uRXJyb3IpIHN0aWxsIHJlZmxlY3RzXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBydW4ncyBvd24gcmVzdWx0cyBmb3IgdGhlIHZhbHVlcyBpdCB2YWxpZGF0ZWQuXG4gICAgICAgICAgICAgICAgY29uc3QgZXBvY2ggPSBlcG9jaEJ5RmllbGQuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChlcG9jaCAhPT0gdW5kZWZpbmVkICYmIGZvcm1Db3JlLmlzVmFsaWRhdGlvblJ1bkN1cnJlbnQobmFtZSwgZXBvY2gpKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dGNvbWVzLnB1c2goeyBuYW1lLCBlcnJvciwgd2FybmluZyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzW25hbWVdID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFyRmxhZ3MgPSBmbGFnZ2VkLmZpbHRlcigobmFtZSkgPT4gbGFzdEFzeW5jRXBvY2hSZWYuY3VycmVudFtuYW1lXSA9PT0gZXBvY2hCeUZpZWxkLmdldChuYW1lKSk7XG4gICAgICAgICAgICBjb21taXRSdWxlT3V0Y29tZXMob3V0Y29tZXMsIGNsZWFyRmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhmaWVsZEVycm9ycykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1WYWxpZGF0aW9uRXJyb3IoZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKSwgZmllbGRFcnJvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lTGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVMaXN0LnJlZHVjZSgoYWNjLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjW25hbWVdID0gcmVzb2x2ZVZhbHVlKGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlKCksIG5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlKCk7XG4gICAgfSkpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIGRlZmluZUZpZWxkIOKAkyB1c2VkIGJ5IHN0YW5kYWxvbmUgKG5vbi1Qcm9Gb3JtKSBjb25zdW1lcnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBkZWZpbmVGaWVsZCA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIGZpZWxkT3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcnVsZXMgPSBbXSB9ID0gZmllbGRPcHRpb25zO1xuICAgICAgICBjb25zdCBGaWVsZENvbXBvbmVudCA9IG1lbW8oKF9hKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyBjaGlsZHJlbiwgcmVuZGVyIH0gPSBfYSwgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNoaWxkcmVuXCIsIFwicmVuZGVyXCJdKTtcbiAgICAgICAgICAgIC8vIFBlci1maWVsZCBzdG9yZSBzdWJzY3JpcHRpb246IHRoaXMgZmllbGQgcmUtcmVuZGVycyBvbmx5IHdoZW4gaXRzXG4gICAgICAgICAgICAvLyBvd24gdmFsdWUvZXJyb3IvdG91Y2hlZC92YWxpZGF0aW5nIHNsaWNlIGNoYW5nZXMuIERvdC1wYXRoc1xuICAgICAgICAgICAgLy8gcmVzb2x2ZSBpbnRvIHRoZSBuZXN0ZWQgdmFsdWVzIGxpa2UgZXZlcnl3aGVyZSBlbHNlLlxuICAgICAgICAgICAgY29uc3QgW2ZpZWxkVmFsdWUsIGZpZWxkRXJyb3IsIGZpZWxkVG91Y2hlZCwgZmllbGRWYWxpZGF0aW5nXSA9IHVzZVN0b3JlU2VsZWN0b3Ioc3RvcmUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSByZXNvbHZlVmFsdWUoc3RhdGUudmFsdWVzLCBuYW1lKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJycsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yc1tuYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudG91Y2hlZFtuYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsaWRhdGluZ1tuYW1lXSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSwgc2hhbGxvd0VxdWFsQXJyYXlzKTtcbiAgICAgICAgICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTW91bnQtY291bnRlZDogcmVsZWFzZUZpZWxkIHJlbW92ZXMgdGhlIHJ1bGVzIG9ubHkgd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAvLyBMQVNUIHNhbWUtbmFtZSBpbnN0YW5jZSB1bm1vdW50cyDigJQgYW4gaW5zdGFuY2UgdGhhdCBwaWdneWJhY2tlZFxuICAgICAgICAgICAgICAgIC8vIG9uIGFuIGV4aXN0aW5nIHJlZ2lzdHJhdGlvbiAoZS5nLiBhIFByb0Zvcm0uSXRlbSdzKSBjYW4gbmV2ZXJcbiAgICAgICAgICAgICAgICAvLyB3aXBlIGl0IG9uIGl0cyBvd24gdW5tb3VudC5cbiAgICAgICAgICAgICAgICBmb3JtQ29yZS5yZXRhaW5GaWVsZChuYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1J1bGVzID0gZm9ybUNvcmUuZ2V0RmllbGRSdWxlcyhuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nUnVsZXMgJiYgcnVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3JtQ29yZS5yZWdpc3RlckZpZWxkKG5hbWUsIHJ1bGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvcmUucmVsZWFzZUZpZWxkKG5hbWUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LCBbXSk7IC8vIE9ubHkgcmVnaXN0ZXIgb24gbW91bnRcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUZpZWxkQ2hhbmdlID0gdXNlRXZlbnRDYWxsYmFjaygodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBUb3VjaGVkIGlzIHNldCBieSB0aGUgdXNlciBjaGFuZ2UgdHJpZ2dlciAobWF0Y2hpbmcgdGhlXG4gICAgICAgICAgICAgICAgLy8gUHJvRm9ybS5JdGVtIHBhdGgpIOKAlCBwcm9ncmFtbWF0aWMgc2V0RmllbGRzVmFsdWUgZG9lcyBub3QuXG4gICAgICAgICAgICAgICAgY29uc3QgdG91Y2hlZCA9IHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZDtcbiAgICAgICAgICAgICAgICBpZiAoIXRvdWNoZWRbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB0b3VjaGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRvdWNoZWQpLCB7IFtuYW1lXTogdHJ1ZSB9KSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYXBwbGljYWJsZSA9IGZpbHRlclJ1bGVzQnlUcmlnZ2VyKHJlc29sdmVSdWxlcyhydWxlcywgZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKSwgZm9ybUNvcmUuZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSgpKSwgJ29uQ2hhbmdlJywgbm9ybWFsaXplVHJpZ2dlcnMoZmllbGRPcHRpb25zLnZhbGlkYXRlVHJpZ2dlciwgdmFsaWRhdGVUcmlnZ2VyKSwgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxpY2FibGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3JtQ29yZS52YWxpZGF0ZUZpZWxkKG5hbWUsIGFwcGxpY2FibGUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUJsdXIgPSB1c2VFdmVudENhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVGaWVsZEJsdXIobmFtZSwgZmllbGRPcHRpb25zLnZhbGlkYXRlVHJpZ2dlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkUHJvcHMgPSBPYmplY3QuYXNzaWduKHsgbmFtZSwgdmFsdWU6IGZpZWxkVmFsdWUsIGVycm9yOiBmaWVsZEVycm9yLCB0b3VjaGVkOiBmaWVsZFRvdWNoZWQsIHZhbGlkYXRpbmc6IGZpZWxkVmFsaWRhdGluZywgb25DaGFuZ2U6IGhhbmRsZUZpZWxkQ2hhbmdlLCBvbkJsdXI6IGhhbmRsZUJsdXIgfSwgcHJvcHMpO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlTWVyZ2VDaGFuZ2UgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGUgJiYgdHlwZW9mIGUgPT09ICdvYmplY3QnICYmICd0YXJnZXQnIGluIGVcbiAgICAgICAgICAgICAgICAgICAgPyBlLnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGU7XG4gICAgICAgICAgICAgICAgaGFuZGxlRmllbGRDaGFuZ2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikgJiZcbiAgICAgICAgICAgICAgICAgICAgKChfYSA9IGNoaWxkcmVuLnByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25DaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlTWVyZ2VCbHVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBoYW5kbGVCbHVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSAmJlxuICAgICAgICAgICAgICAgICAgICAoKF9hID0gY2hpbGRyZW4ucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkJsdXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnByb3BzLm9uQmx1cigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocmVuZGVyICYmIHR5cGVvZiByZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyKGZpZWxkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbihmaWVsZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVsZW1lbnQgY2hpbGRyZW4gcmVjZWl2ZSBvbmx5IERPTS1zYWZlIHByb3BzIOKAlCBlcnJvci90b3VjaGVkL1xuICAgICAgICAgICAgLy8gdmFsaWRhdGluZyBhcmUgZmllbGQgTUVUQSwgbm90IGNvbnRyb2wgcHJvcHM7IHNwcmVhZGluZyB0aGVtIG9udG9cbiAgICAgICAgICAgIC8vIGEgaG9zdCBlbGVtZW50IHdvdWxkIGxlYWsgdW5rbm93biBhdHRyaWJ1dGVzLiBSZW5kZXItcHJvcCBhbmRcbiAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGNoaWxkcmVuIGtlZXAgdGhlIGZ1bGwgZmllbGRQcm9wcy5cbiAgICAgICAgICAgIGNvbnN0IGRvbVNhZmVQcm9wcyA9IE9iamVjdC5hc3NpZ24oeyBuYW1lLCB2YWx1ZTogZmllbGRWYWx1ZSwgb25DaGFuZ2U6IGhhbmRsZU1lcmdlQ2hhbmdlLCBvbkJsdXI6IGhhbmRsZU1lcmdlQmx1ciB9LCBwcm9wcyk7XG4gICAgICAgICAgICBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwgZG9tU2FmZVByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCAuLi5jaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRvbVNhZmVQcm9wcyksIHsga2V5OiBjaGlsZC5rZXkgfHwgaW5kZXggfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIEZpZWxkQ29tcG9uZW50LmRpc3BsYXlOYW1lID0gYEZpZWxkKCR7bmFtZX0pYDtcbiAgICAgICAgcmV0dXJuIEZpZWxkQ29tcG9uZW50O1xuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIGhhbmRsZVN1Ym1pdCAvIGhhbmRsZVJlc2V0IOKAkyBmb3IgPGZvcm0+IGV2ZW50IGhhbmRsZXJzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3QgaGFuZGxlU3VibWl0ID0gdXNlRXZlbnRDYWxsYmFjaygoZSkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVkVmFsdWVzID0geWllbGQgdmFsaWRhdGVGaWVsZHNBc3luYygpO1xuICAgICAgICAgICAgb25GaW5pc2ggPT09IG51bGwgfHwgb25GaW5pc2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRmluaXNoKHZhbGlkYXRlZFZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gT25seSBhIFZBTElEQVRJT04gZmFpbHVyZSByZWFjaGVzIG9uRmluaXNoRmFpbGVkIOKAlCBhbiBleGNlcHRpb24gb3V0XG4gICAgICAgICAgICAvLyBvZiB0aGUgY29uc3VtZXIncyBvd24gb25GaW5pc2ggaXMgbm90IGEgdmFsaWRhdGlvbiByZXN1bHQgYW5kIGlzXG4gICAgICAgICAgICAvLyBzdXJmYWNlZCBpbnN0ZWFkIG9mIGJlaW5nIG1pc3JlcG9ydGVkLlxuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEZvcm1WYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBvbkZpbmlzaEZhaWxlZCA9PT0gbnVsbCB8fCBvbkZpbmlzaEZhaWxlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25GaW5pc2hGYWlsZWQoeyB2YWx1ZXM6IGVyci52YWx1ZXMsIGVycm9yczogZXJyLmVycm9ycyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tQcm9Gb3JtXSBvbkZpbmlzaCB0aHJldyBkdXJpbmcgc3VibWl0OicsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KSk7XG4gICAgY29uc3QgaGFuZGxlUmVzZXQgPSB1c2VFdmVudENhbGxiYWNrKChlKSA9PiB7XG4gICAgICAgIGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBmb3JtQ29yZS5yZXNldEZpZWxkcygpO1xuICAgICAgICBvblJlc2V0ID09PSBudWxsIHx8IG9uUmVzZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUmVzZXQoKTtcbiAgICB9KTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBGb3JtSW5zdGFuY2Ug4oCTIGVuaGFuY2VkIEFQSSBmb3IgY29uc3VtZXJzLlxuICAgIC8vXG4gICAgLy8gRXZlcnkgbWV0aG9kIGlzIHdyYXBwZWQgaW4gdXNlTWVtb2l6ZWRGbiAoc3RhYmxlIGlkZW50aXR5LCBhbHdheXMgcmVhZHMgdGhlXG4gICAgLy8gbGF0ZXN0IHN0b3JlIHN0YXRlKSBzbyB0aGUgaW5zdGFuY2Ugb2JqZWN0IGl0c2VsZiBpcyBJREVOVElUWS1TVEFCTEUgZm9yXG4gICAgLy8gdGhlIGxpZmV0aW1lIG9mIHRoZSBmb3JtIOKAlCB0aGlzIGlzIHdoYXQgbGV0cyBQcm9Gb3JtIHB1Ymxpc2ggaXQgdGhyb3VnaCB0aGVcbiAgICAvLyBzdGFibGUgY29udGV4dCB3aXRob3V0IHJlLXJlbmRlcmluZyBzdWJzY3JpYmVycyBvbiBlYWNoIGtleXN0cm9rZS5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBnZXRGaWVsZEVycm9yID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4gc3RvcmUuZ2V0U3RhdGUoKS5lcnJvcnNbbmFtZV0pO1xuICAgIGNvbnN0IGdldEZpZWxkV2FybmluZyA9IHVzZU1lbW9pemVkRm4oKG5hbWUpID0+IHN0b3JlLmdldFN0YXRlKCkud2FybmluZ3NbbmFtZV0pO1xuICAgIGNvbnN0IGdldEZpZWxkc0Vycm9yID0gdXNlTWVtb2l6ZWRGbigobmFtZUxpc3QpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gc3RvcmUuZ2V0U3RhdGUoKS5lcnJvcnM7XG4gICAgICAgIGlmICghbmFtZUxpc3QpXG4gICAgICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgbmFtZUxpc3QuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IGVycm9yc1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gICAgY29uc3QgaXNGaWVsZFRvdWNoZWQgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLnRvdWNoZWRbbmFtZV0gfHwgZmFsc2UpO1xuICAgIGNvbnN0IGlzRmllbGRzVG91Y2hlZCA9IHVzZU1lbW9pemVkRm4oKG5hbWVMaXN0LCBhbGxGaWVsZHNUb3VjaGVkID0gZmFsc2UpID0+IHtcbiAgICAgICAgY29uc3QgdG91Y2hlZCA9IHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZDtcbiAgICAgICAgaWYgKCFuYW1lTGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRvdWNoZWQpLnNvbWUoKGtleSkgPT4gdG91Y2hlZFtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsRmllbGRzVG91Y2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVMaXN0LmV2ZXJ5KChuYW1lKSA9PiB0b3VjaGVkW25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmFtZUxpc3Quc29tZSgobmFtZSkgPT4gdG91Y2hlZFtuYW1lXSk7XG4gICAgfSk7XG4gICAgY29uc3QgaXNGaWVsZFZhbGlkYXRpbmcgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLnZhbGlkYXRpbmdbbmFtZV0gfHwgZmFsc2UpO1xuICAgIGNvbnN0IHNldEZpZWxkc0Vycm9yID0gdXNlTWVtb2l6ZWRGbigoZmllbGRzRXJyb3IpID0+IHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZmllbGRzRXJyb3IpLmZvckVhY2goKFtuYW1lLCBlcnJvcl0pID0+IHtcbiAgICAgICAgICAgIGZvcm1Db3JlLnNldEZpZWxkRXJyb3IobmFtZSwgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBzZXRGaWVsZFRvdWNoZWQgPSB1c2VNZW1vaXplZEZuKChuYW1lLCBpc1RvdWNoZWQgPSB0cnVlKSA9PiB7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdG91Y2hlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdG9yZS5nZXRTdGF0ZSgpLnRvdWNoZWQpLCB7IFtuYW1lXTogaXNUb3VjaGVkIH0pIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldEZpZWxkc1RvdWNoZWQgPSB1c2VNZW1vaXplZEZuKChmaWVsZHNUb3VjaCkgPT4ge1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHRvdWNoZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkKSwgZmllbGRzVG91Y2gpIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlc2V0Rm9ybUZpZWxkcyA9IHVzZU1lbW9pemVkRm4oKGZpZWxkcykgPT4ge1xuICAgICAgICBpZiAoIWZpZWxkcykge1xuICAgICAgICAgICAgZm9ybUNvcmUucmVzZXRGaWVsZHMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBNb3VudC1mcm96ZW4gaW5pdGlhbFZhbHVlcyDigJQgY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIHJlc2V0RmllbGRzLlxuICAgICAgICAvLyBSZWFkcyBBTkQgd3JpdGVzIGFyZSBuZXN0ZWQtcGF0aCBhd2FyZSwgc28gZG90LXBhdGggbmFtZXNcbiAgICAgICAgLy8gKGBhZGRyZXNzLmNpdHlgLCBgaXRlbXMuMC50aXRsZWApIHJlc2V0IGNvcnJlY3RseSBpbnN0ZWFkIG9mIHByb2JpbmcgYVxuICAgICAgICAvLyBsaXRlcmFsIGtleSBhbmQgc2hhbGxvdy1tZXJnaW5nIG9uZSBiYWNrLlxuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWVzID0gZm9ybUNvcmUuZ2V0SW5pdGlhbFZhbHVlcygpO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCBuZXdWYWx1ZXMgPSBzdGF0ZS52YWx1ZXM7XG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbCA9IHJlc29sdmVWYWx1ZShpbml0aWFsVmFsdWVzLCBmaWVsZCk7XG4gICAgICAgICAgICBuZXdWYWx1ZXMgPSBmaWVsZC5pbmNsdWRlcygnLicpXG4gICAgICAgICAgICAgICAgPyBzZXROZXN0ZWRWYWx1ZShuZXdWYWx1ZXMsIGZpZWxkLCBpbml0aWFsKVxuICAgICAgICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBuZXdWYWx1ZXMpLCB7IFtmaWVsZF06IGluaXRpYWwgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBMaWtlIHRoZSBmdWxsIHJlc2V0OiBjbGVhciBBTEwgcGVyLWZpZWxkIG1ldGEgKGVycm9ycyBBTkQgd2FybmluZ3MgQU5EXG4gICAgICAgIC8vIHRvdWNoZWQvdmFsaWRhdGluZyksIGludmFsaWRhdGUgaW4tZmxpZ2h0IHZhbGlkYXRpb24gcnVucywgYW5kIGxhbmRcbiAgICAgICAgLy8gZXZlcnl0aGluZyBpbiBPTkUgY29tbWl0LiBObyBvblZhbHVlc0NoYW5nZSDigJQgcmVzZXQgaXMgbm90IGEgY2hhbmdlXG4gICAgICAgIC8vIGV2ZW50IG9uIGVpdGhlciBwYXRoLlxuICAgICAgICBmb3JtQ29yZS5pbnZhbGlkYXRlVmFsaWRhdGlvblJ1bnMoZmllbGRzKTtcbiAgICAgICAgY29uc3QgbmV3RXJyb3JzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXJyb3JzKTtcbiAgICAgICAgY29uc3QgbmV3V2FybmluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS53YXJuaW5ncyk7XG4gICAgICAgIGNvbnN0IG5ld1RvdWNoZWQgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS50b3VjaGVkKTtcbiAgICAgICAgY29uc3QgbmV3VmFsaWRhdGluZyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnZhbGlkYXRpbmcpO1xuICAgICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXdFcnJvcnNbZmllbGRdO1xuICAgICAgICAgICAgZGVsZXRlIG5ld1dhcm5pbmdzW2ZpZWxkXTtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXdUb3VjaGVkW2ZpZWxkXTtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXdWYWxpZGF0aW5nW2ZpZWxkXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHZhbHVlczogbmV3VmFsdWVzLFxuICAgICAgICAgICAgZXJyb3JzOiBuZXdFcnJvcnMsXG4gICAgICAgICAgICB3YXJuaW5nczogbmV3V2FybmluZ3MsXG4gICAgICAgICAgICB0b3VjaGVkOiBuZXdUb3VjaGVkLFxuICAgICAgICAgICAgdmFsaWRhdGluZzogbmV3VmFsaWRhdGluZyxcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc3VibWl0V2l0aFZhbGlkYXRpb24gPSB1c2VNZW1vaXplZEZuKChjYWxsYmFjaykgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCB2YWxpZGF0ZWRWYWx1ZXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWRWYWx1ZXMgPSB5aWVsZCB2YWxpZGF0ZUZpZWxkc0FzeW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAvLyBWYWxpZGF0aW9uIGZhaWx1cmUg4oCUIHRoZSBmaWVsZCBlcnJvcnMgYXJlIGFscmVhZHkgaW4gdGhlIHN0b3JlLlxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgeWllbGQgY2FsbGJhY2sodmFsaWRhdGVkVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAvLyBBIHRocm93aW5nIGNhbGxiYWNrIGlzIGEgY29uc3VtZXIgYnVnLCBub3QgYSB2YWxpZGF0aW9uIGZhaWx1cmUg4oCUXG4gICAgICAgICAgICAgICAgLy8gc3VyZmFjZSBpdCAobWlycm9yaW5nIHJjLWZpZWxkLWZvcm0ncyBvbkZpbmlzaCBoYW5kbGluZykgaW5zdGVhZFxuICAgICAgICAgICAgICAgIC8vIG9mIHN3YWxsb3dpbmcgaXQgc2lsZW50bHkuXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1Byb0Zvcm1dIHN1Ym1pdCBjYWxsYmFjayB0aHJldzonLCBlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZFZhbHVlcztcbiAgICB9KSk7XG4gICAgY29uc3QgZm9ybUluc3RhbmNlID0gdXNlTWVtbygoKSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmb3JtQ29yZS5mb3JtSW5zdGFuY2UpLCB7IHZhbGlkYXRlRmllbGRzOiB2YWxpZGF0ZUZpZWxkc0FzeW5jLCBzZXRGaWVsZFZhbHVlOiBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlLCBnZXRGaWVsZEVycm9yLFxuICAgICAgICBnZXRGaWVsZFdhcm5pbmcsXG4gICAgICAgIGdldEZpZWxkc0Vycm9yLFxuICAgICAgICBpc0ZpZWxkVG91Y2hlZCxcbiAgICAgICAgaXNGaWVsZHNUb3VjaGVkLFxuICAgICAgICBpc0ZpZWxkVmFsaWRhdGluZywgc2V0RmllbGRFcnJvcjogZm9ybUNvcmUuc2V0RmllbGRFcnJvciwgc2V0RmllbGRzRXJyb3IsXG4gICAgICAgIHNldEZpZWxkVG91Y2hlZCxcbiAgICAgICAgc2V0RmllbGRzVG91Y2hlZCwgcmVzZXRGaWVsZHM6IHJlc2V0Rm9ybUZpZWxkcywgc3VibWl0OiBzdWJtaXRXaXRoVmFsaWRhdGlvbiwgZGVmaW5lRmllbGQsIHJlZ2lzdGVyRmllbGQ6IGZvcm1Db3JlLnJlZ2lzdGVyRmllbGQsIHVucmVnaXN0ZXJGaWVsZDogZm9ybUNvcmUudW5yZWdpc3RlckZpZWxkIH0pKSwgW1xuICAgICAgICBmb3JtQ29yZS5mb3JtSW5zdGFuY2UsXG4gICAgICAgIGZvcm1Db3JlLnNldEZpZWxkVmFsdWUsXG4gICAgICAgIGZvcm1Db3JlLnNldEZpZWxkRXJyb3IsXG4gICAgICAgIGZvcm1Db3JlLnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIGZvcm1Db3JlLnVucmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgdmFsaWRhdGVGaWVsZHNBc3luYyxcbiAgICAgICAgZ2V0RmllbGRFcnJvcixcbiAgICAgICAgZ2V0RmllbGRXYXJuaW5nLFxuICAgICAgICBnZXRGaWVsZHNFcnJvcixcbiAgICAgICAgaXNGaWVsZFRvdWNoZWQsXG4gICAgICAgIGlzRmllbGRzVG91Y2hlZCxcbiAgICAgICAgaXNGaWVsZFZhbGlkYXRpbmcsXG4gICAgICAgIHNldEZpZWxkc0Vycm9yLFxuICAgICAgICBzZXRGaWVsZFRvdWNoZWQsXG4gICAgICAgIHNldEZpZWxkc1RvdWNoZWQsXG4gICAgICAgIHJlc2V0Rm9ybUZpZWxkcyxcbiAgICAgICAgc3VibWl0V2l0aFZhbGlkYXRpb24sXG4gICAgICAgIGRlZmluZUZpZWxkLFxuICAgIF0pO1xuICAgIC8vIEZ1bmN0aW9uLWZvcm0gcnVsZXMgZ2V0IHRoZSBGVUxMIGZvcm0gaW5zdGFuY2UgKGVycm9yIGdldHRlcnMsIHRvdWNoZWRcbiAgICAvLyBzdGF0ZSwgbXV0YXRvcnMpIGluc3RlYWQgb2YgdGhlIGJhcmUgY29yZSBtZXRob2RzLiBSZWYgd3JpdGUg4oCUIGNoZWFwIGFuZFxuICAgIC8vIGlkZW1wb3RlbnQgcGVyIHJlbmRlci5cbiAgICBmb3JtQ29yZS5zZXRSdWxlQ29udGV4dEluc3RhbmNlKGZvcm1JbnN0YW5jZSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gSW50ZXJuYWxzIOKAkyBleHBvc2VkIGZvciBQcm9Gb3JtIGludGVncmF0aW9uLiBEYXRhIGZpZWxkcyBhcmUgR0VUVEVSUyB0aGF0XG4gICAgLy8gcmVhZCB0aGUgbGl2ZSBzdG9yZSwgc28gdGhlIG9iamVjdCBpcyBpZGVudGl0eS1zdGFibGUgeWV0IG5ldmVyIHN0YWxlLlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGludGVybmFscyA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICAgICAgZ2V0IHZhbHVlcygpIHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5nZXRTdGF0ZSgpLnZhbHVlcztcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGVycm9ycygpIHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5nZXRTdGF0ZSgpLmVycm9ycztcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHdhcm5pbmdzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkud2FybmluZ3M7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB0b3VjaGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHZhbGlkYXRpbmcoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuZ2V0U3RhdGUoKS52YWxpZGF0aW5nO1xuICAgICAgICB9LFxuICAgICAgICBmaWVsZFJ1bGVzOiBmb3JtQ29yZS5maWVsZFJ1bGVzLFxuICAgICAgICBzZXRGaWVsZFZhbHVlOiBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlLFxuICAgICAgICBzZXRGaWVsZEVycm9yOiBmb3JtQ29yZS5zZXRGaWVsZEVycm9yLFxuICAgICAgICBzZXRGaWVsZFdhcm5pbmc6IGZvcm1Db3JlLnNldEZpZWxkV2FybmluZyxcbiAgICAgICAgdmFsaWRhdGVGaWVsZDogZm9ybUNvcmUudmFsaWRhdGVGaWVsZCxcbiAgICAgICAgdmFsaWRhdGVGaWVsZEFzeW5jLFxuICAgICAgICByZWdpc3RlckZpZWxkOiBmb3JtQ29yZS5yZWdpc3RlckZpZWxkLFxuICAgICAgICB1bnJlZ2lzdGVyRmllbGQ6IGZvcm1Db3JlLnVucmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgcmV0YWluRmllbGQ6IGZvcm1Db3JlLnJldGFpbkZpZWxkLFxuICAgICAgICByZWxlYXNlRmllbGQ6IGZvcm1Db3JlLnJlbGVhc2VGaWVsZCxcbiAgICAgICAgaGFuZGxlU3VibWl0LFxuICAgICAgICBoYW5kbGVSZXNldCxcbiAgICB9KSwgW1xuICAgICAgICBzdG9yZSxcbiAgICAgICAgZm9ybUNvcmUuZmllbGRSdWxlcyxcbiAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRWYWx1ZSxcbiAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRFcnJvcixcbiAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRXYXJuaW5nLFxuICAgICAgICBmb3JtQ29yZS52YWxpZGF0ZUZpZWxkLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkQXN5bmMsXG4gICAgICAgIGZvcm1Db3JlLnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIGZvcm1Db3JlLnVucmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgZm9ybUNvcmUucmV0YWluRmllbGQsXG4gICAgICAgIGZvcm1Db3JlLnJlbGVhc2VGaWVsZCxcbiAgICAgICAgaGFuZGxlU3VibWl0LFxuICAgICAgICBoYW5kbGVSZXNldCxcbiAgICBdKTtcbiAgICByZXR1cm4geyBmb3JtSW5zdGFuY2UsIGludGVybmFscywgc3RvcmUgfTtcbn07XG5leHBvcnQgZGVmYXVsdCB1c2VGb3JtOyIsbnVsbF0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMifQ==