botframework-webchat 4.14.0 → 4.15.1

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 (97) hide show
  1. package/.eslintrc.yml +5 -109
  2. package/.prettierrc.yml +1 -1
  3. package/README.md +1 -1
  4. package/babel.config.json +2 -2
  5. package/babel.sanitize-html.config.json +10 -0
  6. package/lib/AddFullBundle.d.ts.map +1 -1
  7. package/lib/AddFullBundle.js +1 -2
  8. package/lib/FullComposer.js +2 -2
  9. package/lib/FullReactWebChat.js +1 -1
  10. package/lib/adaptiveCards/AdaptiveCardsComposer.d.ts.map +1 -1
  11. package/lib/adaptiveCards/AdaptiveCardsComposer.js +6 -2
  12. package/lib/adaptiveCards/AdaptiveCardsContext.d.ts +0 -1
  13. package/lib/adaptiveCards/AdaptiveCardsContext.d.ts.map +1 -1
  14. package/lib/adaptiveCards/Attachment/AdaptiveCardBuilder.d.ts +7 -7
  15. package/lib/adaptiveCards/Attachment/AdaptiveCardBuilder.d.ts.map +1 -1
  16. package/lib/adaptiveCards/Attachment/AdaptiveCardBuilder.js +10 -3
  17. package/lib/adaptiveCards/Attachment/AdaptiveCardContent.js +8 -4
  18. package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.d.ts +9 -22
  19. package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.d.ts.map +1 -1
  20. package/lib/adaptiveCards/Attachment/AdaptiveCardRenderer.js +175 -95
  21. package/lib/adaptiveCards/Attachment/AnimationCardContent.js +1 -1
  22. package/lib/adaptiveCards/Attachment/AudioCardContent.js +1 -1
  23. package/lib/adaptiveCards/Attachment/CommonCard.js +7 -3
  24. package/lib/adaptiveCards/Attachment/HeroCardContent.js +7 -3
  25. package/lib/adaptiveCards/Attachment/OAuthCardContent.js +7 -3
  26. package/lib/adaptiveCards/Attachment/ReceiptCardContent.js +7 -3
  27. package/lib/adaptiveCards/Attachment/SignInCardContent.js +1 -1
  28. package/lib/adaptiveCards/Attachment/ThumbnailCardContent.js +7 -3
  29. package/lib/adaptiveCards/Attachment/VideoCardContent.js +1 -1
  30. package/lib/adaptiveCards/AttachmentForScreenReader/AdaptiveCardAttachment.js +7 -3
  31. package/lib/adaptiveCards/AttachmentForScreenReader/RichCardAttachment.js +1 -1
  32. package/lib/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.d.ts +3 -0
  33. package/lib/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.d.ts.map +1 -1
  34. package/lib/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.js +8 -1
  35. package/lib/adaptiveCards/Styles/adaptiveCardHostConfig.js +2 -2
  36. package/lib/adaptiveCards/Styles/createAdaptiveCardsStyleSet.js +1 -1
  37. package/lib/adaptiveCards/createAdaptiveCardsAttachmentForScreenReaderMiddleware.d.ts.map +1 -1
  38. package/lib/adaptiveCards/createAdaptiveCardsAttachmentForScreenReaderMiddleware.js +1 -1
  39. package/lib/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.d.ts.map +1 -1
  40. package/lib/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.js +1 -3
  41. package/lib/adaptiveCards/hooks/internal/useParseAdaptiveCardJSON.js +1 -1
  42. package/lib/adaptiveCards/hooks/useAdaptiveCardsHostConfig.js +1 -1
  43. package/lib/adaptiveCards/hooks/useAdaptiveCardsPackage.js +1 -1
  44. package/lib/adaptiveCards/normalizeStyleOptions.js +1 -1
  45. package/lib/addVersion.js +2 -2
  46. package/lib/createCognitiveServicesSpeechServicesPonyfillFactory.js +1 -1
  47. package/lib/createFullStyleSet.d.ts +324 -55
  48. package/lib/createFullStyleSet.d.ts.map +1 -1
  49. package/lib/createFullStyleSet.js +1 -1
  50. package/lib/fullBundleDefaultStyleOptions.js +1 -1
  51. package/lib/hooks/useStyleOptions.js +1 -1
  52. package/lib/index-es5.d.ts +1 -21
  53. package/lib/index-es5.d.ts.map +1 -1
  54. package/lib/index-es5.js +3 -43
  55. package/lib/index-minimal.js +27 -21
  56. package/lib/index.d.ts +10 -1
  57. package/lib/index.d.ts.map +1 -1
  58. package/lib/index.js +10 -7
  59. package/lib/polyfill.d.ts +23 -0
  60. package/lib/polyfill.d.ts.map +1 -0
  61. package/lib/polyfill.js +46 -0
  62. package/lib/renderMarkdown.d.ts.map +1 -1
  63. package/lib/renderMarkdown.js +34 -6
  64. package/lib/speech/CustomAudioInputStream.d.ts.map +1 -1
  65. package/lib/speech/CustomAudioInputStream.js +40 -15
  66. package/lib/speech/createAudioConfig.d.ts.map +1 -1
  67. package/lib/speech/createAudioConfig.js +9 -3
  68. package/lib/speech/createMicrophoneAudioConfigAndAudioContext.d.ts.map +1 -1
  69. package/lib/speech/createMicrophoneAudioConfigAndAudioContext.js +6 -1
  70. package/lib/speech/getUserMedia.js +1 -1
  71. package/lib/useComposerProps.js +1 -1
  72. package/package.json +35 -41
  73. package/src/AddFullBundle.tsx +0 -1
  74. package/src/__tests__/createDirectLine.spec.js +2 -0
  75. package/src/__tests__/renderMarkdown.spec.js +1 -1
  76. package/src/__tests__/versionTag.es5.spec.js +1 -0
  77. package/src/__tests__/versionTag.full.spec.js +1 -0
  78. package/src/__tests__/versionTag.minimal.spec.js +1 -0
  79. package/src/adaptiveCards/AdaptiveCardsComposer.tsx +4 -3
  80. package/src/adaptiveCards/Attachment/AdaptiveCardBuilder.ts +16 -12
  81. package/src/adaptiveCards/Attachment/AdaptiveCardRenderer.tsx +226 -96
  82. package/src/adaptiveCards/Styles/StyleSet/AdaptiveCardRenderer.ts +8 -0
  83. package/src/adaptiveCards/Styles/createAdaptiveCardsStyleSet.spec.js +2 -0
  84. package/src/adaptiveCards/createAdaptiveCardsAttachmentForScreenReaderMiddleware.tsx +14 -12
  85. package/src/adaptiveCards/createAdaptiveCardsAttachmentMiddleware.tsx +26 -25
  86. package/src/adaptiveCards/hooks/useAdaptiveCardsHostConfig.ts +4 -4
  87. package/src/createCognitiveServicesSpeechServicesPonyfillFactory.spec.js +5 -5
  88. package/src/index-es5.ts +3 -26
  89. package/src/polyfill.ts +29 -0
  90. package/src/renderMarkdown.ts +40 -4
  91. package/src/speech/CustomAudioInputStream.ts +39 -10
  92. package/src/speech/createAudioConfig.spec.js +1 -1
  93. package/src/speech/createAudioConfig.ts +9 -6
  94. package/src/speech/createMicrophoneAudioConfigAndAudioContext.ts +1 -3
  95. package/src/useComposerProps.ts +4 -4
  96. package/webpack.config.js +24 -4
  97. package/.eslintignore +0 -1
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
-
5
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
4
 
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
@@ -25,6 +25,10 @@ var _useAdaptiveCardsHostConfig = _interopRequireDefault(require("../hooks/useAd
25
25
 
26
26
  var _useAdaptiveCardsPackage = _interopRequireDefault(require("../hooks/useAdaptiveCardsPackage"));
27
27
 
28
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
+
30
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
+
28
32
  /* eslint no-magic-numbers: ["error", { "ignore": [-1, 0, 2] }] */
29
33
  var ErrorBox = _botframeworkWebchatComponent.Components.ErrorBox;
30
34
  var useDisabled = _botframeworkWebchatComponent.hooks.useDisabled,
@@ -32,23 +36,45 @@ var useDisabled = _botframeworkWebchatComponent.hooks.useDisabled,
32
36
  usePerformCardAction = _botframeworkWebchatComponent.hooks.usePerformCardAction,
33
37
  useRenderMarkdownAsHTML = _botframeworkWebchatComponent.hooks.useRenderMarkdownAsHTML,
34
38
  useScrollToEnd = _botframeworkWebchatComponent.hooks.useScrollToEnd,
35
- useStyleSet = _botframeworkWebchatComponent.hooks.useStyleSet; // eslint-disable-next-line no-undef
39
+ useStyleSet = _botframeworkWebchatComponent.hooks.useStyleSet;
40
+ var node_env = undefined || "production";
41
+
42
+ function bunchUndos() {
43
+ for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {
44
+ fns[_key] = arguments[_key];
45
+ }
46
+
47
+ return function () {
48
+ return fns.forEach(function (fn) {
49
+ return fn === null || fn === void 0 ? void 0 : fn();
50
+ });
51
+ };
52
+ }
53
+ /**
54
+ * Adds a class to the `HTMLElement`. Returns `true` if the class is added, otherwise, `undefined`.
55
+ */
36
56
 
37
- var node_env = process.env.node_env || process.env.NODE_ENV;
38
57
 
39
58
  function addClass(element, className) {
40
- var classNames = new Set(element.className.split(' '));
59
+ var classList = element.classList;
41
60
 
42
- if (!classNames.has(className)) {
43
- classNames.add(className);
44
- element.className = Array.from(classNames).join(' ');
61
+ if (!classList.contains(className)) {
62
+ classList.add(className);
45
63
  return true;
46
64
  }
47
-
48
- return false;
49
65
  }
66
+ /**
67
+ * Adds a class to the `HTMLElement` and re-add on mutations.
68
+ *
69
+ * @returns {function} A function, when called, will restore to previous state.
70
+ */
71
+
50
72
 
51
73
  function addPersistentClassWithUndo(element, className) {
74
+ if (!element) {
75
+ return;
76
+ }
77
+
52
78
  if (addClass(element, className)) {
53
79
  // After we add the class, keep observing the element to make sure the class is not removed.
54
80
  var observer = new MutationObserver(function () {
@@ -66,12 +92,26 @@ function addPersistentClassWithUndo(element, className) {
66
92
  };
67
93
  }
68
94
  }
95
+ /**
96
+ * Returns `true`, if the object is a plain object and not a class, otherwise, `false`.
97
+ */
98
+
69
99
 
70
100
  function isPlainObject(obj) {
71
101
  return Object.getPrototypeOf(obj) === Object.prototype;
72
102
  }
103
+ /**
104
+ * Sets an attribute.
105
+ *
106
+ * @returns {function} A function, when called, will restore to previous state.
107
+ */
108
+
73
109
 
74
110
  function setAttributeWithUndo(element, qualifiedName, nextValue) {
111
+ if (!element) {
112
+ return;
113
+ }
114
+
75
115
  var value = element.getAttribute(qualifiedName);
76
116
 
77
117
  if (value !== nextValue) {
@@ -81,15 +121,28 @@ function setAttributeWithUndo(element, qualifiedName, nextValue) {
81
121
  };
82
122
  }
83
123
  }
124
+ /**
125
+ * An event handler for disabling event bubbling and propagation.
126
+ */
127
+
84
128
 
85
129
  var disabledHandler = function disabledHandler(event) {
86
130
  event.preventDefault();
87
131
  event.stopImmediatePropagation();
88
132
  event.stopPropagation();
89
133
  };
134
+ /**
135
+ * Listens to event once. Returns a function, when called, will stop listening.
136
+ */
137
+
90
138
 
91
139
  function addEventListenerOnceWithUndo(element, name, handler) {
140
+ if (!element) {
141
+ return;
142
+ }
92
143
  /* eslint-disable-next-line prefer-const */
144
+
145
+
93
146
  var detach;
94
147
 
95
148
  var detachingHandler = function detachingHandler(event) {
@@ -110,15 +163,33 @@ function addEventListenerOnceWithUndo(element, name, handler) {
110
163
  });
111
164
  return detach;
112
165
  }
166
+ /**
167
+ * Listens to event. Returns a function, when called, will stop listening.
168
+ */
169
+
113
170
 
114
171
  function addEventListenerWithUndo(element, name, handler) {
172
+ if (!element) {
173
+ return;
174
+ }
175
+
115
176
  element.addEventListener(name, handler);
116
177
  return function () {
117
178
  return element.removeEventListener(name, handler);
118
179
  };
119
180
  }
181
+ /**
182
+ * Disables an element with undo function.
183
+ *
184
+ * @returns {function} A function, when called, will restore to previous state.
185
+ */
186
+
120
187
 
121
188
  function disableElementWithUndo(element) {
189
+ if (!element) {
190
+ return;
191
+ }
192
+
122
193
  var undoStack = [];
123
194
  var isActive = element === document.activeElement;
124
195
  var tag = element.nodeName.toLowerCase();
@@ -151,15 +222,25 @@ function disableElementWithUndo(element) {
151
222
  break;
152
223
  }
153
224
 
154
- return function () {
155
- return undoStack.forEach(function (undo) {
156
- return undo && undo();
157
- });
158
- };
225
+ return bunchUndos.apply(void 0, undoStack);
159
226
  }
227
+ /**
228
+ * Disables all inputtable descendants.
229
+ *
230
+ * @param {HTMLElement | undefined} element Container element to start looking for inputtable descendants.
231
+ * @param {boolean} observeSubtree `true` to applies to all future inputtable descendants, otherwise, `false`.
232
+ *
233
+ * @returns {function} A function, when called, will restore to previous state.
234
+ */
235
+
160
236
 
161
237
  function disableInputElementsWithUndo(element) {
162
238
  var observeSubtree = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
239
+
240
+ if (!element) {
241
+ return;
242
+ }
243
+
163
244
  var undoStack = [].map.call(element.querySelectorAll('button, input, select, textarea'), function (element) {
164
245
  return disableElementWithUndo(element);
165
246
  });
@@ -185,23 +266,7 @@ function disableInputElementsWithUndo(element) {
185
266
  });
186
267
  }
187
268
 
188
- return function () {
189
- return undoStack.forEach(function (undo) {
190
- return undo && undo();
191
- });
192
- };
193
- }
194
- /**
195
- * Checks if an element contains a class.
196
- *
197
- * @param {HTMLElement} element - The element to check for the class.
198
- * @param {string} className - The name of the class to check for.
199
- * @returns {boolean} `true` if the element contains the class, otherwise, `false`.
200
- */
201
-
202
-
203
- function containsClassName(element, className) {
204
- return (element.className || '').split(' ').includes(className);
269
+ return bunchUndos.apply(void 0, (0, _toConsumableArray2.default)(undoStack));
205
270
  }
206
271
  /**
207
272
  * Gets the value of an attribute from an element.
@@ -211,7 +276,7 @@ function containsClassName(element, className) {
211
276
 
212
277
 
213
278
  function getAttribute(element, qualifiedName) {
214
- return element.hasAttribute(qualifiedName) && element.getAttribute(qualifiedName);
279
+ return !!element && element.hasAttribute(qualifiedName) && (element.getAttribute(qualifiedName) || '');
215
280
  }
216
281
  /**
217
282
  * Sets or removes an attribute from an element.
@@ -224,9 +289,9 @@ function getAttribute(element, qualifiedName) {
224
289
 
225
290
  function setOrRemoveAttribute(element, qualifiedName, value) {
226
291
  if (value === false) {
227
- element.removeAttribute(qualifiedName);
292
+ element === null || element === void 0 ? void 0 : element.removeAttribute(qualifiedName);
228
293
  } else {
229
- element.setAttribute(qualifiedName, value);
294
+ element === null || element === void 0 ? void 0 : element.setAttribute(qualifiedName, value);
230
295
  }
231
296
  }
232
297
  /**
@@ -241,6 +306,10 @@ function setOrRemoveAttribute(element, qualifiedName, value) {
241
306
 
242
307
 
243
308
  function setOrRemoveAttributeWithUndo(element, qualifiedName, value) {
309
+ if (!element) {
310
+ return;
311
+ }
312
+
244
313
  var prevValue = getAttribute(element, qualifiedName);
245
314
  setOrRemoveAttribute(element, qualifiedName, value);
246
315
  return function () {
@@ -258,14 +327,12 @@ function setOrRemoveAttributeWithUndo(element, qualifiedName, value) {
258
327
 
259
328
 
260
329
  function findAncestor(element, predicate) {
261
- var current = element.parentElement;
330
+ var current = element;
262
331
 
263
- while (current) {
332
+ while (current = current.parentElement) {
264
333
  if (predicate.call(element, current)) {
265
334
  return current;
266
335
  }
267
-
268
- current = current.parentElement;
269
336
  }
270
337
  }
271
338
  /**
@@ -282,13 +349,13 @@ function findAncestor(element, predicate) {
282
349
 
283
350
 
284
351
  function indicateActionSelectionWithUndo(selectedActionElements, actionPerformedClassName) {
285
- if (!selectedActionElements.length) {
352
+ if (!(selectedActionElements !== null && selectedActionElements !== void 0 && selectedActionElements.length)) {
286
353
  return;
287
354
  } // Verify all input elements are "ac-pushButton", could belongs to ActionSet or "card actions".
288
355
 
289
356
 
290
357
  if (selectedActionElements.some(function (actionElement) {
291
- return !containsClassName(actionElement, 'ac-pushButton');
358
+ return !actionElement.classList.contains('ac-pushButton');
292
359
  })) {
293
360
  console.warn('botframework-webchat: Cannot mark selected action in the card, some elements are not an "ac-pushButton".');
294
361
  return;
@@ -322,11 +389,7 @@ function indicateActionSelectionWithUndo(selectedActionElements, actionPerformed
322
389
  }
323
390
  });
324
391
  });
325
- return function () {
326
- return undoStack.forEach(function (undo) {
327
- return undo();
328
- });
329
- };
392
+ return bunchUndos.apply(void 0, undoStack);
330
393
  }
331
394
  /**
332
395
  * Fixes accessibility issues from Adaptive Card, with undo.
@@ -336,15 +399,18 @@ function indicateActionSelectionWithUndo(selectedActionElements, actionPerformed
336
399
 
337
400
 
338
401
  function fixAccessibilityIssuesWithUndo(element) {
339
- // These hacks should be done in Adaptive Cards library instead.
340
- var undoStack = []; // Related to #3949: All action buttons inside role="menubar" should be role="menuitem".
402
+ if (!element) {
403
+ return;
404
+ } // These hacks should be done in Adaptive Cards library instead.
405
+ // Related to #3949: All action buttons inside role="menubar" should be role="menuitem".
406
+
341
407
 
342
- undoStack.push.apply(undoStack, (0, _toConsumableArray2.default)(Array.from(element.querySelectorAll('.ac-actionSet[role="menubar"] [role="button"]')).map(function (actionButton) {
408
+ var undoStack = Array.from(element.querySelectorAll('.ac-actionSet[role="menubar"] [role="button"]')).map(function (actionButton) {
343
409
  return setAttributeWithUndo(actionButton, 'role', 'menuitem');
344
- })));
410
+ });
345
411
  return function () {
346
412
  return undoStack.forEach(function (undo) {
347
- return undo();
413
+ return undo === null || undo === void 0 ? void 0 : undo();
348
414
  });
349
415
  };
350
416
  }
@@ -357,8 +423,9 @@ function getFocusableElements(element) {
357
423
  }
358
424
 
359
425
  function restoreActiveElementIndex(element, activeElementIndex) {
360
- var focusable = getFocusableElements(element)[activeElementIndex];
361
- focusable && focusable.focus();
426
+ var _getFocusableElements;
427
+
428
+ (_getFocusableElements = getFocusableElements(element)[+activeElementIndex]) === null || _getFocusableElements === void 0 ? void 0 : _getFocusableElements.focus();
362
429
  }
363
430
 
364
431
  function saveActiveElementIndex(element) {
@@ -368,15 +435,17 @@ function saveActiveElementIndex(element) {
368
435
  function restoreInputValues(element, inputValues) {
369
436
  var inputs = element.querySelectorAll('input, select, textarea');
370
437
  [].forEach.call(inputs, function (input, index) {
371
- var value = inputValues[index];
438
+ var value = inputValues[+index];
372
439
 
373
440
  if (typeof value !== 'undefined') {
374
441
  var tagName = input.tagName,
375
442
  type = input.type;
376
443
 
377
444
  if (tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
378
- input.checked = value;
379
- } else {
445
+ if (typeof value === 'boolean') {
446
+ input.checked = value;
447
+ }
448
+ } else if (typeof value === 'string') {
380
449
  input.value = value;
381
450
  }
382
451
  }
@@ -385,25 +454,22 @@ function restoreInputValues(element, inputValues) {
385
454
 
386
455
  function saveInputValues(element) {
387
456
  var inputs = element.querySelectorAll('input, select, textarea');
388
- return [].map.call(inputs, function (_ref2) {
389
- var checked = _ref2.checked,
390
- tagName = _ref2.tagName,
391
- type = _ref2.type,
392
- value = _ref2.value;
393
-
394
- if (tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
395
- return checked;
457
+ return [].map.call(inputs, function (input) {
458
+ var type = input.type;
459
+
460
+ if (input.tagName === 'INPUT' && (type === 'checkbox' || type === 'radio')) {
461
+ return input.checked;
396
462
  }
397
463
 
398
- return value;
464
+ return input.value;
399
465
  });
400
466
  }
401
467
 
402
- var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
403
- var actionPerformedClassName = _ref3.actionPerformedClassName,
404
- adaptiveCard = _ref3.adaptiveCard,
405
- disabledFromProps = _ref3.disabled,
406
- tapAction = _ref3.tapAction;
468
+ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref2) {
469
+ var actionPerformedClassName = _ref2.actionPerformedClassName,
470
+ adaptiveCard = _ref2.adaptiveCard,
471
+ disabledFromProps = _ref2.disabled,
472
+ tapAction = _ref2.tapAction;
407
473
 
408
474
  var _useStyleSet = useStyleSet(),
409
475
  _useStyleSet2 = (0, _slicedToArray2.default)(_useStyleSet, 1),
@@ -450,9 +516,10 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
450
516
  // The null check for "tapAction" is in "handleClickAndKeyPressForTapAction".
451
517
 
452
518
  var handleClickAndKeyPress = (0, _react.useCallback)(function (event) {
453
- var key = event.key,
454
- target = event.target,
455
- type = event.type; // Some items, e.g. tappable text, cannot be disabled thru DOM attributes
519
+ var _ref3 = event,
520
+ key = _ref3.key,
521
+ type = _ref3.type;
522
+ var target = event.target; // Some items, e.g. tappable text, cannot be disabled thru DOM attributes
456
523
 
457
524
  var current = contentRef.current;
458
525
  var adaptiveCardRoot = current.querySelector('.ac-adaptiveCard[tabindex="0"]');
@@ -498,32 +565,39 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
498
565
 
499
566
  addActionsPerformed(action);
500
567
  var actionTypeName = action.getJsonTypeName();
568
+ var image = action.iconUrl,
569
+ title = action.title; // We cannot use "instanceof" check here, because web devs may bring their own version of Adaptive Cards package.
570
+ // We need to check using "getJsonTypeName()" instead.
501
571
 
502
572
  if (actionTypeName === 'Action.OpenUrl') {
573
+ var _ref4 = action,
574
+ value = _ref4.url;
503
575
  performCardAction({
576
+ image: image,
577
+ title: title,
504
578
  type: 'openUrl',
505
- value: action.url
579
+ value: value
506
580
  });
507
581
  } else if (actionTypeName === 'Action.Submit') {
508
- if (typeof action.data !== 'undefined') {
509
- var actionData = action.data;
510
-
511
- if (actionData && actionData.__isBotFrameworkCardAction) {
512
- var cardAction = actionData.cardAction;
513
- var displayText = cardAction.displayText,
514
- text = cardAction.text,
515
- type = cardAction.type,
516
- value = cardAction.value;
582
+ var _ref5 = action,
583
+ data = _ref5.data;
584
+
585
+ if (typeof data !== 'undefined') {
586
+ if (typeof data === 'string') {
517
587
  performCardAction({
518
- displayText: displayText,
519
- text: text,
520
- type: type,
521
- value: value
588
+ image: image,
589
+ title: title,
590
+ type: 'imBack',
591
+ value: data
522
592
  });
593
+ } else if (data.__isBotFrameworkCardAction) {
594
+ performCardAction(data.cardAction);
523
595
  } else {
524
596
  performCardAction({
525
- type: typeof action.data === 'string' ? 'imBack' : 'postBack',
526
- value: action.data
597
+ image: image,
598
+ title: title,
599
+ type: 'postBack',
600
+ value: data
527
601
  });
528
602
  }
529
603
  }
@@ -544,9 +618,11 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
544
618
  // TODO: [P3] Checks if we could make the "renderMarkdownAsHTML" per card
545
619
  // This could be limitations from Adaptive Cards package (not supported as of 1.2.5)
546
620
  // Because there could be timing difference between .parse and .render, we could be using wrong Markdown engine
621
+ // "onProcessMarkdown" is a static function but we are trying to scope it to the current object instead.
622
+ // eslint-disable-next-line dot-notation
547
623
 
548
624
 
549
- adaptiveCard.constructor.onProcessMarkdown = function (text, result) {
625
+ adaptiveCard.constructor['onProcessMarkdown'] = function (text, result) {
550
626
  if (renderMarkdownAsHTML) {
551
627
  result.outputHtml = renderMarkdownAsHTML(text);
552
628
  result.didProcess = true;
@@ -564,8 +640,8 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
564
640
  validationEvents = _adaptiveCard$validat.validationEvents;
565
641
 
566
642
  if (validationEvents.length) {
567
- return setErrors(validationEvents.reduce(function (items, _ref4) {
568
- var message = _ref4.message;
643
+ return setErrors(validationEvents.reduce(function (items, _ref6) {
644
+ var message = _ref6.message;
569
645
  return [].concat((0, _toConsumableArray2.default)(items), [new Error(message)]);
570
646
  }, []));
571
647
  }
@@ -617,8 +693,8 @@ var AdaptiveCardRenderer = function AdaptiveCardRenderer(_ref3) {
617
693
  (0, _react.useEffect)(function () {
618
694
  return indicateActionSelectionWithUndo( // Actions that do not have "renderedElement" means it is the Adaptive Card itself, such as "selectAction" (AC) or "tapAction" (rich cards).
619
695
  // We do not need to mark the whole card as performed.
620
- actionsPerformed.map(function (_ref5) {
621
- var renderedElement = _ref5.renderedElement;
696
+ actionsPerformed.map(function (_ref7) {
697
+ var renderedElement = _ref7.renderedElement;
622
698
  return renderedElement;
623
699
  }).filter(function (renderedElement) {
624
700
  return renderedElement;
@@ -644,11 +720,15 @@ AdaptiveCardRenderer.propTypes = {
644
720
  actionPerformedClassName: _propTypes.default.string,
645
721
  adaptiveCard: _propTypes.default.any.isRequired,
646
722
  disabled: _propTypes.default.bool,
723
+ // TypeScript class is not mappable to PropTypes.func
724
+ // @ts-ignore
647
725
  tapAction: _propTypes.default.shape({
726
+ image: _propTypes.default.string,
727
+ title: _propTypes.default.string,
648
728
  type: _propTypes.default.string.isRequired,
649
729
  value: _propTypes.default.string
650
730
  })
651
731
  };
652
732
  var _default = AdaptiveCardRenderer;
653
733
  exports.default = _default;
654
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGl2ZUNhcmRzL0F0dGFjaG1lbnQvQWRhcHRpdmVDYXJkUmVuZGVyZXIudHN4Il0sIm5hbWVzIjpbIkVycm9yQm94IiwiQ29tcG9uZW50cyIsInVzZURpc2FibGVkIiwiaG9va3MiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VQZXJmb3JtQ2FyZEFjdGlvbiIsInVzZVJlbmRlck1hcmtkb3duQXNIVE1MIiwidXNlU2Nyb2xsVG9FbmQiLCJ1c2VTdHlsZVNldCIsIm5vZGVfZW52IiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiYWRkQ2xhc3MiLCJlbGVtZW50IiwiY2xhc3NOYW1lIiwiY2xhc3NOYW1lcyIsIlNldCIsInNwbGl0IiwiaGFzIiwiYWRkIiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsImFkZFBlcnNpc3RlbnRDbGFzc1dpdGhVbmRvIiwib2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwib2JzZXJ2ZSIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVGaWx0ZXIiLCJkZWxldGUiLCJkaXNjb25uZWN0IiwiaXNQbGFpbk9iamVjdCIsIm9iaiIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwicHJvdG90eXBlIiwic2V0QXR0cmlidXRlV2l0aFVuZG8iLCJxdWFsaWZpZWROYW1lIiwibmV4dFZhbHVlIiwidmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJkaXNhYmxlZEhhbmRsZXIiLCJldmVudCIsInByZXZlbnREZWZhdWx0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyIsIm5hbWUiLCJoYW5kbGVyIiwiZGV0YWNoIiwiZGV0YWNoaW5nSGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsImFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyIsImRpc2FibGVFbGVtZW50V2l0aFVuZG8iLCJ1bmRvU3RhY2siLCJpc0FjdGl2ZSIsImRvY3VtZW50IiwiYWN0aXZlRWxlbWVudCIsInRhZyIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwibWFwIiwiY2FsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvcHRpb24iLCJmb3JFYWNoIiwidW5kbyIsImRpc2FibGVJbnB1dEVsZW1lbnRzV2l0aFVuZG8iLCJvYnNlcnZlU3VidHJlZSIsIm11dGF0aW9ucyIsImFkZGVkTm9kZXMiLCJhZGRlZE5vZGUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwiY29udGFpbnNDbGFzc05hbWUiLCJpbmNsdWRlcyIsImhhc0F0dHJpYnV0ZSIsInNldE9yUmVtb3ZlQXR0cmlidXRlIiwic2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyIsInByZXZWYWx1ZSIsImZpbmRBbmNlc3RvciIsInByZWRpY2F0ZSIsImN1cnJlbnQiLCJwYXJlbnRFbGVtZW50IiwiaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyIsInNlbGVjdGVkQWN0aW9uRWxlbWVudHMiLCJhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUiLCJsZW5ndGgiLCJzb21lIiwiYWN0aW9uRWxlbWVudCIsImNvbnNvbGUiLCJ3YXJuIiwiYWN0aW9uU2V0RWxlbWVudHMiLCJzZWxlY3RlZEFjdGlvbkVsZW1lbnQiLCJhY3Rpb25TZXRFbGVtZW50IiwiYW5jZXN0b3IiLCJmaXhBY2Nlc3NpYmlsaXR5SXNzdWVzV2l0aFVuZG8iLCJhY3Rpb25CdXR0b24iLCJnZXRGb2N1c2FibGVFbGVtZW50cyIsImZpbHRlciIsInRhYkluZGV4IiwicmVzdG9yZUFjdGl2ZUVsZW1lbnRJbmRleCIsImFjdGl2ZUVsZW1lbnRJbmRleCIsImZvY3VzYWJsZSIsImZvY3VzIiwic2F2ZUFjdGl2ZUVsZW1lbnRJbmRleCIsImluZGV4T2YiLCJyZXN0b3JlSW5wdXRWYWx1ZXMiLCJpbnB1dFZhbHVlcyIsImlucHV0cyIsImlucHV0IiwiaW5kZXgiLCJ0YWdOYW1lIiwidHlwZSIsImNoZWNrZWQiLCJzYXZlSW5wdXRWYWx1ZXMiLCJBZGFwdGl2ZUNhcmRSZW5kZXJlciIsImFkYXB0aXZlQ2FyZCIsImRpc2FibGVkRnJvbVByb3BzIiwiZGlzYWJsZWQiLCJ0YXBBY3Rpb24iLCJhZGFwdGl2ZUNhcmRSZW5kZXJlclN0eWxlU2V0IiwiYWRhcHRpdmVDYXJkUmVuZGVyZXIiLCJHbG9iYWxTZXR0aW5ncyIsIkhvc3RDb25maWciLCJhY3Rpb25zUGVyZm9ybWVkIiwic2V0QWN0aW9uc1BlcmZvcm1lZCIsImFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIiwiZGlzYWJsZWRGcm9tQ29tcG9zZXIiLCJlcnJvcnMiLCJzZXRFcnJvcnMiLCJsYXN0UmVuZGVyIiwic2V0TGFzdFJlbmRlciIsImFjdGl2ZUVsZW1lbnRJbmRleFJlZiIsImFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYiLCJjb250ZW50UmVmIiwiaW5wdXRWYWx1ZXNSZWYiLCJsb2NhbGl6ZSIsInBlcmZvcm1DYXJkQWN0aW9uIiwicmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJzY3JvbGxUb0VuZCIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3MiLCJrZXkiLCJ0YXJnZXQiLCJhZGFwdGl2ZUNhcmRSb290IiwicXVlcnlTZWxlY3RvciIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24iLCJ1bmRlZmluZWQiLCJhZGRBY3Rpb25zUGVyZm9ybWVkIiwiYWN0aW9uIiwiaGFuZGxlRXhlY3V0ZUFjdGlvbiIsImFjdGlvblR5cGVOYW1lIiwiZ2V0SnNvblR5cGVOYW1lIiwidXJsIiwiZGF0YSIsImFjdGlvbkRhdGEiLCJfX2lzQm90RnJhbWV3b3JrQ2FyZEFjdGlvbiIsImNhcmRBY3Rpb24iLCJkaXNwbGF5VGV4dCIsInRleHQiLCJlcnJvciIsImNvbnN0cnVjdG9yIiwib25Qcm9jZXNzTWFya2Rvd24iLCJyZXN1bHQiLCJvdXRwdXRIdG1sIiwiZGlkUHJvY2VzcyIsImhvc3RDb25maWciLCJzZXRUYWJJbmRleEF0Q2FyZFJvb3QiLCJ2YWxpZGF0ZVByb3BlcnRpZXMiLCJ2YWxpZGF0aW9uRXZlbnRzIiwicmVkdWNlIiwiaXRlbXMiLCJtZXNzYWdlIiwiRXJyb3IiLCJyZW5kZXIiLCJhcHBlbmRDaGlsZCIsIkRhdGUiLCJub3ciLCJyZW1vdmVDaGlsZCIsIm9uRXhlY3V0ZUFjdGlvbiIsInJlbmRlcmVkRWxlbWVudCIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImFueSIsImlzUmVxdWlyZWQiLCJib29sIiwic2hhcGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQVJBO0lBVVFBLFEsR0FBYUMsd0MsQ0FBYkQsUTtJQUNBRSxXLEdBQTBHQyxtQyxDQUExR0QsVztJQUFhRSxZLEdBQTZGRCxtQyxDQUE3RkMsWTtJQUFjQyxvQixHQUErRUYsbUMsQ0FBL0VFLG9CO0lBQXNCQyx1QixHQUF5REgsbUMsQ0FBekRHLHVCO0lBQXlCQyxjLEdBQWdDSixtQyxDQUFoQ0ksYztJQUFnQkMsVyxHQUFnQkwsbUMsQ0FBaEJLLFcsRUFFbEc7O0FBQ0EsSUFBTUMsUUFBUSxHQUFHQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsUUFBWixJQUF3QkMsT0FBTyxDQUFDQyxHQUFSLENBQVlDLFFBQXJEOztBQUVBLFNBQVNDLFFBQVQsQ0FBa0JDLE9BQWxCLEVBQTJCQyxTQUEzQixFQUFzQztBQUNwQyxNQUFNQyxVQUFVLEdBQUcsSUFBSUMsR0FBSixDQUFRSCxPQUFPLENBQUNDLFNBQVIsQ0FBa0JHLEtBQWxCLENBQXdCLEdBQXhCLENBQVIsQ0FBbkI7O0FBRUEsTUFBSSxDQUFDRixVQUFVLENBQUNHLEdBQVgsQ0FBZUosU0FBZixDQUFMLEVBQWdDO0FBQzlCQyxJQUFBQSxVQUFVLENBQUNJLEdBQVgsQ0FBZUwsU0FBZjtBQUVBRCxJQUFBQSxPQUFPLENBQUNDLFNBQVIsR0FBb0JNLEtBQUssQ0FBQ0MsSUFB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bnQiOlsiLyogZXNsaW50IG5vLW1hZ2ljLW51bWJlcnM6IFtcImVycm9yXCIsIHsgXCJpZ25vcmVcIjogWy0xLCAwLCAyXSB9XSAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnRzLCBnZXRUYWJJbmRleCwgaG9va3MgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1jb21wb25lbnQnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHVzZUFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIGZyb20gJy4uL2hvb2tzL3VzZUFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnJztcbmltcG9ydCB1c2VBZGFwdGl2ZUNhcmRzUGFja2FnZSBmcm9tICcuLi9ob29rcy91c2VBZGFwdGl2ZUNhcmRzUGFja2FnZSc7XG5cbmNvbnN0IHsgRXJyb3JCb3ggfSA9IENvbXBvbmVudHM7XG5jb25zdCB7IHVzZURpc2FibGVkLCB1c2VMb2NhbGl6ZXIsIHVzZVBlcmZvcm1DYXJkQWN0aW9uLCB1c2VSZW5kZXJNYXJrZG93bkFzSFRNTCwgdXNlU2Nyb2xsVG9FbmQsIHVzZVN0eWxlU2V0IH0gPSBob29rcztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5jb25zdCBub2RlX2VudiA9IHByb2Nlc3MuZW52Lm5vZGVfZW52IHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WO1xuXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgY29uc3QgY2xhc3NOYW1lcyA9IG5ldyBTZXQoZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoJyAnKSk7XG5cbiAgaWYgKCFjbGFzc05hbWVzLmhhcyhjbGFzc05hbWUpKSB7XG4gICAgY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTtcblxuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gQXJyYXkuZnJvbShjbGFzc05hbWVzKS5qb2luKCcgJyk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYWRkUGVyc2lzdGVudENsYXNzV2l0aFVuZG8oZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gIGlmIChhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpKSB7XG4gICAgLy8gQWZ0ZXIgd2UgYWRkIHRoZSBjbGFzcywga2VlcCBvYnNlcnZpbmcgdGhlIGVsZW1lbnQgdG8gbWFrZSBzdXJlIHRoZSBjbGFzcyBpcyBub3QgcmVtb3ZlZC5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkpO1xuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBuZXcgU2V0KGVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykpO1xuXG4gICAgICBjbGFzc05hbWVzLmRlbGV0ZShjbGFzc05hbWUpO1xuXG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IEFycmF5LmZyb20oY2xhc3NOYW1lcykuam9pbignICcpO1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVXaXRoVW5kbyhlbGVtZW50LCBxdWFsaWZpZWROYW1lLCBuZXh0VmFsdWUpIHtcbiAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcblxuICBpZiAodmFsdWUgIT09IG5leHRWYWx1ZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIG5leHRWYWx1ZSk7XG5cbiAgICByZXR1cm4gKCkgPT4gKHZhbHVlID8gZWxlbWVudC5zZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSwgdmFsdWUpIDogZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkpO1xuICB9XG59XG5cbmNvbnN0IGRpc2FibGVkSGFuZGxlciA9IGV2ZW50ID0+IHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufTtcblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyhlbGVtZW50LCBuYW1lLCBoYW5kbGVyKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QgKi9cbiAgbGV0IGRldGFjaDtcbiAgY29uc3QgZGV0YWNoaW5nSGFuZGxlciA9IGV2ZW50ID0+IHtcbiAgICB0cnkge1xuICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCB7IG9uY2U6IHRydWUgfSwgc28gd2UgbmVlZCB0byBkZXRhY2ggbWFudWFsbHkuXG4gICAgICBkZXRhY2goKTtcbiAgICB9XG4gIH07XG5cbiAgZGV0YWNoID0gKCkgPT4gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGRldGFjaGluZ0hhbmRsZXIpO1xuXG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBkZXRhY2hpbmdIYW5kbGVyLCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgcmV0dXJuIGRldGFjaDtcbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcldpdGhVbmRvKGVsZW1lbnQsIG5hbWUsIGhhbmRsZXIpIHtcbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIpO1xuXG4gIHJldHVybiAoKSA9PiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlcik7XG59XG5cbmZ1bmN0aW9uIGRpc2FibGVFbGVtZW50V2l0aFVuZG8oZWxlbWVudCkge1xuICBjb25zdCB1bmRvU3RhY2sgPSBbXTtcbiAgY29uc3QgaXNBY3RpdmUgPSBlbGVtZW50ID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBjb25zdCB0YWcgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlZmF1bHQtY2FzZSAqL1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2FyaWEtZGlzYWJsZWQnLCAndHJ1ZScpKTtcblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKFxuICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXJPbmNlV2l0aFVuZG8oZWxlbWVudCwgJ2JsdXInLCAoKSA9PlxuICAgICAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJykpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJykge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChhZGRFdmVudExpc3RlbmVyV2l0aFVuZG8oZWxlbWVudCwgJ2NsaWNrJywgZGlzYWJsZWRIYW5kbGVyKSk7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKHNldEF0dHJpYnV0ZVdpdGhVbmRvKGVsZW1lbnQsICdyZWFkb25seScsICdyZWFkb25seScpKTtcbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSAnc2VsZWN0Jykge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChcbiAgICAgICAgICAuLi5bXS5tYXAuY2FsbChlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpLCBvcHRpb24gPT5cbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZVdpdGhVbmRvKG9wdGlvbiwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJylcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuICgpID0+IHVuZG9TdGFjay5mb3JFYWNoKHVuZG8gPT4gdW5kbyAmJiB1bmRvKCkpO1xufVxuXG5mdW5jdGlvbiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvYnNlcnZlU3VidHJlZSA9IHRydWUpIHtcbiAgY29uc3QgdW5kb1N0YWNrID0gW10ubWFwLmNhbGwoZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhJyksIGVsZW1lbnQgPT5cbiAgICBkaXNhYmxlRWxlbWVudFdpdGhVbmRvKGVsZW1lbnQpXG4gICk7XG5cbiAgY29uc3QgdGFnID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIE9ubHkgc2V0IHRhYmluZGV4PVwiLTFcIiBvbiBmb2N1c2FibGUgZWxlbWVudC4gT3RoZXJ3aXNlLCB3ZSB3aWxsIG1ha2UgPGRpdj4gZm9jdXNhYmxlIGJ5IG1vdXNlLlxuICAodGFnID09PSAnYScgfHwgdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYScpICYmXG4gICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ3RhYmluZGV4JywgJy0xJykpO1xuXG4gIGlmIChvYnNlcnZlU3VidHJlZSkge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+XG4gICAgICBtdXRhdGlvbnMuZm9yRWFjaCgoeyBhZGRlZE5vZGVzIH0pID0+XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKC4uLltdLm1hcC5jYWxsKGFkZGVkTm9kZXMsIGFkZGVkTm9kZSA9PiBkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvKGFkZGVkTm9kZSwgZmFsc2UpKSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgIHVuZG9TdGFjay5wdXNoKCgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKSk7XG4gIH1cblxuICByZXR1cm4gKCkgPT4gdW5kb1N0YWNrLmZvckVhY2godW5kbyA9PiB1bmRvICYmIHVuZG8oKSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgY29udGFpbnMgYSBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gY2hlY2sgZm9yIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gY2hlY2sgZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZWxlbWVudCBjb250YWlucyB0aGUgY2xhc3MsIG90aGVyd2lzZSwgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNDbGFzc05hbWUoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoZWxlbWVudC5jbGFzc05hbWUgfHwgJycpLnNwbGl0KCcgJykuaW5jbHVkZXMoY2xhc3NOYW1lKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgZnJvbSBhbiBlbGVtZW50LlxuICpcbiAqIEByZXR1cm5zIHtmYWxzZSB8IHN0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIGBmYWxzZWAgaWYgdGhlIGF0dHJpYnV0ZSB3YXMgbm90IHNldC5cbiAqL1xuZnVuY3Rpb24gZ2V0QXR0cmlidXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBxdWFsaWZpZWROYW1lOiBzdHJpbmcpOiBmYWxzZSB8IHN0cmluZyB7XG4gIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcbn1cblxuLyoqXG4gKiBTZXRzIG9yIHJlbW92ZXMgYW4gYXR0cmlidXRlIGZyb20gYW4gZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc2V0IG9yIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7ZmFsc2UgfCBzdHJpbmd9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIFdoZW4gcGFzc2luZyBgZmFsc2VgLCByZW1vdmUgdGhlIGF0dHJpYnV0ZS5cbiAqL1xuZnVuY3Rpb24gc2V0T3JSZW1vdmVBdHRyaWJ1dGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIHF1YWxpZmllZE5hbWU6IHN0cmluZywgdmFsdWU6IGZhbHNlIHwgc3RyaW5nKTogdm9pZCB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShxdWFsaWZpZWROYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXRzIG9yIHJlbW92ZXMgYW4gYXR0cmlidXRlIGZyb20gYW4gZWxlbWVudCB3aXRoIGFuIHVuZG8gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHNldCBvciByZW1vdmUgYXR0cmlidXRlIGZyb20uXG4gKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge2ZhbHNlIHwgc3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiBXaGVuIHBhc3NpbmcgYGZhbHNlYCwgcmVtb3ZlIHRoZSBhdHRyaWJ1dGUuXG4gKlxuICogQHJldHVybnMgeygpID0+IHZvaWR9IFRoZSB1bmRvIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCB1bmRvIGFsbCBtYW5pcHVsYXRpb25zIGJ5IHJlc3RvcmluZyB2YWx1ZXMgcmVjb3JkZWQgYXQgdGhlIHRpbWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIHNldE9yUmVtb3ZlQXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudDogSFRNTEVsZW1lbnQsIHF1YWxpZmllZE5hbWU6IHN0cmluZywgdmFsdWU6IGZhbHNlIHwgc3RyaW5nKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHByZXZWYWx1ZSA9IGdldEF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lKTtcblxuICBzZXRPclJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lLCB2YWx1ZSk7XG5cbiAgcmV0dXJuICgpID0+IHNldE9yUmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIHF1YWxpZmllZE5hbWUsIHByZXZWYWx1ZSk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGZpcnN0IGFuY2VzdG9yIHRoYXQgZnVsZmlsbCB0aGUgcHJlZGljYXRlLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgc3RhcnRpbmcgZWxlbWVudC4gVGhpcyBlbGVtZW50IHdpbGwgbm90IGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgcHJlZGljYXRlLlxuICogQHBhcmFtIHsoYW5jZXN0b3I6IEhUTUxFbGVtZW50KSA9PiBib29sZWFufSBwcmVkaWNhdGUgLSBUaGUgcHJlZGljYXRlIHRvIGZ1bGZpbGwuXG4gKlxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgdW5kZWZpbmVkfSBUaGUgZmlyc3QgYW5jZXN0b3IgdGhhdCBmdWxmaWxsIHRoZSBwcmVkaWNhdGUsIG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRBbmNlc3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCwgcHJlZGljYXRlOiAoYW5jZXN0b3I6IEhUTUxFbGVtZW50KSA9PiBib29sZWFuKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcblxuICB3aGlsZSAoY3VycmVudCkge1xuICAgIGlmIChwcmVkaWNhdGUuY2FsbChlbGVtZW50LCBjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgfVxufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGUgYWN0aW9uIHNlbGVjdGVkIGJ5IHBlcmZvcm1pbmcgYSBzZXJpZXMgb2YgbWFuaXB1bGF0aW9ucywgd2l0aCB1bmRvOlxuICpcbiAqIC0gQWNjZXNzaWJpbGl0eTogc2V0IGBhcmlhLXByZXNzZWRgIHRvIGB0cnVlYFxuICogLSBBcHBsaWVzIGBzdHlsZU9wdGlvbnMuYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lYFxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnRbXX0gc2VsZWN0ZWRBY3Rpb25FbGVtZW50cyAtIEFuIGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHJlcHJlc2VudGluZyB0aGUgYWN0aW9uIGFuZCBpcyBzZWxlY3RlZC5cbiAqIEBwYXJhbSB7c3RyaW5nP30gYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGFwcGx5IHRvIGFsbCBlbGVtZW50cy5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVGhlIHVuZG8gZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHVuZG8gYWxsIG1hbmlwdWxhdGlvbnMgYnkgcmVzdG9yaW5nIHZhbHVlcyByZWNvcmRlZCBhdCB0aGUgdGltZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZnVuY3Rpb24gaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyhcbiAgc2VsZWN0ZWRBY3Rpb25FbGVtZW50czogSFRNTEVsZW1lbnRbXSxcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lPzogc3RyaW5nXG4pOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQge1xuICBpZiAoIXNlbGVjdGVkQWN0aW9uRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVmVyaWZ5IGFsbCBpbnB1dCBlbGVtZW50cyBhcmUgXCJhYy1wdXNoQnV0dG9uXCIsIGNvdWxkIGJlbG9uZ3MgdG8gQWN0aW9uU2V0IG9yIFwiY2FyZCBhY3Rpb25zXCIuXG4gIGlmIChzZWxlY3RlZEFjdGlvbkVsZW1lbnRzLnNvbWUoYWN0aW9uRWxlbWVudCA9PiAhY29udGFpbnNDbGFzc05hbWUoYWN0aW9uRWxlbWVudCwgJ2FjLXB1c2hCdXR0b24nKSkpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnYm90ZnJhbWV3b3JrLXdlYmNoYXQ6IENhbm5vdCBtYXJrIHNlbGVjdGVkIGFjdGlvbiBpbiB0aGUgY2FyZCwgc29tZSBlbGVtZW50cyBhcmUgbm90IGFuIFwiYWMtcHVzaEJ1dHRvblwiLidcbiAgICApO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQSBkaXN0aW5jdCBzZXQgb2YgYWN0aW9uIHNldCBjb250YWluZXJzIHdoaWNoIGhhcyBzZWxlY3Rpb25zLCBleGNsdWRpbmcgY29udGFpbmVycyB3aXRob3V0IGFjdGlvbnMuXG4gIC8vIE11bHRpcGxlIHN1Ym1pc3Npb24gaW4gYW4gQWRhcHRpdmUgQ2FyZCBpcyBzdGlsbCBhIHZhZ3VlIGFyZWEgYW5kIFRCRC5cbiAgLy8gV2UgbWlnaHQgd2FudCB0byBkaXNhYmxlIHRoZSB3aG9sZSBjYXJkLCBqdXN0IGJ1dHRvbnMgaW4gc2FtZSBjb250YWluZXIsIG9yIGRvIG5vdGhpbmcgKHRvZGF5KS5cbiAgY29uc3QgYWN0aW9uU2V0RWxlbWVudHMgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuXG4gIHNlbGVjdGVkQWN0aW9uRWxlbWVudHMuZm9yRWFjaChzZWxlY3RlZEFjdGlvbkVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGFjdGlvblNldEVsZW1lbnQgPSBmaW5kQW5jZXN0b3IoXG4gICAgICBzZWxlY3RlZEFjdGlvbkVsZW1lbnQsXG4gICAgICBhbmNlc3RvciA9PiBhbmNlc3Rvci5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ21lbnViYXInXG4gICAgKTtcblxuICAgIGFjdGlvblNldEVsZW1lbnQgJiYgYWN0aW9uU2V0RWxlbWVudHMuYWRkKGFjdGlvblNldEVsZW1lbnQpO1xuICB9KTtcblxuICBjb25zdCB1bmRvU3RhY2s6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgYWN0aW9uU2V0RWxlbWVudHMuZm9yRWFjaChhY3Rpb25TZXRFbGVtZW50ID0+IHtcbiAgICAvLyBSZW1vdmUgXCJyb2xlXCIgZnJvbSBldmVyeSBcImFjLWFjdGlvblNldFwiIGNvbnRhaW5lci5cbiAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvblNldEVsZW1lbnQsICdyb2xlJywgZmFsc2UpKTtcblxuICAgIC8vIE1vZGlmeSBcInJvbGVcIiBvZiBldmVyeSBhY3Rpb25zIGluIHRoZSBjb250YWluZXIuXG4gICAgQXJyYXkuZnJvbShhY3Rpb25TZXRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hYy1wdXNoQnV0dG9uJykgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD4pLmZvckVhY2goXG4gICAgICBhY3Rpb25FbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdGVkQWN0aW9uRWxlbWVudHMuaW5jbHVkZXMoYWN0aW9uRWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBBZGQgXCJhcmlhLXByZXNzZWRcIiBhbmQgc2V0IFwicm9sZVwiIGF0dHJpYnV0ZSB0byBcImJ1dHRvblwiICh3aGljaCBpcyByZXF1aXJlZCBieSBcImFyaWEtcHJlc3NlZFwiKS5cbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdhcmlhLXByZXNzZWQnLCAndHJ1ZScpKTtcbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdyb2xlJywgJ2J1dHRvbicpKTtcblxuICAgICAgICAgIC8vIEhpZ2hsaWdodCBhY3Rpb25zIGJ5IGFwcGx5aW5nIGBzdHlsZU9wdGlvbnMuYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lYC5cbiAgICAgICAgICBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUgJiZcbiAgICAgICAgICAgIHVuZG9TdGFjay5wdXNoKGFkZFBlcnNpc3RlbnRDbGFzc1dpdGhVbmRvKGFjdGlvbkVsZW1lbnQsIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdlIHJlbW92ZWQgXCJyb2xlPW1lbnViYXJcIiBmcm9tIHRoZSBjb250YWluZXIsIHdlIG11c3QgcmVtb3ZlIFwicm9sZT1tZW51aXRlbVwiIGZyb20gdW5zZWxlY3RlZCBhY3Rpb25zLlxuICAgICAgICAgIHVuZG9TdGFjay5wdXNoKHNldE9yUmVtb3ZlQXR0cmlidXRlV2l0aFVuZG8oYWN0aW9uRWxlbWVudCwgJ3JvbGUnLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG5cbiAgcmV0dXJuICgpID0+IHVuZG9TdGFjay5mb3JFYWNoKHVuZG8gPT4gdW5kbygpKTtcbn1cblxuLyoqXG4gKiBGaXhlcyBhY2Nlc3NpYmlsaXR5IGlzc3VlcyBmcm9tIEFkYXB0aXZlIENhcmQsIHdpdGggdW5kby5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVGhlIHVuZG8gZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHVuZG8gYWxsIG1hbmlwdWxhdGlvbnMgYnkgcmVzdG9yaW5nIHZhbHVlcyByZWNvcmRlZCBhdCB0aGUgdGltZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZml4QWNjZXNzaWJpbGl0eUlzc3Vlc1dpdGhVbmRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogKCkgPT4gdm9pZCB7XG4gIC8vIFRoZXNlIGhhY2tzIHNob3VsZCBiZSBkb25lIGluIEFkYXB0aXZlIENhcmRzIGxpYnJhcnkgaW5zdGVhZC5cbiAgY29uc3QgdW5kb1N0YWNrOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIC8vIFJlbGF0ZWQgdG8gIzM5NDk6IEFsbCBhY3Rpb24gYnV0dG9ucyBpbnNpZGUgcm9sZT1cIm1lbnViYXJcIiBzaG91bGQgYmUgcm9sZT1cIm1lbnVpdGVtXCIuXG4gIHVuZG9TdGFjay5wdXNoKFxuICAgIC4uLkFycmF5LmZyb20oZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWMtYWN0aW9uU2V0W3JvbGU9XCJtZW51YmFyXCJdIFtyb2xlPVwiYnV0dG9uXCJdJykpLm1hcChhY3Rpb25CdXR0b24gPT5cbiAgICAgIHNldEF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkJ1dHRvbiwgJ3JvbGUnLCAnbWVudWl0ZW0nKVxuICAgIClcbiAgKTtcblxuICByZXR1cm4gKCkgPT4gdW5kb1N0YWNrLmZvckVhY2godW5kbyA9PiB1bmRvKCkpO1xufVxuXG5mdW5jdGlvbiBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50KSB7XG4gIHJldHVybiBbXS5maWx0ZXIuY2FsbChcbiAgICBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBbXG4gICAgICAgICdhJyxcbiAgICAgICAgJ2JvZHknLFxuICAgICAgICAnYnV0dG9uJyxcbiAgICAgICAgJ2ZyYW1lJyxcbiAgICAgICAgJ2lmcmFtZScsXG4gICAgICAgICdpbWcnLFxuICAgICAgICAnaW5wdXQnLFxuICAgICAgICAnaXNpbmRleCcsXG4gICAgICAgICdvYmplY3QnLFxuICAgICAgICAnc2VsZWN0JyxcbiAgICAgICAgJ3RleHRhcmVhJyxcbiAgICAgICAgJ1t0YWJpbmRleF0nXG4gICAgICBdLmpvaW4oJywgJylcbiAgICApLFxuICAgIGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgdGFiSW5kZXggPSBnZXRUYWJJbmRleChlbGVtZW50KTtcblxuICAgICAgcmV0dXJuIHR5cGVvZiB0YWJJbmRleCA9PT0gJ251bWJlcicgJiYgdGFiSW5kZXggPj0gMDtcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVBY3RpdmVFbGVtZW50SW5kZXgoZWxlbWVudCwgYWN0aXZlRWxlbWVudEluZGV4KSB7XG4gIGNvbnN0IGZvY3VzYWJsZSA9IGdldEZvY3VzYWJsZUVsZW1lbnRzKGVsZW1lbnQpW2FjdGl2ZUVsZW1lbnRJbmRleF07XG5cbiAgZm9jdXNhYmxlICYmIGZvY3VzYWJsZS5mb2N1cygpO1xufVxuXG5mdW5jdGlvbiBzYXZlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldEZvY3VzYWJsZUVsZW1lbnRzKGVsZW1lbnQpLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVJbnB1dFZhbHVlcyhlbGVtZW50LCBpbnB1dFZhbHVlcykge1xuICBjb25zdCBpbnB1dHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG5cbiAgW10uZm9yRWFjaC5jYWxsKGlucHV0cywgKGlucHV0LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gaW5wdXRWYWx1ZXNbaW5kZXhdO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IHsgdGFnTmFtZSwgdHlwZSB9ID0gaW5wdXQ7XG5cbiAgICAgIGlmICh0YWdOYW1lID09PSAnSU5QVVQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpKSB7XG4gICAgICAgIGlucHV0LmNoZWNrZWQgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2F2ZUlucHV0VmFsdWVzKGVsZW1lbnQpIHtcbiAgY29uc3QgaW5wdXRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuXG4gIHJldHVybiBbXS5tYXAuY2FsbChpbnB1dHMsICh7IGNoZWNrZWQsIHRhZ05hbWUsIHR5cGUsIHZhbHVlIH0pID0+IHtcbiAgICBpZiAodGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKSkge1xuICAgICAgcmV0dXJuIGNoZWNrZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9KTtcbn1cblxuY29uc3QgQWRhcHRpdmVDYXJkUmVuZGVyZXIgPSAoeyBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUsIGFkYXB0aXZlQ2FyZCwgZGlzYWJsZWQ6IGRpc2FibGVkRnJvbVByb3BzLCB0YXBBY3Rpb24gfSkgPT4ge1xuICBjb25zdCBbeyBhZGFwdGl2ZUNhcmRSZW5kZXJlcjogYWRhcHRpdmVDYXJkUmVuZGVyZXJTdHlsZVNldCB9XSA9IHVzZVN0eWxlU2V0KCk7XG4gIGNvbnN0IFt7IEdsb2JhbFNldHRpbmdzLCBIb3N0Q29uZmlnIH1dID0gdXNlQWRhcHRpdmVDYXJkc1BhY2thZ2UoKTtcbiAgY29uc3QgW2FjdGlvbnNQZXJmb3JtZWQsIHNldEFjdGlvbnNQZXJmb3JtZWRdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbYWRhcHRpdmVDYXJkc0hvc3RDb25maWddID0gdXNlQWRhcHRpdmVDYXJkc0hvc3RDb25maWcoKTtcbiAgY29uc3QgW2Rpc2FibGVkRnJvbUNvbXBvc2VyXSA9IHVzZURpc2FibGVkKCk7XG4gIGNvbnN0IFtlcnJvcnMsIHNldEVycm9yc10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtsYXN0UmVuZGVyLCBzZXRMYXN0UmVuZGVyXSA9IHVzZVN0YXRlKDApO1xuICBjb25zdCBhY3RpdmVFbGVtZW50SW5kZXhSZWYgPSB1c2VSZWYoLTEpO1xuICBjb25zdCBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmID0gdXNlUmVmPEhUTUxFbGVtZW50PigpO1xuICBjb25zdCBjb250ZW50UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PigpO1xuICBjb25zdCBpbnB1dFZhbHVlc1JlZiA9IHVzZVJlZihbXSk7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKCk7XG4gIGNvbnN0IHBlcmZvcm1DYXJkQWN0aW9uID0gdXNlUGVyZm9ybUNhcmRBY3Rpb24oKTtcbiAgY29uc3QgcmVuZGVyTWFya2Rvd25Bc0hUTUwgPSB1c2VSZW5kZXJNYXJrZG93bkFzSFRNTCgpO1xuICBjb25zdCBzY3JvbGxUb0VuZCA9IHVzZVNjcm9sbFRvRW5kKCk7XG5cbiAgY29uc3QgZGlzYWJsZWQgPSBkaXNhYmxlZEZyb21Db21wb3NlciB8fCBkaXNhYmxlZEZyb21Qcm9wcztcblxuICAvLyBUT0RPOiBbUDJdICMzMTk5IFdlIHNob3VsZCBjb25zaWRlciB1c2luZyBgYWRhcHRpdmVDYXJkLnNlbGVjdEFjdGlvbmAgaW5zdGVhZC5cbiAgLy8gVGhlIG51bGwgY2hlY2sgZm9yIFwidGFwQWN0aW9uXCIgaXMgaW4gXCJoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uXCIuXG4gIGNvbnN0IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3MgPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IGtleSwgdGFyZ2V0LCB0eXBlIH0gPSBldmVudDtcblxuICAgICAgLy8gU29tZSBpdGVtcywgZS5nLiB0YXBwYWJsZSB0ZXh0LCBjYW5ub3QgYmUgZGlzYWJsZWQgdGhydSBET00gYXR0cmlidXRlc1xuICAgICAgY29uc3QgeyBjdXJyZW50IH0gPSBjb250ZW50UmVmO1xuICAgICAgY29uc3QgYWRhcHRpdmVDYXJkUm9vdCA9IGN1cnJlbnQucXVlcnlTZWxlY3RvcignLmFjLWFkYXB0aXZlQ2FyZFt0YWJpbmRleD1cIjBcIl0nKTtcblxuICAgICAgaWYgKCFhZGFwdGl2ZUNhcmRSb290KSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ2JvdGZyYW1ld29yay13ZWJjaGF0OiBObyBBZGFwdGl2ZSBDYXJkIHJvb3QgY29udGFpbmVyIGNhbiBiZSBmb3VuZDsgdGhlIGNhcmQgaXMgcHJvYmFibHkgb24gYW4gdW5zdXBwb3J0ZWQgQWRhcHRpdmUgQ2FyZCB2ZXJzaW9uLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIFwia2V5cHJlc3NcIiBldmVudCwgd2Ugb25seSBsaXN0ZW4gdG8gRU5URVIgYW5kIFNQQUNFQkFSIGtleS5cbiAgICAgIGlmICh0eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICAgIGlmIChrZXkgIT09ICdFbnRlcicgJiYga2V5ICE9PSAnICcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSB3aWxsIGNhbGwgcGVyZm9ybUNhcmRBY3Rpb24gaWYgZWl0aGVyOlxuICAgICAgLy8gMS4gV2UgYXJlIG9uIHRoZSB0YXJnZXQsIG9yXG4gICAgICAvLyAyLiBUaGUgZXZlbnQtZGlzcGF0Y2hpbmcgZWxlbWVudCBpcyBub3QgaW50ZXJhY3RpdmVcbiAgICAgIGlmICh0YXJnZXQgIT09IGFkYXB0aXZlQ2FyZFJvb3QpIHtcbiAgICAgICAgY29uc3QgdGFiSW5kZXggPSBnZXRUYWJJbmRleCh0YXJnZXQpO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGlzIGNsaWNraW5nIG9uIHNvbWV0aGluZyB0aGF0IGlzIGFscmVhZHkgY2xpY2thYmxlLCBkbyBub3QgYWxsb3cgdGhlbSB0byBjbGljayB0aGUgY2FyZC5cbiAgICAgICAgLy8gRS5nLiBhIGhlcm8gY2FyZCBjYW4gYmUgdGFwcGFibGUsIGFuZCBpbWFnZSBhbmQgYnV0dG9ucyBpbnNpZGUgdGhlIGhlcm8gY2FyZCBjYW4gYWxzbyBiZSB0YXBwYWJsZS5cbiAgICAgICAgaWYgKHR5cGVvZiB0YWJJbmRleCA9PT0gJ251bWJlcicgJiYgdGFiSW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwZXJmb3JtQ2FyZEFjdGlvbih0YXBBY3Rpb24pO1xuICAgICAgc2Nyb2xsVG9FbmQoKTtcbiAgICB9LFxuICAgIFtjb250ZW50UmVmLCBwZXJmb3JtQ2FyZEFjdGlvbiwgc2Nyb2xsVG9FbmQsIHRhcEFjdGlvbl1cbiAgKTtcblxuICAvLyBPbmx5IGxpc3RlbiB0byBldmVudCBpZiBpdCBpcyBub3QgZGlzYWJsZWQgYW5kIGhhdmUgXCJ0YXBBY3Rpb25cIiBwcm9wLlxuICBjb25zdCBoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uID0gIWRpc2FibGVkICYmIHRhcEFjdGlvbiA/IGhhbmRsZUNsaWNrQW5kS2V5UHJlc3MgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYWRkQWN0aW9uc1BlcmZvcm1lZCA9IHVzZUNhbGxiYWNrKFxuICAgIGFjdGlvbiA9PiAhfmFjdGlvbnNQZXJmb3JtZWQuaW5kZXhPZihhY3Rpb24pICYmIHNldEFjdGlvbnNQZXJmb3JtZWQoWy4uLmFjdGlvbnNQZXJmb3JtZWQsIGFjdGlvbl0pLFxuICAgIFthY3Rpb25zUGVyZm9ybWVkLCBzZXRBY3Rpb25zUGVyZm9ybWVkXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUV4ZWN1dGVBY3Rpb24gPSB1c2VDYWxsYmFjayhcbiAgICBhY3Rpb24gPT4ge1xuICAgICAgLy8gU29tZSBpdGVtcywgZS5nLiB0YXBwYWJsZSBpbWFnZSwgY2Fubm90IGJlIGRpc2FibGVkIHRocnUgRE9NIGF0dHJpYnV0ZXNcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFkZEFjdGlvbnNQZXJmb3JtZWQoYWN0aW9uKTtcblxuICAgICAgY29uc3QgYWN0aW9uVHlwZU5hbWUgPSBhY3Rpb24uZ2V0SnNvblR5cGVOYW1lKCk7XG5cbiAgICAgIGlmIChhY3Rpb25UeXBlTmFtZSA9PT0gJ0FjdGlvbi5PcGVuVXJsJykge1xuICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbih7XG4gICAgICAgICAgdHlwZTogJ29wZW5VcmwnLFxuICAgICAgICAgIHZhbHVlOiBhY3Rpb24udXJsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChhY3Rpb25UeXBlTmFtZSA9PT0gJ0FjdGlvbi5TdWJtaXQnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgY29uc3QgeyBkYXRhOiBhY3Rpb25EYXRhIH0gPSBhY3Rpb247XG5cbiAgICAgICAgICBpZiAoYWN0aW9uRGF0YSAmJiBhY3Rpb25EYXRhLl9faXNCb3RGcmFtZXdvcmtDYXJkQWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCB7IGNhcmRBY3Rpb24gfSA9IGFjdGlvbkRhdGE7XG4gICAgICAgICAgICBjb25zdCB7IGRpc3BsYXlUZXh0LCB0ZXh0LCB0eXBlLCB2YWx1ZSB9ID0gY2FyZEFjdGlvbjtcblxuICAgICAgICAgICAgcGVyZm9ybUNhcmRBY3Rpb24oeyBkaXNwbGF5VGV4dCwgdGV4dCwgdHlwZSwgdmFsdWUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKHtcbiAgICAgICAgICAgICAgdHlwZTogdHlwZW9mIGFjdGlvbi5kYXRhID09PSAnc3RyaW5nJyA/ICdpbUJhY2snIDogJ3Bvc3RCYWNrJyxcbiAgICAgICAgICAgICAgdmFsdWU6IGFjdGlvbi5kYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzY3JvbGxUb0VuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgV2ViIENoYXQ6IHJlY2VpdmVkIHVua25vd24gYWN0aW9uIGZyb20gQWRhcHRpdmUgQ2FyZHNgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihhY3Rpb24pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2FkZEFjdGlvbnNQZXJmb3JtZWQsIGRpc2FibGVkLCBwZXJmb3JtQ2FyZEFjdGlvbiwgc2Nyb2xsVG9FbmRdXG4gICk7XG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7IGN1cnJlbnQgfSA9IGNvbnRlbnRSZWY7XG5cbiAgICBpZiAoIWN1cnJlbnQgfHwgIWFkYXB0aXZlQ2FyZCkge1xuICAgICAgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQgPSAtMTtcbiAgICAgIGlucHV0VmFsdWVzUmVmLmN1cnJlbnQgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDdXJyZW50bHksIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIE1hcmtkb3duIGVuZ2luZSBpcyB0byBzZXQgaXQgdGhydSBzdGF0aWMgbWVtYmVyIG9mIEFkYXB0aXZlQ2FyZCBjbGFzc1xuXG4gICAgLy8gVE9ETzogW1AzXSBDaGVja3MgaWYgd2UgY291bGQgbWFrZSB0aGUgXCJyZW5kZXJNYXJrZG93bkFzSFRNTFwiIHBlciBjYXJkXG4gICAgLy8gICAgICAgVGhpcyBjb3VsZCBiZSBsaW1pdGF0aW9ucyBmcm9tIEFkYXB0aXZlIENhcmRzIHBhY2thZ2UgKG5vdCBzdXBwb3J0ZWQgYXMgb2YgMS4yLjUpXG4gICAgLy8gICAgICAgQmVjYXVzZSB0aGVyZSBjb3VsZCBiZSB0aW1pbmcgZGlmZmVyZW5jZSBiZXR3ZWVuIC5wYXJzZSBhbmQgLnJlbmRlciwgd2UgY291bGQgYmUgdXNpbmcgd3JvbmcgTWFya2Rvd24gZW5naW5lXG5cbiAgICBhZGFwdGl2ZUNhcmQuY29uc3RydWN0b3Iub25Qcm9jZXNzTWFya2Rvd24gPSAodGV4dCwgcmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVuZGVyTWFya2Rvd25Bc0hUTUwpIHtcbiAgICAgICAgcmVzdWx0Lm91dHB1dEh0bWwgPSByZW5kZXJNYXJrZG93bkFzSFRNTCh0ZXh0KTtcbiAgICAgICAgcmVzdWx0LmRpZFByb2Nlc3MgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoYWRhcHRpdmVDYXJkc0hvc3RDb25maWcpIHtcbiAgICAgIGFkYXB0aXZlQ2FyZC5ob3N0Q29uZmlnID0gaXNQbGFpbk9iamVjdChhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZylcbiAgICAgICAgPyBuZXcgSG9zdENvbmZpZyhhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZylcbiAgICAgICAgOiBhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZztcbiAgICB9XG5cbiAgICAvLyBGb3IgYWNjZXNzaWJpbGl0eSBpc3N1ZSAjMTM0MCwgYHRhYmluZGV4PVwiMFwiYCBtdXN0IG5vdCBiZSBzZXQgZm9yIHRoZSByb290IGNvbnRhaW5lciBpZiBpdCBpcyBub3QgaW50ZXJhY3RpdmUuXG4gICAgR2xvYmFsU2V0dGluZ3Muc2V0VGFiSW5kZXhBdENhcmRSb290ID0gISF0YXBBY3Rpb247XG5cbiAgICBjb25zdCB7IHZhbGlkYXRpb25FdmVudHMgfSA9IGFkYXB0aXZlQ2FyZC52YWxpZGF0ZVByb3BlcnRpZXMoKTtcblxuICAgIGlmICh2YWxpZGF0aW9uRXZlbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHNldEVycm9ycyh2YWxpZGF0aW9uRXZlbnRzLnJlZHVjZSgoaXRlbXMsIHsgbWVzc2FnZSB9KSA9PiBbLi4uaXRlbXMsIG5ldyBFcnJvcihtZXNzYWdlKV0sIFtdKSk7XG4gICAgfVxuXG4gICAgbGV0IGVsZW1lbnQ7XG5cbiAgICB0cnkge1xuICAgICAgZWxlbWVudCA9IGFkYXB0aXZlQ2FyZC5yZW5kZXIoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHNldEVycm9ycyhbZXJyb3JdKTtcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBzZXRFcnJvcnMoW25ldyBFcnJvcignQWRhcHRpdmUgQ2FyZCByZW5kZXJlZCBhcyBlbXB0eSBlbGVtZW50JyldKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBlcnJvcnMgb24gbmV4dCByZW5kZXJcbiAgICBzZXRFcnJvcnMoW10pO1xuXG4gICAgcmVzdG9yZUlucHV0VmFsdWVzKGVsZW1lbnQsIGlucHV0VmFsdWVzUmVmLmN1cnJlbnQpO1xuXG4gICAgY3VycmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQgPSBlbGVtZW50O1xuXG4gICAgLy8gRm9jdXMgY2FuIG9ubHkgYmUgcmVzdG9yZWQgYWZ0ZXIgdGhlIERPTSBpcyBhdHRhY2hlZC5cbiAgICByZXN0b3JlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQsIGFjdGl2ZUVsZW1lbnRJbmRleFJlZi5jdXJyZW50KTtcblxuICAgIHNldExhc3RSZW5kZXIoRGF0ZS5ub3coKSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQgPSBzYXZlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQpO1xuICAgICAgaW5wdXRWYWx1ZXNSZWYuY3VycmVudCA9IHNhdmVJbnB1dFZhbHVlcyhlbGVtZW50KTtcblxuICAgICAgY3VycmVudC5yZW1vdmVDaGlsZChhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQpO1xuXG4gICAgICBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgfSwgW1xuICAgIGFkYXB0aXZlQ2FyZCxcbiAgICBhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZyxcbiAgICBjb250ZW50UmVmLFxuICAgIEdsb2JhbFNldHRpbmdzLFxuICAgIEhvc3RDb25maWcsXG4gICAgcmVuZGVyTWFya2Rvd25Bc0hUTUwsXG4gICAgc2V0RXJyb3JzLFxuICAgIHRhcEFjdGlvblxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIFNldCBvbkV4ZWN1dGVBY3Rpb24gd2l0aG91dCBjYXVzaW5nIHVubmVjZXNzYXJ5IHJlLXJlbmRlci5cbiAgICBhZGFwdGl2ZUNhcmQub25FeGVjdXRlQWN0aW9uID0gZGlzYWJsZWQgPyB1bmRlZmluZWQgOiBoYW5kbGVFeGVjdXRlQWN0aW9uO1xuICB9LCBbYWRhcHRpdmVDYXJkLCBkaXNhYmxlZCwgaGFuZGxlRXhlY3V0ZUFjdGlvbl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiBmaXhBY2Nlc3NpYmlsaXR5SXNzdWVzV2l0aFVuZG8oYWRhcHRpdmVDYXJkRWxlbWVudFJlZi5jdXJyZW50KSwgW2FkYXB0aXZlQ2FyZEVsZW1lbnRSZWYsIGxhc3RSZW5kZXJdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIElmIHRoZSBBZGFwdGl2ZSBDYXJkIGdldCByZS1yZW5kZXJlZCwgcmUtZGlzYWJsZSBlbGVtZW50cyBhcyBuZWVkZWQuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gZGlzYWJsZUlucHV0RWxlbWVudHNXaXRoVW5kbyhhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQpO1xuICAgIH1cbiAgfSwgW2FkYXB0aXZlQ2FyZEVsZW1lbnRSZWYsIGRpc2FibGVkLCBsYXN0UmVuZGVyXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBJZiB0aGUgQWRhcHRpdmUgQ2FyZCBjaGFuZ2VkLCByZXNldCBhbGwgYWN0aW9ucyBwZXJmb3JtZWQuXG4gICAgc2V0QWN0aW9uc1BlcmZvcm1lZChbXSk7XG4gIH0sIFthZGFwdGl2ZUNhcmRdKTtcblxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT5cbiAgICAgIGluZGljYXRlQWN0aW9uU2VsZWN0aW9uV2l0aFVuZG8oXG4gICAgICAgIC8vIEFjdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSBcInJlbmRlcmVkRWxlbWVudFwiIG1lYW5zIGl0IGlzIHRoZSBBZGFwdGl2ZSBDYXJkIGl0c2VsZiwgc3VjaCBhcyBcInNlbGVjdEFjdGlvblwiIChBQykgb3IgXCJ0YXBBY3Rpb25cIiAocmljaCBjYXJkcykuXG4gICAgICAgIC8vIFdlIGRvIG5vdCBuZWVkIHRvIG1hcmsgdGhlIHdob2xlIGNhcmQgYXMgcGVyZm9ybWVkLlxuICAgICAgICBhY3Rpb25zUGVyZm9ybWVkLm1hcCgoeyByZW5kZXJlZEVsZW1lbnQgfSkgPT4gcmVuZGVyZWRFbGVtZW50KS5maWx0ZXIocmVuZGVyZWRFbGVtZW50ID0+IHJlbmRlcmVkRWxlbWVudCksXG4gICAgICAgIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZVxuICAgICAgKSxcbiAgICBbYWN0aW9uc1BlcmZvcm1lZCwgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lLCBsYXN0UmVuZGVyXVxuICApO1xuXG4gIHJldHVybiBlcnJvcnMubGVuZ3RoID8gKFxuICAgIG5vZGVfZW52ID09PSAnZGV2ZWxvcG1lbnQnICYmIDxFcnJvckJveCBlcnJvcj17ZXJyb3JzWzBdfSB0eXBlPXtsb2NhbGl6ZSgnQURBUFRJVkVfQ0FSRF9FUlJPUl9CT1hfVElUTEVfUkVOREVSJyl9IC8+XG4gICkgOiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGFkYXB0aXZlQ2FyZFJlbmRlcmVyU3R5bGVTZXQgKyAnJywgJ3dlYmNoYXRfX2FkYXB0aXZlLWNhcmQtcmVuZGVyZXInKX1cbiAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb259XG4gICAgICBvbktleVByZXNzPXtoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9ufVxuICAgICAgcmVmPXtjb250ZW50UmVmfVxuICAgIC8+XG4gICk7XG59O1xuXG5BZGFwdGl2ZUNhcmRSZW5kZXJlci5kZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZTogJycsXG4gIGRpc2FibGVkOiB1bmRlZmluZWQsXG4gIHRhcEFjdGlvbjogdW5kZWZpbmVkXG59O1xuXG5BZGFwdGl2ZUNhcmRSZW5kZXJlci5wcm9wVHlwZXMgPSB7XG4gIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgYWRhcHRpdmVDYXJkOiBQcm9wVHlwZXMuYW55LmlzUmVxdWlyZWQsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgdGFwQWN0aW9uOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICB2YWx1ZTogUHJvcFR5cGVzLnN0cmluZ1xuICB9KVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQWRhcHRpdmVDYXJkUmVuZGVyZXI7XG4iXX0=
734
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGl2ZUNhcmRzL0F0dGFjaG1lbnQvQWRhcHRpdmVDYXJkUmVuZGVyZXIudHN4Il0sIm5hbWVzIjpbIkVycm9yQm94IiwiQ29tcG9uZW50cyIsInVzZURpc2FibGVkIiwiaG9va3MiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VQZXJmb3JtQ2FyZEFjdGlvbiIsInVzZVJlbmRlck1hcmtkb3duQXNIVE1MIiwidXNlU2Nyb2xsVG9FbmQiLCJ1c2VTdHlsZVNldCIsIm5vZGVfZW52IiwiYnVuY2hVbmRvcyIsImZucyIsImZvckVhY2giLCJmbiIsImFkZENsYXNzIiwiZWxlbWVudCIsImNsYXNzTmFtZSIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiYWRkIiwiYWRkUGVyc2lzdGVudENsYXNzV2l0aFVuZG8iLCJvYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJvYnNlcnZlIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZUZpbHRlciIsImNsYXNzTmFtZXMiLCJTZXQiLCJzcGxpdCIsImRlbGV0ZSIsIkFycmF5IiwiZnJvbSIsImpvaW4iLCJkaXNjb25uZWN0IiwiaXNQbGFpbk9iamVjdCIsIm9iaiIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwicHJvdG90eXBlIiwic2V0QXR0cmlidXRlV2l0aFVuZG8iLCJxdWFsaWZpZWROYW1lIiwibmV4dFZhbHVlIiwidmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJkaXNhYmxlZEhhbmRsZXIiLCJldmVudCIsInByZXZlbnREZWZhdWx0Iiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiYWRkRXZlbnRMaXN0ZW5lck9uY2VXaXRoVW5kbyIsIm5hbWUiLCJoYW5kbGVyIiwiZGV0YWNoIiwiZGV0YWNoaW5nSGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsImFkZEV2ZW50TGlzdGVuZXJXaXRoVW5kbyIsImRpc2FibGVFbGVtZW50V2l0aFVuZG8iLCJ1bmRvU3RhY2siLCJpc0FjdGl2ZSIsImRvY3VtZW50IiwiYWN0aXZlRWxlbWVudCIsInRhZyIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwibWFwIiwiY2FsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvcHRpb24iLCJkaXNhYmxlSW5wdXRFbGVtZW50c1dpdGhVbmRvIiwib2JzZXJ2ZVN1YnRyZWUiLCJtdXRhdGlvbnMiLCJhZGRlZE5vZGVzIiwiYWRkZWROb2RlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsImhhc0F0dHJpYnV0ZSIsInNldE9yUmVtb3ZlQXR0cmlidXRlIiwic2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyIsInByZXZWYWx1ZSIsImZpbmRBbmNlc3RvciIsInByZWRpY2F0ZSIsImN1cnJlbnQiLCJwYXJlbnRFbGVtZW50IiwiaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyIsInNlbGVjdGVkQWN0aW9uRWxlbWVudHMiLCJhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUiLCJsZW5ndGgiLCJzb21lIiwiYWN0aW9uRWxlbWVudCIsImNvbnNvbGUiLCJ3YXJuIiwiYWN0aW9uU2V0RWxlbWVudHMiLCJzZWxlY3RlZEFjdGlvbkVsZW1lbnQiLCJhY3Rpb25TZXRFbGVtZW50IiwiYW5jZXN0b3IiLCJpbmNsdWRlcyIsImZpeEFjY2Vzc2liaWxpdHlJc3N1ZXNXaXRoVW5kbyIsImFjdGlvbkJ1dHRvbiIsInVuZG8iLCJnZXRGb2N1c2FibGVFbGVtZW50cyIsImZpbHRlciIsInRhYkluZGV4IiwicmVzdG9yZUFjdGl2ZUVsZW1lbnRJbmRleCIsImFjdGl2ZUVsZW1lbnRJbmRleCIsImZvY3VzIiwic2F2ZUFjdGl2ZUVsZW1lbnRJbmRleCIsImluZGV4T2YiLCJyZXN0b3JlSW5wdXRWYWx1ZXMiLCJpbnB1dFZhbHVlcyIsImlucHV0cyIsImlucHV0IiwiaW5kZXgiLCJ0YWdOYW1lIiwidHlwZSIsImNoZWNrZWQiLCJzYXZlSW5wdXRWYWx1ZXMiLCJBZGFwdGl2ZUNhcmRSZW5kZXJlciIsImFkYXB0aXZlQ2FyZCIsImRpc2FibGVkRnJvbVByb3BzIiwiZGlzYWJsZWQiLCJ0YXBBY3Rpb24iLCJhZGFwdGl2ZUNhcmRSZW5kZXJlclN0eWxlU2V0IiwiYWRhcHRpdmVDYXJkUmVuZGVyZXIiLCJHbG9iYWxTZXR0aW5ncyIsIkhvc3RDb25maWciLCJhY3Rpb25zUGVyZm9ybWVkIiwic2V0QWN0aW9uc1BlcmZvcm1lZCIsImFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIiwiZGlzYWJsZWRGcm9tQ29tcG9zZXIiLCJlcnJvcnMiLCJzZXRFcnJvcnMiLCJsYXN0UmVuZGVyIiwic2V0TGFzdFJlbmRlciIsImFjdGl2ZUVsZW1lbnRJbmRleFJlZiIsImFkYXB0aXZlQ2FyZEVsZW1lbnRSZWYiLCJjb250ZW50UmVmIiwiaW5wdXRWYWx1ZXNSZWYiLCJsb2NhbGl6ZSIsInBlcmZvcm1DYXJkQWN0aW9uIiwicmVuZGVyTWFya2Rvd25Bc0hUTUwiLCJzY3JvbGxUb0VuZCIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3MiLCJrZXkiLCJ0YXJnZXQiLCJhZGFwdGl2ZUNhcmRSb290IiwicXVlcnlTZWxlY3RvciIsImhhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24iLCJ1bmRlZmluZWQiLCJhZGRBY3Rpb25zUGVyZm9ybWVkIiwiYWN0aW9uIiwiaGFuZGxlRXhlY3V0ZUFjdGlvbiIsImFjdGlvblR5cGVOYW1lIiwiZ2V0SnNvblR5cGVOYW1lIiwiaW1hZ2UiLCJpY29uVXJsIiwidGl0bGUiLCJ1cmwiLCJkYXRhIiwiX19pc0JvdEZyYW1ld29ya0NhcmRBY3Rpb24iLCJjYXJkQWN0aW9uIiwiZXJyb3IiLCJjb25zdHJ1Y3RvciIsInRleHQiLCJyZXN1bHQiLCJvdXRwdXRIdG1sIiwiZGlkUHJvY2VzcyIsImhvc3RDb25maWciLCJzZXRUYWJJbmRleEF0Q2FyZFJvb3QiLCJ2YWxpZGF0ZVByb3BlcnRpZXMiLCJ2YWxpZGF0aW9uRXZlbnRzIiwicmVkdWNlIiwiaXRlbXMiLCJtZXNzYWdlIiwiRXJyb3IiLCJyZW5kZXIiLCJhcHBlbmRDaGlsZCIsIkRhdGUiLCJub3ciLCJyZW1vdmVDaGlsZCIsIm9uRXhlY3V0ZUFjdGlvbiIsInJlbmRlcmVkRWxlbWVudCIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImFueSIsImlzUmVxdWlyZWQiLCJib29sIiwic2hhcGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVNBOztBQUVBOztBQUNBOztBQUNBOztBQVlBOztBQUNBOzs7Ozs7QUExQkE7QUE0QkEsSUFBUUEsUUFBUixHQUFxQkMsd0NBQXJCLENBQVFELFFBQVI7QUFDQSxJQUFRRSxXQUFSLEdBQWtIQyxtQ0FBbEgsQ0FBUUQsV0FBUjtBQUFBLElBQXFCRSxZQUFyQixHQUFrSEQsbUNBQWxILENBQXFCQyxZQUFyQjtBQUFBLElBQW1DQyxvQkFBbkMsR0FBa0hGLG1DQUFsSCxDQUFtQ0Usb0JBQW5DO0FBQUEsSUFBeURDLHVCQUF6RCxHQUFrSEgsbUNBQWxILENBQXlERyx1QkFBekQ7QUFBQSxJQUFrRkMsY0FBbEYsR0FBa0hKLG1DQUFsSCxDQUFrRkksY0FBbEY7QUFBQSxJQUFrR0MsV0FBbEcsR0FBa0hMLG1DQUFsSCxDQUFrR0ssV0FBbEc7QUFFQSxJQUFNQyxRQUFRLEdBQUcseUJBQWpCOztBQUlBLFNBQVNDLFVBQVQsR0FBMEQ7QUFBQSxvQ0FBbkNDLEdBQW1DO0FBQW5DQSxJQUFBQSxHQUFtQztBQUFBOztBQUN4RCxTQUFPO0FBQUEsV0FBTUEsR0FBRyxDQUFDQyxPQUFKLENBQVksVUFBQUMsRUFBRTtBQUFBLGFBQUlBLEVBQUosYUFBSUEsRUFBSix1QkFBSUEsRUFBRSxFQUFOO0FBQUEsS0FBZCxDQUFOO0FBQUEsR0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBOzs7QUFDQSxTQUFTQyxRQUFULENBQWtCQyxPQUFsQixFQUF3Q0MsU0FBeEMsRUFBNkU7QUFD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WUFBWSxFQUFFa0UsbUJBQVVFLEdBQVYsQ0FBY0MsVUFGRztBQUcvQm5FLEVBQUFBLFFBQVEsRUFBRWdFLG1CQUFVSSxJQUhXO0FBSy9CO0FBQ0E7QUFDQW5FLEVBQUFBLFNBQVMsRUFBRStELG1CQUFVSyxLQUFWLENBQWdCO0FBQ3pCbkMsSUFBQUEsS0FBSyxFQUFFOEIsbUJBQVVDLE1BRFE7QUFFekI3QixJQUFBQSxLQUFLLEVBQUU0QixtQkFBVUMsTUFGUTtBQUd6QnZFLElBQUFBLElBQUksRUFBRXNFLG1CQUFVQyxNQUFWLENBQWlCRSxVQUhFO0FBSXpCckosSUFBQUEsS0FBSyxFQUFFa0osbUJBQVVDO0FBSlEsR0FBaEI7QUFQb0IsQ0FBakM7ZUFlZXBFLG9CIiwic291cmNlUm9vdCI6ImJ1bmRsZTovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tbWFnaWMtbnVtYmVyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVwiOiBbLTEsIDAsIDJdIH1dICovXG5cbmltcG9ydCB7XG4gIEFjdGlvbiBhcyBBZGFwdGl2ZUNhcmRBY3Rpb24sXG4gIEFkYXB0aXZlQ2FyZCxcbiAgSU1hcmtkb3duUHJvY2Vzc2luZ1Jlc3VsdCxcbiAgT3BlblVybEFjdGlvbixcbiAgU3VibWl0QWN0aW9uXG59IGZyb20gJ2FkYXB0aXZlY2FyZHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50cywgZ2V0VGFiSW5kZXgsIGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtY29tcG9uZW50JztcbmltcG9ydCB7IERpcmVjdExpbmVDYXJkQWN0aW9uIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtY29yZSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHtcbiAgS2V5Ym9hcmRFdmVudEhhbmRsZXIsXG4gIE1vdXNlRXZlbnRIYW5kbGVyLFxuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VMYXlvdXRFZmZlY3QsXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG4gIFZGQ1xufSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IEJvdEZyYW1ld29ya0NhcmRBY3Rpb24gfSBmcm9tICcuL0FkYXB0aXZlQ2FyZEJ1aWxkZXInO1xuaW1wb3J0IHVzZUFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnIGZyb20gJy4uL2hvb2tzL3VzZUFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnJztcbmltcG9ydCB1c2VBZGFwdGl2ZUNhcmRzUGFja2FnZSBmcm9tICcuLi9ob29rcy91c2VBZGFwdGl2ZUNhcmRzUGFja2FnZSc7XG5cbmNvbnN0IHsgRXJyb3JCb3ggfSA9IENvbXBvbmVudHM7XG5jb25zdCB7IHVzZURpc2FibGVkLCB1c2VMb2NhbGl6ZXIsIHVzZVBlcmZvcm1DYXJkQWN0aW9uLCB1c2VSZW5kZXJNYXJrZG93bkFzSFRNTCwgdXNlU2Nyb2xsVG9FbmQsIHVzZVN0eWxlU2V0IH0gPSBob29rcztcblxuY29uc3Qgbm9kZV9lbnYgPSBwcm9jZXNzLmVudi5ub2RlX2VudiB8fCBwcm9jZXNzLmVudi5OT0RFX0VOVjtcblxudHlwZSBVbmRvRnVuY3Rpb24gPSAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGJ1bmNoVW5kb3MoLi4uZm5zOiBVbmRvRnVuY3Rpb25bXSk6IFVuZG9GdW5jdGlvbiB7XG4gIHJldHVybiAoKSA9PiBmbnMuZm9yRWFjaChmbiA9PiBmbj8uKCkpO1xufVxuXG4vKipcbiAqIEFkZHMgYSBjbGFzcyB0byB0aGUgYEhUTUxFbGVtZW50YC4gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNsYXNzIGlzIGFkZGVkLCBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiB0cnVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBjbGFzc0xpc3QgfSA9IGVsZW1lbnQ7XG5cbiAgaWYgKCFjbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkge1xuICAgIGNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogQWRkcyBhIGNsYXNzIHRvIHRoZSBgSFRNTEVsZW1lbnRgIGFuZCByZS1hZGQgb24gbXV0YXRpb25zLlxuICpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgcmVzdG9yZSB0byBwcmV2aW91cyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gYWRkUGVyc2lzdGVudENsYXNzV2l0aFVuZG8oZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsIGNsYXNzTmFtZTogc3RyaW5nKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkpIHtcbiAgICAvLyBBZnRlciB3ZSBhZGQgdGhlIGNsYXNzLCBrZWVwIG9ic2VydmluZyB0aGUgZWxlbWVudCB0byBtYWtlIHN1cmUgdGhlIGNsYXNzIGlzIG5vdCByZW1vdmVkLlxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSk7XG5cbiAgICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2NsYXNzJ10gfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IG5ldyBTZXQoZWxlbWVudC5jbGFzc05hbWUuc3BsaXQoJyAnKSk7XG5cbiAgICAgIGNsYXNzTmFtZXMuZGVsZXRlKGNsYXNzTmFtZSk7XG5cbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gQXJyYXkuZnJvbShjbGFzc05hbWVzKS5qb2luKCcgJyk7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgLCBpZiB0aGUgb2JqZWN0IGlzIGEgcGxhaW4gb2JqZWN0IGFuZCBub3QgYSBjbGFzcywgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IE9iamVjdC5wcm90b3R5cGU7XG59XG5cbi8qKlxuICogU2V0cyBhbiBhdHRyaWJ1dGUuXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCByZXN0b3JlIHRvIHByZXZpb3VzIHN0YXRlLlxuICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVXaXRoVW5kbyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4gIHF1YWxpZmllZE5hbWU6IHN0cmluZyxcbiAgbmV4dFZhbHVlOiBzdHJpbmdcbik6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSk7XG5cbiAgaWYgKHZhbHVlICE9PSBuZXh0VmFsdWUpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lLCBuZXh0VmFsdWUpO1xuXG4gICAgcmV0dXJuICgpID0+ICh2YWx1ZSA/IGVsZW1lbnQuc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIHZhbHVlKSA6IGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGV2ZW50IGhhbmRsZXIgZm9yIGRpc2FibGluZyBldmVudCBidWJibGluZyBhbmQgcHJvcGFnYXRpb24uXG4gKi9cbmNvbnN0IGRpc2FibGVkSGFuZGxlciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufTtcblxuLyoqXG4gKiBMaXN0ZW5zIHRvIGV2ZW50IG9uY2UuIFJldHVybnMgYSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgc3RvcCBsaXN0ZW5pbmcuXG4gKi9cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJPbmNlV2l0aFVuZG8oXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLFxuICBuYW1lOiBzdHJpbmcsXG4gIGhhbmRsZXI6IEV2ZW50TGlzdGVuZXJcbik6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QgKi9cbiAgbGV0IGRldGFjaDogKCkgPT4gdm9pZDtcbiAgY29uc3QgZGV0YWNoaW5nSGFuZGxlciA9IGV2ZW50ID0+IHtcbiAgICB0cnkge1xuICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCB7IG9uY2U6IHRydWUgfSwgc28gd2UgbmVlZCB0byBkZXRhY2ggbWFudWFsbHkuXG4gICAgICBkZXRhY2goKTtcbiAgICB9XG4gIH07XG5cbiAgZGV0YWNoID0gKCkgPT4gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGRldGFjaGluZ0hhbmRsZXIpO1xuXG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBkZXRhY2hpbmdIYW5kbGVyLCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgcmV0dXJuIGRldGFjaDtcbn1cblxuLyoqXG4gKiBMaXN0ZW5zIHRvIGV2ZW50LiBSZXR1cm5zIGEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHN0b3AgbGlzdGVuaW5nLlxuICovXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyV2l0aFVuZG8oXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLFxuICBuYW1lOiBzdHJpbmcsXG4gIGhhbmRsZXI6IEV2ZW50TGlzdGVuZXJcbik6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyKTtcblxuICByZXR1cm4gKCkgPT4gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIpO1xufVxuXG4vKipcbiAqIERpc2FibGVzIGFuIGVsZW1lbnQgd2l0aCB1bmRvIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgcmVzdG9yZSB0byBwcmV2aW91cyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRXaXRoVW5kbyhlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCk6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHVuZG9TdGFjazogVW5kb0Z1bmN0aW9uW10gPSBbXTtcbiAgY29uc3QgaXNBY3RpdmUgPSBlbGVtZW50ID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBjb25zdCB0YWcgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlZmF1bHQtY2FzZSAqL1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2FyaWEtZGlzYWJsZWQnLCAndHJ1ZScpKTtcblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKFxuICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXJPbmNlV2l0aFVuZG8oZWxlbWVudCwgJ2JsdXInLCAoKSA9PlxuICAgICAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJykpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0QXR0cmlidXRlV2l0aFVuZG8oZWxlbWVudCwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJykpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJykge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChhZGRFdmVudExpc3RlbmVyV2l0aFVuZG8oZWxlbWVudCwgJ2NsaWNrJywgZGlzYWJsZWRIYW5kbGVyKSk7XG4gICAgICAgIHVuZG9TdGFjay5wdXNoKHNldEF0dHJpYnV0ZVdpdGhVbmRvKGVsZW1lbnQsICdyZWFkb25seScsICdyZWFkb25seScpKTtcbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSAnc2VsZWN0Jykge1xuICAgICAgICB1bmRvU3RhY2sucHVzaChcbiAgICAgICAgICAuLi5bXS5tYXAuY2FsbChlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpLCBvcHRpb24gPT5cbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZVdpdGhVbmRvKG9wdGlvbiwgJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJylcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGJ1bmNoVW5kb3MoLi4udW5kb1N0YWNrKTtcbn1cblxuLyoqXG4gKiBEaXNhYmxlcyBhbGwgaW5wdXR0YWJsZSBkZXNjZW5kYW50cy5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50IHwgdW5kZWZpbmVkfSBlbGVtZW50IENvbnRhaW5lciBlbGVtZW50IHRvIHN0YXJ0IGxvb2tpbmcgZm9yIGlucHV0dGFibGUgZGVzY2VuZGFudHMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9ic2VydmVTdWJ0cmVlIGB0cnVlYCB0byBhcHBsaWVzIHRvIGFsbCBmdXR1cmUgaW5wdXR0YWJsZSBkZXNjZW5kYW50cywgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHdpbGwgcmVzdG9yZSB0byBwcmV2aW91cyBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gZGlzYWJsZUlucHV0RWxlbWVudHNXaXRoVW5kbyhlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCwgb2JzZXJ2ZVN1YnRyZWUgPSB0cnVlKTogVW5kb0Z1bmN0aW9uIHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdW5kb1N0YWNrOiAoKCkgPT4gdm9pZClbXSA9IFtdLm1hcC5jYWxsKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpLCBlbGVtZW50ID0+XG4gICAgZGlzYWJsZUVsZW1lbnRXaXRoVW5kbyhlbGVtZW50KVxuICApO1xuXG4gIGNvbnN0IHRhZyA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvLyBPbmx5IHNldCB0YWJpbmRleD1cIi0xXCIgb24gZm9jdXNhYmxlIGVsZW1lbnQuIE90aGVyd2lzZSwgd2Ugd2lsbCBtYWtlIDxkaXY+IGZvY3VzYWJsZSBieSBtb3VzZS5cbiAgKHRhZyA9PT0gJ2EnIHx8IHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSAmJlxuICAgIHVuZG9TdGFjay5wdXNoKHNldEF0dHJpYnV0ZVdpdGhVbmRvKGVsZW1lbnQsICd0YWJpbmRleCcsICctMScpKTtcblxuICBpZiAob2JzZXJ2ZVN1YnRyZWUpIHtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PlxuICAgICAgbXV0YXRpb25zLmZvckVhY2goKHsgYWRkZWROb2RlcyB9KSA9PlxuICAgICAgICB1bmRvU3RhY2sucHVzaCguLi5bXS5tYXAuY2FsbChhZGRlZE5vZGVzLCBhZGRlZE5vZGUgPT4gZGlzYWJsZUlucHV0RWxlbWVudHNXaXRoVW5kbyhhZGRlZE5vZGUsIGZhbHNlKSkpXG4gICAgICApXG4gICAgKTtcblxuICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgICB1bmRvU3RhY2sucHVzaCgoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KCkpO1xuICB9XG5cbiAgcmV0dXJuIGJ1bmNoVW5kb3MoLi4udW5kb1N0YWNrKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgZnJvbSBhbiBlbGVtZW50LlxuICpcbiAqIEByZXR1cm5zIHtmYWxzZSB8IHN0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIGBmYWxzZWAgaWYgdGhlIGF0dHJpYnV0ZSB3YXMgbm90IHNldC5cbiAqL1xuZnVuY3Rpb24gZ2V0QXR0cmlidXRlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBxdWFsaWZpZWROYW1lOiBzdHJpbmcpOiBmYWxzZSB8IHN0cmluZyB7XG4gIHJldHVybiAhIWVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgJiYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8ICcnKTtcbn1cblxuLyoqXG4gKiBTZXRzIG9yIHJlbW92ZXMgYW4gYXR0cmlidXRlIGZyb20gYW4gZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc2V0IG9yIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7ZmFsc2UgfCBzdHJpbmd9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIFdoZW4gcGFzc2luZyBgZmFsc2VgLCByZW1vdmUgdGhlIGF0dHJpYnV0ZS5cbiAqL1xuZnVuY3Rpb24gc2V0T3JSZW1vdmVBdHRyaWJ1dGUoZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsIHF1YWxpZmllZE5hbWU6IHN0cmluZywgdmFsdWU6IGZhbHNlIHwgc3RyaW5nKTogdm9pZCB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICBlbGVtZW50Py5yZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudD8uc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldHMgb3IgcmVtb3ZlcyBhbiBhdHRyaWJ1dGUgZnJvbSBhbiBlbGVtZW50IHdpdGggYW4gdW5kbyBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc2V0IG9yIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7ZmFsc2UgfCBzdHJpbmd9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIFdoZW4gcGFzc2luZyBgZmFsc2VgLCByZW1vdmUgdGhlIGF0dHJpYnV0ZS5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVGhlIHVuZG8gZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHVuZG8gYWxsIG1hbmlwdWxhdGlvbnMgYnkgcmVzdG9yaW5nIHZhbHVlcyByZWNvcmRlZCBhdCB0aGUgdGltZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZnVuY3Rpb24gc2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4gIHF1YWxpZmllZE5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IGZhbHNlIHwgc3RyaW5nXG4pOiBVbmRvRnVuY3Rpb24ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwcmV2VmFsdWUgPSBnZXRBdHRyaWJ1dGUoZWxlbWVudCwgcXVhbGlmaWVkTmFtZSk7XG5cbiAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgcXVhbGlmaWVkTmFtZSwgdmFsdWUpO1xuXG4gIHJldHVybiAoKSA9PiBzZXRPclJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBxdWFsaWZpZWROYW1lLCBwcmV2VmFsdWUpO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBmaXJzdCBhbmNlc3RvciB0aGF0IGZ1bGZpbGwgdGhlIHByZWRpY2F0ZS5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIHN0YXJ0aW5nIGVsZW1lbnQuIFRoaXMgZWxlbWVudCB3aWxsIG5vdCBiZSBjaGVja2VkIGFnYWluc3QgdGhlIHByZWRpY2F0ZS5cbiAqIEBwYXJhbSB7KGFuY2VzdG9yOiBIVE1MRWxlbWVudCkgPT4gYm9vbGVhbn0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSB0byBmdWxmaWxsLlxuICpcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IHVuZGVmaW5lZH0gVGhlIGZpcnN0IGFuY2VzdG9yIHRoYXQgZnVsZmlsbCB0aGUgcHJlZGljYXRlLCBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBmaW5kQW5jZXN0b3IoZWxlbWVudDogSFRNTEVsZW1lbnQsIHByZWRpY2F0ZTogKGFuY2VzdG9yOiBIVE1MRWxlbWVudCkgPT4gYm9vbGVhbik6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQgPSBlbGVtZW50O1xuXG4gIHdoaWxlICgoY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudCkpIHtcbiAgICBpZiAocHJlZGljYXRlLmNhbGwoZWxlbWVudCwgY3VycmVudCkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGUgYWN0aW9uIHNlbGVjdGVkIGJ5IHBlcmZvcm1pbmcgYSBzZXJpZXMgb2YgbWFuaXB1bGF0aW9ucywgd2l0aCB1bmRvOlxuICpcbiAqIC0gQWNjZXNzaWJpbGl0eTogc2V0IGBhcmlhLXByZXNzZWRgIHRvIGB0cnVlYFxuICogLSBBcHBsaWVzIGBzdHlsZU9wdGlvbnMuYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lYFxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnRbXX0gc2VsZWN0ZWRBY3Rpb25FbGVtZW50cyAtIEFuIGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHJlcHJlc2VudGluZyB0aGUgYWN0aW9uIGFuZCBpcyBzZWxlY3RlZC5cbiAqIEBwYXJhbSB7c3RyaW5nP30gYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGFwcGx5IHRvIGFsbCBlbGVtZW50cy5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gVGhlIHVuZG8gZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCB3aWxsIHVuZG8gYWxsIG1hbmlwdWxhdGlvbnMgYnkgcmVzdG9yaW5nIHZhbHVlcyByZWNvcmRlZCBhdCB0aGUgdGltZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZnVuY3Rpb24gaW5kaWNhdGVBY3Rpb25TZWxlY3Rpb25XaXRoVW5kbyhcbiAgc2VsZWN0ZWRBY3Rpb25FbGVtZW50czogSFRNTEVsZW1lbnRbXSB8IHVuZGVmaW5lZCxcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lPzogc3RyaW5nXG4pOiBVbmRvRnVuY3Rpb24ge1xuICBpZiAoIXNlbGVjdGVkQWN0aW9uRWxlbWVudHM/Lmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFZlcmlmeSBhbGwgaW5wdXQgZWxlbWVudHMgYXJlIFwiYWMtcHVzaEJ1dHRvblwiLCBjb3VsZCBiZWxvbmdzIHRvIEFjdGlvblNldCBvciBcImNhcmQgYWN0aW9uc1wiLlxuICBpZiAoc2VsZWN0ZWRBY3Rpb25FbGVtZW50cy5zb21lKGFjdGlvbkVsZW1lbnQgPT4gIWFjdGlvbkVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhYy1wdXNoQnV0dG9uJykpKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ2JvdGZyYW1ld29yay13ZWJjaGF0OiBDYW5ub3QgbWFyayBzZWxlY3RlZCBhY3Rpb24gaW4gdGhlIGNhcmQsIHNvbWUgZWxlbWVudHMgYXJlIG5vdCBhbiBcImFjLXB1c2hCdXR0b25cIi4nXG4gICAgKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEEgZGlzdGluY3Qgc2V0IG9mIGFjdGlvbiBzZXQgY29udGFpbmVycyB3aGljaCBoYXMgc2VsZWN0aW9ucywgZXhjbHVkaW5nIGNvbnRhaW5lcnMgd2l0aG91dCBhY3Rpb25zLlxuICAvLyBNdWx0aXBsZSBzdWJtaXNzaW9uIGluIGFuIEFkYXB0aXZlIENhcmQgaXMgc3RpbGwgYSB2YWd1ZSBhcmVhIGFuZCBUQkQuXG4gIC8vIFdlIG1pZ2h0IHdhbnQgdG8gZGlzYWJsZSB0aGUgd2hvbGUgY2FyZCwganVzdCBidXR0b25zIGluIHNhbWUgY29udGFpbmVyLCBvciBkbyBub3RoaW5nICh0b2RheSkuXG4gIGNvbnN0IGFjdGlvblNldEVsZW1lbnRzID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcblxuICBzZWxlY3RlZEFjdGlvbkVsZW1lbnRzLmZvckVhY2goc2VsZWN0ZWRBY3Rpb25FbGVtZW50ID0+IHtcbiAgICBjb25zdCBhY3Rpb25TZXRFbGVtZW50ID0gZmluZEFuY2VzdG9yKFxuICAgICAgc2VsZWN0ZWRBY3Rpb25FbGVtZW50LFxuICAgICAgYW5jZXN0b3IgPT4gYW5jZXN0b3IuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdtZW51YmFyJ1xuICAgICk7XG5cbiAgICBhY3Rpb25TZXRFbGVtZW50ICYmIGFjdGlvblNldEVsZW1lbnRzLmFkZChhY3Rpb25TZXRFbGVtZW50KTtcbiAgfSk7XG5cbiAgY29uc3QgdW5kb1N0YWNrOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIGFjdGlvblNldEVsZW1lbnRzLmZvckVhY2goYWN0aW9uU2V0RWxlbWVudCA9PiB7XG4gICAgLy8gUmVtb3ZlIFwicm9sZVwiIGZyb20gZXZlcnkgXCJhYy1hY3Rpb25TZXRcIiBjb250YWluZXIuXG4gICAgdW5kb1N0YWNrLnB1c2goc2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyhhY3Rpb25TZXRFbGVtZW50LCAncm9sZScsIGZhbHNlKSk7XG5cbiAgICAvLyBNb2RpZnkgXCJyb2xlXCIgb2YgZXZlcnkgYWN0aW9ucyBpbiB0aGUgY29udGFpbmVyLlxuICAgIEFycmF5LmZyb20oYWN0aW9uU2V0RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWMtcHVzaEJ1dHRvbicpIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+KS5mb3JFYWNoKFxuICAgICAgYWN0aW9uRWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChzZWxlY3RlZEFjdGlvbkVsZW1lbnRzLmluY2x1ZGVzKGFjdGlvbkVsZW1lbnQpKSB7XG4gICAgICAgICAgLy8gQWRkIFwiYXJpYS1wcmVzc2VkXCIgYW5kIHNldCBcInJvbGVcIiBhdHRyaWJ1dGUgdG8gXCJidXR0b25cIiAod2hpY2ggaXMgcmVxdWlyZWQgYnkgXCJhcmlhLXByZXNzZWRcIikuXG4gICAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyhhY3Rpb25FbGVtZW50LCAnYXJpYS1wcmVzc2VkJywgJ3RydWUnKSk7XG4gICAgICAgICAgdW5kb1N0YWNrLnB1c2goc2V0T3JSZW1vdmVBdHRyaWJ1dGVXaXRoVW5kbyhhY3Rpb25FbGVtZW50LCAncm9sZScsICdidXR0b24nKSk7XG5cbiAgICAgICAgICAvLyBIaWdobGlnaHQgYWN0aW9ucyBieSBhcHBseWluZyBgc3R5bGVPcHRpb25zLmFjdGlvblBlcmZvcm1lZENsYXNzTmFtZWAuXG4gICAgICAgICAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lICYmXG4gICAgICAgICAgICB1bmRvU3RhY2sucHVzaChhZGRQZXJzaXN0ZW50Q2xhc3NXaXRoVW5kbyhhY3Rpb25FbGVtZW50LCBhY3Rpb25QZXJmb3JtZWRDbGFzc05hbWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSByZW1vdmVkIFwicm9sZT1tZW51YmFyXCIgZnJvbSB0aGUgY29udGFpbmVyLCB3ZSBtdXN0IHJlbW92ZSBcInJvbGU9bWVudWl0ZW1cIiBmcm9tIHVuc2VsZWN0ZWQgYWN0aW9ucy5cbiAgICAgICAgICB1bmRvU3RhY2sucHVzaChzZXRPclJlbW92ZUF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkVsZW1lbnQsICdyb2xlJywgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiBidW5jaFVuZG9zKC4uLnVuZG9TdGFjayk7XG59XG5cbi8qKlxuICogRml4ZXMgYWNjZXNzaWJpbGl0eSBpc3N1ZXMgZnJvbSBBZGFwdGl2ZSBDYXJkLCB3aXRoIHVuZG8uXG4gKlxuICogQHJldHVybnMgeygpID0+IHZvaWR9IFRoZSB1bmRvIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgd2lsbCB1bmRvIGFsbCBtYW5pcHVsYXRpb25zIGJ5IHJlc3RvcmluZyB2YWx1ZXMgcmVjb3JkZWQgYXQgdGhlIHRpbWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZpeEFjY2Vzc2liaWxpdHlJc3N1ZXNXaXRoVW5kbyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IFVuZG9GdW5jdGlvbiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZXNlIGhhY2tzIHNob3VsZCBiZSBkb25lIGluIEFkYXB0aXZlIENhcmRzIGxpYnJhcnkgaW5zdGVhZC5cbiAgLy8gUmVsYXRlZCB0byAjMzk0OTogQWxsIGFjdGlvbiBidXR0b25zIGluc2lkZSByb2xlPVwibWVudWJhclwiIHNob3VsZCBiZSByb2xlPVwibWVudWl0ZW1cIi5cbiAgY29uc3QgdW5kb1N0YWNrOiBVbmRvRnVuY3Rpb25bXSA9IEFycmF5LmZyb20oXG4gICAgZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWMtYWN0aW9uU2V0W3JvbGU9XCJtZW51YmFyXCJdIFtyb2xlPVwiYnV0dG9uXCJdJykgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD5cbiAgKS5tYXAoYWN0aW9uQnV0dG9uID0+IHNldEF0dHJpYnV0ZVdpdGhVbmRvKGFjdGlvbkJ1dHRvbiwgJ3JvbGUnLCAnbWVudWl0ZW0nKSk7XG5cbiAgcmV0dXJuICgpID0+IHVuZG9TdGFjay5mb3JFYWNoKHVuZG8gPT4gdW5kbz8uKCkpO1xufVxuXG5mdW5jdGlvbiBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICByZXR1cm4gW10uZmlsdGVyLmNhbGwoXG4gICAgZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgW1xuICAgICAgICAnYScsXG4gICAgICAgICdib2R5JyxcbiAgICAgICAgJ2J1dHRvbicsXG4gICAgICAgICdmcmFtZScsXG4gICAgICAgICdpZnJhbWUnLFxuICAgICAgICAnaW1nJyxcbiAgICAgICAgJ2lucHV0JyxcbiAgICAgICAgJ2lzaW5kZXgnLFxuICAgICAgICAnb2JqZWN0JyxcbiAgICAgICAgJ3NlbGVjdCcsXG4gICAgICAgICd0ZXh0YXJlYScsXG4gICAgICAgICdbdGFiaW5kZXhdJ1xuICAgICAgXS5qb2luKCcsICcpXG4gICAgKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PixcbiAgICBlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHRhYkluZGV4ID0gZ2V0VGFiSW5kZXgoZWxlbWVudCk7XG5cbiAgICAgIHJldHVybiB0eXBlb2YgdGFiSW5kZXggPT09ICdudW1iZXInICYmIHRhYkluZGV4ID49IDA7XG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBhY3RpdmVFbGVtZW50SW5kZXg6IG51bWJlcikge1xuICBnZXRGb2N1c2FibGVFbGVtZW50cyhlbGVtZW50KVsrYWN0aXZlRWxlbWVudEluZGV4XT8uZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gc2F2ZUFjdGl2ZUVsZW1lbnRJbmRleChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICByZXR1cm4gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoZWxlbWVudCkuaW5kZXhPZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gcmVzdG9yZUlucHV0VmFsdWVzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpbnB1dFZhbHVlczogKGJvb2xlYW4gfCBzdHJpbmcpW10pIHtcbiAgY29uc3QgaW5wdXRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpIGFzIE5vZGVMaXN0T2Y8XG4gICAgSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICA+O1xuXG4gIFtdLmZvckVhY2guY2FsbChpbnB1dHMsIChpbnB1dDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gaW5wdXRWYWx1ZXNbK2luZGV4XTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCB7IHRhZ05hbWUsIHR5cGUgfSA9IGlucHV0O1xuXG4gICAgICBpZiAodGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAoaW5wdXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzYXZlSW5wdXRWYWx1ZXMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiAoYm9vbGVhbiB8IHN0cmluZylbXSB7XG4gIGNvbnN0IGlucHV0cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKSBhcyBOb2RlTGlzdE9mPFxuICAgIEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MU2VsZWN0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnRcbiAgPjtcblxuICByZXR1cm4gW10ubWFwLmNhbGwoaW5wdXRzLCAoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MU2VsZWN0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQpID0+IHtcbiAgICBjb25zdCB7IHR5cGUgfSA9IGlucHV0O1xuXG4gICAgaWYgKGlucHV0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgKHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJykpIHtcbiAgICAgIHJldHVybiAoaW5wdXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXQudmFsdWU7XG4gIH0pO1xufVxuXG50eXBlIEFkYXB0aXZlQ2FyZFJlbmRlcmVyUHJvcHMgPSB7XG4gIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZT86IHN0cmluZztcbiAgYWRhcHRpdmVDYXJkOiBBZGFwdGl2ZUNhcmQ7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgdGFwQWN0aW9uPzogRGlyZWN0TGluZUNhcmRBY3Rpb247XG59O1xuXG5jb25zdCBBZGFwdGl2ZUNhcmRSZW5kZXJlcjogVkZDPEFkYXB0aXZlQ2FyZFJlbmRlcmVyUHJvcHM+ID0gKHtcbiAgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lLFxuICBhZGFwdGl2ZUNhcmQsXG4gIGRpc2FibGVkOiBkaXNhYmxlZEZyb21Qcm9wcyxcbiAgdGFwQWN0aW9uXG59KSA9PiB7XG4gIGNvbnN0IFt7IGFkYXB0aXZlQ2FyZFJlbmRlcmVyOiBhZGFwdGl2ZUNhcmRSZW5kZXJlclN0eWxlU2V0IH1dID0gdXNlU3R5bGVTZXQoKTtcbiAgY29uc3QgW3sgR2xvYmFsU2V0dGluZ3MsIEhvc3RDb25maWcgfV0gPSB1c2VBZGFwdGl2ZUNhcmRzUGFja2FnZSgpO1xuICBjb25zdCBbYWN0aW9uc1BlcmZvcm1lZCwgc2V0QWN0aW9uc1BlcmZvcm1lZF0gPSB1c2VTdGF0ZTxBZGFwdGl2ZUNhcmRBY3Rpb25bXT4oW10pO1xuICBjb25zdCBbYWRhcHRpdmVDYXJkc0hvc3RDb25maWddID0gdXNlQWRhcHRpdmVDYXJkc0hvc3RDb25maWcoKTtcbiAgY29uc3QgW2Rpc2FibGVkRnJvbUNvbXBvc2VyXSA9IHVzZURpc2FibGVkKCk7XG4gIGNvbnN0IFtlcnJvcnMsIHNldEVycm9yc10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtsYXN0UmVuZGVyLCBzZXRMYXN0UmVuZGVyXSA9IHVzZVN0YXRlKDApO1xuICBjb25zdCBhY3RpdmVFbGVtZW50SW5kZXhSZWYgPSB1c2VSZWYoLTEpO1xuICBjb25zdCBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmID0gdXNlUmVmPEhUTUxFbGVtZW50PigpO1xuICBjb25zdCBjb250ZW50UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PigpO1xuICBjb25zdCBpbnB1dFZhbHVlc1JlZiA9IHVzZVJlZjwoYm9vbGVhbiB8IHN0cmluZylbXT4oW10pO1xuICBjb25zdCBsb2NhbGl6ZSA9IHVzZUxvY2FsaXplcigpO1xuICBjb25zdCBwZXJmb3JtQ2FyZEFjdGlvbiA9IHVzZVBlcmZvcm1DYXJkQWN0aW9uKCk7XG4gIGNvbnN0IHJlbmRlck1hcmtkb3duQXNIVE1MID0gdXNlUmVuZGVyTWFya2Rvd25Bc0hUTUwoKTtcbiAgY29uc3Qgc2Nyb2xsVG9FbmQgPSB1c2VTY3JvbGxUb0VuZCgpO1xuXG4gIGNvbnN0IGRpc2FibGVkID0gZGlzYWJsZWRGcm9tQ29tcG9zZXIgfHwgZGlzYWJsZWRGcm9tUHJvcHM7XG5cbiAgLy8gVE9ETzogW1AyXSAjMzE5OSBXZSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYGFkYXB0aXZlQ2FyZC5zZWxlY3RBY3Rpb25gIGluc3RlYWQuXG4gIC8vIFRoZSBudWxsIGNoZWNrIGZvciBcInRhcEFjdGlvblwiIGlzIGluIFwiaGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvblwiLlxuICBjb25zdCBoYW5kbGVDbGlja0FuZEtleVByZXNzID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgeyBrZXksIHR5cGUgfSA9IGV2ZW50IGFzIEtleWJvYXJkRXZlbnQ7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQ7XG5cbiAgICAgIC8vIFNvbWUgaXRlbXMsIGUuZy4gdGFwcGFibGUgdGV4dCwgY2Fubm90IGJlIGRpc2FibGVkIHRocnUgRE9NIGF0dHJpYnV0ZXNcbiAgICAgIGNvbnN0IHsgY3VycmVudCB9ID0gY29udGVudFJlZjtcbiAgICAgIGNvbnN0IGFkYXB0aXZlQ2FyZFJvb3QgPSBjdXJyZW50LnF1ZXJ5U2VsZWN0b3IoJy5hYy1hZGFwdGl2ZUNhcmRbdGFiaW5kZXg9XCIwXCJdJyk7XG5cbiAgICAgIGlmICghYWRhcHRpdmVDYXJkUm9vdCkge1xuICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKFxuICAgICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogTm8gQWRhcHRpdmUgQ2FyZCByb290IGNvbnRhaW5lciBjYW4gYmUgZm91bmQ7IHRoZSBjYXJkIGlzIHByb2JhYmx5IG9uIGFuIHVuc3VwcG9ydGVkIEFkYXB0aXZlIENhcmQgdmVyc2lvbi4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBcImtleXByZXNzXCIgZXZlbnQsIHdlIG9ubHkgbGlzdGVuIHRvIEVOVEVSIGFuZCBTUEFDRUJBUiBrZXkuXG4gICAgICBpZiAodHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgICBpZiAoa2V5ICE9PSAnRW50ZXInICYmIGtleSAhPT0gJyAnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2Ugd2lsbCBjYWxsIHBlcmZvcm1DYXJkQWN0aW9uIGlmIGVpdGhlcjpcbiAgICAgIC8vIDEuIFdlIGFyZSBvbiB0aGUgdGFyZ2V0LCBvclxuICAgICAgLy8gMi4gVGhlIGV2ZW50LWRpc3BhdGNoaW5nIGVsZW1lbnQgaXMgbm90IGludGVyYWN0aXZlXG4gICAgICBpZiAodGFyZ2V0ICE9PSBhZGFwdGl2ZUNhcmRSb290KSB7XG4gICAgICAgIGNvbnN0IHRhYkluZGV4ID0gZ2V0VGFiSW5kZXgodGFyZ2V0KTtcblxuICAgICAgICAvLyBJZiB0aGUgdXNlciBpcyBjbGlja2luZyBvbiBzb21ldGhpbmcgdGhhdCBpcyBhbHJlYWR5IGNsaWNrYWJsZSwgZG8gbm90IGFsbG93IHRoZW0gdG8gY2xpY2sgdGhlIGNhcmQuXG4gICAgICAgIC8vIEUuZy4gYSBoZXJvIGNhcmQgY2FuIGJlIHRhcHBhYmxlLCBhbmQgaW1hZ2UgYW5kIGJ1dHRvbnMgaW5zaWRlIHRoZSBoZXJvIGNhcmQgY2FuIGFsc28gYmUgdGFwcGFibGUuXG4gICAgICAgIGlmICh0eXBlb2YgdGFiSW5kZXggPT09ICdudW1iZXInICYmIHRhYkluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGVyZm9ybUNhcmRBY3Rpb24odGFwQWN0aW9uKTtcbiAgICAgIHNjcm9sbFRvRW5kKCk7XG4gICAgfSxcbiAgICBbY29udGVudFJlZiwgcGVyZm9ybUNhcmRBY3Rpb24sIHNjcm9sbFRvRW5kLCB0YXBBY3Rpb25dXG4gICk7XG5cbiAgLy8gT25seSBsaXN0ZW4gdG8gZXZlbnQgaWYgaXQgaXMgbm90IGRpc2FibGVkIGFuZCBoYXZlIFwidGFwQWN0aW9uXCIgcHJvcC5cbiAgY29uc3QgaGFuZGxlQ2xpY2tBbmRLZXlQcmVzc0ZvclRhcEFjdGlvbiA9ICFkaXNhYmxlZCAmJiB0YXBBY3Rpb24gPyBoYW5kbGVDbGlja0FuZEtleVByZXNzIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFkZEFjdGlvbnNQZXJmb3JtZWQgPSB1c2VDYWxsYmFjayhcbiAgICAoYWN0aW9uOiBBZGFwdGl2ZUNhcmRBY3Rpb24pOiB2b2lkID0+XG4gICAgICAhfmFjdGlvbnNQZXJmb3JtZWQuaW5kZXhPZihhY3Rpb24pICYmIHNldEFjdGlvbnNQZXJmb3JtZWQoWy4uLmFjdGlvbnNQZXJmb3JtZWQsIGFjdGlvbl0pLFxuICAgIFthY3Rpb25zUGVyZm9ybWVkLCBzZXRBY3Rpb25zUGVyZm9ybWVkXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUV4ZWN1dGVBY3Rpb24gPSB1c2VDYWxsYmFjayhcbiAgICAoYWN0aW9uOiBBZGFwdGl2ZUNhcmRBY3Rpb24pOiB2b2lkID0+IHtcbiAgICAgIC8vIFNvbWUgaXRlbXMsIGUuZy4gdGFwcGFibGUgaW1hZ2UsIGNhbm5vdCBiZSBkaXNhYmxlZCB0aHJ1IERPTSBhdHRyaWJ1dGVzXG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhZGRBY3Rpb25zUGVyZm9ybWVkKGFjdGlvbik7XG5cbiAgICAgIGNvbnN0IGFjdGlvblR5cGVOYW1lID0gYWN0aW9uLmdldEpzb25UeXBlTmFtZSgpO1xuICAgICAgY29uc3QgeyBpY29uVXJsOiBpbWFnZSwgdGl0bGUgfSA9IGFjdGlvbjtcblxuICAgICAgLy8gV2UgY2Fubm90IHVzZSBcImluc3RhbmNlb2ZcIiBjaGVjayBoZXJlLCBiZWNhdXNlIHdlYiBkZXZzIG1heSBicmluZyB0aGVpciBvd24gdmVyc2lvbiBvZiBBZGFwdGl2ZSBDYXJkcyBwYWNrYWdlLlxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayB1c2luZyBcImdldEpzb25UeXBlTmFtZSgpXCIgaW5zdGVhZC5cbiAgICAgIGlmIChhY3Rpb25UeXBlTmFtZSA9PT0gJ0FjdGlvbi5PcGVuVXJsJykge1xuICAgICAgICBjb25zdCB7IHVybDogdmFsdWUgfSA9IGFjdGlvbiBhcyBPcGVuVXJsQWN0aW9uO1xuXG4gICAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKHtcbiAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICB0eXBlOiAnb3BlblVybCcsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGFjdGlvblR5cGVOYW1lID09PSAnQWN0aW9uLlN1Ym1pdCcpIHtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhY3Rpb24gYXMgU3VibWl0QWN0aW9uIGFzIHtcbiAgICAgICAgICBkYXRhOiBzdHJpbmcgfCBCb3RGcmFtZXdvcmtDYXJkQWN0aW9uO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwZXJmb3JtQ2FyZEFjdGlvbih7XG4gICAgICAgICAgICAgIGltYWdlLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgdHlwZTogJ2ltQmFjaycsXG4gICAgICAgICAgICAgIHZhbHVlOiBkYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuX19pc0JvdEZyYW1ld29ya0NhcmRBY3Rpb24pIHtcbiAgICAgICAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKGRhdGEuY2FyZEFjdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlcmZvcm1DYXJkQWN0aW9uKHtcbiAgICAgICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICB0eXBlOiAncG9zdEJhY2snLFxuICAgICAgICAgICAgICB2YWx1ZTogZGF0YVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2Nyb2xsVG9FbmQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFdlYiBDaGF0OiByZWNlaXZlZCB1bmtub3duIGFjdGlvbiBmcm9tIEFkYXB0aXZlIENhcmRzYCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFthZGRBY3Rpb25zUGVyZm9ybWVkLCBkaXNhYmxlZCwgcGVyZm9ybUNhcmRBY3Rpb24sIHNjcm9sbFRvRW5kXVxuICApO1xuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgeyBjdXJyZW50IH0gPSBjb250ZW50UmVmO1xuXG4gICAgaWYgKCFjdXJyZW50IHx8ICFhZGFwdGl2ZUNhcmQpIHtcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbmRleFJlZi5jdXJyZW50ID0gLTE7XG4gICAgICBpbnB1dFZhbHVlc1JlZi5jdXJyZW50ID0gW107XG4gICAgfVxuXG4gICAgLy8gQ3VycmVudGx5LCB0aGUgb25seSB3YXkgdG8gc2V0IHRoZSBNYXJrZG93biBlbmdpbmUgaXMgdG8gc2V0IGl0IHRocnUgc3RhdGljIG1lbWJlciBvZiBBZGFwdGl2ZUNhcmQgY2xhc3NcblxuICAgIC8vIFRPRE86IFtQM10gQ2hlY2tzIGlmIHdlIGNvdWxkIG1ha2UgdGhlIFwicmVuZGVyTWFya2Rvd25Bc0hUTUxcIiBwZXIgY2FyZFxuICAgIC8vICAgICAgIFRoaXMgY291bGQgYmUgbGltaXRhdGlvbnMgZnJvbSBBZGFwdGl2ZSBDYXJkcyBwYWNrYWdlIChub3Qgc3VwcG9ydGVkIGFzIG9mIDEuMi41KVxuICAgIC8vICAgICAgIEJlY2F1c2UgdGhlcmUgY291bGQgYmUgdGltaW5nIGRpZmZlcmVuY2UgYmV0d2VlbiAucGFyc2UgYW5kIC5yZW5kZXIsIHdlIGNvdWxkIGJlIHVzaW5nIHdyb25nIE1hcmtkb3duIGVuZ2luZVxuXG4gICAgLy8gXCJvblByb2Nlc3NNYXJrZG93blwiIGlzIGEgc3RhdGljIGZ1bmN0aW9uIGJ1dCB3ZSBhcmUgdHJ5aW5nIHRvIHNjb3BlIGl0IHRvIHRoZSBjdXJyZW50IG9iamVjdCBpbnN0ZWFkLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkb3Qtbm90YXRpb25cbiAgICBhZGFwdGl2ZUNhcmQuY29uc3RydWN0b3JbJ29uUHJvY2Vzc01hcmtkb3duJ10gPSAodGV4dDogc3RyaW5nLCByZXN1bHQ6IElNYXJrZG93blByb2Nlc3NpbmdSZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZW5kZXJNYXJrZG93bkFzSFRNTCkge1xuICAgICAgICByZXN1bHQub3V0cHV0SHRtbCA9IHJlbmRlck1hcmtkb3duQXNIVE1MKHRleHQpO1xuICAgICAgICByZXN1bHQuZGlkUHJvY2VzcyA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZykge1xuICAgICAgYWRhcHRpdmVDYXJkLmhvc3RDb25maWcgPSBpc1BsYWluT2JqZWN0KGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKVxuICAgICAgICA/IG5ldyBIb3N0Q29uZmlnKGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnKVxuICAgICAgICA6IGFkYXB0aXZlQ2FyZHNIb3N0Q29uZmlnO1xuICAgIH1cblxuICAgIC8vIEZvciBhY2Nlc3NpYmlsaXR5IGlzc3VlICMxMzQwLCBgdGFiaW5kZXg9XCIwXCJgIG11c3Qgbm90IGJlIHNldCBmb3IgdGhlIHJvb3QgY29udGFpbmVyIGlmIGl0IGlzIG5vdCBpbnRlcmFjdGl2ZS5cbiAgICBHbG9iYWxTZXR0aW5ncy5zZXRUYWJJbmRleEF0Q2FyZFJvb3QgPSAhIXRhcEFjdGlvbjtcblxuICAgIGNvbnN0IHsgdmFsaWRhdGlvbkV2ZW50cyB9ID0gYWRhcHRpdmVDYXJkLnZhbGlkYXRlUHJvcGVydGllcygpO1xuXG4gICAgaWYgKHZhbGlkYXRpb25FdmVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gc2V0RXJyb3JzKHZhbGlkYXRpb25FdmVudHMucmVkdWNlKChpdGVtcywgeyBtZXNzYWdlIH0pID0+IFsuLi5pdGVtcywgbmV3IEVycm9yKG1lc3NhZ2UpXSwgW10pKTtcbiAgICB9XG5cbiAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICB0cnkge1xuICAgICAgZWxlbWVudCA9IGFkYXB0aXZlQ2FyZC5yZW5kZXIoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHNldEVycm9ycyhbZXJyb3JdKTtcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBzZXRFcnJvcnMoW25ldyBFcnJvcignQWRhcHRpdmUgQ2FyZCByZW5kZXJlZCBhcyBlbXB0eSBlbGVtZW50JyldKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBlcnJvcnMgb24gbmV4dCByZW5kZXJcbiAgICBzZXRFcnJvcnMoW10pO1xuXG4gICAgcmVzdG9yZUlucHV0VmFsdWVzKGVsZW1lbnQsIGlucHV0VmFsdWVzUmVmLmN1cnJlbnQpO1xuXG4gICAgY3VycmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQgPSBlbGVtZW50O1xuXG4gICAgLy8gRm9jdXMgY2FuIG9ubHkgYmUgcmVzdG9yZWQgYWZ0ZXIgdGhlIERPTSBpcyBhdHRhY2hlZC5cbiAgICByZXN0b3JlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQsIGFjdGl2ZUVsZW1lbnRJbmRleFJlZi5jdXJyZW50KTtcblxuICAgIHNldExhc3RSZW5kZXIoRGF0ZS5ub3coKSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlRWxlbWVudEluZGV4UmVmLmN1cnJlbnQgPSBzYXZlQWN0aXZlRWxlbWVudEluZGV4KGVsZW1lbnQpO1xuICAgICAgaW5wdXRWYWx1ZXNSZWYuY3VycmVudCA9IHNhdmVJbnB1dFZhbHVlcyhlbGVtZW50KTtcblxuICAgICAgY3VycmVudC5yZW1vdmVDaGlsZChhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQpO1xuXG4gICAgICBhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgfSwgW1xuICAgIGFkYXB0aXZlQ2FyZCxcbiAgICBhZGFwdGl2ZUNhcmRzSG9zdENvbmZpZyxcbiAgICBjb250ZW50UmVmLFxuICAgIEdsb2JhbFNldHRpbmdzLFxuICAgIEhvc3RDb25maWcsXG4gICAgcmVuZGVyTWFya2Rvd25Bc0hUTUwsXG4gICAgc2V0RXJyb3JzLFxuICAgIHRhcEFjdGlvblxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIFNldCBvbkV4ZWN1dGVBY3Rpb24gd2l0aG91dCBjYXVzaW5nIHVubmVjZXNzYXJ5IHJlLXJlbmRlci5cbiAgICBhZGFwdGl2ZUNhcmQub25FeGVjdXRlQWN0aW9uID0gZGlzYWJsZWQgPyB1bmRlZmluZWQgOiBoYW5kbGVFeGVjdXRlQWN0aW9uO1xuICB9LCBbYWRhcHRpdmVDYXJkLCBkaXNhYmxlZCwgaGFuZGxlRXhlY3V0ZUFjdGlvbl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiBmaXhBY2Nlc3NpYmlsaXR5SXNzdWVzV2l0aFVuZG8oYWRhcHRpdmVDYXJkRWxlbWVudFJlZi5jdXJyZW50KSwgW2FkYXB0aXZlQ2FyZEVsZW1lbnRSZWYsIGxhc3RSZW5kZXJdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIElmIHRoZSBBZGFwdGl2ZSBDYXJkIGdldCByZS1yZW5kZXJlZCwgcmUtZGlzYWJsZSBlbGVtZW50cyBhcyBuZWVkZWQuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gZGlzYWJsZUlucHV0RWxlbWVudHNXaXRoVW5kbyhhZGFwdGl2ZUNhcmRFbGVtZW50UmVmLmN1cnJlbnQpO1xuICAgIH1cbiAgfSwgW2FkYXB0aXZlQ2FyZEVsZW1lbnRSZWYsIGRpc2FibGVkLCBsYXN0UmVuZGVyXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBJZiB0aGUgQWRhcHRpdmUgQ2FyZCBjaGFuZ2VkLCByZXNldCBhbGwgYWN0aW9ucyBwZXJmb3JtZWQuXG4gICAgc2V0QWN0aW9uc1BlcmZvcm1lZChbXSk7XG4gIH0sIFthZGFwdGl2ZUNhcmRdKTtcblxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT5cbiAgICAgIGluZGljYXRlQWN0aW9uU2VsZWN0aW9uV2l0aFVuZG8oXG4gICAgICAgIC8vIEFjdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSBcInJlbmRlcmVkRWxlbWVudFwiIG1lYW5zIGl0IGlzIHRoZSBBZGFwdGl2ZSBDYXJkIGl0c2VsZiwgc3VjaCBhcyBcInNlbGVjdEFjdGlvblwiIChBQykgb3IgXCJ0YXBBY3Rpb25cIiAocmljaCBjYXJkcykuXG4gICAgICAgIC8vIFdlIGRvIG5vdCBuZWVkIHRvIG1hcmsgdGhlIHdob2xlIGNhcmQgYXMgcGVyZm9ybWVkLlxuICAgICAgICBhY3Rpb25zUGVyZm9ybWVkLm1hcCgoeyByZW5kZXJlZEVsZW1lbnQgfSkgPT4gcmVuZGVyZWRFbGVtZW50KS5maWx0ZXIocmVuZGVyZWRFbGVtZW50ID0+IHJlbmRlcmVkRWxlbWVudCksXG4gICAgICAgIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZVxuICAgICAgKSxcbiAgICBbYWN0aW9uc1BlcmZvcm1lZCwgYWN0aW9uUGVyZm9ybWVkQ2xhc3NOYW1lLCBsYXN0UmVuZGVyXVxuICApO1xuXG4gIHJldHVybiBlcnJvcnMubGVuZ3RoID8gKFxuICAgIG5vZGVfZW52ID09PSAnZGV2ZWxvcG1lbnQnICYmIDxFcnJvckJveCBlcnJvcj17ZXJyb3JzWzBdfSB0eXBlPXtsb2NhbGl6ZSgnQURBUFRJVkVfQ0FSRF9FUlJPUl9CT1hfVElUTEVfUkVOREVSJyl9IC8+XG4gICkgOiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGFkYXB0aXZlQ2FyZFJlbmRlcmVyU3R5bGVTZXQgKyAnJywgJ3dlYmNoYXRfX2FkYXB0aXZlLWNhcmQtcmVuZGVyZXInKX1cbiAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrQW5kS2V5UHJlc3NGb3JUYXBBY3Rpb24gYXMgdW5rbm93biBhcyBNb3VzZUV2ZW50SGFuZGxlcjxIVE1MRGl2RWxlbWVudD59XG4gICAgICBvbktleVByZXNzPXtoYW5kbGVDbGlja0FuZEtleVByZXNzRm9yVGFwQWN0aW9uIGFzIHVua25vd24gYXMgS2V5Ym9hcmRFdmVudEhhbmRsZXI8SFRNTERpdkVsZW1lbnQ+fVxuICAgICAgcmVmPXtjb250ZW50UmVmfVxuICAgIC8+XG4gICk7XG59O1xuXG5BZGFwdGl2ZUNhcmRSZW5kZXJlci5kZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZTogJycsXG4gIGRpc2FibGVkOiB1bmRlZmluZWQsXG4gIHRhcEFjdGlvbjogdW5kZWZpbmVkXG59O1xuXG5BZGFwdGl2ZUNhcmRSZW5kZXJlci5wcm9wVHlwZXMgPSB7XG4gIGFjdGlvblBlcmZvcm1lZENsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgYWRhcHRpdmVDYXJkOiBQcm9wVHlwZXMuYW55LmlzUmVxdWlyZWQsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvLyBUeXBlU2NyaXB0IGNsYXNzIGlzIG5vdCBtYXBwYWJsZSB0byBQcm9wVHlwZXMuZnVuY1xuICAvLyBAdHMtaWdub3JlXG4gIHRhcEFjdGlvbjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBpbWFnZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgdmFsdWU6IFByb3BUeXBlcy5zdHJpbmdcbiAgfSlcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFkYXB0aXZlQ2FyZFJlbmRlcmVyO1xuIl19