@sapui5/sap.fe.core 1.98.0 → 1.99.2

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 (231) hide show
  1. package/package.json +3 -2
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +377 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +385 -0
  5. package/src/sap/fe/core/AppComponent.js +3 -2
  6. package/src/sap/fe/core/AppStateHandler.js +229 -181
  7. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  8. package/src/sap/fe/core/BaseController.js +3 -2
  9. package/src/sap/fe/core/BusyLocker.js +105 -121
  10. package/src/sap/fe/core/BusyLocker.ts +98 -0
  11. package/src/sap/fe/core/CommonUtils.js +2073 -2399
  12. package/src/sap/fe/core/CommonUtils.ts +2078 -0
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -2
  14. package/src/sap/fe/core/PageController.js +84 -125
  15. package/src/sap/fe/core/PageController.ts +101 -0
  16. package/src/sap/fe/core/RouterProxy.js +986 -823
  17. package/src/sap/fe/core/RouterProxy.ts +838 -0
  18. package/src/sap/fe/core/Synchronization.js +51 -35
  19. package/src/sap/fe/core/Synchronization.ts +29 -0
  20. package/src/sap/fe/core/TemplateComponent.js +173 -164
  21. package/src/sap/fe/core/TemplateComponent.ts +166 -0
  22. package/src/sap/fe/core/TemplateModel.js +97 -54
  23. package/src/sap/fe/core/TemplateModel.ts +64 -0
  24. package/src/sap/fe/core/TransactionHelper.js +1576 -1664
  25. package/src/sap/fe/core/TransactionHelper.ts +1706 -0
  26. package/src/sap/fe/core/actions/draft.js +561 -608
  27. package/src/sap/fe/core/actions/draft.ts +595 -0
  28. package/src/sap/fe/core/actions/messageHandling.js +545 -514
  29. package/src/sap/fe/core/actions/messageHandling.ts +532 -0
  30. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  31. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  32. package/src/sap/fe/core/actions/operations.js +1074 -1215
  33. package/src/sap/fe/core/actions/operations.ts +1162 -0
  34. package/src/sap/fe/core/actions/sticky.js +102 -105
  35. package/src/sap/fe/core/actions/sticky.ts +102 -0
  36. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
  37. package/src/sap/fe/core/controllerextensions/EditFlow.js +170 -392
  38. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
  39. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +279 -11
  40. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -6
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.js +52 -47
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -3
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +29 -26
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +101 -8
  45. package/src/sap/fe/core/controllerextensions/MessageHandler.js +17 -8
  46. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
  47. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  48. package/src/sap/fe/core/controllerextensions/Paginator.js +3 -2
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -2
  50. package/src/sap/fe/core/controllerextensions/Routing.js +9 -4
  51. package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
  52. package/src/sap/fe/core/controllerextensions/Share.js +3 -2
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -3
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +18 -18
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
  56. package/src/sap/fe/core/controls/CommandExecution.js +3 -2
  57. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
  58. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
  59. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -2
  60. package/src/sap/fe/core/controls/FieldWrapper.js +11 -22
  61. package/src/sap/fe/core/controls/FilterBar.js +3 -2
  62. package/src/sap/fe/core/controls/FormElementWrapper.js +3 -2
  63. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
  64. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
  65. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
  66. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
  67. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
  68. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
  69. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +3 -2
  70. package/src/sap/fe/core/converters/ConverterContext.js +2 -2
  71. package/src/sap/fe/core/converters/ConverterContext.ts +4 -3
  72. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  73. package/src/sap/fe/core/converters/ManifestSettings.ts +1 -0
  74. package/src/sap/fe/core/converters/ManifestWrapper.js +39 -26
  75. package/src/sap/fe/core/converters/ManifestWrapper.ts +9 -0
  76. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -8
  77. package/src/sap/fe/core/converters/MetaModelConverter.ts +16 -16
  78. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  79. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  80. package/src/sap/fe/core/converters/common/AnnotationConverter.js +17 -13
  81. package/src/sap/fe/core/converters/controls/Common/Action.js +2 -2
  82. package/src/sap/fe/core/converters/controls/Common/Action.ts +2 -2
  83. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  84. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  85. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  86. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  87. package/src/sap/fe/core/converters/controls/Common/Form.js +4 -2
  88. package/src/sap/fe/core/converters/controls/Common/Form.ts +16 -2
  89. package/src/sap/fe/core/converters/controls/Common/Table.js +250 -146
  90. package/src/sap/fe/core/converters/controls/Common/Table.ts +300 -167
  91. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +115 -56
  92. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +120 -74
  93. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +467 -32
  94. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +483 -54
  95. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -6
  96. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +9 -15
  97. package/src/sap/fe/core/converters/helpers/Aggregation.js +13 -5
  98. package/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
  99. package/src/sap/fe/core/converters/helpers/IssueManager.js +4 -1
  100. package/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -0
  101. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
  102. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  103. package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -6
  104. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
  105. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
  106. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  107. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  108. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  109. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  110. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  111. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  112. package/src/sap/fe/core/formatters/TableFormatter.js +39 -28
  113. package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
  114. package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
  115. package/src/sap/fe/core/formatters/ValueFormatter.ts +7 -6
  116. package/src/sap/fe/core/fpm/Component.js +3 -2
  117. package/src/sap/fe/core/helpers/AppStartupHelper.js +2 -2
  118. package/src/sap/fe/core/helpers/AppStartupHelper.ts +7 -4
  119. package/src/sap/fe/core/helpers/BindingExpression.js +314 -355
  120. package/src/sap/fe/core/helpers/BindingExpression.ts +317 -391
  121. package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
  122. package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  123. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
  124. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  125. package/src/sap/fe/core/helpers/EditState.js +81 -84
  126. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  127. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  128. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  129. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  130. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  131. package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -4
  132. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
  133. package/src/sap/fe/core/helpers/MassEditHelper.js +27 -18
  134. package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
  135. package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  136. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  137. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  138. package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
  139. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  140. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  141. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  142. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  143. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  144. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  145. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  146. package/src/sap/fe/core/library.js +4 -3
  147. package/src/sap/fe/core/library.support.js +3 -2
  148. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
  149. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +1 -1
  150. package/src/sap/fe/core/messagebundle.properties +23 -10
  151. package/src/sap/fe/core/messagebundle_ar.properties +9 -0
  152. package/src/sap/fe/core/messagebundle_bg.properties +9 -0
  153. package/src/sap/fe/core/messagebundle_ca.properties +9 -0
  154. package/src/sap/fe/core/messagebundle_cs.properties +10 -1
  155. package/src/sap/fe/core/messagebundle_cy.properties +9 -0
  156. package/src/sap/fe/core/messagebundle_da.properties +9 -0
  157. package/src/sap/fe/core/messagebundle_de.properties +9 -0
  158. package/src/sap/fe/core/messagebundle_el.properties +9 -0
  159. package/src/sap/fe/core/messagebundle_en.properties +9 -0
  160. package/src/sap/fe/core/messagebundle_en_GB.properties +9 -0
  161. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +9 -0
  162. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -0
  163. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +9 -0
  164. package/src/sap/fe/core/messagebundle_es.properties +9 -0
  165. package/src/sap/fe/core/messagebundle_es_MX.properties +9 -0
  166. package/src/sap/fe/core/messagebundle_et.properties +9 -0
  167. package/src/sap/fe/core/messagebundle_fi.properties +9 -0
  168. package/src/sap/fe/core/messagebundle_fr.properties +13 -4
  169. package/src/sap/fe/core/messagebundle_fr_CA.properties +15 -6
  170. package/src/sap/fe/core/messagebundle_hi.properties +15 -6
  171. package/src/sap/fe/core/messagebundle_hr.properties +15 -6
  172. package/src/sap/fe/core/messagebundle_hu.properties +9 -0
  173. package/src/sap/fe/core/messagebundle_id.properties +10 -1
  174. package/src/sap/fe/core/messagebundle_it.properties +9 -0
  175. package/src/sap/fe/core/messagebundle_iw.properties +9 -0
  176. package/src/sap/fe/core/messagebundle_ja.properties +9 -0
  177. package/src/sap/fe/core/messagebundle_kk.properties +15 -6
  178. package/src/sap/fe/core/messagebundle_ko.properties +9 -0
  179. package/src/sap/fe/core/messagebundle_lt.properties +9 -0
  180. package/src/sap/fe/core/messagebundle_lv.properties +15 -6
  181. package/src/sap/fe/core/messagebundle_ms.properties +14 -5
  182. package/src/sap/fe/core/messagebundle_nl.properties +9 -0
  183. package/src/sap/fe/core/messagebundle_no.properties +9 -0
  184. package/src/sap/fe/core/messagebundle_pl.properties +9 -0
  185. package/src/sap/fe/core/messagebundle_pt.properties +9 -0
  186. package/src/sap/fe/core/messagebundle_pt_PT.properties +9 -0
  187. package/src/sap/fe/core/messagebundle_ro.properties +9 -0
  188. package/src/sap/fe/core/messagebundle_ru.properties +9 -0
  189. package/src/sap/fe/core/messagebundle_sh.properties +11 -2
  190. package/src/sap/fe/core/messagebundle_sk.properties +9 -0
  191. package/src/sap/fe/core/messagebundle_sl.properties +15 -6
  192. package/src/sap/fe/core/messagebundle_sv.properties +9 -0
  193. package/src/sap/fe/core/messagebundle_th.properties +9 -0
  194. package/src/sap/fe/core/messagebundle_tr.properties +9 -0
  195. package/src/sap/fe/core/messagebundle_uk.properties +9 -0
  196. package/src/sap/fe/core/messagebundle_vi.properties +9 -0
  197. package/src/sap/fe/core/messagebundle_zh_CN.properties +9 -0
  198. package/src/sap/fe/core/messagebundle_zh_TW.properties +15 -6
  199. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  200. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  201. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
  202. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  203. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
  204. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
  205. package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
  206. package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  207. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
  208. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  209. package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -899
  210. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  211. package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
  212. package/src/sap/fe/core/services/ShellServicesFactory.ts +15 -10
  213. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +35 -81
  214. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +46 -94
  215. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -487
  216. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  217. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  218. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  219. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  220. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  221. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  222. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  223. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  224. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  225. package/src/sap/fe/core/templating/FilterHelper.js +138 -72
  226. package/src/sap/fe/core/templating/FilterHelper.ts +139 -71
  227. package/src/sap/fe/core/templating/UIFormatters.js +31 -1
  228. package/src/sap/fe/core/templating/UIFormatters.ts +33 -2
  229. package/src/sap/fe/core/type/Email.js +1 -1
  230. package/src/sap/fe/core/type/Email.ts +4 -6
  231. package/ui5.yaml +0 -3
@@ -1,6 +1,7 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(
6
7
  [
@@ -236,10 +237,10 @@ sap.ui.define(
236
237
  return sCurrentEntitySetName + "/" + sDataPropertyPath;
237
238
  }
238
239
  };
239
- var oFieldControl = FieldHelper.fieldControl(sDataPropertyPath, oInterface);
240
240
  oPropertyInfo =
241
241
  (oDataFieldConverted && oDataFieldConverted.Value && oDataFieldConverted.Value.$target) ||
242
242
  (oDataFieldConverted && oDataFieldConverted.Target && oDataFieldConverted.Target.$target);
243
+ // Datafield is not included in the FieldControl calculation, needs to be implemented
243
244
  var isReadOnlyExpression = FieldControlHelper.isReadOnlyExpression(oPropertyInfo);
244
245
  bChartProperty = oPropertyInfo && oPropertyInfo.term && oPropertyInfo.term === "com.sap.vocabularies.UI.v1.Chart";
245
246
  if (
@@ -248,6 +249,7 @@ sap.ui.define(
248
249
  !bIsImmutable &&
249
250
  !bIsComputed &&
250
251
  !bChartProperty &&
252
+ oColumnInfo.inputType &&
251
253
  UIFormatters.getEditableExpression(oPropertyInfo, oDataFieldConverted, oDataModelObjectPath) !== "false"
252
254
  ) {
253
255
  oResult = {
@@ -264,7 +266,7 @@ sap.ui.define(
264
266
  "isValueHelpEnabledForUnit": bValueHelpEnabledForUnit ? bValueHelpEnabledForUnit : false,
265
267
  "propertyPathForValueHelp": sCurrentEntitySetName + "/" + sDataPropertyPath,
266
268
  "propertyPathForValueHelpUnit": sCurrentEntitySetName + "/" + sUnitPropertyPath,
267
- "isFieldRequired": FieldHelper.getRequiredForDataField(oFieldControl, "Editable"),
269
+ "isFieldRequired": UIFormatters.getRequiredExpression(oPropertyInfo, oDataFieldConverted, true),
268
270
  "defaultSelectionPath": sDataPropertyPath
269
271
  ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sDataPropertyPath)
270
272
  : false,
@@ -287,6 +289,7 @@ sap.ui.define(
287
289
  getInputTypeForColumn: function(oColumn) {
288
290
  return (
289
291
  oColumn.getTemplate().getContent &&
292
+ oColumn.getTemplate().getContent() &&
290
293
  oColumn.getTemplate().getContent().getContentEdit &&
291
294
  oColumn
292
295
  .getTemplate()
@@ -323,19 +326,18 @@ sap.ui.define(
323
326
  });
324
327
  },
325
328
 
326
- getDefaultTextsForDialog: function(oResourceBundle, iSelectedContexts, oController) {
329
+ getDefaultTextsForDialog: function(oResourceBundle, iSelectedContexts, oTable) {
327
330
  // The confirm button text is "Save" for table in Display mode and "Apply" for table in edit mode. This can be later exposed if needed.
328
- var oView = oController.getView(),
329
- bEditableTable = oView && oView.getModel("ui") && (oView.getModel("ui").getProperty("/editMode") === "Editable");
331
+ var bDisplayMode = oTable.data("displayModePropertyBinding") === "true";
330
332
 
331
333
  return {
332
334
  "keepExistingPrefix": "< Keep",
333
335
  "leaveBlankValue": "< Leave Blank >",
334
336
  "clearFieldValue": "< Clear Values >",
335
- "massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts),
336
- "applyButtonText": bEditableTable
337
- ? oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT")
338
- : oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT"),
337
+ "massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts.toString()),
338
+ "applyButtonText": bDisplayMode
339
+ ? oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT")
340
+ : oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT"),
339
341
  "cancelButtonText": oResourceBundle.getText("C_MASS_EDIT_CANCEL_BUTTON_TEXT")
340
342
  };
341
343
  },
@@ -380,7 +382,7 @@ sap.ui.define(
380
382
  return oSelectedContext.getObject(sPropertyPath);
381
383
  });
382
384
  if (bValueExistsForPropertyPath) {
383
- if (bPropertyRequired !== true && !bUOMField) {
385
+ if (bPropertyRequired !== "true" && !bUOMField) {
384
386
  aValues.unshift({ text: oDefaultValues.clearFieldValue, key: "ClearFieldValue/" + sPropertyPath });
385
387
  }
386
388
  } else {
@@ -553,11 +555,18 @@ sap.ui.define(
553
555
  }
554
556
  if (oData.isPropertyReadOnly && typeof oData.isPropertyReadOnly === "boolean") {
555
557
  aReadOnlyFieldInfo.push({ "property": oData.dataProperty, value: oData.isPropertyReadOnly, type: "Default" });
556
- } else if (oData.isPropertyReadOnly && oData.isPropertyReadOnly.operand1 && oData.isPropertyReadOnly.operand2) {
558
+ } else if (
559
+ oData.isPropertyReadOnly &&
560
+ oData.isPropertyReadOnly.operands &&
561
+ oData.isPropertyReadOnly.operands[0] &&
562
+ oData.isPropertyReadOnly.operands[0].operand1 &&
563
+ oData.isPropertyReadOnly.operands[0].operand2
564
+ ) {
565
+ // This needs to be refactored in accordance with the ReadOnlyExpression change
557
566
  aReadOnlyFieldInfo.push({
558
567
  "property": oData.dataProperty,
559
- propertyPath: oData.isPropertyReadOnly.operand1.path,
560
- propertyValue: oData.isPropertyReadOnly.operand2.value,
568
+ propertyPath: oData.isPropertyReadOnly.operands[0].operand1.path,
569
+ propertyValue: oData.isPropertyReadOnly.operands[0].operand2.value,
561
570
  type: "Path"
562
571
  });
563
572
  }
@@ -578,8 +587,7 @@ sap.ui.define(
578
587
  var sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
579
588
  aDataArray = [],
580
589
  oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
581
- oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oController),
582
- oExtensionAPI = oController && oController.getExtensionAPI(),
590
+ oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
583
591
  oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
584
592
  oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues);
585
593
 
@@ -643,7 +651,8 @@ sap.ui.define(
643
651
  });
644
652
  return Promise.all(changePromise)
645
653
  .then(function(oRes) {
646
- var oListBinding = oTable.getRowBinding();
654
+ var oListBinding = oTable.getRowBinding(),
655
+ oExtensionAPI = oController && oController.getExtensionAPI();
647
656
  return oExtensionAPI.refresh(oListBinding.getPath()).then(function() {
648
657
  oDialog.close();
649
658
  oDialog.destroy();
@@ -1,227 +1,231 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define([], function() {
6
- "use strict";
7
-
8
- /* This class contains helpers to be used at runtime to retrieve further information on the model */
9
-
10
- var ModelHelper = {
11
- /**
12
- * Method to determine if the programming model is sticky.
13
- *
14
- * @function
15
- * @name isStickySessionSupported
16
- * @param {sap.ui.model.odata.v4.MetaModel} oMetaModel ODataModelMetaModel to check for sticky enabled entity
17
- * @returns {boolean} Returns true if sticky, else false
18
- */
19
- isStickySessionSupported: function(oMetaModel) {
20
- var oEntityContainer = oMetaModel.getObject("/");
21
- for (var sEntitySet in oEntityContainer) {
22
- if (
23
- oEntityContainer[sEntitySet].$kind === "EntitySet" &&
24
- oMetaModel.getObject("/" + sEntitySet + "@com.sap.vocabularies.Session.v1.StickySessionSupported")
25
- ) {
26
- return true;
27
- }
28
- }
29
- return false;
30
- },
31
-
32
- /**
33
- * Method to determine if the programming model is draft.
34
- *
35
- * @function
36
- * @name isDraftSupported
37
- * @param {sap.ui.model.odata.v4.MetaModel} oMetaModel ODataModelMetaModel of the context for which draft support shall be checked
38
- * @param {string} sPath Path for which draft support shall be checked
39
- * @returns {boolean} Returns true if draft, else false
40
- */
41
- isDraftSupported: function(oMetaModel, sPath) {
42
- var oMetaContext = oMetaModel.getMetaContext(sPath),
43
- sTargetEntitySet = this.getTargetEntitySet(oMetaContext),
44
- oParentEntitySetContext,
45
- aParts;
46
-
47
- if (oMetaContext.getProperty && oMetaContext.getProperty() && oMetaContext.getProperty().$ContainsTarget === true) {
48
- aParts = oMetaModel
49
- .getMetaPath(sPath)
50
- .split("/")
51
- .filter(Boolean);
52
- if (aParts.length) {
53
- for (var i = aParts.length - 1; i >= 0; i--) {
54
- oParentEntitySetContext = oMetaModel.getMetaContext(oMetaModel.getMetaPath("/" + aParts[i]));
55
- if (oParentEntitySetContext.getObject("$kind") === "EntitySet") {
56
- sTargetEntitySet = this.getTargetEntitySet(oParentEntitySetContext);
57
- break;
58
- }
59
- }
60
- }
61
- } else {
62
- sTargetEntitySet = this.getTargetEntitySet(oMetaContext);
63
- }
64
- var oEntityContext = oMetaModel.getMetaContext(sTargetEntitySet);
65
- if (
66
- oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftRoot") ||
67
- oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftNode")
68
- ) {
69
- return true;
70
- }
71
- return false;
72
- },
73
-
74
- /**
75
- * Returns path to the target entity set via using navigation property binding.
76
- *
77
- * @function
78
- * @name getTargetEntitySet
79
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the target entity set shall be determined
80
- * @returns {string} Returns path to the target entity set
81
- */
82
- getTargetEntitySet: function(oContext) {
83
- var sPath = oContext.getPath();
84
- if (
85
- oContext.getObject("$kind") === "EntitySet" ||
86
- oContext.getObject("$kind") === "Action" ||
87
- oContext.getObject("0/$kind") === "Action"
88
- ) {
89
- return sPath;
90
- }
91
- var sEntitySetPath = ModelHelper.getEntitySetPath(sPath);
92
- return "/" + oContext.getObject(sEntitySetPath);
93
- },
94
-
95
- /**
96
- * Returns complete path to the entity set via using navigation property binding.
97
- *
98
- * @function
99
- * @name getEntitySetPath
100
- * @param {string} sPath Path for which complete entitySet path needs to be determined
101
- * @returns {string} Returns complete path to the entity set
102
- */
103
- getEntitySetPath: function(sPath) {
104
- return (
105
- "/" +
106
- sPath
107
- .split("/")
108
- .filter(ModelHelper.filterOutNavPropBinding)
109
- .join("/$NavigationPropertyBinding/")
110
- );
111
- },
112
-
113
- /**
114
- * Gets the path for the items property of MultiValueField parameters.
115
- *
116
- * @function
117
- * @name getActionParameterItemsModelPath
118
- * @param {object} oParameter Action Parameter
119
- * @returns {string} Returns the complete model path for the items property of MultiValueField parameters
120
- */
121
- getActionParameterItemsModelPath: function(oParameter) {
122
- return oParameter && oParameter.$Name ? "{path: 'mvfview>/" + oParameter.$Name + "'}" : undefined;
123
- },
124
-
125
- filterOutNavPropBinding: function(sPathPart) {
126
- return sPathPart !== "" && sPathPart !== "$NavigationPropertyBinding";
127
- },
128
-
129
- /**
130
- * Adds a setProperty to the created binding contexts of the internal JSON model.
131
- *
132
- * @function
133
- * @name enhanceInternalJSONModel
134
- * @param {sap.ui.model.json.JSONModel} Internal JSON Model which is enhanced
135
- */
136
-
137
- enhanceInternalJSONModel: function(oInternalModel) {
138
- var fnBindContext = oInternalModel.bindContext;
139
- oInternalModel.bindContext = function(sPath, oContext, mParameters) {
140
- var oContext = fnBindContext.apply(this, arguments);
141
- var fnGetBoundContext = oContext.getBoundContext;
142
-
143
- oContext.getBoundContext = function() {
144
- var oBoundContext = fnGetBoundContext.apply(this, arguments);
145
- if (oBoundContext && !oBoundContext.setProperty) {
146
- oBoundContext.setProperty = function(sPath, value) {
147
- if (this.getObject() === undefined) {
148
- // initialize
149
- this.getModel().setProperty(this.getPath(), {});
150
- }
151
- this.getModel().setProperty(sPath, value, this);
152
- };
153
- }
154
- return oBoundContext;
155
- };
156
- return oContext;
157
- };
158
- },
159
-
160
- /**
161
- * Returns whether filtering on the table is case sensitive.
162
- *
163
- * @param oMetaModel The instance of the meta model
164
- * @returns {boolean|undefined} Returns 'false' if FilterFunctions annotation supports 'tolower', else 'true'
165
- */
166
- isFilteringCaseSensitive: function(oMetaModel) {
167
- if (!oMetaModel) {
168
- return undefined;
169
- }
170
- var aFilterFunctions = oMetaModel.getObject("/@Org.OData.Capabilities.V1.FilterFunctions");
171
- // Get filter functions defined at EntityContainer and check for existence of 'tolower'
172
- return aFilterFunctions ? aFilterFunctions.indexOf("tolower") === -1 : true;
173
- },
174
-
175
- /**
176
- * Get MetaPath for the context.
177
- *
178
- * @param {Context} oContext Context to be used
179
- * @returns {string | undefined} Returns meta path for the context.
180
- */
181
- getMetaPathForContext: function(oContext) {
182
- var oModel = oContext.getModel(),
183
- oMetaModel = oModel.getMetaModel(),
184
- sPath = oContext.getPath();
185
- return oMetaModel && sPath && oMetaModel.getMetaPath(sPath);
186
- },
187
-
188
- /**
189
- * Get MetaPath for the listbinding.
190
- *
191
- * @param {View} oView View of the control using listBinding
192
- * @param {ODataListBinding | string} vListBinding ODataListBinding object or the binding path for a temporary list binding
193
- * @returns {string | undefined} Returns meta path for the listbinding.
194
- */
195
- getAbsoluteMetaPathForListBinding: function(oView, vListBinding) {
196
- var oMetaModel = oView.getModel().getMetaModel();
197
- var sMetaPath;
198
-
199
- if (typeof vListBinding === "string") {
200
- if (vListBinding.startsWith("/")) {
201
- // absolute path
202
- sMetaPath = oMetaModel.getMetaPath(vListBinding);
203
- } else {
204
- // relative path
205
- var oBindingContext = oView.getBindingContext();
206
- var sRootContextPath = oBindingContext.getPath();
207
- sMetaPath = oMetaModel.getMetaPath(sRootContextPath + "/" + vListBinding);
208
- }
209
- } else {
210
- // we already get a list binding use this one
211
- var oBinding = vListBinding;
212
- var oRootBinding = oBinding.getRootBinding();
213
- if (oBinding === oRootBinding) {
214
- // absolute path
215
- sMetaPath = oMetaModel.getMetaPath(oBinding.getPath());
216
- } else {
217
- // relative path
218
- var sRootBindingPath = oRootBinding.getPath();
219
- var sRelativePath = oBinding.getPath();
220
- sMetaPath = oMetaModel.getMetaPath(sRootBindingPath + "/" + sRelativePath);
221
- }
222
- }
223
- return sMetaPath;
224
- }
225
- };
226
- return ModelHelper;
227
- });
5
+ sap.ui.define([], function () {
6
+ "use strict";
7
+
8
+ /* This class contains helpers to be used at runtime to retrieve further information on the model */
9
+ var ModelHelper = {
10
+ /**
11
+ * Method to determine if the programming model is sticky.
12
+ *
13
+ * @function
14
+ * @name isStickySessionSupported
15
+ * @param {sap.ui.model.odata.v4.ODataMetaModel} oMetaModel ODataModelMetaModel to check for sticky enabled entity
16
+ * @returns {boolean} Returns true if sticky, else false
17
+ */
18
+ isStickySessionSupported: function (oMetaModel) {
19
+ var oEntityContainer = oMetaModel.getObject("/");
20
+
21
+ for (var sEntitySet in oEntityContainer) {
22
+ if (oEntityContainer[sEntitySet].$kind === "EntitySet" && oMetaModel.getObject("/".concat(sEntitySet, "@com.sap.vocabularies.Session.v1.StickySessionSupported"))) {
23
+ return true;
24
+ }
25
+ }
26
+
27
+ return false;
28
+ },
29
+
30
+ /**
31
+ * Method to determine if the programming model is draft.
32
+ *
33
+ * @function
34
+ * @name isDraftSupported
35
+ * @param {sap.ui.model.odata.v4.MetaModel} oMetaModel ODataModelMetaModel of the context for which draft support shall be checked
36
+ * @param {string} sPath Path for which draft support shall be checked
37
+ * @returns {boolean} Returns true if draft, else false
38
+ */
39
+ isDraftSupported: function (oMetaModel, sPath) {
40
+ var oMetaContext = oMetaModel.getMetaContext(sPath);
41
+ var sTargetEntitySet = this.getTargetEntitySet(oMetaContext),
42
+ oParentEntitySetContext,
43
+ aParts;
44
+
45
+ if (oMetaContext.getProperty && oMetaContext.getProperty() && oMetaContext.getProperty().$ContainsTarget === true) {
46
+ aParts = oMetaModel.getMetaPath(sPath).split("/").filter(Boolean);
47
+
48
+ if (aParts.length) {
49
+ for (var i = aParts.length - 1; i >= 0; i--) {
50
+ oParentEntitySetContext = oMetaModel.getMetaContext(oMetaModel.getMetaPath("/" + aParts[i]));
51
+
52
+ if (oParentEntitySetContext.getObject("$kind") === "EntitySet") {
53
+ sTargetEntitySet = this.getTargetEntitySet(oParentEntitySetContext);
54
+ break;
55
+ }
56
+ }
57
+ }
58
+ } else {
59
+ sTargetEntitySet = this.getTargetEntitySet(oMetaContext);
60
+ }
61
+
62
+ var oEntityContext = oMetaModel.getMetaContext(sTargetEntitySet);
63
+
64
+ if (oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftRoot") || oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftNode")) {
65
+ return true;
66
+ }
67
+
68
+ return false;
69
+ },
70
+
71
+ /**
72
+ * Returns path to the target entity set via using navigation property binding.
73
+ *
74
+ * @function
75
+ * @name getTargetEntitySet
76
+ * @param {sap.ui.model.odata.v4.Context} oContext Context for which the target entity set shall be determined
77
+ * @returns {string} Returns path to the target entity set
78
+ */
79
+ getTargetEntitySet: function (oContext) {
80
+ var sPath = oContext.getPath();
81
+
82
+ if (oContext.getObject("$kind") === "EntitySet" || oContext.getObject("$kind") === "Action" || oContext.getObject("0/$kind") === "Action") {
83
+ return sPath;
84
+ }
85
+
86
+ var sEntitySetPath = ModelHelper.getEntitySetPath(sPath);
87
+ return "/" + oContext.getObject(sEntitySetPath);
88
+ },
89
+
90
+ /**
91
+ * Returns complete path to the entity set via using navigation property binding.
92
+ *
93
+ * @function
94
+ * @name getEntitySetPath
95
+ * @param {string} sPath Path for which complete entitySet path needs to be determined
96
+ * @returns {string} Returns complete path to the entity set
97
+ */
98
+ getEntitySetPath: function (sPath) {
99
+ return "/" + sPath.split("/").filter(ModelHelper.filterOutNavPropBinding).join("/$NavigationPropertyBinding/");
100
+ },
101
+
102
+ /**
103
+ * Gets the path for the items property of MultiValueField parameters.
104
+ *
105
+ * @function
106
+ * @name getActionParameterItemsModelPath
107
+ * @param {object} oParameter Action Parameter
108
+ * @returns {string} Returns the complete model path for the items property of MultiValueField parameters
109
+ */
110
+ getActionParameterItemsModelPath: function (oParameter) {
111
+ return oParameter && oParameter.$Name ? "{path: 'mvfview>/".concat(oParameter.$Name, "'}") : undefined;
112
+ },
113
+ filterOutNavPropBinding: function (sPathPart) {
114
+ return sPathPart !== "" && sPathPart !== "$NavigationPropertyBinding";
115
+ },
116
+
117
+ /**
118
+ * Adds a setProperty to the created binding contexts of the internal JSON model.
119
+ *
120
+ * @function
121
+ * @name enhanceInternalJSONModel
122
+ * @param {sap.ui.model.json.JSONModel} Internal JSON Model which is enhanced
123
+ */
124
+ enhanceInternalJSONModel: function (oInternalModel) {
125
+ var fnBindContext = oInternalModel.bindContext;
126
+
127
+ oInternalModel.bindContext = function (sPath, oContext, mParameters) {
128
+ for (var _len = arguments.length, args = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
129
+ args[_key - 3] = arguments[_key];
130
+ }
131
+
132
+ oContext = fnBindContext.apply(this, [sPath, oContext, mParameters].concat(args));
133
+ var fnGetBoundContext = oContext.getBoundContext;
134
+
135
+ oContext.getBoundContext = function () {
136
+ for (var _len2 = arguments.length, subArgs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
137
+ subArgs[_key2] = arguments[_key2];
138
+ }
139
+
140
+ var oBoundContext = fnGetBoundContext.apply.apply(fnGetBoundContext, [this].concat(subArgs));
141
+
142
+ if (oBoundContext && !oBoundContext.setProperty) {
143
+ oBoundContext.setProperty = function (sSetPropPath, value) {
144
+ if (this.getObject() === undefined) {
145
+ // initialize
146
+ this.getModel().setProperty(this.getPath(), {});
147
+ }
148
+
149
+ this.getModel().setProperty(sSetPropPath, value, this);
150
+ };
151
+ }
152
+
153
+ return oBoundContext;
154
+ };
155
+
156
+ return oContext;
157
+ };
158
+ },
159
+
160
+ /**
161
+ * Returns whether filtering on the table is case sensitive.
162
+ *
163
+ * @param oMetaModel The instance of the meta model
164
+ * @returns {boolean|undefined} Returns 'false' if FilterFunctions annotation supports 'tolower', else 'true'
165
+ */
166
+ isFilteringCaseSensitive: function (oMetaModel) {
167
+ if (!oMetaModel) {
168
+ return undefined;
169
+ }
170
+
171
+ var aFilterFunctions = oMetaModel.getObject("/@Org.OData.Capabilities.V1.FilterFunctions"); // Get filter functions defined at EntityContainer and check for existence of 'tolower'
172
+
173
+ return aFilterFunctions ? aFilterFunctions.indexOf("tolower") === -1 : true;
174
+ },
175
+
176
+ /**
177
+ * Get MetaPath for the context.
178
+ *
179
+ * @param {Context} oContext Context to be used
180
+ * @returns {string | undefined} Returns meta path for the context.
181
+ */
182
+ getMetaPathForContext: function (oContext) {
183
+ var oModel = oContext.getModel(),
184
+ oMetaModel = oModel.getMetaModel(),
185
+ sPath = oContext.getPath();
186
+ return oMetaModel && sPath && oMetaModel.getMetaPath(sPath);
187
+ },
188
+
189
+ /**
190
+ * Get MetaPath for the listbinding.
191
+ *
192
+ * @param {View} oView View of the control using listBinding
193
+ * @param {ODataListBinding | string} vListBinding ODataListBinding object or the binding path for a temporary list binding
194
+ * @returns {string | undefined} Returns meta path for the listbinding.
195
+ */
196
+ getAbsoluteMetaPathForListBinding: function (oView, vListBinding) {
197
+ var oMetaModel = oView.getModel().getMetaModel();
198
+ var sMetaPath;
199
+
200
+ if (typeof vListBinding === "string") {
201
+ if (vListBinding.startsWith("/")) {
202
+ // absolute path
203
+ sMetaPath = oMetaModel.getMetaPath(vListBinding);
204
+ } else {
205
+ // relative path
206
+ var oBindingContext = oView.getBindingContext();
207
+ var sRootContextPath = oBindingContext.getPath();
208
+ sMetaPath = oMetaModel.getMetaPath("".concat(sRootContextPath, "/").concat(vListBinding));
209
+ }
210
+ } else {
211
+ // we already get a list binding use this one
212
+ var oBinding = vListBinding;
213
+ var oRootBinding = oBinding.getRootBinding();
214
+
215
+ if (oBinding === oRootBinding) {
216
+ // absolute path
217
+ sMetaPath = oMetaModel.getMetaPath(oBinding.getPath());
218
+ } else {
219
+ // relative path
220
+ var sRootBindingPath = oRootBinding.getPath();
221
+ var sRelativePath = oBinding.getPath();
222
+ sMetaPath = oMetaModel.getMetaPath("".concat(sRootBindingPath, "/").concat(sRelativePath));
223
+ }
224
+ }
225
+
226
+ return sMetaPath;
227
+ }
228
+ };
229
+ return ModelHelper;
230
+ }, false);
231
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1vZGVsSGVscGVyLnRzIl0sIm5hbWVzIjpbIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwib01ldGFNb2RlbCIsIm9FbnRpdHlDb250YWluZXIiLCJnZXRPYmplY3QiLCJzRW50aXR5U2V0IiwiJGtpbmQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwic1BhdGgiLCJvTWV0YUNvbnRleHQiLCJnZXRNZXRhQ29udGV4dCIsInNUYXJnZXRFbnRpdHlTZXQiLCJnZXRUYXJnZXRFbnRpdHlTZXQiLCJvUGFyZW50RW50aXR5U2V0Q29udGV4dCIsImFQYXJ0cyIsImdldFByb3BlcnR5IiwiJENvbnRhaW5zVGFyZ2V0IiwiZ2V0TWV0YVBhdGgiLCJzcGxpdCIsImZpbHRlciIsIkJvb2xlYW4iLCJsZW5ndGgiLCJpIiwib0VudGl0eUNvbnRleHQiLCJvQ29udGV4dCIsImdldFBhdGgiLCJzRW50aXR5U2V0UGF0aCIsImdldEVudGl0eVNldFBhdGgiLCJmaWx0ZXJPdXROYXZQcm9wQmluZGluZyIsImpvaW4iLCJnZXRBY3Rpb25QYXJhbWV0ZXJJdGVtc01vZGVsUGF0aCIsIm9QYXJhbWV0ZXIiLCIkTmFtZSIsInVuZGVmaW5lZCIsInNQYXRoUGFydCIsImVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbCIsIm9JbnRlcm5hbE1vZGVsIiwiZm5CaW5kQ29udGV4dCIsImJpbmRDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJhcmdzIiwiYXBwbHkiLCJmbkdldEJvdW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsInN1YkFyZ3MiLCJvQm91bmRDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJzU2V0UHJvcFBhdGgiLCJ2YWx1ZSIsImdldE1vZGVsIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiYUZpbHRlckZ1bmN0aW9ucyIsImluZGV4T2YiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJvTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJvVmlldyIsInZMaXN0QmluZGluZyIsInNNZXRhUGF0aCIsInN0YXJ0c1dpdGgiLCJvQmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNSb290Q29udGV4dFBhdGgiLCJvQmluZGluZyIsIm9Sb290QmluZGluZyIsImdldFJvb3RCaW5kaW5nIiwic1Jvb3RCaW5kaW5nUGF0aCIsInNSZWxhdGl2ZVBhdGgiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFGQTtBQUtBLE1BQU1BLFdBQVcsR0FBRztBQUNuQjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLHdCQUF3QixFQUFFLFVBQVNDLFVBQVQsRUFBcUM7QUFDOUQsVUFBTUMsZ0JBQWdCLEdBQUdELFVBQVUsQ0FBQ0UsU0FBWCxDQUFxQixHQUFyQixDQUF6Qjs7QUFDQSxXQUFLLElBQU1DLFVBQVgsSUFBeUJGLGdCQUF6QixFQUEyQztBQUMxQyxZQUNDQSxnQkFBZ0IsQ0FBQ0UsVUFBRCxDQUFoQixDQUE2QkMsS0FBN0IsS0FBdUMsV0FBdkMsSUFDQUosVUFBVSxDQUFDRSxTQUFYLFlBQXlCQyxVQUF6Qiw2REFGRCxFQUdFO0FBQ0QsaUJBQU8sSUFBUDtBQUNBO0FBQ0Q7O0FBQ0QsYUFBTyxLQUFQO0FBQ0EsS0FwQmtCOztBQXNCbkI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NFLElBQUFBLGdCQUFnQixFQUFFLFVBQVNMLFVBQVQsRUFBMEJNLEtBQTFCLEVBQXlDO0FBQzFELFVBQU1DLFlBQVksR0FBR1AsVUFBVSxDQUFDUSxjQUFYLENBQTBCRixLQUExQixDQUFyQjtBQUNBLFVBQUlHLGdCQUFnQixHQUFHLEtBQUtDLGtCQUFMLENBQXdCSCxZQUF4QixDQUF2QjtBQUFBLFVBQ0NJLHVCQUREO0FBQUEsVUFFQ0MsTUFGRDs7QUFJQSxVQUFJTCxZQUFZLENBQUNNLFdBQWIsSUFBNEJOLFlBQVksQ0FBQ00sV0FB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eUMsWUFBdkIsQ0FBWjtBQUNBLFNBSEQsTUFHTztBQUNOO0FBQ0EsY0FBTUcsZUFBZSxHQUFHSixLQUFLLENBQUNLLGlCQUFOLEVBQXhCO0FBQ0EsY0FBTUMsZ0JBQWdCLEdBQUdGLGVBQWUsQ0FBQ3BDLE9BQWhCLEVBQXpCO0FBQ0FrQyxVQUFBQSxTQUFTLEdBQUd6RCxVQUFVLENBQUNlLFdBQVgsV0FBMEI4QyxnQkFBMUIsY0FBOENMLFlBQTlDLEVBQVo7QUFDQTtBQUNELE9BVkQsTUFVTztBQUNOO0FBQ0EsWUFBTU0sUUFBUSxHQUFHTixZQUFqQjtBQUNBLFlBQU1PLFlBQVksR0FBR0QsUUFBUSxDQUFDRSxjQUFULEVBQXJCOztBQUNBLFlBQUlGLFFBQVEsS0FBS0MsWUFBakIsRUFBK0I7QUFDOUI7QUFDQU4sVUFBQUEsU0FBUyxHQUFHekQsVUFBVSxDQUFDZSxXQUFYLENBQXVCK0MsUUFBUSxDQUFDdkMsT0FBVCxFQUF2QixDQUFaO0FBQ0EsU0FIRCxNQUdPO0FBQ047QUFDQSxjQUFNMEMsZ0JBQWdCLEdBQUdGLFlBQVksQ0FBQ3hDLE9BQWIsRUFBekI7QUFDQSxjQUFNMkMsYUFBYSxHQUFHSixRQUFRLENBQUN2QyxPQUFULEVBQXRCO0FBQ0FrQyxVQUFBQSxTQUFTLEdBQUd6RCxVQUFVLENBQUNlLFdBQVgsV0FBMEJrRCxnQkFBMUIsY0FBOENDLGFBQTlDLEVBQVo7QUFDQTtBQUNEOztBQUNELGFBQU9ULFNBQVA7QUFDQTtBQXROa0IsR0FBcEI7U0E2TmUzRCxXIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBhdCBydW50aW1lIHRvIHJldHJpZXZlIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gdGhlIG1vZGVsICovXG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBCYXNlQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5cbmNvbnN0IE1vZGVsSGVscGVyID0ge1xuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgc3RpY2t5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsfSBvTWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgdG8gY2hlY2sgZm9yIHN0aWNreSBlbmFibGVkIGVudGl0eVxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHN0aWNreSwgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkOiBmdW5jdGlvbihvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCkge1xuXHRcdGNvbnN0IG9FbnRpdHlDb250YWluZXIgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdFx0Zm9yIChjb25zdCBzRW50aXR5U2V0IGluIG9FbnRpdHlDb250YWluZXIpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0b0VudGl0eUNvbnRhaW5lcltzRW50aXR5U2V0XS4ka2luZCA9PT0gXCJFbnRpdHlTZXRcIiAmJlxuXHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7c0VudGl0eVNldH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkYClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBpcyBkcmFmdC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGlzRHJhZnRTdXBwb3J0ZWRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuTWV0YU1vZGVsfSBvTWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgb2YgdGhlIGNvbnRleHQgZm9yIHdoaWNoIGRyYWZ0IHN1cHBvcnQgc2hhbGwgYmUgY2hlY2tlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1BhdGggUGF0aCBmb3Igd2hpY2ggZHJhZnQgc3VwcG9ydCBzaGFsbCBiZSBjaGVja2VkXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgZHJhZnQsIGVsc2UgZmFsc2Vcblx0ICovXG5cdGlzRHJhZnRTdXBwb3J0ZWQ6IGZ1bmN0aW9uKG9NZXRhTW9kZWw6IGFueSwgc1BhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IG9NZXRhQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoc1BhdGgpO1xuXHRcdGxldCBzVGFyZ2V0RW50aXR5U2V0ID0gdGhpcy5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFDb250ZXh0KSxcblx0XHRcdG9QYXJlbnRFbnRpdHlTZXRDb250ZXh0LFxuXHRcdFx0YVBhcnRzO1xuXG5cdFx0aWYgKG9NZXRhQ29udGV4dC5nZXRQcm9wZXJ0eSAmJiBvTWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoKSAmJiBvTWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoKS4kQ29udGFpbnNUYXJnZXQgPT09IHRydWUpIHtcblx0XHRcdGFQYXJ0cyA9IG9NZXRhTW9kZWxcblx0XHRcdFx0LmdldE1ldGFQYXRoKHNQYXRoKVxuXHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdC5maWx0ZXIoQm9vbGVhbik7XG5cdFx0XHRpZiAoYVBhcnRzLmxlbmd0aCkge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gYVBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdFx0XHRcdFx0b1BhcmVudEVudGl0eVNldENvbnRleHQgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoXCIvXCIgKyBhUGFydHNbaV0pKTtcblx0XHRcdFx0XHRpZiAob1BhcmVudEVudGl0eVNldENvbnRleHQuZ2V0T2JqZWN0KFwiJGtpbmRcIikgPT09IFwiRW50aXR5U2V0XCIpIHtcblx0XHRcdFx0XHRcdHNUYXJnZXRFbnRpdHlTZXQgPSB0aGlzLmdldFRhcmdldEVudGl0eVNldChvUGFyZW50RW50aXR5U2V0Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c1RhcmdldEVudGl0eVNldCA9IHRoaXMuZ2V0VGFyZ2V0RW50aXR5U2V0KG9NZXRhQ29udGV4dCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9FbnRpdHlDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChzVGFyZ2V0RW50aXR5U2V0KTtcblx0XHRpZiAoXG5cdFx0XHRvRW50aXR5Q29udGV4dC5nZXRPYmplY3QoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKSB8fFxuXHRcdFx0b0VudGl0eUNvbnRleHQuZ2V0T2JqZWN0KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVcIilcblx0XHQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgcGF0aCB0byB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgdmlhIHVzaW5nIG5hdmlnYXRpb24gcHJvcGVydHkgYmluZGluZy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldFRhcmdldEVudGl0eVNldFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgc2hhbGwgYmUgZGV0ZXJtaW5lZFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHBhdGggdG8gdGhlIHRhcmdldCBlbnRpdHkgc2V0XG5cdCAqL1xuXHRnZXRUYXJnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0aWYgKFxuXHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KFwiJGtpbmRcIikgPT09IFwiRW50aXR5U2V0XCIgfHxcblx0XHRcdG9Db250ZXh0LmdldE9iamVjdChcIiRraW5kXCIpID09PSBcIkFjdGlvblwiIHx8XG5cdFx0XHRvQ29udGV4dC5nZXRPYmplY3QoXCIwLyRraW5kXCIpID09PSBcIkFjdGlvblwiXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gc1BhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RW50aXR5U2V0UGF0aChzUGF0aCk7XG5cdFx0cmV0dXJuIFwiL1wiICsgb0NvbnRleHQuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoKTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBjb21wbGV0ZSBwYXRoIHRvIHRoZSBlbnRpdHkgc2V0IHZpYSB1c2luZyBuYXZpZ2F0aW9uIHByb3BlcnR5IGJpbmRpbmcuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRFbnRpdHlTZXRQYXRoXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUGF0aCBQYXRoIGZvciB3aGljaCBjb21wbGV0ZSBlbnRpdHlTZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgY29tcGxldGUgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuXHQgKi9cblx0Z2V0RW50aXR5U2V0UGF0aDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiAoXG5cdFx0XHRcIi9cIiArXG5cdFx0XHRzUGF0aFxuXHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdC5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpXG5cdFx0XHRcdC5qb2luKFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBhdGggZm9yIHRoZSBpdGVtcyBwcm9wZXJ0eSBvZiBNdWx0aVZhbHVlRmllbGQgcGFyYW1ldGVycy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldEFjdGlvblBhcmFtZXRlckl0ZW1zTW9kZWxQYXRoXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUGFyYW1ldGVyIEFjdGlvbiBQYXJhbWV0ZXJcblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29tcGxldGUgbW9kZWwgcGF0aCBmb3IgdGhlIGl0ZW1zIHByb3BlcnR5IG9mIE11bHRpVmFsdWVGaWVsZCBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRnZXRBY3Rpb25QYXJhbWV0ZXJJdGVtc01vZGVsUGF0aDogZnVuY3Rpb24ob1BhcmFtZXRlcjogYW55KSB7XG5cdFx0cmV0dXJuIG9QYXJhbWV0ZXIgJiYgb1BhcmFtZXRlci4kTmFtZSA/IGB7cGF0aDogJ212ZnZpZXc+LyR7b1BhcmFtZXRlci4kTmFtZX0nfWAgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0ZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmc6IGZ1bmN0aW9uKHNQYXRoUGFydDogYW55KSB7XG5cdFx0cmV0dXJuIHNQYXRoUGFydCAhPT0gXCJcIiAmJiBzUGF0aFBhcnQgIT09IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSxcblxuXHQvKipcblx0ICogQWRkcyBhIHNldFByb3BlcnR5IHRvIHRoZSBjcmVhdGVkIGJpbmRpbmcgY29udGV4dHMgb2YgdGhlIGludGVybmFsIEpTT04gbW9kZWwuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBlbmhhbmNlSW50ZXJuYWxKU09OTW9kZWxcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwuanNvbi5KU09OTW9kZWx9IEludGVybmFsIEpTT04gTW9kZWwgd2hpY2ggaXMgZW5oYW5jZWRcblx0ICovXG5cblx0ZW5oYW5jZUludGVybmFsSlNPTk1vZGVsOiBmdW5jdGlvbihvSW50ZXJuYWxNb2RlbDogYW55KSB7XG5cdFx0Y29uc3QgZm5CaW5kQ29udGV4dCA9IG9JbnRlcm5hbE1vZGVsLmJpbmRDb250ZXh0O1xuXHRcdG9JbnRlcm5hbE1vZGVsLmJpbmRDb250ZXh0ID0gZnVuY3Rpb24oc1BhdGg6IGFueSwgb0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSwgLi4uYXJnczogYW55W10pIHtcblx0XHRcdG9Db250ZXh0ID0gZm5CaW5kQ29udGV4dC5hcHBseSh0aGlzLCBbc1BhdGgsIG9Db250ZXh0LCBtUGFyYW1ldGVycywgLi4uYXJnc10pO1xuXHRcdFx0Y29uc3QgZm5HZXRCb3VuZENvbnRleHQgPSBvQ29udGV4dC5nZXRCb3VuZENvbnRleHQ7XG5cblx0XHRcdG9Db250ZXh0LmdldEJvdW5kQ29udGV4dCA9IGZ1bmN0aW9uKC4uLnN1YkFyZ3M6IGFueVtdKSB7XG5cdFx0XHRcdGNvbnN0IG9Cb3VuZENvbnRleHQgPSBmbkdldEJvdW5kQ29udGV4dC5hcHBseSh0aGlzLCAuLi5zdWJBcmdzKTtcblx0XHRcdFx0aWYgKG9Cb3VuZENvbnRleHQgJiYgIW9Cb3VuZENvbnRleHQuc2V0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRvQm91bmRDb250ZXh0LnNldFByb3BlcnR5ID0gZnVuY3Rpb24oc1NldFByb3BQYXRoOiBhbnksIHZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmdldE9iamVjdCgpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldE1vZGVsKCkuc2V0UHJvcGVydHkodGhpcy5nZXRQYXRoKCksIHt9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShzU2V0UHJvcFBhdGgsIHZhbHVlLCB0aGlzKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvQm91bmRDb250ZXh0O1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgZmlsdGVyaW5nIG9uIHRoZSB0YWJsZSBpcyBjYXNlIHNlbnNpdGl2ZS5cblx0ICpcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtib29sZWFufHVuZGVmaW5lZH0gUmV0dXJucyAnZmFsc2UnIGlmIEZpbHRlckZ1bmN0aW9ucyBhbm5vdGF0aW9uIHN1cHBvcnRzICd0b2xvd2VyJywgZWxzZSAndHJ1ZSdcblx0ICovXG5cdGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZTogZnVuY3Rpb24ob01ldGFNb2RlbDogYW55KSB7XG5cdFx0aWYgKCFvTWV0YU1vZGVsKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBhRmlsdGVyRnVuY3Rpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyRnVuY3Rpb25zXCIpO1xuXHRcdC8vIEdldCBmaWx0ZXIgZnVuY3Rpb25zIGRlZmluZWQgYXQgRW50aXR5Q29udGFpbmVyIGFuZCBjaGVjayBmb3IgZXhpc3RlbmNlIG9mICd0b2xvd2VyJ1xuXHRcdHJldHVybiBhRmlsdGVyRnVuY3Rpb25zID8gYUZpbHRlckZ1bmN0aW9ucy5pbmRleE9mKFwidG9sb3dlclwiKSA9PT0gLTEgOiB0cnVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgTWV0YVBhdGggZm9yIHRoZSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0NvbnRleHR9IG9Db250ZXh0IENvbnRleHQgdG8gYmUgdXNlZFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBSZXR1cm5zIG1ldGEgcGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqL1xuXHRnZXRNZXRhUGF0aEZvckNvbnRleHQ6IGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdHJldHVybiBvTWV0YU1vZGVsICYmIHNQYXRoICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgTWV0YVBhdGggZm9yIHRoZSBsaXN0YmluZGluZy5cblx0ICpcblx0ICogQHBhcmFtIHtWaWV3fSBvVmlldyBWaWV3IG9mIHRoZSBjb250cm9sIHVzaW5nIGxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSB7T0RhdGFMaXN0QmluZGluZyB8IHN0cmluZ30gdkxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgb2JqZWN0IG9yIHRoZSBiaW5kaW5nIHBhdGggZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBSZXR1cm5zIG1ldGEgcGF0aCBmb3IgdGhlIGxpc3RiaW5kaW5nLlxuXHQgKi9cblx0Z2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nOiBmdW5jdGlvbihvVmlldzogYW55LCB2TGlzdEJpbmRpbmc6IGFueSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cblx0XHRpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKHZMaXN0QmluZGluZy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkxpc3RCaW5kaW5nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHJlbGF0aXZlIHBhdGhcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7c1Jvb3RDb250ZXh0UGF0aH0vJHt2TGlzdEJpbmRpbmd9YCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBvUm9vdEJpbmRpbmcgPSBvQmluZGluZy5nZXRSb290QmluZGluZygpO1xuXHRcdFx0aWYgKG9CaW5kaW5nID09PSBvUm9vdEJpbmRpbmcpIHtcblx0XHRcdFx0Ly8gYWJzb2x1dGUgcGF0aFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9CaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRcdGNvbnN0IHNSb290QmluZGluZ1BhdGggPSBvUm9vdEJpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGAke3NSb290QmluZGluZ1BhdGh9LyR7c1JlbGF0aXZlUGF0aH1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNNZXRhUGF0aDtcblx0fVxufTtcblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxNb2RlbENvbnRleHQgPSBCYXNlQ29udGV4dCAmIHtcblx0c2V0UHJvcGVydHkoc1BhdGg6IHN0cmluZywgdlZhbHVlOiBhbnkpOiB2b2lkO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTW9kZWxIZWxwZXI7XG4iXX0=