@sapui5/sap.fe.templates 1.108.8 → 1.108.10

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 (42) hide show
  1. package/package.json +6 -3
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/AnalyticalListPage/Component.js +1 -7
  4. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +1 -4
  5. package/src/sap/fe/templates/Feedback.js +3 -13
  6. package/src/sap/fe/templates/ListComponent.js +2 -19
  7. package/src/sap/fe/templates/ListReport/Component.js +1 -18
  8. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +10 -35
  9. package/src/sap/fe/templates/ListReport/ListReport.view.xml +1 -1
  10. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +80 -226
  11. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +9 -2
  12. package/src/sap/fe/templates/ListReport/ListReportTemplating.js +2 -7
  13. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +21 -108
  14. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +9 -17
  15. package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -25
  16. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +51 -122
  17. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +1 -23
  18. package/src/sap/fe/templates/ObjectPage/Component.js +12 -37
  19. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +17 -54
  20. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +256 -467
  21. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +69 -15
  22. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +66 -198
  23. package/src/sap/fe/templates/ObjectPage/components/DraftHandlerButton.js +1 -32
  24. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +9 -37
  25. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +1 -7
  26. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +9 -31
  27. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +1 -1
  28. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +2 -4
  29. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
  30. package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.js +4 -5
  31. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +1 -1
  32. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +1 -1
  33. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +15 -20
  34. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +1 -1
  35. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +1 -1
  36. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +4 -5
  37. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +18 -68
  38. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +5 -20
  39. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +1 -2
  40. package/src/sap/fe/templates/TableScroller.js +1 -6
  41. package/src/sap/fe/templates/library.js +2 -5
  42. package/src/sap/fe/templates/messagebundle_it.properties +1 -1
@@ -6,7 +6,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10, _descriptor11, _descriptor12;
9
-
10
9
  var usingExtension = ClassSupport.usingExtension;
11
10
  var publicExtension = ClassSupport.publicExtension;
12
11
  var finalExtension = ClassSupport.finalExtension;
@@ -17,53 +16,41 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
17
16
  var isConnected = ActivitySync.isConnected;
18
17
  var disconnect = ActivitySync.disconnect;
19
18
  var connect = ActivitySync.connect;
20
-
21
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
22
-
23
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
24
-
25
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
26
-
27
19
  function _catch(body, recover) {
28
20
  try {
29
21
  var result = body();
30
22
  } catch (e) {
31
23
  return recover(e);
32
24
  }
33
-
34
25
  if (result && result.then) {
35
26
  return result.then(void 0, recover);
36
27
  }
37
-
38
28
  return result;
39
29
  }
40
-
41
30
  function _finallyRethrows(body, finalizer) {
42
31
  try {
43
32
  var result = body();
44
33
  } catch (e) {
45
34
  return finalizer(true, e);
46
35
  }
47
-
48
36
  if (result && result.then) {
49
37
  return result.then(finalizer.bind(null, false), finalizer.bind(null, true));
50
38
  }
51
-
52
39
  return finalizer(false, result);
53
40
  }
54
-
41
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
42
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
43
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
44
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
45
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
46
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
47
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
55
48
  function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
56
-
57
49
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
58
-
59
50
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
60
-
61
51
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
62
-
63
52
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
64
-
65
53
  function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
66
-
67
54
  var ObjectPageController = (_dec = defineUI5Class("sap.fe.templates.ObjectPage.ObjectPageController"), _dec2 = usingExtension(Placeholder), _dec3 = usingExtension(EditFlow), _dec4 = usingExtension(Share.override(ShareOverrides)), _dec5 = usingExtension(InternalEditFlow.override(EditFlowOverrides)), _dec6 = usingExtension(InternalRouting.override(InternalRoutingOverride)), _dec7 = usingExtension(Paginator.override(PaginatorOverride)), _dec8 = usingExtension(MessageHandler.override(MessageHandlerOverride)), _dec9 = usingExtension(IntentBasedNavigation.override(IntentBasedNavigationOverride)), _dec10 = usingExtension(InternalIntentBasedNavigation.override({
68
55
  getNavigationMode: function () {
69
56
  var bIsStickyEditMode = this.getView().getController().getStickyEditMode && this.getView().getController().getStickyEditMode();
@@ -75,40 +62,24 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
75
62
  }
76
63
  })), _dec13 = usingExtension(MassEdit), _dec14 = publicExtension(), _dec15 = finalExtension(), _dec16 = publicExtension(), _dec17 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
77
64
  _inheritsLoose(ObjectPageController, _PageController);
78
-
79
65
  function ObjectPageController() {
80
66
  var _this;
81
-
82
67
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
83
68
  args[_key] = arguments[_key];
84
69
  }
85
-
86
70
  _this = _PageController.call.apply(_PageController, [this].concat(args)) || this;
87
-
88
71
  _initializerDefineProperty(_this, "placeholder", _descriptor, _assertThisInitialized(_this));
89
-
90
72
  _initializerDefineProperty(_this, "editFlow", _descriptor2, _assertThisInitialized(_this));
91
-
92
73
  _initializerDefineProperty(_this, "share", _descriptor3, _assertThisInitialized(_this));
93
-
94
74
  _initializerDefineProperty(_this, "_editFlow", _descriptor4, _assertThisInitialized(_this));
95
-
96
75
  _initializerDefineProperty(_this, "_routing", _descriptor5, _assertThisInitialized(_this));
97
-
98
76
  _initializerDefineProperty(_this, "paginator", _descriptor6, _assertThisInitialized(_this));
99
-
100
77
  _initializerDefineProperty(_this, "messageHandler", _descriptor7, _assertThisInitialized(_this));
101
-
102
78
  _initializerDefineProperty(_this, "intentBasedNavigation", _descriptor8, _assertThisInitialized(_this));
103
-
104
79
  _initializerDefineProperty(_this, "_intentBasedNavigation", _descriptor9, _assertThisInitialized(_this));
105
-
106
80
  _initializerDefineProperty(_this, "viewState", _descriptor10, _assertThisInitialized(_this));
107
-
108
81
  _initializerDefineProperty(_this, "pageReady", _descriptor11, _assertThisInitialized(_this));
109
-
110
82
  _initializerDefineProperty(_this, "massEdit", _descriptor12, _assertThisInitialized(_this));
111
-
112
83
  _this.handlers = {
113
84
  /**
114
85
  * Invokes the page primary action on press of Ctrl+Enter.
@@ -130,8 +101,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
130
101
  */
131
102
  onPrimaryAction: function (oController, oView, oContext, sActionName, mParameters, mConditions) {
132
103
  var iViewLevel = oController.getView().getViewData().viewLevel,
133
- oObjectPage = oController._getObjectPageLayoutControl();
134
-
104
+ oObjectPage = oController._getObjectPageLayoutControl();
135
105
  if (mConditions.positiveActionVisible) {
136
106
  if (mConditions.positiveActionEnabled) {
137
107
  oController.handlers.onCallAction(oView, sActionName, mParameters);
@@ -148,40 +118,31 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
148
118
  },
149
119
  onTableContextChange: function (oEvent) {
150
120
  var _this2 = this;
151
-
152
121
  var oSource = oEvent.getSource();
153
122
  var oTable;
154
-
155
123
  this._findTables().some(function (_oTable) {
156
124
  if (_oTable.getRowBinding() === oSource) {
157
125
  oTable = _oTable;
158
126
  return true;
159
127
  }
160
-
161
128
  return false;
162
129
  });
163
-
164
130
  var oCurrentActionPromise = this._editFlow.getCurrentActionPromise();
165
-
166
131
  if (oCurrentActionPromise) {
167
132
  var aTableContexts;
168
-
169
133
  if (oTable.getType().getMetadata().isA("sap.ui.mdc.table.GridTableType")) {
170
134
  aTableContexts = oSource.getContexts(0);
171
135
  } else {
172
136
  aTableContexts = oSource.getCurrentContexts();
173
- } //if contexts are not fully loaded the getcontexts function above will trigger a new change event call
174
-
175
-
137
+ }
138
+ //if contexts are not fully loaded the getcontexts function above will trigger a new change event call
176
139
  if (!aTableContexts[0]) {
177
140
  return;
178
141
  }
179
-
180
142
  oCurrentActionPromise.then(function (oActionResponse) {
181
143
  if (!oActionResponse || oActionResponse.controlId !== oTable.sId) {
182
144
  return;
183
145
  }
184
-
185
146
  var oActionData = oActionResponse.oData;
186
147
  var aKeys = oActionResponse.keys;
187
148
  var iNewItemp = -1;
@@ -190,20 +151,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
190
151
  var bCompare = aKeys.every(function (sKey) {
191
152
  return oTableData[sKey] === oActionData[sKey];
192
153
  });
193
-
194
154
  if (bCompare) {
195
155
  iNewItemp = i;
196
156
  }
197
-
198
157
  return bCompare;
199
158
  });
200
-
201
159
  if (iNewItemp !== -1) {
202
160
  var aDialogs = InstanceManager.getOpenDialogs();
203
161
  var oDialog = aDialogs.length > 0 ? aDialogs.find(function (dialog) {
204
162
  return dialog.data("FullScreenDialog") !== true;
205
163
  }) : null;
206
-
207
164
  if (oDialog) {
208
165
  // by design, a sap.m.dialog set the focus to the previous focused element when closing.
209
166
  // we should wait for the dialog to be close before to focus another element
@@ -213,18 +170,15 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
213
170
  } else {
214
171
  oTable.focusRow(iNewItemp, true);
215
172
  }
216
-
217
173
  _this2._editFlow.deleteCurrentActionPromise();
218
174
  }
219
175
  }).catch(function (err) {
220
176
  Log.error("An error occurs while scrolling to the newly created Item: ".concat(err));
221
177
  });
222
- } // fire ModelContextChange on the message button whenever the table context changes
223
-
224
-
178
+ }
179
+ // fire ModelContextChange on the message button whenever the table context changes
225
180
  this.messageButton.fireModelContextChange();
226
181
  },
227
-
228
182
  /**
229
183
  * Invokes an action - bound/unbound and sets the page dirty.
230
184
  *
@@ -244,12 +198,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
244
198
  onDataPointTitlePressed: function (oController, oSource, oManifestOutbound, sControlConfig, sCollectionPath) {
245
199
  oManifestOutbound = typeof oManifestOutbound === "string" ? JSON.parse(oManifestOutbound) : oManifestOutbound;
246
200
  var oTargetInfo = oManifestOutbound[sControlConfig],
247
- aSemanticObjectMapping = CommonUtils.getSemanticObjectMapping(oTargetInfo),
248
- oDataPointOrChartBindingContext = oSource.getBindingContext(),
249
- sMetaPath = oDataPointOrChartBindingContext.getModel().getMetaModel().getMetaPath(oDataPointOrChartBindingContext.getPath());
250
-
201
+ aSemanticObjectMapping = CommonUtils.getSemanticObjectMapping(oTargetInfo),
202
+ oDataPointOrChartBindingContext = oSource.getBindingContext(),
203
+ sMetaPath = oDataPointOrChartBindingContext.getModel().getMetaModel().getMetaPath(oDataPointOrChartBindingContext.getPath());
251
204
  var aNavigationData = oController._getChartContextData(oDataPointOrChartBindingContext, sCollectionPath);
252
-
253
205
  var additionalNavigationParameters;
254
206
  aNavigationData = aNavigationData.map(function (oNavigationData) {
255
207
  return {
@@ -257,15 +209,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
257
209
  metaPath: sMetaPath + (sCollectionPath ? "/".concat(sCollectionPath) : "")
258
210
  };
259
211
  });
260
-
261
212
  if (oTargetInfo && oTargetInfo.parameters) {
262
213
  var oParams = oTargetInfo.parameters && oController._intentBasedNavigation.getOutboundParams(oTargetInfo.parameters);
263
-
264
214
  if (Object.keys(oParams).length > 0) {
265
215
  additionalNavigationParameters = oParams;
266
216
  }
267
217
  }
268
-
269
218
  if (oTargetInfo && oTargetInfo.semanticObject && oTargetInfo.action) {
270
219
  oController._intentBasedNavigation.navigate(oTargetInfo.semanticObject, oTargetInfo.action, {
271
220
  navigationContexts: aNavigationData,
@@ -274,7 +223,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
274
223
  });
275
224
  }
276
225
  },
277
-
278
226
  /**
279
227
  * Triggers an outbound navigation when a user chooses the chevron.
280
228
  *
@@ -294,12 +242,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
294
242
  this.getExtensionAPI().updateAppState();
295
243
  this.bSectionNavigated = true;
296
244
  var oInternalModelContext = this.getView().getBindingContext("internal");
297
-
298
245
  var oObjectPage = this._getObjectPageLayoutControl();
299
-
300
246
  if (oObjectPage.getModel("ui").getProperty("/isEditable") && this.getView().getViewData().sectionLayout === "Tabs" && oInternalModelContext.getProperty("errorNavigationSectionFlag") === false) {
301
247
  var oSubSection = oEvent.getParameter("subSection");
302
-
303
248
  this._updateFocusInEditMode([oSubSection]);
304
249
  }
305
250
  },
@@ -308,7 +253,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
308
253
  },
309
254
  onVariantSaved: function () {
310
255
  var _this3 = this;
311
-
312
256
  //TODO: Should remove this setTimeOut once Variant Management provides an api to fetch the current variant key on save
313
257
  setTimeout(function () {
314
258
  _this3.getExtensionAPI().updateAppState();
@@ -319,7 +263,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
319
263
  var oObjectPage = oController.getView().byId("fe::ObjectPage");
320
264
  var oSection;
321
265
  var oSubSection;
322
-
323
266
  if (oDetailConfig.sectionId) {
324
267
  oSection = oController.getView().byId(oDetailConfig.sectionId);
325
268
  oSubSection = oDetailConfig.subSectionId ? oController.getView().byId(oDetailConfig.subSectionId) : oSection && oSection.getSubSections() && oSection.getSubSections()[0];
@@ -327,7 +270,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
327
270
  oSubSection = oController.getView().byId(oDetailConfig.subSectionId);
328
271
  oSection = oSubSection && oSubSection.getParent();
329
272
  }
330
-
331
273
  if (!oSection || !oSubSection || !oSection.getVisible() || !oSubSection.getVisible()) {
332
274
  oController.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (oResourceBundle) {
333
275
  var sTitle = CommonUtils.getTranslatedText("C_ROUTING_NAVIGATION_DISABLED_TITLE", oResourceBundle, null, oController.getView().getViewData().entitySet);
@@ -337,8 +279,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
337
279
  Log.error(error);
338
280
  });
339
281
  } else {
340
- oObjectPage.scrollToSection(oSubSection.getId()); // trigger iapp state change
341
-
282
+ oObjectPage.scrollToSection(oSubSection.getId());
283
+ // trigger iapp state change
342
284
  oObjectPage.fireNavigate({
343
285
  section: oSection,
344
286
  subSection: oSubSection
@@ -354,34 +296,27 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
354
296
  };
355
297
  return _this;
356
298
  }
357
-
358
299
  var _proto = ObjectPageController.prototype;
359
-
360
300
  _proto.getExtensionAPI = function getExtensionAPI(sId) {
361
301
  if (sId) {
362
302
  // to allow local ID usage for custom pages we'll create/return own instances for custom sections
363
303
  this.mCustomSectionExtensionAPIs = this.mCustomSectionExtensionAPIs || {};
364
-
365
304
  if (!this.mCustomSectionExtensionAPIs[sId]) {
366
305
  this.mCustomSectionExtensionAPIs[sId] = new ExtensionAPI(this, sId);
367
306
  }
368
-
369
307
  return this.mCustomSectionExtensionAPIs[sId];
370
308
  } else {
371
309
  if (!this.extensionAPI) {
372
310
  this.extensionAPI = new ExtensionAPI(this);
373
311
  }
374
-
375
312
  return this.extensionAPI;
376
313
  }
377
314
  };
378
-
379
315
  _proto.onInit = function onInit() {
380
316
  _PageController.prototype.onInit.call(this);
317
+ var oObjectPage = this._getObjectPageLayoutControl();
381
318
 
382
- var oObjectPage = this._getObjectPageLayoutControl(); // Setting defaults of internal model context
383
-
384
-
319
+ // Setting defaults of internal model context
385
320
  var oInternalModelContext = this.getView().getBindingContext("internal");
386
321
  oInternalModelContext === null || oInternalModelContext === void 0 ? void 0 : oInternalModelContext.setProperty("externalNavigationContext", {
387
322
  "page": true
@@ -392,58 +327,46 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
392
327
  });
393
328
  oInternalModelContext === null || oInternalModelContext === void 0 ? void 0 : oInternalModelContext.setProperty("batchGroups", this._getBatchGroupsForView());
394
329
  oInternalModelContext === null || oInternalModelContext === void 0 ? void 0 : oInternalModelContext.setProperty("errorNavigationSectionFlag", false);
395
-
396
330
  if (!this.getView().getViewData().useNewLazyLoading && oObjectPage.getEnableLazyLoading()) {
397
331
  //Attaching the event to make the subsection context binding active when it is visible.
398
332
  oObjectPage.attachEvent("subSectionEnteredViewPort", this._handleSubSectionEnteredViewPort.bind(this));
399
333
  }
400
-
401
334
  this.messageButton = this.getView().byId("fe::FooterBar::MessageButton");
402
335
  this.messageButton.oItemBinding.attachChange(this._fnShowOPMessage, this);
403
336
  };
404
-
405
337
  _proto.onExit = function onExit() {
406
338
  if (this.mCustomSectionExtensionAPIs) {
407
339
  for (var _i = 0, _Object$keys = Object.keys(this.mCustomSectionExtensionAPIs); _i < _Object$keys.length; _i++) {
408
340
  var sId = _Object$keys[_i];
409
-
410
341
  if (this.mCustomSectionExtensionAPIs[sId]) {
411
342
  this.mCustomSectionExtensionAPIs[sId].destroy();
412
343
  }
413
344
  }
414
-
415
345
  delete this.mCustomSectionExtensionAPIs;
416
346
  }
417
-
418
347
  if (this.extensionAPI) {
419
348
  this.extensionAPI.destroy();
420
349
  }
421
-
422
350
  delete this.extensionAPI;
423
351
  var oMessagePopover = this.messageButton ? this.messageButton.oMessagePopover : null;
424
-
425
352
  if (oMessagePopover && oMessagePopover.isOpen()) {
426
353
  oMessagePopover.close();
427
- } //when exiting we set keepAlive context to false
428
-
429
-
354
+ }
355
+ //when exiting we set keepAlive context to false
430
356
  var oContext = this.getView().getBindingContext();
431
-
432
357
  if (oContext && oContext.isKeepAlive()) {
433
358
  oContext.setKeepAlive(false);
434
359
  }
435
-
436
360
  if (isConnected(this.getView())) {
437
361
  disconnect(this.getView()); // Cleanup collaboration connection when leaving the app
438
362
  }
439
363
  }
364
+
440
365
  /**
441
366
  * Method to show the message strip on the object page.
442
367
  *
443
368
  * @private
444
- */
445
- ;
446
-
369
+ */;
447
370
  _proto._fnShowOPMessage = function _fnShowOPMessage() {
448
371
  var extensionAPI = this.getExtensionAPI();
449
372
  var view = this.getView();
@@ -451,98 +374,156 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
451
374
  return item.getBindingContext("message").getObject();
452
375
  }).filter(function (message) {
453
376
  var _view$getBindingConte;
454
-
455
377
  return message.getTargets()[0] === ((_view$getBindingConte = view.getBindingContext()) === null || _view$getBindingConte === void 0 ? void 0 : _view$getBindingConte.getPath());
456
378
  });
457
-
458
379
  if (extensionAPI) {
459
380
  extensionAPI.showMessages(messages);
460
381
  }
461
382
  };
462
-
463
383
  _proto._getTableBinding = function _getTableBinding(oTable) {
464
384
  return oTable && oTable.getRowBinding();
465
- };
385
+ }
466
386
 
387
+ /**
388
+ * Find the last visible subsection and add the sapUxAPObjectPageSubSectionFitContainer CSS class if it contains only a gridTable.
389
+ *
390
+ * @param subSections The sub sections to look for
391
+ * @private
392
+ */;
393
+ _proto.checkSectionsForGridTable = function checkSectionsForGridTable(subSections) {
394
+ var _this4 = this;
395
+ var changeClassForTables = function (event, lastVisibleSubSection) {
396
+ var _this4$searchTableInB, _this4$searchTableInB2;
397
+ var blocks = [].concat(_toConsumableArray(lastVisibleSubSection.getBlocks()), _toConsumableArray(lastVisibleSubSection.getMoreBlocks()));
398
+ if (blocks.length === 1 && (_this4$searchTableInB = _this4.searchTableInBlock(blocks[0])) !== null && _this4$searchTableInB !== void 0 && (_this4$searchTableInB2 = _this4$searchTableInB.getType()) !== null && _this4$searchTableInB2 !== void 0 && _this4$searchTableInB2.isA("sap.ui.mdc.table.GridTableType")) {
399
+ //In case there is only a single table in a subSection we fit that to the whole page so that the scrollbar comes only on table and not on page
400
+ lastVisibleSubSection.addStyleClass("sapUxAPObjectPageSubSectionFitContainer");
401
+ lastVisibleSubSection.detachEvent("modelContextChange", changeClassForTables, _this4);
402
+ }
403
+ };
404
+ for (var subSectionIndex = subSections.length - 1; subSectionIndex >= 0; subSectionIndex--) {
405
+ if (subSections[subSectionIndex].getVisible()) {
406
+ var lastVisibleSubSection = subSections[subSectionIndex];
407
+ // We need to attach this event in order to manage the Object Page Lazy Loading mechanism
408
+ lastVisibleSubSection.attachEvent("modelContextChange", lastVisibleSubSection, changeClassForTables, this);
409
+ break;
410
+ }
411
+ }
412
+ }
413
+
414
+ /**
415
+ * Find a table in blocks of section.
416
+ *
417
+ * @param block One sub section block
418
+ * @returns Table if exists
419
+ */;
420
+ _proto.searchTableInBlock = function searchTableInBlock(block) {
421
+ var control = block.content;
422
+ var tableAPI;
423
+ if (block.isA("sap.fe.templates.ObjectPage.controls.SubSectionBlock")) {
424
+ // The table may currently be shown in a full screen dialog, we can then get the reference to the TableAPI
425
+ // control from the custom data of the place holder panel
426
+ if (control.isA("sap.m.Panel") && control.data("FullScreenTablePlaceHolder")) {
427
+ tableAPI = control.data("tableAPIreference");
428
+ } else if (control.isA("sap.fe.macros.table.TableAPI")) {
429
+ tableAPI = control;
430
+ }
431
+ if (tableAPI) {
432
+ return tableAPI.content;
433
+ }
434
+ }
435
+ return undefined;
436
+ };
467
437
  _proto.onBeforeRendering = function onBeforeRendering() {
468
438
  var _this$oView$oViewData;
469
-
470
- PageController.prototype.onBeforeRendering.apply(this); // In the retrieveTextFromValueList scenario we need to ensure in case of reload/refresh that the meta model in the methode retrieveTextFromValueList of the FieldRuntime is available
471
-
439
+ PageController.prototype.onBeforeRendering.apply(this);
440
+ // In the retrieveTextFromValueList scenario we need to ensure in case of reload/refresh that the meta model in the methode retrieveTextFromValueList of the FieldRuntime is available
472
441
  if ((_this$oView$oViewData = this.oView.oViewData) !== null && _this$oView$oViewData !== void 0 && _this$oView$oViewData.retrieveTextFromValueList && CommonHelper.getMetaModel() === undefined) {
473
442
  CommonHelper.setMetaModel(this.getAppComponent().getMetaModel());
474
443
  }
475
444
  };
476
-
477
445
  _proto.onAfterRendering = function onAfterRendering() {
478
- var _this4 = this;
479
-
446
+ var _this5 = this;
480
447
  this.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (response) {
481
- _this4.oResourceBundle = response;
448
+ _this5.oResourceBundle = response;
482
449
  }).catch(function (oError) {
483
450
  Log.error("Error while retrieving the resource bundle", oError);
484
451
  });
452
+ var subSections;
453
+ if (this._getObjectPageLayoutControl().getUseIconTabBar()) {
454
+ var sections = this._getObjectPageLayoutControl().getSections();
455
+ var _iterator = _createForOfIteratorHelper(sections),
456
+ _step;
457
+ try {
458
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
459
+ var section = _step.value;
460
+ subSections = section.getSubSections();
461
+ this.checkSectionsForGridTable(subSections);
462
+ }
463
+ } catch (err) {
464
+ _iterator.e(err);
465
+ } finally {
466
+ _iterator.f();
467
+ }
468
+ } else {
469
+ subSections = this._getAllSubSections();
470
+ this.checkSectionsForGridTable(subSections);
471
+ }
485
472
  };
486
-
487
473
  _proto._onBeforeBinding = function _onBeforeBinding(oContext, mParameters) {
488
- var _this5 = this;
489
-
474
+ var _this6 = this;
490
475
  // TODO: we should check how this comes together with the transaction helper, same to the change in the afterBinding
491
476
  var aTables = this._findTables(),
492
- oObjectPage = this._getObjectPageLayoutControl(),
493
- oInternalModelContext = this.getView().getBindingContext("internal"),
494
- oInternalModel = this.getView().getModel("internal"),
495
- aBatchGroups = oInternalModelContext.getProperty("batchGroups"),
496
- iViewLevel = this.getView().getViewData().viewLevel;
497
-
477
+ oObjectPage = this._getObjectPageLayoutControl(),
478
+ oInternalModelContext = this.getView().getBindingContext("internal"),
479
+ oInternalModel = this.getView().getModel("internal"),
480
+ aBatchGroups = oInternalModelContext.getProperty("batchGroups"),
481
+ iViewLevel = this.getView().getViewData().viewLevel;
498
482
  var oFastCreationRow;
499
483
  aBatchGroups.push("$auto");
500
-
501
484
  if (mParameters.bDraftNavigation !== true) {
502
485
  this._closeSideContent();
503
486
  }
504
-
505
487
  var opContext = oObjectPage.getBindingContext();
506
-
507
488
  if (opContext && opContext.hasPendingChanges() && !aBatchGroups.some(opContext.getModel().hasPendingChanges.bind(opContext.getModel()))) {
508
489
  /* In case there are pending changes for the creation row and no others we need to reset the changes
509
490
  TODO: this is just a quick solution, this needs to be reworked
510
491
  */
511
- opContext.getBinding().resetChanges();
512
- } // For now we have to set the binding context to null for every fast creation row
513
- // TODO: Get rid of this coding or move it to another layer - to be discussed with MDC and model
514
492
 
493
+ opContext.getBinding().resetChanges();
494
+ }
515
495
 
496
+ // For now we have to set the binding context to null for every fast creation row
497
+ // TODO: Get rid of this coding or move it to another layer - to be discussed with MDC and model
516
498
  for (var i = 0; i < aTables.length; i++) {
517
499
  oFastCreationRow = aTables[i].getCreationRow();
518
-
519
500
  if (oFastCreationRow) {
520
501
  oFastCreationRow.setBindingContext(null);
521
502
  }
522
- } // Scroll to present Section so that bindings are enabled during navigation through paginator buttons, as there is no view rerendering/rebind
523
-
503
+ }
524
504
 
505
+ // Scroll to present Section so that bindings are enabled during navigation through paginator buttons, as there is no view rerendering/rebind
525
506
  var fnScrollToPresentSection = function () {
526
507
  if (!oObjectPage.isFirstRendering() && !mParameters.bPersistOPScroll) {
527
508
  oObjectPage.setSelectedSection(null);
528
509
  }
529
510
  };
511
+ oObjectPage.attachEventOnce("modelContextChange", fnScrollToPresentSection);
530
512
 
531
- oObjectPage.attachEventOnce("modelContextChange", fnScrollToPresentSection); // if the structure of the ObjectPageLayout is changed then scroll to present Section
513
+ // if the structure of the ObjectPageLayout is changed then scroll to present Section
532
514
  // FIXME Is this really working as intended ? Initially this was onBeforeRendering, but never triggered onBeforeRendering because it was registered after it
533
-
534
515
  var oDelegateOnBefore = {
535
516
  onAfterRendering: fnScrollToPresentSection
536
517
  };
537
518
  oObjectPage.addEventDelegate(oDelegateOnBefore, this);
538
519
  this.pageReady.attachEventOnce("pageReady", function () {
539
520
  oObjectPage.removeEventDelegate(oDelegateOnBefore);
540
- }); //Set the Binding for Paginators using ListBinding ID
521
+ });
541
522
 
523
+ //Set the Binding for Paginators using ListBinding ID
542
524
  if (iViewLevel > 1) {
543
525
  var oBinding = mParameters && mParameters.listBinding;
544
526
  var oPaginatorCurrentContext = oInternalModel.getProperty("/paginatorCurrentContext");
545
-
546
527
  if (oPaginatorCurrentContext) {
547
528
  var oBindingToUse = oPaginatorCurrentContext.getBinding();
548
529
  this.paginator.initialize(oBindingToUse, oPaginatorCurrentContext);
@@ -554,20 +535,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
554
535
  // if the binding type is not ODataListBinding because of a deeplink navigation or a refresh of the page
555
536
  // we need to create it
556
537
  var sBindingPath = oBinding.getPath();
557
-
558
538
  if (/\([^\)]*\)$/.test(sBindingPath)) {
559
539
  // The current binding path ends with (xxx), so we create the listBinding by removing (xxx)
560
540
  var sListBindingPath = sBindingPath.replace(/\([^\)]*\)$/, "");
561
541
  oBinding = new ODataListBinding(oBinding.oModel, sListBindingPath);
562
-
563
542
  var _setListBindingAsync = function () {
564
543
  if (oBinding.getContexts().length > 0) {
565
- _this5.paginator.initialize(oBinding, oContext);
566
-
544
+ _this6.paginator.initialize(oBinding, oContext);
567
545
  oBinding.detachEvent("change", _setListBindingAsync);
568
546
  }
569
547
  };
570
-
571
548
  oBinding.getContexts(0);
572
549
  oBinding.attachEvent("change", _setListBindingAsync);
573
550
  } else {
@@ -577,23 +554,19 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
577
554
  }
578
555
  }
579
556
  }
580
-
581
557
  if (!this.getView().getViewData().useNewLazyLoading && oObjectPage.getEnableLazyLoading()) {
582
558
  var aSections = oObjectPage.getSections();
583
559
  var bUseIconTabBar = oObjectPage.getUseIconTabBar();
584
560
  var iSkip = 2;
585
561
  var bIsInEditMode = oObjectPage.getModel("ui").getProperty("/isEditable");
586
562
  var bEditableHeader = this.getView().getViewData().editableHeaderContent;
587
-
588
563
  for (var iSection = 0; iSection < aSections.length; iSection++) {
589
564
  var oSection = aSections[iSection];
590
565
  var aSubSections = oSection.getSubSections();
591
-
592
566
  for (var iSubSection = 0; iSubSection < aSubSections.length; iSubSection++, iSkip--) {
593
567
  // In IconTabBar mode keep the second section bound if there is an editable header and we are switching to display mode
594
568
  if (iSkip < 1 || bUseIconTabBar && (iSection > 1 || iSection === 1 && !bEditableHeader && !bIsInEditMode)) {
595
569
  var oSubSection = aSubSections[iSubSection];
596
-
597
570
  if (oSubSection.data().isVisibilityDynamic !== "true") {
598
571
  oSubSection.setBindingContext(null);
599
572
  }
@@ -601,27 +574,23 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
601
574
  }
602
575
  }
603
576
  }
604
-
605
577
  if (this.placeholder.isPlaceholderEnabled() && mParameters.showPlaceholder) {
606
578
  var oView = this.getView();
607
579
  var oNavContainer = oView.getParent().oContainer.getParent();
608
-
609
580
  if (oNavContainer) {
610
581
  oNavContainer.showPlaceholder({});
611
582
  }
612
583
  }
613
584
  };
614
-
615
585
  _proto._getFirstClickableElement = function _getFirstClickableElement(oObjectPage) {
616
586
  var oFirstClickableElement;
617
587
  var aActions = oObjectPage.getHeaderTitle() && oObjectPage.getHeaderTitle().getActions();
618
-
619
588
  if (aActions && aActions.length) {
620
589
  oFirstClickableElement = aActions.find(function (oAction) {
621
590
  // Due to the left alignment of the Draft switch and the collaborative draft avatar controls
622
591
  // there is a ToolbarSpacer in the actions aggregation which we need to exclude here!
623
592
  // Due to the ACC report, we also need not to check for the InvisibleText elements
624
- if (oAction.isA("sap.fe.macros.ShareAPI")) {
593
+ if (oAction.isA("sap.fe.macros.share.ShareAPI")) {
625
594
  // since ShareAPI does not have a disable property
626
595
  // hence there is no need to check if it is disbaled or not
627
596
  return oAction.getVisible();
@@ -630,34 +599,29 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
630
599
  }
631
600
  });
632
601
  }
633
-
634
602
  return oFirstClickableElement;
635
603
  };
636
-
637
604
  _proto._getFirstEmptyMandatoryFieldFromSubSection = function _getFirstEmptyMandatoryFieldFromSubSection(aSubSections) {
638
605
  if (aSubSections) {
639
606
  for (var subSection = 0; subSection < aSubSections.length; subSection++) {
640
607
  var aBlocks = aSubSections[subSection].getBlocks();
641
-
642
608
  if (aBlocks) {
643
609
  for (var block = 0; block < aBlocks.length; block++) {
644
610
  var aFormContainers = void 0;
645
-
646
611
  if (aBlocks[block].isA("sap.ui.layout.form.Form")) {
647
612
  aFormContainers = aBlocks[block].getFormContainers();
648
613
  } else if (aBlocks[block].getContent && aBlocks[block].getContent() && aBlocks[block].getContent().isA("sap.ui.layout.form.Form")) {
649
614
  aFormContainers = aBlocks[block].getContent().getFormContainers();
650
615
  }
651
-
652
616
  if (aFormContainers) {
653
617
  for (var formContainer = 0; formContainer < aFormContainers.length; formContainer++) {
654
618
  var aFormElements = aFormContainers[formContainer].getFormElements();
655
-
656
619
  if (aFormElements) {
657
620
  for (var formElement = 0; formElement < aFormElements.length; formElement++) {
658
- var aFields = aFormElements[formElement].getFields(); // The first field is not necessarily an InputBase (e.g. could be a Text)
659
- // So we need to check whether it has a getRequired method
621
+ var aFields = aFormElements[formElement].getFields();
660
622
 
623
+ // The first field is not necessarily an InputBase (e.g. could be a Text)
624
+ // So we need to check whether it has a getRequired method
661
625
  try {
662
626
  if (aFields[0].getRequired && aFields[0].getRequired() && !aFields[0].getValue()) {
663
627
  return aFields[0];
@@ -673,23 +637,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
673
637
  }
674
638
  }
675
639
  }
676
-
677
640
  return undefined;
678
641
  };
679
-
680
642
  _proto._updateFocusInEditMode = function _updateFocusInEditMode(aSubSections) {
681
643
  var oObjectPage = this._getObjectPageLayoutControl();
682
-
683
644
  var oMandatoryField = this._getFirstEmptyMandatoryFieldFromSubSection(aSubSections);
684
-
685
645
  var oFieldToFocus;
686
-
687
646
  if (oMandatoryField) {
688
647
  oFieldToFocus = oMandatoryField.content.getContentEdit()[0];
689
648
  } else {
690
649
  oFieldToFocus = oObjectPage._getFirstEditableInput() || this._getFirstClickableElement(oObjectPage);
691
650
  }
692
-
693
651
  if (oFieldToFocus) {
694
652
  setTimeout(function () {
695
653
  // We set the focus in a timeeout, otherwise the focus sometimes goes to the TabBar
@@ -697,15 +655,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
697
655
  }, 0);
698
656
  }
699
657
  };
700
-
701
658
  _proto._handleSubSectionEnteredViewPort = function _handleSubSectionEnteredViewPort(oEvent) {
702
659
  var oSubSection = oEvent.getParameter("subSection");
703
660
  oSubSection.setBindingContext(undefined);
704
661
  };
705
-
706
662
  _proto._onBackNavigationInDraft = function _onBackNavigationInDraft(oContext) {
707
663
  this.messageHandler.removeTransitionMessages();
708
-
709
664
  if (this.getAppComponent().getRouterProxy().checkIfBackHasSameContext()) {
710
665
  // Back nav will keep the same context --> no need to display the dialog
711
666
  history.back();
@@ -714,15 +669,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
714
669
  history.back();
715
670
  }, Function.prototype, oContext, this, false, draft.NavigationType.BackNavigation);
716
671
  }
717
- } // eslint-disable-next-line @typescript-eslint/no-unused-vars
718
- ;
672
+ }
719
673
 
674
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
675
+ ;
720
676
  _proto._onAfterBinding = function _onAfterBinding(oBindingContext, mParameters) {
721
- var _this6 = this;
722
-
677
+ var _this7 = this;
723
678
  // TODO: this should be moved into an init event of the MDC tables (not yet existing) and should be part
724
679
  // of any controller extension
725
-
726
680
  /**
727
681
  * @param oTable
728
682
  * @param oListBinding
@@ -731,7 +685,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
731
685
  try {
732
686
  var oFastCreationRow = oTable.getCreationRow();
733
687
  var oFastCreationListBinding, oFastCreationContext;
734
-
735
688
  var _temp5 = function () {
736
689
  if (oFastCreationRow) {
737
690
  var _temp6 = _catch(function () {
@@ -741,61 +694,54 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
741
694
  oFastCreationListBinding = oModel.bindList(oListBinding.getPath(), oListBinding.getContext(), [], [], {
742
695
  $$updateGroupId: "doNotSubmit",
743
696
  $$groupId: "doNotSubmit"
744
- }); // Workaround suggested by OData model v4 colleagues
745
-
697
+ });
698
+ // Workaround suggested by OData model v4 colleagues
746
699
  oFastCreationListBinding.refreshInternal = function () {
747
700
  /* do nothing */
748
701
  };
749
-
750
702
  oFastCreationContext = oFastCreationListBinding.create();
751
- oFastCreationRow.setBindingContext(oFastCreationContext); // this is needed to avoid console error
703
+ oFastCreationRow.setBindingContext(oFastCreationContext);
752
704
 
705
+ // this is needed to avoid console error
753
706
  var _temp7 = _catch(function () {
754
707
  return Promise.resolve(oFastCreationContext.created()).then(function () {});
755
708
  }, function () {
756
709
  Log.trace("transient fast creation context deleted");
757
710
  });
758
-
759
711
  if (_temp7 && _temp7.then) return _temp7.then(function () {});
760
712
  }
761
713
  }();
762
-
763
714
  if (_temp2 && _temp2.then) return _temp2.then(function () {});
764
715
  });
765
716
  }, function (oError) {
766
717
  Log.error("Error while computing the final UI state", oError);
767
718
  });
768
-
769
719
  if (_temp6 && _temp6.then) return _temp6.then(function () {});
770
720
  }
771
721
  }();
772
-
773
722
  return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(function () {}) : void 0);
774
723
  } catch (e) {
775
724
  return Promise.reject(e);
776
725
  }
777
726
  }; // this should not be needed at the all
778
-
779
727
  /**
780
728
  * @param oTable
781
729
  */
782
-
783
-
784
730
  var oObjectPage = this._getObjectPageLayoutControl();
785
-
786
731
  var aTables = this._findTables();
732
+ this._sideEffects.clearPropertiesStatus();
787
733
 
788
- this._sideEffects.clearPropertiesStatus(); // TODO: this is only a temp solution as long as the model fix the cache issue and we use this additional
734
+ // TODO: this is only a temp solution as long as the model fix the cache issue and we use this additional
789
735
  // binding with ownRequest
790
-
791
-
792
736
  oBindingContext = oObjectPage.getBindingContext();
793
737
  var aIBNActions = [];
794
738
  oObjectPage.getSections().forEach(function (oSection) {
795
739
  oSection.getSubSections().forEach(function (oSubSection) {
796
740
  aIBNActions = CommonUtils.getIBNActions(oSubSection, aIBNActions);
797
741
  });
798
- }); // Assign internal binding contexts to oFormContainer:
742
+ });
743
+
744
+ // Assign internal binding contexts to oFormContainer:
799
745
  // 1. It is not possible to assign the internal binding context to the XML fragment
800
746
  // (FormContainer.fragment.xml) yet - it is used already for the data-structure.
801
747
  // 2. Another problem is, that FormContainers assigned to a 'MoreBlock' does not have an
@@ -805,49 +751,45 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
805
751
  var oInternalModelContext = oTable.getBindingContext("internal");
806
752
  oInternalModelContext.setProperty("creationRowFieldValidity", {});
807
753
  oInternalModelContext.setProperty("creationRowCustomValidity", {});
808
- aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions); // temporary workaround for BCP: 2080218004
754
+ aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions);
755
+ // temporary workaround for BCP: 2080218004
809
756
  // Need to fix with BLI: FIORITECHP1-15274
810
757
  // only for edit mode, we clear the table cache
811
758
  // Workaround starts here!!
812
-
813
759
  var oTableRowBinding = oTable.getRowBinding();
814
-
815
760
  if (oTableRowBinding) {
816
761
  if (ModelHelper.isStickySessionSupported(oTableRowBinding.getModel().getMetaModel())) {
817
762
  // apply for both edit and display mode in sticky
818
763
  oTableRowBinding.removeCachesAndMessages("");
819
764
  }
820
- } // Workaround ends here!!
765
+ }
766
+ // Workaround ends here!!
767
+
821
768
  // Update 'enabled' property of DataFieldForAction buttons on table toolbar
822
769
  // The same is also performed on Table selectionChange event
823
-
824
-
825
770
  var oActionOperationAvailableMap = JSON.parse(CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))),
826
- aSelectedContexts = oTable.getSelectedContexts();
827
- ActionRuntime.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts, "table"); // Clear the selection in the table, need to be fixed and review with BLI: FIORITECHP1-24318
828
-
771
+ aSelectedContexts = oTable.getSelectedContexts();
772
+ ActionRuntime.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts, "table");
773
+ // Clear the selection in the table, need to be fixed and review with BLI: FIORITECHP1-24318
829
774
  oTable.clearSelection();
830
775
  });
831
- CommonUtils.getSemanticTargetsFromPageModel(this, "_pageModel"); //Retrieve Object Page header actions from Object Page title control
832
-
776
+ CommonUtils.getSemanticTargetsFromPageModel(this, "_pageModel");
777
+ //Retrieve Object Page header actions from Object Page title control
833
778
  var oObjectPageTitle = oObjectPage.getHeaderTitle();
834
779
  var aIBNHeaderActions = [];
835
780
  aIBNHeaderActions = CommonUtils.getIBNActions(oObjectPageTitle, aIBNHeaderActions);
836
781
  aIBNActions = aIBNActions.concat(aIBNHeaderActions);
837
782
  CommonUtils.updateDataFieldForIBNButtonsVisibility(aIBNActions, this.getView());
838
783
  var oModel, oFinalUIState;
839
-
840
784
  var handleTableModifications = function (oTable) {
841
- var oBinding = _this6._getTableBinding(oTable),
842
- fnHandleTablePatchEvents = function () {
843
- enableFastCreationRow(oTable, oBinding);
844
- };
845
-
785
+ var oBinding = _this7._getTableBinding(oTable),
786
+ fnHandleTablePatchEvents = function () {
787
+ enableFastCreationRow(oTable, oBinding);
788
+ };
846
789
  if (!oBinding) {
847
790
  Log.error("Expected binding missing for table: ".concat(oTable.getId()));
848
791
  return;
849
792
  }
850
-
851
793
  if (oBinding.oContext) {
852
794
  fnHandleTablePatchEvents();
853
795
  } else {
@@ -857,104 +799,90 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
857
799
  oBinding.detachChange(fnHandleChange);
858
800
  }
859
801
  };
860
-
861
802
  oBinding.attachChange(fnHandleChange);
862
803
  }
863
804
  };
864
-
865
805
  if (oBindingContext) {
866
- oModel = oBindingContext.getModel(); // Compute Edit Mode
806
+ oModel = oBindingContext.getModel();
867
807
 
808
+ // Compute Edit Mode
868
809
  oFinalUIState = this._editFlow.computeEditMode(oBindingContext);
869
-
870
810
  if (ModelHelper.isCollaborationDraftSupported(oModel.getMetaModel())) {
871
811
  oFinalUIState.then(function () {
872
- if (_this6.getView().getModel("ui").getProperty("/isEditable")) {
873
- connect(_this6.getView());
874
- } else if (isConnected(_this6.getView())) {
875
- disconnect(_this6.getView()); // Cleanup collaboration connection in case we switch to another element (e.g. in FCL)
812
+ if (_this7.getView().getModel("ui").getProperty("/isEditable")) {
813
+ connect(_this7.getView());
814
+ } else if (isConnected(_this7.getView())) {
815
+ disconnect(_this7.getView()); // Cleanup collaboration connection in case we switch to another element (e.g. in FCL)
876
816
  }
877
817
  }).catch(function (oError) {
878
818
  Log.error("Error while waiting for the final UI State", oError);
879
819
  });
880
- } // update related apps once Data is received in case of binding cache is not available
881
- // TODO: this is only a temp solution since we need to call _updateRelatedApps method only after data for Object Page is received (if there is no binding)
882
-
820
+ }
883
821
 
822
+ // update related apps once Data is received in case of binding cache is not available
823
+ // TODO: this is only a temp solution since we need to call _updateRelatedApps method only after data for Object Page is received (if there is no binding)
884
824
  if (oBindingContext.getBinding().oCache) {
885
825
  this._updateRelatedApps();
886
826
  } else {
887
827
  var fnUpdateRelatedApps = function () {
888
- _this6._updateRelatedApps();
889
-
828
+ _this7._updateRelatedApps();
890
829
  oBindingContext.getBinding().detachDataReceived(fnUpdateRelatedApps);
891
830
  };
892
-
893
831
  oBindingContext.getBinding().attachDataReceived(fnUpdateRelatedApps);
894
- } //Attach the patch sent and patch completed event to the object page binding so that we can react
895
-
832
+ }
896
833
 
897
- var oBinding = oBindingContext.getBinding && oBindingContext.getBinding() || oBindingContext; // Attach the event handler only once to the same binding
834
+ //Attach the patch sent and patch completed event to the object page binding so that we can react
835
+ var oBinding = oBindingContext.getBinding && oBindingContext.getBinding() || oBindingContext;
898
836
 
837
+ // Attach the event handler only once to the same binding
899
838
  if (this.currentBinding !== oBinding) {
900
839
  oBinding.attachEvent("patchSent", this.editFlow.handlePatchSent, this);
901
840
  this.currentBinding = oBinding;
902
841
  }
903
-
904
842
  aTables.forEach(function (oTable) {
905
843
  // access binding only after table is bound
906
844
  TableUtils.whenBound(oTable).then(handleTableModifications).catch(function (oError) {
907
845
  Log.error("Error while waiting for the table to be bound", oError);
908
846
  });
909
847
  });
910
-
911
848
  if (!this.getView().getViewData().useNewLazyLoading) {
912
849
  // should be called only after binding is ready hence calling it in onAfterBinding
913
850
  oObjectPage._triggerVisibleSubSectionsEvents();
914
851
  }
915
852
  }
916
853
  };
917
-
918
854
  _proto.onPageReady = function onPageReady(mParameters) {
919
- var _this7 = this;
920
-
855
+ var _this8 = this;
921
856
  var setFocus = function () {
922
857
  // Set the focus to the first action button, or to the first editable input if in editable mode
923
- var oObjectPage = _this7._getObjectPageLayoutControl();
924
-
858
+ var oObjectPage = _this8._getObjectPageLayoutControl();
925
859
  var isInDisplayMode = !oObjectPage.getModel("ui").getProperty("/isEditable");
926
-
927
860
  if (isInDisplayMode) {
928
- var oFirstClickableElement = _this7._getFirstClickableElement(oObjectPage);
929
-
861
+ var oFirstClickableElement = _this8._getFirstClickableElement(oObjectPage);
930
862
  if (oFirstClickableElement) {
931
863
  oFirstClickableElement.focus();
932
864
  }
933
865
  } else {
934
866
  var oSelectedSection = Core.byId(oObjectPage.getSelectedSection());
935
-
936
867
  if (oSelectedSection) {
937
- _this7._updateFocusInEditMode(oSelectedSection.getSubSections());
868
+ _this8._updateFocusInEditMode(oSelectedSection.getSubSections());
938
869
  }
939
870
  }
940
- }; // Apply app state only after the page is ready with the first section selected
941
-
942
-
871
+ };
872
+ // Apply app state only after the page is ready with the first section selected
943
873
  var oView = this.getView();
944
874
  var oInternalModelContext = oView.getBindingContext("internal");
945
- var oBindingContext = oView.getBindingContext(); //Show popup while navigating back from object page in case of draft
946
-
875
+ var oBindingContext = oView.getBindingContext();
876
+ //Show popup while navigating back from object page in case of draft
947
877
  if (oBindingContext) {
948
878
  var bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
949
-
950
879
  if (!bIsStickyMode) {
951
880
  var oAppComponent = CommonUtils.getAppComponent(oView);
952
881
  oAppComponent.getShellServices().setBackNavigation(function () {
953
- return _this7._onBackNavigationInDraft(oBindingContext);
882
+ return _this8._onBackNavigationInDraft(oBindingContext);
954
883
  });
955
884
  }
956
885
  }
957
-
958
886
  this.getAppComponent().getAppStateHandler().applyAppState().then(function () {
959
887
  if (mParameters.forceFocus) {
960
888
  setFocus();
@@ -963,38 +891,30 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
963
891
  Log.error("Error while setting the focus", Error);
964
892
  });
965
893
  oInternalModelContext.setProperty("errorNavigationSectionFlag", false);
966
-
967
894
  this._checkDataPointTitleForExternalNavigation();
968
895
  }
896
+
969
897
  /**
970
898
  * Get the status of edit mode for sticky session.
971
899
  *
972
900
  * @returns The status of edit mode for sticky session
973
- */
974
- ;
975
-
901
+ */;
976
902
  _proto.getStickyEditMode = function getStickyEditMode() {
977
903
  var oBindingContext = this.getView().getBindingContext && this.getView().getBindingContext();
978
904
  var bIsStickyEditMode = false;
979
-
980
905
  if (oBindingContext) {
981
906
  var bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
982
-
983
907
  if (bIsStickyMode) {
984
908
  bIsStickyEditMode = this.getView().getModel("ui").getProperty("/isEditable");
985
909
  }
986
910
  }
987
-
988
911
  return bIsStickyEditMode;
989
912
  };
990
-
991
913
  _proto._getObjectPageLayoutControl = function _getObjectPageLayoutControl() {
992
914
  return this.byId("fe::ObjectPage");
993
915
  };
994
-
995
916
  _proto._getPageTitleInformation = function _getPageTitleInformation() {
996
917
  var oObjectPage = this._getObjectPageLayoutControl();
997
-
998
918
  var oObjectPageSubtitle = oObjectPage.getCustomData().find(function (oCustomData) {
999
919
  return oCustomData.getKey() === "ObjectPageSubtitle";
1000
920
  });
@@ -1005,34 +925,27 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1005
925
  icon: ""
1006
926
  };
1007
927
  };
1008
-
1009
928
  _proto._executeHeaderShortcut = function _executeHeaderShortcut(sId) {
1010
929
  var sButtonId = "".concat(this.getView().getId(), "--").concat(sId),
1011
- oButton = this._getObjectPageLayoutControl().getHeaderTitle().getActions().find(function (oElement) {
1012
- return oElement.getId() === sButtonId;
1013
- });
1014
-
930
+ oButton = this._getObjectPageLayoutControl().getHeaderTitle().getActions().find(function (oElement) {
931
+ return oElement.getId() === sButtonId;
932
+ });
1015
933
  CommonUtils.fireButtonPress(oButton);
1016
934
  };
1017
-
1018
935
  _proto._executeFooterShortcut = function _executeFooterShortcut(sId) {
1019
936
  var sButtonId = "".concat(this.getView().getId(), "--").concat(sId),
1020
- oButton = this._getObjectPageLayoutControl().getFooter().getContent().find(function (oElement) {
1021
- return oElement.getMetadata().getName() === "sap.m.Button" && oElement.getId() === sButtonId;
1022
- });
1023
-
937
+ oButton = this._getObjectPageLayoutControl().getFooter().getContent().find(function (oElement) {
938
+ return oElement.getMetadata().getName() === "sap.m.Button" && oElement.getId() === sButtonId;
939
+ });
1024
940
  CommonUtils.fireButtonPress(oButton);
1025
941
  };
1026
-
1027
942
  _proto._executeTabShortCut = function _executeTabShortCut(oExecution) {
1028
943
  var oObjectPage = this._getObjectPageLayoutControl(),
1029
- aSections = oObjectPage.getSections(),
1030
- iSectionIndexMax = aSections.length - 1,
1031
- sCommand = oExecution.oSource.getCommand();
1032
-
944
+ aSections = oObjectPage.getSections(),
945
+ iSectionIndexMax = aSections.length - 1,
946
+ sCommand = oExecution.oSource.getCommand();
1033
947
  var newSection,
1034
- iSelectedSectionIndex = oObjectPage.indexOfSection(this.byId(oObjectPage.getSelectedSection()));
1035
-
948
+ iSelectedSectionIndex = oObjectPage.indexOfSection(this.byId(oObjectPage.getSelectedSection()));
1036
949
  if (iSelectedSectionIndex !== -1 && iSectionIndexMax > 0) {
1037
950
  if (sCommand === "NextTab") {
1038
951
  if (iSelectedSectionIndex <= iSectionIndexMax - 1) {
@@ -1042,14 +955,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1042
955
  // PreviousTab
1043
956
  newSection = aSections[--iSelectedSectionIndex];
1044
957
  }
1045
-
1046
958
  if (newSection) {
1047
959
  oObjectPage.setSelectedSection(newSection);
1048
960
  newSection.focus();
1049
961
  }
1050
962
  }
1051
963
  };
1052
-
1053
964
  _proto._getFooterVisibility = function _getFooterVisibility() {
1054
965
  var oInternalModelContext = this.getView().getBindingContext("internal");
1055
966
  var sViewId = this.getView().getId();
@@ -1060,32 +971,26 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1060
971
  }
1061
972
  });
1062
973
  };
1063
-
1064
974
  _proto._showMessagePopover = function _showMessagePopover(err, oRet) {
1065
975
  if (err) {
1066
976
  Log.error(err);
1067
977
  }
1068
-
1069
978
  var rootViewController = this.getAppComponent().getRootViewController();
1070
979
  var currentPageView = rootViewController.isFclEnabled() ? rootViewController.getRightmostView() : this.getAppComponent().getRootContainer().getCurrentPage();
1071
-
1072
980
  if (!currentPageView.isA("sap.m.MessagePage")) {
1073
981
  var oMessageButton = this.messageButton,
1074
- oMessagePopover = oMessageButton.oMessagePopover,
1075
- oItemBinding = oMessagePopover.getBinding("items");
1076
-
982
+ oMessagePopover = oMessageButton.oMessagePopover,
983
+ oItemBinding = oMessagePopover.getBinding("items");
1077
984
  if (oItemBinding.getLength() > 0 && !oMessagePopover.isOpen()) {
1078
- oMessageButton.setVisible(true); // workaround to ensure that oMessageButton is rendered when openBy is called
1079
-
985
+ oMessageButton.setVisible(true);
986
+ // workaround to ensure that oMessageButton is rendered when openBy is called
1080
987
  setTimeout(function () {
1081
988
  oMessagePopover.openBy(oMessageButton);
1082
989
  }, 0);
1083
990
  }
1084
991
  }
1085
-
1086
992
  return oRet;
1087
993
  };
1088
-
1089
994
  _proto._editDocument = function _editDocument(oContext) {
1090
995
  var oModel = this.getView().getModel("ui");
1091
996
  BusyLocker.lock(oModel);
@@ -1102,19 +1007,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1102
1007
  * @function
1103
1008
  * @name getDraftRootPath
1104
1009
  * @returns Returns a Promise
1105
- */
1106
- ;
1107
-
1010
+ */;
1108
1011
  _proto.getDraftRootContext = function getDraftRootContext() {
1109
1012
  try {
1110
1013
  var _exit2 = false;
1111
-
1112
- var _this9 = this;
1113
-
1114
- var view = _this9.getView();
1115
-
1014
+ var _this10 = this;
1015
+ var view = _this10.getView();
1116
1016
  var context = view.getBindingContext();
1117
-
1118
1017
  var _temp11 = function () {
1119
1018
  if (context) {
1120
1019
  function _temp12(_result) {
@@ -1122,34 +1021,26 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1122
1021
  _exit2 = true;
1123
1022
  return undefined;
1124
1023
  }
1125
-
1126
1024
  var draftRootContextPath = ModelHelper.getDraftRootPath(context);
1127
1025
  var simpleDraftRootContext;
1128
-
1129
1026
  var _temp13 = function () {
1130
1027
  if (draftRootContextPath) {
1131
1028
  var _getInstancedViews$fi, _simpleDraftRootConte, _mDataModel$targetEnt;
1132
-
1133
1029
  // Check if a view matches with the draft root path
1134
- var existingBindingContextOnPage = (_getInstancedViews$fi = _this9.getAppComponent().getRootViewController().getInstancedViews().find(function (pageView) {
1030
+ var existingBindingContextOnPage = (_getInstancedViews$fi = _this10.getAppComponent().getRootViewController().getInstancedViews().find(function (pageView) {
1135
1031
  var _pageView$getBindingC;
1136
-
1137
1032
  return ((_pageView$getBindingC = pageView.getBindingContext()) === null || _pageView$getBindingC === void 0 ? void 0 : _pageView$getBindingC.getPath()) === draftRootContextPath;
1138
1033
  })) === null || _getInstancedViews$fi === void 0 ? void 0 : _getInstancedViews$fi.getBindingContext();
1139
-
1140
1034
  if (existingBindingContextOnPage) {
1141
1035
  _exit2 = true;
1142
1036
  return existingBindingContextOnPage;
1143
1037
  }
1144
-
1145
1038
  var internalModel = view.getModel("internal");
1146
1039
  simpleDraftRootContext = internalModel.getProperty("/simpleDraftRootContext");
1147
-
1148
1040
  if (((_simpleDraftRootConte = simpleDraftRootContext) === null || _simpleDraftRootConte === void 0 ? void 0 : _simpleDraftRootConte.getPath()) === draftRootContextPath) {
1149
1041
  _exit2 = true;
1150
1042
  return simpleDraftRootContext;
1151
1043
  }
1152
-
1153
1044
  var model = context.getModel();
1154
1045
  var metaModel = model.getMetaModel();
1155
1046
  var sEntityPath = metaModel.getMetaPath(draftRootContextPath);
@@ -1163,11 +1054,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1163
1054
  });
1164
1055
  }
1165
1056
  }();
1166
-
1167
1057
  return _temp13 && _temp13.then ? _temp13.then(_temp12) : _temp12(_temp13);
1168
1058
  }
1169
1059
  }();
1170
-
1171
1060
  return Promise.resolve(_temp11 && _temp11.then ? _temp11.then(function (_result2) {
1172
1061
  return _exit2 ? _result2 : undefined;
1173
1062
  }) : _exit2 ? _temp11 : undefined);
@@ -1175,39 +1064,32 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1175
1064
  return Promise.reject(e);
1176
1065
  }
1177
1066
  };
1178
-
1179
1067
  _proto._validateDocument = function _validateDocument() {
1180
1068
  try {
1181
1069
  var _exit4 = false;
1182
-
1183
- var _this11 = this;
1184
-
1070
+ var _this12 = this;
1185
1071
  var control = Core.byId(Core.getCurrentFocusedControlId());
1186
1072
  var context = control === null || control === void 0 ? void 0 : control.getBindingContext();
1187
-
1188
1073
  var _temp15 = function () {
1189
1074
  if (context && !context.isTransient()) {
1190
1075
  // Wait for the pending changes before starting this validation
1191
- return Promise.resolve(_this11._editFlow.syncTask()).then(function () {
1192
- var appComponent = _this11.getAppComponent();
1193
-
1076
+ return Promise.resolve(_this12._editFlow.syncTask()).then(function () {
1077
+ var appComponent = _this12.getAppComponent();
1194
1078
  var sideEffectsService = appComponent.getSideEffectsService();
1195
1079
  var entityType = sideEffectsService.getEntityTypeFromContext(context);
1196
- var globalSideEffects = entityType ? sideEffectsService.getGlobalODataEntitySideEffects(entityType) : []; // If there is at least one global SideEffects for the related entity, execute it/them
1197
-
1080
+ var globalSideEffects = entityType ? sideEffectsService.getGlobalODataEntitySideEffects(entityType) : [];
1081
+ // If there is at least one global SideEffects for the related entity, execute it/them
1198
1082
  return function () {
1199
1083
  if (globalSideEffects.length) {
1200
1084
  var _Promise$all2 = Promise.all(globalSideEffects.map(function (sideEffects) {
1201
- return _this11._sideEffects.requestSideEffects(sideEffects, context);
1085
+ return _this12._sideEffects.requestSideEffects(sideEffects, context);
1202
1086
  }));
1203
-
1204
1087
  _exit4 = true;
1205
1088
  return _Promise$all2;
1206
1089
  } else {
1207
- return Promise.resolve(_this11.getDraftRootContext()).then(function (draftRootContext) {
1090
+ return Promise.resolve(_this12.getDraftRootContext()).then(function (draftRootContext) {
1208
1091
  if (draftRootContext) {
1209
1092
  var _draft$executeDraftVa2 = draft.executeDraftValidation(draftRootContext, appComponent);
1210
-
1211
1093
  _exit4 = true;
1212
1094
  return _draft$executeDraftVa2;
1213
1095
  }
@@ -1217,7 +1099,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1217
1099
  });
1218
1100
  }
1219
1101
  }();
1220
-
1221
1102
  return Promise.resolve(_temp15 && _temp15.then ? _temp15.then(function (_result4) {
1222
1103
  return _exit4 ? _result4 : undefined;
1223
1104
  }) : _exit4 ? _temp15 : undefined);
@@ -1225,59 +1106,51 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1225
1106
  return Promise.reject(e);
1226
1107
  }
1227
1108
  };
1228
-
1229
1109
  _proto._saveDocument = function _saveDocument(oContext) {
1230
1110
  try {
1231
- var _this13 = this;
1232
-
1233
- var oModel = _this13.getView().getModel("ui"),
1234
- aWaitCreateDocuments = []; // indicates if we are creating a new row in the OP
1235
-
1236
-
1111
+ var _this14 = this;
1112
+ var oModel = _this14.getView().getModel("ui"),
1113
+ aWaitCreateDocuments = [];
1114
+ // indicates if we are creating a new row in the OP
1237
1115
  var bExecuteSideEffectsOnError = false;
1238
1116
  BusyLocker.lock(oModel);
1239
-
1240
- _this13._findTables().forEach(function (oTable) {
1241
- var oBinding = _this13._getTableBinding(oTable);
1242
-
1117
+ _this14._findTables().forEach(function (oTable) {
1118
+ var oBinding = _this14._getTableBinding(oTable);
1243
1119
  var mParameters = {
1244
1120
  creationMode: oTable.data("creationMode"),
1245
1121
  creationRow: oTable.getCreationRow(),
1246
1122
  createAtEnd: oTable.data("createAtEnd") === "true"
1247
1123
  };
1248
1124
  var bCreateDocument = mParameters.creationRow && mParameters.creationRow.getBindingContext() && Object.keys(mParameters.creationRow.getBindingContext().getObject()).length > 1;
1249
-
1250
1125
  if (bCreateDocument) {
1251
1126
  // the bSkipSideEffects is a parameter created when we click the save key. If we press this key
1252
1127
  // we don't execute the handleSideEffects funciton to avoid batch redundancy
1253
1128
  mParameters.bSkipSideEffects = true;
1254
1129
  bExecuteSideEffectsOnError = true;
1255
- aWaitCreateDocuments.push(_this13.editFlow.createDocument(oBinding, mParameters).then(function () {
1130
+ aWaitCreateDocuments.push(_this14.editFlow.createDocument(oBinding, mParameters).then(function () {
1256
1131
  return oBinding;
1257
1132
  }));
1258
1133
  }
1259
1134
  });
1260
-
1261
1135
  return Promise.resolve(_finallyRethrows(function () {
1262
1136
  return Promise.resolve(Promise.all(aWaitCreateDocuments)).then(function (aBindings) {
1263
1137
  var mParameters = {
1264
1138
  bExecuteSideEffectsOnError: bExecuteSideEffectsOnError,
1265
1139
  bindings: aBindings
1266
- }; // We need to either reject or resolve a promise here and return it since this save
1140
+ };
1141
+ // We need to either reject or resolve a promise here and return it since this save
1267
1142
  // function is not only called when pressing the save button in the footer, but also
1268
1143
  // when the user selects create or save in a dataloss popup.
1269
1144
  // The logic of the dataloss popup needs to detect if the save had errors or not in order
1270
1145
  // to decide if the subsequent action - like a back navigation - has to be executed or not.
1271
-
1272
1146
  return _catch(function () {
1273
- return Promise.resolve(_this13.editFlow.saveDocument(oContext, mParameters)).then(function () {});
1147
+ return Promise.resolve(_this14.editFlow.saveDocument(oContext, mParameters)).then(function () {});
1274
1148
  }, function (error) {
1275
1149
  // If the saveDocument in editFlow returns errors we need
1276
1150
  // to show the message popover here and ensure that the
1277
1151
  // dataloss logic does not perform the follow up function
1278
1152
  // like e.g. a back navigation hence we return a promise and reject it
1279
- _this13._showMessagePopover(error);
1280
-
1153
+ _this14._showMessagePopover(error);
1281
1154
  throw error;
1282
1155
  });
1283
1156
  });
@@ -1285,7 +1158,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1285
1158
  if (BusyLocker.isLocked(oModel)) {
1286
1159
  BusyLocker.unlock(oModel);
1287
1160
  }
1288
-
1289
1161
  if (_wasThrown) throw _result5;
1290
1162
  return _result5;
1291
1163
  }));
@@ -1293,43 +1165,31 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1293
1165
  return Promise.reject(e);
1294
1166
  }
1295
1167
  };
1296
-
1297
1168
  _proto._manageCollaboration = function _manageCollaboration() {
1298
1169
  openManageDialog(this.getView());
1299
1170
  };
1300
-
1301
1171
  _proto._showCollaborationUserDetails = function _showCollaborationUserDetails(event) {
1302
1172
  showUserDetails(event, this.getView());
1303
1173
  };
1304
-
1305
1174
  _proto._cancelDocument = function _cancelDocument(oContext, mParameters) {
1306
1175
  mParameters.cancelButton = this.getView().byId(mParameters.cancelButton); //to get the reference of the cancel button from command execution
1307
-
1308
1176
  return this.editFlow.cancelDocument(oContext, mParameters);
1309
1177
  };
1310
-
1311
1178
  _proto._applyDocument = function _applyDocument(oContext) {
1312
- var _this14 = this;
1313
-
1179
+ var _this15 = this;
1314
1180
  return this.editFlow.applyDocument(oContext).catch(function () {
1315
- return _this14._showMessagePopover();
1181
+ return _this15._showMessagePopover();
1316
1182
  });
1317
1183
  };
1318
-
1319
1184
  _proto._updateRelatedApps = function _updateRelatedApps() {
1320
1185
  var oObjectPage = this._getObjectPageLayoutControl();
1321
-
1322
1186
  if (CommonUtils.resolveStringtoBoolean(oObjectPage.data("showRelatedApps"))) {
1323
1187
  CommonUtils.updateRelatedAppsDetails(oObjectPage);
1324
1188
  }
1325
1189
  };
1326
-
1327
1190
  _proto._findControlInSubSection = function _findControlInSubSection(aParentElement, aSubsection, aControls, bIsChart) {
1328
- var aSubSectionTables = [];
1329
-
1330
1191
  for (var element = 0; element < aParentElement.length; element++) {
1331
1192
  var oElement = aParentElement[element].getContent instanceof Function && aParentElement[element].getContent();
1332
-
1333
1193
  if (bIsChart) {
1334
1194
  if (oElement && oElement.mAggregations && oElement.getAggregation("items")) {
1335
1195
  var aItems = oElement.getAggregation("items");
@@ -1340,102 +1200,68 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1340
1200
  });
1341
1201
  }
1342
1202
  }
1343
-
1344
1203
  if (oElement && oElement.isA && oElement.isA("sap.ui.layout.DynamicSideContent")) {
1345
1204
  oElement = oElement.getMainContent instanceof Function && oElement.getMainContent();
1346
-
1347
1205
  if (oElement && oElement.length > 0) {
1348
1206
  oElement = oElement[0];
1349
1207
  }
1350
1208
  }
1351
-
1352
1209
  if (oElement && oElement.isA && oElement.isA("sap.fe.macros.table.TableAPI")) {
1353
1210
  oElement = oElement.getContent instanceof Function && oElement.getContent();
1354
-
1355
1211
  if (oElement && oElement.length > 0) {
1356
1212
  oElement = oElement[0];
1357
1213
  }
1358
1214
  }
1359
-
1360
1215
  if (oElement && oElement.isA && oElement.isA("sap.ui.mdc.Table")) {
1361
1216
  aControls.push(oElement);
1362
- aSubSectionTables.push({
1363
- "table": oElement,
1364
- "gridTable": oElement.getType().isA("sap.ui.mdc.table.GridTableType")
1365
- });
1366
1217
  }
1367
-
1368
1218
  if (oElement && oElement.isA && oElement.isA("sap.fe.macros.chart.ChartAPI")) {
1369
1219
  oElement = oElement.getContent instanceof Function && oElement.getContent();
1370
-
1371
1220
  if (oElement && oElement.length > 0) {
1372
1221
  oElement = oElement[0];
1373
1222
  }
1374
1223
  }
1375
-
1376
1224
  if (oElement && oElement.isA && oElement.isA("sap.ui.mdc.Chart")) {
1377
1225
  aControls.push(oElement);
1378
1226
  }
1379
1227
  }
1380
-
1381
- if (aSubSectionTables.length === 1 && aParentElement.length === 1 && aSubSectionTables[0].gridTable && !aSubsection.hasStyleClass("sapUxAPObjectPageSubSectionFitContainer")) {
1382
- //In case there is only a single table in a section we fit that to the whole page so that the scrollbar comes only on table and not on page
1383
- aSubsection.addStyleClass("sapUxAPObjectPageSubSectionFitContainer");
1384
- }
1385
1228
  };
1386
-
1387
1229
  _proto._getAllSubSections = function _getAllSubSections() {
1388
1230
  var oObjectPage = this._getObjectPageLayoutControl();
1389
-
1390
1231
  var aSubSections = [];
1391
1232
  oObjectPage.getSections().forEach(function (oSection) {
1392
1233
  aSubSections = aSubSections.concat(oSection.getSubSections());
1393
1234
  });
1394
1235
  return aSubSections;
1395
1236
  };
1396
-
1397
1237
  _proto._getAllBlocks = function _getAllBlocks() {
1398
1238
  var aBlocks = [];
1399
-
1400
1239
  this._getAllSubSections().forEach(function (oSubSection) {
1401
1240
  aBlocks = aBlocks.concat(oSubSection.getBlocks());
1402
1241
  });
1403
-
1404
1242
  return aBlocks;
1405
1243
  };
1406
-
1407
1244
  _proto._findTables = function _findTables() {
1408
1245
  var aSubSections = this._getAllSubSections();
1409
-
1410
1246
  var aTables = [];
1411
-
1412
1247
  for (var subSection = 0; subSection < aSubSections.length; subSection++) {
1413
1248
  this._findControlInSubSection(aSubSections[subSection].getBlocks(), aSubSections[subSection], aTables);
1414
-
1415
1249
  this._findControlInSubSection(aSubSections[subSection].getMoreBlocks(), aSubSections[subSection], aTables);
1416
1250
  }
1417
-
1418
1251
  return aTables;
1419
1252
  };
1420
-
1421
1253
  _proto._findCharts = function _findCharts() {
1422
1254
  var aSubSections = this._getAllSubSections();
1423
-
1424
1255
  var aCharts = [];
1425
-
1426
1256
  for (var subSection = 0; subSection < aSubSections.length; subSection++) {
1427
1257
  this._findControlInSubSection(aSubSections[subSection].getBlocks(), aSubSections[subSection], aCharts, true);
1428
-
1429
1258
  this._findControlInSubSection(aSubSections[subSection].getMoreBlocks(), aSubSections[subSection], aCharts, true);
1430
1259
  }
1431
-
1432
1260
  return aCharts;
1433
1261
  };
1434
-
1435
1262
  _proto._closeSideContent = function _closeSideContent() {
1436
1263
  this._getAllBlocks().forEach(function (oBlock) {
1437
1264
  var oContent = oBlock.getContent instanceof Function && oBlock.getContent();
1438
-
1439
1265
  if (oContent && oContent.isA && oContent.isA("sap.ui.layout.DynamicSideContent")) {
1440
1266
  if (oContent.setShowSideContent instanceof Function) {
1441
1267
  oContent.setShowSideContent(false);
@@ -1443,19 +1269,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1443
1269
  }
1444
1270
  });
1445
1271
  }
1272
+
1446
1273
  /**
1447
1274
  * Chart Context is resolved for 1:n microcharts.
1448
1275
  *
1449
1276
  * @param oChartContext The Context of the MicroChart
1450
1277
  * @param sChartPath The collectionPath of the the chart
1451
1278
  * @returns Array of Attributes of the chart Context
1452
- */
1453
- ;
1454
-
1279
+ */;
1455
1280
  _proto._getChartContextData = function _getChartContextData(oChartContext, sChartPath) {
1456
1281
  var oContextData = oChartContext.getObject();
1457
1282
  var oChartContextData = [oContextData];
1458
-
1459
1283
  if (oChartContext && sChartPath) {
1460
1284
  if (oContextData[sChartPath]) {
1461
1285
  oChartContextData = oContextData[sChartPath];
@@ -1463,27 +1287,25 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1463
1287
  oChartContextData.push(oContextData);
1464
1288
  }
1465
1289
  }
1466
-
1467
1290
  return oChartContextData;
1468
1291
  }
1292
+
1469
1293
  /**
1470
1294
  * Scroll the tables to the row with the sPath
1471
1295
  *
1472
1296
  * @function
1473
1297
  * @name sap.fe.templates.ObjectPage.ObjectPageController.controller#_scrollTablesToRow
1474
1298
  * @param {string} sRowPath 'sPath of the table row'
1475
- */
1476
- ;
1477
-
1299
+ */;
1478
1300
  _proto._scrollTablesToRow = function _scrollTablesToRow(sRowPath) {
1479
1301
  if (this._findTables && this._findTables().length > 0) {
1480
1302
  var aTables = this._findTables();
1481
-
1482
1303
  for (var i = 0; i < aTables.length; i++) {
1483
1304
  TableScroller.scrollTableToRow(aTables[i], sRowPath);
1484
1305
  }
1485
1306
  }
1486
1307
  }
1308
+
1487
1309
  /**
1488
1310
  * Method to merge selected contexts and filters.
1489
1311
  *
@@ -1493,29 +1315,26 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1493
1315
  * @param aLineContext Selected Contexts
1494
1316
  * @param sChartPath Collection name of the chart
1495
1317
  * @returns Selection Variant Object
1496
- */
1497
- ;
1498
-
1318
+ */;
1499
1319
  _proto._mergeMultipleContexts = function _mergeMultipleContexts(oPageContext, aLineContext, sChartPath) {
1500
- var _this15 = this;
1501
-
1320
+ var _this16 = this;
1502
1321
  var aAttributes = [],
1503
- aPageAttributes = [],
1504
- oContext,
1505
- sMetaPathLine,
1506
- sPathLine;
1322
+ aPageAttributes = [],
1323
+ oContext,
1324
+ sMetaPathLine,
1325
+ sPathLine;
1507
1326
  var sPagePath = oPageContext.getPath();
1508
1327
  var oMetaModel = oPageContext && oPageContext.getModel() && oPageContext.getModel().getMetaModel();
1509
- var sMetaPathPage = oMetaModel && oMetaModel.getMetaPath(sPagePath).replace(/^\/*/, ""); // Get single line context if necessary
1328
+ var sMetaPathPage = oMetaModel && oMetaModel.getMetaPath(sPagePath).replace(/^\/*/, "");
1510
1329
 
1330
+ // Get single line context if necessary
1511
1331
  if (aLineContext && aLineContext.length) {
1512
1332
  oContext = aLineContext[0];
1513
1333
  sPathLine = oContext.getPath();
1514
1334
  sMetaPathLine = oMetaModel && oMetaModel.getMetaPath(sPathLine).replace(/^\/*/, "");
1515
1335
  aLineContext.forEach(function (oSingleContext) {
1516
1336
  if (sChartPath) {
1517
- var oChartContextData = _this15._getChartContextData(oSingleContext, sChartPath);
1518
-
1337
+ var oChartContextData = _this16._getChartContextData(oSingleContext, sChartPath);
1519
1338
  if (oChartContextData) {
1520
1339
  aAttributes = oChartContextData.map(function (oSubChartContextData) {
1521
1340
  return {
@@ -1532,12 +1351,11 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1532
1351
  }
1533
1352
  });
1534
1353
  }
1535
-
1536
1354
  aPageAttributes.push({
1537
1355
  contextData: oPageContext.getObject(),
1538
1356
  entitySet: sMetaPathPage
1539
- }); // Adding Page Context to selection variant
1540
-
1357
+ });
1358
+ // Adding Page Context to selection variant
1541
1359
  aPageAttributes = CommonUtils.removeSensitiveData(aPageAttributes, oMetaModel);
1542
1360
  var oPageLevelSV = CommonUtils.addPageContextToSelectionVariant(new SelectionVariant(), aPageAttributes, this.getView());
1543
1361
  aAttributes = CommonUtils.removeSensitiveData(aAttributes, oMetaModel);
@@ -1546,25 +1364,22 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1546
1364
  attributes: aAttributes
1547
1365
  };
1548
1366
  };
1549
-
1550
1367
  _proto._getBatchGroupsForView = function _getBatchGroupsForView() {
1551
1368
  var oViewData = this.getView().getViewData(),
1552
- oConfigurations = oViewData.controlConfiguration,
1553
- aConfigurations = oConfigurations && Object.keys(oConfigurations),
1554
- aBatchGroups = ["$auto.Heroes", "$auto.Decoration", "$auto.Workers"];
1555
-
1369
+ oConfigurations = oViewData.controlConfiguration,
1370
+ aConfigurations = oConfigurations && Object.keys(oConfigurations),
1371
+ aBatchGroups = ["$auto.Heroes", "$auto.Decoration", "$auto.Workers"];
1556
1372
  if (aConfigurations && aConfigurations.length > 0) {
1557
1373
  aConfigurations.forEach(function (sKey) {
1558
1374
  var oConfiguration = oConfigurations[sKey];
1559
-
1560
1375
  if (oConfiguration.requestGroupId === "LongRunners") {
1561
1376
  aBatchGroups.push("$auto.LongRunners");
1562
1377
  }
1563
1378
  });
1564
1379
  }
1565
-
1566
1380
  return aBatchGroups;
1567
1381
  }
1382
+
1568
1383
  /*
1569
1384
  * Reset Breadcrumb links
1570
1385
  *
@@ -1577,25 +1392,19 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1577
1392
  *
1578
1393
  * @ui5-restricted
1579
1394
  * @experimental
1580
- */
1581
- ;
1582
-
1395
+ */;
1583
1396
  _proto._setBreadcrumbLinks = function _setBreadcrumbLinks(oSource) {
1584
1397
  try {
1585
1398
  var _sNewPath$split;
1586
-
1587
- var _this17 = this;
1588
-
1399
+ var _this18 = this;
1589
1400
  var oContext = oSource.getBindingContext(),
1590
- oAppComponent = _this17.getAppComponent(),
1591
- aPromises = [],
1592
- aSkipParameterized = [],
1593
- sNewPath = oContext === null || oContext === void 0 ? void 0 : oContext.getPath(),
1594
- aPathParts = (_sNewPath$split = sNewPath === null || sNewPath === void 0 ? void 0 : sNewPath.split("/")) !== null && _sNewPath$split !== void 0 ? _sNewPath$split : [],
1595
- oMetaModel = oAppComponent && oAppComponent.getMetaModel();
1596
-
1401
+ oAppComponent = _this18.getAppComponent(),
1402
+ aPromises = [],
1403
+ aSkipParameterized = [],
1404
+ sNewPath = oContext === null || oContext === void 0 ? void 0 : oContext.getPath(),
1405
+ aPathParts = (_sNewPath$split = sNewPath === null || sNewPath === void 0 ? void 0 : sNewPath.split("/")) !== null && _sNewPath$split !== void 0 ? _sNewPath$split : [],
1406
+ oMetaModel = oAppComponent && oAppComponent.getMetaModel();
1597
1407
  var sPath = "";
1598
-
1599
1408
  var _temp17 = _catch(function () {
1600
1409
  aPathParts.shift();
1601
1410
  aPathParts.splice(-1, 1);
@@ -1604,7 +1413,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1604
1413
  var oRootViewController = oAppComponent.getRootViewController();
1605
1414
  var sParameterPath = oMetaModel.getMetaPath(sPath);
1606
1415
  var bResultContext = oMetaModel.getObject("".concat(sParameterPath, "/@com.sap.vocabularies.Common.v1.ResultContext"));
1607
-
1608
1416
  if (bResultContext) {
1609
1417
  // We dont need to create a breadcrumb for Parameter path
1610
1418
  aSkipParameterized.push(1);
@@ -1612,46 +1420,40 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1612
1420
  } else {
1613
1421
  aSkipParameterized.push(0);
1614
1422
  }
1615
-
1616
1423
  aPromises.push(oRootViewController.getTitleInfoFromPath(sPath));
1617
1424
  });
1618
1425
  return Promise.resolve(Promise.all(aPromises)).then(function (titleHierarchyInfos) {
1619
1426
  var idx, hierarchyPosition, oLink;
1620
-
1621
- var _iterator = _createForOfIteratorHelper(titleHierarchyInfos),
1622
- _step;
1623
-
1427
+ var _iterator2 = _createForOfIteratorHelper(titleHierarchyInfos),
1428
+ _step2;
1624
1429
  try {
1625
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
1626
- var titleHierarchyInfo = _step.value;
1430
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
1431
+ var titleHierarchyInfo = _step2.value;
1627
1432
  hierarchyPosition = titleHierarchyInfos.indexOf(titleHierarchyInfo);
1628
1433
  idx = hierarchyPosition - aSkipParameterized[hierarchyPosition];
1629
- oLink = oSource.getLinks()[idx] ? oSource.getLinks()[idx] : new Link(); //sCurrentEntity is a fallback value in case of empty title
1630
-
1631
- oLink.setText(titleHierarchyInfo.subtitle || titleHierarchyInfo.title); //We apply an additional encodeURI in case of special characters (ie "/") used in the url through the semantic keys
1632
-
1434
+ oLink = oSource.getLinks()[idx] ? oSource.getLinks()[idx] : new Link();
1435
+ //sCurrentEntity is a fallback value in case of empty title
1436
+ oLink.setText(titleHierarchyInfo.subtitle || titleHierarchyInfo.title);
1437
+ //We apply an additional encodeURI in case of special characters (ie "/") used in the url through the semantic keys
1633
1438
  oLink.setHref(encodeURI(titleHierarchyInfo.intent));
1634
-
1635
1439
  if (!oSource.getLinks()[idx]) {
1636
1440
  oSource.addLink(oLink);
1637
1441
  }
1638
1442
  }
1639
1443
  } catch (err) {
1640
- _iterator.e(err);
1444
+ _iterator2.e(err);
1641
1445
  } finally {
1642
- _iterator.f();
1446
+ _iterator2.f();
1643
1447
  }
1644
1448
  });
1645
1449
  }, function (error) {
1646
1450
  Log.error("Error while setting the breadcrumb links:" + error);
1647
1451
  });
1648
-
1649
1452
  return Promise.resolve(_temp17 && _temp17.then ? _temp17.then(function () {}) : void 0);
1650
1453
  } catch (e) {
1651
1454
  return Promise.reject(e);
1652
1455
  }
1653
1456
  };
1654
-
1655
1457
  _proto._checkDataPointTitleForExternalNavigation = function _checkDataPointTitleForExternalNavigation() {
1656
1458
  var oView = this.getView();
1657
1459
  var oInternalModelContext = oView.getBindingContext("internal");
@@ -1659,7 +1461,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1659
1461
  var oShellServices = this.getAppComponent().getShellServices();
1660
1462
  var oPageContext = oView && oView.getBindingContext();
1661
1463
  oInternalModelContext.setProperty("isHeaderDPLinkVisible", {});
1662
-
1663
1464
  if (oPageContext) {
1664
1465
  oPageContext.requestObject().then(function (oData) {
1665
1466
  fnGetLinks(oDataPoints, oData);
@@ -1667,51 +1468,44 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1667
1468
  Log.error("Cannot retrieve the links from the shell service", oError);
1668
1469
  });
1669
1470
  }
1471
+
1670
1472
  /**
1671
1473
  * @param oError
1672
1474
  */
1673
-
1674
-
1675
1475
  function fnOnError(oError) {
1676
1476
  Log.error(oError);
1677
1477
  }
1678
-
1679
1478
  function fnSetLinkEnablement(id, aSupportedLinks) {
1680
- var sLinkId = id; // process viable links from getLinks for all datapoints having outbound
1681
-
1479
+ var sLinkId = id;
1480
+ // process viable links from getLinks for all datapoints having outbound
1682
1481
  if (aSupportedLinks && aSupportedLinks.length === 1 && aSupportedLinks[0].supported) {
1683
1482
  oInternalModelContext.setProperty("isHeaderDPLinkVisible/".concat(sLinkId), true);
1684
1483
  }
1685
1484
  }
1485
+
1686
1486
  /**
1687
1487
  * @param oSubDataPoints
1688
1488
  * @param oPageData
1689
1489
  */
1690
-
1691
-
1692
1490
  function fnGetLinks(oSubDataPoints, oPageData) {
1693
1491
  var _loop = function (sId) {
1694
1492
  var oDataPoint = oSubDataPoints[sId];
1695
1493
  var oParams = {};
1696
1494
  var oLink = oView.byId(sId);
1697
-
1698
1495
  if (!oLink) {
1699
1496
  // for data points configured in app descriptor but not annotated in the header
1700
1497
  return "continue";
1701
1498
  }
1702
-
1703
1499
  var oLinkContext = oLink.getBindingContext();
1704
1500
  var oLinkData = oLinkContext && oLinkContext.getObject();
1705
- var oMixedContext = merge({}, oPageData, oLinkData); // process semantic object mappings
1706
-
1501
+ var oMixedContext = merge({}, oPageData, oLinkData);
1502
+ // process semantic object mappings
1707
1503
  if (oDataPoint.semanticObjectMapping) {
1708
1504
  var aSemanticObjectMapping = oDataPoint.semanticObjectMapping;
1709
-
1710
1505
  for (var item in aSemanticObjectMapping) {
1711
1506
  var oMapping = aSemanticObjectMapping[item];
1712
1507
  var sMainProperty = oMapping["LocalProperty"]["$PropertyPath"];
1713
1508
  var sMappedProperty = oMapping["SemanticObjectProperty"];
1714
-
1715
1509
  if (sMainProperty !== sMappedProperty) {
1716
1510
  if (oMixedContext.hasOwnProperty(sMainProperty)) {
1717
1511
  var oNewMapping = {};
@@ -1722,16 +1516,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1722
1516
  }
1723
1517
  }
1724
1518
  }
1725
-
1726
1519
  if (oMixedContext) {
1727
1520
  for (var sKey in oMixedContext) {
1728
1521
  if (sKey.indexOf("_") !== 0 && sKey.indexOf("odata.context") === -1) {
1729
1522
  oParams[sKey] = oMixedContext[sKey];
1730
1523
  }
1731
1524
  }
1732
- } // validate if a link must be rendered
1733
-
1734
-
1525
+ }
1526
+ // validate if a link must be rendered
1735
1527
  oShellServices.isNavigationSupported([{
1736
1528
  target: {
1737
1529
  semanticObject: oDataPoint.semanticObject,
@@ -1742,15 +1534,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1742
1534
  return fnSetLinkEnablement(sId, aLinks);
1743
1535
  }).catch(fnOnError);
1744
1536
  };
1745
-
1746
1537
  for (var sId in oSubDataPoints) {
1747
1538
  var _ret = _loop(sId);
1748
-
1749
1539
  if (_ret === "continue") continue;
1750
1540
  }
1751
1541
  }
1752
1542
  };
1753
-
1754
1543
  return ObjectPageController;
1755
1544
  }(PageController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "placeholder", [_dec2], {
1756
1545
  configurable: true,
@@ -1815,4 +1604,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1815
1604
  }), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype)), _class2)) || _class);
1816
1605
  return ObjectPageController;
1817
1606
  }, false);
1818
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiZmluYWxpemVyIiwiYmluZCIsIk9iamVjdFBhZ2VDb250cm9sbGVyIiwiZGVmaW5lVUk1Q2xhc3MiLCJ1c2luZ0V4dGVuc2lvbiIsIlBsYWNlaG9sZGVyIiwiRWRpdEZsb3ciLCJTaGFyZSIsIm92ZXJyaWRlIiwiU2hhcmVPdmVycmlkZXMiLCJJbnRlcm5hbEVkaXRGbG93IiwiRWRpdEZsb3dPdmVycmlkZXMiLCJJbnRlcm5hbFJvdXRpbmciLCJJbnRlcm5hbFJvdXRpbmdPdmVycmlkZSIsIlBhZ2luYXRvciIsIlBhZ2luYXRvck92ZXJyaWRlIiwiTWVzc2FnZUhhbmRsZXIiLCJNZXNzYWdlSGFuZGxlck92ZXJyaWRlIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUiLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE5hdmlnYXRpb25Nb2RlIiwiYklzU3RpY2t5RWRpdE1vZGUiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsImdldFN0aWNreUVkaXRNb2RlIiwidW5kZWZpbmVkIiwiVmlld1N0YXRlIiwiVmlld1N0YXRlT3ZlcnJpZGVzIiwiUGFnZVJlYWR5IiwiaXNDb250ZXh0RXhwZWN0ZWQiLCJNYXNzRWRpdCIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJoYW5kbGVycyIsIm9uUHJpbWFyeUFjdGlvbiIsIm9Db250cm9sbGVyIiwib1ZpZXciLCJvQ29udGV4dCIsInNBY3Rpb25OYW1lIiwibVBhcmFtZXRlcnMiLCJtQ29uZGl0aW9ucyIsImlWaWV3TGV2ZWwiLCJnZXRWaWV3RGF0YSIsInZpZXdMZXZlbCIsIm9PYmplY3RQYWdlIiwiX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sIiwicG9zaXRpdmVBY3Rpb25WaXNpYmxlIiwicG9zaXRpdmVBY3Rpb25FbmFibGVkIiwib25DYWxsQWN0aW9uIiwiZWRpdEFjdGlvblZpc2libGUiLCJlZGl0QWN0aW9uRW5hYmxlZCIsIl9lZGl0RG9jdW1lbnQiLCJnZXRNb2RlbCIsImdldFByb3BlcnR5IiwiX3NhdmVEb2N1bWVudCIsIl9hcHBseURvY3VtZW50Iiwib25UYWJsZUNvbnRleHRDaGFuZ2UiLCJvRXZlbnQiLCJvU291cmNlIiwiZ2V0U291cmNlIiwib1RhYmxlIiwiX2ZpbmRUYWJsZXMiLCJzb21lIiwiX29UYWJsZSIsImdldFJvd0JpbmRpbmciLCJvQ3VycmVudEFjdGlvblByb21pc2UiLCJfZWRpdEZsb3ciLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImFUYWJsZUNvbnRleHRzIiwiZ2V0VHlwZSIsImdldE1ldGFkYXRhIiwiaXNBIiwiZ2V0Q29udGV4dHMiLCJnZXRDdXJyZW50Q29udGV4dHMiLCJvQWN0aW9uUmVzcG9uc2UiLCJjb250cm9sSWQiLCJzSWQiLCJvQWN0aW9uRGF0YSIsIm9EYXRhIiwiYUtleXMiLCJrZXlzIiwiaU5ld0l0ZW1wIiwiZmluZCIsIm9UYWJsZUNvbnRleHQiLCJpIiwib1RhYmxlRGF0YSIsImdldE9iamVjdCIsImJDb21wYXJlIiwiZXZlcnkiLCJzS2V5IiwiYURpYWxvZ3MiLCJJbnN0YW5jZU1hbmFnZXIiLCJnZXRPcGVuRGlhbG9ncyIsIm9EaWFsb2ciLCJsZW5ndGgiLCJkaWFsb2ciLCJkYXRhIiwiYXR0YWNoRXZlbnRPbmNlIiwiZm9jdXNSb3ciLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImNhdGNoIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJtZXNzYWdlQnV0dG9uIiwiZmlyZU1vZGVsQ29udGV4dENoYW5nZSIsImVkaXRGbG93IiwiaW52b2tlQWN0aW9uIiwiX3Nob3dNZXNzYWdlUG9wb3ZlciIsIm9uRGF0YVBvaW50VGl0bGVQcmVzc2VkIiwib01hbmlmZXN0T3V0Ym91bmQiLCJzQ29udHJvbENvbmZpZyIsInNDb2xsZWN0aW9uUGF0aCIsIkpTT04iLCJwYXJzZSIsIm9UYXJnZXRJbmZvIiwiYVNlbWFudGljT2JqZWN0TWFwcGluZyIsIkNvbW1vblV0aWxzIiwiZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nIiwib0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwic01ldGFQYXRoIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiYU5hdmlnYXRpb25EYXRhIiwiX2dldENoYXJ0Q29udGV4dERhdGEiLCJhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJtYXAiLCJvTmF2aWdhdGlvbkRhdGEiLCJtZXRhUGF0aCIsInBhcmFtZXRlcnMiLCJvUGFyYW1zIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE91dGJvdW5kUGFyYW1zIiwiT2JqZWN0Iiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJuYXZpZ2F0ZSIsIm5hdmlnYXRpb25Db250ZXh0cyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInNPdXRib3VuZFRhcmdldCIsInNDcmVhdGVQYXRoIiwib25OYXZpZ2F0ZUNoYW5nZSIsImdldEV4dGVuc2lvbkFQSSIsInVwZGF0ZUFwcFN0YXRlIiwiYlNlY3Rpb25OYXZpZ2F0ZWQiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJzZWN0aW9uTGF5b3V0Iiwib1N1YlNlY3Rpb24iLCJnZXRQYXJhbWV0ZXIiLCJfdXBkYXRlRm9jdXNJbkVkaXRNb2RlIiwib25WYXJpYW50U2VsZWN0ZWQiLCJvblZhcmlhbnRTYXZlZCIsInNldFRpbWVvdXQiLCJuYXZpZ2F0ZVRvU3ViU2VjdGlvbiIsInZEZXRhaWxDb25maWciLCJvRGV0YWlsQ29uZmlnIiwiYnlJZCIsIm9TZWN0aW9uIiwic2VjdGlvbklkIiwic3ViU2VjdGlvbklkIiwiZ2V0U3ViU2VjdGlvbnMiLCJnZXRQYXJlbnQiLCJnZXRWaXNpYmxlIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJzVGl0bGUiLCJnZXRUcmFuc2xhdGVkVGV4dCIsImVudGl0eVNldCIsIk1lc3NhZ2VCb3giLCJzY3JvbGxUb1NlY3Rpb24iLCJnZXRJZCIsImZpcmVOYXZpZ2F0ZSIsInNlY3Rpb24iLCJzdWJTZWN0aW9uIiwib25DaGFydFNlbGVjdGlvbkNoYW5nZWQiLCJDaGFydFJ1bnRpbWUiLCJmblVwZGF0ZUNoYXJ0Iiwib25TdGF0ZUNoYW5nZSIsIm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyIsIkV4dGVuc2lvbkFQSSIsImV4dGVuc2lvbkFQSSIsIm9uSW5pdCIsInNldFByb3BlcnR5IiwidmlzaWJpbGl0eSIsIml0ZW1zIiwiX2dldEJhdGNoR3JvdXBzRm9yVmlldyIsInVzZU5ld0xhenlMb2FkaW5nIiwiZ2V0RW5hYmxlTGF6eUxvYWRpbmciLCJhdHRhY2hFdmVudCIsIl9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0Iiwib0l0ZW1CaW5kaW5nIiwiYXR0YWNoQ2hhbmdlIiwiX2ZuU2hvd09QTWVzc2FnZSIsIm9uRXhpdCIsImRlc3Ryb3kiLCJvTWVzc2FnZVBvcG92ZXIiLCJpc09wZW4iLCJjbG9zZSIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiaXNDb25uZWN0ZWQiLCJkaXNjb25uZWN0IiwidmlldyIsIm1lc3NhZ2VzIiwiZ2V0SXRlbXMiLCJpdGVtIiwiZmlsdGVyIiwibWVzc2FnZSIsImdldFRhcmdldHMiLCJzaG93TWVzc2FnZXMiLCJfZ2V0VGFibGVCaW5kaW5nIiwib25CZWZvcmVSZW5kZXJpbmciLCJQYWdlQ29udHJvbGxlciIsInByb3RvdHlwZSIsImFwcGx5Iiwib1ZpZXdEYXRhIiwicmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCIsIkNvbW1vbkhlbHBlciIsInNldE1ldGFNb2RlbCIsImdldEFwcENvbXBvbmVudCIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJyZXNwb25zZSIsIm9FcnJvciIsIl9vbkJlZm9yZUJpbmRpbmciLCJhVGFibGVzIiwib0ludGVybmFsTW9kZWwiLCJhQmF0Y2hHcm91cHMiLCJvRmFzdENyZWF0aW9uUm93IiwicHVzaCIsImJEcmFmdE5hdmlnYXRpb24iLCJfY2xvc2VTaWRlQ29udGVudCIsIm9wQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiZ2V0QmluZGluZyIsInJlc2V0Q2hhbmdlcyIsImdldENyZWF0aW9uUm93Iiwic2V0QmluZGluZ0NvbnRleHQiLCJmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24iLCJpc0ZpcnN0UmVuZGVyaW5nIiwiYlBlcnNpc3RPUFNjcm9sbCIsInNldFNlbGVjdGVkU2VjdGlvbiIsIm9EZWxlZ2F0ZU9uQmVmb3JlIiwiYWRkRXZlbnREZWxlZ2F0ZSIsInBhZ2VSZWFkeSIsInJlbW92ZUV2ZW50RGVsZWdhdGUiLCJvQmluZGluZyIsImxpc3RCaW5kaW5nIiwib1BhZ2luYXRvckN1cnJlbnRDb250ZXh0Iiwib0JpbmRpbmdUb1VzZSIsInBhZ2luYXRvciIsImluaXRpYWxpemUiLCJzQmluZGluZ1BhdGgiLCJ0ZXN0Iiwic0xpc3RCaW5kaW5nUGF0aCIsInJlcGxhY2UiLCJPRGF0YUxpc3RCaW5kaW5nIiwib01vZGVsIiwiX3NldExpc3RCaW5kaW5nQXN5bmMiLCJkZXRhY2hFdmVudCIsImFTZWN0aW9ucyIsImdldFNlY3Rpb25zIiwiYlVzZUljb25UYWJCYXIiLCJnZXRVc2VJY29uVGFiQmFyIiwiaVNraXAiLCJiSXNJbkVkaXRNb2RlIiwiYkVkaXRhYmxlSGVhZGVyIiwiZWRpdGFibGVIZWFkZXJDb250ZW50IiwiaVNlY3Rpb24iLCJhU3ViU2VjdGlvbnMiLCJpU3ViU2VjdGlvbiIsImlzVmlzaWJpbGl0eUR5bmFtaWMiLCJwbGFjZWhvbGRlciIsImlzUGxhY2Vob2xkZXJFbmFibGVkIiwic2hvd1BsYWNlaG9sZGVyIiwib05hdkNvbnRhaW5lciIsIm9Db250YWluZXIiLCJfZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50Iiwib0ZpcnN0Q2xpY2thYmxlRWxlbWVudCIsImFBY3Rpb25zIiwiZ2V0SGVhZGVyVGl0bGUiLCJnZXRBY3Rpb25zIiwib0FjdGlvbiIsImdldEVuYWJsZWQiLCJfZ2V0Rmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkRnJvbVN1YlNlY3Rpb24iLCJhQmxvY2tzIiwiZ2V0QmxvY2tzIiwiYmxvY2siLCJhRm9ybUNvbnRhaW5lcnMiLCJnZXRGb3JtQ29udGFpbmVycyIsImdldENvbnRlbnQiLCJmb3JtQ29udGFpbmVyIiwiYUZvcm1FbGVtZW50cyIsImdldEZvcm1FbGVtZW50cyIsImZvcm1FbGVtZW50IiwiYUZpZWxkcyIsImdldEZpZWxkcyIsImdldFJlcXVpcmVkIiwiZ2V0VmFsdWUiLCJkZWJ1ZyIsIm9NYW5kYXRvcnlGaWVsZCIsIm9GaWVsZFRvRm9jdXMiLCJjb250ZW50IiwiZ2V0Q29udGVudEVkaXQiLCJfZ2V0Rmlyc3RFZGl0YWJsZUlucHV0IiwiZm9jdXMiLCJfb25CYWNrTmF2aWdhdGlvbkluRHJhZnQiLCJtZXNzYWdlSGFuZGxlciIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImdldFJvdXRlclByb3h5IiwiY2hlY2tJZkJhY2tIYXNTYW1lQ29udGV4dCIsImhpc3RvcnkiLCJiYWNrIiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIl9vbkFmdGVyQmluZGluZyIsIm9CaW5kaW5nQ29udGV4dCIsImVuYWJsZUZhc3RDcmVhdGlvblJvdyIsIm9MaXN0QmluZGluZyIsIm9GYXN0Q3JlYXRpb25MaXN0QmluZGluZyIsIm9GYXN0Q3JlYXRpb25Db250ZXh0Iiwib0ZpbmFsVUlTdGF0ZSIsImJpbmRMaXN0IiwiZ2V0Q29udGV4dCIsIiQkdXBkYXRlR3JvdXBJZCIsIiQkZ3JvdXBJZCIsInJlZnJlc2hJbnRlcm5hbCIsImNyZWF0ZSIsImNyZWF0ZWQiLCJ0cmFjZSIsIl9zaWRlRWZmZWN0cyIsImNsZWFyUHJvcGVydGllc1N0YXR1cyIsImFJQk5BY3Rpb25zIiwiZm9yRWFjaCIsImdldElCTkFjdGlvbnMiLCJvVGFibGVSb3dCaW5kaW5nIiwiTW9kZWxIZWxwZXIiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJyZW1vdmVDYWNoZXNBbmRNZXNzYWdlcyIsIm9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAiLCJwYXJzZUN1c3RvbURhdGEiLCJEZWxlZ2F0ZVV0aWwiLCJnZXRDdXN0b21EYXRhIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJjbGVhclNlbGVjdGlvbiIsImdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwiLCJvT2JqZWN0UGFnZVRpdGxlIiwiYUlCTkhlYWRlckFjdGlvbnMiLCJjb25jYXQiLCJ1cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSIsImhhbmRsZVRhYmxlTW9kaWZpY2F0aW9ucyIsImZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cyIsImZuSGFuZGxlQ2hhbmdlIiwiZGV0YWNoQ2hhbmdlIiwiY29tcHV0ZUVkaXRNb2RlIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJjb25uZWN0Iiwib0NhY2hlIiwiX3VwZGF0ZVJlbGF0ZWRBcHBzIiwiZm5VcGRhdGVSZWxhdGVkQXBwcyIsImRldGFjaERhdGFSZWNlaXZlZCIsImF0dGFjaERhdGFSZWNlaXZlZCIsImN1cnJlbnRCaW5kaW5nIiwiaGFuZGxlUGF0Y2hTZW50IiwiVGFibGVVdGlscyIsIndoZW5Cb3VuZCIsIl90cmlnZ2VyVmlzaWJsZVN1YlNlY3Rpb25zRXZlbnRzIiwib25QYWdlUmVhZHkiLCJzZXRGb2N1cyIsImlzSW5EaXNwbGF5TW9kZSIsIm9TZWxlY3RlZFNlY3Rpb24iLCJDb3JlIiwiZ2V0U2VsZWN0ZWRTZWN0aW9uIiwiYklzU3RpY2t5TW9kZSIsIm9BcHBDb21wb25lbnQiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJnZXRBcHBTdGF0ZUhhbmRsZXIiLCJhcHBseUFwcFN0YXRlIiwiZm9yY2VGb2N1cyIsIkVycm9yIiwiX2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24iLCJvT2JqZWN0UGFnZVN1YnRpdGxlIiwib0N1c3RvbURhdGEiLCJnZXRLZXkiLCJ0aXRsZSIsInN1YnRpdGxlIiwiaW50ZW50IiwiaWNvbiIsIl9leGVjdXRlSGVhZGVyU2hvcnRjdXQiLCJzQnV0dG9uSWQiLCJvQnV0dG9uIiwib0VsZW1lbnQiLCJmaXJlQnV0dG9uUHJlc3MiLCJfZXhlY3V0ZUZvb3RlclNob3J0Y3V0IiwiZ2V0Rm9vdGVyIiwiZ2V0TmFtZSIsIl9leGVjdXRlVGFiU2hvcnRDdXQiLCJvRXhlY3V0aW9uIiwiaVNlY3Rpb25JbmRleE1heCIsInNDb21tYW5kIiwiZ2V0Q29tbWFuZCIsIm5ld1NlY3Rpb24iLCJpU2VsZWN0ZWRTZWN0aW9uSW5kZXgiLCJpbmRleE9mU2VjdGlvbiIsIl9nZXRGb290ZXJWaXNpYmlsaXR5Iiwic1ZpZXdJZCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsIm9NZXNzYWdlIiwidmFsaWRhdGlvbiIsInR5cGUiLCJ0YXJnZXQiLCJpbmRleE9mIiwib1JldCIsInJvb3RWaWV3Q29udHJvbGxlciIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImN1cnJlbnRQYWdlVmlldyIsImlzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdFZpZXciLCJnZXRSb290Q29udGFpbmVyIiwiZ2V0Q3VycmVudFBhZ2UiLCJvTWVzc2FnZUJ1dHRvbiIsImdldExlbmd0aCIsInNldFZpc2libGUiLCJvcGVuQnkiLCJCdXN5TG9ja2VyIiwibG9jayIsImVkaXREb2N1bWVudCIsImZpbmFsbHkiLCJ1bmxvY2siLCJnZXREcmFmdFJvb3RDb250ZXh0IiwiY29udGV4dCIsImRyYWZ0Um9vdENvbnRleHRQYXRoIiwiZ2V0RHJhZnRSb290UGF0aCIsInNpbXBsZURyYWZ0Um9vdENvbnRleHQiLCJleGlzdGluZ0JpbmRpbmdDb250ZXh0T25QYWdlIiwiZ2V0SW5zdGFuY2VkVmlld3MiLCJwYWdlVmlldyIsImludGVybmFsTW9kZWwiLCJtb2RlbCIsIm1ldGFNb2RlbCIsInNFbnRpdHlQYXRoIiwibURhdGFNb2RlbCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwicmVxdWVzdFByb3BlcnR5IiwidGFyZ2V0RW50aXR5VHlwZSIsIm5hbWUiLCJfdmFsaWRhdGVEb2N1bWVudCIsImNvbnRyb2wiLCJnZXRDdXJyZW50Rm9jdXNlZENvbnRyb2xJZCIsImlzVHJhbnNpZW50Iiwic3luY1Rhc2siLCJhcHBDb21wb25lbnQiLCJzaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJlbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwiZ2xvYmFsU2lkZUVmZmVjdHMiLCJnZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiUHJvbWlzZSIsImFsbCIsInNpZGVFZmZlY3RzIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZHJhZnRSb290Q29udGV4dCIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJhV2FpdENyZWF0ZURvY3VtZW50cyIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiY3JlYXRpb25Nb2RlIiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVBdEVuZCIsImJDcmVhdGVEb2N1bWVudCIsImJTa2lwU2lkZUVmZmVjdHMiLCJjcmVhdGVEb2N1bWVudCIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwic2F2ZURvY3VtZW50IiwiaXNMb2NrZWQiLCJfbWFuYWdlQ29sbGFib3JhdGlvbiIsIm9wZW5NYW5hZ2VEaWFsb2ciLCJfc2hvd0NvbGxhYm9yYXRpb25Vc2VyRGV0YWlscyIsImV2ZW50Iiwic2hvd1VzZXJEZXRhaWxzIiwiX2NhbmNlbERvY3VtZW50IiwiY2FuY2VsQnV0dG9uIiwiY2FuY2VsRG9jdW1lbnQiLCJhcHBseURvY3VtZW50IiwicmVzb2x2ZVN0cmluZ3RvQm9vbGVhbiIsInVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyIsIl9maW5kQ29udHJvbEluU3ViU2VjdGlvbiIsImFQYXJlbnRFbGVtZW50IiwiYVN1YnNlY3Rpb24iLCJhQ29udHJvbHMiLCJiSXNDaGFydCIsImFTdWJTZWN0aW9uVGFibGVzIiwiZWxlbWVudCIsIm1BZ2dyZWdhdGlvbnMiLCJnZXRBZ2dyZWdhdGlvbiIsImFJdGVtcyIsIm9JdGVtIiwiZ2V0TWFpbkNvbnRlbnQiLCJncmlkVGFibGUiLCJoYXNTdHlsZUNsYXNzIiwiYWRkU3R5bGVDbGFzcyIsIl9nZXRBbGxTdWJTZWN0aW9ucyIsIl9nZXRBbGxCbG9ja3MiLCJnZXRNb3JlQmxvY2tzIiwiX2ZpbmRDaGFydHMiLCJhQ2hhcnRzIiwib0Jsb2NrIiwib0NvbnRlbnQiLCJzZXRTaG93U2lkZUNvbnRlbnQiLCJvQ2hhcnRDb250ZXh0Iiwic0NoYXJ0UGF0aCIsIm9Db250ZXh0RGF0YSIsIm9DaGFydENvbnRleHREYXRhIiwiX3Njcm9sbFRhYmxlc1RvUm93Iiwic1Jvd1BhdGgiLCJUYWJsZVNjcm9sbGVyIiwic2Nyb2xsVGFibGVUb1JvdyIsIl9tZXJnZU11bHRpcGxlQ29udGV4dHMiLCJvUGFnZUNvbnRleHQiLCJhTGluZUNvbnRleHQiLCJhQXR0cmlidXRlcyIsImFQYWdlQXR0cmlidXRlcyIsInNNZXRhUGF0aExpbmUiLCJzUGF0aExpbmUiLCJzUGFnZVBhdGgiLCJvTWV0YU1vZGVsIiwic01ldGFQYXRoUGFnZSIsIm9TaW5nbGVDb250ZXh0Iiwib1N1YkNoYXJ0Q29udGV4dERhdGEiLCJjb250ZXh0RGF0YSIsInJlbW92ZVNlbnNpdGl2ZURhdGEiLCJvUGFnZUxldmVsU1YiLCJhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdGlvblZhcmlhbnQiLCJzZWxlY3Rpb25WYXJpYW50IiwiYXR0cmlidXRlcyIsIm9Db25maWd1cmF0aW9ucyIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwiYUNvbmZpZ3VyYXRpb25zIiwib0NvbmZpZ3VyYXRpb24iLCJyZXF1ZXN0R3JvdXBJZCIsIl9zZXRCcmVhZGNydW1iTGlua3MiLCJhUHJvbWlzZXMiLCJhU2tpcFBhcmFtZXRlcml6ZWQiLCJzTmV3UGF0aCIsImFQYXRoUGFydHMiLCJzcGxpdCIsInNQYXRoIiwic2hpZnQiLCJzcGxpY2UiLCJzUGF0aFBhcnQiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwic1BhcmFtZXRlclBhdGgiLCJiUmVzdWx0Q29udGV4dCIsImdldFRpdGxlSW5mb0Zyb21QYXRoIiwidGl0bGVIaWVyYXJjaHlJbmZvcyIsImlkeCIsImhpZXJhcmNoeVBvc2l0aW9uIiwib0xpbmsiLCJ0aXRsZUhpZXJhcmNoeUluZm8iLCJnZXRMaW5rcyIsIkxpbmsiLCJzZXRUZXh0Iiwic2V0SHJlZiIsImVuY29kZVVSSSIsImFkZExpbmsiLCJvRGF0YVBvaW50cyIsImdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbiIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0T3V0Ym91bmRzIiwib1NoZWxsU2VydmljZXMiLCJyZXF1ZXN0T2JqZWN0IiwiZm5HZXRMaW5rcyIsImZuT25FcnJvciIsImZuU2V0TGlua0VuYWJsZW1lbnQiLCJpZCIsImFTdXBwb3J0ZWRMaW5rcyIsInNMaW5rSWQiLCJzdXBwb3J0ZWQiLCJvU3ViRGF0YVBvaW50cyIsIm9QYWdlRGF0YSIsIm9EYXRhUG9pbnQiLCJvTGlua0NvbnRleHQiLCJvTGlua0RhdGEiLCJvTWl4ZWRDb250ZXh0IiwibWVyZ2UiLCJvTWFwcGluZyIsInNNYWluUHJvcGVydHkiLCJzTWFwcGVkUHJvcGVydHkiLCJoYXNPd25Qcm9wZXJ0eSIsIm9OZXdNYXBwaW5nIiwiaXNOYXZpZ2F0aW9uU3VwcG9ydGVkIiwicGFyYW1zIiwiYUxpbmtzIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJPYmplY3RQYWdlQ29udHJvbGxlci5jb250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcInNhcC9mZS9jb3JlL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBjb25uZWN0LCBkaXNjb25uZWN0LCBpc0Nvbm5lY3RlZCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgb3Blbk1hbmFnZURpYWxvZywgc2hvd1VzZXJEZXRhaWxzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vTWFuYWdlXCI7XG5pbXBvcnQgRWRpdEZsb3cgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0VkaXRGbG93XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbEVkaXRGbG93IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbEVkaXRGbG93XCI7XG5pbXBvcnQgSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBNYXNzRWRpdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWFzc0VkaXRcIjtcbmltcG9ydCBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCBQYWdlUmVhZHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BhZ2VSZWFkeVwiO1xuaW1wb3J0IFBhZ2luYXRvciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGFnaW5hdG9yXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgU2hhcmUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uLCB1c2luZ0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvUm9vdFZpZXdCYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L1Jvb3RWaWV3QmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDaGFydFJ1bnRpbWUgZnJvbSBcInNhcC9mZS9tYWNyb3MvY2hhcnQvQ2hhcnRSdW50aW1lXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IERlbGVnYXRlVXRpbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9EZWxlZ2F0ZVV0aWxcIjtcbmltcG9ydCBUYWJsZVV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1V0aWxzXCI7XG5pbXBvcnQgU2VsZWN0aW9uVmFyaWFudCBmcm9tIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9iamVjdFBhZ2VFeHRlbnNpb25BUEkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBFeHRlbnNpb25BUEkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IEVkaXRGbG93T3ZlcnJpZGVzIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL1Jvb3RDb250YWluZXIvb3ZlcnJpZGVzL0VkaXRGbG93XCI7XG5pbXBvcnQgVGFibGVTY3JvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9UYWJsZVNjcm9sbGVyXCI7XG5pbXBvcnQgSW5zdGFuY2VNYW5hZ2VyIGZyb20gXCJzYXAvbS9JbnN0YW5jZU1hbmFnZXJcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJzYXAvbS9MaW5rXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IHR5cGUgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIEJyZWFkQ3J1bWJzIGZyb20gXCJzYXAvdXhhcC9CcmVhZENydW1ic1wiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZSBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZVwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUxheW91dCBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZUxheW91dFwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZVNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlU3ViU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVN1YlNlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFDb250ZXh0QmluZGluZ0V4LCBWNENvbnRleHQgfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL0ludGVudEJhc2VkTmF2aWdhdGlvblwiO1xuaW1wb3J0IEludGVybmFsUm91dGluZ092ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBNZXNzYWdlSGFuZGxlck92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IFBhZ2luYXRvck92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9QYWdpbmF0b3JcIjtcbmltcG9ydCBTaGFyZU92ZXJyaWRlcyBmcm9tIFwiLi9vdmVycmlkZXMvU2hhcmVcIjtcbmltcG9ydCBWaWV3U3RhdGVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1ZpZXdTdGF0ZVwiO1xuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZUNvbnRyb2xsZXJcIilcbmNsYXNzIE9iamVjdFBhZ2VDb250cm9sbGVyIGV4dGVuZHMgUGFnZUNvbnRyb2xsZXIge1xuXHRvVmlldyE6IGFueTtcblx0QHVzaW5nRXh0ZW5zaW9uKFBsYWNlaG9sZGVyKVxuXHRwbGFjZWhvbGRlciE6IFBsYWNlaG9sZGVyO1xuXHRAdXNpbmdFeHRlbnNpb24oRWRpdEZsb3cpXG5cdGVkaXRGbG93ITogRWRpdEZsb3c7XG5cdEB1c2luZ0V4dGVuc2lvbihTaGFyZS5vdmVycmlkZShTaGFyZU92ZXJyaWRlcykpXG5cdHNoYXJlITogU2hhcmU7XG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlcm5hbEVkaXRGbG93Lm92ZXJyaWRlKEVkaXRGbG93T3ZlcnJpZGVzKSlcblx0X2VkaXRGbG93ITogSW50ZXJuYWxFZGl0Rmxvdztcblx0QHVzaW5nRXh0ZW5zaW9uKEludGVybmFsUm91dGluZy5vdmVycmlkZShJbnRlcm5hbFJvdXRpbmdPdmVycmlkZSkpXG5cdF9yb3V0aW5nITogSW50ZXJuYWxSb3V0aW5nO1xuXHRAdXNpbmdFeHRlbnNpb24oUGFnaW5hdG9yLm92ZXJyaWRlKFBhZ2luYXRvck92ZXJyaWRlKSlcblx0cGFnaW5hdG9yITogUGFnaW5hdG9yO1xuXHRAdXNpbmdFeHRlbnNpb24oTWVzc2FnZUhhbmRsZXIub3ZlcnJpZGUoTWVzc2FnZUhhbmRsZXJPdmVycmlkZSkpXG5cdG1lc3NhZ2VIYW5kbGVyITogTWVzc2FnZUhhbmRsZXI7XG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUpKVxuXHRpbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cdEB1c2luZ0V4dGVuc2lvbihcblx0XHRJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbi5vdmVycmlkZSh7XG5cdFx0XHRnZXROYXZpZ2F0aW9uTW9kZTogZnVuY3Rpb24gKHRoaXM6IEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IGJJc1N0aWNreUVkaXRNb2RlID1cblx0XHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5nZXRTdGlja3lFZGl0TW9kZSAmJlxuXHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXIpLmdldFN0aWNreUVkaXRNb2RlKCk7XG5cdFx0XHRcdHJldHVybiBiSXNTdGlja3lFZGl0TW9kZSA/IFwiZXhwbGFjZVwiIDogdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0X2ludGVudEJhc2VkTmF2aWdhdGlvbiE6IEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXHRAdXNpbmdFeHRlbnNpb24oVmlld1N0YXRlLm92ZXJyaWRlKFZpZXdTdGF0ZU92ZXJyaWRlcykpXG5cdHZpZXdTdGF0ZSE6IFZpZXdTdGF0ZTtcblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdFBhZ2VSZWFkeS5vdmVycmlkZSh7XG5cdFx0XHRpc0NvbnRleHRFeHBlY3RlZDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdHBhZ2VSZWFkeSE6IFBhZ2VSZWFkeTtcblx0QHVzaW5nRXh0ZW5zaW9uKE1hc3NFZGl0KVxuXHRtYXNzRWRpdCE6IE1hc3NFZGl0O1xuXHRwcml2YXRlIG1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcz86IFJlY29yZDxzdHJpbmcsIE9iamVjdFBhZ2VFeHRlbnNpb25BUEk+O1xuXHRwcm90ZWN0ZWQgZXh0ZW5zaW9uQVBJPzogT2JqZWN0UGFnZUV4dGVuc2lvbkFQSTtcblx0cHJpdmF0ZSBvUmVzb3VyY2VCdW5kbGU/OiBSZXNvdXJjZUJ1bmRsZTtcblx0cHJpdmF0ZSBiU2VjdGlvbk5hdmlnYXRlZD86IGJvb2xlYW47XG5cdHByaXZhdGUgc3dpdGNoRHJhZnRBbmRBY3RpdmVQb3BPdmVyPzogUG9wb3Zlcjtcblx0cHJpdmF0ZSBjdXJyZW50QmluZGluZz86IEJpbmRpbmc7XG5cdHByaXZhdGUgbWVzc2FnZUJ1dHRvbjogYW55O1xuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRFeHRlbnNpb25BUEkoc0lkPzogc3RyaW5nKTogRXh0ZW5zaW9uQVBJIHtcblx0XHRpZiAoc0lkKSB7XG5cdFx0XHQvLyB0byBhbGxvdyBsb2NhbCBJRCB1c2FnZSBmb3IgY3VzdG9tIHBhZ2VzIHdlJ2xsIGNyZWF0ZS9yZXR1cm4gb3duIGluc3RhbmNlcyBmb3IgY3VzdG9tIHNlY3Rpb25zXG5cdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyA9IHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzIHx8IHt9O1xuXG5cdFx0XHRpZiAoIXRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0pIHtcblx0XHRcdFx0dGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXSA9IG5ldyBFeHRlbnNpb25BUEkodGhpcywgc0lkKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIXRoaXMuZXh0ZW5zaW9uQVBJKSB7XG5cdFx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJID0gbmV3IEV4dGVuc2lvbkFQSSh0aGlzKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbkFQSTtcblx0XHR9XG5cdH1cblxuXHRvbkluaXQoKSB7XG5cdFx0c3VwZXIub25Jbml0KCk7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXG5cdFx0Ly8gU2V0dGluZyBkZWZhdWx0cyBvZiBpbnRlcm5hbCBtb2RlbCBjb250ZXh0XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwiZXh0ZXJuYWxOYXZpZ2F0aW9uQ29udGV4dFwiLCB7IFwicGFnZVwiOiB0cnVlIH0pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJyZWxhdGVkQXBwc1wiLCB7XG5cdFx0XHR2aXNpYmlsaXR5OiBmYWxzZSxcblx0XHRcdGl0ZW1zOiBudWxsXG5cdFx0fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcImJhdGNoR3JvdXBzXCIsIHRoaXMuX2dldEJhdGNoR3JvdXBzRm9yVmlldygpKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIiwgZmFsc2UpO1xuXHRcdGlmICghKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS51c2VOZXdMYXp5TG9hZGluZyAmJiAob09iamVjdFBhZ2UgYXMgYW55KS5nZXRFbmFibGVMYXp5TG9hZGluZygpKSB7XG5cdFx0XHQvL0F0dGFjaGluZyB0aGUgZXZlbnQgdG8gbWFrZSB0aGUgc3Vic2VjdGlvbiBjb250ZXh0IGJpbmRpbmcgYWN0aXZlIHdoZW4gaXQgaXMgdmlzaWJsZS5cblx0XHRcdG9PYmplY3RQYWdlLmF0dGFjaEV2ZW50KFwic3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydFwiLCB0aGlzLl9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0LmJpbmQodGhpcykpO1xuXHRcdH1cblx0XHR0aGlzLm1lc3NhZ2VCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6OkZvb3RlckJhcjo6TWVzc2FnZUJ1dHRvblwiKTtcblx0XHR0aGlzLm1lc3NhZ2VCdXR0b24ub0l0ZW1CaW5kaW5nLmF0dGFjaENoYW5nZSh0aGlzLl9mblNob3dPUE1lc3NhZ2UsIHRoaXMpO1xuXHR9XG5cblx0b25FeGl0KCkge1xuXHRcdGlmICh0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcykge1xuXHRcdFx0Zm9yIChjb25zdCBzSWQgb2YgT2JqZWN0LmtleXModGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMpKSB7XG5cdFx0XHRcdGlmICh0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdKSB7XG5cdFx0XHRcdFx0dGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXS5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGRlbGV0ZSB0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcztcblx0XHR9XG5cdFx0aWYgKHRoaXMuZXh0ZW5zaW9uQVBJKSB7XG5cdFx0XHR0aGlzLmV4dGVuc2lvbkFQSS5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdGRlbGV0ZSB0aGlzLmV4dGVuc2lvbkFQSTtcblxuXHRcdGNvbnN0IG9NZXNzYWdlUG9wb3ZlciA9IHRoaXMubWVzc2FnZUJ1dHRvbiA/IHRoaXMubWVzc2FnZUJ1dHRvbi5vTWVzc2FnZVBvcG92ZXIgOiBudWxsO1xuXHRcdGlmIChvTWVzc2FnZVBvcG92ZXIgJiYgb01lc3NhZ2VQb3BvdmVyLmlzT3BlbigpKSB7XG5cdFx0XHRvTWVzc2FnZVBvcG92ZXIuY2xvc2UoKTtcblx0XHR9XG5cdFx0Ly93aGVuIGV4aXRpbmcgd2Ugc2V0IGtlZXBBbGl2ZSBjb250ZXh0IHRvIGZhbHNlXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0aWYgKG9Db250ZXh0ICYmIG9Db250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0fVxuXHRcdGlmIChpc0Nvbm5lY3RlZCh0aGlzLmdldFZpZXcoKSkpIHtcblx0XHRcdGRpc2Nvbm5lY3QodGhpcy5nZXRWaWV3KCkpOyAvLyBDbGVhbnVwIGNvbGxhYm9yYXRpb24gY29ubmVjdGlvbiB3aGVuIGxlYXZpbmcgdGhlIGFwcFxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gc2hvdyB0aGUgbWVzc2FnZSBzdHJpcCBvbiB0aGUgb2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZm5TaG93T1BNZXNzYWdlKCkge1xuXHRcdGNvbnN0IGV4dGVuc2lvbkFQSSA9IHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCk7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlQnV0dG9uLm9NZXNzYWdlUG9wb3ZlclxuXHRcdFx0LmdldEl0ZW1zKClcblx0XHRcdC5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5nZXRCaW5kaW5nQ29udGV4dChcIm1lc3NhZ2VcIikuZ2V0T2JqZWN0KCkpXG5cdFx0XHQuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFRhcmdldHMoKVswXSA9PT0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0XHR9KTtcblxuXHRcdGlmIChleHRlbnNpb25BUEkpIHtcblx0XHRcdGV4dGVuc2lvbkFQSS5zaG93TWVzc2FnZXMobWVzc2FnZXMpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRUYWJsZUJpbmRpbmcob1RhYmxlOiBhbnkpIHtcblx0XHRyZXR1cm4gb1RhYmxlICYmIG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdH1cblxuXHRvbkJlZm9yZVJlbmRlcmluZygpIHtcblx0XHRQYWdlQ29udHJvbGxlci5wcm90b3R5cGUub25CZWZvcmVSZW5kZXJpbmcuYXBwbHkodGhpcyk7XG5cdFx0Ly8gSW4gdGhlIHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Qgc2NlbmFyaW8gd2UgbmVlZCB0byBlbnN1cmUgaW4gY2FzZSBvZiByZWxvYWQvcmVmcmVzaCB0aGF0IHRoZSBtZXRhIG1vZGVsIGluIHRoZSBtZXRob2RlIHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Qgb2YgdGhlIEZpZWxkUnVudGltZSBpcyBhdmFpbGFibGVcblx0XHRpZiAodGhpcy5vVmlldy5vVmlld0RhdGE/LnJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QgJiYgQ29tbW9uSGVscGVyLmdldE1ldGFNb2RlbCgpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdENvbW1vbkhlbHBlci5zZXRNZXRhTW9kZWwodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0fVxuXHR9XG5cblx0b25BZnRlclJlbmRlcmluZygpIHtcblx0XHQoKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMub1Jlc291cmNlQnVuZGxlID0gcmVzcG9uc2U7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSByZXNvdXJjZSBidW5kbGVcIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0X29uQmVmb3JlQmluZGluZyhvQ29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Ly8gVE9ETzogd2Ugc2hvdWxkIGNoZWNrIGhvdyB0aGlzIGNvbWVzIHRvZ2V0aGVyIHdpdGggdGhlIHRyYW5zYWN0aW9uIGhlbHBlciwgc2FtZSB0byB0aGUgY2hhbmdlIGluIHRoZSBhZnRlckJpbmRpbmdcblx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZmluZFRhYmxlcygpLFxuXHRcdFx0b09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLFxuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdG9JbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWwsXG5cdFx0XHRhQmF0Y2hHcm91cHMgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJiYXRjaEdyb3Vwc1wiKSxcblx0XHRcdGlWaWV3TGV2ZWwgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnZpZXdMZXZlbDtcblx0XHRsZXQgb0Zhc3RDcmVhdGlvblJvdztcblx0XHRhQmF0Y2hHcm91cHMucHVzaChcIiRhdXRvXCIpO1xuXHRcdGlmIChtUGFyYW1ldGVycy5iRHJhZnROYXZpZ2F0aW9uICE9PSB0cnVlKSB7XG5cdFx0XHR0aGlzLl9jbG9zZVNpZGVDb250ZW50KCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9wQ29udGV4dCA9IG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRpZiAoXG5cdFx0XHRvcENvbnRleHQgJiZcblx0XHRcdG9wQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpICYmXG5cdFx0XHQhYUJhdGNoR3JvdXBzLnNvbWUoKG9wQ29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmhhc1BlbmRpbmdDaGFuZ2VzLmJpbmQob3BDb250ZXh0LmdldE1vZGVsKCkpKVxuXHRcdCkge1xuXHRcdFx0LyogXHRJbiBjYXNlIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgZm9yIHRoZSBjcmVhdGlvbiByb3cgYW5kIG5vIG90aGVycyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBjaGFuZ2VzXG4gICAgXHRcdFx0XHRcdFx0VE9ETzogdGhpcyBpcyBqdXN0IGEgcXVpY2sgc29sdXRpb24sIHRoaXMgbmVlZHMgdG8gYmUgcmV3b3JrZWRcbiAgICBcdFx0XHRcdCBcdCovXG5cblx0XHRcdG9wQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIG5vdyB3ZSBoYXZlIHRvIHNldCB0aGUgYmluZGluZyBjb250ZXh0IHRvIG51bGwgZm9yIGV2ZXJ5IGZhc3QgY3JlYXRpb24gcm93XG5cdFx0Ly8gVE9ETzogR2V0IHJpZCBvZiB0aGlzIGNvZGluZyBvciBtb3ZlIGl0IHRvIGFub3RoZXIgbGF5ZXIgLSB0byBiZSBkaXNjdXNzZWQgd2l0aCBNREMgYW5kIG1vZGVsXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhVGFibGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvRmFzdENyZWF0aW9uUm93ID0gYVRhYmxlc1tpXS5nZXRDcmVhdGlvblJvdygpO1xuXHRcdFx0aWYgKG9GYXN0Q3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0b0Zhc3RDcmVhdGlvblJvdy5zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTY3JvbGwgdG8gcHJlc2VudCBTZWN0aW9uIHNvIHRoYXQgYmluZGluZ3MgYXJlIGVuYWJsZWQgZHVyaW5nIG5hdmlnYXRpb24gdGhyb3VnaCBwYWdpbmF0b3IgYnV0dG9ucywgYXMgdGhlcmUgaXMgbm8gdmlldyByZXJlbmRlcmluZy9yZWJpbmRcblx0XHRjb25zdCBmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoIShvT2JqZWN0UGFnZSBhcyBhbnkpLmlzRmlyc3RSZW5kZXJpbmcoKSAmJiAhbVBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCkge1xuXHRcdFx0XHRvT2JqZWN0UGFnZS5zZXRTZWxlY3RlZFNlY3Rpb24obnVsbCBhcyBhbnkpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0b09iamVjdFBhZ2UuYXR0YWNoRXZlbnRPbmNlKFwibW9kZWxDb250ZXh0Q2hhbmdlXCIsIGZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvbik7XG5cblx0XHQvLyBpZiB0aGUgc3RydWN0dXJlIG9mIHRoZSBPYmplY3RQYWdlTGF5b3V0IGlzIGNoYW5nZWQgdGhlbiBzY3JvbGwgdG8gcHJlc2VudCBTZWN0aW9uXG5cdFx0Ly8gRklYTUUgSXMgdGhpcyByZWFsbHkgd29ya2luZyBhcyBpbnRlbmRlZCA/IEluaXRpYWxseSB0aGlzIHdhcyBvbkJlZm9yZVJlbmRlcmluZywgYnV0IG5ldmVyIHRyaWdnZXJlZCBvbkJlZm9yZVJlbmRlcmluZyBiZWNhdXNlIGl0IHdhcyByZWdpc3RlcmVkIGFmdGVyIGl0XG5cdFx0Y29uc3Qgb0RlbGVnYXRlT25CZWZvcmUgPSB7XG5cdFx0XHRvbkFmdGVyUmVuZGVyaW5nOiBmblNjcm9sbFRvUHJlc2VudFNlY3Rpb25cblx0XHR9O1xuXHRcdG9PYmplY3RQYWdlLmFkZEV2ZW50RGVsZWdhdGUob0RlbGVnYXRlT25CZWZvcmUsIHRoaXMpO1xuXHRcdHRoaXMucGFnZVJlYWR5LmF0dGFjaEV2ZW50T25jZShcInBhZ2VSZWFkeVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRvT2JqZWN0UGFnZS5yZW1vdmVFdmVudERlbGVnYXRlKG9EZWxlZ2F0ZU9uQmVmb3JlKTtcblx0XHR9KTtcblxuXHRcdC8vU2V0IHRoZSBCaW5kaW5nIGZvciBQYWdpbmF0b3JzIHVzaW5nIExpc3RCaW5kaW5nIElEXG5cdFx0aWYgKGlWaWV3TGV2ZWwgPiAxKSB7XG5cdFx0XHRsZXQgb0JpbmRpbmcgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5saXN0QmluZGluZztcblx0XHRcdGNvbnN0IG9QYWdpbmF0b3JDdXJyZW50Q29udGV4dCA9IG9JbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIpO1xuXHRcdFx0aWYgKG9QYWdpbmF0b3JDdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBvQmluZGluZ1RvVXNlID0gb1BhZ2luYXRvckN1cnJlbnRDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZShvQmluZGluZ1RvVXNlLCBvUGFnaW5hdG9yQ3VycmVudENvbnRleHQpO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcpIHtcblx0XHRcdFx0aWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZShvQmluZGluZywgb0NvbnRleHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGlmIHRoZSBiaW5kaW5nIHR5cGUgaXMgbm90IE9EYXRhTGlzdEJpbmRpbmcgYmVjYXVzZSBvZiBhIGRlZXBsaW5rIG5hdmlnYXRpb24gb3IgYSByZWZyZXNoIG9mIHRoZSBwYWdlXG5cdFx0XHRcdFx0Ly8gd2UgbmVlZCB0byBjcmVhdGUgaXRcblx0XHRcdFx0XHRjb25zdCBzQmluZGluZ1BhdGggPSBvQmluZGluZy5nZXRQYXRoKCk7XG5cdFx0XHRcdFx0aWYgKC9cXChbXlxcKV0qXFwpJC8udGVzdChzQmluZGluZ1BhdGgpKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgY3VycmVudCBiaW5kaW5nIHBhdGggZW5kcyB3aXRoICh4eHgpLCBzbyB3ZSBjcmVhdGUgdGhlIGxpc3RCaW5kaW5nIGJ5IHJlbW92aW5nICh4eHgpXG5cdFx0XHRcdFx0XHRjb25zdCBzTGlzdEJpbmRpbmdQYXRoID0gc0JpbmRpbmdQYXRoLnJlcGxhY2UoL1xcKFteXFwpXSpcXCkkLywgXCJcIik7XG5cdFx0XHRcdFx0XHRvQmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKG9CaW5kaW5nLm9Nb2RlbCwgc0xpc3RCaW5kaW5nUGF0aCk7XG5cdFx0XHRcdFx0XHRjb25zdCBfc2V0TGlzdEJpbmRpbmdBc3luYyA9ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKG9CaW5kaW5nLmdldENvbnRleHRzKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGFnaW5hdG9yLmluaXRpYWxpemUob0JpbmRpbmcsIG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRvQmluZGluZy5kZXRhY2hFdmVudChcImNoYW5nZVwiLCBfc2V0TGlzdEJpbmRpbmdBc3luYyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdG9CaW5kaW5nLmdldENvbnRleHRzKDApO1xuXHRcdFx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJjaGFuZ2VcIiwgX3NldExpc3RCaW5kaW5nQXN5bmMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgY3VycmVudCBiaW5kaW5nIGRvZXNuJ3QgZW5kIHdpdGggKHh4eCkgLS0+IHRoZSBsYXN0IHNlZ21lbnQgaXMgYSAxLTEgbmF2aWdhdGlvbiwgc28gd2UgZG9uJ3QgZGlzcGxheSB0aGUgcGFnaW5hdG9yXG5cdFx0XHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS51c2VOZXdMYXp5TG9hZGluZyAmJiBvT2JqZWN0UGFnZS5nZXRFbmFibGVMYXp5TG9hZGluZygpKSB7XG5cdFx0XHRjb25zdCBhU2VjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpO1xuXHRcdFx0Y29uc3QgYlVzZUljb25UYWJCYXIgPSBvT2JqZWN0UGFnZS5nZXRVc2VJY29uVGFiQmFyKCk7XG5cdFx0XHRsZXQgaVNraXAgPSAyO1xuXHRcdFx0Y29uc3QgYklzSW5FZGl0TW9kZSA9IG9PYmplY3RQYWdlLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblx0XHRcdGNvbnN0IGJFZGl0YWJsZUhlYWRlciA9ICh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZWRpdGFibGVIZWFkZXJDb250ZW50O1xuXHRcdFx0Zm9yIChsZXQgaVNlY3Rpb24gPSAwOyBpU2VjdGlvbiA8IGFTZWN0aW9ucy5sZW5ndGg7IGlTZWN0aW9uKyspIHtcblx0XHRcdFx0Y29uc3Qgb1NlY3Rpb24gPSBhU2VjdGlvbnNbaVNlY3Rpb25dO1xuXHRcdFx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpO1xuXHRcdFx0XHRmb3IgKGxldCBpU3ViU2VjdGlvbiA9IDA7IGlTdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgaVN1YlNlY3Rpb24rKywgaVNraXAtLSkge1xuXHRcdFx0XHRcdC8vIEluIEljb25UYWJCYXIgbW9kZSBrZWVwIHRoZSBzZWNvbmQgc2VjdGlvbiBib3VuZCBpZiB0aGVyZSBpcyBhbiBlZGl0YWJsZSBoZWFkZXIgYW5kIHdlIGFyZSBzd2l0Y2hpbmcgdG8gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0aWYgKGlTa2lwIDwgMSB8fCAoYlVzZUljb25UYWJCYXIgJiYgKGlTZWN0aW9uID4gMSB8fCAoaVNlY3Rpb24gPT09IDEgJiYgIWJFZGl0YWJsZUhlYWRlciAmJiAhYklzSW5FZGl0TW9kZSkpKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBhU3ViU2VjdGlvbnNbaVN1YlNlY3Rpb25dO1xuXHRcdFx0XHRcdFx0aWYgKG9TdWJTZWN0aW9uLmRhdGEoKS5pc1Zpc2liaWxpdHlEeW5hbWljICE9PSBcInRydWVcIikge1xuXHRcdFx0XHRcdFx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dChudWxsIGFzIGFueSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMucGxhY2Vob2xkZXIuaXNQbGFjZWhvbGRlckVuYWJsZWQoKSAmJiBtUGFyYW1ldGVycy5zaG93UGxhY2Vob2xkZXIpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRjb25zdCBvTmF2Q29udGFpbmVyID0gKG9WaWV3LmdldFBhcmVudCgpIGFzIGFueSkub0NvbnRhaW5lci5nZXRQYXJlbnQoKTtcblx0XHRcdGlmIChvTmF2Q29udGFpbmVyKSB7XG5cdFx0XHRcdG9OYXZDb250YWluZXIuc2hvd1BsYWNlaG9sZGVyKHt9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50KG9PYmplY3RQYWdlOiBhbnkpIHtcblx0XHRsZXQgb0ZpcnN0Q2xpY2thYmxlRWxlbWVudDtcblx0XHRjb25zdCBhQWN0aW9ucyA9IG9PYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkgJiYgb09iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKS5nZXRBY3Rpb25zKCk7XG5cdFx0aWYgKGFBY3Rpb25zICYmIGFBY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0b0ZpcnN0Q2xpY2thYmxlRWxlbWVudCA9IGFBY3Rpb25zLmZpbmQoZnVuY3Rpb24gKG9BY3Rpb246IGFueSkge1xuXHRcdFx0XHQvLyBEdWUgdG8gdGhlIGxlZnQgYWxpZ25tZW50IG9mIHRoZSBEcmFmdCBzd2l0Y2ggYW5kIHRoZSBjb2xsYWJvcmF0aXZlIGRyYWZ0IGF2YXRhciBjb250cm9sc1xuXHRcdFx0XHQvLyB0aGVyZSBpcyBhIFRvb2xiYXJTcGFjZXIgaW4gdGhlIGFjdGlvbnMgYWdncmVnYXRpb24gd2hpY2ggd2UgbmVlZCB0byBleGNsdWRlIGhlcmUhXG5cdFx0XHRcdC8vIER1ZSB0byB0aGUgQUNDIHJlcG9ydCwgd2UgYWxzbyBuZWVkIG5vdCB0byBjaGVjayBmb3IgdGhlIEludmlzaWJsZVRleHQgZWxlbWVudHNcblx0XHRcdFx0aWYgKG9BY3Rpb24uaXNBKFwic2FwLmZlLm1hY3Jvcy5TaGFyZUFQSVwiKSkge1xuXHRcdFx0XHRcdC8vIHNpbmNlIFNoYXJlQVBJIGRvZXMgbm90IGhhdmUgYSBkaXNhYmxlIHByb3BlcnR5XG5cdFx0XHRcdFx0Ly8gaGVuY2UgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZiBpdCBpcyBkaXNiYWxlZCBvciBub3Rcblx0XHRcdFx0XHRyZXR1cm4gb0FjdGlvbi5nZXRWaXNpYmxlKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIW9BY3Rpb24uaXNBKFwic2FwLnVpLmNvcmUuSW52aXNpYmxlVGV4dFwiKSAmJiAhb0FjdGlvbi5pc0EoXCJzYXAubS5Ub29sYmFyU3BhY2VyXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0VmlzaWJsZSgpICYmIG9BY3Rpb24uZ2V0RW5hYmxlZCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9GaXJzdENsaWNrYWJsZUVsZW1lbnQ7XG5cdH1cblxuXHRfZ2V0Rmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkRnJvbVN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zOiBhbnkpIHtcblx0XHRpZiAoYVN1YlNlY3Rpb25zKSB7XG5cdFx0XHRmb3IgKGxldCBzdWJTZWN0aW9uID0gMDsgc3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IHN1YlNlY3Rpb24rKykge1xuXHRcdFx0XHRjb25zdCBhQmxvY2tzID0gYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldEJsb2NrcygpO1xuXG5cdFx0XHRcdGlmIChhQmxvY2tzKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgYmxvY2sgPSAwOyBibG9jayA8IGFCbG9ja3MubGVuZ3RoOyBibG9jaysrKSB7XG5cdFx0XHRcdFx0XHRsZXQgYUZvcm1Db250YWluZXJzO1xuXG5cdFx0XHRcdFx0XHRpZiAoYUJsb2Nrc1tibG9ja10uaXNBKFwic2FwLnVpLmxheW91dC5mb3JtLkZvcm1cIikpIHtcblx0XHRcdFx0XHRcdFx0YUZvcm1Db250YWluZXJzID0gYUJsb2Nrc1tibG9ja10uZ2V0Rm9ybUNvbnRhaW5lcnMoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQgJiZcblx0XHRcdFx0XHRcdFx0YUJsb2Nrc1tibG9ja10uZ2V0Q29udGVudCgpICYmXG5cdFx0XHRcdFx0XHRcdGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQoKS5pc0EoXCJzYXAudWkubGF5b3V0LmZvcm0uRm9ybVwiKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGFGb3JtQ29udGFpbmVycyA9IGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQoKS5nZXRGb3JtQ29udGFpbmVycygpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoYUZvcm1Db250YWluZXJzKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGZvcm1Db250YWluZXIgPSAwOyBmb3JtQ29udGFpbmVyIDwgYUZvcm1Db250YWluZXJzLmxlbmd0aDsgZm9ybUNvbnRhaW5lcisrKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgYUZvcm1FbGVtZW50cyA9IGFGb3JtQ29udGFpbmVyc1tmb3JtQ29udGFpbmVyXS5nZXRGb3JtRWxlbWVudHMoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoYUZvcm1FbGVtZW50cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgZm9ybUVsZW1lbnQgPSAwOyBmb3JtRWxlbWVudCA8IGFGb3JtRWxlbWVudHMubGVuZ3RoOyBmb3JtRWxlbWVudCsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGaWVsZHMgPSBhRm9ybUVsZW1lbnRzW2Zvcm1FbGVtZW50XS5nZXRGaWVsZHMoKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgZmlyc3QgZmllbGQgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIElucHV0QmFzZSAoZS5nLiBjb3VsZCBiZSBhIFRleHQpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFNvIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBpdCBoYXMgYSBnZXRSZXF1aXJlZCBtZXRob2Rcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUZpZWxkc1swXS5nZXRSZXF1aXJlZCAmJiBhRmllbGRzWzBdLmdldFJlcXVpcmVkKCkgJiYgIWFGaWVsZHNbMF0uZ2V0VmFsdWUoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFGaWVsZHNbMF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5kZWJ1ZyhgRXJyb3Igd2hlbiBzZWFyY2hpbmcgZm9yIG1hbmRhb3RyeSBlbXB0eSBmaWVsZDogJHtlcnJvcn1gKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0X3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShhU3ViU2VjdGlvbnM6IGFueSkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblxuXHRcdGNvbnN0IG9NYW5kYXRvcnlGaWVsZCA9IHRoaXMuX2dldEZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZEZyb21TdWJTZWN0aW9uKGFTdWJTZWN0aW9ucyk7XG5cdFx0bGV0IG9GaWVsZFRvRm9jdXM6IGFueTtcblx0XHRpZiAob01hbmRhdG9yeUZpZWxkKSB7XG5cdFx0XHRvRmllbGRUb0ZvY3VzID0gb01hbmRhdG9yeUZpZWxkLmNvbnRlbnQuZ2V0Q29udGVudEVkaXQoKVswXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IChvT2JqZWN0UGFnZSBhcyBhbnkpLl9nZXRGaXJzdEVkaXRhYmxlSW5wdXQoKSB8fCB0aGlzLl9nZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQob09iamVjdFBhZ2UpO1xuXHRcdH1cblxuXHRcdGlmIChvRmllbGRUb0ZvY3VzKSB7XG5cdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Ly8gV2Ugc2V0IHRoZSBmb2N1cyBpbiBhIHRpbWVlb3V0LCBvdGhlcndpc2UgdGhlIGZvY3VzIHNvbWV0aW1lcyBnb2VzIHRvIHRoZSBUYWJCYXJcblx0XHRcdFx0b0ZpZWxkVG9Gb2N1cy5mb2N1cygpO1xuXHRcdFx0fSwgMCk7XG5cdFx0fVxuXHR9XG5cblx0X2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQob0V2ZW50OiBhbnkpIHtcblx0XHRjb25zdCBvU3ViU2VjdGlvbiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWJTZWN0aW9uXCIpO1xuXHRcdG9TdWJTZWN0aW9uLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCk7XG5cdH1cblxuXHRfb25CYWNrTmF2aWdhdGlvbkluRHJhZnQob0NvbnRleHQ6IGFueSkge1xuXHRcdHRoaXMubWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0aWYgKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKS5jaGVja0lmQmFja0hhc1NhbWVDb250ZXh0KCkpIHtcblx0XHRcdC8vIEJhY2sgbmF2IHdpbGwga2VlcCB0aGUgc2FtZSBjb250ZXh0IC0tPiBubyBuZWVkIHRvIGRpc3BsYXkgdGhlIGRpYWxvZ1xuXHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRyYWZ0LnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRkcmFmdC5OYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdF9vbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZmluZFRhYmxlcygpO1xuXG5cdFx0dGhpcy5fc2lkZUVmZmVjdHMuY2xlYXJQcm9wZXJ0aWVzU3RhdHVzKCk7XG5cblx0XHQvLyBUT0RPOiB0aGlzIGlzIG9ubHkgYSB0ZW1wIHNvbHV0aW9uIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGZpeCB0aGUgY2FjaGUgaXNzdWUgYW5kIHdlIHVzZSB0aGlzIGFkZGl0aW9uYWxcblx0XHQvLyBiaW5kaW5nIHdpdGggb3duUmVxdWVzdFxuXHRcdG9CaW5kaW5nQ29udGV4dCA9IG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRsZXQgYUlCTkFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0b09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU2VjdGlvbjogYW55KSB7XG5cdFx0XHRvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TdWJTZWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9TdWJTZWN0aW9uLCBhSUJOQWN0aW9ucyk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdC8vIEFzc2lnbiBpbnRlcm5hbCBiaW5kaW5nIGNvbnRleHRzIHRvIG9Gb3JtQ29udGFpbmVyOlxuXHRcdC8vIDEuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhc3NpZ24gdGhlIGludGVybmFsIGJpbmRpbmcgY29udGV4dCB0byB0aGUgWE1MIGZyYWdtZW50XG5cdFx0Ly8gKEZvcm1Db250YWluZXIuZnJhZ21lbnQueG1sKSB5ZXQgLSBpdCBpcyB1c2VkIGFscmVhZHkgZm9yIHRoZSBkYXRhLXN0cnVjdHVyZS5cblx0XHQvLyAyLiBBbm90aGVyIHByb2JsZW0gaXMsIHRoYXQgRm9ybUNvbnRhaW5lcnMgYXNzaWduZWQgdG8gYSAnTW9yZUJsb2NrJyBkb2VzIG5vdCBoYXZlIGFuXG5cdFx0Ly8gaW50ZXJuYWwgbW9kZWwgY29udGV4dCBhdCBhbGwuXG5cblx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIsIHt9KTtcblxuXHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9UYWJsZSwgYUlCTkFjdGlvbnMpO1xuXHRcdFx0Ly8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIEJDUDogMjA4MDIxODAwNFxuXHRcdFx0Ly8gTmVlZCB0byBmaXggd2l0aCBCTEk6IEZJT1JJVEVDSFAxLTE1Mjc0XG5cdFx0XHQvLyBvbmx5IGZvciBlZGl0IG1vZGUsIHdlIGNsZWFyIHRoZSB0YWJsZSBjYWNoZVxuXHRcdFx0Ly8gV29ya2Fyb3VuZCBzdGFydHMgaGVyZSEhXG5cdFx0XHRjb25zdCBvVGFibGVSb3dCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGlmIChvVGFibGVSb3dCaW5kaW5nKSB7XG5cdFx0XHRcdGlmIChNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob1RhYmxlUm93QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdC8vIGFwcGx5IGZvciBib3RoIGVkaXQgYW5kIGRpc3BsYXkgbW9kZSBpbiBzdGlja3lcblx0XHRcdFx0XHRvVGFibGVSb3dCaW5kaW5nLnJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzKFwiXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBXb3JrYXJvdW5kIGVuZHMgaGVyZSEhXG5cblx0XHRcdC8vIFVwZGF0ZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgRGF0YUZpZWxkRm9yQWN0aW9uIGJ1dHRvbnMgb24gdGFibGUgdG9vbGJhclxuXHRcdFx0Ly8gVGhlIHNhbWUgaXMgYWxzbyBwZXJmb3JtZWQgb24gVGFibGUgc2VsZWN0aW9uQ2hhbmdlIGV2ZW50XG5cdFx0XHRjb25zdCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gSlNPTi5wYXJzZShcblx0XHRcdFx0XHRDb21tb25IZWxwZXIucGFyc2VDdXN0b21EYXRhKERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhKG9UYWJsZSwgXCJvcGVyYXRpb25BdmFpbGFibGVNYXBcIikpXG5cdFx0XHRcdCksXG5cdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzID0gb1RhYmxlLmdldFNlbGVjdGVkQ29udGV4dHMoKTtcblxuXHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgYVNlbGVjdGVkQ29udGV4dHMsIFwidGFibGVcIik7XG5cdFx0XHQvLyBDbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSwgbmVlZCB0byBiZSBmaXhlZCBhbmQgcmV2aWV3IHdpdGggQkxJOiBGSU9SSVRFQ0hQMS0yNDMxOFxuXHRcdFx0b1RhYmxlLmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0fSk7XG5cdFx0Q29tbW9uVXRpbHMuZ2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbCh0aGlzLCBcIl9wYWdlTW9kZWxcIik7XG5cdFx0Ly9SZXRyaWV2ZSBPYmplY3QgUGFnZSBoZWFkZXIgYWN0aW9ucyBmcm9tIE9iamVjdCBQYWdlIHRpdGxlIGNvbnRyb2xcblx0XHRjb25zdCBvT2JqZWN0UGFnZVRpdGxlID0gb09iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKTtcblx0XHRsZXQgYUlCTkhlYWRlckFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0YUlCTkhlYWRlckFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9PYmplY3RQYWdlVGl0bGUsIGFJQk5IZWFkZXJBY3Rpb25zKTtcblx0XHRhSUJOQWN0aW9ucyA9IGFJQk5BY3Rpb25zLmNvbmNhdChhSUJOSGVhZGVyQWN0aW9ucyk7XG5cdFx0Q29tbW9uVXRpbHMudXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkoYUlCTkFjdGlvbnMsIHRoaXMuZ2V0VmlldygpKTtcblxuXHRcdGxldCBvTW9kZWw6IGFueSwgb0ZpbmFsVUlTdGF0ZTogYW55O1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzaG91bGQgYmUgbW92ZWQgaW50byBhbiBpbml0IGV2ZW50IG9mIHRoZSBNREMgdGFibGVzIChub3QgeWV0IGV4aXN0aW5nKSBhbmQgc2hvdWxkIGJlIHBhcnRcblx0XHQvLyBvZiBhbnkgY29udHJvbGxlciBleHRlbnNpb25cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb1RhYmxlXG5cdFx0ICogQHBhcmFtIG9MaXN0QmluZGluZ1xuXHRcdCAqL1xuXHRcdGFzeW5jIGZ1bmN0aW9uIGVuYWJsZUZhc3RDcmVhdGlvblJvdyhvVGFibGU6IGFueSwgb0xpc3RCaW5kaW5nOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9GYXN0Q3JlYXRpb25Sb3cgPSBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRcdGxldCBvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcsIG9GYXN0Q3JlYXRpb25Db250ZXh0O1xuXG5cdFx0XHRpZiAob0Zhc3RDcmVhdGlvblJvdykge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IG9GaW5hbFVJU3RhdGU7XG5cdFx0XHRcdFx0aWYgKG9GYXN0Q3JlYXRpb25Sb3cuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0XHRvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3Qob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0xpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJkb05vdFN1Ym1pdFwiLFxuXHRcdFx0XHRcdFx0XHQkJGdyb3VwSWQ6IFwiZG9Ob3RTdWJtaXRcIlxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHQvLyBXb3JrYXJvdW5kIHN1Z2dlc3RlZCBieSBPRGF0YSBtb2RlbCB2NCBjb2xsZWFndWVzXG5cdFx0XHRcdFx0XHRvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHQvKiBkbyBub3RoaW5nICovXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0b0Zhc3RDcmVhdGlvbkNvbnRleHQgPSBvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcuY3JlYXRlKCk7XG5cdFx0XHRcdFx0XHRvRmFzdENyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG9GYXN0Q3JlYXRpb25Db250ZXh0KTtcblxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29uc29sZSBlcnJvclxuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgb0Zhc3RDcmVhdGlvbkNvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNvbXB1dGluZyB0aGUgZmluYWwgVUkgc3RhdGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYXQgdGhlIGFsbFxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvVGFibGVcblx0XHQgKi9cblx0XHRjb25zdCBoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMgPSAob1RhYmxlOiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gdGhpcy5fZ2V0VGFibGVCaW5kaW5nKG9UYWJsZSksXG5cdFx0XHRcdGZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRlbmFibGVGYXN0Q3JlYXRpb25Sb3cob1RhYmxlLCBvQmluZGluZyk7XG5cdFx0XHRcdH07XG5cblx0XHRcdGlmICghb0JpbmRpbmcpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBFeHBlY3RlZCBiaW5kaW5nIG1pc3NpbmcgZm9yIHRhYmxlOiAke29UYWJsZS5nZXRJZCgpfWApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQmluZGluZy5vQ29udGV4dCkge1xuXHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGZuSGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChvQmluZGluZy5vQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzKCk7XG5cdFx0XHRcdFx0XHRvQmluZGluZy5kZXRhY2hDaGFuZ2UoZm5IYW5kbGVDaGFuZ2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoQ2hhbmdlKGZuSGFuZGxlQ2hhbmdlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0b01vZGVsID0gb0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCk7XG5cblx0XHRcdC8vIENvbXB1dGUgRWRpdCBNb2RlXG5cdFx0XHRvRmluYWxVSVN0YXRlID0gdGhpcy5fZWRpdEZsb3cuY29tcHV0ZUVkaXRNb2RlKG9CaW5kaW5nQ29udGV4dCk7XG5cblx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvTW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdG9GaW5hbFVJU3RhdGVcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbm5lY3QodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChpc0Nvbm5lY3RlZCh0aGlzLmdldFZpZXcoKSkpIHtcblx0XHRcdFx0XHRcdFx0ZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7IC8vIENsZWFudXAgY29sbGFib3JhdGlvbiBjb25uZWN0aW9uIGluIGNhc2Ugd2Ugc3dpdGNoIHRvIGFub3RoZXIgZWxlbWVudCAoZS5nLiBpbiBGQ0wpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgZmluYWwgVUkgU3RhdGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gdXBkYXRlIHJlbGF0ZWQgYXBwcyBvbmNlIERhdGEgaXMgcmVjZWl2ZWQgaW4gY2FzZSBvZiBiaW5kaW5nIGNhY2hlIGlzIG5vdCBhdmFpbGFibGVcblx0XHRcdC8vIFRPRE86IHRoaXMgaXMgb25seSBhIHRlbXAgc29sdXRpb24gc2luY2Ugd2UgbmVlZCB0byBjYWxsIF91cGRhdGVSZWxhdGVkQXBwcyBtZXRob2Qgb25seSBhZnRlciBkYXRhIGZvciBPYmplY3QgUGFnZSBpcyByZWNlaXZlZCAoaWYgdGhlcmUgaXMgbm8gYmluZGluZylcblx0XHRcdGlmIChvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLm9DYWNoZSkge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVSZWxhdGVkQXBwcygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZm5VcGRhdGVSZWxhdGVkQXBwcyA9ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVSZWxhdGVkQXBwcygpO1xuXHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkuZGV0YWNoRGF0YVJlY2VpdmVkKGZuVXBkYXRlUmVsYXRlZEFwcHMpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLmF0dGFjaERhdGFSZWNlaXZlZChmblVwZGF0ZVJlbGF0ZWRBcHBzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9BdHRhY2ggdGhlIHBhdGNoIHNlbnQgYW5kIHBhdGNoIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSAob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcgJiYgb0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSkgfHwgb0JpbmRpbmdDb250ZXh0O1xuXG5cdFx0XHQvLyBBdHRhY2ggdGhlIGV2ZW50IGhhbmRsZXIgb25seSBvbmNlIHRvIHRoZSBzYW1lIGJpbmRpbmdcblx0XHRcdGlmICh0aGlzLmN1cnJlbnRCaW5kaW5nICE9PSBvQmluZGluZykge1xuXHRcdFx0XHRvQmluZGluZy5hdHRhY2hFdmVudChcInBhdGNoU2VudFwiLCB0aGlzLmVkaXRGbG93LmhhbmRsZVBhdGNoU2VudCwgdGhpcyk7XG5cdFx0XHRcdHRoaXMuY3VycmVudEJpbmRpbmcgPSBvQmluZGluZztcblx0XHRcdH1cblxuXHRcdFx0YVRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdFx0XHQvLyBhY2Nlc3MgYmluZGluZyBvbmx5IGFmdGVyIHRhYmxlIGlzIGJvdW5kXG5cdFx0XHRcdFRhYmxlVXRpbHMud2hlbkJvdW5kKG9UYWJsZSlcblx0XHRcdFx0XHQudGhlbihoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMpXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgdGhlIHRhYmxlIHRvIGJlIGJvdW5kXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKCEodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnVzZU5ld0xhenlMb2FkaW5nKSB7XG5cdFx0XHRcdC8vIHNob3VsZCBiZSBjYWxsZWQgb25seSBhZnRlciBiaW5kaW5nIGlzIHJlYWR5IGhlbmNlIGNhbGxpbmcgaXQgaW4gb25BZnRlckJpbmRpbmdcblx0XHRcdFx0KG9PYmplY3RQYWdlIGFzIGFueSkuX3RyaWdnZXJWaXNpYmxlU3ViU2VjdGlvbnNFdmVudHMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUGFnZVJlYWR5KG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBzZXRGb2N1cyA9ICgpID0+IHtcblx0XHRcdC8vIFNldCB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IGFjdGlvbiBidXR0b24sIG9yIHRvIHRoZSBmaXJzdCBlZGl0YWJsZSBpbnB1dCBpZiBpbiBlZGl0YWJsZSBtb2RlXG5cdFx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0XHRjb25zdCBpc0luRGlzcGxheU1vZGUgPSAhb09iamVjdFBhZ2UuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpO1xuXG5cdFx0XHRpZiAoaXNJbkRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSB0aGlzLl9nZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQob09iamVjdFBhZ2UpO1xuXHRcdFx0XHRpZiAob0ZpcnN0Q2xpY2thYmxlRWxlbWVudCkge1xuXHRcdFx0XHRcdG9GaXJzdENsaWNrYWJsZUVsZW1lbnQuZm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb1NlbGVjdGVkU2VjdGlvbjogYW55ID0gQ29yZS5ieUlkKG9PYmplY3RQYWdlLmdldFNlbGVjdGVkU2VjdGlvbigpKTtcblx0XHRcdFx0aWYgKG9TZWxlY3RlZFNlY3Rpb24pIHtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVGb2N1c0luRWRpdE1vZGUob1NlbGVjdGVkU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Ly8gQXBwbHkgYXBwIHN0YXRlIG9ubHkgYWZ0ZXIgdGhlIHBhZ2UgaXMgcmVhZHkgd2l0aCB0aGUgZmlyc3Qgc2VjdGlvbiBzZWxlY3RlZFxuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdC8vU2hvdyBwb3B1cCB3aGlsZSBuYXZpZ2F0aW5nIGJhY2sgZnJvbSBvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGRyYWZ0XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCgob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdFx0aWYgKCFiSXNTdGlja3lNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigoKSA9PiB0aGlzLl9vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdChvQmluZGluZ0NvbnRleHQpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0LmdldEFwcFN0YXRlSGFuZGxlcigpXG5cdFx0XHQuYXBwbHlBcHBTdGF0ZSgpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5mb3JjZUZvY3VzKSB7XG5cdFx0XHRcdFx0c2V0Rm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoRXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2V0dGluZyB0aGUgZm9jdXNcIiwgRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiLCBmYWxzZSk7XG5cdFx0dGhpcy5fY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgc3RhdHVzIG9mIGVkaXQgbW9kZSBmb3Igc3RpY2t5IHNlc3Npb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBzdGF0dXMgb2YgZWRpdCBtb2RlIGZvciBzdGlja3kgc2Vzc2lvblxuXHQgKi9cblx0Z2V0U3RpY2t5RWRpdE1vZGUoKSB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQgJiYgKHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCk7XG5cdFx0bGV0IGJJc1N0aWNreUVkaXRNb2RlID0gZmFsc2U7XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCk7XG5cdFx0XHRpZiAoYklzU3RpY2t5TW9kZSkge1xuXHRcdFx0XHRiSXNTdGlja3lFZGl0TW9kZSA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGJJc1N0aWNreUVkaXRNb2RlO1xuXHR9XG5cblx0X2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBPYmplY3RQYWdlTGF5b3V0O1xuXHR9XG5cblx0X2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZVN1YnRpdGxlID0gb09iamVjdFBhZ2UuZ2V0Q3VzdG9tRGF0YSgpLmZpbmQoZnVuY3Rpb24gKG9DdXN0b21EYXRhOiBhbnkpIHtcblx0XHRcdHJldHVybiBvQ3VzdG9tRGF0YS5nZXRLZXkoKSA9PT0gXCJPYmplY3RQYWdlU3VidGl0bGVcIjtcblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGl0bGU6IG9PYmplY3RQYWdlLmRhdGEoXCJPYmplY3RQYWdlVGl0bGVcIikgfHwgXCJcIixcblx0XHRcdHN1YnRpdGxlOiBvT2JqZWN0UGFnZVN1YnRpdGxlICYmIG9PYmplY3RQYWdlU3VidGl0bGUuZ2V0VmFsdWUoKSxcblx0XHRcdGludGVudDogXCJcIixcblx0XHRcdGljb246IFwiXCJcblx0XHR9O1xuXHR9XG5cblx0X2V4ZWN1dGVIZWFkZXJTaG9ydGN1dChzSWQ6IGFueSkge1xuXHRcdGNvbnN0IHNCdXR0b25JZCA9IGAke3RoaXMuZ2V0VmlldygpLmdldElkKCl9LS0ke3NJZH1gLFxuXHRcdFx0b0J1dHRvbiA9ICh0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldEhlYWRlclRpdGxlKCkgYXMgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZSlcblx0XHRcdFx0LmdldEFjdGlvbnMoKVxuXHRcdFx0XHQuZmluZChmdW5jdGlvbiAob0VsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvRWxlbWVudC5nZXRJZCgpID09PSBzQnV0dG9uSWQ7XG5cdFx0XHRcdH0pO1xuXHRcdENvbW1vblV0aWxzLmZpcmVCdXR0b25QcmVzcyhvQnV0dG9uKTtcblx0fVxuXG5cdF9leGVjdXRlRm9vdGVyU2hvcnRjdXQoc0lkOiBhbnkpIHtcblx0XHRjb25zdCBzQnV0dG9uSWQgPSBgJHt0aGlzLmdldFZpZXcoKS5nZXRJZCgpfS0tJHtzSWR9YCxcblx0XHRcdG9CdXR0b24gPSAodGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKS5nZXRGb290ZXIoKSBhcyBhbnkpLmdldENvbnRlbnQoKS5maW5kKGZ1bmN0aW9uIChvRWxlbWVudDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvRWxlbWVudC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSA9PT0gXCJzYXAubS5CdXR0b25cIiAmJiBvRWxlbWVudC5nZXRJZCgpID09PSBzQnV0dG9uSWQ7XG5cdFx0XHR9KTtcblx0XHRDb21tb25VdGlscy5maXJlQnV0dG9uUHJlc3Mob0J1dHRvbik7XG5cdH1cblxuXHRfZXhlY3V0ZVRhYlNob3J0Q3V0KG9FeGVjdXRpb246IGFueSkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKSxcblx0XHRcdGFTZWN0aW9ucyA9IG9PYmplY3RQYWdlLmdldFNlY3Rpb25zKCksXG5cdFx0XHRpU2VjdGlvbkluZGV4TWF4ID0gYVNlY3Rpb25zLmxlbmd0aCAtIDEsXG5cdFx0XHRzQ29tbWFuZCA9IG9FeGVjdXRpb24ub1NvdXJjZS5nZXRDb21tYW5kKCk7XG5cdFx0bGV0IG5ld1NlY3Rpb24sXG5cdFx0XHRpU2VsZWN0ZWRTZWN0aW9uSW5kZXggPSBvT2JqZWN0UGFnZS5pbmRleE9mU2VjdGlvbih0aGlzLmJ5SWQob09iamVjdFBhZ2UuZ2V0U2VsZWN0ZWRTZWN0aW9uKCkpIGFzIE9iamVjdFBhZ2VTZWN0aW9uKTtcblx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4ICE9PSAtMSAmJiBpU2VjdGlvbkluZGV4TWF4ID4gMCkge1xuXHRcdFx0aWYgKHNDb21tYW5kID09PSBcIk5leHRUYWJcIikge1xuXHRcdFx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4IDw9IGlTZWN0aW9uSW5kZXhNYXggLSAxKSB7XG5cdFx0XHRcdFx0bmV3U2VjdGlvbiA9IGFTZWN0aW9uc1srK2lTZWxlY3RlZFNlY3Rpb25JbmRleF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4ICE9PSAwKSB7XG5cdFx0XHRcdC8vIFByZXZpb3VzVGFiXG5cdFx0XHRcdG5ld1NlY3Rpb24gPSBhU2VjdGlvbnNbLS1pU2VsZWN0ZWRTZWN0aW9uSW5kZXhdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3U2VjdGlvbikge1xuXHRcdFx0XHRvT2JqZWN0UGFnZS5zZXRTZWxlY3RlZFNlY3Rpb24obmV3U2VjdGlvbik7XG5cdFx0XHRcdG5ld1NlY3Rpb24uZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZ2V0Rm9vdGVyVmlzaWJpbGl0eSgpIHtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiLCBmYWxzZSk7XG5cdFx0c2FwLnVpXG5cdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHQuZ2V0TWVzc2FnZU1hbmFnZXIoKVxuXHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHQuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRpZiAob01lc3NhZ2UudmFsaWRhdGlvbiAmJiBvTWVzc2FnZS50eXBlID09PSBcIkVycm9yXCIgJiYgb01lc3NhZ2UudGFyZ2V0LmluZGV4T2Yoc1ZpZXdJZCkgPiAtMSkge1xuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHRfc2hvd01lc3NhZ2VQb3BvdmVyKGVycj86IGFueSwgb1JldD86IGFueSkge1xuXHRcdGlmIChlcnIpIHtcblx0XHRcdExvZy5lcnJvcihlcnIpO1xuXHRcdH1cblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblx0XHRjb25zdCBjdXJyZW50UGFnZVZpZXcgPSByb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHRcdD8gcm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdFZpZXcoKVxuXHRcdFx0OiAodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Q29udGFpbmVyKCkgYXMgYW55KS5nZXRDdXJyZW50UGFnZSgpO1xuXHRcdGlmICghY3VycmVudFBhZ2VWaWV3LmlzQShcInNhcC5tLk1lc3NhZ2VQYWdlXCIpKSB7XG5cdFx0XHRjb25zdCBvTWVzc2FnZUJ1dHRvbiA9IHRoaXMubWVzc2FnZUJ1dHRvbixcblx0XHRcdFx0b01lc3NhZ2VQb3BvdmVyID0gb01lc3NhZ2VCdXR0b24ub01lc3NhZ2VQb3BvdmVyLFxuXHRcdFx0XHRvSXRlbUJpbmRpbmcgPSBvTWVzc2FnZVBvcG92ZXIuZ2V0QmluZGluZyhcIml0ZW1zXCIpO1xuXG5cdFx0XHRpZiAob0l0ZW1CaW5kaW5nLmdldExlbmd0aCgpID4gMCAmJiAhb01lc3NhZ2VQb3BvdmVyLmlzT3BlbigpKSB7XG5cdFx0XHRcdG9NZXNzYWdlQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7XG5cdFx0XHRcdC8vIHdvcmthcm91bmQgdG8gZW5zdXJlIHRoYXQgb01lc3NhZ2VCdXR0b24gaXMgcmVuZGVyZWQgd2hlbiBvcGVuQnkgaXMgY2FsbGVkXG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdG9NZXNzYWdlUG9wb3Zlci5vcGVuQnkob01lc3NhZ2VCdXR0b24pO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9SZXQ7XG5cdH1cblxuXHRfZWRpdERvY3VtZW50KG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTW9kZWwpO1xuXHRcdHJldHVybiB0aGlzLmVkaXRGbG93LmVkaXREb2N1bWVudC5hcHBseSh0aGlzLmVkaXRGbG93LCBbb0NvbnRleHRdKS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Nb2RlbCk7XG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEdldHMgdGhlIGNvbnRleHQgb2YgdGhlIERyYWZ0Um9vdCBwYXRoLlxuXHQgKiBJZiBhIHZpZXcgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBkcmFmdCBSb290IFBhdGgsIHRoaXMgbWV0aG9kIHJldHVybnMgaXRzIGJpbmRpbmdDb250ZXh0LlxuXHQgKiBXaGVyZSBubyB2aWV3IGlzIGZvdW5kIGEgbmV3IGNyZWF0ZWQgY29udGV4dCBpcyByZXR1cm5lZC5cblx0ICogVGhlIG5ldyBjcmVhdGVkIGNvbnRleHQgcmVxdWVzdCB0aGUga2V5IG9mIHRoZSBlbnRpdHkgaW4gb3JkZXIgdG8gZ2V0IHRoZSBFdGFnIG9mIHRoaXMgZW50aXR5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0RHJhZnRSb290UGF0aFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIGEgUHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgZ2V0RHJhZnRSb290Q29udGV4dCgpOiBQcm9taXNlPFY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBjb250ZXh0ID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIFY0Q29udGV4dDtcblx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0Y29uc3QgZHJhZnRSb290Q29udGV4dFBhdGggPSBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKGNvbnRleHQpO1xuXHRcdFx0bGV0IHNpbXBsZURyYWZ0Um9vdENvbnRleHQ6IFY0Q29udGV4dDtcblx0XHRcdGlmIChkcmFmdFJvb3RDb250ZXh0UGF0aCkge1xuXHRcdFx0XHQvLyBDaGVjayBpZiBhIHZpZXcgbWF0Y2hlcyB3aXRoIHRoZSBkcmFmdCByb290IHBhdGhcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmdCaW5kaW5nQ29udGV4dE9uUGFnZSA9ICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIpXG5cdFx0XHRcdFx0LmdldEluc3RhbmNlZFZpZXdzKClcblx0XHRcdFx0XHQuZmluZCgocGFnZVZpZXc6IFZpZXcpID0+IHBhZ2VWaWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKSA9PT0gZHJhZnRSb290Q29udGV4dFBhdGgpXG5cdFx0XHRcdFx0Py5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIFY0Q29udGV4dDtcblx0XHRcdFx0aWYgKGV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2UpIHtcblx0XHRcdFx0XHRyZXR1cm4gZXhpc3RpbmdCaW5kaW5nQ29udGV4dE9uUGFnZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdmlldy5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRcdFx0c2ltcGxlRHJhZnRSb290Q29udGV4dCA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvc2ltcGxlRHJhZnRSb290Q29udGV4dFwiKTtcblx0XHRcdFx0aWYgKHNpbXBsZURyYWZ0Um9vdENvbnRleHQ/LmdldFBhdGgoKSA9PT0gZHJhZnRSb290Q29udGV4dFBhdGgpIHtcblx0XHRcdFx0XHRyZXR1cm4gc2ltcGxlRHJhZnRSb290Q29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGRyYWZ0Um9vdENvbnRleHRQYXRoKTtcblx0XHRcdFx0Y29uc3QgbURhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldENvbnRleHQoc0VudGl0eVBhdGgpKTtcblx0XHRcdFx0c2ltcGxlRHJhZnRSb290Q29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KGRyYWZ0Um9vdENvbnRleHRQYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0YXdhaXQgc2ltcGxlRHJhZnRSb290Q29udGV4dC5yZXF1ZXN0UHJvcGVydHkobURhdGFNb2RlbC50YXJnZXRFbnRpdHlUeXBlLmtleXNbMF0/Lm5hbWUpO1xuXHRcdFx0XHQvLyBTdG9yZSB0aGlzIG5ldyBjcmVhdGVkIGNvbnRleHQgdG8gdXNlIGl0IG9uIHRoZSBuZXh0IGl0ZXJhdGlvbnNcblx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zaW1wbGVEcmFmdFJvb3RDb250ZXh0XCIsIHNpbXBsZURyYWZ0Um9vdENvbnRleHQpO1xuXHRcdFx0XHRyZXR1cm4gc2ltcGxlRHJhZnRSb290Q29udGV4dDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRhc3luYyBfdmFsaWRhdGVEb2N1bWVudCgpOiBQcm9taXNlPHZvaWQgfCBhbnlbXSB8IE9EYXRhQ29udGV4dEJpbmRpbmdFeD4ge1xuXHRcdGNvbnN0IGNvbnRyb2wgPSBDb3JlLmJ5SWQoQ29yZS5nZXRDdXJyZW50Rm9jdXNlZENvbnRyb2xJZCgpKTtcblx0XHRjb25zdCBjb250ZXh0ID0gY29udHJvbD8uZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBWNENvbnRleHQ7XG5cdFx0aWYgKGNvbnRleHQgJiYgIWNvbnRleHQuaXNUcmFuc2llbnQoKSkge1xuXHRcdFx0Ly8gV2FpdCBmb3IgdGhlIHBlbmRpbmcgY2hhbmdlcyBiZWZvcmUgc3RhcnRpbmcgdGhpcyB2YWxpZGF0aW9uXG5cdFx0XHRhd2FpdCB0aGlzLl9lZGl0Rmxvdy5zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzU2VydmljZSA9IGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSBzaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KGNvbnRleHQpO1xuXHRcdFx0Y29uc3QgZ2xvYmFsU2lkZUVmZmVjdHMgPSBlbnRpdHlUeXBlID8gc2lkZUVmZmVjdHNTZXJ2aWNlLmdldEdsb2JhbE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZSkgOiBbXTtcblx0XHRcdC8vIElmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBnbG9iYWwgU2lkZUVmZmVjdHMgZm9yIHRoZSByZWxhdGVkIGVudGl0eSwgZXhlY3V0ZSBpdC90aGVtXG5cdFx0XHRpZiAoZ2xvYmFsU2lkZUVmZmVjdHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChnbG9iYWxTaWRlRWZmZWN0cy5tYXAoKHNpZGVFZmZlY3RzKSA9PiB0aGlzLl9zaWRlRWZmZWN0cy5yZXF1ZXN0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdHMsIGNvbnRleHQpKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBkcmFmdFJvb3RDb250ZXh0ID0gYXdhaXQgdGhpcy5nZXREcmFmdFJvb3RDb250ZXh0KCk7XG5cdFx0XHRcdC8vRXhlY3V0ZSB0aGUgZHJhZnRWYWxpZGF0aW9uIGlmIHRoZXJlIGlzIG5vIGdsb2JhbFNpZGVFZmZlY3RzXG5cdFx0XHRcdGlmIChkcmFmdFJvb3RDb250ZXh0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRyYWZ0LmV4ZWN1dGVEcmFmdFZhbGlkYXRpb24oZHJhZnRSb290Q29udGV4dCwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgX3NhdmVEb2N1bWVudChvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSxcblx0XHRcdGFXYWl0Q3JlYXRlRG9jdW1lbnRzOiBhbnlbXSA9IFtdO1xuXHRcdC8vIGluZGljYXRlcyBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgcm93IGluIHRoZSBPUFxuXHRcdGxldCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IGZhbHNlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTW9kZWwpO1xuXHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5mb3JFYWNoKChvVGFibGU6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcob1RhYmxlKTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiBhbnkgPSB7XG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogb1RhYmxlLmRhdGEoXCJjcmVhdGlvbk1vZGVcIiksXG5cdFx0XHRcdGNyZWF0aW9uUm93OiBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKSxcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IG9UYWJsZS5kYXRhKFwiY3JlYXRlQXRFbmRcIikgPT09IFwidHJ1ZVwiXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgYkNyZWF0ZURvY3VtZW50ID1cblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSAmJlxuXHRcdFx0XHRPYmplY3Qua2V5cyhtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpKS5sZW5ndGggPiAxO1xuXHRcdFx0aWYgKGJDcmVhdGVEb2N1bWVudCkge1xuXHRcdFx0XHQvLyB0aGUgYlNraXBTaWRlRWZmZWN0cyBpcyBhIHBhcmFtZXRlciBjcmVhdGVkIHdoZW4gd2UgY2xpY2sgdGhlIHNhdmUga2V5LiBJZiB3ZSBwcmVzcyB0aGlzIGtleVxuXHRcdFx0XHQvLyB3ZSBkb24ndCBleGVjdXRlIHRoZSBoYW5kbGVTaWRlRWZmZWN0cyBmdW5jaXRvbiB0byBhdm9pZCBiYXRjaCByZWR1bmRhbmN5XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJTa2lwU2lkZUVmZmVjdHMgPSB0cnVlO1xuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IHRydWU7XG5cdFx0XHRcdGFXYWl0Q3JlYXRlRG9jdW1lbnRzLnB1c2goXG5cdFx0XHRcdFx0dGhpcy5lZGl0Rmxvdy5jcmVhdGVEb2N1bWVudChvQmluZGluZywgbVBhcmFtZXRlcnMpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9CaW5kaW5nO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgYUJpbmRpbmdzID0gYXdhaXQgUHJvbWlzZS5hbGwoYVdhaXRDcmVhdGVEb2N1bWVudHMpO1xuXHRcdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yOiBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0YmluZGluZ3M6IGFCaW5kaW5nc1xuXHRcdFx0fTtcblx0XHRcdC8vIFdlIG5lZWQgdG8gZWl0aGVyIHJlamVjdCBvciByZXNvbHZlIGEgcHJvbWlzZSBoZXJlIGFuZCByZXR1cm4gaXQgc2luY2UgdGhpcyBzYXZlXG5cdFx0XHQvLyBmdW5jdGlvbiBpcyBub3Qgb25seSBjYWxsZWQgd2hlbiBwcmVzc2luZyB0aGUgc2F2ZSBidXR0b24gaW4gdGhlIGZvb3RlciwgYnV0IGFsc29cblx0XHRcdC8vIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBjcmVhdGUgb3Igc2F2ZSBpbiBhIGRhdGFsb3NzIHBvcHVwLlxuXHRcdFx0Ly8gVGhlIGxvZ2ljIG9mIHRoZSBkYXRhbG9zcyBwb3B1cCBuZWVkcyB0byBkZXRlY3QgaWYgdGhlIHNhdmUgaGFkIGVycm9ycyBvciBub3QgaW4gb3JkZXJcblx0XHRcdC8vIHRvIGRlY2lkZSBpZiB0aGUgc3Vic2VxdWVudCBhY3Rpb24gLSBsaWtlIGEgYmFjayBuYXZpZ2F0aW9uIC0gaGFzIHRvIGJlIGV4ZWN1dGVkIG9yIG5vdC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc2F2ZURvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdC8vIElmIHRoZSBzYXZlRG9jdW1lbnQgaW4gZWRpdEZsb3cgcmV0dXJucyBlcnJvcnMgd2UgbmVlZFxuXHRcdFx0XHQvLyB0byBzaG93IHRoZSBtZXNzYWdlIHBvcG92ZXIgaGVyZSBhbmQgZW5zdXJlIHRoYXQgdGhlXG5cdFx0XHRcdC8vIGRhdGFsb3NzIGxvZ2ljIGRvZXMgbm90IHBlcmZvcm0gdGhlIGZvbGxvdyB1cCBmdW5jdGlvblxuXHRcdFx0XHQvLyBsaWtlIGUuZy4gYSBiYWNrIG5hdmlnYXRpb24gaGVuY2Ugd2UgcmV0dXJuIGEgcHJvbWlzZSBhbmQgcmVqZWN0IGl0XG5cdFx0XHRcdHRoaXMuX3Nob3dNZXNzYWdlUG9wb3ZlcihlcnJvcik7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTW9kZWwpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Nb2RlbCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X21hbmFnZUNvbGxhYm9yYXRpb24oKSB7XG5cdFx0b3Blbk1hbmFnZURpYWxvZyh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRfc2hvd0NvbGxhYm9yYXRpb25Vc2VyRGV0YWlscyhldmVudDogYW55KSB7XG5cdFx0c2hvd1VzZXJEZXRhaWxzKGV2ZW50LCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRfY2FuY2VsRG9jdW1lbnQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uKTsgLy90byBnZXQgdGhlIHJlZmVyZW5jZSBvZiB0aGUgY2FuY2VsIGJ1dHRvbiBmcm9tIGNvbW1hbmQgZXhlY3V0aW9uXG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdF9hcHBseURvY3VtZW50KG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5lZGl0Rmxvdy5hcHBseURvY3VtZW50KG9Db250ZXh0KS5jYXRjaCgoKSA9PiB0aGlzLl9zaG93TWVzc2FnZVBvcG92ZXIoKSk7XG5cdH1cblxuXHRfdXBkYXRlUmVsYXRlZEFwcHMoKSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdGlmIChDb21tb25VdGlscy5yZXNvbHZlU3RyaW5ndG9Cb29sZWFuKG9PYmplY3RQYWdlLmRhdGEoXCJzaG93UmVsYXRlZEFwcHNcIikpKSB7XG5cdFx0XHRDb21tb25VdGlscy51cGRhdGVSZWxhdGVkQXBwc0RldGFpbHMob09iamVjdFBhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdF9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhUGFyZW50RWxlbWVudDogYW55LCBhU3Vic2VjdGlvbjogYW55LCBhQ29udHJvbHM6IGFueSwgYklzQ2hhcnQ/OiBib29sZWFuKSB7XG5cdFx0Y29uc3QgYVN1YlNlY3Rpb25UYWJsZXMgPSBbXTtcblx0XHRmb3IgKGxldCBlbGVtZW50ID0gMDsgZWxlbWVudCA8IGFQYXJlbnRFbGVtZW50Lmxlbmd0aDsgZWxlbWVudCsrKSB7XG5cdFx0XHRsZXQgb0VsZW1lbnQgPSBhUGFyZW50RWxlbWVudFtlbGVtZW50XS5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgYVBhcmVudEVsZW1lbnRbZWxlbWVudF0uZ2V0Q29udGVudCgpO1xuXHRcdFx0aWYgKGJJc0NoYXJ0KSB7XG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5tQWdncmVnYXRpb25zICYmIG9FbGVtZW50LmdldEFnZ3JlZ2F0aW9uKFwiaXRlbXNcIikpIHtcblx0XHRcdFx0XHRjb25zdCBhSXRlbXMgPSBvRWxlbWVudC5nZXRBZ2dyZWdhdGlvbihcIml0ZW1zXCIpO1xuXHRcdFx0XHRcdGFJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChvSXRlbTogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAob0l0ZW0uaXNBKFwic2FwLmZlLm1hY3Jvcy5jaGFydC5DaGFydEFQSVwiKSkge1xuXHRcdFx0XHRcdFx0XHRvRWxlbWVudCA9IG9JdGVtO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC51aS5sYXlvdXQuRHluYW1pY1NpZGVDb250ZW50XCIpKSB7XG5cdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnQuZ2V0TWFpbkNvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvRWxlbWVudC5nZXRNYWluQ29udGVudCgpO1xuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnRbMF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLmZlLm1hY3Jvcy50YWJsZS5UYWJsZUFQSVwiKSkge1xuXHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50LmdldENvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvRWxlbWVudC5nZXRDb250ZW50KCk7XG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudFswXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdGFDb250cm9scy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdFx0YVN1YlNlY3Rpb25UYWJsZXMucHVzaCh7XG5cdFx0XHRcdFx0XCJ0YWJsZVwiOiBvRWxlbWVudCxcblx0XHRcdFx0XHRcImdyaWRUYWJsZVwiOiBvRWxlbWVudC5nZXRUeXBlKCkuaXNBKFwic2FwLnVpLm1kYy50YWJsZS5HcmlkVGFibGVUeXBlXCIpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC5mZS5tYWNyb3MuY2hhcnQuQ2hhcnRBUElcIikpIHtcblx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudC5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0VsZW1lbnQuZ2V0Q29udGVudCgpO1xuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnRbMF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLnVpLm1kYy5DaGFydFwiKSkge1xuXHRcdFx0XHRhQ29udHJvbHMucHVzaChvRWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChcblx0XHRcdGFTdWJTZWN0aW9uVGFibGVzLmxlbmd0aCA9PT0gMSAmJlxuXHRcdFx0YVBhcmVudEVsZW1lbnQubGVuZ3RoID09PSAxICYmXG5cdFx0XHRhU3ViU2VjdGlvblRhYmxlc1swXS5ncmlkVGFibGUgJiZcblx0XHRcdCFhU3Vic2VjdGlvbi5oYXNTdHlsZUNsYXNzKFwic2FwVXhBUE9iamVjdFBhZ2VTdWJTZWN0aW9uRml0Q29udGFpbmVyXCIpXG5cdFx0KSB7XG5cdFx0XHQvL0luIGNhc2UgdGhlcmUgaXMgb25seSBhIHNpbmdsZSB0YWJsZSBpbiBhIHNlY3Rpb24gd2UgZml0IHRoYXQgdG8gdGhlIHdob2xlIHBhZ2Ugc28gdGhhdCB0aGUgc2Nyb2xsYmFyIGNvbWVzIG9ubHkgb24gdGFibGUgYW5kIG5vdCBvbiBwYWdlXG5cdFx0XHRhU3Vic2VjdGlvbi5hZGRTdHlsZUNsYXNzKFwic2FwVXhBUE9iamVjdFBhZ2VTdWJTZWN0aW9uRml0Q29udGFpbmVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRBbGxTdWJTZWN0aW9ucygpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0bGV0IGFTdWJTZWN0aW9uczogYW55W10gPSBbXTtcblx0XHRvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TZWN0aW9uOiBhbnkpIHtcblx0XHRcdGFTdWJTZWN0aW9ucyA9IGFTdWJTZWN0aW9ucy5jb25jYXQob1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFTdWJTZWN0aW9ucztcblx0fVxuXG5cdF9nZXRBbGxCbG9ja3MoKSB7XG5cdFx0bGV0IGFCbG9ja3M6IGFueVtdID0gW107XG5cdFx0dGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU3ViU2VjdGlvbjogYW55KSB7XG5cdFx0XHRhQmxvY2tzID0gYUJsb2Nrcy5jb25jYXQob1N1YlNlY3Rpb24uZ2V0QmxvY2tzKCkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBhQmxvY2tzO1xuXHR9XG5cblx0X2ZpbmRUYWJsZXMoKSB7XG5cdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gdGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKTtcblx0XHRjb25zdCBhVGFibGVzOiBhbnlbXSA9IFtdO1xuXHRcdGZvciAobGV0IHN1YlNlY3Rpb24gPSAwOyBzdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgc3ViU2VjdGlvbisrKSB7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0QmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYVRhYmxlcyk7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0TW9yZUJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFUYWJsZXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gYVRhYmxlcztcblx0fVxuXG5cdF9maW5kQ2hhcnRzKCkge1xuXHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgYUNoYXJ0czogYW55W10gPSBbXTtcblx0XHRmb3IgKGxldCBzdWJTZWN0aW9uID0gMDsgc3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IHN1YlNlY3Rpb24rKykge1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldEJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFDaGFydHMsIHRydWUpO1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldE1vcmVCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhQ2hhcnRzLCB0cnVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFDaGFydHM7XG5cdH1cblxuXHRfY2xvc2VTaWRlQ29udGVudCgpIHtcblx0XHR0aGlzLl9nZXRBbGxCbG9ja3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChvQmxvY2s6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRlbnQgPSBvQmxvY2suZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9CbG9jay5nZXRDb250ZW50KCk7XG5cdFx0XHRpZiAob0NvbnRlbnQgJiYgb0NvbnRlbnQuaXNBICYmIG9Db250ZW50LmlzQShcInNhcC51aS5sYXlvdXQuRHluYW1pY1NpZGVDb250ZW50XCIpKSB7XG5cdFx0XHRcdGlmIChvQ29udGVudC5zZXRTaG93U2lkZUNvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHRcdFx0XHRcdG9Db250ZW50LnNldFNob3dTaWRlQ29udGVudChmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFydCBDb250ZXh0IGlzIHJlc29sdmVkIGZvciAxOm4gbWljcm9jaGFydHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ2hhcnRDb250ZXh0IFRoZSBDb250ZXh0IG9mIHRoZSBNaWNyb0NoYXJ0XG5cdCAqIEBwYXJhbSBzQ2hhcnRQYXRoIFRoZSBjb2xsZWN0aW9uUGF0aCBvZiB0aGUgdGhlIGNoYXJ0XG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIEF0dHJpYnV0ZXMgb2YgdGhlIGNoYXJ0IENvbnRleHRcblx0ICovXG5cdF9nZXRDaGFydENvbnRleHREYXRhKG9DaGFydENvbnRleHQ6IGFueSwgc0NoYXJ0UGF0aDogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NoYXJ0Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgb0NoYXJ0Q29udGV4dERhdGEgPSBbb0NvbnRleHREYXRhXTtcblx0XHRpZiAob0NoYXJ0Q29udGV4dCAmJiBzQ2hhcnRQYXRoKSB7XG5cdFx0XHRpZiAob0NvbnRleHREYXRhW3NDaGFydFBhdGhdKSB7XG5cdFx0XHRcdG9DaGFydENvbnRleHREYXRhID0gb0NvbnRleHREYXRhW3NDaGFydFBhdGhdO1xuXHRcdFx0XHRkZWxldGUgb0NvbnRleHREYXRhW3NDaGFydFBhdGhdO1xuXHRcdFx0XHRvQ2hhcnRDb250ZXh0RGF0YS5wdXNoKG9Db250ZXh0RGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvQ2hhcnRDb250ZXh0RGF0YTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTY3JvbGwgdGhlIHRhYmxlcyB0byB0aGUgcm93IHdpdGggdGhlIHNQYXRoXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlciNfc2Nyb2xsVGFibGVzVG9Sb3dcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNSb3dQYXRoICdzUGF0aCBvZiB0aGUgdGFibGUgcm93J1xuXHQgKi9cblxuXHRfc2Nyb2xsVGFibGVzVG9Sb3coc1Jvd1BhdGg6IHN0cmluZykge1xuXHRcdGlmICh0aGlzLl9maW5kVGFibGVzICYmIHRoaXMuX2ZpbmRUYWJsZXMoKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZmluZFRhYmxlcygpO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhVGFibGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFRhYmxlU2Nyb2xsZXIuc2Nyb2xsVGFibGVUb1JvdyhhVGFibGVzW2ldLCBzUm93UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBtZXJnZSBzZWxlY3RlZCBjb250ZXh0cyBhbmQgZmlsdGVycy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9tZXJnZU11bHRpcGxlQ29udGV4dHNcblx0ICogQHBhcmFtIG9QYWdlQ29udGV4dCBQYWdlIGNvbnRleHRcblx0ICogQHBhcmFtIGFMaW5lQ29udGV4dCBTZWxlY3RlZCBDb250ZXh0c1xuXHQgKiBAcGFyYW0gc0NoYXJ0UGF0aCBDb2xsZWN0aW9uIG5hbWUgb2YgdGhlIGNoYXJ0XG5cdCAqIEByZXR1cm5zIFNlbGVjdGlvbiBWYXJpYW50IE9iamVjdFxuXHQgKi9cblx0X21lcmdlTXVsdGlwbGVDb250ZXh0cyhvUGFnZUNvbnRleHQ6IENvbnRleHQsIGFMaW5lQ29udGV4dDogYW55W10sIHNDaGFydFBhdGg6IHN0cmluZykge1xuXHRcdGxldCBhQXR0cmlidXRlczogYW55W10gPSBbXSxcblx0XHRcdGFQYWdlQXR0cmlidXRlcyA9IFtdLFxuXHRcdFx0b0NvbnRleHQsXG5cdFx0XHRzTWV0YVBhdGhMaW5lOiBzdHJpbmcsXG5cdFx0XHRzUGF0aExpbmU7XG5cblx0XHRjb25zdCBzUGFnZVBhdGggPSBvUGFnZUNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvUGFnZUNvbnRleHQgJiYgb1BhZ2VDb250ZXh0LmdldE1vZGVsKCkgJiYgKG9QYWdlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHRjb25zdCBzTWV0YVBhdGhQYWdlID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYWdlUGF0aCkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdC8vIEdldCBzaW5nbGUgbGluZSBjb250ZXh0IGlmIG5lY2Vzc2FyeVxuXHRcdGlmIChhTGluZUNvbnRleHQgJiYgYUxpbmVDb250ZXh0Lmxlbmd0aCkge1xuXHRcdFx0b0NvbnRleHQgPSBhTGluZUNvbnRleHRbMF07XG5cdFx0XHRzUGF0aExpbmUgPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRzTWV0YVBhdGhMaW5lID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoTGluZSkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdFx0YUxpbmVDb250ZXh0LmZvckVhY2goKG9TaW5nbGVDb250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHNDaGFydFBhdGgpIHtcblx0XHRcdFx0XHRjb25zdCBvQ2hhcnRDb250ZXh0RGF0YSA9IHRoaXMuX2dldENoYXJ0Q29udGV4dERhdGEob1NpbmdsZUNvbnRleHQsIHNDaGFydFBhdGgpO1xuXHRcdFx0XHRcdGlmIChvQ2hhcnRDb250ZXh0RGF0YSkge1xuXHRcdFx0XHRcdFx0YUF0dHJpYnV0ZXMgPSBvQ2hhcnRDb250ZXh0RGF0YS5tYXAoZnVuY3Rpb24gKG9TdWJDaGFydENvbnRleHREYXRhOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YTogb1N1YkNoYXJ0Q29udGV4dERhdGEsXG5cdFx0XHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBgJHtzTWV0YVBhdGhQYWdlfS8ke3NDaGFydFBhdGh9YFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFBdHRyaWJ1dGVzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y29udGV4dERhdGE6IG9TaW5nbGVDb250ZXh0LmdldE9iamVjdCgpLFxuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBzTWV0YVBhdGhMaW5lXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhUGFnZUF0dHJpYnV0ZXMucHVzaCh7XG5cdFx0XHRjb250ZXh0RGF0YTogb1BhZ2VDb250ZXh0LmdldE9iamVjdCgpLFxuXHRcdFx0ZW50aXR5U2V0OiBzTWV0YVBhdGhQYWdlXG5cdFx0fSk7XG5cdFx0Ly8gQWRkaW5nIFBhZ2UgQ29udGV4dCB0byBzZWxlY3Rpb24gdmFyaWFudFxuXHRcdGFQYWdlQXR0cmlidXRlcyA9IENvbW1vblV0aWxzLnJlbW92ZVNlbnNpdGl2ZURhdGEoYVBhZ2VBdHRyaWJ1dGVzLCBvTWV0YU1vZGVsKTtcblx0XHRjb25zdCBvUGFnZUxldmVsU1YgPSBDb21tb25VdGlscy5hZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudChuZXcgU2VsZWN0aW9uVmFyaWFudCgpLCBhUGFnZUF0dHJpYnV0ZXMsIHRoaXMuZ2V0VmlldygpKTtcblx0XHRhQXR0cmlidXRlcyA9IENvbW1vblV0aWxzLnJlbW92ZVNlbnNpdGl2ZURhdGEoYUF0dHJpYnV0ZXMsIG9NZXRhTW9kZWwpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50OiBvUGFnZUxldmVsU1YsXG5cdFx0XHRhdHRyaWJ1dGVzOiBhQXR0cmlidXRlc1xuXHRcdH07XG5cdH1cblxuXHRfZ2V0QmF0Y2hHcm91cHNGb3JWaWV3KCkge1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55LFxuXHRcdFx0b0NvbmZpZ3VyYXRpb25zID0gb1ZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRcdFx0YUNvbmZpZ3VyYXRpb25zID0gb0NvbmZpZ3VyYXRpb25zICYmIE9iamVjdC5rZXlzKG9Db25maWd1cmF0aW9ucyksXG5cdFx0XHRhQmF0Y2hHcm91cHMgPSBbXCIkYXV0by5IZXJvZXNcIiwgXCIkYXV0by5EZWNvcmF0aW9uXCIsIFwiJGF1dG8uV29ya2Vyc1wiXTtcblxuXHRcdGlmIChhQ29uZmlndXJhdGlvbnMgJiYgYUNvbmZpZ3VyYXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdGFDb25maWd1cmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb0NvbmZpZ3VyYXRpb24gPSBvQ29uZmlndXJhdGlvbnNbc0tleV07XG5cdFx0XHRcdGlmIChvQ29uZmlndXJhdGlvbi5yZXF1ZXN0R3JvdXBJZCA9PT0gXCJMb25nUnVubmVyc1wiKSB7XG5cdFx0XHRcdFx0YUJhdGNoR3JvdXBzLnB1c2goXCIkYXV0by5Mb25nUnVubmVyc1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBhQmF0Y2hHcm91cHM7XG5cdH1cblxuXHQvKlxuXHQgKiBSZXNldCBCcmVhZGNydW1iIGxpbmtzXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge3NhcC5tLkJyZWFkY3J1bWJzfSBbb1NvdXJjZV0gcGFyZW50IGNvbnRyb2xcblx0ICogQGRlc2NyaXB0aW9uIFVzZWQgd2hlbiBjb250ZXh0IG9mIHRoZSBvYmplY3QgcGFnZSBjaGFuZ2VzLlxuXHQgKiAgICAgICAgICAgICAgVGhpcyBldmVudCBjYWxsYmFjayBpcyBhdHRhY2hlZCB0byBtb2RlbENvbnRleHRDaGFuZ2Vcblx0ICogICAgICAgICAgICAgIGV2ZW50IG9mIHRoZSBCcmVhZGNydW1iIGNvbnRyb2wgdG8gY2F0Y2ggY29udGV4dCBjaGFuZ2UuXG5cdCAqICAgICAgICAgICAgICBUaGVuIGVsZW1lbnQgYmluZGluZyBhbmQgaHJlZnMgYXJlIHVwZGF0ZWQgZm9yIGVhY2ggbGluay5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBleHBlcmltZW50YWxcblx0ICovXG5cdGFzeW5jIF9zZXRCcmVhZGNydW1iTGlua3Mob1NvdXJjZTogQnJlYWRDcnVtYnMpIHtcblx0XHRjb25zdCBvQ29udGV4dCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0YVByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcblx0XHRcdGFTa2lwUGFyYW1ldGVyaXplZDogYW55W10gPSBbXSxcblx0XHRcdHNOZXdQYXRoID0gb0NvbnRleHQ/LmdldFBhdGgoKSxcblx0XHRcdGFQYXRoUGFydHMgPSBzTmV3UGF0aD8uc3BsaXQoXCIvXCIpID8/IFtdLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQgJiYgb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgc1BhdGggPSBcIlwiO1xuXHRcdHRyeSB7XG5cdFx0XHRhUGF0aFBhcnRzLnNoaWZ0KCk7XG5cdFx0XHRhUGF0aFBhcnRzLnNwbGljZSgtMSwgMSk7XG5cdFx0XHRhUGF0aFBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHNQYXRoUGFydDogYW55KSB7XG5cdFx0XHRcdHNQYXRoICs9IGAvJHtzUGF0aFBhcnR9YDtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IG9BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyO1xuXHRcdFx0XHRjb25zdCBzUGFyYW1ldGVyUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHRcdFx0XHRjb25zdCBiUmVzdWx0Q29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXJhbWV0ZXJQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRgKTtcblx0XHRcdFx0aWYgKGJSZXN1bHRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgZG9udCBuZWVkIHRvIGNyZWF0ZSBhIGJyZWFkY3J1bWIgZm9yIFBhcmFtZXRlciBwYXRoXG5cdFx0XHRcdFx0YVNraXBQYXJhbWV0ZXJpemVkLnB1c2goMSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFTa2lwUGFyYW1ldGVyaXplZC5wdXNoKDApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFQcm9taXNlcy5wdXNoKG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0VGl0bGVJbmZvRnJvbVBhdGgoc1BhdGgpKTtcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgdGl0bGVIaWVyYXJjaHlJbmZvczogYW55W10gPSBhd2FpdCBQcm9taXNlLmFsbChhUHJvbWlzZXMpO1xuXHRcdFx0bGV0IGlkeCwgaGllcmFyY2h5UG9zaXRpb24sIG9MaW5rO1xuXHRcdFx0Zm9yIChjb25zdCB0aXRsZUhpZXJhcmNoeUluZm8gb2YgdGl0bGVIaWVyYXJjaHlJbmZvcykge1xuXHRcdFx0XHRoaWVyYXJjaHlQb3NpdGlvbiA9IHRpdGxlSGllcmFyY2h5SW5mb3MuaW5kZXhPZih0aXRsZUhpZXJhcmNoeUluZm8pO1xuXHRcdFx0XHRpZHggPSBoaWVyYXJjaHlQb3NpdGlvbiAtIGFTa2lwUGFyYW1ldGVyaXplZFtoaWVyYXJjaHlQb3NpdGlvbl07XG5cdFx0XHRcdG9MaW5rID0gb1NvdXJjZS5nZXRMaW5rcygpW2lkeF0gPyBvU291cmNlLmdldExpbmtzKClbaWR4XSA6IG5ldyBMaW5rKCk7XG5cdFx0XHRcdC8vc0N1cnJlbnRFbnRpdHkgaXMgYSBmYWxsYmFjayB2YWx1ZSBpbiBjYXNlIG9mIGVtcHR5IHRpdGxlXG5cdFx0XHRcdG9MaW5rLnNldFRleHQodGl0bGVIaWVyYXJjaHlJbmZvLnN1YnRpdGxlIHx8IHRpdGxlSGllcmFyY2h5SW5mby50aXRsZSk7XG5cdFx0XHRcdC8vV2UgYXBwbHkgYW4gYWRkaXRpb25hbCBlbmNvZGVVUkkgaW4gY2FzZSBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgKGllIFwiL1wiKSB1c2VkIGluIHRoZSB1cmwgdGhyb3VnaCB0aGUgc2VtYW50aWMga2V5c1xuXHRcdFx0XHRvTGluay5zZXRIcmVmKGVuY29kZVVSSSh0aXRsZUhpZXJhcmNoeUluZm8uaW50ZW50KSk7XG5cdFx0XHRcdGlmICghb1NvdXJjZS5nZXRMaW5rcygpW2lkeF0pIHtcblx0XHRcdFx0XHRvU291cmNlLmFkZExpbmsob0xpbmspO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IGFueSkge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2V0dGluZyB0aGUgYnJlYWRjcnVtYiBsaW5rczpcIiArIGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHRfY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbigpIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgb0RhdGFQb2ludHMgPSBDb21tb25VdGlscy5nZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24oXG5cdFx0XHRvVmlldy5nZXRWaWV3RGF0YSgpLFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldE91dGJvdW5kcygpXG5cdFx0KTtcblx0XHRjb25zdCBvU2hlbGxTZXJ2aWNlcyA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdGNvbnN0IG9QYWdlQ29udGV4dCA9IG9WaWV3ICYmIChvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImlzSGVhZGVyRFBMaW5rVmlzaWJsZVwiLCB7fSk7XG5cdFx0aWYgKG9QYWdlQ29udGV4dCkge1xuXHRcdFx0b1BhZ2VDb250ZXh0XG5cdFx0XHRcdC5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9EYXRhOiBhbnkpIHtcblx0XHRcdFx0XHRmbkdldExpbmtzKG9EYXRhUG9pbnRzLCBvRGF0YSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgdGhlIGxpbmtzIGZyb20gdGhlIHNoZWxsIHNlcnZpY2VcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIG9FcnJvclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZuT25FcnJvcihvRXJyb3I6IGFueSkge1xuXHRcdFx0TG9nLmVycm9yKG9FcnJvcik7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZm5TZXRMaW5rRW5hYmxlbWVudChpZDogc3RyaW5nLCBhU3VwcG9ydGVkTGlua3M6IGFueSkge1xuXHRcdFx0Y29uc3Qgc0xpbmtJZCA9IGlkO1xuXHRcdFx0Ly8gcHJvY2VzcyB2aWFibGUgbGlua3MgZnJvbSBnZXRMaW5rcyBmb3IgYWxsIGRhdGFwb2ludHMgaGF2aW5nIG91dGJvdW5kXG5cdFx0XHRpZiAoYVN1cHBvcnRlZExpbmtzICYmIGFTdXBwb3J0ZWRMaW5rcy5sZW5ndGggPT09IDEgJiYgYVN1cHBvcnRlZExpbmtzWzBdLnN1cHBvcnRlZCkge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGlzSGVhZGVyRFBMaW5rVmlzaWJsZS8ke3NMaW5rSWR9YCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIG9TdWJEYXRhUG9pbnRzXG5cdFx0ICogQHBhcmFtIG9QYWdlRGF0YVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZuR2V0TGlua3Mob1N1YkRhdGFQb2ludHM6IGFueSwgb1BhZ2VEYXRhOiBhbnkpIHtcblx0XHRcdGZvciAoY29uc3Qgc0lkIGluIG9TdWJEYXRhUG9pbnRzKSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhUG9pbnQgPSBvU3ViRGF0YVBvaW50c1tzSWRdO1xuXHRcdFx0XHRjb25zdCBvUGFyYW1zOiBhbnkgPSB7fTtcblx0XHRcdFx0Y29uc3Qgb0xpbmsgPSBvVmlldy5ieUlkKHNJZCk7XG5cdFx0XHRcdGlmICghb0xpbmspIHtcblx0XHRcdFx0XHQvLyBmb3IgZGF0YSBwb2ludHMgY29uZmlndXJlZCBpbiBhcHAgZGVzY3JpcHRvciBidXQgbm90IGFubm90YXRlZCBpbiB0aGUgaGVhZGVyXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgb0xpbmtDb250ZXh0ID0gb0xpbmsuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgb0xpbmtEYXRhOiBhbnkgPSBvTGlua0NvbnRleHQgJiYgb0xpbmtDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRsZXQgb01peGVkQ29udGV4dDogYW55ID0gbWVyZ2Uoe30sIG9QYWdlRGF0YSwgb0xpbmtEYXRhKTtcblx0XHRcdFx0Ly8gcHJvY2VzcyBzZW1hbnRpYyBvYmplY3QgbWFwcGluZ3Ncblx0XHRcdFx0aWYgKG9EYXRhUG9pbnQuc2VtYW50aWNPYmplY3RNYXBwaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0TWFwcGluZyA9IG9EYXRhUG9pbnQuc2VtYW50aWNPYmplY3RNYXBwaW5nO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBpbiBhU2VtYW50aWNPYmplY3RNYXBwaW5nKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWFwcGluZyA9IGFTZW1hbnRpY09iamVjdE1hcHBpbmdbaXRlbV07XG5cdFx0XHRcdFx0XHRjb25zdCBzTWFpblByb3BlcnR5ID0gb01hcHBpbmdbXCJMb2NhbFByb3BlcnR5XCJdW1wiJFByb3BlcnR5UGF0aFwiXTtcblx0XHRcdFx0XHRcdGNvbnN0IHNNYXBwZWRQcm9wZXJ0eSA9IG9NYXBwaW5nW1wiU2VtYW50aWNPYmplY3RQcm9wZXJ0eVwiXTtcblx0XHRcdFx0XHRcdGlmIChzTWFpblByb3BlcnR5ICE9PSBzTWFwcGVkUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9NaXhlZENvbnRleHQuaGFzT3duUHJvcGVydHkoc01haW5Qcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3TWFwcGluZzogYW55ID0ge307XG5cdFx0XHRcdFx0XHRcdFx0b05ld01hcHBpbmdbc01hcHBlZFByb3BlcnR5XSA9IG9NaXhlZENvbnRleHRbc01haW5Qcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRcdFx0b01peGVkQ29udGV4dCA9IG1lcmdlKHt9LCBvTWl4ZWRDb250ZXh0LCBvTmV3TWFwcGluZyk7XG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIG9NaXhlZENvbnRleHRbc01haW5Qcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob01peGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3Qgc0tleSBpbiBvTWl4ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRpZiAoc0tleS5pbmRleE9mKFwiX1wiKSAhPT0gMCAmJiBzS2V5LmluZGV4T2YoXCJvZGF0YS5jb250ZXh0XCIpID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRvUGFyYW1zW3NLZXldID0gb01peGVkQ29udGV4dFtzS2V5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gdmFsaWRhdGUgaWYgYSBsaW5rIG11c3QgYmUgcmVuZGVyZWRcblx0XHRcdFx0b1NoZWxsU2VydmljZXNcblx0XHRcdFx0XHQuaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0OiB7XG5cdFx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG9EYXRhUG9pbnQuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdFx0YWN0aW9uOiBvRGF0YVBvaW50LmFjdGlvblxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRwYXJhbXM6IG9QYXJhbXNcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdKVxuXHRcdFx0XHRcdC50aGVuKChhTGlua3MpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBmblNldExpbmtFbmFibGVtZW50KHNJZCwgYUxpbmtzKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmbk9uRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGhhbmRsZXJzID0ge1xuXHRcdC8qKlxuXHRcdCAqIEludm9rZXMgdGhlIHBhZ2UgcHJpbWFyeSBhY3Rpb24gb24gcHJlc3Mgb2YgQ3RybCtFbnRlci5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgcGFnZSBjb250cm9sbGVyXG5cdFx0ICogQHBhcmFtIG9WaWV3XG5cdFx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgY2FsbGVkXG5cdFx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHRcdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY29udGV4dHNdIE1hbmRhdG9yeSBmb3IgYSBib3VuZCBhY3Rpb24sIGVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIGNhbGxlZFxuXHRcdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb247IGFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdFx0ICogQHBhcmFtIFttQ29uZGl0aW9uc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHRcdCAqIEBwYXJhbSBbbUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25WaXNpYmxlXSBUaGUgdmlzaWJpbGl0eSBvZiBzZW1hdGljIHBvc2l0aXZlIGFjdGlvblxuXHRcdCAqIEBwYXJhbSBbbUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25FbmFibGVkXSBUaGUgZW5hYmxlbWVudCBvZiBzZW1hbnRpYyBwb3NpdGl2ZSBhY3Rpb25cblx0XHQgKiBAcGFyYW0gW21Db25kaXRpb25zLmVkaXRBY3Rpb25WaXNpYmxlXSBUaGUgRWRpdCBidXR0b24gdmlzaWJpbGl0eVxuXHRcdCAqIEBwYXJhbSBbbUNvbmRpdGlvbnMuZWRpdEFjdGlvbkVuYWJsZWRdIFRoZSBlbmFibGVtZW50IG9mIEVkaXQgYnV0dG9uXG5cdFx0ICogQHVpNS1yZXN0cmljdGVkXG5cdFx0ICogQGZpbmFsXG5cdFx0ICovXG5cdFx0b25QcmltYXJ5QWN0aW9uKFxuXHRcdFx0b0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLFxuXHRcdFx0b1ZpZXc6IFZpZXcsXG5cdFx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0XHRtUGFyYW1ldGVyczogdW5rbm93bixcblx0XHRcdG1Db25kaXRpb25zOiB7XG5cdFx0XHRcdHBvc2l0aXZlQWN0aW9uVmlzaWJsZTogYm9vbGVhbjtcblx0XHRcdFx0cG9zaXRpdmVBY3Rpb25FbmFibGVkOiBib29sZWFuO1xuXHRcdFx0XHRlZGl0QWN0aW9uVmlzaWJsZTogYm9vbGVhbjtcblx0XHRcdFx0ZWRpdEFjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG5cdFx0XHR9XG5cdFx0KSB7XG5cdFx0XHRjb25zdCBpVmlld0xldmVsID0gKG9Db250cm9sbGVyLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudmlld0xldmVsLFxuXHRcdFx0XHRvT2JqZWN0UGFnZSA9IG9Db250cm9sbGVyLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0aWYgKG1Db25kaXRpb25zLnBvc2l0aXZlQWN0aW9uVmlzaWJsZSkge1xuXHRcdFx0XHRpZiAobUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25FbmFibGVkKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIuaGFuZGxlcnMub25DYWxsQWN0aW9uKG9WaWV3LCBzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG1Db25kaXRpb25zLmVkaXRBY3Rpb25WaXNpYmxlICYmIGlWaWV3TGV2ZWwgPT09IDEpIHtcblx0XHRcdFx0aWYgKG1Db25kaXRpb25zLmVkaXRBY3Rpb25FbmFibGVkKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXREb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoaVZpZXdMZXZlbCA9PT0gMSAmJiBvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikpIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuX3NhdmVEb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9PYmplY3RQYWdlLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSkge1xuXHRcdFx0XHRvQ29udHJvbGxlci5fYXBwbHlEb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdG9uVGFibGVDb250ZXh0Q2hhbmdlKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1NvdXJjZSA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdGxldCBvVGFibGU6IGFueTtcblx0XHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5zb21lKGZ1bmN0aW9uIChfb1RhYmxlOiBhbnkpIHtcblx0XHRcdFx0aWYgKF9vVGFibGUuZ2V0Um93QmluZGluZygpID09PSBvU291cmNlKSB7XG5cdFx0XHRcdFx0b1RhYmxlID0gX29UYWJsZTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3Qgb0N1cnJlbnRBY3Rpb25Qcm9taXNlID0gdGhpcy5fZWRpdEZsb3cuZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvblByb21pc2UpIHtcblx0XHRcdFx0bGV0IGFUYWJsZUNvbnRleHRzOiBhbnk7XG5cdFx0XHRcdGlmIChvVGFibGUuZ2V0VHlwZSgpLmdldE1ldGFkYXRhKCkuaXNBKFwic2FwLnVpLm1kYy50YWJsZS5HcmlkVGFibGVUeXBlXCIpKSB7XG5cdFx0XHRcdFx0YVRhYmxlQ29udGV4dHMgPSBvU291cmNlLmdldENvbnRleHRzKDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFUYWJsZUNvbnRleHRzID0gb1NvdXJjZS5nZXRDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvL2lmIGNvbnRleHRzIGFyZSBub3QgZnVsbHkgbG9hZGVkIHRoZSBnZXRjb250ZXh0cyBmdW5jdGlvbiBhYm92ZSB3aWxsIHRyaWdnZXIgYSBuZXcgY2hhbmdlIGV2ZW50IGNhbGxcblx0XHRcdFx0aWYgKCFhVGFibGVDb250ZXh0c1swXSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRvQ3VycmVudEFjdGlvblByb21pc2Vcblx0XHRcdFx0XHQudGhlbigob0FjdGlvblJlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGlmICghb0FjdGlvblJlc3BvbnNlIHx8IG9BY3Rpb25SZXNwb25zZS5jb250cm9sSWQgIT09IG9UYWJsZS5zSWQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbkRhdGEgPSBvQWN0aW9uUmVzcG9uc2Uub0RhdGE7XG5cdFx0XHRcdFx0XHRjb25zdCBhS2V5cyA9IG9BY3Rpb25SZXNwb25zZS5rZXlzO1xuXHRcdFx0XHRcdFx0bGV0IGlOZXdJdGVtcCA9IC0xO1xuXHRcdFx0XHRcdFx0YVRhYmxlQ29udGV4dHMuZmluZChmdW5jdGlvbiAob1RhYmxlQ29udGV4dDogYW55LCBpOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb1RhYmxlRGF0YSA9IG9UYWJsZUNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJDb21wYXJlID0gYUtleXMuZXZlcnkoZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvVGFibGVEYXRhW3NLZXldID09PSBvQWN0aW9uRGF0YVtzS2V5XTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGlmIChiQ29tcGFyZSkge1xuXHRcdFx0XHRcdFx0XHRcdGlOZXdJdGVtcCA9IGk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIGJDb21wYXJlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRpZiAoaU5ld0l0ZW1wICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhRGlhbG9ncyA9IEluc3RhbmNlTWFuYWdlci5nZXRPcGVuRGlhbG9ncygpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID1cblx0XHRcdFx0XHRcdFx0XHRhRGlhbG9ncy5sZW5ndGggPiAwID8gYURpYWxvZ3MuZmluZCgoZGlhbG9nKSA9PiBkaWFsb2cuZGF0YShcIkZ1bGxTY3JlZW5EaWFsb2dcIikgIT09IHRydWUpIDogbnVsbDtcblx0XHRcdFx0XHRcdFx0aWYgKG9EaWFsb2cpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBieSBkZXNpZ24sIGEgc2FwLm0uZGlhbG9nIHNldCB0aGUgZm9jdXMgdG8gdGhlIHByZXZpb3VzIGZvY3VzZWQgZWxlbWVudCB3aGVuIGNsb3NpbmcuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIHdhaXQgZm9yIHRoZSBkaWFsb2cgdG8gYmUgY2xvc2UgYmVmb3JlIHRvIGZvY3VzIGFub3RoZXIgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuYXR0YWNoRXZlbnRPbmNlKFwiYWZ0ZXJDbG9zZVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvVGFibGUuZm9jdXNSb3coaU5ld0l0ZW1wLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRvVGFibGUuZm9jdXNSb3coaU5ld0l0ZW1wLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGlzLl9lZGl0Rmxvdy5kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBBbiBlcnJvciBvY2N1cnMgd2hpbGUgc2Nyb2xsaW5nIHRvIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW06ICR7ZXJyfWApO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gZmlyZSBNb2RlbENvbnRleHRDaGFuZ2Ugb24gdGhlIG1lc3NhZ2UgYnV0dG9uIHdoZW5ldmVyIHRoZSB0YWJsZSBjb250ZXh0IGNoYW5nZXNcblx0XHRcdHRoaXMubWVzc2FnZUJ1dHRvbi5maXJlTW9kZWxDb250ZXh0Q2hhbmdlKCk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEludm9rZXMgYW4gYWN0aW9uIC0gYm91bmQvdW5ib3VuZCBhbmQgc2V0cyB0aGUgcGFnZSBkaXJ0eS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBvVmlld1xuXHRcdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHRcdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmNvbnRleHRzXSBNYW5kYXRvcnkgZm9yIGEgYm91bmQgYWN0aW9uLCBlaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyBjYWxsZWRcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOyBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHRcdCAqIEByZXR1cm5zIFRoZSBhY3Rpb24gcHJvbWlzZVxuXHRcdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHRcdCAqIEBmaW5hbFxuXHRcdCAqL1xuXHRcdG9uQ2FsbEFjdGlvbihvVmlldzogYW55LCBzQWN0aW9uTmFtZTogc3RyaW5nLCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdHJldHVybiBvQ29udHJvbGxlci5lZGl0Rmxvd1xuXHRcdFx0XHQuaW52b2tlQWN0aW9uKHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycylcblx0XHRcdFx0LnRoZW4ob0NvbnRyb2xsZXIuX3Nob3dNZXNzYWdlUG9wb3Zlci5iaW5kKG9Db250cm9sbGVyLCB1bmRlZmluZWQpKVxuXHRcdFx0XHQuY2F0Y2gob0NvbnRyb2xsZXIuX3Nob3dNZXNzYWdlUG9wb3Zlci5iaW5kKG9Db250cm9sbGVyKSk7XG5cdFx0fSxcblx0XHRvbkRhdGFQb2ludFRpdGxlUHJlc3NlZChvQ29udHJvbGxlcjogYW55LCBvU291cmNlOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnksIHNDb250cm9sQ29uZmlnOiBhbnksIHNDb2xsZWN0aW9uUGF0aDogYW55KSB7XG5cdFx0XHRvTWFuaWZlc3RPdXRib3VuZCA9IHR5cGVvZiBvTWFuaWZlc3RPdXRib3VuZCA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2Uob01hbmlmZXN0T3V0Ym91bmQpIDogb01hbmlmZXN0T3V0Ym91bmQ7XG5cdFx0XHRjb25zdCBvVGFyZ2V0SW5mbyA9IG9NYW5pZmVzdE91dGJvdW5kW3NDb250cm9sQ29uZmlnXSxcblx0XHRcdFx0YVNlbWFudGljT2JqZWN0TWFwcGluZyA9IENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0TWFwcGluZyhvVGFyZ2V0SW5mbyksXG5cdFx0XHRcdG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQgPSBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHRcblx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdC5nZXRNZXRhUGF0aChvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRsZXQgYU5hdmlnYXRpb25EYXRhID0gb0NvbnRyb2xsZXIuX2dldENoYXJ0Q29udGV4dERhdGEob0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCwgc0NvbGxlY3Rpb25QYXRoKTtcblx0XHRcdGxldCBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM7XG5cblx0XHRcdGFOYXZpZ2F0aW9uRGF0YSA9IGFOYXZpZ2F0aW9uRGF0YS5tYXAoZnVuY3Rpb24gKG9OYXZpZ2F0aW9uRGF0YTogYW55KSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZGF0YTogb05hdmlnYXRpb25EYXRhLFxuXHRcdFx0XHRcdG1ldGFQYXRoOiBzTWV0YVBhdGggKyAoc0NvbGxlY3Rpb25QYXRoID8gYC8ke3NDb2xsZWN0aW9uUGF0aH1gIDogXCJcIilcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKG9UYXJnZXRJbmZvICYmIG9UYXJnZXRJbmZvLnBhcmFtZXRlcnMpIHtcblx0XHRcdFx0Y29uc3Qgb1BhcmFtcyA9IG9UYXJnZXRJbmZvLnBhcmFtZXRlcnMgJiYgb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5nZXRPdXRib3VuZFBhcmFtcyhvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzKTtcblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9QYXJhbXMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvUGFyYW1zO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob1RhcmdldEluZm8gJiYgb1RhcmdldEluZm8uc2VtYW50aWNPYmplY3QgJiYgb1RhcmdldEluZm8uYWN0aW9uKSB7XG5cdFx0XHRcdG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ubmF2aWdhdGUob1RhcmdldEluZm8uc2VtYW50aWNPYmplY3QsIG9UYXJnZXRJbmZvLmFjdGlvbiwge1xuXHRcdFx0XHRcdG5hdmlnYXRpb25Db250ZXh0czogYU5hdmlnYXRpb25EYXRhLFxuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZzogYVNlbWFudGljT2JqZWN0TWFwcGluZyxcblx0XHRcdFx0XHRhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVyc1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIFRyaWdnZXJzIGFuIG91dGJvdW5kIG5hdmlnYXRpb24gd2hlbiBhIHVzZXIgY2hvb3NlcyB0aGUgY2hldnJvbi5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBvQ29udHJvbGxlclxuXHRcdCAqIEBwYXJhbSBzT3V0Ym91bmRUYXJnZXQgTmFtZSBvZiB0aGUgb3V0Ym91bmQgdGFyZ2V0IChuZWVkcyB0byBiZSBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdClcblx0XHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb3IgdGhlIHRhcmdldCBhcHBcblx0XHQgKiBAcGFyYW0gc0NyZWF0ZVBhdGggQ3JlYXRlIHBhdGggd2hlbiB0aGUgY2hldnJvbiBpcyBjcmVhdGVkLlxuXHRcdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWQgKD8/PyBtYXliZSBvbmx5IG9uY2UgZmluaXNoZWQ/KVxuXHRcdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHRcdCAqIEBmaW5hbFxuXHRcdCAqL1xuXHRcdG9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIHNPdXRib3VuZFRhcmdldDogc3RyaW5nLCBvQ29udGV4dDogYW55LCBzQ3JlYXRlUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXIsIHNPdXRib3VuZFRhcmdldCwgb0NvbnRleHQsIHNDcmVhdGVQYXRoKTtcblx0XHR9LFxuXG5cdFx0b25OYXZpZ2F0ZUNoYW5nZSh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdC8vd2lsbCBiZSBjYWxsZWQgYWx3YXlzIHdoZW4gd2UgY2xpY2sgb24gYSBzZWN0aW9uIHRhYlxuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0dGhpcy5iU2VjdGlvbk5hdmlnYXRlZCA9IHRydWU7XG5cblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9PYmplY3RQYWdlLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSAmJlxuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnNlY3Rpb25MYXlvdXQgPT09IFwiVGFic1wiICYmXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImVycm9yTmF2aWdhdGlvblNlY3Rpb25GbGFnXCIpID09PSBmYWxzZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IG9TdWJTZWN0aW9uID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1YlNlY3Rpb25cIik7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShbb1N1YlNlY3Rpb25dKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uVmFyaWFudFNlbGVjdGVkOiBmdW5jdGlvbiAodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpIHtcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHR9LFxuXHRcdG9uVmFyaWFudFNhdmVkOiBmdW5jdGlvbiAodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpIHtcblx0XHRcdC8vVE9ETzogU2hvdWxkIHJlbW92ZSB0aGlzIHNldFRpbWVPdXQgb25jZSBWYXJpYW50IE1hbmFnZW1lbnQgcHJvdmlkZXMgYW4gYXBpIHRvIGZldGNoIHRoZSBjdXJyZW50IHZhcmlhbnQga2V5IG9uIHNhdmVcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0XHR9LCA1MDApO1xuXHRcdH0sXG5cdFx0bmF2aWdhdGVUb1N1YlNlY3Rpb246IGZ1bmN0aW9uIChvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIHZEZXRhaWxDb25maWc6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0RldGFpbENvbmZpZyA9IHR5cGVvZiB2RGV0YWlsQ29uZmlnID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZSh2RGV0YWlsQ29uZmlnKSA6IHZEZXRhaWxDb25maWc7XG5cdFx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IG9Db250cm9sbGVyLmdldFZpZXcoKS5ieUlkKFwiZmU6Ok9iamVjdFBhZ2VcIikgYXMgT2JqZWN0UGFnZUxheW91dDtcblx0XHRcdGxldCBvU2VjdGlvbjtcblx0XHRcdGxldCBvU3ViU2VjdGlvbjtcblx0XHRcdGlmIChvRGV0YWlsQ29uZmlnLnNlY3Rpb25JZCkge1xuXHRcdFx0XHRvU2VjdGlvbiA9IG9Db250cm9sbGVyLmdldFZpZXcoKS5ieUlkKG9EZXRhaWxDb25maWcuc2VjdGlvbklkKSBhcyBPYmplY3RQYWdlU2VjdGlvbjtcblx0XHRcdFx0b1N1YlNlY3Rpb24gPSAoXG5cdFx0XHRcdFx0b0RldGFpbENvbmZpZy5zdWJTZWN0aW9uSWRcblx0XHRcdFx0XHRcdD8gb0NvbnRyb2xsZXIuZ2V0VmlldygpLmJ5SWQob0RldGFpbENvbmZpZy5zdWJTZWN0aW9uSWQpXG5cdFx0XHRcdFx0XHQ6IG9TZWN0aW9uICYmIG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKCkgJiYgb1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKVswXVxuXHRcdFx0XHQpIGFzIE9iamVjdFBhZ2VTdWJTZWN0aW9uO1xuXHRcdFx0fSBlbHNlIGlmIChvRGV0YWlsQ29uZmlnLnN1YlNlY3Rpb25JZCkge1xuXHRcdFx0XHRvU3ViU2VjdGlvbiA9IG9Db250cm9sbGVyLmdldFZpZXcoKS5ieUlkKG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkKSBhcyBPYmplY3RQYWdlU3ViU2VjdGlvbjtcblx0XHRcdFx0b1NlY3Rpb24gPSBvU3ViU2VjdGlvbiAmJiAob1N1YlNlY3Rpb24uZ2V0UGFyZW50KCkgYXMgT2JqZWN0UGFnZVNlY3Rpb24pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFvU2VjdGlvbiB8fCAhb1N1YlNlY3Rpb24gfHwgIW9TZWN0aW9uLmdldFZpc2libGUoKSB8fCAhb1N1YlNlY3Rpb24uZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRcdCgob0NvbnRyb2xsZXIuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc291cmNlQnVuZGxlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzVGl0bGUgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XCJDX1JPVVRJTkdfTkFWSUdBVElPTl9ESVNBQkxFRF9USVRMRVwiLFxuXHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdChvQ29udHJvbGxlci5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmVudGl0eVNldFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihzVGl0bGUpO1xuXHRcdFx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihzVGl0bGUpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGVycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9PYmplY3RQYWdlLnNjcm9sbFRvU2VjdGlvbihvU3ViU2VjdGlvbi5nZXRJZCgpKTtcblx0XHRcdFx0Ly8gdHJpZ2dlciBpYXBwIHN0YXRlIGNoYW5nZVxuXHRcdFx0XHRvT2JqZWN0UGFnZS5maXJlTmF2aWdhdGUoe1xuXHRcdFx0XHRcdHNlY3Rpb246IG9TZWN0aW9uLFxuXHRcdFx0XHRcdHN1YlNlY3Rpb246IG9TdWJTZWN0aW9uXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25DaGFydFNlbGVjdGlvbkNoYW5nZWQ6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0Q2hhcnRSdW50aW1lLmZuVXBkYXRlQ2hhcnQob0V2ZW50KTtcblx0XHR9LFxuXHRcdG9uU3RhdGVDaGFuZ2UodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpIHtcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IE9iamVjdFBhZ2VDb250cm9sbGVyO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWtqQk8sZ0JBQWdCQSxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7SUFDckMsSUFBSTtNQUNILElBQUlDLE1BQU0sR0FBR0YsSUFBSSxFQUFqQjtJQUNBLENBRkQsQ0FFRSxPQUFN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
1607
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiZmluYWxpemVyIiwiYmluZCIsIk9iamVjdFBhZ2VDb250cm9sbGVyIiwiZGVmaW5lVUk1Q2xhc3MiLCJ1c2luZ0V4dGVuc2lvbiIsIlBsYWNlaG9sZGVyIiwiRWRpdEZsb3ciLCJTaGFyZSIsIm92ZXJyaWRlIiwiU2hhcmVPdmVycmlkZXMiLCJJbnRlcm5hbEVkaXRGbG93IiwiRWRpdEZsb3dPdmVycmlkZXMiLCJJbnRlcm5hbFJvdXRpbmciLCJJbnRlcm5hbFJvdXRpbmdPdmVycmlkZSIsIlBhZ2luYXRvciIsIlBhZ2luYXRvck92ZXJyaWRlIiwiTWVzc2FnZUhhbmRsZXIiLCJNZXNzYWdlSGFuZGxlck92ZXJyaWRlIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUiLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE5hdmlnYXRpb25Nb2RlIiwiYklzU3RpY2t5RWRpdE1vZGUiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsImdldFN0aWNreUVkaXRNb2RlIiwidW5kZWZpbmVkIiwiVmlld1N0YXRlIiwiVmlld1N0YXRlT3ZlcnJpZGVzIiwiUGFnZVJlYWR5IiwiaXNDb250ZXh0RXhwZWN0ZWQiLCJNYXNzRWRpdCIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJoYW5kbGVycyIsIm9uUHJpbWFyeUFjdGlvbiIsIm9Db250cm9sbGVyIiwib1ZpZXciLCJvQ29udGV4dCIsInNBY3Rpb25OYW1lIiwibVBhcmFtZXRlcnMiLCJtQ29uZGl0aW9ucyIsImlWaWV3TGV2ZWwiLCJnZXRWaWV3RGF0YSIsInZpZXdMZXZlbCIsIm9PYmplY3RQYWdlIiwiX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sIiwicG9zaXRpdmVBY3Rpb25WaXNpYmxlIiwicG9zaXRpdmVBY3Rpb25FbmFibGVkIiwib25DYWxsQWN0aW9uIiwiZWRpdEFjdGlvblZpc2libGUiLCJlZGl0QWN0aW9uRW5hYmxlZCIsIl9lZGl0RG9jdW1lbnQiLCJnZXRNb2RlbCIsImdldFByb3BlcnR5IiwiX3NhdmVEb2N1bWVudCIsIl9hcHBseURvY3VtZW50Iiwib25UYWJsZUNvbnRleHRDaGFuZ2UiLCJvRXZlbnQiLCJvU291cmNlIiwiZ2V0U291cmNlIiwib1RhYmxlIiwiX2ZpbmRUYWJsZXMiLCJzb21lIiwiX29UYWJsZSIsImdldFJvd0JpbmRpbmciLCJvQ3VycmVudEFjdGlvblByb21pc2UiLCJfZWRpdEZsb3ciLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImFUYWJsZUNvbnRleHRzIiwiZ2V0VHlwZSIsImdldE1ldGFkYXRhIiwiaXNBIiwiZ2V0Q29udGV4dHMiLCJnZXRDdXJyZW50Q29udGV4dHMiLCJvQWN0aW9uUmVzcG9uc2UiLCJjb250cm9sSWQiLCJzSWQiLCJvQWN0aW9uRGF0YSIsIm9EYXRhIiwiYUtleXMiLCJrZXlzIiwiaU5ld0l0ZW1wIiwiZmluZCIsIm9UYWJsZUNvbnRleHQiLCJpIiwib1RhYmxlRGF0YSIsImdldE9iamVjdCIsImJDb21wYXJlIiwiZXZlcnkiLCJzS2V5IiwiYURpYWxvZ3MiLCJJbnN0YW5jZU1hbmFnZXIiLCJnZXRPcGVuRGlhbG9ncyIsIm9EaWFsb2ciLCJsZW5ndGgiLCJkaWFsb2ciLCJkYXRhIiwiYXR0YWNoRXZlbnRPbmNlIiwiZm9jdXNSb3ciLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImNhdGNoIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJtZXNzYWdlQnV0dG9uIiwiZmlyZU1vZGVsQ29udGV4dENoYW5nZSIsImVkaXRGbG93IiwiaW52b2tlQWN0aW9uIiwiX3Nob3dNZXNzYWdlUG9wb3ZlciIsIm9uRGF0YVBvaW50VGl0bGVQcmVzc2VkIiwib01hbmlmZXN0T3V0Ym91bmQiLCJzQ29udHJvbENvbmZpZyIsInNDb2xsZWN0aW9uUGF0aCIsIkpTT04iLCJwYXJzZSIsIm9UYXJnZXRJbmZvIiwiYVNlbWFudGljT2JqZWN0TWFwcGluZyIsIkNvbW1vblV0aWxzIiwiZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nIiwib0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwic01ldGFQYXRoIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiYU5hdmlnYXRpb25EYXRhIiwiX2dldENoYXJ0Q29udGV4dERhdGEiLCJhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJtYXAiLCJvTmF2aWdhdGlvbkRhdGEiLCJtZXRhUGF0aCIsInBhcmFtZXRlcnMiLCJvUGFyYW1zIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE91dGJvdW5kUGFyYW1zIiwiT2JqZWN0Iiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJuYXZpZ2F0ZSIsIm5hdmlnYXRpb25Db250ZXh0cyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInNPdXRib3VuZFRhcmdldCIsInNDcmVhdGVQYXRoIiwib25OYXZpZ2F0ZUNoYW5nZSIsImdldEV4dGVuc2lvbkFQSSIsInVwZGF0ZUFwcFN0YXRlIiwiYlNlY3Rpb25OYXZpZ2F0ZWQiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJzZWN0aW9uTGF5b3V0Iiwib1N1YlNlY3Rpb24iLCJnZXRQYXJhbWV0ZXIiLCJfdXBkYXRlRm9jdXNJbkVkaXRNb2RlIiwib25WYXJpYW50U2VsZWN0ZWQiLCJvblZhcmlhbnRTYXZlZCIsInNldFRpbWVvdXQiLCJuYXZpZ2F0ZVRvU3ViU2VjdGlvbiIsInZEZXRhaWxDb25maWciLCJvRGV0YWlsQ29uZmlnIiwiYnlJZCIsIm9TZWN0aW9uIiwic2VjdGlvbklkIiwic3ViU2VjdGlvbklkIiwiZ2V0U3ViU2VjdGlvbnMiLCJnZXRQYXJlbnQiLCJnZXRWaXNpYmxlIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJzVGl0bGUiLCJnZXRUcmFuc2xhdGVkVGV4dCIsImVudGl0eVNldCIsIk1lc3NhZ2VCb3giLCJzY3JvbGxUb1NlY3Rpb24iLCJnZXRJZCIsImZpcmVOYXZpZ2F0ZSIsInNlY3Rpb24iLCJzdWJTZWN0aW9uIiwib25DaGFydFNlbGVjdGlvbkNoYW5nZWQiLCJDaGFydFJ1bnRpbWUiLCJmblVwZGF0ZUNoYXJ0Iiwib25TdGF0ZUNoYW5nZSIsIm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyIsIkV4dGVuc2lvbkFQSSIsImV4dGVuc2lvbkFQSSIsIm9uSW5pdCIsInNldFByb3BlcnR5IiwidmlzaWJpbGl0eSIsIml0ZW1zIiwiX2dldEJhdGNoR3JvdXBzRm9yVmlldyIsInVzZU5ld0xhenlMb2FkaW5nIiwiZ2V0RW5hYmxlTGF6eUxvYWRpbmciLCJhdHRhY2hFdmVudCIsIl9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0Iiwib0l0ZW1CaW5kaW5nIiwiYXR0YWNoQ2hhbmdlIiwiX2ZuU2hvd09QTWVzc2FnZSIsIm9uRXhpdCIsImRlc3Ryb3kiLCJvTWVzc2FnZVBvcG92ZXIiLCJpc09wZW4iLCJjbG9zZSIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiaXNDb25uZWN0ZWQiLCJkaXNjb25uZWN0IiwidmlldyIsIm1lc3NhZ2VzIiwiZ2V0SXRlbXMiLCJpdGVtIiwiZmlsdGVyIiwibWVzc2FnZSIsImdldFRhcmdldHMiLCJzaG93TWVzc2FnZXMiLCJfZ2V0VGFibGVCaW5kaW5nIiwiY2hlY2tTZWN0aW9uc0ZvckdyaWRUYWJsZSIsInN1YlNlY3Rpb25zIiwiY2hhbmdlQ2xhc3NGb3JUYWJsZXMiLCJldmVudCIsImxhc3RWaXNpYmxlU3ViU2VjdGlvbiIsImJsb2NrcyIsImdldEJsb2NrcyIsImdldE1vcmVCbG9ja3MiLCJzZWFyY2hUYWJsZUluQmxvY2siLCJhZGRTdHlsZUNsYXNzIiwiZGV0YWNoRXZlbnQiLCJzdWJTZWN0aW9uSW5kZXgiLCJibG9jayIsImNvbnRyb2wiLCJjb250ZW50IiwidGFibGVBUEkiLCJvbkJlZm9yZVJlbmRlcmluZyIsIlBhZ2VDb250cm9sbGVyIiwicHJvdG90eXBlIiwiYXBwbHkiLCJvVmlld0RhdGEiLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiQ29tbW9uSGVscGVyIiwic2V0TWV0YU1vZGVsIiwiZ2V0QXBwQ29tcG9uZW50Iiwib25BZnRlclJlbmRlcmluZyIsInJlc3BvbnNlIiwib0Vycm9yIiwiZ2V0VXNlSWNvblRhYkJhciIsInNlY3Rpb25zIiwiZ2V0U2VjdGlvbnMiLCJfZ2V0QWxsU3ViU2VjdGlvbnMiLCJfb25CZWZvcmVCaW5kaW5nIiwiYVRhYmxlcyIsIm9JbnRlcm5hbE1vZGVsIiwiYUJhdGNoR3JvdXBzIiwib0Zhc3RDcmVhdGlvblJvdyIsInB1c2giLCJiRHJhZnROYXZpZ2F0aW9uIiwiX2Nsb3NlU2lkZUNvbnRlbnQiLCJvcENvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJnZXRDcmVhdGlvblJvdyIsInNldEJpbmRpbmdDb250ZXh0IiwiZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uIiwiaXNGaXJzdFJlbmRlcmluZyIsImJQZXJzaXN0T1BTY3JvbGwiLCJzZXRTZWxlY3RlZFNlY3Rpb24iLCJvRGVsZWdhdGVPbkJlZm9yZSIsImFkZEV2ZW50RGVsZWdhdGUiLCJwYWdlUmVhZHkiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwib0JpbmRpbmciLCJsaXN0QmluZGluZyIsIm9QYWdpbmF0b3JDdXJyZW50Q29udGV4dCIsIm9CaW5kaW5nVG9Vc2UiLCJwYWdpbmF0b3IiLCJpbml0aWFsaXplIiwic0JpbmRpbmdQYXRoIiwidGVzdCIsInNMaXN0QmluZGluZ1BhdGgiLCJyZXBsYWNlIiwiT0RhdGFMaXN0QmluZGluZyIsIm9Nb2RlbCIsIl9zZXRMaXN0QmluZGluZ0FzeW5jIiwiYVNlY3Rpb25zIiwiYlVzZUljb25UYWJCYXIiLCJpU2tpcCIsImJJc0luRWRpdE1vZGUiLCJiRWRpdGFibGVIZWFkZXIiLCJlZGl0YWJsZUhlYWRlckNvbnRlbnQiLCJpU2VjdGlvbiIsImFTdWJTZWN0aW9ucyIsImlTdWJTZWN0aW9uIiwiaXNWaXNpYmlsaXR5RHluYW1pYyIsInBsYWNlaG9sZGVyIiwiaXNQbGFjZWhvbGRlckVuYWJsZWQiLCJzaG93UGxhY2Vob2xkZXIiLCJvTmF2Q29udGFpbmVyIiwib0NvbnRhaW5lciIsIl9nZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQiLCJvRmlyc3RDbGlja2FibGVFbGVtZW50IiwiYUFjdGlvbnMiLCJnZXRIZWFkZXJUaXRsZSIsImdldEFjdGlvbnMiLCJvQWN0aW9uIiwiZ2V0RW5hYmxlZCIsIl9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbiIsImFCbG9ja3MiLCJhRm9ybUNvbnRhaW5lcnMiLCJnZXRGb3JtQ29udGFpbmVycyIsImdldENvbnRlbnQiLCJmb3JtQ29udGFpbmVyIiwiYUZvcm1FbGVtZW50cyIsImdldEZvcm1FbGVtZW50cyIsImZvcm1FbGVtZW50IiwiYUZpZWxkcyIsImdldEZpZWxkcyIsImdldFJlcXVpcmVkIiwiZ2V0VmFsdWUiLCJkZWJ1ZyIsIm9NYW5kYXRvcnlGaWVsZCIsIm9GaWVsZFRvRm9jdXMiLCJnZXRDb250ZW50RWRpdCIsIl9nZXRGaXJzdEVkaXRhYmxlSW5wdXQiLCJmb2N1cyIsIl9vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdCIsIm1lc3NhZ2VIYW5kbGVyIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZ2V0Um91dGVyUHJveHkiLCJjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0IiwiaGlzdG9yeSIsImJhY2siLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiRnVuY3Rpb24iLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiX29uQWZ0ZXJCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwiZW5hYmxlRmFzdENyZWF0aW9uUm93Iiwib0xpc3RCaW5kaW5nIiwib0Zhc3RDcmVhdGlvbkxpc3RCaW5kaW5nIiwib0Zhc3RDcmVhdGlvbkNvbnRleHQiLCJvRmluYWxVSVN0YXRlIiwiYmluZExpc3QiLCJnZXRDb250ZXh0IiwiJCR1cGRhdGVHcm91cElkIiwiJCRncm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwiY3JlYXRlZCIsInRyYWNlIiwiX3NpZGVFZmZlY3RzIiwiY2xlYXJQcm9wZXJ0aWVzU3RhdHVzIiwiYUlCTkFjdGlvbnMiLCJmb3JFYWNoIiwiZ2V0SUJOQWN0aW9ucyIsIm9UYWJsZVJvd0JpbmRpbmciLCJNb2RlbEhlbHBlciIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsInJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzIiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsInBhcnNlQ3VzdG9tRGF0YSIsIkRlbGVnYXRlVXRpbCIsImdldEN1c3RvbURhdGEiLCJhU2VsZWN0ZWRDb250ZXh0cyIsImdldFNlbGVjdGVkQ29udGV4dHMiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudCIsImNsZWFyU2VsZWN0aW9uIiwiZ2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbCIsIm9PYmplY3RQYWdlVGl0bGUiLCJhSUJOSGVhZGVyQWN0aW9ucyIsImNvbmNhdCIsInVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5IiwiaGFuZGxlVGFibGVNb2RpZmljYXRpb25zIiwiZm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzIiwiZm5IYW5kbGVDaGFuZ2UiLCJkZXRhY2hDaGFuZ2UiLCJjb21wdXRlRWRpdE1vZGUiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsImNvbm5lY3QiLCJvQ2FjaGUiLCJfdXBkYXRlUmVsYXRlZEFwcHMiLCJmblVwZGF0ZVJlbGF0ZWRBcHBzIiwiZGV0YWNoRGF0YVJlY2VpdmVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwiY3VycmVudEJpbmRpbmciLCJoYW5kbGVQYXRjaFNlbnQiLCJUYWJsZVV0aWxzIiwid2hlbkJvdW5kIiwiX3RyaWdnZXJWaXNpYmxlU3ViU2VjdGlvbnNFdmVudHMiLCJvblBhZ2VSZWFkeSIsInNldEZvY3VzIiwiaXNJbkRpc3BsYXlNb2RlIiwib1NlbGVjdGVkU2VjdGlvbiIsIkNvcmUiLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJiSXNTdGlja3lNb2RlIiwib0FwcENvbXBvbmVudCIsImdldFNoZWxsU2VydmljZXMiLCJzZXRCYWNrTmF2aWdhdGlvbiIsImdldEFwcFN0YXRlSGFuZGxlciIsImFwcGx5QXBwU3RhdGUiLCJmb3JjZUZvY3VzIiwiRXJyb3IiLCJfY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbiIsIl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbiIsIm9PYmplY3RQYWdlU3VidGl0bGUiLCJvQ3VzdG9tRGF0YSIsImdldEtleSIsInRpdGxlIiwic3VidGl0bGUiLCJpbnRlbnQiLCJpY29uIiwiX2V4ZWN1dGVIZWFkZXJTaG9ydGN1dCIsInNCdXR0b25JZCIsIm9CdXR0b24iLCJvRWxlbWVudCIsImZpcmVCdXR0b25QcmVzcyIsIl9leGVjdXRlRm9vdGVyU2hvcnRjdXQiLCJnZXRGb290ZXIiLCJnZXROYW1lIiwiX2V4ZWN1dGVUYWJTaG9ydEN1dCIsIm9FeGVjdXRpb24iLCJpU2VjdGlvbkluZGV4TWF4Iiwic0NvbW1hbmQiLCJnZXRDb21tYW5kIiwibmV3U2VjdGlvbiIsImlTZWxlY3RlZFNlY3Rpb25JbmRleCIsImluZGV4T2ZTZWN0aW9uIiwiX2dldEZvb3RlclZpc2liaWxpdHkiLCJzVmlld0lkIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwib01lc3NhZ2UiLCJ2YWxpZGF0aW9uIiwidHlwZSIsInRhcmdldCIsImluZGV4T2YiLCJvUmV0Iiwicm9vdFZpZXdDb250cm9sbGVyIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiY3VycmVudFBhZ2VWaWV3IiwiaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0VmlldyIsImdldFJvb3RDb250YWluZXIiLCJnZXRDdXJyZW50UGFnZSIsIm9NZXNzYWdlQnV0dG9uIiwiZ2V0TGVuZ3RoIiwic2V0VmlzaWJsZSIsIm9wZW5CeSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZWRpdERvY3VtZW50IiwiZmluYWxseSIsInVubG9jayIsImdldERyYWZ0Um9vdENvbnRleHQiLCJjb250ZXh0IiwiZHJhZnRSb290Q29udGV4dFBhdGgiLCJnZXREcmFmdFJvb3RQYXRoIiwic2ltcGxlRHJhZnRSb290Q29udGV4dCIsImV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2UiLCJnZXRJbnN0YW5jZWRWaWV3cyIsInBhZ2VWaWV3IiwiaW50ZXJuYWxNb2RlbCIsIm1vZGVsIiwibWV0YU1vZGVsIiwic0VudGl0eVBhdGgiLCJtRGF0YU1vZGVsIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJyZXF1ZXN0UHJvcGVydHkiLCJ0YXJnZXRFbnRpdHlUeXBlIiwibmFtZSIsIl92YWxpZGF0ZURvY3VtZW50IiwiZ2V0Q3VycmVudEZvY3VzZWRDb250cm9sSWQiLCJpc1RyYW5zaWVudCIsInN5bmNUYXNrIiwiYXBwQ29tcG9uZW50Iiwic2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZW50aXR5VHlwZSIsImdldEVudGl0eVR5cGVGcm9tQ29udGV4dCIsImdsb2JhbFNpZGVFZmZlY3RzIiwiZ2V0R2xvYmFsT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIlByb21pc2UiLCJhbGwiLCJzaWRlRWZmZWN0cyIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImRyYWZ0Um9vdENvbnRleHQiLCJleGVjdXRlRHJhZnRWYWxpZGF0aW9uIiwiYVdhaXRDcmVhdGVEb2N1bWVudHMiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImNyZWF0aW9uTW9kZSIsImNyZWF0aW9uUm93IiwiY3JlYXRlQXRFbmQiLCJiQ3JlYXRlRG9jdW1lbnQiLCJiU2tpcFNpZGVFZmZlY3RzIiwiY3JlYXRlRG9jdW1lbnQiLCJhQmluZGluZ3MiLCJiaW5kaW5ncyIsInNhdmVEb2N1bWVudCIsImlzTG9ja2VkIiwiX21hbmFnZUNvbGxhYm9yYXRpb24iLCJvcGVuTWFuYWdlRGlhbG9nIiwiX3Nob3dDb2xsYWJvcmF0aW9uVXNlckRldGFpbHMiLCJzaG93VXNlckRldGFpbHMiLCJfY2FuY2VsRG9jdW1lbnQiLCJjYW5jZWxCdXR0b24iLCJjYW5jZWxEb2N1bWVudCIsImFwcGx5RG9jdW1lbnQiLCJyZXNvbHZlU3RyaW5ndG9Cb29sZWFuIiwidXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzIiwiX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uIiwiYVBhcmVudEVsZW1lbnQiLCJhU3Vic2VjdGlvbiIsImFDb250cm9scyIsImJJc0NoYXJ0IiwiZWxlbWVudCIsIm1BZ2dyZWdhdGlvbnMiLCJnZXRBZ2dyZWdhdGlvbiIsImFJdGVtcyIsIm9JdGVtIiwiZ2V0TWFpbkNvbnRlbnQiLCJfZ2V0QWxsQmxvY2tzIiwiX2ZpbmRDaGFydHMiLCJhQ2hhcnRzIiwib0Jsb2NrIiwib0NvbnRlbnQiLCJzZXRTaG93U2lkZUNvbnRlbnQiLCJvQ2hhcnRDb250ZXh0Iiwic0NoYXJ0UGF0aCIsIm9Db250ZXh0RGF0YSIsIm9DaGFydENvbnRleHREYXRhIiwiX3Njcm9sbFRhYmxlc1RvUm93Iiwic1Jvd1BhdGgiLCJUYWJsZVNjcm9sbGVyIiwic2Nyb2xsVGFibGVUb1JvdyIsIl9tZXJnZU11bHRpcGxlQ29udGV4dHMiLCJvUGFnZUNvbnRleHQiLCJhTGluZUNvbnRleHQiLCJhQXR0cmlidXRlcyIsImFQYWdlQXR0cmlidXRlcyIsInNNZXRhUGF0aExpbmUiLCJzUGF0aExpbmUiLCJzUGFnZVBhdGgiLCJvTWV0YU1vZGVsIiwic01ldGFQYXRoUGFnZSIsIm9TaW5nbGVDb250ZXh0Iiwib1N1YkNoYXJ0Q29udGV4dERhdGEiLCJjb250ZXh0RGF0YSIsInJlbW92ZVNlbnNpdGl2ZURhdGEiLCJvUGFnZUxldmVsU1YiLCJhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdGlvblZhcmlhbnQiLCJzZWxlY3Rpb25WYXJpYW50IiwiYXR0cmlidXRlcyIsIm9Db25maWd1cmF0aW9ucyIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwiYUNvbmZpZ3VyYXRpb25zIiwib0NvbmZpZ3VyYXRpb24iLCJyZXF1ZXN0R3JvdXBJZCIsIl9zZXRCcmVhZGNydW1iTGlua3MiLCJhUHJvbWlzZXMiLCJhU2tpcFBhcmFtZXRlcml6ZWQiLCJzTmV3UGF0aCIsImFQYXRoUGFydHMiLCJzcGxpdCIsInNQYXRoIiwic2hpZnQiLCJzcGxpY2UiLCJzUGF0aFBhcnQiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwic1BhcmFtZXRlclBhdGgiLCJiUmVzdWx0Q29udGV4dCIsImdldFRpdGxlSW5mb0Zyb21QYXRoIiwidGl0bGVIaWVyYXJjaHlJbmZvcyIsImlkeCIsImhpZXJhcmNoeVBvc2l0aW9uIiwib0xpbmsiLCJ0aXRsZUhpZXJhcmNoeUluZm8iLCJnZXRMaW5rcyIsIkxpbmsiLCJzZXRUZXh0Iiwic2V0SHJlZiIsImVuY29kZVVSSSIsImFkZExpbmsiLCJvRGF0YVBvaW50cyIsImdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbiIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0T3V0Ym91bmRzIiwib1NoZWxsU2VydmljZXMiLCJyZXF1ZXN0T2JqZWN0IiwiZm5HZXRMaW5rcyIsImZuT25FcnJvciIsImZuU2V0TGlua0VuYWJsZW1lbnQiLCJpZCIsImFTdXBwb3J0ZWRMaW5rcyIsInNMaW5rSWQiLCJzdXBwb3J0ZWQiLCJvU3ViRGF0YVBvaW50cyIsIm9QYWdlRGF0YSIsIm9EYXRhUG9pbnQiLCJvTGlua0NvbnRleHQiLCJvTGlua0RhdGEiLCJvTWl4ZWRDb250ZXh0IiwibWVyZ2UiLCJvTWFwcGluZyIsInNNYWluUHJvcGVydHkiLCJzTWFwcGVkUHJvcGVydHkiLCJoYXNPd25Qcm9wZXJ0eSIsIm9OZXdNYXBwaW5nIiwiaXNOYXZpZ2F0aW9uU3VwcG9ydGVkIiwicGFyYW1zIiwiYUxpbmtzIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJPYmplY3RQYWdlQ29udHJvbGxlci5jb250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcInNhcC9mZS9jb3JlL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBjb25uZWN0LCBkaXNjb25uZWN0LCBpc0Nvbm5lY3RlZCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgb3Blbk1hbmFnZURpYWxvZywgc2hvd1VzZXJEZXRhaWxzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vTWFuYWdlXCI7XG5pbXBvcnQgRWRpdEZsb3cgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0VkaXRGbG93XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbEVkaXRGbG93IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbEVkaXRGbG93XCI7XG5pbXBvcnQgSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBNYXNzRWRpdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWFzc0VkaXRcIjtcbmltcG9ydCBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCBQYWdlUmVhZHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BhZ2VSZWFkeVwiO1xuaW1wb3J0IFBhZ2luYXRvciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGFnaW5hdG9yXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgU2hhcmUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uLCB1c2luZ0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvUm9vdFZpZXdCYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L1Jvb3RWaWV3QmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDaGFydFJ1bnRpbWUgZnJvbSBcInNhcC9mZS9tYWNyb3MvY2hhcnQvQ2hhcnRSdW50aW1lXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IERlbGVnYXRlVXRpbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9EZWxlZ2F0ZVV0aWxcIjtcbmltcG9ydCB0eXBlIFRhYmxlQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlQVBJXCI7XG5pbXBvcnQgVGFibGVVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9VdGlsc1wiO1xuaW1wb3J0IFNlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCB0eXBlIFN1YlNlY3Rpb25CbG9jayBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL2NvbnRyb2xzL1N1YlNlY3Rpb25CbG9ja1wiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9iamVjdFBhZ2VFeHRlbnNpb25BUEkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBFeHRlbnNpb25BUEkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IEVkaXRGbG93T3ZlcnJpZGVzIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL1Jvb3RDb250YWluZXIvb3ZlcnJpZGVzL0VkaXRGbG93XCI7XG5pbXBvcnQgVGFibGVTY3JvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9UYWJsZVNjcm9sbGVyXCI7XG5pbXBvcnQgSW5zdGFuY2VNYW5hZ2VyIGZyb20gXCJzYXAvbS9JbnN0YW5jZU1hbmFnZXJcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJzYXAvbS9MaW5rXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IHR5cGUgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBCcmVhZENydW1icyBmcm9tIFwic2FwL3V4YXAvQnJlYWRDcnVtYnNcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGVcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VMYXlvdXQgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VMYXlvdXRcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VTZWN0aW9uIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlU2VjdGlvblwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZVN1YlNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTdWJTZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhQ29udGV4dEJpbmRpbmdFeCwgVjRDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmdPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgTWVzc2FnZUhhbmRsZXJPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCBQYWdpbmF0b3JPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvUGFnaW5hdG9yXCI7XG5pbXBvcnQgU2hhcmVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9WaWV3U3RhdGVcIjtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VDb250cm9sbGVyXCIpXG5jbGFzcyBPYmplY3RQYWdlQ29udHJvbGxlciBleHRlbmRzIFBhZ2VDb250cm9sbGVyIHtcblx0b1ZpZXchOiBhbnk7XG5cdEB1c2luZ0V4dGVuc2lvbihQbGFjZWhvbGRlcilcblx0cGxhY2Vob2xkZXIhOiBQbGFjZWhvbGRlcjtcblx0QHVzaW5nRXh0ZW5zaW9uKEVkaXRGbG93KVxuXHRlZGl0RmxvdyE6IEVkaXRGbG93O1xuXHRAdXNpbmdFeHRlbnNpb24oU2hhcmUub3ZlcnJpZGUoU2hhcmVPdmVycmlkZXMpKVxuXHRzaGFyZSE6IFNoYXJlO1xuXHRAdXNpbmdFeHRlbnNpb24oSW50ZXJuYWxFZGl0Rmxvdy5vdmVycmlkZShFZGl0Rmxvd092ZXJyaWRlcykpXG5cdF9lZGl0RmxvdyE6IEludGVybmFsRWRpdEZsb3c7XG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlcm5hbFJvdXRpbmcub3ZlcnJpZGUoSW50ZXJuYWxSb3V0aW5nT3ZlcnJpZGUpKVxuXHRfcm91dGluZyE6IEludGVybmFsUm91dGluZztcblx0QHVzaW5nRXh0ZW5zaW9uKFBhZ2luYXRvci5vdmVycmlkZShQYWdpbmF0b3JPdmVycmlkZSkpXG5cdHBhZ2luYXRvciE6IFBhZ2luYXRvcjtcblx0QHVzaW5nRXh0ZW5zaW9uKE1lc3NhZ2VIYW5kbGVyLm92ZXJyaWRlKE1lc3NhZ2VIYW5kbGVyT3ZlcnJpZGUpKVxuXHRtZXNzYWdlSGFuZGxlciE6IE1lc3NhZ2VIYW5kbGVyO1xuXHRAdXNpbmdFeHRlbnNpb24oSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlKSlcblx0aW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0SW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoe1xuXHRcdFx0Z2V0TmF2aWdhdGlvbk1vZGU6IGZ1bmN0aW9uICh0aGlzOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRjb25zdCBiSXNTdGlja3lFZGl0TW9kZSA9XG5cdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuZ2V0U3RpY2t5RWRpdE1vZGUgJiZcblx0XHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5nZXRTdGlja3lFZGl0TW9kZSgpO1xuXHRcdFx0XHRyZXR1cm4gYklzU3RpY2t5RWRpdE1vZGUgPyBcImV4cGxhY2VcIiA6IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9pbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbjtcblx0QHVzaW5nRXh0ZW5zaW9uKFZpZXdTdGF0ZS5vdmVycmlkZShWaWV3U3RhdGVPdmVycmlkZXMpKVxuXHR2aWV3U3RhdGUhOiBWaWV3U3RhdGU7XG5cdEB1c2luZ0V4dGVuc2lvbihcblx0XHRQYWdlUmVhZHkub3ZlcnJpZGUoe1xuXHRcdFx0aXNDb250ZXh0RXhwZWN0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fSlcblx0KVxuXHRwYWdlUmVhZHkhOiBQYWdlUmVhZHk7XG5cdEB1c2luZ0V4dGVuc2lvbihNYXNzRWRpdClcblx0bWFzc0VkaXQhOiBNYXNzRWRpdDtcblx0cHJpdmF0ZSBtQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXM/OiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJPjtcblx0cHJvdGVjdGVkIGV4dGVuc2lvbkFQST86IE9iamVjdFBhZ2VFeHRlbnNpb25BUEk7XG5cdHByaXZhdGUgb1Jlc291cmNlQnVuZGxlPzogUmVzb3VyY2VCdW5kbGU7XG5cdHByaXZhdGUgYlNlY3Rpb25OYXZpZ2F0ZWQ/OiBib29sZWFuO1xuXHRwcml2YXRlIHN3aXRjaERyYWZ0QW5kQWN0aXZlUG9wT3Zlcj86IFBvcG92ZXI7XG5cdHByaXZhdGUgY3VycmVudEJpbmRpbmc/OiBCaW5kaW5nO1xuXHRwcml2YXRlIG1lc3NhZ2VCdXR0b246IGFueTtcblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0RXh0ZW5zaW9uQVBJKHNJZD86IHN0cmluZyk6IEV4dGVuc2lvbkFQSSB7XG5cdFx0aWYgKHNJZCkge1xuXHRcdFx0Ly8gdG8gYWxsb3cgbG9jYWwgSUQgdXNhZ2UgZm9yIGN1c3RvbSBwYWdlcyB3ZSdsbCBjcmVhdGUvcmV0dXJuIG93biBpbnN0YW5jZXMgZm9yIGN1c3RvbSBzZWN0aW9uc1xuXHRcdFx0dGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMgPSB0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyB8fCB7fTtcblxuXHRcdFx0aWYgKCF0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdKSB7XG5cdFx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0gPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMsIHNJZCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCF0aGlzLmV4dGVuc2lvbkFQSSkge1xuXHRcdFx0XHR0aGlzLmV4dGVuc2lvbkFQSSA9IG5ldyBFeHRlbnNpb25BUEkodGhpcyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25BUEk7XG5cdFx0fVxuXHR9XG5cblx0b25Jbml0KCkge1xuXHRcdHN1cGVyLm9uSW5pdCgpO1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblxuXHRcdC8vIFNldHRpbmcgZGVmYXVsdHMgb2YgaW50ZXJuYWwgbW9kZWwgY29udGV4dFxuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcImV4dGVybmFsTmF2aWdhdGlvbkNvbnRleHRcIiwgeyBcInBhZ2VcIjogdHJ1ZSB9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwicmVsYXRlZEFwcHNcIiwge1xuXHRcdFx0dmlzaWJpbGl0eTogZmFsc2UsXG5cdFx0XHRpdGVtczogbnVsbFxuXHRcdH0pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJiYXRjaEdyb3Vwc1wiLCB0aGlzLl9nZXRCYXRjaEdyb3Vwc0ZvclZpZXcoKSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcImVycm9yTmF2aWdhdGlvblNlY3Rpb25GbGFnXCIsIGZhbHNlKTtcblx0XHRpZiAoISh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudXNlTmV3TGF6eUxvYWRpbmcgJiYgKG9PYmplY3RQYWdlIGFzIGFueSkuZ2V0RW5hYmxlTGF6eUxvYWRpbmcoKSkge1xuXHRcdFx0Ly9BdHRhY2hpbmcgdGhlIGV2ZW50IHRvIG1ha2UgdGhlIHN1YnNlY3Rpb24gY29udGV4dCBiaW5kaW5nIGFjdGl2ZSB3aGVuIGl0IGlzIHZpc2libGUuXG5cdFx0XHRvT2JqZWN0UGFnZS5hdHRhY2hFdmVudChcInN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnRcIiwgdGhpcy5faGFuZGxlU3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdFx0dGhpcy5tZXNzYWdlQnV0dG9uID0gdGhpcy5nZXRWaWV3KCkuYnlJZChcImZlOjpGb290ZXJCYXI6Ok1lc3NhZ2VCdXR0b25cIik7XG5cdFx0dGhpcy5tZXNzYWdlQnV0dG9uLm9JdGVtQmluZGluZy5hdHRhY2hDaGFuZ2UodGhpcy5fZm5TaG93T1BNZXNzYWdlLCB0aGlzKTtcblx0fVxuXG5cdG9uRXhpdCgpIHtcblx0XHRpZiAodGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMpIHtcblx0XHRcdGZvciAoY29uc3Qgc0lkIG9mIE9iamVjdC5rZXlzKHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzKSkge1xuXHRcdFx0XHRpZiAodGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXSkge1xuXHRcdFx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0uZGVzdHJveSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRkZWxldGUgdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXM7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmV4dGVuc2lvbkFQSSkge1xuXHRcdFx0dGhpcy5leHRlbnNpb25BUEkuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRkZWxldGUgdGhpcy5leHRlbnNpb25BUEk7XG5cblx0XHRjb25zdCBvTWVzc2FnZVBvcG92ZXIgPSB0aGlzLm1lc3NhZ2VCdXR0b24gPyB0aGlzLm1lc3NhZ2VCdXR0b24ub01lc3NhZ2VQb3BvdmVyIDogbnVsbDtcblx0XHRpZiAob01lc3NhZ2VQb3BvdmVyICYmIG9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0b01lc3NhZ2VQb3BvdmVyLmNsb3NlKCk7XG5cdFx0fVxuXHRcdC8vd2hlbiBleGl0aW5nIHdlIHNldCBrZWVwQWxpdmUgY29udGV4dCB0byBmYWxzZVxuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGlmIChvQ29udGV4dCAmJiBvQ29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdH1cblx0XHRpZiAoaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpKSB7XG5cdFx0XHRkaXNjb25uZWN0KHRoaXMuZ2V0VmlldygpKTsgLy8gQ2xlYW51cCBjb2xsYWJvcmF0aW9uIGNvbm5lY3Rpb24gd2hlbiBsZWF2aW5nIHRoZSBhcHBcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHNob3cgdGhlIG1lc3NhZ2Ugc3RyaXAgb24gdGhlIG9iamVjdCBwYWdlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2ZuU2hvd09QTWVzc2FnZSgpIHtcblx0XHRjb25zdCBleHRlbnNpb25BUEkgPSB0aGlzLmdldEV4dGVuc2lvbkFQSSgpO1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBtZXNzYWdlcyA9IHRoaXMubWVzc2FnZUJ1dHRvbi5vTWVzc2FnZVBvcG92ZXJcblx0XHRcdC5nZXRJdGVtcygpXG5cdFx0XHQubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uZ2V0QmluZGluZ0NvbnRleHQoXCJtZXNzYWdlXCIpLmdldE9iamVjdCgpKVxuXHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUYXJnZXRzKClbMF0gPT09IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpO1xuXHRcdFx0fSk7XG5cblx0XHRpZiAoZXh0ZW5zaW9uQVBJKSB7XG5cdFx0XHRleHRlbnNpb25BUEkuc2hvd01lc3NhZ2VzKG1lc3NhZ2VzKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0VGFibGVCaW5kaW5nKG9UYWJsZTogYW55KSB7XG5cdFx0cmV0dXJuIG9UYWJsZSAmJiBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZpbmQgdGhlIGxhc3QgdmlzaWJsZSBzdWJzZWN0aW9uIGFuZCBhZGQgdGhlIHNhcFV4QVBPYmplY3RQYWdlU3ViU2VjdGlvbkZpdENvbnRhaW5lciBDU1MgY2xhc3MgaWYgaXQgY29udGFpbnMgb25seSBhIGdyaWRUYWJsZS5cblx0ICpcblx0ICogQHBhcmFtIHN1YlNlY3Rpb25zIFRoZSBzdWIgc2VjdGlvbnMgdG8gbG9vayBmb3Jcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgY2hlY2tTZWN0aW9uc0ZvckdyaWRUYWJsZShzdWJTZWN0aW9uczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSkge1xuXHRcdGNvbnN0IGNoYW5nZUNsYXNzRm9yVGFibGVzID0gKGV2ZW50OiBFdmVudCwgbGFzdFZpc2libGVTdWJTZWN0aW9uOiBPYmplY3RQYWdlU3ViU2VjdGlvbikgPT4ge1xuXHRcdFx0Y29uc3QgYmxvY2tzID0gWy4uLmxhc3RWaXNpYmxlU3ViU2VjdGlvbi5nZXRCbG9ja3MoKSwgLi4ubGFzdFZpc2libGVTdWJTZWN0aW9uLmdldE1vcmVCbG9ja3MoKV07XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGJsb2Nrcy5sZW5ndGggPT09IDEgJiZcblx0XHRcdFx0dGhpcy5zZWFyY2hUYWJsZUluQmxvY2soYmxvY2tzWzBdIGFzIFN1YlNlY3Rpb25CbG9jaylcblx0XHRcdFx0XHQ/LmdldFR5cGUoKVxuXHRcdFx0XHRcdD8uaXNBKFwic2FwLnVpLm1kYy50YWJsZS5HcmlkVGFibGVUeXBlXCIpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly9JbiBjYXNlIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGFibGUgaW4gYSBzdWJTZWN0aW9uIHdlIGZpdCB0aGF0IHRvIHRoZSB3aG9sZSBwYWdlIHNvIHRoYXQgdGhlIHNjcm9sbGJhciBjb21lcyBvbmx5IG9uIHRhYmxlIGFuZCBub3Qgb24gcGFnZVxuXHRcdFx0XHRsYXN0VmlzaWJsZVN1YlNlY3Rpb24uYWRkU3R5bGVDbGFzcyhcInNhcFV4QVBPYmplY3RQYWdlU3ViU2VjdGlvbkZpdENvbnRhaW5lclwiKTtcblx0XHRcdFx0bGFzdFZpc2libGVTdWJTZWN0aW9uLmRldGFjaEV2ZW50KFwibW9kZWxDb250ZXh0Q2hhbmdlXCIsIGNoYW5nZUNsYXNzRm9yVGFibGVzLCB0aGlzKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGZvciAobGV0IHN1YlNlY3Rpb25JbmRleCA9IHN1YlNlY3Rpb25zLmxlbmd0aCAtIDE7IHN1YlNlY3Rpb25JbmRleCA+PSAwOyBzdWJTZWN0aW9uSW5kZXgtLSkge1xuXHRcdFx0aWYgKHN1YlNlY3Rpb25zW3N1YlNlY3Rpb25JbmRleF0uZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRcdGNvbnN0IGxhc3RWaXNpYmxlU3ViU2VjdGlvbiA9IHN1YlNlY3Rpb25zW3N1YlNlY3Rpb25JbmRleF07XG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gYXR0YWNoIHRoaXMgZXZlbnQgaW4gb3JkZXIgdG8gbWFuYWdlIHRoZSBPYmplY3QgUGFnZSBMYXp5IExvYWRpbmcgbWVjaGFuaXNtXG5cdFx0XHRcdGxhc3RWaXNpYmxlU3ViU2VjdGlvbi5hdHRhY2hFdmVudChcIm1vZGVsQ29udGV4dENoYW5nZVwiLCBsYXN0VmlzaWJsZVN1YlNlY3Rpb24sIGNoYW5nZUNsYXNzRm9yVGFibGVzLCB0aGlzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbmQgYSB0YWJsZSBpbiBibG9ja3Mgb2Ygc2VjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGJsb2NrIE9uZSBzdWIgc2VjdGlvbiBibG9ja1xuXHQgKiBAcmV0dXJucyBUYWJsZSBpZiBleGlzdHNcblx0ICovXG5cdHByaXZhdGUgc2VhcmNoVGFibGVJbkJsb2NrKGJsb2NrOiBTdWJTZWN0aW9uQmxvY2spIHtcblx0XHRjb25zdCBjb250cm9sID0gYmxvY2suY29udGVudDtcblx0XHRsZXQgdGFibGVBUEk6IFRhYmxlQVBJIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChibG9jay5pc0EoXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuY29udHJvbHMuU3ViU2VjdGlvbkJsb2NrXCIpKSB7XG5cdFx0XHQvLyBUaGUgdGFibGUgbWF5IGN1cnJlbnRseSBiZSBzaG93biBpbiBhIGZ1bGwgc2NyZWVuIGRpYWxvZywgd2UgY2FuIHRoZW4gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIFRhYmxlQVBJXG5cdFx0XHQvLyBjb250cm9sIGZyb20gdGhlIGN1c3RvbSBkYXRhIG9mIHRoZSBwbGFjZSBob2xkZXIgcGFuZWxcblx0XHRcdGlmIChjb250cm9sLmlzQShcInNhcC5tLlBhbmVsXCIpICYmIGNvbnRyb2wuZGF0YShcIkZ1bGxTY3JlZW5UYWJsZVBsYWNlSG9sZGVyXCIpKSB7XG5cdFx0XHRcdHRhYmxlQVBJID0gY29udHJvbC5kYXRhKFwidGFibGVBUElyZWZlcmVuY2VcIik7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wuaXNBKFwic2FwLmZlLm1hY3Jvcy50YWJsZS5UYWJsZUFQSVwiKSkge1xuXHRcdFx0XHR0YWJsZUFQSSA9IGNvbnRyb2wgYXMgVGFibGVBUEk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGFibGVBUEkpIHtcblx0XHRcdFx0cmV0dXJuIHRhYmxlQVBJLmNvbnRlbnQgYXMgVGFibGU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRvbkJlZm9yZVJlbmRlcmluZygpIHtcblx0XHRQYWdlQ29udHJvbGxlci5wcm90b3R5cGUub25CZWZvcmVSZW5kZXJpbmcuYXBwbHkodGhpcyk7XG5cdFx0Ly8gSW4gdGhlIHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Qgc2NlbmFyaW8gd2UgbmVlZCB0byBlbnN1cmUgaW4gY2FzZSBvZiByZWxvYWQvcmVmcmVzaCB0aGF0IHRoZSBtZXRhIG1vZGVsIGluIHRoZSBtZXRob2RlIHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Qgb2YgdGhlIEZpZWxkUnVudGltZSBpcyBhdmFpbGFibGVcblx0XHRpZiAodGhpcy5vVmlldy5vVmlld0RhdGE/LnJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QgJiYgQ29tbW9uSGVscGVyLmdldE1ldGFNb2RlbCgpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdENvbW1vbkhlbHBlci5zZXRNZXRhTW9kZWwodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0fVxuXHR9XG5cblx0b25BZnRlclJlbmRlcmluZygpIHtcblx0XHQoKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMub1Jlc291cmNlQnVuZGxlID0gcmVzcG9uc2U7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSByZXNvdXJjZSBidW5kbGVcIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHRcdGxldCBzdWJTZWN0aW9uczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXTtcblx0XHRpZiAodGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKS5nZXRVc2VJY29uVGFiQmFyKCkpIHtcblx0XHRcdGNvbnN0IHNlY3Rpb25zID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKS5nZXRTZWN0aW9ucygpO1xuXHRcdFx0Zm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG5cdFx0XHRcdHN1YlNlY3Rpb25zID0gc2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpO1xuXHRcdFx0XHR0aGlzLmNoZWNrU2VjdGlvbnNGb3JHcmlkVGFibGUoc3ViU2VjdGlvbnMpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0XHR0aGlzLmNoZWNrU2VjdGlvbnNGb3JHcmlkVGFibGUoc3ViU2VjdGlvbnMpO1xuXHRcdH1cblx0fVxuXG5cdF9vbkJlZm9yZUJpbmRpbmcob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdC8vIFRPRE86IHdlIHNob3VsZCBjaGVjayBob3cgdGhpcyBjb21lcyB0b2dldGhlciB3aXRoIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIsIHNhbWUgdG8gdGhlIGNoYW5nZSBpbiB0aGUgYWZ0ZXJCaW5kaW5nXG5cdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKSxcblx0XHRcdG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKSxcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRvSW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsLFxuXHRcdFx0YUJhdGNoR3JvdXBzID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiYmF0Y2hHcm91cHNcIiksXG5cdFx0XHRpVmlld0xldmVsID0gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS52aWV3TGV2ZWw7XG5cdFx0bGV0IG9GYXN0Q3JlYXRpb25Sb3c7XG5cdFx0YUJhdGNoR3JvdXBzLnB1c2goXCIkYXV0b1wiKTtcblx0XHRpZiAobVBhcmFtZXRlcnMuYkRyYWZ0TmF2aWdhdGlvbiAhPT0gdHJ1ZSkge1xuXHRcdFx0dGhpcy5fY2xvc2VTaWRlQ29udGVudCgpO1xuXHRcdH1cblx0XHRjb25zdCBvcENvbnRleHQgPSBvT2JqZWN0UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0aWYgKFxuXHRcdFx0b3BDb250ZXh0ICYmXG5cdFx0XHRvcENvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSAmJlxuXHRcdFx0IWFCYXRjaEdyb3Vwcy5zb21lKChvcENvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5oYXNQZW5kaW5nQ2hhbmdlcy5iaW5kKG9wQ29udGV4dC5nZXRNb2RlbCgpKSlcblx0XHQpIHtcblx0XHRcdC8qIFx0SW4gY2FzZSB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGZvciB0aGUgY3JlYXRpb24gcm93IGFuZCBubyBvdGhlcnMgd2UgbmVlZCB0byByZXNldCB0aGUgY2hhbmdlc1xuICAgIFx0XHRcdFx0XHRcdFRPRE86IHRoaXMgaXMganVzdCBhIHF1aWNrIHNvbHV0aW9uLCB0aGlzIG5lZWRzIHRvIGJlIHJld29ya2VkXG4gICAgXHRcdFx0XHQgXHQqL1xuXG5cdFx0XHRvcENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdC8vIEZvciBub3cgd2UgaGF2ZSB0byBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCB0byBudWxsIGZvciBldmVyeSBmYXN0IGNyZWF0aW9uIHJvd1xuXHRcdC8vIFRPRE86IEdldCByaWQgb2YgdGhpcyBjb2Rpbmcgb3IgbW92ZSBpdCB0byBhbm90aGVyIGxheWVyIC0gdG8gYmUgZGlzY3Vzc2VkIHdpdGggTURDIGFuZCBtb2RlbFxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVRhYmxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b0Zhc3RDcmVhdGlvblJvdyA9IGFUYWJsZXNbaV0uZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRcdGlmIChvRmFzdENyZWF0aW9uUm93KSB7XG5cdFx0XHRcdG9GYXN0Q3JlYXRpb25Sb3cuc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2Nyb2xsIHRvIHByZXNlbnQgU2VjdGlvbiBzbyB0aGF0IGJpbmRpbmdzIGFyZSBlbmFibGVkIGR1cmluZyBuYXZpZ2F0aW9uIHRocm91Z2ggcGFnaW5hdG9yIGJ1dHRvbnMsIGFzIHRoZXJlIGlzIG5vIHZpZXcgcmVyZW5kZXJpbmcvcmViaW5kXG5cdFx0Y29uc3QgZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKCEob09iamVjdFBhZ2UgYXMgYW55KS5pc0ZpcnN0UmVuZGVyaW5nKCkgJiYgIW1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwpIHtcblx0XHRcdFx0b09iamVjdFBhZ2Uuc2V0U2VsZWN0ZWRTZWN0aW9uKG51bGwgYXMgYW55KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdG9PYmplY3RQYWdlLmF0dGFjaEV2ZW50T25jZShcIm1vZGVsQ29udGV4dENoYW5nZVwiLCBmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24pO1xuXG5cdFx0Ly8gaWYgdGhlIHN0cnVjdHVyZSBvZiB0aGUgT2JqZWN0UGFnZUxheW91dCBpcyBjaGFuZ2VkIHRoZW4gc2Nyb2xsIHRvIHByZXNlbnQgU2VjdGlvblxuXHRcdC8vIEZJWE1FIElzIHRoaXMgcmVhbGx5IHdvcmtpbmcgYXMgaW50ZW5kZWQgPyBJbml0aWFsbHkgdGhpcyB3YXMgb25CZWZvcmVSZW5kZXJpbmcsIGJ1dCBuZXZlciB0cmlnZ2VyZWQgb25CZWZvcmVSZW5kZXJpbmcgYmVjYXVzZSBpdCB3YXMgcmVnaXN0ZXJlZCBhZnRlciBpdFxuXHRcdGNvbnN0IG9EZWxlZ2F0ZU9uQmVmb3JlID0ge1xuXHRcdFx0b25BZnRlclJlbmRlcmluZzogZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uXG5cdFx0fTtcblx0XHRvT2JqZWN0UGFnZS5hZGRFdmVudERlbGVnYXRlKG9EZWxlZ2F0ZU9uQmVmb3JlLCB0aGlzKTtcblx0XHR0aGlzLnBhZ2VSZWFkeS5hdHRhY2hFdmVudE9uY2UoXCJwYWdlUmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0b09iamVjdFBhZ2UucmVtb3ZlRXZlbnREZWxlZ2F0ZShvRGVsZWdhdGVPbkJlZm9yZSk7XG5cdFx0fSk7XG5cblx0XHQvL1NldCB0aGUgQmluZGluZyBmb3IgUGFnaW5hdG9ycyB1c2luZyBMaXN0QmluZGluZyBJRFxuXHRcdGlmIChpVmlld0xldmVsID4gMSkge1xuXHRcdFx0bGV0IG9CaW5kaW5nID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMubGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBvUGFnaW5hdG9yQ3VycmVudENvbnRleHQgPSBvSW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiKTtcblx0XHRcdGlmIChvUGFnaW5hdG9yQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdUb1VzZSA9IG9QYWdpbmF0b3JDdXJyZW50Q29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdHRoaXMucGFnaW5hdG9yLmluaXRpYWxpemUob0JpbmRpbmdUb1VzZSwgb1BhZ2luYXRvckN1cnJlbnRDb250ZXh0KTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgbnVsbCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nKSB7XG5cdFx0XHRcdGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdHRoaXMucGFnaW5hdG9yLmluaXRpYWxpemUob0JpbmRpbmcsIG9Db250ZXh0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBpZiB0aGUgYmluZGluZyB0eXBlIGlzIG5vdCBPRGF0YUxpc3RCaW5kaW5nIGJlY2F1c2Ugb2YgYSBkZWVwbGluayBuYXZpZ2F0aW9uIG9yIGEgcmVmcmVzaCBvZiB0aGUgcGFnZVxuXHRcdFx0XHRcdC8vIHdlIG5lZWQgdG8gY3JlYXRlIGl0XG5cdFx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXRoID0gb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0XHRcdGlmICgvXFwoW15cXCldKlxcKSQvLnRlc3Qoc0JpbmRpbmdQYXRoKSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGN1cnJlbnQgYmluZGluZyBwYXRoIGVuZHMgd2l0aCAoeHh4KSwgc28gd2UgY3JlYXRlIHRoZSBsaXN0QmluZGluZyBieSByZW1vdmluZyAoeHh4KVxuXHRcdFx0XHRcdFx0Y29uc3Qgc0xpc3RCaW5kaW5nUGF0aCA9IHNCaW5kaW5nUGF0aC5yZXBsYWNlKC9cXChbXlxcKV0qXFwpJC8sIFwiXCIpO1xuXHRcdFx0XHRcdFx0b0JpbmRpbmcgPSBuZXcgKE9EYXRhTGlzdEJpbmRpbmcgYXMgYW55KShvQmluZGluZy5vTW9kZWwsIHNMaXN0QmluZGluZ1BhdGgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgX3NldExpc3RCaW5kaW5nQXN5bmMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChvQmluZGluZy5nZXRDb250ZXh0cygpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKG9CaW5kaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0b0JpbmRpbmcuZGV0YWNoRXZlbnQoXCJjaGFuZ2VcIiwgX3NldExpc3RCaW5kaW5nQXN5bmMpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRvQmluZGluZy5nZXRDb250ZXh0cygwKTtcblx0XHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50KFwiY2hhbmdlXCIsIF9zZXRMaXN0QmluZGluZ0FzeW5jKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGN1cnJlbnQgYmluZGluZyBkb2Vzbid0IGVuZCB3aXRoICh4eHgpIC0tPiB0aGUgbGFzdCBzZWdtZW50IGlzIGEgMS0xIG5hdmlnYXRpb24sIHNvIHdlIGRvbid0IGRpc3BsYXkgdGhlIHBhZ2luYXRvclxuXHRcdFx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZSh1bmRlZmluZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoISh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudXNlTmV3TGF6eUxvYWRpbmcgJiYgb09iamVjdFBhZ2UuZ2V0RW5hYmxlTGF6eUxvYWRpbmcoKSkge1xuXHRcdFx0Y29uc3QgYVNlY3Rpb25zID0gb09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKTtcblx0XHRcdGNvbnN0IGJVc2VJY29uVGFiQmFyID0gb09iamVjdFBhZ2UuZ2V0VXNlSWNvblRhYkJhcigpO1xuXHRcdFx0bGV0IGlTa2lwID0gMjtcblx0XHRcdGNvbnN0IGJJc0luRWRpdE1vZGUgPSBvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdFx0XHRjb25zdCBiRWRpdGFibGVIZWFkZXIgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmVkaXRhYmxlSGVhZGVyQ29udGVudDtcblx0XHRcdGZvciAobGV0IGlTZWN0aW9uID0gMDsgaVNlY3Rpb24gPCBhU2VjdGlvbnMubGVuZ3RoOyBpU2VjdGlvbisrKSB7XG5cdFx0XHRcdGNvbnN0IG9TZWN0aW9uID0gYVNlY3Rpb25zW2lTZWN0aW9uXTtcblx0XHRcdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gb1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdFx0Zm9yIChsZXQgaVN1YlNlY3Rpb24gPSAwOyBpU3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IGlTdWJTZWN0aW9uKyssIGlTa2lwLS0pIHtcblx0XHRcdFx0XHQvLyBJbiBJY29uVGFiQmFyIG1vZGUga2VlcCB0aGUgc2Vjb25kIHNlY3Rpb24gYm91bmQgaWYgdGhlcmUgaXMgYW4gZWRpdGFibGUgaGVhZGVyIGFuZCB3ZSBhcmUgc3dpdGNoaW5nIHRvIGRpc3BsYXkgbW9kZVxuXHRcdFx0XHRcdGlmIChpU2tpcCA8IDEgfHwgKGJVc2VJY29uVGFiQmFyICYmIChpU2VjdGlvbiA+IDEgfHwgKGlTZWN0aW9uID09PSAxICYmICFiRWRpdGFibGVIZWFkZXIgJiYgIWJJc0luRWRpdE1vZGUpKSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TdWJTZWN0aW9uID0gYVN1YlNlY3Rpb25zW2lTdWJTZWN0aW9uXTtcblx0XHRcdFx0XHRcdGlmIChvU3ViU2VjdGlvbi5kYXRhKCkuaXNWaXNpYmlsaXR5RHluYW1pYyAhPT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0XHRcdFx0b1N1YlNlY3Rpb24uc2V0QmluZGluZ0NvbnRleHQobnVsbCBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLnBsYWNlaG9sZGVyLmlzUGxhY2Vob2xkZXJFbmFibGVkKCkgJiYgbVBhcmFtZXRlcnMuc2hvd1BsYWNlaG9sZGVyKSB7XG5cdFx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0Y29uc3Qgb05hdkNvbnRhaW5lciA9IChvVmlldy5nZXRQYXJlbnQoKSBhcyBhbnkpLm9Db250YWluZXIuZ2V0UGFyZW50KCk7XG5cdFx0XHRpZiAob05hdkNvbnRhaW5lcikge1xuXHRcdFx0XHRvTmF2Q29udGFpbmVyLnNob3dQbGFjZWhvbGRlcih7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2dldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZTogYW55KSB7XG5cdFx0bGV0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQ7XG5cdFx0Y29uc3QgYUFjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpICYmIG9PYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkuZ2V0QWN0aW9ucygpO1xuXHRcdGlmIChhQWN0aW9ucyAmJiBhQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSBhQWN0aW9ucy5maW5kKGZ1bmN0aW9uIChvQWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0Ly8gRHVlIHRvIHRoZSBsZWZ0IGFsaWdubWVudCBvZiB0aGUgRHJhZnQgc3dpdGNoIGFuZCB0aGUgY29sbGFib3JhdGl2ZSBkcmFmdCBhdmF0YXIgY29udHJvbHNcblx0XHRcdFx0Ly8gdGhlcmUgaXMgYSBUb29sYmFyU3BhY2VyIGluIHRoZSBhY3Rpb25zIGFnZ3JlZ2F0aW9uIHdoaWNoIHdlIG5lZWQgdG8gZXhjbHVkZSBoZXJlIVxuXHRcdFx0XHQvLyBEdWUgdG8gdGhlIEFDQyByZXBvcnQsIHdlIGFsc28gbmVlZCBub3QgdG8gY2hlY2sgZm9yIHRoZSBJbnZpc2libGVUZXh0IGVsZW1lbnRzXG5cdFx0XHRcdGlmIChvQWN0aW9uLmlzQShcInNhcC5mZS5tYWNyb3Muc2hhcmUuU2hhcmVBUElcIikpIHtcblx0XHRcdFx0XHQvLyBzaW5jZSBTaGFyZUFQSSBkb2VzIG5vdCBoYXZlIGEgZGlzYWJsZSBwcm9wZXJ0eVxuXHRcdFx0XHRcdC8vIGhlbmNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgZGlzYmFsZWQgb3Igbm90XG5cdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0VmlzaWJsZSgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCFvQWN0aW9uLmlzQShcInNhcC51aS5jb3JlLkludmlzaWJsZVRleHRcIikgJiYgIW9BY3Rpb24uaXNBKFwic2FwLm0uVG9vbGJhclNwYWNlclwiKSkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldFZpc2libGUoKSAmJiBvQWN0aW9uLmdldEVuYWJsZWQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvRmlyc3RDbGlja2FibGVFbGVtZW50O1xuXHR9XG5cblx0X2dldEZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZEZyb21TdWJTZWN0aW9uKGFTdWJTZWN0aW9uczogYW55KSB7XG5cdFx0aWYgKGFTdWJTZWN0aW9ucykge1xuXHRcdFx0Zm9yIChsZXQgc3ViU2VjdGlvbiA9IDA7IHN1YlNlY3Rpb24gPCBhU3ViU2VjdGlvbnMubGVuZ3RoOyBzdWJTZWN0aW9uKyspIHtcblx0XHRcdFx0Y29uc3QgYUJsb2NrcyA9IGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRCbG9ja3MoKTtcblxuXHRcdFx0XHRpZiAoYUJsb2Nrcykge1xuXHRcdFx0XHRcdGZvciAobGV0IGJsb2NrID0gMDsgYmxvY2sgPCBhQmxvY2tzLmxlbmd0aDsgYmxvY2srKykge1xuXHRcdFx0XHRcdFx0bGV0IGFGb3JtQ29udGFpbmVycztcblxuXHRcdFx0XHRcdFx0aWYgKGFCbG9ja3NbYmxvY2tdLmlzQShcInNhcC51aS5sYXlvdXQuZm9ybS5Gb3JtXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGFGb3JtQ29udGFpbmVycyA9IGFCbG9ja3NbYmxvY2tdLmdldEZvcm1Db250YWluZXJzKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50ICYmXG5cdFx0XHRcdFx0XHRcdGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQoKSAmJlxuXHRcdFx0XHRcdFx0XHRhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50KCkuaXNBKFwic2FwLnVpLmxheW91dC5mb3JtLkZvcm1cIilcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRhRm9ybUNvbnRhaW5lcnMgPSBhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50KCkuZ2V0Rm9ybUNvbnRhaW5lcnMoKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGFGb3JtQ29udGFpbmVycykge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29udGFpbmVyID0gMDsgZm9ybUNvbnRhaW5lciA8IGFGb3JtQ29udGFpbmVycy5sZW5ndGg7IGZvcm1Db250YWluZXIrKykge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGb3JtRWxlbWVudHMgPSBhRm9ybUNvbnRhaW5lcnNbZm9ybUNvbnRhaW5lcl0uZ2V0Rm9ybUVsZW1lbnRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFGb3JtRWxlbWVudHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGZvcm1FbGVtZW50ID0gMDsgZm9ybUVsZW1lbnQgPCBhRm9ybUVsZW1lbnRzLmxlbmd0aDsgZm9ybUVsZW1lbnQrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhRmllbGRzID0gYUZvcm1FbGVtZW50c1tmb3JtRWxlbWVudF0uZ2V0RmllbGRzKCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIGZpcnN0IGZpZWxkIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBJbnB1dEJhc2UgKGUuZy4gY291bGQgYmUgYSBUZXh0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTbyB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgaXQgaGFzIGEgZ2V0UmVxdWlyZWQgbWV0aG9kXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFGaWVsZHNbMF0uZ2V0UmVxdWlyZWQgJiYgYUZpZWxkc1swXS5nZXRSZXF1aXJlZCgpICYmICFhRmllbGRzWzBdLmdldFZhbHVlKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBhRmllbGRzWzBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoZW4gc2VhcmNoaW5nIGZvciBtYW5kYW90cnkgZW1wdHkgZmllbGQ6ICR7ZXJyb3J9YCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdF91cGRhdGVGb2N1c0luRWRpdE1vZGUoYVN1YlNlY3Rpb25zOiBhbnkpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cblx0XHRjb25zdCBvTWFuZGF0b3J5RmllbGQgPSB0aGlzLl9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbihhU3ViU2VjdGlvbnMpO1xuXHRcdGxldCBvRmllbGRUb0ZvY3VzOiBhbnk7XG5cdFx0aWYgKG9NYW5kYXRvcnlGaWVsZCkge1xuXHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IG9NYW5kYXRvcnlGaWVsZC5jb250ZW50LmdldENvbnRlbnRFZGl0KClbMF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9GaWVsZFRvRm9jdXMgPSAob09iamVjdFBhZ2UgYXMgYW55KS5fZ2V0Rmlyc3RFZGl0YWJsZUlucHV0KCkgfHwgdGhpcy5fZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50KG9PYmplY3RQYWdlKTtcblx0XHR9XG5cblx0XHRpZiAob0ZpZWxkVG9Gb2N1cykge1xuXHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdC8vIFdlIHNldCB0aGUgZm9jdXMgaW4gYSB0aW1lZW91dCwgb3RoZXJ3aXNlIHRoZSBmb2N1cyBzb21ldGltZXMgZ29lcyB0byB0aGUgVGFiQmFyXG5cdFx0XHRcdG9GaWVsZFRvRm9jdXMuZm9jdXMoKTtcblx0XHRcdH0sIDApO1xuXHRcdH1cblx0fVxuXG5cdF9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0KG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3ViU2VjdGlvblwiKTtcblx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dCh1bmRlZmluZWQpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JbkRyYWZ0KG9Db250ZXh0OiBhbnkpIHtcblx0XHR0aGlzLm1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGlmICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkuY2hlY2tJZkJhY2tIYXNTYW1lQ29udGV4dCgpKSB7XG5cdFx0XHQvLyBCYWNrIG5hdiB3aWxsIGtlZXAgdGhlIHNhbWUgY29udGV4dCAtLT4gbm8gbmVlZCB0byBkaXNwbGF5IHRoZSBkaWFsb2dcblx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRfb25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKTtcblxuXHRcdHRoaXMuX3NpZGVFZmZlY3RzLmNsZWFyUHJvcGVydGllc1N0YXR1cygpO1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBpcyBvbmx5IGEgdGVtcCBzb2x1dGlvbiBhcyBsb25nIGFzIHRoZSBtb2RlbCBmaXggdGhlIGNhY2hlIGlzc3VlIGFuZCB3ZSB1c2UgdGhpcyBhZGRpdGlvbmFsXG5cdFx0Ly8gYmluZGluZyB3aXRoIG93blJlcXVlc3Rcblx0XHRvQmluZGluZ0NvbnRleHQgPSBvT2JqZWN0UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0bGV0IGFJQk5BY3Rpb25zOiBhbnlbXSA9IFtdO1xuXHRcdG9PYmplY3RQYWdlLmdldFNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1NlY3Rpb246IGFueSkge1xuXHRcdFx0b1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU3ViU2VjdGlvbjogYW55KSB7XG5cdFx0XHRcdGFJQk5BY3Rpb25zID0gQ29tbW9uVXRpbHMuZ2V0SUJOQWN0aW9ucyhvU3ViU2VjdGlvbiwgYUlCTkFjdGlvbnMpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHQvLyBBc3NpZ24gaW50ZXJuYWwgYmluZGluZyBjb250ZXh0cyB0byBvRm9ybUNvbnRhaW5lcjpcblx0XHQvLyAxLiBJdCBpcyBub3QgcG9zc2libGUgdG8gYXNzaWduIHRoZSBpbnRlcm5hbCBiaW5kaW5nIGNvbnRleHQgdG8gdGhlIFhNTCBmcmFnbWVudFxuXHRcdC8vIChGb3JtQ29udGFpbmVyLmZyYWdtZW50LnhtbCkgeWV0IC0gaXQgaXMgdXNlZCBhbHJlYWR5IGZvciB0aGUgZGF0YS1zdHJ1Y3R1cmUuXG5cdFx0Ly8gMi4gQW5vdGhlciBwcm9ibGVtIGlzLCB0aGF0IEZvcm1Db250YWluZXJzIGFzc2lnbmVkIHRvIGEgJ01vcmVCbG9jaycgZG9lcyBub3QgaGF2ZSBhblxuXHRcdC8vIGludGVybmFsIG1vZGVsIGNvbnRleHQgYXQgYWxsLlxuXG5cdFx0YVRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiLCB7fSk7XG5cblx0XHRcdGFJQk5BY3Rpb25zID0gQ29tbW9uVXRpbHMuZ2V0SUJOQWN0aW9ucyhvVGFibGUsIGFJQk5BY3Rpb25zKTtcblx0XHRcdC8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBCQ1A6IDIwODAyMTgwMDRcblx0XHRcdC8vIE5lZWQgdG8gZml4IHdpdGggQkxJOiBGSU9SSVRFQ0hQMS0xNTI3NFxuXHRcdFx0Ly8gb25seSBmb3IgZWRpdCBtb2RlLCB3ZSBjbGVhciB0aGUgdGFibGUgY2FjaGVcblx0XHRcdC8vIFdvcmthcm91bmQgc3RhcnRzIGhlcmUhIVxuXHRcdFx0Y29uc3Qgb1RhYmxlUm93QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRpZiAob1RhYmxlUm93QmluZGluZykge1xuXHRcdFx0XHRpZiAoTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9UYWJsZVJvd0JpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdFx0XHQvLyBhcHBseSBmb3IgYm90aCBlZGl0IGFuZCBkaXNwbGF5IG1vZGUgaW4gc3RpY2t5XG5cdFx0XHRcdFx0b1RhYmxlUm93QmluZGluZy5yZW1vdmVDYWNoZXNBbmRNZXNzYWdlcyhcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gV29ya2Fyb3VuZCBlbmRzIGhlcmUhIVxuXG5cdFx0XHQvLyBVcGRhdGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIERhdGFGaWVsZEZvckFjdGlvbiBidXR0b25zIG9uIHRhYmxlIHRvb2xiYXJcblx0XHRcdC8vIFRoZSBzYW1lIGlzIGFsc28gcGVyZm9ybWVkIG9uIFRhYmxlIHNlbGVjdGlvbkNoYW5nZSBldmVudFxuXHRcdFx0Y29uc3Qgb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IEpTT04ucGFyc2UoXG5cdFx0XHRcdFx0Q29tbW9uSGVscGVyLnBhcnNlQ3VzdG9tRGF0YShEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YShvVGFibGUsIFwib3BlcmF0aW9uQXZhaWxhYmxlTWFwXCIpKVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0cyA9IG9UYWJsZS5nZXRTZWxlY3RlZENvbnRleHRzKCk7XG5cblx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAsIGFTZWxlY3RlZENvbnRleHRzLCBcInRhYmxlXCIpO1xuXHRcdFx0Ly8gQ2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUsIG5lZWQgdG8gYmUgZml4ZWQgYW5kIHJldmlldyB3aXRoIEJMSTogRklPUklURUNIUDEtMjQzMThcblx0XHRcdG9UYWJsZS5jbGVhclNlbGVjdGlvbigpO1xuXHRcdH0pO1xuXHRcdENvbW1vblV0aWxzLmdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwodGhpcywgXCJfcGFnZU1vZGVsXCIpO1xuXHRcdC8vUmV0cmlldmUgT2JqZWN0IFBhZ2UgaGVhZGVyIGFjdGlvbnMgZnJvbSBPYmplY3QgUGFnZSB0aXRsZSBjb250cm9sXG5cdFx0Y29uc3Qgb09iamVjdFBhZ2VUaXRsZSA9IG9PYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCk7XG5cdFx0bGV0IGFJQk5IZWFkZXJBY3Rpb25zOiBhbnlbXSA9IFtdO1xuXHRcdGFJQk5IZWFkZXJBY3Rpb25zID0gQ29tbW9uVXRpbHMuZ2V0SUJOQWN0aW9ucyhvT2JqZWN0UGFnZVRpdGxlLCBhSUJOSGVhZGVyQWN0aW9ucyk7XG5cdFx0YUlCTkFjdGlvbnMgPSBhSUJOQWN0aW9ucy5jb25jYXQoYUlCTkhlYWRlckFjdGlvbnMpO1xuXHRcdENvbW1vblV0aWxzLnVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5KGFJQk5BY3Rpb25zLCB0aGlzLmdldFZpZXcoKSk7XG5cblx0XHRsZXQgb01vZGVsOiBhbnksIG9GaW5hbFVJU3RhdGU6IGFueTtcblxuXHRcdC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIG1vdmVkIGludG8gYW4gaW5pdCBldmVudCBvZiB0aGUgTURDIHRhYmxlcyAobm90IHlldCBleGlzdGluZykgYW5kIHNob3VsZCBiZSBwYXJ0XG5cdFx0Ly8gb2YgYW55IGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIG9UYWJsZVxuXHRcdCAqIEBwYXJhbSBvTGlzdEJpbmRpbmdcblx0XHQgKi9cblx0XHRhc3luYyBmdW5jdGlvbiBlbmFibGVGYXN0Q3JlYXRpb25Sb3cob1RhYmxlOiBhbnksIG9MaXN0QmluZGluZzogYW55KSB7XG5cdFx0XHRjb25zdCBvRmFzdENyZWF0aW9uUm93ID0gb1RhYmxlLmdldENyZWF0aW9uUm93KCk7XG5cdFx0XHRsZXQgb0Zhc3RDcmVhdGlvbkxpc3RCaW5kaW5nLCBvRmFzdENyZWF0aW9uQ29udGV4dDtcblxuXHRcdFx0aWYgKG9GYXN0Q3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCBvRmluYWxVSVN0YXRlO1xuXHRcdFx0XHRcdGlmIChvRmFzdENyZWF0aW9uUm93LmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSkge1xuXHRcdFx0XHRcdFx0b0Zhc3RDcmVhdGlvbkxpc3RCaW5kaW5nID0gb01vZGVsLmJpbmRMaXN0KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9MaXN0QmluZGluZy5nZXRDb250ZXh0KCksIFtdLCBbXSwge1xuXHRcdFx0XHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiZG9Ob3RTdWJtaXRcIixcblx0XHRcdFx0XHRcdFx0JCRncm91cElkOiBcImRvTm90U3VibWl0XCJcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0Ly8gV29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgT0RhdGEgbW9kZWwgdjQgY29sbGVhZ3Vlc1xuXHRcdFx0XHRcdFx0b0Zhc3RDcmVhdGlvbkxpc3RCaW5kaW5nLnJlZnJlc2hJbnRlcm5hbCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0LyogZG8gbm90aGluZyAqL1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdG9GYXN0Q3JlYXRpb25Db250ZXh0ID0gb0Zhc3RDcmVhdGlvbkxpc3RCaW5kaW5nLmNyZWF0ZSgpO1xuXHRcdFx0XHRcdFx0b0Zhc3RDcmVhdGlvblJvdy5zZXRCaW5kaW5nQ29udGV4dChvRmFzdENyZWF0aW9uQ29udGV4dCk7XG5cblx0XHRcdFx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3Jcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IG9GYXN0Q3JlYXRpb25Db250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGZhc3QgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjb21wdXRpbmcgdGhlIGZpbmFsIFVJIHN0YXRlXCIsIG9FcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB0aGlzIHNob3VsZCBub3QgYmUgbmVlZGVkIGF0IHRoZSBhbGxcblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb1RhYmxlXG5cdFx0ICovXG5cdFx0Y29uc3QgaGFuZGxlVGFibGVNb2RpZmljYXRpb25zID0gKG9UYWJsZTogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBvQmluZGluZyA9IHRoaXMuX2dldFRhYmxlQmluZGluZyhvVGFibGUpLFxuXHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0ZW5hYmxlRmFzdENyZWF0aW9uUm93KG9UYWJsZSwgb0JpbmRpbmcpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRpZiAoIW9CaW5kaW5nKSB7XG5cdFx0XHRcdExvZy5lcnJvcihgRXhwZWN0ZWQgYmluZGluZyBtaXNzaW5nIGZvciB0YWJsZTogJHtvVGFibGUuZ2V0SWQoKX1gKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0JpbmRpbmcub0NvbnRleHQpIHtcblx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBmbkhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRpZiAob0JpbmRpbmcub0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdGZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cygpO1xuXHRcdFx0XHRcdFx0b0JpbmRpbmcuZGV0YWNoQ2hhbmdlKGZuSGFuZGxlQ2hhbmdlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdG9CaW5kaW5nLmF0dGFjaENoYW5nZShmbkhhbmRsZUNoYW5nZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGlmIChvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdG9Nb2RlbCA9IG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpO1xuXG5cdFx0XHQvLyBDb21wdXRlIEVkaXQgTW9kZVxuXHRcdFx0b0ZpbmFsVUlTdGF0ZSA9IHRoaXMuX2VkaXRGbG93LmNvbXB1dGVFZGl0TW9kZShvQmluZGluZ0NvbnRleHQpO1xuXG5cdFx0XHRpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQob01vZGVsLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRvRmluYWxVSVN0YXRlXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSkge1xuXHRcdFx0XHRcdFx0XHRjb25uZWN0KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpKSB7XG5cdFx0XHRcdFx0XHRcdGRpc2Nvbm5lY3QodGhpcy5nZXRWaWV3KCkpOyAvLyBDbGVhbnVwIGNvbGxhYm9yYXRpb24gY29ubmVjdGlvbiBpbiBjYXNlIHdlIHN3aXRjaCB0byBhbm90aGVyIGVsZW1lbnQgKGUuZy4gaW4gRkNMKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgdGhlIGZpbmFsIFVJIFN0YXRlXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHVwZGF0ZSByZWxhdGVkIGFwcHMgb25jZSBEYXRhIGlzIHJlY2VpdmVkIGluIGNhc2Ugb2YgYmluZGluZyBjYWNoZSBpcyBub3QgYXZhaWxhYmxlXG5cdFx0XHQvLyBUT0RPOiB0aGlzIGlzIG9ubHkgYSB0ZW1wIHNvbHV0aW9uIHNpbmNlIHdlIG5lZWQgdG8gY2FsbCBfdXBkYXRlUmVsYXRlZEFwcHMgbWV0aG9kIG9ubHkgYWZ0ZXIgZGF0YSBmb3IgT2JqZWN0IFBhZ2UgaXMgcmVjZWl2ZWQgKGlmIHRoZXJlIGlzIG5vIGJpbmRpbmcpXG5cdFx0XHRpZiAob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKS5vQ2FjaGUpIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUmVsYXRlZEFwcHMoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGZuVXBkYXRlUmVsYXRlZEFwcHMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUmVsYXRlZEFwcHMoKTtcblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLmRldGFjaERhdGFSZWNlaXZlZChmblVwZGF0ZVJlbGF0ZWRBcHBzKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKS5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5VcGRhdGVSZWxhdGVkQXBwcyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vQXR0YWNoIHRoZSBwYXRjaCBzZW50IGFuZCBwYXRjaCBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gKG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nICYmIG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkpIHx8IG9CaW5kaW5nQ29udGV4dDtcblxuXHRcdFx0Ly8gQXR0YWNoIHRoZSBldmVudCBoYW5kbGVyIG9ubHkgb25jZSB0byB0aGUgc2FtZSBiaW5kaW5nXG5cdFx0XHRpZiAodGhpcy5jdXJyZW50QmluZGluZyAhPT0gb0JpbmRpbmcpIHtcblx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJwYXRjaFNlbnRcIiwgdGhpcy5lZGl0Rmxvdy5oYW5kbGVQYXRjaFNlbnQsIHRoaXMpO1xuXHRcdFx0XHR0aGlzLmN1cnJlbnRCaW5kaW5nID0gb0JpbmRpbmc7XG5cdFx0XHR9XG5cblx0XHRcdGFUYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRcdFx0Ly8gYWNjZXNzIGJpbmRpbmcgb25seSBhZnRlciB0YWJsZSBpcyBib3VuZFxuXHRcdFx0XHRUYWJsZVV0aWxzLndoZW5Cb3VuZChvVGFibGUpXG5cdFx0XHRcdFx0LnRoZW4oaGFuZGxlVGFibGVNb2RpZmljYXRpb25zKVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSB0YWJsZSB0byBiZSBib3VuZFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmICghKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS51c2VOZXdMYXp5TG9hZGluZykge1xuXHRcdFx0XHQvLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYmluZGluZyBpcyByZWFkeSBoZW5jZSBjYWxsaW5nIGl0IGluIG9uQWZ0ZXJCaW5kaW5nXG5cdFx0XHRcdChvT2JqZWN0UGFnZSBhcyBhbnkpLl90cmlnZ2VyVmlzaWJsZVN1YlNlY3Rpb25zRXZlbnRzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblBhZ2VSZWFkeShtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3Qgc2V0Rm9jdXMgPSAoKSA9PiB7XG5cdFx0XHQvLyBTZXQgdGhlIGZvY3VzIHRvIHRoZSBmaXJzdCBhY3Rpb24gYnV0dG9uLCBvciB0byB0aGUgZmlyc3QgZWRpdGFibGUgaW5wdXQgaWYgaW4gZWRpdGFibGUgbW9kZVxuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0Y29uc3QgaXNJbkRpc3BsYXlNb2RlID0gIW9PYmplY3RQYWdlLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblxuXHRcdFx0aWYgKGlzSW5EaXNwbGF5TW9kZSkge1xuXHRcdFx0XHRjb25zdCBvRmlyc3RDbGlja2FibGVFbGVtZW50ID0gdGhpcy5fZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50KG9PYmplY3RQYWdlKTtcblx0XHRcdFx0aWYgKG9GaXJzdENsaWNrYWJsZUVsZW1lbnQpIHtcblx0XHRcdFx0XHRvRmlyc3RDbGlja2FibGVFbGVtZW50LmZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9TZWxlY3RlZFNlY3Rpb246IGFueSA9IENvcmUuYnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSk7XG5cdFx0XHRcdGlmIChvU2VsZWN0ZWRTZWN0aW9uKSB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlRm9jdXNJbkVkaXRNb2RlKG9TZWxlY3RlZFNlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdC8vIEFwcGx5IGFwcCBzdGF0ZSBvbmx5IGFmdGVyIHRoZSBwYWdlIGlzIHJlYWR5IHdpdGggdGhlIGZpcnN0IHNlY3Rpb24gc2VsZWN0ZWRcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHQvL1Nob3cgcG9wdXAgd2hpbGUgbmF2aWdhdGluZyBiYWNrIGZyb20gb2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBkcmFmdFxuXHRcdGlmIChvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQoKG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpKTtcblx0XHRcdGlmICghYklzU3RpY2t5TW9kZSkge1xuXHRcdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KTtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKCkgPT4gdGhpcy5fb25CYWNrTmF2aWdhdGlvbkluRHJhZnQob0JpbmRpbmdDb250ZXh0KSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdC5nZXRBcHBTdGF0ZUhhbmRsZXIoKVxuXHRcdFx0LmFwcGx5QXBwU3RhdGUoKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZm9yY2VGb2N1cykge1xuXHRcdFx0XHRcdHNldEZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKEVycm9yKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNldHRpbmcgdGhlIGZvY3VzXCIsIEVycm9yKTtcblx0XHRcdH0pO1xuXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIiwgZmFsc2UpO1xuXHRcdHRoaXMuX2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHN0YXR1cyBvZiBlZGl0IG1vZGUgZm9yIHN0aWNreSBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgc3RhdHVzIG9mIGVkaXQgbW9kZSBmb3Igc3RpY2t5IHNlc3Npb25cblx0ICovXG5cdGdldFN0aWNreUVkaXRNb2RlKCkge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0ICYmICh0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpO1xuXHRcdGxldCBiSXNTdGlja3lFZGl0TW9kZSA9IGZhbHNlO1xuXHRcdGlmIChvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdFx0aWYgKGJJc1N0aWNreU1vZGUpIHtcblx0XHRcdFx0YklzU3RpY2t5RWRpdE1vZGUgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBiSXNTdGlja3lFZGl0TW9kZTtcblx0fVxuXG5cdF9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5ieUlkKFwiZmU6Ok9iamVjdFBhZ2VcIikgYXMgT2JqZWN0UGFnZUxheW91dDtcblx0fVxuXG5cdF9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbigpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2VTdWJ0aXRsZSA9IG9PYmplY3RQYWdlLmdldEN1c3RvbURhdGEoKS5maW5kKGZ1bmN0aW9uIChvQ3VzdG9tRGF0YTogYW55KSB7XG5cdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwiT2JqZWN0UGFnZVN1YnRpdGxlXCI7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRpdGxlOiBvT2JqZWN0UGFnZS5kYXRhKFwiT2JqZWN0UGFnZVRpdGxlXCIpIHx8IFwiXCIsXG5cdFx0XHRzdWJ0aXRsZTogb09iamVjdFBhZ2VTdWJ0aXRsZSAmJiBvT2JqZWN0UGFnZVN1YnRpdGxlLmdldFZhbHVlKCksXG5cdFx0XHRpbnRlbnQ6IFwiXCIsXG5cdFx0XHRpY29uOiBcIlwiXG5cdFx0fTtcblx0fVxuXG5cdF9leGVjdXRlSGVhZGVyU2hvcnRjdXQoc0lkOiBhbnkpIHtcblx0XHRjb25zdCBzQnV0dG9uSWQgPSBgJHt0aGlzLmdldFZpZXcoKS5nZXRJZCgpfS0tJHtzSWR9YCxcblx0XHRcdG9CdXR0b24gPSAodGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKS5nZXRIZWFkZXJUaXRsZSgpIGFzIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUpXG5cdFx0XHRcdC5nZXRBY3Rpb25zKClcblx0XHRcdFx0LmZpbmQoZnVuY3Rpb24gKG9FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0VsZW1lbnQuZ2V0SWQoKSA9PT0gc0J1dHRvbklkO1xuXHRcdFx0XHR9KTtcblx0XHRDb21tb25VdGlscy5maXJlQnV0dG9uUHJlc3Mob0J1dHRvbik7XG5cdH1cblxuXHRfZXhlY3V0ZUZvb3RlclNob3J0Y3V0KHNJZDogYW55KSB7XG5cdFx0Y29uc3Qgc0J1dHRvbklkID0gYCR7dGhpcy5nZXRWaWV3KCkuZ2V0SWQoKX0tLSR7c0lkfWAsXG5cdFx0XHRvQnV0dG9uID0gKHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkuZ2V0Rm9vdGVyKCkgYXMgYW55KS5nZXRDb250ZW50KCkuZmluZChmdW5jdGlvbiAob0VsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0VsZW1lbnQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLm0uQnV0dG9uXCIgJiYgb0VsZW1lbnQuZ2V0SWQoKSA9PT0gc0J1dHRvbklkO1xuXHRcdFx0fSk7XG5cdFx0Q29tbW9uVXRpbHMuZmlyZUJ1dHRvblByZXNzKG9CdXR0b24pO1xuXHR9XG5cblx0X2V4ZWN1dGVUYWJTaG9ydEN1dChvRXhlY3V0aW9uOiBhbnkpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCksXG5cdFx0XHRhU2VjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLFxuXHRcdFx0aVNlY3Rpb25JbmRleE1heCA9IGFTZWN0aW9ucy5sZW5ndGggLSAxLFxuXHRcdFx0c0NvbW1hbmQgPSBvRXhlY3V0aW9uLm9Tb3VyY2UuZ2V0Q29tbWFuZCgpO1xuXHRcdGxldCBuZXdTZWN0aW9uLFxuXHRcdFx0aVNlbGVjdGVkU2VjdGlvbkluZGV4ID0gb09iamVjdFBhZ2UuaW5kZXhPZlNlY3Rpb24odGhpcy5ieUlkKG9PYmplY3RQYWdlLmdldFNlbGVjdGVkU2VjdGlvbigpKSBhcyBPYmplY3RQYWdlU2VjdGlvbik7XG5cdFx0aWYgKGlTZWxlY3RlZFNlY3Rpb25JbmRleCAhPT0gLTEgJiYgaVNlY3Rpb25JbmRleE1heCA+IDApIHtcblx0XHRcdGlmIChzQ29tbWFuZCA9PT0gXCJOZXh0VGFiXCIpIHtcblx0XHRcdFx0aWYgKGlTZWxlY3RlZFNlY3Rpb25JbmRleCA8PSBpU2VjdGlvbkluZGV4TWF4IC0gMSkge1xuXHRcdFx0XHRcdG5ld1NlY3Rpb24gPSBhU2VjdGlvbnNbKytpU2VsZWN0ZWRTZWN0aW9uSW5kZXhdO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGlTZWxlY3RlZFNlY3Rpb25JbmRleCAhPT0gMCkge1xuXHRcdFx0XHQvLyBQcmV2aW91c1RhYlxuXHRcdFx0XHRuZXdTZWN0aW9uID0gYVNlY3Rpb25zWy0taVNlbGVjdGVkU2VjdGlvbkluZGV4XTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG5ld1NlY3Rpb24pIHtcblx0XHRcdFx0b09iamVjdFBhZ2Uuc2V0U2VsZWN0ZWRTZWN0aW9uKG5ld1NlY3Rpb24pO1xuXHRcdFx0XHRuZXdTZWN0aW9uLmZvY3VzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2dldEZvb3RlclZpc2liaWxpdHkoKSB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBzVmlld0lkID0gdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIiwgZmFsc2UpO1xuXHRcdHNhcC51aVxuXHRcdFx0LmdldENvcmUoKVxuXHRcdFx0LmdldE1lc3NhZ2VNYW5hZ2VyKClcblx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKVxuXHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0aWYgKG9NZXNzYWdlLnZhbGlkYXRpb24gJiYgb01lc3NhZ2UudHlwZSA9PT0gXCJFcnJvclwiICYmIG9NZXNzYWdlLnRhcmdldC5pbmRleE9mKHNWaWV3SWQpID4gLTEpIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0X3Nob3dNZXNzYWdlUG9wb3ZlcihlcnI/OiBhbnksIG9SZXQ/OiBhbnkpIHtcblx0XHRpZiAoZXJyKSB7XG5cdFx0XHRMb2cuZXJyb3IoZXJyKTtcblx0XHR9XG5cdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0Y29uc3QgY3VycmVudFBhZ2VWaWV3ID0gcm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpXG5cdFx0XHQ/IHJvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RWaWV3KClcblx0XHRcdDogKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdENvbnRhaW5lcigpIGFzIGFueSkuZ2V0Q3VycmVudFBhZ2UoKTtcblx0XHRpZiAoIWN1cnJlbnRQYWdlVmlldy5pc0EoXCJzYXAubS5NZXNzYWdlUGFnZVwiKSkge1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VCdXR0b24gPSB0aGlzLm1lc3NhZ2VCdXR0b24sXG5cdFx0XHRcdG9NZXNzYWdlUG9wb3ZlciA9IG9NZXNzYWdlQnV0dG9uLm9NZXNzYWdlUG9wb3Zlcixcblx0XHRcdFx0b0l0ZW1CaW5kaW5nID0gb01lc3NhZ2VQb3BvdmVyLmdldEJpbmRpbmcoXCJpdGVtc1wiKTtcblxuXHRcdFx0aWYgKG9JdGVtQmluZGluZy5nZXRMZW5ndGgoKSA+IDAgJiYgIW9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0XHRvTWVzc2FnZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHQvLyB3b3JrYXJvdW5kIHRvIGVuc3VyZSB0aGF0IG9NZXNzYWdlQnV0dG9uIGlzIHJlbmRlcmVkIHdoZW4gb3BlbkJ5IGlzIGNhbGxlZFxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvTWVzc2FnZVBvcG92ZXIub3BlbkJ5KG9NZXNzYWdlQnV0dG9uKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvUmV0O1xuXHR9XG5cblx0X2VkaXREb2N1bWVudChvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob01vZGVsKTtcblx0XHRyZXR1cm4gdGhpcy5lZGl0Rmxvdy5lZGl0RG9jdW1lbnQuYXBwbHkodGhpcy5lZGl0RmxvdywgW29Db250ZXh0XSkuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTW9kZWwpO1xuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBjb250ZXh0IG9mIHRoZSBEcmFmdFJvb3QgcGF0aC5cblx0ICogSWYgYSB2aWV3IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgZHJhZnQgUm9vdCBQYXRoLCB0aGlzIG1ldGhvZCByZXR1cm5zIGl0cyBiaW5kaW5nQ29udGV4dC5cblx0ICogV2hlcmUgbm8gdmlldyBpcyBmb3VuZCBhIG5ldyBjcmVhdGVkIGNvbnRleHQgaXMgcmV0dXJuZWQuXG5cdCAqIFRoZSBuZXcgY3JlYXRlZCBjb250ZXh0IHJlcXVlc3QgdGhlIGtleSBvZiB0aGUgZW50aXR5IGluIG9yZGVyIHRvIGdldCB0aGUgRXRhZyBvZiB0aGlzIGVudGl0eS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldERyYWZ0Um9vdFBhdGhcblx0ICogQHJldHVybnMgUmV0dXJucyBhIFByb21pc2Vcblx0ICovXG5cdGFzeW5jIGdldERyYWZ0Um9vdENvbnRleHQoKTogUHJvbWlzZTxWNENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3QgY29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBWNENvbnRleHQ7XG5cdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdGNvbnN0IGRyYWZ0Um9vdENvbnRleHRQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RHJhZnRSb290UGF0aChjb250ZXh0KTtcblx0XHRcdGxldCBzaW1wbGVEcmFmdFJvb3RDb250ZXh0OiBWNENvbnRleHQ7XG5cdFx0XHRpZiAoZHJhZnRSb290Q29udGV4dFBhdGgpIHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgYSB2aWV3IG1hdGNoZXMgd2l0aCB0aGUgZHJhZnQgcm9vdCBwYXRoXG5cdFx0XHRcdGNvbnN0IGV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2UgPSAodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBSb290Vmlld0Jhc2VDb250cm9sbGVyKVxuXHRcdFx0XHRcdC5nZXRJbnN0YW5jZWRWaWV3cygpXG5cdFx0XHRcdFx0LmZpbmQoKHBhZ2VWaWV3OiBWaWV3KSA9PiBwYWdlVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCkgPT09IGRyYWZ0Um9vdENvbnRleHRQYXRoKVxuXHRcdFx0XHRcdD8uZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBWNENvbnRleHQ7XG5cdFx0XHRcdGlmIChleGlzdGluZ0JpbmRpbmdDb250ZXh0T25QYWdlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRcdHNpbXBsZURyYWZ0Um9vdENvbnRleHQgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3NpbXBsZURyYWZ0Um9vdENvbnRleHRcIik7XG5cdFx0XHRcdGlmIChzaW1wbGVEcmFmdFJvb3RDb250ZXh0Py5nZXRQYXRoKCkgPT09IGRyYWZ0Um9vdENvbnRleHRQYXRoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNpbXBsZURyYWZ0Um9vdENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBzRW50aXR5UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChkcmFmdFJvb3RDb250ZXh0UGF0aCk7XG5cdFx0XHRcdGNvbnN0IG1EYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRDb250ZXh0KHNFbnRpdHlQYXRoKSk7XG5cdFx0XHRcdHNpbXBsZURyYWZ0Um9vdENvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChkcmFmdFJvb3RDb250ZXh0UGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdGF3YWl0IHNpbXBsZURyYWZ0Um9vdENvbnRleHQucmVxdWVzdFByb3BlcnR5KG1EYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5rZXlzWzBdPy5uYW1lKTtcblx0XHRcdFx0Ly8gU3RvcmUgdGhpcyBuZXcgY3JlYXRlZCBjb250ZXh0IHRvIHVzZSBpdCBvbiB0aGUgbmV4dCBpdGVyYXRpb25zXG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2ltcGxlRHJhZnRSb290Q29udGV4dFwiLCBzaW1wbGVEcmFmdFJvb3RDb250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIHNpbXBsZURyYWZ0Um9vdENvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgX3ZhbGlkYXRlRG9jdW1lbnQoKTogUHJvbWlzZTx2b2lkIHwgYW55W10gfCBPRGF0YUNvbnRleHRCaW5kaW5nRXg+IHtcblx0XHRjb25zdCBjb250cm9sID0gQ29yZS5ieUlkKENvcmUuZ2V0Q3VycmVudEZvY3VzZWRDb250cm9sSWQoKSk7XG5cdFx0Y29uc3QgY29udGV4dCA9IGNvbnRyb2w/LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgVjRDb250ZXh0O1xuXHRcdGlmIChjb250ZXh0ICYmICFjb250ZXh0LmlzVHJhbnNpZW50KCkpIHtcblx0XHRcdC8vIFdhaXQgZm9yIHRoZSBwZW5kaW5nIGNoYW5nZXMgYmVmb3JlIHN0YXJ0aW5nIHRoaXMgdmFsaWRhdGlvblxuXHRcdFx0YXdhaXQgdGhpcy5fZWRpdEZsb3cuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c1NlcnZpY2UgPSBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gc2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdGNvbnN0IGdsb2JhbFNpZGVFZmZlY3RzID0gZW50aXR5VHlwZSA/IHNpZGVFZmZlY3RzU2VydmljZS5nZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGUpIDogW107XG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZ2xvYmFsIFNpZGVFZmZlY3RzIGZvciB0aGUgcmVsYXRlZCBlbnRpdHksIGV4ZWN1dGUgaXQvdGhlbVxuXHRcdFx0aWYgKGdsb2JhbFNpZGVFZmZlY3RzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoZ2xvYmFsU2lkZUVmZmVjdHMubWFwKChzaWRlRWZmZWN0cykgPT4gdGhpcy5fc2lkZUVmZmVjdHMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzLCBjb250ZXh0KSkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZHJhZnRSb290Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0RHJhZnRSb290Q29udGV4dCgpO1xuXHRcdFx0XHQvL0V4ZWN1dGUgdGhlIGRyYWZ0VmFsaWRhdGlvbiBpZiB0aGVyZSBpcyBubyBnbG9iYWxTaWRlRWZmZWN0c1xuXHRcdFx0XHRpZiAoZHJhZnRSb290Q29udGV4dCkge1xuXHRcdFx0XHRcdHJldHVybiBkcmFmdC5leGVjdXRlRHJhZnRWYWxpZGF0aW9uKGRyYWZ0Um9vdENvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGFzeW5jIF9zYXZlRG9jdW1lbnQob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIiksXG5cdFx0XHRhV2FpdENyZWF0ZURvY3VtZW50czogYW55W10gPSBbXTtcblx0XHQvLyBpbmRpY2F0ZXMgaWYgd2UgYXJlIGNyZWF0aW5nIGEgbmV3IHJvdyBpbiB0aGUgT1Bcblx0XHRsZXQgYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgPSBmYWxzZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob01vZGVsKTtcblx0XHR0aGlzLl9maW5kVGFibGVzKCkuZm9yRWFjaCgob1RhYmxlOiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gdGhpcy5fZ2V0VGFibGVCaW5kaW5nKG9UYWJsZSk7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyczogYW55ID0ge1xuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IG9UYWJsZS5kYXRhKFwiY3JlYXRpb25Nb2RlXCIpLFxuXHRcdFx0XHRjcmVhdGlvblJvdzogb1RhYmxlLmdldENyZWF0aW9uUm93KCksXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBvVGFibGUuZGF0YShcImNyZWF0ZUF0RW5kXCIpID09PSBcInRydWVcIlxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGJDcmVhdGVEb2N1bWVudCA9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93ICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCkgJiZcblx0XHRcdFx0T2JqZWN0LmtleXMobVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRPYmplY3QoKSkubGVuZ3RoID4gMTtcblx0XHRcdGlmIChiQ3JlYXRlRG9jdW1lbnQpIHtcblx0XHRcdFx0Ly8gdGhlIGJTa2lwU2lkZUVmZmVjdHMgaXMgYSBwYXJhbWV0ZXIgY3JlYXRlZCB3aGVuIHdlIGNsaWNrIHRoZSBzYXZlIGtleS4gSWYgd2UgcHJlc3MgdGhpcyBrZXlcblx0XHRcdFx0Ly8gd2UgZG9uJ3QgZXhlY3V0ZSB0aGUgaGFuZGxlU2lkZUVmZmVjdHMgZnVuY2l0b24gdG8gYXZvaWQgYmF0Y2ggcmVkdW5kYW5jeVxuXHRcdFx0XHRtUGFyYW1ldGVycy5iU2tpcFNpZGVFZmZlY3RzID0gdHJ1ZTtcblx0XHRcdFx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgPSB0cnVlO1xuXHRcdFx0XHRhV2FpdENyZWF0ZURvY3VtZW50cy5wdXNoKFxuXHRcdFx0XHRcdHRoaXMuZWRpdEZsb3cuY3JlYXRlRG9jdW1lbnQob0JpbmRpbmcsIG1QYXJhbWV0ZXJzKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQmluZGluZztcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGFCaW5kaW5ncyA9IGF3YWl0IFByb21pc2UuYWxsKGFXYWl0Q3JlYXRlRG9jdW1lbnRzKTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IsXG5cdFx0XHRcdGJpbmRpbmdzOiBhQmluZGluZ3Ncblx0XHRcdH07XG5cdFx0XHQvLyBXZSBuZWVkIHRvIGVpdGhlciByZWplY3Qgb3IgcmVzb2x2ZSBhIHByb21pc2UgaGVyZSBhbmQgcmV0dXJuIGl0IHNpbmNlIHRoaXMgc2F2ZVxuXHRcdFx0Ly8gZnVuY3Rpb24gaXMgbm90IG9ubHkgY2FsbGVkIHdoZW4gcHJlc3NpbmcgdGhlIHNhdmUgYnV0dG9uIGluIHRoZSBmb290ZXIsIGJ1dCBhbHNvXG5cdFx0XHQvLyB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgY3JlYXRlIG9yIHNhdmUgaW4gYSBkYXRhbG9zcyBwb3B1cC5cblx0XHRcdC8vIFRoZSBsb2dpYyBvZiB0aGUgZGF0YWxvc3MgcG9wdXAgbmVlZHMgdG8gZGV0ZWN0IGlmIHRoZSBzYXZlIGhhZCBlcnJvcnMgb3Igbm90IGluIG9yZGVyXG5cdFx0XHQvLyB0byBkZWNpZGUgaWYgdGhlIHN1YnNlcXVlbnQgYWN0aW9uIC0gbGlrZSBhIGJhY2sgbmF2aWdhdGlvbiAtIGhhcyB0byBiZSBleGVjdXRlZCBvciBub3QuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmVkaXRGbG93LnNhdmVEb2N1bWVudChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHQvLyBJZiB0aGUgc2F2ZURvY3VtZW50IGluIGVkaXRGbG93IHJldHVybnMgZXJyb3JzIHdlIG5lZWRcblx0XHRcdFx0Ly8gdG8gc2hvdyB0aGUgbWVzc2FnZSBwb3BvdmVyIGhlcmUgYW5kIGVuc3VyZSB0aGF0IHRoZVxuXHRcdFx0XHQvLyBkYXRhbG9zcyBsb2dpYyBkb2VzIG5vdCBwZXJmb3JtIHRoZSBmb2xsb3cgdXAgZnVuY3Rpb25cblx0XHRcdFx0Ly8gbGlrZSBlLmcuIGEgYmFjayBuYXZpZ2F0aW9uIGhlbmNlIHdlIHJldHVybiBhIHByb21pc2UgYW5kIHJlamVjdCBpdFxuXHRcdFx0XHR0aGlzLl9zaG93TWVzc2FnZVBvcG92ZXIoZXJyb3IpO1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob01vZGVsKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTW9kZWwpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9tYW5hZ2VDb2xsYWJvcmF0aW9uKCkge1xuXHRcdG9wZW5NYW5hZ2VEaWFsb2codGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0X3Nob3dDb2xsYWJvcmF0aW9uVXNlckRldGFpbHMoZXZlbnQ6IGFueSkge1xuXHRcdHNob3dVc2VyRGV0YWlscyhldmVudCwgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0X2NhbmNlbERvY3VtZW50KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbik7IC8vdG8gZ2V0IHRoZSByZWZlcmVuY2Ugb2YgdGhlIGNhbmNlbCBidXR0b24gZnJvbSBjb21tYW5kIGV4ZWN1dGlvblxuXHRcdHJldHVybiB0aGlzLmVkaXRGbG93LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHRfYXBwbHlEb2N1bWVudChvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuYXBwbHlEb2N1bWVudChvQ29udGV4dCkuY2F0Y2goKCkgPT4gdGhpcy5fc2hvd01lc3NhZ2VQb3BvdmVyKCkpO1xuXHR9XG5cblx0X3VwZGF0ZVJlbGF0ZWRBcHBzKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRpZiAoQ29tbW9uVXRpbHMucmVzb2x2ZVN0cmluZ3RvQm9vbGVhbihvT2JqZWN0UGFnZS5kYXRhKFwic2hvd1JlbGF0ZWRBcHBzXCIpKSkge1xuXHRcdFx0Q29tbW9uVXRpbHMudXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzKG9PYmplY3RQYWdlKTtcblx0XHR9XG5cdH1cblxuXHRfZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVBhcmVudEVsZW1lbnQ6IGFueSwgYVN1YnNlY3Rpb246IGFueSwgYUNvbnRyb2xzOiBhbnksIGJJc0NoYXJ0PzogYm9vbGVhbikge1xuXHRcdGZvciAobGV0IGVsZW1lbnQgPSAwOyBlbGVtZW50IDwgYVBhcmVudEVsZW1lbnQubGVuZ3RoOyBlbGVtZW50KyspIHtcblx0XHRcdGxldCBvRWxlbWVudCA9IGFQYXJlbnRFbGVtZW50W2VsZW1lbnRdLmdldENvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBhUGFyZW50RWxlbWVudFtlbGVtZW50XS5nZXRDb250ZW50KCk7XG5cdFx0XHRpZiAoYklzQ2hhcnQpIHtcblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50Lm1BZ2dyZWdhdGlvbnMgJiYgb0VsZW1lbnQuZ2V0QWdncmVnYXRpb24oXCJpdGVtc1wiKSkge1xuXHRcdFx0XHRcdGNvbnN0IGFJdGVtcyA9IG9FbGVtZW50LmdldEFnZ3JlZ2F0aW9uKFwiaXRlbXNcIik7XG5cdFx0XHRcdFx0YUl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKG9JdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChvSXRlbS5pc0EoXCJzYXAuZmUubWFjcm9zLmNoYXJ0LkNoYXJ0QVBJXCIpKSB7XG5cdFx0XHRcdFx0XHRcdG9FbGVtZW50ID0gb0l0ZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLnVpLmxheW91dC5EeW5hbWljU2lkZUNvbnRlbnRcIikpIHtcblx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudC5nZXRNYWluQ29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9FbGVtZW50LmdldE1haW5Db250ZW50KCk7XG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudFswXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAuZmUubWFjcm9zLnRhYmxlLlRhYmxlQVBJXCIpKSB7XG5cdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnQuZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9FbGVtZW50LmdldENvbnRlbnQoKTtcblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50WzBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0YUNvbnRyb2xzLnB1c2gob0VsZW1lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC5mZS5tYWNyb3MuY2hhcnQuQ2hhcnRBUElcIikpIHtcblx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudC5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0VsZW1lbnQuZ2V0Q29udGVudCgpO1xuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnRbMF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLnVpLm1kYy5DaGFydFwiKSkge1xuXHRcdFx0XHRhQ29udHJvbHMucHVzaChvRWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2dldEFsbFN1YlNlY3Rpb25zKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRsZXQgYVN1YlNlY3Rpb25zOiBhbnlbXSA9IFtdO1xuXHRcdG9PYmplY3RQYWdlLmdldFNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1NlY3Rpb246IGFueSkge1xuXHRcdFx0YVN1YlNlY3Rpb25zID0gYVN1YlNlY3Rpb25zLmNvbmNhdChvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gYVN1YlNlY3Rpb25zO1xuXHR9XG5cblx0X2dldEFsbEJsb2NrcygpIHtcblx0XHRsZXQgYUJsb2NrczogYW55W10gPSBbXTtcblx0XHR0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TdWJTZWN0aW9uOiBhbnkpIHtcblx0XHRcdGFCbG9ja3MgPSBhQmxvY2tzLmNvbmNhdChvU3ViU2VjdGlvbi5nZXRCbG9ja3MoKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFCbG9ja3M7XG5cdH1cblxuXHRfZmluZFRhYmxlcygpIHtcblx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSB0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpO1xuXHRcdGNvbnN0IGFUYWJsZXM6IGFueVtdID0gW107XG5cdFx0Zm9yIChsZXQgc3ViU2VjdGlvbiA9IDA7IHN1YlNlY3Rpb24gPCBhU3ViU2VjdGlvbnMubGVuZ3RoOyBzdWJTZWN0aW9uKyspIHtcblx0XHRcdHRoaXMuX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uKGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhVGFibGVzKTtcblx0XHRcdHRoaXMuX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uKGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRNb3JlQmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYVRhYmxlcyk7XG5cdFx0fVxuXHRcdHJldHVybiBhVGFibGVzO1xuXHR9XG5cblx0X2ZpbmRDaGFydHMoKSB7XG5cdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gdGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKTtcblx0XHRjb25zdCBhQ2hhcnRzOiBhbnlbXSA9IFtdO1xuXHRcdGZvciAobGV0IHN1YlNlY3Rpb24gPSAwOyBzdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgc3ViU2VjdGlvbisrKSB7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0QmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYUNoYXJ0cywgdHJ1ZSk7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0TW9yZUJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFDaGFydHMsIHRydWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gYUNoYXJ0cztcblx0fVxuXG5cdF9jbG9zZVNpZGVDb250ZW50KCkge1xuXHRcdHRoaXMuX2dldEFsbEJsb2NrcygpLmZvckVhY2goZnVuY3Rpb24gKG9CbG9jazogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udGVudCA9IG9CbG9jay5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0Jsb2NrLmdldENvbnRlbnQoKTtcblx0XHRcdGlmIChvQ29udGVudCAmJiBvQ29udGVudC5pc0EgJiYgb0NvbnRlbnQuaXNBKFwic2FwLnVpLmxheW91dC5EeW5hbWljU2lkZUNvbnRlbnRcIikpIHtcblx0XHRcdFx0aWYgKG9Db250ZW50LnNldFNob3dTaWRlQ29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRlbnQuc2V0U2hvd1NpZGVDb250ZW50KGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYXJ0IENvbnRleHQgaXMgcmVzb2x2ZWQgZm9yIDE6biBtaWNyb2NoYXJ0cy5cblx0ICpcblx0ICogQHBhcmFtIG9DaGFydENvbnRleHQgVGhlIENvbnRleHQgb2YgdGhlIE1pY3JvQ2hhcnRcblx0ICogQHBhcmFtIHNDaGFydFBhdGggVGhlIGNvbGxlY3Rpb25QYXRoIG9mIHRoZSB0aGUgY2hhcnRcblx0ICogQHJldHVybnMgQXJyYXkgb2YgQXR0cmlidXRlcyBvZiB0aGUgY2hhcnQgQ29udGV4dFxuXHQgKi9cblx0X2dldENoYXJ0Q29udGV4dERhdGEob0NoYXJ0Q29udGV4dDogYW55LCBzQ2hhcnRQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ2hhcnRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGxldCBvQ2hhcnRDb250ZXh0RGF0YSA9IFtvQ29udGV4dERhdGFdO1xuXHRcdGlmIChvQ2hhcnRDb250ZXh0ICYmIHNDaGFydFBhdGgpIHtcblx0XHRcdGlmIChvQ29udGV4dERhdGFbc0NoYXJ0UGF0aF0pIHtcblx0XHRcdFx0b0NoYXJ0Q29udGV4dERhdGEgPSBvQ29udGV4dERhdGFbc0NoYXJ0UGF0aF07XG5cdFx0XHRcdGRlbGV0ZSBvQ29udGV4dERhdGFbc0NoYXJ0UGF0aF07XG5cdFx0XHRcdG9DaGFydENvbnRleHREYXRhLnB1c2gob0NvbnRleHREYXRhKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9DaGFydENvbnRleHREYXRhO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNjcm9sbCB0aGUgdGFibGVzIHRvIHRoZSByb3cgd2l0aCB0aGUgc1BhdGhcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlQ29udHJvbGxlci5jb250cm9sbGVyI19zY3JvbGxUYWJsZXNUb1Jvd1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1Jvd1BhdGggJ3NQYXRoIG9mIHRoZSB0YWJsZSByb3cnXG5cdCAqL1xuXG5cdF9zY3JvbGxUYWJsZXNUb1JvdyhzUm93UGF0aDogc3RyaW5nKSB7XG5cdFx0aWYgKHRoaXMuX2ZpbmRUYWJsZXMgJiYgdGhpcy5fZmluZFRhYmxlcygpLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFUYWJsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0VGFibGVTY3JvbGxlci5zY3JvbGxUYWJsZVRvUm93KGFUYWJsZXNbaV0sIHNSb3dQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIG1lcmdlIHNlbGVjdGVkIGNvbnRleHRzIGFuZCBmaWx0ZXJzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX21lcmdlTXVsdGlwbGVDb250ZXh0c1xuXHQgKiBAcGFyYW0gb1BhZ2VDb250ZXh0IFBhZ2UgY29udGV4dFxuXHQgKiBAcGFyYW0gYUxpbmVDb250ZXh0IFNlbGVjdGVkIENvbnRleHRzXG5cdCAqIEBwYXJhbSBzQ2hhcnRQYXRoIENvbGxlY3Rpb24gbmFtZSBvZiB0aGUgY2hhcnRcblx0ICogQHJldHVybnMgU2VsZWN0aW9uIFZhcmlhbnQgT2JqZWN0XG5cdCAqL1xuXHRfbWVyZ2VNdWx0aXBsZUNvbnRleHRzKG9QYWdlQ29udGV4dDogQ29udGV4dCwgYUxpbmVDb250ZXh0OiBhbnlbXSwgc0NoYXJ0UGF0aDogc3RyaW5nKSB7XG5cdFx0bGV0IGFBdHRyaWJ1dGVzOiBhbnlbXSA9IFtdLFxuXHRcdFx0YVBhZ2VBdHRyaWJ1dGVzID0gW10sXG5cdFx0XHRvQ29udGV4dCxcblx0XHRcdHNNZXRhUGF0aExpbmU6IHN0cmluZyxcblx0XHRcdHNQYXRoTGluZTtcblxuXHRcdGNvbnN0IHNQYWdlUGF0aCA9IG9QYWdlQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9QYWdlQ29udGV4dCAmJiBvUGFnZUNvbnRleHQuZ2V0TW9kZWwoKSAmJiAob1BhZ2VDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdGNvbnN0IHNNZXRhUGF0aFBhZ2UgPSBvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhZ2VQYXRoKS5yZXBsYWNlKC9eXFwvKi8sIFwiXCIpO1xuXG5cdFx0Ly8gR2V0IHNpbmdsZSBsaW5lIGNvbnRleHQgaWYgbmVjZXNzYXJ5XG5cdFx0aWYgKGFMaW5lQ29udGV4dCAmJiBhTGluZUNvbnRleHQubGVuZ3RoKSB7XG5cdFx0XHRvQ29udGV4dCA9IGFMaW5lQ29udGV4dFswXTtcblx0XHRcdHNQYXRoTGluZSA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRcdHNNZXRhUGF0aExpbmUgPSBvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGhMaW5lKS5yZXBsYWNlKC9eXFwvKi8sIFwiXCIpO1xuXG5cdFx0XHRhTGluZUNvbnRleHQuZm9yRWFjaCgob1NpbmdsZUNvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoc0NoYXJ0UGF0aCkge1xuXHRcdFx0XHRcdGNvbnN0IG9DaGFydENvbnRleHREYXRhID0gdGhpcy5fZ2V0Q2hhcnRDb250ZXh0RGF0YShvU2luZ2xlQ29udGV4dCwgc0NoYXJ0UGF0aCk7XG5cdFx0XHRcdFx0aWYgKG9DaGFydENvbnRleHREYXRhKSB7XG5cdFx0XHRcdFx0XHRhQXR0cmlidXRlcyA9IG9DaGFydENvbnRleHREYXRhLm1hcChmdW5jdGlvbiAob1N1YkNoYXJ0Q29udGV4dERhdGE6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhOiBvU3ViQ2hhcnRDb250ZXh0RGF0YSxcblx0XHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IGAke3NNZXRhUGF0aFBhZ2V9LyR7c0NoYXJ0UGF0aH1gXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUF0dHJpYnV0ZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRjb250ZXh0RGF0YTogb1NpbmdsZUNvbnRleHQuZ2V0T2JqZWN0KCksXG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IHNNZXRhUGF0aExpbmVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGFQYWdlQXR0cmlidXRlcy5wdXNoKHtcblx0XHRcdGNvbnRleHREYXRhOiBvUGFnZUNvbnRleHQuZ2V0T2JqZWN0KCksXG5cdFx0XHRlbnRpdHlTZXQ6IHNNZXRhUGF0aFBhZ2Vcblx0XHR9KTtcblx0XHQvLyBBZGRpbmcgUGFnZSBDb250ZXh0IHRvIHNlbGVjdGlvbiB2YXJpYW50XG5cdFx0YVBhZ2VBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbHMucmVtb3ZlU2Vuc2l0aXZlRGF0YShhUGFnZUF0dHJpYnV0ZXMsIG9NZXRhTW9kZWwpO1xuXHRcdGNvbnN0IG9QYWdlTGV2ZWxTViA9IENvbW1vblV0aWxzLmFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50KG5ldyBTZWxlY3Rpb25WYXJpYW50KCksIGFQYWdlQXR0cmlidXRlcywgdGhpcy5nZXRWaWV3KCkpO1xuXHRcdGFBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbHMucmVtb3ZlU2Vuc2l0aXZlRGF0YShhQXR0cmlidXRlcywgb01ldGFNb2RlbCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnQ6IG9QYWdlTGV2ZWxTVixcblx0XHRcdGF0dHJpYnV0ZXM6IGFBdHRyaWJ1dGVzXG5cdFx0fTtcblx0fVxuXG5cdF9nZXRCYXRjaEdyb3Vwc0ZvclZpZXcoKSB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnksXG5cdFx0XHRvQ29uZmlndXJhdGlvbnMgPSBvVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24sXG5cdFx0XHRhQ29uZmlndXJhdGlvbnMgPSBvQ29uZmlndXJhdGlvbnMgJiYgT2JqZWN0LmtleXMob0NvbmZpZ3VyYXRpb25zKSxcblx0XHRcdGFCYXRjaEdyb3VwcyA9IFtcIiRhdXRvLkhlcm9lc1wiLCBcIiRhdXRvLkRlY29yYXRpb25cIiwgXCIkYXV0by5Xb3JrZXJzXCJdO1xuXG5cdFx0aWYgKGFDb25maWd1cmF0aW9ucyAmJiBhQ29uZmlndXJhdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0YUNvbmZpZ3VyYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IG9Db25maWd1cmF0aW9uc1tzS2V5XTtcblx0XHRcdFx0aWYgKG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkID09PSBcIkxvbmdSdW5uZXJzXCIpIHtcblx0XHRcdFx0XHRhQmF0Y2hHcm91cHMucHVzaChcIiRhdXRvLkxvbmdSdW5uZXJzXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFCYXRjaEdyb3Vwcztcblx0fVxuXG5cdC8qXG5cdCAqIFJlc2V0IEJyZWFkY3J1bWIgbGlua3Ncblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7c2FwLm0uQnJlYWRjcnVtYnN9IFtvU291cmNlXSBwYXJlbnQgY29udHJvbFxuXHQgKiBAZGVzY3JpcHRpb24gVXNlZCB3aGVuIGNvbnRleHQgb2YgdGhlIG9iamVjdCBwYWdlIGNoYW5nZXMuXG5cdCAqICAgICAgICAgICAgICBUaGlzIGV2ZW50IGNhbGxiYWNrIGlzIGF0dGFjaGVkIHRvIG1vZGVsQ29udGV4dENoYW5nZVxuXHQgKiAgICAgICAgICAgICAgZXZlbnQgb2YgdGhlIEJyZWFkY3J1bWIgY29udHJvbCB0byBjYXRjaCBjb250ZXh0IGNoYW5nZS5cblx0ICogICAgICAgICAgICAgIFRoZW4gZWxlbWVudCBiaW5kaW5nIGFuZCBocmVmcyBhcmUgdXBkYXRlZCBmb3IgZWFjaCBsaW5rLlxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGV4cGVyaW1lbnRhbFxuXHQgKi9cblx0YXN5bmMgX3NldEJyZWFkY3J1bWJMaW5rcyhvU291cmNlOiBCcmVhZENydW1icykge1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0b0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRhUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuXHRcdFx0YVNraXBQYXJhbWV0ZXJpemVkOiBhbnlbXSA9IFtdLFxuXHRcdFx0c05ld1BhdGggPSBvQ29udGV4dD8uZ2V0UGF0aCgpLFxuXHRcdFx0YVBhdGhQYXJ0cyA9IHNOZXdQYXRoPy5zcGxpdChcIi9cIikgPz8gW10sXG5cdFx0XHRvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudCAmJiBvQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzUGF0aCA9IFwiXCI7XG5cdFx0dHJ5IHtcblx0XHRcdGFQYXRoUGFydHMuc2hpZnQoKTtcblx0XHRcdGFQYXRoUGFydHMuc3BsaWNlKC0xLCAxKTtcblx0XHRcdGFQYXRoUGFydHMuZm9yRWFjaChmdW5jdGlvbiAoc1BhdGhQYXJ0OiBhbnkpIHtcblx0XHRcdFx0c1BhdGggKz0gYC8ke3NQYXRoUGFydH1gO1xuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBSb290Q29udGFpbmVyQmFzZUNvbnRyb2xsZXI7XG5cdFx0XHRcdGNvbnN0IHNQYXJhbWV0ZXJQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdFx0XHRcdGNvbnN0IGJSZXN1bHRDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhcmFtZXRlclBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dGApO1xuXHRcdFx0XHRpZiAoYlJlc3VsdENvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBXZSBkb250IG5lZWQgdG8gY3JlYXRlIGEgYnJlYWRjcnVtYiBmb3IgUGFyYW1ldGVyIHBhdGhcblx0XHRcdFx0XHRhU2tpcFBhcmFtZXRlcml6ZWQucHVzaCgxKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YVNraXBQYXJhbWV0ZXJpemVkLnB1c2goMCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YVByb21pc2VzLnB1c2gob1Jvb3RWaWV3Q29udHJvbGxlci5nZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aCkpO1xuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCB0aXRsZUhpZXJhcmNoeUluZm9zOiBhbnlbXSA9IGF3YWl0IFByb21pc2UuYWxsKGFQcm9taXNlcyk7XG5cdFx0XHRsZXQgaWR4LCBoaWVyYXJjaHlQb3NpdGlvbiwgb0xpbms7XG5cdFx0XHRmb3IgKGNvbnN0IHRpdGxlSGllcmFyY2h5SW5mbyBvZiB0aXRsZUhpZXJhcmNoeUluZm9zKSB7XG5cdFx0XHRcdGhpZXJhcmNoeVBvc2l0aW9uID0gdGl0bGVIaWVyYXJjaHlJbmZvcy5pbmRleE9mKHRpdGxlSGllcmFyY2h5SW5mbyk7XG5cdFx0XHRcdGlkeCA9IGhpZXJhcmNoeVBvc2l0aW9uIC0gYVNraXBQYXJhbWV0ZXJpemVkW2hpZXJhcmNoeVBvc2l0aW9uXTtcblx0XHRcdFx0b0xpbmsgPSBvU291cmNlLmdldExpbmtzKClbaWR4XSA/IG9Tb3VyY2UuZ2V0TGlua3MoKVtpZHhdIDogbmV3IExpbmsoKTtcblx0XHRcdFx0Ly9zQ3VycmVudEVudGl0eSBpcyBhIGZhbGxiYWNrIHZhbHVlIGluIGNhc2Ugb2YgZW1wdHkgdGl0bGVcblx0XHRcdFx0b0xpbmsuc2V0VGV4dCh0aXRsZUhpZXJhcmNoeUluZm8uc3VidGl0bGUgfHwgdGl0bGVIaWVyYXJjaHlJbmZvLnRpdGxlKTtcblx0XHRcdFx0Ly9XZSBhcHBseSBhbiBhZGRpdGlvbmFsIGVuY29kZVVSSSBpbiBjYXNlIG9mIHNwZWNpYWwgY2hhcmFjdGVycyAoaWUgXCIvXCIpIHVzZWQgaW4gdGhlIHVybCB0aHJvdWdoIHRoZSBzZW1hbnRpYyBrZXlzXG5cdFx0XHRcdG9MaW5rLnNldEhyZWYoZW5jb2RlVVJJKHRpdGxlSGllcmFyY2h5SW5mby5pbnRlbnQpKTtcblx0XHRcdFx0aWYgKCFvU291cmNlLmdldExpbmtzKClbaWR4XSkge1xuXHRcdFx0XHRcdG9Tb3VyY2UuYWRkTGluayhvTGluayk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBzZXR0aW5nIHRoZSBicmVhZGNydW1iIGxpbmtzOlwiICsgZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdF9jaGVja0RhdGFQb2ludFRpdGxlRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKCkge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBvRGF0YVBvaW50cyA9IENvbW1vblV0aWxzLmdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbihcblx0XHRcdG9WaWV3LmdldFZpZXdEYXRhKCksXG5cdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0T3V0Ym91bmRzKClcblx0XHQpO1xuXHRcdGNvbnN0IG9TaGVsbFNlcnZpY2VzID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdFx0Y29uc3Qgb1BhZ2VDb250ZXh0ID0gb1ZpZXcgJiYgKG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaXNIZWFkZXJEUExpbmtWaXNpYmxlXCIsIHt9KTtcblx0XHRpZiAob1BhZ2VDb250ZXh0KSB7XG5cdFx0XHRvUGFnZUNvbnRleHRcblx0XHRcdFx0LnJlcXVlc3RPYmplY3QoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0RhdGE6IGFueSkge1xuXHRcdFx0XHRcdGZuR2V0TGlua3Mob0RhdGFQb2ludHMsIG9EYXRhKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgbGlua3MgZnJvbSB0aGUgc2hlbGwgc2VydmljZVwiLCBvRXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb0Vycm9yXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZm5PbkVycm9yKG9FcnJvcjogYW55KSB7XG5cdFx0XHRMb2cuZXJyb3Iob0Vycm9yKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmblNldExpbmtFbmFibGVtZW50KGlkOiBzdHJpbmcsIGFTdXBwb3J0ZWRMaW5rczogYW55KSB7XG5cdFx0XHRjb25zdCBzTGlua0lkID0gaWQ7XG5cdFx0XHQvLyBwcm9jZXNzIHZpYWJsZSBsaW5rcyBmcm9tIGdldExpbmtzIGZvciBhbGwgZGF0YXBvaW50cyBoYXZpbmcgb3V0Ym91bmRcblx0XHRcdGlmIChhU3VwcG9ydGVkTGlua3MgJiYgYVN1cHBvcnRlZExpbmtzLmxlbmd0aCA9PT0gMSAmJiBhU3VwcG9ydGVkTGlua3NbMF0uc3VwcG9ydGVkKSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgaXNIZWFkZXJEUExpbmtWaXNpYmxlLyR7c0xpbmtJZH1gLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb1N1YkRhdGFQb2ludHNcblx0XHQgKiBAcGFyYW0gb1BhZ2VEYXRhXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZm5HZXRMaW5rcyhvU3ViRGF0YVBvaW50czogYW55LCBvUGFnZURhdGE6IGFueSkge1xuXHRcdFx0Zm9yIChjb25zdCBzSWQgaW4gb1N1YkRhdGFQb2ludHMpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGFQb2ludCA9IG9TdWJEYXRhUG9pbnRzW3NJZF07XG5cdFx0XHRcdGNvbnN0IG9QYXJhbXM6IGFueSA9IHt9O1xuXHRcdFx0XHRjb25zdCBvTGluayA9IG9WaWV3LmJ5SWQoc0lkKTtcblx0XHRcdFx0aWYgKCFvTGluaykge1xuXHRcdFx0XHRcdC8vIGZvciBkYXRhIHBvaW50cyBjb25maWd1cmVkIGluIGFwcCBkZXNjcmlwdG9yIGJ1dCBub3QgYW5ub3RhdGVkIGluIHRoZSBoZWFkZXJcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBvTGlua0NvbnRleHQgPSBvTGluay5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRjb25zdCBvTGlua0RhdGE6IGFueSA9IG9MaW5rQ29udGV4dCAmJiBvTGlua0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGxldCBvTWl4ZWRDb250ZXh0OiBhbnkgPSBtZXJnZSh7fSwgb1BhZ2VEYXRhLCBvTGlua0RhdGEpO1xuXHRcdFx0XHQvLyBwcm9jZXNzIHNlbWFudGljIG9iamVjdCBtYXBwaW5nc1xuXHRcdFx0XHRpZiAob0RhdGFQb2ludC5zZW1hbnRpY09iamVjdE1hcHBpbmcpIHtcblx0XHRcdFx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RNYXBwaW5nID0gb0RhdGFQb2ludC5zZW1hbnRpY09iamVjdE1hcHBpbmc7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIGluIGFTZW1hbnRpY09iamVjdE1hcHBpbmcpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9NYXBwaW5nID0gYVNlbWFudGljT2JqZWN0TWFwcGluZ1tpdGVtXTtcblx0XHRcdFx0XHRcdGNvbnN0IHNNYWluUHJvcGVydHkgPSBvTWFwcGluZ1tcIkxvY2FsUHJvcGVydHlcIl1bXCIkUHJvcGVydHlQYXRoXCJdO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc01hcHBlZFByb3BlcnR5ID0gb01hcHBpbmdbXCJTZW1hbnRpY09iamVjdFByb3BlcnR5XCJdO1xuXHRcdFx0XHRcdFx0aWYgKHNNYWluUHJvcGVydHkgIT09IHNNYXBwZWRQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob01peGVkQ29udGV4dC5oYXNPd25Qcm9wZXJ0eShzTWFpblByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdNYXBwaW5nOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRcdFx0XHRvTmV3TWFwcGluZ1tzTWFwcGVkUHJvcGVydHldID0gb01peGVkQ29udGV4dFtzTWFpblByb3BlcnR5XTtcblx0XHRcdFx0XHRcdFx0XHRvTWl4ZWRDb250ZXh0ID0gbWVyZ2Uoe30sIG9NaXhlZENvbnRleHQsIG9OZXdNYXBwaW5nKTtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgb01peGVkQ29udGV4dFtzTWFpblByb3BlcnR5XTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvTWl4ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzS2V5IGluIG9NaXhlZENvbnRleHQpIHtcblx0XHRcdFx0XHRcdGlmIChzS2V5LmluZGV4T2YoXCJfXCIpICE9PSAwICYmIHNLZXkuaW5kZXhPZihcIm9kYXRhLmNvbnRleHRcIikgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdG9QYXJhbXNbc0tleV0gPSBvTWl4ZWRDb250ZXh0W3NLZXldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyB2YWxpZGF0ZSBpZiBhIGxpbmsgbXVzdCBiZSByZW5kZXJlZFxuXHRcdFx0XHRvU2hlbGxTZXJ2aWNlc1xuXHRcdFx0XHRcdC5pc05hdmlnYXRpb25TdXBwb3J0ZWQoW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6IHtcblx0XHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogb0RhdGFQb2ludC5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdFx0XHRhY3Rpb246IG9EYXRhUG9pbnQuYWN0aW9uXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHBhcmFtczogb1BhcmFtc1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0pXG5cdFx0XHRcdFx0LnRoZW4oKGFMaW5rcykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuU2V0TGlua0VuYWJsZW1lbnQoc0lkLCBhTGlua3MpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZuT25FcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aGFuZGxlcnMgPSB7XG5cdFx0LyoqXG5cdFx0ICogSW52b2tlcyB0aGUgcGFnZSBwcmltYXJ5IGFjdGlvbiBvbiBwcmVzcyBvZiBDdHJsK0VudGVyLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBwYWdlIGNvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gb1ZpZXdcblx0XHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyBjYWxsZWRcblx0XHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbiwgZWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgY2FsbGVkXG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5tb2RlbF0gTWFuZGF0b3J5IGZvciBhbiB1bmJvdW5kIGFjdGlvbjsgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWxcblx0XHQgKiBAcGFyYW0gW21Db25kaXRpb25zXSBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdFx0ICogQHBhcmFtIFttQ29uZGl0aW9ucy5wb3NpdGl2ZUFjdGlvblZpc2libGVdIFRoZSB2aXNpYmlsaXR5IG9mIHNlbWF0aWMgcG9zaXRpdmUgYWN0aW9uXG5cdFx0ICogQHBhcmFtIFttQ29uZGl0aW9ucy5wb3NpdGl2ZUFjdGlvbkVuYWJsZWRdIFRoZSBlbmFibGVtZW50IG9mIHNlbWFudGljIHBvc2l0aXZlIGFjdGlvblxuXHRcdCAqIEBwYXJhbSBbbUNvbmRpdGlvbnMuZWRpdEFjdGlvblZpc2libGVdIFRoZSBFZGl0IGJ1dHRvbiB2aXNpYmlsaXR5XG5cdFx0ICogQHBhcmFtIFttQ29uZGl0aW9ucy5lZGl0QWN0aW9uRW5hYmxlZF0gVGhlIGVuYWJsZW1lbnQgb2YgRWRpdCBidXR0b25cblx0XHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRvblByaW1hcnlBY3Rpb24oXG5cdFx0XHRvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsXG5cdFx0XHRvVmlldzogVmlldyxcblx0XHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRcdG1QYXJhbWV0ZXJzOiB1bmtub3duLFxuXHRcdFx0bUNvbmRpdGlvbnM6IHtcblx0XHRcdFx0cG9zaXRpdmVBY3Rpb25WaXNpYmxlOiBib29sZWFuO1xuXHRcdFx0XHRwb3NpdGl2ZUFjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG5cdFx0XHRcdGVkaXRBY3Rpb25WaXNpYmxlOiBib29sZWFuO1xuXHRcdFx0XHRlZGl0QWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcblx0XHRcdH1cblx0XHQpIHtcblx0XHRcdGNvbnN0IGlWaWV3TGV2ZWwgPSAob0NvbnRyb2xsZXIuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS52aWV3TGV2ZWwsXG5cdFx0XHRcdG9PYmplY3RQYWdlID0gb0NvbnRyb2xsZXIuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0XHRpZiAobUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25WaXNpYmxlKSB7XG5cdFx0XHRcdGlmIChtQ29uZGl0aW9ucy5wb3NpdGl2ZUFjdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0XHRvQ29udHJvbGxlci5oYW5kbGVycy5vbkNhbGxBY3Rpb24ob1ZpZXcsIHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAobUNvbmRpdGlvbnMuZWRpdEFjdGlvblZpc2libGUgJiYgaVZpZXdMZXZlbCA9PT0gMSkge1xuXHRcdFx0XHRpZiAobUNvbmRpdGlvbnMuZWRpdEFjdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0XHRvQ29udHJvbGxlci5fZWRpdERvY3VtZW50KG9Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpVmlld0xldmVsID09PSAxICYmIG9PYmplY3RQYWdlLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSkge1xuXHRcdFx0XHRvQ29udHJvbGxlci5fc2F2ZURvY3VtZW50KG9Db250ZXh0KTtcblx0XHRcdH0gZWxzZSBpZiAob09iamVjdFBhZ2UuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0XHRcdG9Db250cm9sbGVyLl9hcHBseURvY3VtZW50KG9Db250ZXh0KTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0b25UYWJsZUNvbnRleHRDaGFuZ2UodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBvU291cmNlID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdFx0bGV0IG9UYWJsZTogYW55O1xuXHRcdFx0dGhpcy5fZmluZFRhYmxlcygpLnNvbWUoZnVuY3Rpb24gKF9vVGFibGU6IGFueSkge1xuXHRcdFx0XHRpZiAoX29UYWJsZS5nZXRSb3dCaW5kaW5nKCkgPT09IG9Tb3VyY2UpIHtcblx0XHRcdFx0XHRvVGFibGUgPSBfb1RhYmxlO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBvQ3VycmVudEFjdGlvblByb21pc2UgPSB0aGlzLl9lZGl0Rmxvdy5nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uUHJvbWlzZSkge1xuXHRcdFx0XHRsZXQgYVRhYmxlQ29udGV4dHM6IGFueTtcblx0XHRcdFx0aWYgKG9UYWJsZS5nZXRUeXBlKCkuZ2V0TWV0YWRhdGEoKS5pc0EoXCJzYXAudWkubWRjLnRhYmxlLkdyaWRUYWJsZVR5cGVcIikpIHtcblx0XHRcdFx0XHRhVGFibGVDb250ZXh0cyA9IG9Tb3VyY2UuZ2V0Q29udGV4dHMoMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YVRhYmxlQ29udGV4dHMgPSBvU291cmNlLmdldEN1cnJlbnRDb250ZXh0cygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vaWYgY29udGV4dHMgYXJlIG5vdCBmdWxseSBsb2FkZWQgdGhlIGdldGNvbnRleHRzIGZ1bmN0aW9uIGFib3ZlIHdpbGwgdHJpZ2dlciBhIG5ldyBjaGFuZ2UgZXZlbnQgY2FsbFxuXHRcdFx0XHRpZiAoIWFUYWJsZUNvbnRleHRzWzBdKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uUHJvbWlzZVxuXHRcdFx0XHRcdC50aGVuKChvQWN0aW9uUmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKCFvQWN0aW9uUmVzcG9uc2UgfHwgb0FjdGlvblJlc3BvbnNlLmNvbnRyb2xJZCAhPT0gb1RhYmxlLnNJZCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBvQWN0aW9uRGF0YSA9IG9BY3Rpb25SZXNwb25zZS5vRGF0YTtcblx0XHRcdFx0XHRcdGNvbnN0IGFLZXlzID0gb0FjdGlvblJlc3BvbnNlLmtleXM7XG5cdFx0XHRcdFx0XHRsZXQgaU5ld0l0ZW1wID0gLTE7XG5cdFx0XHRcdFx0XHRhVGFibGVDb250ZXh0cy5maW5kKGZ1bmN0aW9uIChvVGFibGVDb250ZXh0OiBhbnksIGk6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvVGFibGVEYXRhID0gb1RhYmxlQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYkNvbXBhcmUgPSBhS2V5cy5ldmVyeShmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9UYWJsZURhdGFbc0tleV0gPT09IG9BY3Rpb25EYXRhW3NLZXldO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0aWYgKGJDb21wYXJlKSB7XG5cdFx0XHRcdFx0XHRcdFx0aU5ld0l0ZW1wID0gaTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYkNvbXBhcmU7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGlmIChpTmV3SXRlbXAgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFEaWFsb2dzID0gSW5zdGFuY2VNYW5hZ2VyLmdldE9wZW5EaWFsb2dzKCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPVxuXHRcdFx0XHRcdFx0XHRcdGFEaWFsb2dzLmxlbmd0aCA+IDAgPyBhRGlhbG9ncy5maW5kKChkaWFsb2cpID0+IGRpYWxvZy5kYXRhKFwiRnVsbFNjcmVlbkRpYWxvZ1wiKSAhPT0gdHJ1ZSkgOiBudWxsO1xuXHRcdFx0XHRcdFx0XHRpZiAob0RpYWxvZykge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGJ5IGRlc2lnbiwgYSBzYXAubS5kaWFsb2cgc2V0IHRoZSBmb2N1cyB0byB0aGUgcHJldmlvdXMgZm9jdXNlZCBlbGVtZW50IHdoZW4gY2xvc2luZy5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgd2FpdCBmb3IgdGhlIGRpYWxvZyB0byBiZSBjbG9zZSBiZWZvcmUgdG8gZm9jdXMgYW5vdGhlciBlbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5hdHRhY2hFdmVudE9uY2UoXCJhZnRlckNsb3NlXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9UYWJsZS5mb2N1c1JvdyhpTmV3SXRlbXAsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG9UYWJsZS5mb2N1c1JvdyhpTmV3SXRlbXAsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2VkaXRGbG93LmRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoYEFuIGVycm9yIG9jY3VycyB3aGlsZSBzY3JvbGxpbmcgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbTogJHtlcnJ9YCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBmaXJlIE1vZGVsQ29udGV4dENoYW5nZSBvbiB0aGUgbWVzc2FnZSBidXR0b24gd2hlbmV2ZXIgdGhlIHRhYmxlIGNvbnRleHQgY2hhbmdlc1xuXHRcdFx0dGhpcy5tZXNzYWdlQnV0dG9uLmZpcmVNb2RlbENvbnRleHRDaGFuZ2UoKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogSW52b2tlcyBhbiBhY3Rpb24gLSBib3VuZC91bmJvdW5kIGFuZCBzZXRzIHRoZSBwYWdlIGRpcnR5LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIG9WaWV3XG5cdFx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHRcdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY29udGV4dHNdIE1hbmRhdG9yeSBmb3IgYSBib3VuZCBhY3Rpb24sIGVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIGNhbGxlZFxuXHRcdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb247IGFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdFx0ICogQHJldHVybnMgVGhlIGFjdGlvbiBwcm9taXNlXG5cdFx0ICogQHVpNS1yZXN0cmljdGVkXG5cdFx0ICogQGZpbmFsXG5cdFx0ICovXG5cdFx0b25DYWxsQWN0aW9uKG9WaWV3OiBhbnksIHNBY3Rpb25OYW1lOiBzdHJpbmcsIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gb1ZpZXcuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLmVkaXRGbG93XG5cdFx0XHRcdC5pbnZva2VBY3Rpb24oc0FjdGlvbk5hbWUsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0XHQudGhlbihvQ29udHJvbGxlci5fc2hvd01lc3NhZ2VQb3BvdmVyLmJpbmQob0NvbnRyb2xsZXIsIHVuZGVmaW5lZCkpXG5cdFx0XHRcdC5jYXRjaChvQ29udHJvbGxlci5fc2hvd01lc3NhZ2VQb3BvdmVyLmJpbmQob0NvbnRyb2xsZXIpKTtcblx0XHR9LFxuXHRcdG9uRGF0YVBvaW50VGl0bGVQcmVzc2VkKG9Db250cm9sbGVyOiBhbnksIG9Tb3VyY2U6IGFueSwgb01hbmlmZXN0T3V0Ym91bmQ6IGFueSwgc0NvbnRyb2xDb25maWc6IGFueSwgc0NvbGxlY3Rpb25QYXRoOiBhbnkpIHtcblx0XHRcdG9NYW5pZmVzdE91dGJvdW5kID0gdHlwZW9mIG9NYW5pZmVzdE91dGJvdW5kID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShvTWFuaWZlc3RPdXRib3VuZCkgOiBvTWFuaWZlc3RPdXRib3VuZDtcblx0XHRcdGNvbnN0IG9UYXJnZXRJbmZvID0gb01hbmlmZXN0T3V0Ym91bmRbc0NvbnRyb2xDb25maWddLFxuXHRcdFx0XHRhU2VtYW50aWNPYmplY3RNYXBwaW5nID0gQ29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nKG9UYXJnZXRJbmZvKSxcblx0XHRcdFx0b0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0c01ldGFQYXRoID0gb0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dFxuXHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFQYXRoKG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGxldCBhTmF2aWdhdGlvbkRhdGEgPSBvQ29udHJvbGxlci5fZ2V0Q2hhcnRDb250ZXh0RGF0YShvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0LCBzQ29sbGVjdGlvblBhdGgpO1xuXHRcdFx0bGV0IGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVycztcblxuXHRcdFx0YU5hdmlnYXRpb25EYXRhID0gYU5hdmlnYXRpb25EYXRhLm1hcChmdW5jdGlvbiAob05hdmlnYXRpb25EYXRhOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRkYXRhOiBvTmF2aWdhdGlvbkRhdGEsXG5cdFx0XHRcdFx0bWV0YVBhdGg6IHNNZXRhUGF0aCArIChzQ29sbGVjdGlvblBhdGggPyBgLyR7c0NvbGxlY3Rpb25QYXRofWAgOiBcIlwiKVxuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAob1RhcmdldEluZm8gJiYgb1RhcmdldEluZm8ucGFyYW1ldGVycykge1xuXHRcdFx0XHRjb25zdCBvUGFyYW1zID0gb1RhcmdldEluZm8ucGFyYW1ldGVycyAmJiBvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLmdldE91dGJvdW5kUGFyYW1zKG9UYXJnZXRJbmZvLnBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoT2JqZWN0LmtleXMob1BhcmFtcykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9QYXJhbXM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvVGFyZ2V0SW5mbyAmJiBvVGFyZ2V0SW5mby5zZW1hbnRpY09iamVjdCAmJiBvVGFyZ2V0SW5mby5hY3Rpb24pIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5uYXZpZ2F0ZShvVGFyZ2V0SW5mby5zZW1hbnRpY09iamVjdCwgb1RhcmdldEluZm8uYWN0aW9uLCB7XG5cdFx0XHRcdFx0bmF2aWdhdGlvbkNvbnRleHRzOiBhTmF2aWdhdGlvbkRhdGEsXG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nOiBhU2VtYW50aWNPYmplY3RNYXBwaW5nLFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVyczogYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogVHJpZ2dlcnMgYW4gb3V0Ym91bmQgbmF2aWdhdGlvbiB3aGVuIGEgdXNlciBjaG9vc2VzIHRoZSBjaGV2cm9uLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIG9Db250cm9sbGVyXG5cdFx0ICogQHBhcmFtIHNPdXRib3VuZFRhcmdldCBOYW1lIG9mIHRoZSBvdXRib3VuZCB0YXJnZXQgKG5lZWRzIHRvIGJlIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0KVxuXHRcdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIGZvciB0aGUgdGFyZ2V0IGFwcFxuXHRcdCAqIEBwYXJhbSBzQ3JlYXRlUGF0aCBDcmVhdGUgcGF0aCB3aGVuIHRoZSBjaGV2cm9uIGlzIGNyZWF0ZWQuXG5cdFx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZCAoPz8/IG1heWJlIG9ubHkgb25jZSBmaW5pc2hlZD8pXG5cdFx0ICogQHVpNS1yZXN0cmljdGVkXG5cdFx0ICogQGZpbmFsXG5cdFx0ICovXG5cdFx0b25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyOiBPYmplY3RQYWdlQ29udHJvbGxlciwgc091dGJvdW5kVGFyZ2V0OiBzdHJpbmcsIG9Db250ZXh0OiBhbnksIHNDcmVhdGVQYXRoOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlciwgc091dGJvdW5kVGFyZ2V0LCBvQ29udGV4dCwgc0NyZWF0ZVBhdGgpO1xuXHRcdH0sXG5cblx0XHRvbk5hdmlnYXRlQ2hhbmdlKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Ly93aWxsIGJlIGNhbGxlZCBhbHdheXMgd2hlbiB3ZSBjbGljayBvbiBhIHNlY3Rpb24gdGFiXG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0XHR0aGlzLmJTZWN0aW9uTmF2aWdhdGVkID0gdHJ1ZTtcblxuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdGlmIChcblx0XHRcdFx0b09iamVjdFBhZ2UuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpICYmXG5cdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuc2VjdGlvbkxheW91dCA9PT0gXCJUYWJzXCIgJiZcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIikgPT09IGZhbHNlXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3ViU2VjdGlvblwiKTtcblx0XHRcdFx0dGhpcy5fdXBkYXRlRm9jdXNJbkVkaXRNb2RlKFtvU3ViU2VjdGlvbl0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25WYXJpYW50U2VsZWN0ZWQ6IGZ1bmN0aW9uICh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcikge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH0sXG5cdFx0b25WYXJpYW50U2F2ZWQ6IGZ1bmN0aW9uICh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcikge1xuXHRcdFx0Ly9UT0RPOiBTaG91bGQgcmVtb3ZlIHRoaXMgc2V0VGltZU91dCBvbmNlIFZhcmlhbnQgTWFuYWdlbWVudCBwcm92aWRlcyBhbiBhcGkgdG8gZmV0Y2ggdGhlIGN1cnJlbnQgdmFyaWFudCBrZXkgb24gc2F2ZVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdH0sIDUwMCk7XG5cdFx0fSxcblx0XHRuYXZpZ2F0ZVRvU3ViU2VjdGlvbjogZnVuY3Rpb24gKG9Db250cm9sbGVyOiBPYmplY3RQYWdlQ29udHJvbGxlciwgdkRldGFpbENvbmZpZzogYW55KSB7XG5cdFx0XHRjb25zdCBvRGV0YWlsQ29uZmlnID0gdHlwZW9mIHZEZXRhaWxDb25maWcgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHZEZXRhaWxDb25maWcpIDogdkRldGFpbENvbmZpZztcblx0XHRcdGNvbnN0IG9PYmplY3RQYWdlID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpLmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBPYmplY3RQYWdlTGF5b3V0O1xuXHRcdFx0bGV0IG9TZWN0aW9uO1xuXHRcdFx0bGV0IG9TdWJTZWN0aW9uO1xuXHRcdFx0aWYgKG9EZXRhaWxDb25maWcuc2VjdGlvbklkKSB7XG5cdFx0XHRcdG9TZWN0aW9uID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpLmJ5SWQob0RldGFpbENvbmZpZy5zZWN0aW9uSWQpIGFzIE9iamVjdFBhZ2VTZWN0aW9uO1xuXHRcdFx0XHRvU3ViU2VjdGlvbiA9IChcblx0XHRcdFx0XHRvRGV0YWlsQ29uZmlnLnN1YlNlY3Rpb25JZFxuXHRcdFx0XHRcdFx0PyBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChvRGV0YWlsQ29uZmlnLnN1YlNlY3Rpb25JZClcblx0XHRcdFx0XHRcdDogb1NlY3Rpb24gJiYgb1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKSAmJiBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpWzBdXG5cdFx0XHRcdCkgYXMgT2JqZWN0UGFnZVN1YlNlY3Rpb247XG5cdFx0XHR9IGVsc2UgaWYgKG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkKSB7XG5cdFx0XHRcdG9TdWJTZWN0aW9uID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpLmJ5SWQob0RldGFpbENvbmZpZy5zdWJTZWN0aW9uSWQpIGFzIE9iamVjdFBhZ2VTdWJTZWN0aW9uO1xuXHRcdFx0XHRvU2VjdGlvbiA9IG9TdWJTZWN0aW9uICYmIChvU3ViU2VjdGlvbi5nZXRQYXJlbnQoKSBhcyBPYmplY3RQYWdlU2VjdGlvbik7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW9TZWN0aW9uIHx8ICFvU3ViU2VjdGlvbiB8fCAhb1NlY3Rpb24uZ2V0VmlzaWJsZSgpIHx8ICFvU3ViU2VjdGlvbi5nZXRWaXNpYmxlKCkpIHtcblx0XHRcdFx0KChvQ29udHJvbGxlci5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpIGFzIFByb21pc2U8UmVzb3VyY2VCdW5kbGU+KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzb3VyY2VCdW5kbGUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNUaXRsZSA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcIkNfUk9VVElOR19OQVZJR0FUSU9OX0RJU0FCTEVEX1RJVExFXCIsXG5cdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0KG9Db250cm9sbGVyLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZW50aXR5U2V0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKHNUaXRsZSk7XG5cdFx0XHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNUaXRsZSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b09iamVjdFBhZ2Uuc2Nyb2xsVG9TZWN0aW9uKG9TdWJTZWN0aW9uLmdldElkKCkpO1xuXHRcdFx0XHQvLyB0cmlnZ2VyIGlhcHAgc3RhdGUgY2hhbmdlXG5cdFx0XHRcdG9PYmplY3RQYWdlLmZpcmVOYXZpZ2F0ZSh7XG5cdFx0XHRcdFx0c2VjdGlvbjogb1NlY3Rpb24sXG5cdFx0XHRcdFx0c3ViU2VjdGlvbjogb1N1YlNlY3Rpb25cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvbkNoYXJ0U2VsZWN0aW9uQ2hhbmdlZDogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRDaGFydFJ1bnRpbWUuZm5VcGRhdGVDaGFydChvRXZlbnQpO1xuXHRcdH0sXG5cdFx0b25TdGF0ZUNoYW5nZSh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcikge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztFQWtqQk8sZ0JBQWdCQSxJQUFJLEVBQUVDLE9BQU8sRUFBRTtJQUNyQyxJQUFJO01BQ0gsSUFBSUMsTUFBTSxHQUFHRixJQUFJLEVBQUU7SUFDcEIsQ0FBQyxDQUFDLE9BQU1HLENBQUMsRUFBRTtNQUNWLE9BQU9GLE9BQU8sQ0FBQ0UsQ0FBQyxDQUFDO0lBQ2xCO0lBQ0EsSUFBSUQsTUFBTSxJQUFJQSxNQUFNLENBQUNFLElBQUksRUFBRTtNQUMxQixPQUFPRixNQUFNLENBQUNFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRUgsT0FBTyxDQUFD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