@sapui5/sap.fe.core 1.101.1 → 1.102.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 (217) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +5 -5
  4. package/src/sap/fe/core/AppComponent.ts +19 -18
  5. package/src/sap/fe/core/AppStateHandler.js +4 -4
  6. package/src/sap/fe/core/AppStateHandler.ts +9 -9
  7. package/src/sap/fe/core/CommonUtils.js +59 -93
  8. package/src/sap/fe/core/CommonUtils.ts +80 -99
  9. package/src/sap/fe/core/ExtensionAPI.js +2 -4
  10. package/src/sap/fe/core/ExtensionAPI.ts +1 -3
  11. package/src/sap/fe/core/PageController.js +14 -9
  12. package/src/sap/fe/core/PageController.ts +8 -2
  13. package/src/sap/fe/core/TemplateComponent.js +6 -6
  14. package/src/sap/fe/core/TemplateComponent.ts +5 -5
  15. package/src/sap/fe/core/TemplateModel.js +2 -2
  16. package/src/sap/fe/core/TemplateModel.ts +2 -2
  17. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +303 -75
  18. package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +273 -64
  19. package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
  20. package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
  21. package/src/sap/fe/core/controllerextensions/EditFlow.js +234 -123
  22. package/src/sap/fe/core/controllerextensions/EditFlow.ts +176 -114
  23. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +34 -10
  24. package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +44 -12
  25. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +30 -28
  26. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +38 -31
  27. package/src/sap/fe/core/controllerextensions/InternalRouting.js +157 -102
  28. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +155 -103
  29. package/src/sap/fe/core/controllerextensions/MassEdit.js +4 -3
  30. package/src/sap/fe/core/controllerextensions/MassEdit.ts +15 -14
  31. package/src/sap/fe/core/controllerextensions/MessageHandler.js +3 -3
  32. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +10 -2
  33. package/src/sap/fe/core/controllerextensions/Paginator.js +12 -3
  34. package/src/sap/fe/core/controllerextensions/Paginator.ts +11 -2
  35. package/src/sap/fe/core/controllerextensions/Share.js +19 -1
  36. package/src/sap/fe/core/controllerextensions/Share.ts +18 -0
  37. package/src/sap/fe/core/controllerextensions/SideEffects.js +2 -2
  38. package/src/sap/fe/core/controllerextensions/SideEffects.ts +2 -2
  39. package/src/sap/fe/core/controllerextensions/ViewState.js +11 -1
  40. package/src/sap/fe/core/controllerextensions/ViewState.ts +10 -0
  41. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
  42. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +98 -0
  43. package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
  44. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +57 -106
  45. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +146 -0
  46. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +6 -6
  47. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.js +4 -4
  48. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +3 -3
  49. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ManageDialog.fragment.xml +0 -0
  50. package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
  51. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1587 -0
  52. package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +26 -13
  53. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +785 -0
  54. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +179 -22
  55. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1175 -0
  56. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +203 -98
  57. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +190 -0
  58. package/src/sap/fe/core/{actions → controllerextensions/editFlow}/sticky.ts +76 -12
  59. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +597 -0
  60. package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +46 -27
  61. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +940 -0
  62. package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +20 -18
  63. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
  64. package/src/sap/fe/core/controls/CommandExecution.js +14 -3
  65. package/src/sap/fe/core/controls/CommandExecution.ts +11 -2
  66. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +34 -29
  67. package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +33 -29
  68. package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -1
  69. package/src/sap/fe/core/controls/CustomQuickViewPage.ts +1 -0
  70. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +11 -3
  71. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +17 -7
  72. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +9 -3
  73. package/src/sap/fe/core/controls/FileWrapper.js +49 -2
  74. package/src/sap/fe/core/controls/FileWrapper.ts +34 -1
  75. package/src/sap/fe/core/controls/FormElementWrapper.js +12 -2
  76. package/src/sap/fe/core/controls/FormElementWrapper.ts +12 -1
  77. package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
  78. package/src/sap/fe/core/controls/MassEditSelect.ts +45 -0
  79. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -2
  80. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +23 -28
  81. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +28 -63
  82. package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
  83. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +550 -36
  84. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +604 -36
  85. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  86. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -1
  87. package/src/sap/fe/core/converters/MetaModelConverter.js +11 -40
  88. package/src/sap/fe/core/converters/MetaModelConverter.ts +56 -84
  89. package/src/sap/fe/core/converters/annotations/DataField.js +20 -4
  90. package/src/sap/fe/core/converters/annotations/DataField.ts +24 -2
  91. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -12
  92. package/src/sap/fe/core/converters/controls/Common/Action.ts +3 -9
  93. package/src/sap/fe/core/converters/controls/Common/Chart.js +10 -3
  94. package/src/sap/fe/core/converters/controls/Common/Chart.ts +8 -3
  95. package/src/sap/fe/core/converters/controls/Common/Form.js +12 -14
  96. package/src/sap/fe/core/converters/controls/Common/Form.ts +17 -19
  97. package/src/sap/fe/core/converters/controls/Common/Table.js +149 -66
  98. package/src/sap/fe/core/converters/controls/Common/Table.ts +136 -52
  99. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +22 -12
  100. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +23 -12
  101. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -5
  102. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +15 -10
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +26 -24
  104. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +35 -33
  105. package/src/sap/fe/core/converters/helpers/Aggregation.js +10 -2
  106. package/src/sap/fe/core/converters/helpers/Aggregation.ts +18 -13
  107. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  108. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +6 -5
  109. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +25 -25
  110. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +35 -38
  111. package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -3
  112. package/src/sap/fe/core/designtime/AppComponent.designtime.ts +8 -6
  113. package/src/sap/fe/core/formatters/TableFormatter.js +73 -12
  114. package/src/sap/fe/core/formatters/TableFormatter.ts +70 -15
  115. package/src/sap/fe/core/fpm/Component.js +2 -2
  116. package/src/sap/fe/core/fpm/Component.ts +1 -1
  117. package/src/sap/fe/core/helpers/BindingExpression.js +10 -7
  118. package/src/sap/fe/core/helpers/BindingExpression.ts +37 -35
  119. package/src/sap/fe/core/helpers/ClassSupport.js +1 -1
  120. package/src/sap/fe/core/helpers/ClassSupport.ts +1 -0
  121. package/src/sap/fe/core/helpers/FPMHelper.js +3 -2
  122. package/src/sap/fe/core/helpers/FPMHelper.ts +9 -8
  123. package/src/sap/fe/core/helpers/MassEditHelper.js +399 -152
  124. package/src/sap/fe/core/helpers/MassEditHelper.ts +385 -163
  125. package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
  126. package/src/sap/fe/core/helpers/ModelHelper.ts +20 -30
  127. package/src/sap/fe/core/helpers/StableIdHelper.js +5 -1
  128. package/src/sap/fe/core/helpers/StableIdHelper.ts +8 -4
  129. package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
  130. package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
  131. package/src/sap/fe/core/library.js +12 -3
  132. package/src/sap/fe/core/library.ts +9 -0
  133. package/src/sap/fe/core/messagebundle.properties +125 -180
  134. package/src/sap/fe/core/messagebundle_ar.properties +30 -63
  135. package/src/sap/fe/core/messagebundle_bg.properties +30 -63
  136. package/src/sap/fe/core/messagebundle_ca.properties +30 -63
  137. package/src/sap/fe/core/messagebundle_cs.properties +30 -63
  138. package/src/sap/fe/core/messagebundle_cy.properties +30 -63
  139. package/src/sap/fe/core/messagebundle_da.properties +31 -64
  140. package/src/sap/fe/core/messagebundle_de.properties +30 -63
  141. package/src/sap/fe/core/messagebundle_el.properties +31 -64
  142. package/src/sap/fe/core/messagebundle_en.properties +31 -64
  143. package/src/sap/fe/core/messagebundle_en_GB.properties +31 -64
  144. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +40 -73
  145. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +31 -64
  146. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +49 -82
  147. package/src/sap/fe/core/messagebundle_es.properties +30 -63
  148. package/src/sap/fe/core/messagebundle_es_MX.properties +30 -63
  149. package/src/sap/fe/core/messagebundle_et.properties +30 -63
  150. package/src/sap/fe/core/messagebundle_fi.properties +30 -63
  151. package/src/sap/fe/core/messagebundle_fr.properties +33 -66
  152. package/src/sap/fe/core/messagebundle_fr_CA.properties +30 -63
  153. package/src/sap/fe/core/messagebundle_hi.properties +30 -63
  154. package/src/sap/fe/core/messagebundle_hr.properties +30 -63
  155. package/src/sap/fe/core/messagebundle_hu.properties +29 -62
  156. package/src/sap/fe/core/messagebundle_id.properties +31 -64
  157. package/src/sap/fe/core/messagebundle_it.properties +30 -63
  158. package/src/sap/fe/core/messagebundle_iw.properties +30 -63
  159. package/src/sap/fe/core/messagebundle_ja.properties +30 -63
  160. package/src/sap/fe/core/messagebundle_kk.properties +30 -63
  161. package/src/sap/fe/core/messagebundle_ko.properties +30 -63
  162. package/src/sap/fe/core/messagebundle_lt.properties +30 -63
  163. package/src/sap/fe/core/messagebundle_lv.properties +30 -63
  164. package/src/sap/fe/core/messagebundle_ms.properties +31 -64
  165. package/src/sap/fe/core/messagebundle_nl.properties +31 -64
  166. package/src/sap/fe/core/messagebundle_no.properties +30 -63
  167. package/src/sap/fe/core/messagebundle_pl.properties +31 -64
  168. package/src/sap/fe/core/messagebundle_pt.properties +31 -64
  169. package/src/sap/fe/core/messagebundle_pt_PT.properties +30 -63
  170. package/src/sap/fe/core/messagebundle_ro.properties +30 -63
  171. package/src/sap/fe/core/messagebundle_ru.properties +30 -63
  172. package/src/sap/fe/core/messagebundle_sh.properties +30 -63
  173. package/src/sap/fe/core/messagebundle_sk.properties +30 -63
  174. package/src/sap/fe/core/messagebundle_sl.properties +32 -65
  175. package/src/sap/fe/core/messagebundle_sv.properties +30 -63
  176. package/src/sap/fe/core/messagebundle_th.properties +30 -63
  177. package/src/sap/fe/core/messagebundle_tr.properties +30 -63
  178. package/src/sap/fe/core/messagebundle_uk.properties +31 -64
  179. package/src/sap/fe/core/messagebundle_vi.properties +31 -64
  180. package/src/sap/fe/core/messagebundle_zh_CN.properties +30 -63
  181. package/src/sap/fe/core/messagebundle_zh_TW.properties +31 -64
  182. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +6 -3
  183. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -9
  184. package/src/sap/fe/core/services/NavigationServiceFactory.js +2 -2
  185. package/src/sap/fe/core/services/NavigationServiceFactory.ts +8 -4
  186. package/src/sap/fe/core/services/RoutingServiceFactory.js +9 -6
  187. package/src/sap/fe/core/services/RoutingServiceFactory.ts +10 -9
  188. package/src/sap/fe/core/services/ShellServicesFactory.js +36 -1
  189. package/src/sap/fe/core/services/ShellServicesFactory.ts +38 -1
  190. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +5 -4
  191. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +34 -36
  192. package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
  193. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +1 -1
  194. package/src/sap/fe/core/templating/EntitySetHelper.js +1 -9
  195. package/src/sap/fe/core/templating/EntitySetHelper.ts +11 -13
  196. package/src/sap/fe/core/templating/FilterHelper.js +4 -4
  197. package/src/sap/fe/core/templating/FilterHelper.ts +6 -5
  198. package/src/sap/fe/core/templating/PropertyHelper.js +58 -35
  199. package/src/sap/fe/core/templating/PropertyHelper.ts +19 -4
  200. package/src/sap/fe/core/templating/UIFormatters.js +16 -5
  201. package/src/sap/fe/core/templating/UIFormatters.ts +14 -5
  202. package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
  203. package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
  204. package/src/sap/fe/core/AnnotationHelper.js +0 -331
  205. package/src/sap/fe/core/AnnotationHelper.ts +0 -321
  206. package/src/sap/fe/core/RouterProxy.js +0 -938
  207. package/src/sap/fe/core/TransactionHelper.js +0 -1577
  208. package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -406
  209. package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +0 -146
  210. package/src/sap/fe/core/actions/draft.js +0 -665
  211. package/src/sap/fe/core/actions/messageHandling.js +0 -579
  212. package/src/sap/fe/core/actions/nonDraft.js +0 -20
  213. package/src/sap/fe/core/actions/nonDraft.ts +0 -12
  214. package/src/sap/fe/core/actions/operations.js +0 -1096
  215. package/src/sap/fe/core/actions/sticky.js +0 -130
  216. package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
  217. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
@@ -1,665 +0,0 @@
1
- /*!
2
- * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
- */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/actions/collaboration/ActivitySync", "sap/fe/core/actions/messageHandling", "sap/fe/core/CommonUtils", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/Text", "sap/ui/core/Core"], function (Log, ActivitySync, messageHandling, CommonUtils, FELibrary, Button, Dialog, MessageBox, Text, Core) {
6
- "use strict";
7
-
8
- function _catch(body, recover) {
9
- try {
10
- var result = body();
11
- } catch (e) {
12
- return recover(e);
13
- }
14
-
15
- if (result && result.then) {
16
- return result.then(void 0, recover);
17
- }
18
-
19
- return result;
20
- }
21
-
22
- /**
23
- * Creates a draft document from an existing document.
24
- *
25
- * The function supports several hooks as there is a certain coreography defined.
26
- *
27
- * @function
28
- * @name sap.fe.core.actions.draft#createDraftFromActiveDocument
29
- * @memberof sap.fe.core.actions.draft
30
- * @static
31
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
32
- * @param {AppComponent} oAppComponent The AppComponent
33
- * @param {object} mParameters The parameters
34
- * @param {boolean} [mParameters.oView] The view
35
- * @param {boolean} [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
36
- * @param {sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument} [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
37
- * @param {sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument} [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
38
- * @param {sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired} [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
39
- * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
40
- * @private
41
- * @ui5-restricted
42
- */
43
- var createDraftFromActiveDocument = function (oContext, oAppComponent, mParameters) {
44
- try {
45
- var _exit2 = false;
46
-
47
- //default true
48
-
49
- /**
50
- * Overwrite or reject based on fnWhenDecisionToOverwriteDocumentIsRequired.
51
- *
52
- * @param {*} bOverwrite Overwrite the change or not
53
- * @returns {Promise} Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
54
- */
55
- function overwriteOnDemand(bOverwrite) {
56
- if (bOverwrite) {
57
- //Overwrite existing changes
58
- var oModel = oContext.getModel();
59
- var draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
60
- var oResourceBundle;
61
- return mParameters.oView.getModel("sap.fe.i18n").getResourceBundle().then(function (_oResourceBundle) {
62
- oResourceBundle = _oResourceBundle;
63
- return draftDataContext.requestObject();
64
- }).then(function (draftAdminData) {
65
- if (draftAdminData) {
66
- // remove all unbound transition messages as we show a special dialog
67
- messageHandling.removeUnboundTransitionMessages();
68
- var sInfo = draftAdminData.InProcessByUserDescription || draftAdminData.InProcessByUser;
69
- var sEntitySet = mParameters.oView.getViewData().entitySet;
70
-
71
- if (sInfo) {
72
- var sLockedByUserMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_LOCKED_BY_USER", oResourceBundle, sInfo, sEntitySet);
73
- MessageBox.error(sLockedByUserMsg);
74
- throw new Error(sLockedByUserMsg);
75
- } else {
76
- sInfo = draftAdminData.CreatedByUserDescription || draftAdminData.CreatedByUser;
77
- var sUnsavedChangesMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_UNSAVED_CHANGES", oResourceBundle, sInfo, sEntitySet);
78
- return showMessageBox(sUnsavedChangesMsg).then(function () {
79
- return executeDraftEditAction(oContext, false);
80
- });
81
- }
82
- }
83
- });
84
- }
85
-
86
- return Promise.reject(new Error("Draft creation aborted for document: " + oContext.getPath()));
87
- }
88
-
89
- function showMessageBox(sUnsavedChangesMsg) {
90
- return new Promise(function (resolve, reject) {
91
- var oDialog = new Dialog({
92
- title: localI18nRef.getText("C_DRAFT_OBJECT_PAGE_WARNING"),
93
- state: "Warning",
94
- content: new Text({
95
- text: sUnsavedChangesMsg
96
- }),
97
- beginButton: new Button({
98
- text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT"),
99
- type: "Emphasized",
100
- press: function () {
101
- oDialog.close();
102
- resolve(true);
103
- }
104
- }),
105
- endButton: new Button({
106
- text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
107
- press: function () {
108
- oDialog.close();
109
- reject("Draft creation aborted for document: " + oContext.getPath());
110
- }
111
- }),
112
- afterClose: function () {
113
- oDialog.destroy();
114
- }
115
- });
116
- oDialog.addStyleClass("sapUiContentPadding");
117
- oDialog.open();
118
- });
119
- }
120
-
121
- var mParam = mParameters || {},
122
- localI18nRef = Core.getLibraryResourceBundle("sap.fe.core"),
123
- bRunPreserveChangesFlow = typeof mParam.bPreserveChanges === "undefined" || typeof mParam.bPreserveChanges === "boolean" && mParam.bPreserveChanges;
124
-
125
- if (!oContext) {
126
- return Promise.reject(new Error("Binding context to active document is required"));
127
- }
128
-
129
- var bExecute = mParam.fnBeforeCreateDraftFromActiveDocument ? mParam.fnBeforeCreateDraftFromActiveDocument(oContext, bRunPreserveChangesFlow) : true;
130
-
131
- if (!bExecute) {
132
- throw new Error("Draft creation was aborted by extension for document: " + oContext.getPath());
133
- }
134
-
135
- var openingSiblingContext = false;
136
- return Promise.resolve(_catch(function () {
137
- function _temp2(_result) {
138
- if (_exit2) return _result;
139
-
140
- if (openingSiblingContext) {
141
- return oDraftContext;
142
- }
143
-
144
- oDraftContext = oDraftContext && mParam.fnAfterCreateDraftFromActiveDocument ? mParam.fnAfterCreateDraftFromActiveDocument(oContext, oDraftContext) : oDraftContext;
145
- return function () {
146
- if (oDraftContext) {
147
- var _oSideEffects$trigger;
148
-
149
- var sEditActionName = getActionName(oDraftContext, draftOperations.EDIT);
150
- var oSideEffects = oAppComponent.getSideEffectsService().getODataActionSideEffects(sEditActionName, oDraftContext);
151
-
152
- if (oSideEffects !== null && oSideEffects !== void 0 && (_oSideEffects$trigger = oSideEffects.triggerActions) !== null && _oSideEffects$trigger !== void 0 && _oSideEffects$trigger.length) {
153
- return Promise.resolve(oAppComponent.getSideEffectsService().requestSideEffectsForODataAction(oSideEffects, oDraftContext)).then(function () {
154
- return oDraftContext;
155
- });
156
- } else {
157
- return oDraftContext;
158
- }
159
- }
160
- }();
161
- }
162
-
163
- var oDraftContext = null;
164
-
165
- var _temp = _catch(function () {
166
- return Promise.resolve(draft.executeDraftEditAction(oContext, bRunPreserveChangesFlow)).then(function (_draft$executeDraftEd) {
167
- oDraftContext = _draft$executeDraftEd;
168
- });
169
- }, function (oResponse) {
170
- return function () {
171
- if (bRunPreserveChangesFlow && oResponse.status === 409) {
172
- return function () {
173
- if (ActivitySync.isCollaborationEnabled(mParameters.oView)) {
174
- messageHandling.removeUnboundTransitionMessages();
175
- return Promise.resolve(draft.computeSiblingInformation(oContext, oContext)).then(function (siblingInfo) {
176
- var siblingContext = mParameters.oView.getController()._routing._createBindingContext(siblingInfo === null || siblingInfo === void 0 ? void 0 : siblingInfo.targetContext.getPath(), oContext.getModel());
177
-
178
- openingSiblingContext = true;
179
- _exit2 = true;
180
- return siblingContext;
181
- });
182
- } else {
183
- return Promise.resolve(overwriteOnDemand(mParam.fnWhenDecisionToOverwriteDocumentIsRequired ? mParam.fnWhenDecisionToOverwriteDocumentIsRequired() : true)).then(function (_overwriteOnDemand) {
184
- oDraftContext = _overwriteOnDemand;
185
- });
186
- }
187
- }();
188
- } else {
189
- throw new Error(oResponse);
190
- }
191
- }();
192
- });
193
-
194
- return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
195
- }, function (exc) {
196
- return Promise.reject(exc);
197
- }));
198
- } catch (e) {
199
- return Promise.reject(e);
200
- }
201
- };
202
- /**
203
- * Creates an active document from a draft document.
204
- *
205
- * The function supports several hooks as there is a certain choreography defined.
206
- *
207
- * @function
208
- * @name sap.fe.core.actions.draft#activateDocument
209
- * @memberof sap.fe.core.actions.draft
210
- * @static
211
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
212
- * @param {object} oAppComponent The AppComponent
213
- * @param {object} mParameters The parameters
214
- * @param {sap.fe.core.actions.draft.ICallback.fnBeforeActivateDocument} [mParameters.fnBeforeActivateDocument] Callback that allows veto before create request is executed
215
- * @param {sap.fe.core.actions.draft.ICallback.fnAfterActivateDocument} [mParameters.fnAfterActivateDocument] Callback for postprocessiong after document was activated.
216
- * @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
217
- * @private
218
- * @ui5-restricted
219
- */
220
-
221
-
222
- /**
223
- * This methods creates a sibling context for a sub-object page, and calculates a sibling path for
224
- * all intermediates paths between the OP and the sub-OP.
225
- *
226
- * @param {object} rootCurrentContext The context for the root of the draft
227
- * @param {object} rightmostCurrentContext The context of the sub-object
228
- * @returns {Promise} returns the siblingInformation object
229
- */
230
- var computeSiblingInformation = function (rootCurrentContext, rightmostCurrentContext) {
231
- try {
232
- if (!rightmostCurrentContext.getPath().startsWith(rootCurrentContext.getPath())) {
233
- // Wrong usage !!
234
- Log.error("Cannot compute rightmost sibling context");
235
- throw new Error("Cannot compute rightmost sibling context");
236
- }
237
-
238
- var model = rootCurrentContext.getModel();
239
- return Promise.resolve(_catch(function () {
240
- // //////////////////////////////////////////////////////////////////
241
- // 1. Find all segments between the root object and the sub-object
242
- // Example: for root = /Param(aa)/Entity(bb) and rightMost = /Param(aa)/Entity(bb)/_Nav(cc)/_SubNav(dd)
243
- // ---> ["Param(aa)/Entity(bb)", "_Nav(cc)", "_SubNav(dd)"]
244
- // Find all segments in the rightmost path
245
- var additionalPath = rightmostCurrentContext.getPath().replace(rootCurrentContext.getPath(), "");
246
- var segments = additionalPath ? additionalPath.substring(1).split("/") : []; // First segment is always the full path of the root object, which can contain '/' in case of a parametrized entity
247
-
248
- segments.unshift(rootCurrentContext.getPath().substring(1)); // //////////////////////////////////////////////////////////////////
249
- // 2. Request canonical paths of the sibling entity for eah segment
250
- // Example: for ["Param(aa)/Entity(bb)", "_Nav(cc)", "_SubNav(dd)"]
251
- // --> request canonical paths for "Param(aa)/Entity(bb)/SiblingEntity", "Param(aa)/Entity(bb)/_Nav(cc)/SiblingEntity", "Param(aa)/Entity(bb)/_Nav(cc)/_SubNav(dd)/SiblingEntity"
252
-
253
- var oldPaths = [];
254
- var newPaths = [];
255
- var currentPath = "";
256
- var canonicalPathPromises = segments.map(function (segment) {
257
- currentPath += "/".concat(segment);
258
- oldPaths.unshift(currentPath);
259
- var siblingContext = model.bindContext(currentPath + "/SiblingEntity").getBoundContext();
260
- return siblingContext.requestCanonicalPath();
261
- }); // //////////////////////////////////////////////////////////////////
262
- // 3. Reconstruct the full paths from canonical paths (for path mapping)
263
- // Example: for canonical paths "/Param(aa)/Entity(bb-sibling)", "/Entity2(cc-sibling)", "/Entity3(dd-sibling)"
264
- // --> ["Param(aa)/Entity(bb-sibling)", "Param(aa)/Entity(bb-sibling)/_Nav(cc-sibling)", "Param(aa)/Entity(bb-sibling)/_Nav(cc-sibling)/_SubNav(dd-sibling)"]
265
-
266
- return Promise.resolve(Promise.all(canonicalPathPromises)).then(function (_Promise$all) {
267
- var canonicalPaths = _Promise$all;
268
- var siblingPath = "";
269
- canonicalPaths.forEach(function (canonicalPath, index) {
270
- if (index !== 0) {
271
- var navigation = segments[index].replace(/\(.*$/, ""); // Keep only navigation name from the segment, i.e. aaa(xxx) --> aaa
272
-
273
- var keys = canonicalPath.replace(/.*\(/, "("); // Keep only the keys fmro the canonical path, i.e. aaa(xxx) --> (xxx)
274
-
275
- siblingPath += "/".concat(navigation).concat(keys);
276
- } else {
277
- siblingPath = canonicalPath; // To manage parametrized entities
278
- }
279
-
280
- newPaths.unshift(siblingPath);
281
- });
282
- return {
283
- targetContext: model.bindContext(siblingPath).getBoundContext(),
284
- // Create the rightmost sibling context from its path
285
- pathMapping: oldPaths.map(function (oldPath, index) {
286
- return {
287
- oldPath: oldPath,
288
- newPath: newPaths[index]
289
- };
290
- })
291
- };
292
- });
293
- }, function () {
294
- // A canonical path couldn't be resolved (because a sibling doesn't exist)
295
- return undefined;
296
- }));
297
- } catch (e) {
298
- return Promise.reject(e);
299
- }
300
- };
301
-
302
- var ProgrammingModel = FELibrary.ProgrammingModel;
303
-
304
- /**
305
- * Interface for callbacks used in the functions
306
- *
307
- *
308
- * @author SAP SE
309
- * @since 1.54.0
310
- * @interface
311
- * @name sap.fe.core.actions.draft.ICallback
312
- * @private
313
- */
314
-
315
- /**
316
- * Callback to approve or reject the creation of a draft
317
- * @name sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument
318
- * @function
319
- * @static
320
- * @abstract
321
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
322
- * @returns {(boolean|Promise)} Approval of draft creation [true|false] or Promise that resolves with the boolean value
323
- *
324
- * @private
325
- */
326
-
327
- /**
328
- * Callback after a draft was successully created
329
- * @name sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument
330
- * @function
331
- * @static
332
- * @abstract
333
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the new draft
334
- * @param {sap.ui.model.odata.v4.Context} oActiveDocumentContext Context of the active document for the new draft
335
- * @returns {sap.ui.model.odata.v4.Context} oActiveDocumentContext
336
- *
337
- * @private
338
- */
339
-
340
- /**
341
- * Callback to approve or reject overwriting an unsaved draft of another user
342
- * @name sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired
343
- * @function
344
- * @public
345
- * @static
346
- * @abstract
347
- *
348
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
349
- * @returns {(boolean|Promise)} Approval to overwrite unsaved draft [true|false] or Promise that resolves with the boolean value
350
- *
351
- * @ui5-restricted
352
- */
353
-
354
- /* Constants for draft operations */
355
- var draftOperations = {
356
- EDIT: "EditAction",
357
- ACTIVATION: "ActivationAction",
358
- DISCARD: "DiscardAction",
359
- PREPARE: "PreparationAction"
360
- };
361
- /**
362
- * Static functions for the draft programming model
363
- *
364
- * @namespace
365
- * @alias sap.fe.core.actions.draft
366
- * @private
367
- * @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
368
- * @since 1.54.0
369
- */
370
-
371
- /**
372
- * Determines action name for a draft operation.
373
- *
374
- * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
375
- * @param {string} sOperation The operation name
376
- * @returns {string} The name of the draft operation
377
- */
378
-
379
- function getActionName(oContext, sOperation) {
380
- var oModel = oContext.getModel(),
381
- oMetaModel = oModel.getMetaModel(),
382
- sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
383
- return oMetaModel.getObject(sEntitySetPath + "@com.sap.vocabularies.Common.v1.DraftRoot/" + sOperation);
384
- }
385
- /**
386
- * Creates an operation context binding for the given context and operation.
387
- *
388
- * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
389
- * @param {string} sOperation The operation (action or function import)
390
- * @param oOptions Options to create the operation context
391
- * @returns {sap.ui.model.odata.v4.ODataContextBinding} The context binding of the bound operation
392
- */
393
-
394
-
395
- function createOperation(oContext, sOperation, oOptions) {
396
- var sOperationName = getActionName(oContext, sOperation);
397
- return oContext.getModel().bindContext(sOperationName + "(...)", oContext, oOptions);
398
- }
399
- /**
400
- * Check if optional draft prepare action exists.
401
- *
402
- * @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
403
- * @returns {boolean} True if a a prepare action exists
404
- */
405
-
406
-
407
- function hasPrepareAction(oContext) {
408
- return !!getActionName(oContext, draftOperations.PREPARE);
409
- }
410
- /**
411
- * Creates a new draft from an active document.
412
- *
413
- * @function
414
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
415
- * @param {boolean} bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
416
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
417
- * @private
418
- * @ui5-restricted
419
- */
420
-
421
-
422
- function executeDraftEditAction(oContext, bPreserveChanges) {
423
- if (oContext.getProperty("IsActiveEntity")) {
424
- var oOptions = {
425
- $$inheritExpandSelect: true
426
- };
427
- var oOperation = createOperation(oContext, draftOperations.EDIT, oOptions);
428
- oOperation.setParameter("PreserveChanges", bPreserveChanges);
429
- var sGroupId = "direct";
430
- var localI18nRef = Core.getLibraryResourceBundle("sap.fe.core");
431
- var sActionName = localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT");
432
- var oEditPromise = oOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel())).then(function (oDraftDocumentContext) {
433
- return oDraftDocumentContext;
434
- });
435
- oOperation.getModel().submitBatch(sGroupId);
436
- return oEditPromise;
437
- } else {
438
- throw new Error("You cannot edit this draft document");
439
- }
440
- }
441
- /**
442
- * Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
443
- *
444
- * @function
445
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
446
- * @param {object} oAppComponent The AppComponent
447
- * @param {string} [sGroupId] The optional batch group in which the operation is to be executed
448
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
449
- * @private
450
- * @ui5-restricted
451
- */
452
-
453
-
454
- function executeDraftActivationAction(oContext, oAppComponent, sGroupId) {
455
- var bHasPrepareAction = hasPrepareAction(oContext); // According to the draft spec if the service contains a prepare action and we trigger both prepare and
456
- // activate in one $batch the activate action is called with iF-Match=*
457
-
458
- var bIgnoreEtag = bHasPrepareAction;
459
-
460
- if (!oContext.getProperty("IsActiveEntity")) {
461
- var oOperation = createOperation(oContext, draftOperations.ACTIVATION, {
462
- $$inheritExpandSelect: true
463
- });
464
- var localI18nRef = Core.getLibraryResourceBundle("sap.fe.core");
465
- var sActionName = localI18nRef.getText("C_OP_OBJECT_PAGE_SAVE");
466
- return oOperation.execute(sGroupId, bIgnoreEtag, sGroupId ? CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()) : undefined) //3rd parameter<------
467
- .then(function (oActiveDocumentContext) {
468
- return oActiveDocumentContext;
469
- }).catch( //if ACTIVATE action fails then we request either the sideEffects against PREPARE action (if annotated) or the messages as fallback:
470
- function () {
471
- if (bHasPrepareAction) {
472
- var _sActionName = getActionName(oContext, draftOperations.PREPARE),
473
- oSideEffectsService = oAppComponent.getSideEffectsService(),
474
- oBindingParameters = oSideEffectsService.getODataActionSideEffects(_sActionName, oContext),
475
- aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
476
-
477
- if (aTargetPaths && aTargetPaths.length > 0) {
478
- oSideEffectsService.requestSideEffects(aTargetPaths, oContext).catch(function (oError) {
479
- Log.error("Error while requesting side effects", oError);
480
- });
481
- } else {
482
- requestMessages(oContext, oSideEffectsService).catch(function (oError) {
483
- Log.error("Error while requesting messages", oError);
484
- });
485
- }
486
- }
487
-
488
- return Promise.reject();
489
- });
490
- } else {
491
- throw new Error("The activation action cannot be executed on an active document");
492
- }
493
- }
494
- /**
495
- * Execute a preparation action.
496
- *
497
- * @function
498
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
499
- * @param {string} groupId The optional batch group in which we want to execute the operation
500
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
501
- * @private
502
- * @ui5-restricted
503
- */
504
-
505
-
506
- function executeDraftPreparationAction(oContext, groupId) {
507
- if (!oContext.getProperty("IsActiveEntity")) {
508
- var oOperation = createOperation(oContext, draftOperations.PREPARE); // TODO: side effects qualifier shall be even deprecated to be checked
509
-
510
- oOperation.setParameter("SideEffectsQualifier", "");
511
- var sGroupId = groupId || oOperation.getGroupId();
512
- return oOperation.execute(sGroupId).then(function () {
513
- return oOperation;
514
- }).catch(function (oError) {
515
- Log.error("Error while executing the operation", oError);
516
- });
517
- } else {
518
- throw new Error("The preparation action cannot be executed on an active document");
519
- }
520
- }
521
- /**
522
- * Determines the message path for a context.
523
- *
524
- * @function
525
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the path shall be determined
526
- * @returns {string} Message path, empty if not annotated
527
- * @private
528
- * @ui5-restricted
529
- */
530
-
531
-
532
- function getMessagesPath(oContext) {
533
- var oModel = oContext.getModel(),
534
- oMetaModel = oModel.getMetaModel(),
535
- sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
536
- return oMetaModel.getObject(sEntitySetPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
537
- }
538
- /**
539
- * Requests the messages if annotated for a given context.
540
- *
541
- * @function
542
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the messages shall be requested
543
- * @param {object} oSideEffectsService Service for the SideEffects on SAP Fiori elements
544
- * @returns {Promise} Promise which is resolved once messages were requested
545
- * @private
546
- * @ui5-restricted
547
- */
548
-
549
-
550
- function requestMessages(oContext, oSideEffectsService) {
551
- var sMessagesPath = getMessagesPath(oContext);
552
-
553
- if (sMessagesPath) {
554
- return oSideEffectsService.requestSideEffects([{
555
- $PropertyPath: sMessagesPath
556
- }], oContext);
557
- }
558
-
559
- return Promise.resolve();
560
- }
561
- /**
562
- * Executes discard of a draft function using HTTP Post.
563
- *
564
- * @function
565
- * @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
566
- * @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
567
- * @private
568
- * @ui5-restricted
569
- */
570
-
571
-
572
- function executeDraftDiscardAction(oContext) {
573
- if (!oContext.getProperty("IsActiveEntity")) {
574
- var oDiscardOperation = createOperation(oContext, draftOperations.DISCARD);
575
- var localI18nRef = Core.getLibraryResourceBundle("sap.fe.core");
576
- var sGroupId = "direct";
577
- var sActionName = localI18nRef.getText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON");
578
- var oDiscardPromise = oDiscardOperation.execute(sGroupId, undefined, CommonUtils.fnOnStrictHandlingFailed.bind(draft, sGroupId, sActionName, oContext.getModel()));
579
- oContext.getModel().submitBatch(sGroupId);
580
- return oDiscardPromise;
581
- } else {
582
- throw new Error("The discard action cannot be executed on an active document");
583
- }
584
- }
585
-
586
- function activateDocument(oContext, oAppComponent, mParameters) {
587
- var mParam = mParameters || {};
588
-
589
- if (!oContext) {
590
- return Promise.reject(new Error("Binding context to draft document is required"));
591
- }
592
-
593
- return Promise.resolve(mParam.fnBeforeActivateDocument ? mParam.fnBeforeActivateDocument(oContext) : true).then(function (bExecute) {
594
- if (!bExecute) {
595
- return Promise.reject(new Error("Activation of the document was aborted by extension for document: " + oContext.getPath()));
596
- }
597
-
598
- if (!hasPrepareAction(oContext)) {
599
- return executeDraftActivationAction(oContext, oAppComponent);
600
- }
601
- /* activation requires preparation */
602
-
603
-
604
- var sBatchGroup = "draft"; // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
605
-
606
- var oPreparePromise = executeDraftPreparationAction(oContext, sBatchGroup);
607
- oContext.getModel().submitBatch(sBatchGroup);
608
- var oActivatePromise = executeDraftActivationAction(oContext, oAppComponent, sBatchGroup);
609
- return Promise.all([oPreparePromise, oActivatePromise]).then(function (values) {
610
- return values[1];
611
- }).catch(function (exc) {
612
- return Promise.reject(exc);
613
- });
614
- }).then(function (oActiveDocumentContext) {
615
- return Promise.resolve(mParam.fnAfterActivateDocument ? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext) : oActiveDocumentContext);
616
- }).catch(function (exc) {
617
- return Promise.reject(exc);
618
- });
619
- }
620
- /**
621
- * HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE for Draft(when no DraftAction)
622
- * and Active Instance uses DELETE always.
623
- *
624
- * @function
625
- * @name sap.fe.core.actions.draft#deleteDraft
626
- * @memberof sap.fe.core.actions.draft
627
- * @static
628
- * @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be discarded
629
- * @private
630
- * @returns {Promise}
631
- * @ui5-restricted
632
- */
633
-
634
-
635
- function deleteDraft(oContext) {
636
- var sDiscardAction = getActionName(oContext, draftOperations.DISCARD),
637
- bIsActiveEntity = oContext.getObject().IsActiveEntity;
638
-
639
- if (bIsActiveEntity || !bIsActiveEntity && !sDiscardAction) {
640
- //Use Delete in case of active entity and no discard action available for draft
641
- if (oContext.hasPendingChanges()) {
642
- return oContext.getBinding().resetChanges().then(function () {
643
- return oContext.delete();
644
- }).catch(function (error) {
645
- return Promise.reject(error);
646
- });
647
- } else {
648
- return oContext.delete();
649
- }
650
- } else {
651
- //Use Discard Post Action if it is a draft entity and discard action exists
652
- return executeDraftDiscardAction(oContext);
653
- }
654
- }
655
-
656
- var draft = {
657
- createDraftFromActiveDocument: createDraftFromActiveDocument,
658
- activateDocument: activateDocument,
659
- deleteDraft: deleteDraft,
660
- executeDraftEditAction: executeDraftEditAction,
661
- computeSiblingInformation: computeSiblingInformation
662
- };
663
- return draft;
664
- }, false);
665
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sIm5hbWVzIjpbImJvZHkiLCJyZWNvdmVyIiwicmVzdWx0IiwiZSIsInRoZW4iLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm9Db250ZXh0Iiwib0FwcENvbXBvbmVudCIsIm1QYXJhbWV0ZXJzIiwib3ZlcndyaXRlT25EZW1hbmQiLCJiT3ZlcndyaXRlIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJkcmFmdERhdGFDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRQYXRoIiwiZ2V0Qm91bmRDb250ZXh0Iiwib1Jlc291cmNlQnVuZGxlIiwib1ZpZXciLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIl9vUmVzb3VyY2VCdW5kbGUiLCJyZXF1ZXN0T2JqZWN0IiwiZHJhZnRBZG1pbkRhdGEiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwic0luZm8iLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkluUHJvY2Vzc0J5VXNlciIsInNFbnRpdHlTZXQiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsInNMb2NrZWRCeVVzZXJNc2ciLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwiTWVzc2FnZUJveCIsImVycm9yIiwiRXJyb3IiLCJDcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24iLCJDcmVhdGVkQnlVc2VyIiwic1Vuc2F2ZWRDaGFuZ2VzTXNnIiwic2hvd01lc3NhZ2VCb3giLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiUHJvbWlzZSIsInJlamVjdCIsInJlc29sdmUiLCJvRGlhbG9nIiwiRGlhbG9nIiwidGl0bGUiLCJsb2NhbEkxOG5SZWYiLCJnZXRUZXh0Iiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsInRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInR5cGUiLCJwcmVzcyIsImNsb3NlIiwiZW5kQnV0dG9uIiwiYWZ0ZXJDbG9zZSIsImRlc3Ryb3kiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsIm1QYXJhbSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsImJQcmVzZXJ2ZUNoYW5nZXMiLCJiRXhlY3V0ZSIsImZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQiLCJvcGVuaW5nU2libGluZ0NvbnRleHQiLCJvRHJhZnRDb250ZXh0IiwiZm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50Iiwic0VkaXRBY3Rpb25OYW1lIiwiZ2V0QWN0aW9uTmFtZSIsImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJvU2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwidHJpZ2dlckFjdGlvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsImRyYWZ0Iiwib1Jlc3BvbnNlIiwic3RhdHVzIiwiQWN0aXZpdHlTeW5jIiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsImNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJzaWJsaW5nSW5mbyIsInNpYmxpbmdDb250ZXh0IiwiZ2V0Q29udHJvbGxlciIsIl9yb3V0aW5nIiwiX2NyZWF0ZUJpbmRpbmdDb250ZXh0IiwidGFyZ2V0Q29udGV4dCIsImZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQiLCJleGMiLCJyb290Q3VycmVudENvbnRleHQiLCJyaWdodG1vc3RDdXJyZW50Q29udGV4dCIsInN0YXJ0c1dpdGgiLCJMb2ciLCJtb2RlbCIsImFkZGl0aW9uYWxQYXRoIiwicmVwbGFjZSIsInNlZ21lbnRzIiwic3Vic3RyaW5nIiwic3BsaXQiLCJ1bnNoaWZ0Iiwib2xkUGF0aHMiLCJuZXdQYXRocyIsImN1cnJlbnRQYXRoIiwiY2Fub25pY2FsUGF0aFByb21pc2VzIiwibWFwIiwic2VnbWVudCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiYWxsIiwiY2Fub25pY2FsUGF0aHMiLCJzaWJsaW5nUGF0aCIsImZvckVhY2giLCJjYW5vbmljYWxQYXRoIiwiaW5kZXgiLCJuYXZpZ2F0aW9uIiwia2V5cyIsInBhdGhNYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJ1bmRlZmluZWQiLCJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwic09wZXJhdGlvbiIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJzRW50aXR5U2V0UGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJnZXRQcm9wZXJ0eSIsIiQkaW5oZXJpdEV4cGFuZFNlbGVjdCIsIm9PcGVyYXRpb24iLCJzZXRQYXJhbWV0ZXIiLCJzR3JvdXBJZCIsInNBY3Rpb25OYW1lIiwib0VkaXRQcm9taXNlIiwiZXhlY3V0ZSIsImZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZCIsImJpbmQiLCJvRHJhZnREb2N1bWVudENvbnRleHQiLCJzdWJtaXRCYXRjaCIsImV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24iLCJiSGFzUHJlcGFyZUFjdGlvbiIsImJJZ25vcmVFdGFnIiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsImNhdGNoIiwib1NpZGVFZmZlY3RzU2VydmljZSIsIm9CaW5kaW5nUGFyYW1ldGVycyIsImFUYXJnZXRQYXRocyIsInBhdGhFeHByZXNzaW9ucyIsInJlcXVlc3RTaWRlRWZmZWN0cyIsIm9FcnJvciIsInJlcXVlc3RNZXNzYWdlcyIsImV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uIiwiZ3JvdXBJZCIsImdldEdyb3VwSWQiLCJnZXRNZXNzYWdlc1BhdGgiLCJzTWVzc2FnZXNQYXRoIiwiJFByb3BlcnR5UGF0aCIsImV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24iLCJvRGlzY2FyZE9wZXJhdGlvbiIsIm9EaXNjYXJkUHJvbWlzZSIsImFjdGl2YXRlRG9jdW1lbnQiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJzQmF0Y2hHcm91cCIsIm9QcmVwYXJlUHJvbWlzZSIsIm9BY3RpdmF0ZVByb21pc2UiLCJ2YWx1ZXMiLCJmbkFmdGVyQWN0aXZhdGVEb2N1bWVudCIsImRlbGV0ZURyYWZ0Iiwic0Rpc2NhcmRBY3Rpb24iLCJiSXNBY3RpdmVFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiZ2V0QmluZGluZyIsInJlc2V0Q2hhbmdlcyIsImRlbGV0ZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7OztBQWdqQk8sa0JBQWdCQSxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7QUFDckMsUUFBSTtBQUNILFVBQUlDLE1BQU0sR0FBR0YsSUFBSSxFQUFqQjtBQUNBLEtBRkQsQ0FFRSxPQUFNRyxDQUFOLEVBQVM7QUFDVixhQUFPRixPQUFPLENBQUNFLENBQUQsQ0FBZDtBQUNBOztBQUNELFFBQUlELE1BQU0sSUFBSUEsTUFBTSxDQUFDRSxJQUFyQixFQUEyQjtBQUMxQixhQUFPRixNQUFNLENBQUNFLElBQVAsQ0FBWSxLQUFLLENBQWpCLEVBQW9CSCxPQUFwQixDQUFQO0FBQ0E7O0FBQ0QsV0FBT0MsTUFBUDtBQUNBOztBQWpNRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFDZUcsNkIsYUFDZEMsUSxFQUNBQyxhLEVBQ0FDLFc7UUFPQztBQUFBOztBQUk4SDs7QUFFL0g7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0MsZUFBU0MsaUJBQVQsQ0FBMkJDLFVBQTNCLEVBQTRDO0FBQzNDLFlBQUlBLFVBQUosRUFBZ0I7QUFDZjtBQUNBLGNBQU1DLE1BQU0sR0FBR0wsUUFBUSxDQUFD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QUduTCxRQUFRLENBQUNvSSxTQUFULEdBQXFCZ0QsY0FEeEM7O0FBR0EsUUFBSUQsZUFBZSxJQUFLLENBQUNBLGVBQUQsSUFBb0IsQ0FBQ0QsY0FBN0MsRUFBOEQ7QUFDN0Q7QUFDQSxVQUFJbEwsUUFBUSxDQUFDcUwsaUJBQVQsRUFBSixFQUFrQztBQUNqQyxlQUFPckwsUUFBUSxDQUNic0wsVUFESyxHQUVMQyxZQUZLLEdBR0x6TCxJQUhLLENBR0EsWUFBWTtBQUNqQixpQkFBT0UsUUFBUSxDQUFDd0wsTUFBVCxFQUFQO0FBQ0EsU0FMSyxFQU1ML0IsS0FOSyxDQU1DLFVBQVU1SCxLQUFWLEVBQXNCO0FBQzVCLGlCQUFPTyxPQUFPLENBQUNDLE1BQVIsQ0FBZVIsS0FBZixDQUFQO0FBQ0EsU0FSSyxDQUFQO0FBU0EsT0FWRCxNQVVPO0FBQ04sZUFBTzdCLFFBQVEsQ0FBQ3dMLE1BQVQsRUFBUDtBQUNBO0FBQ0QsS0FmRCxNQWVPO0FBQ047QUFDQSxhQUFPakIseUJBQXlCLENBQUN2SyxRQUFELENBQWhDO0FBQ0E7QUFDRDs7QUFDRCxNQUFNOEUsS0FBSyxHQUFHO0FBQ2IvRSxJQUFBQSw2QkFBNkIsRUFBRUEsNkJBRGxCO0FBRWIySyxJQUFBQSxnQkFBZ0IsRUFBRUEsZ0JBRkw7QUFHYk8sSUFBQUEsV0FBVyxFQUFFQSxXQUhBO0FBSWI5SSxJQUFBQSxzQkFBc0IsRUFBRUEsc0JBSlg7QUFLYmdELElBQUFBLHlCQUF5QixFQUFFQTtBQUxkLEdBQWQ7U0FRZUwsSyIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBBY3Rpdml0eVN5bmMgZnJvbSBcInNhcC9mZS9jb3JlL2FjdGlvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2FjdGlvbnMvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB7IFNpZGVFZmZlY3RzU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB7IENvcmVFeCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsO1xuZXhwb3J0IHR5cGUgU2libGluZ0luZm9ybWF0aW9uID0ge1xuXHR0YXJnZXRDb250ZXh0OiBDb250ZXh0O1xuXHRwYXRoTWFwcGluZzogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W107XG59O1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY2FsbGJhY2tzIHVzZWQgaW4gdGhlIGZ1bmN0aW9uc1xuICpcbiAqXG4gKiBAYXV0aG9yIFNBUCBTRVxuICogQHNpbmNlIDEuNTQuMFxuICogQGludGVyZmFjZVxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayB0byBhcHByb3ZlIG9yIHJlamVjdCB0aGUgY3JlYXRpb24gb2YgYSBkcmFmdFxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHsoYm9vbGVhbnxQcm9taXNlKX0gQXBwcm92YWwgb2YgZHJhZnQgY3JlYXRpb24gW3RydWV8ZmFsc2VdIG9yIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBib29sZWFuIHZhbHVlXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIGFmdGVyIGEgZHJhZnQgd2FzIHN1Y2Nlc3N1bGx5IGNyZWF0ZWRcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9BY3RpdmVEb2N1bWVudENvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9BY3RpdmVEb2N1bWVudENvbnRleHRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYXBwcm92ZSBvciByZWplY3Qgb3ZlcndyaXRpbmcgYW4gdW5zYXZlZCBkcmFmdCBvZiBhbm90aGVyIHVzZXJcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLndoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkXG4gKiBAZnVuY3Rpb25cbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgeyhib29sZWFufFByb21pc2UpfSBBcHByb3ZhbCB0byBvdmVyd3JpdGUgdW5zYXZlZCBkcmFmdCBbdHJ1ZXxmYWxzZV0gb3IgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJvb2xlYW4gdmFsdWVcbiAqXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcbi8qKlxuICogU3RhdGljIGZ1bmN0aW9ucyBmb3IgdGhlIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBwcml2YXRlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGV4cGVyaW1lbnRhbCB1c2UhIDxici8+PGI+VGhpcyBpcyBvbmx5IGEgUE9DIGFuZCBtYXliZSBkZWxldGVkPC9iPlxuICogQHNpbmNlIDEuNTQuMFxuICovXG5cbi8qKlxuICogRGV0ZXJtaW5lcyBhY3Rpb24gbmFtZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEFjdGlvbk5hbWUob0NvbnRleHQ6IGFueSwgc09wZXJhdGlvbjogc3RyaW5nKSB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3Qoc0VudGl0eVNldFBhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L1wiICsgc09wZXJhdGlvbik7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gb3BlcmF0aW9uIGNvbnRleHQgYmluZGluZyBmb3IgdGhlIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMge3NhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nfSBUaGUgY29udGV4dCBiaW5kaW5nIG9mIHRoZSBib3VuZCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0OiBhbnksIHNPcGVyYXRpb246IHN0cmluZywgb09wdGlvbnM/OiBhbnkpIHtcblx0Y29uc3Qgc09wZXJhdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBzT3BlcmF0aW9uKTtcblxuXHRyZXR1cm4gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzT3BlcmF0aW9uTmFtZSArIFwiKC4uLilcIiwgb0NvbnRleHQsIG9PcHRpb25zKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgb3B0aW9uYWwgZHJhZnQgcHJlcGFyZSBhY3Rpb24gZXhpc3RzLlxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGEgYSBwcmVwYXJlIGFjdGlvbiBleGlzdHNcbiAqL1xuZnVuY3Rpb24gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dDogYW55KSB7XG5cdHJldHVybiAhIWdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkcmFmdCBmcm9tIGFuIGFjdGl2ZSBkb2N1bWVudC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtib29sZWFufSBiUHJlc2VydmVDaGFuZ2VzIElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIHByZXNlcnZlZCBhbmQgYW4gZXJyb3IgbWVzc2FnZSAoaHR0cCBzdGF0dXMgNDA5KSBpcyBzZW5kIGZyb20gdGhlIGJhY2tlbmQsIG90aGVyd2lzZSBmYWxzZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgb3ZlcndyaXR0ZW48L2xpPlxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dDogYW55LCBiUHJlc2VydmVDaGFuZ2VzOiBib29sZWFuKSB7XG5cdGlmIChvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wdGlvbnMgPSB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9O1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElULCBvT3B0aW9ucyk7XG5cdFx0b09wZXJhdGlvbi5zZXRQYXJhbWV0ZXIoXCJQcmVzZXJ2ZUNoYW5nZXNcIiwgYlByZXNlcnZlQ2hhbmdlcyk7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBcImRpcmVjdFwiO1xuXHRcdGNvbnN0IGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIik7XG5cdFx0Y29uc3Qgb0VkaXRQcm9taXNlID0gb09wZXJhdGlvblxuXHRcdFx0LmV4ZWN1dGUoc0dyb3VwSWQsIHVuZGVmaW5lZCwgQ29tbW9uVXRpbHMuZm5PblN0cmljdEhhbmRsaW5nRmFpbGVkLmJpbmQoZHJhZnQsIHNHcm91cElkLCBzQWN0aW9uTmFtZSwgb0NvbnRleHQuZ2V0TW9kZWwoKSkpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0RyYWZ0RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9EcmFmdERvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pO1xuXHRcdG9PcGVyYXRpb24uZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0cmV0dXJuIG9FZGl0UHJvbWlzZTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IGVkaXQgdGhpcyBkcmFmdCBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEFjdGl2YXRlcyBhIGRyYWZ0IGRvY3VtZW50LiBUaGUgZHJhZnQgd2lsbCByZXBsYWNlIHRoZSBzaWJsaW5nIGVudGl0eSBhbmQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBiYWNrIGVuZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtzdHJpbmd9IFtzR3JvdXBJZF0gVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgdG8gYmUgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQ6IGFueSwgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBzR3JvdXBJZD86IHN0cmluZykge1xuXHRjb25zdCBiSGFzUHJlcGFyZUFjdGlvbiA9IGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpO1xuXG5cdC8vIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3BlYyBpZiB0aGUgc2VydmljZSBjb250YWlucyBhIHByZXBhcmUgYWN0aW9uIGFuZCB3ZSB0cmlnZ2VyIGJvdGggcHJlcGFyZSBhbmRcblx0Ly8gYWN0aXZhdGUgaW4gb25lICRiYXRjaCB0aGUgYWN0aXZhdGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRoIGlGLU1hdGNoPSpcblx0Y29uc3QgYklnbm9yZUV0YWcgPSBiSGFzUHJlcGFyZUFjdGlvbjtcblxuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuQUNUSVZBVElPTiwgeyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfSk7XG5cdFx0Y29uc3QgbG9jYWxJMThuUmVmID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRjb25zdCBzQWN0aW9uTmFtZSA9IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19PUF9PQkpFQ1RfUEFHRV9TQVZFXCIpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShcblx0XHRcdFx0c0dyb3VwSWQsXG5cdFx0XHRcdGJJZ25vcmVFdGFnLFxuXHRcdFx0XHRzR3JvdXBJZCA/IENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKGRyYWZ0LCBzR3JvdXBJZCwgc0FjdGlvbk5hbWUsIG9Db250ZXh0LmdldE1vZGVsKCkpIDogdW5kZWZpbmVkXG5cdFx0XHQpIC8vM3JkIHBhcmFtZXRlcjwtLS0tLS1cblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQWN0aXZlRG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKFxuXHRcdFx0XHQvL2lmIEFDVElWQVRFIGFjdGlvbiBmYWlscyB0aGVuIHdlIHJlcXVlc3QgZWl0aGVyIHRoZSBzaWRlRWZmZWN0cyBhZ2FpbnN0IFBSRVBBUkUgYWN0aW9uIChpZiBhbm5vdGF0ZWQpIG9yIHRoZSBtZXNzYWdlcyBhcyBmYWxsYmFjazpcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChiSGFzUHJlcGFyZUFjdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSksXG5cdFx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLFxuXHRcdFx0XHRcdFx0XHRvQmluZGluZ1BhcmFtZXRlcnMgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0FjdGlvbk5hbWUsIG9Db250ZXh0KSxcblx0XHRcdFx0XHRcdFx0YVRhcmdldFBhdGhzID0gb0JpbmRpbmdQYXJhbWV0ZXJzICYmIG9CaW5kaW5nUGFyYW1ldGVycy5wYXRoRXhwcmVzc2lvbnM7XG5cdFx0XHRcdFx0XHRpZiAoYVRhcmdldFBhdGhzICYmIGFUYXJnZXRQYXRocy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRQYXRocywgb0NvbnRleHQpLmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKS5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lc3NhZ2VzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYWN0aXZhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuLyoqXG4gKiBFeGVjdXRlIGEgcHJlcGFyYXRpb24gYWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBJZCBUaGUgb3B0aW9uYWwgYmF0Y2ggZ3JvdXAgaW4gd2hpY2ggd2Ugd2FudCB0byBleGVjdXRlIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKG9Db250ZXh0OiBDb250ZXh0LCBncm91cElkPzogc3RyaW5nKSB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcblxuXHRcdC8vIFRPRE86IHNpZGUgZWZmZWN0cyBxdWFsaWZpZXIgc2hhbGwgYmUgZXZlbiBkZXByZWNhdGVkIHRvIGJlIGNoZWNrZWRcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlNpZGVFZmZlY3RzUXVhbGlmaWVyXCIsIFwiXCIpO1xuXG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBncm91cElkIHx8IG9PcGVyYXRpb24uZ2V0R3JvdXBJZCgpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuZXhlY3V0ZShzR3JvdXBJZClcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb247XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvblwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIHByZXBhcmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKipcbiAqIERldGVybWluZXMgdGhlIG1lc3NhZ2UgcGF0aCBmb3IgYSBjb250ZXh0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIHBhdGggc2hhbGwgYmUgZGV0ZXJtaW5lZFxuICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZSBwYXRoLCBlbXB0eSBpZiBub3QgYW5ub3RhdGVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VzUGF0aChvQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoICsgXCIvQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aFwiKTtcbn1cbi8qKlxuICogUmVxdWVzdHMgdGhlIG1lc3NhZ2VzIGlmIGFubm90YXRlZCBmb3IgYSBnaXZlbiBjb250ZXh0LlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2VzIHNoYWxsIGJlIHJlcXVlc3RlZFxuICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0c1NlcnZpY2UgU2VydmljZSBmb3IgdGhlIFNpZGVFZmZlY3RzIG9uIFNBUCBGaW9yaSBlbGVtZW50c1xuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSBtZXNzYWdlcyB3ZXJlIHJlcXVlc3RlZFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiByZXF1ZXN0TWVzc2FnZXMob0NvbnRleHQ6IGFueSwgb1NpZGVFZmZlY3RzU2VydmljZTogU2lkZUVmZmVjdHNTZXJ2aWNlKSB7XG5cdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBnZXRNZXNzYWdlc1BhdGgob0NvbnRleHQpO1xuXHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdHJldHVybiBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkUHJvcGVydHlQYXRoOiBzTWVzc2FnZXNQYXRoIH1dIGFzIGFueSwgb0NvbnRleHQpO1xuXHR9XG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cbi8qKlxuICogRXhlY3V0ZXMgZGlzY2FyZCBvZiBhIGRyYWZ0IGZ1bmN0aW9uIHVzaW5nIEhUVFAgUG9zdC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHJldHVybnMge1Byb21pc2UuPHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0Pn0gUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dDogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9EaXNjYXJkT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCk7XG5cdFx0Y29uc3QgbG9jYWxJMThuUmVmID0gKENvcmUgYXMgQ29yZUV4KS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRjb25zdCBzR3JvdXBJZCA9IFwiZGlyZWN0XCI7XG5cdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpO1xuXHRcdGNvbnN0IG9EaXNjYXJkUHJvbWlzZSA9IG9EaXNjYXJkT3BlcmF0aW9uLmV4ZWN1dGUoXG5cdFx0XHRzR3JvdXBJZCxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdENvbW1vblV0aWxzLmZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZC5iaW5kKGRyYWZ0LCBzR3JvdXBJZCwgc0FjdGlvbk5hbWUsIG9Db250ZXh0LmdldE1vZGVsKCkpXG5cdFx0KTtcblx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRyZXR1cm4gb0Rpc2NhcmRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBkaXNjYXJkIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2RzIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3ViLW9iamVjdCBwYWdlLCBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aCBmb3JcbiAqIGFsbCBpbnRlcm1lZGlhdGVzIHBhdGhzIGJldHdlZW4gdGhlIE9QIGFuZCB0aGUgc3ViLU9QLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuICogQHBhcmFtIHtvYmplY3R9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBzdWItb2JqZWN0XG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gcmV0dXJucyB0aGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRyb290Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0XG4pOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0Ly8gV3JvbmcgdXNhZ2UgISFcblx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdH1cblxuXHRjb25zdCBtb2RlbCA9IHJvb3RDdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpO1xuXHR0cnkge1xuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDEuIEZpbmQgYWxsIHNlZ21lbnRzIGJldHdlZW4gdGhlIHJvb3Qgb2JqZWN0IGFuZCB0aGUgc3ViLW9iamVjdFxuXHRcdC8vIEV4YW1wbGU6IGZvciByb290ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpIGFuZCByaWdodE1vc3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZClcblx0XHQvLyAtLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXG5cdFx0Ly8gRmluZCBhbGwgc2VnbWVudHMgaW4gdGhlIHJpZ2h0bW9zdCBwYXRoXG5cdFx0Y29uc3QgYWRkaXRpb25hbFBhdGggPSByaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkucmVwbGFjZShyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLCBcIlwiKTtcblx0XHRjb25zdCBzZWdtZW50cyA9IGFkZGl0aW9uYWxQYXRoID8gYWRkaXRpb25hbFBhdGguc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKSA6IFtdO1xuXHRcdC8vIEZpcnN0IHNlZ21lbnQgaXMgYWx3YXlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIHJvb3Qgb2JqZWN0LCB3aGljaCBjYW4gY29udGFpbiAnLycgaW4gY2FzZSBvZiBhIHBhcmFtZXRyaXplZCBlbnRpdHlcblx0XHRzZWdtZW50cy51bnNoaWZ0KHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDIuIFJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIG9mIHRoZSBzaWJsaW5nIGVudGl0eSBmb3IgZWFoIHNlZ21lbnRcblx0XHQvLyBFeGFtcGxlOiBmb3IgW1wiUGFyYW0oYWEpL0VudGl0eShiYilcIiwgXCJfTmF2KGNjKVwiLCBcIl9TdWJOYXYoZGQpXCJdXG5cdFx0Ly8gLS0+IHJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIGZvciBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9TaWJsaW5nRW50aXR5XCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZCkvU2libGluZ0VudGl0eVwiXG5cdFx0Y29uc3Qgb2xkUGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgbmV3UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0bGV0IGN1cnJlbnRQYXRoID0gXCJcIjtcblx0XHRjb25zdCBjYW5vbmljYWxQYXRoUHJvbWlzZXMgPSBzZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IHtcblx0XHRcdGN1cnJlbnRQYXRoICs9IGAvJHtzZWdtZW50fWA7XG5cdFx0XHRvbGRQYXRocy51bnNoaWZ0KGN1cnJlbnRQYXRoKTtcblx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQoY3VycmVudFBhdGggKyBcIi9TaWJsaW5nRW50aXR5XCIpLmdldEJvdW5kQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHR9KTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDMuIFJlY29uc3RydWN0IHRoZSBmdWxsIHBhdGhzIGZyb20gY2Fub25pY2FsIHBhdGhzIChmb3IgcGF0aCBtYXBwaW5nKVxuXHRcdC8vIEV4YW1wbGU6IGZvciBjYW5vbmljYWwgcGF0aHMgXCIvUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIi9FbnRpdHkyKGNjLXNpYmxpbmcpXCIsIFwiL0VudGl0eTMoZGQtc2libGluZylcIlxuXHRcdC8vIC0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpL19TdWJOYXYoZGQtc2libGluZylcIl1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRocyA9IChhd2FpdCBQcm9taXNlLmFsbChjYW5vbmljYWxQYXRoUHJvbWlzZXMpKSBhcyBzdHJpbmdbXTtcblx0XHRsZXQgc2libGluZ1BhdGggPSBcIlwiO1xuXHRcdGNhbm9uaWNhbFBhdGhzLmZvckVhY2goKGNhbm9uaWNhbFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggIT09IDApIHtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvbiA9IHNlZ21lbnRzW2luZGV4XS5yZXBsYWNlKC9cXCguKiQvLCBcIlwiKTsgLy8gS2VlcCBvbmx5IG5hdmlnYXRpb24gbmFtZSBmcm9tIHRoZSBzZWdtZW50LCBpLmUuIGFhYSh4eHgpIC0tPiBhYWFcblx0XHRcdFx0Y29uc3Qga2V5cyA9IGNhbm9uaWNhbFBhdGgucmVwbGFjZSgvLipcXCgvLCBcIihcIik7IC8vIEtlZXAgb25seSB0aGUga2V5cyBmbXJvIHRoZSBjYW5vbmljYWwgcGF0aCwgaS5lLiBhYWEoeHh4KSAtLT4gKHh4eClcblx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke25hdmlnYXRpb259JHtrZXlzfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzaWJsaW5nUGF0aCA9IGNhbm9uaWNhbFBhdGg7IC8vIFRvIG1hbmFnZSBwYXJhbWV0cml6ZWQgZW50aXRpZXNcblx0XHRcdH1cblx0XHRcdG5ld1BhdGhzLnVuc2hpZnQoc2libGluZ1BhdGgpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHNpYmxpbmdQYXRoKS5nZXRCb3VuZENvbnRleHQoKSBhcyBDb250ZXh0LCAvLyBDcmVhdGUgdGhlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHQgZnJvbSBpdHMgcGF0aFxuXHRcdFx0cGF0aE1hcHBpbmc6IG9sZFBhdGhzLm1hcCgob2xkUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRvbGRQYXRoLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld1BhdGhzW2luZGV4XVxuXHRcdFx0XHR9O1xuXHRcdFx0fSlcblx0XHR9O1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIEEgY2Fub25pY2FsIHBhdGggY291bGRuJ3QgYmUgcmVzb2x2ZWQgKGJlY2F1c2UgYSBzaWJsaW5nIGRvZXNuJ3QgZXhpc3QpXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmcm9tIGFuIGV4aXN0aW5nIGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjb3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtBcHBDb21wb25lbnR9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5vVmlld10gVGhlIHZpZXdcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJQcmVzZXJ2ZUNoYW5nZXNdIFByZXNlcnZlIGNoYW5nZXMgb2YgYW4gZXhpc3RpbmcgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAcGFyYW0ge3NhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudF0gQ2FsbGJhY2sgdGhhdCBhbGxvd3MgdmV0byBiZWZvcmUgY3JlYXRlIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW9uZyBhZnRlciBkcmFmdCBkb2N1bWVudCB3YXMgY3JlYXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay53aGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZH0gW21QYXJhbWV0ZXJzLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWRdIENhbGxiYWNrIGZvciBkZWNpZGluZyBvbiBvdmVyd3JpdGluZyBhbiB1bnNhdmVkIGNoYW5nZSBieSBhbm90aGVyIHVzZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dCBjb250ZXh0fSBvZiB0aGUgbmV3IGRyYWZ0IGRvY3VtZW50XG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b1ZpZXc6IFZpZXc7XG5cdFx0YlByZXNlcnZlQ2hhbmdlcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0Zm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudD86IGFueTtcblx0XHRmbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ/OiBhbnk7XG5cdFx0Zm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZD86IGFueTtcblx0fVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9LFxuXHRcdGxvY2FsSTE4blJlZiA9IChDb3JlIGFzIENvcmVFeCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiksXG5cdFx0YlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cgPVxuXHRcdFx0dHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcInVuZGVmaW5lZFwiIHx8ICh0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwiYm9vbGVhblwiICYmIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzKTsgLy9kZWZhdWx0IHRydWVcblxuXHQvKipcblx0ICogT3ZlcndyaXRlIG9yIHJlamVjdCBiYXNlZCBvbiBmbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0geyp9IGJPdmVyd3JpdGUgT3ZlcndyaXRlIHRoZSBjaGFuZ2Ugb3Igbm90XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB7QGxpbmsgc2FwLmZlLmNvcmUuYWN0aW9ucyNleGVjdXRlRHJhZnRFZGl0QWN0aW9ufVxuXHQgKi9cblx0ZnVuY3Rpb24gb3ZlcndyaXRlT25EZW1hbmQoYk92ZXJ3cml0ZTogYW55KSB7XG5cdFx0aWYgKGJPdmVyd3JpdGUpIHtcblx0XHRcdC8vT3ZlcndyaXRlIGV4aXN0aW5nIGNoYW5nZXNcblx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSArIFwiL0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCIpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0bGV0IG9SZXNvdXJjZUJ1bmRsZTogUmVzb3VyY2VCdW5kbGU7XG5cblx0XHRcdHJldHVybiAoKG1QYXJhbWV0ZXJzLm9WaWV3LmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKF9vUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IF9vUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRcdFx0cmV0dXJuIGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoZHJhZnRBZG1pbkRhdGE6IGFueSkge1xuXHRcdFx0XHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIGFsbCB1bmJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgYXMgd2Ugc2hvdyBhIHNwZWNpYWwgZGlhbG9nXG5cdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0bGV0IHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IChtUGFyYW1ldGVycy5vVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZW50aXR5U2V0O1xuXHRcdFx0XHRcdFx0aWYgKHNJbmZvKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNMb2NrZWRCeVVzZXJNc2cgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfTE9DS0VEX0JZX1VTRVJcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0c0luZm8sXG5cdFx0XHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzVW5zYXZlZENoYW5nZXNNc2cgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfVU5TQVZFRF9DSEFOR0VTXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdHNJbmZvLFxuXHRcdFx0XHRcdFx0XHRcdHNFbnRpdHlTZXRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNob3dNZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZykudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkRyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiBcIiArIG9Db250ZXh0LmdldFBhdGgoKSkpO1xuXHR9XG5cblx0ZnVuY3Rpb24gc2hvd01lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnOiBhbnkpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0dGl0bGU6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9XQVJOSU5HXCIpLFxuXHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHtcblx0XHRcdFx0XHR0ZXh0OiBzVW5zYXZlZENoYW5nZXNNc2dcblx0XHRcdFx0fSksXG5cdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIiksXG5cdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSxcblx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0NBTkNFTFwiKSxcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVqZWN0KFwiRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXG5cdGNvbnN0IGJFeGVjdXRlID0gbVBhcmFtLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcblx0XHQ/IG1QYXJhbS5mbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdylcblx0XHQ6IHRydWU7XG5cblx0aWYgKCFiRXhlY3V0ZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkRyYWZ0IGNyZWF0aW9uIHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0fVxuXHRsZXQgb3BlbmluZ1NpYmxpbmdDb250ZXh0ID0gZmFsc2U7XG5cdHRyeSB7XG5cdFx0bGV0IG9EcmFmdENvbnRleHQ6IENvbnRleHQgfCBudWxsID0gbnVsbDtcblx0XHR0cnkge1xuXHRcdFx0b0RyYWZ0Q29udGV4dCA9IGF3YWl0IGRyYWZ0LmV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93KTtcblx0XHR9IGNhdGNoIChvUmVzcG9uc2U6IGFueSkge1xuXHRcdFx0Ly9Pbmx5IGNhbGwgYmFjayBpZiBlcnJvciA0MDlcblx0XHRcdGlmIChiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyAmJiBvUmVzcG9uc2Uuc3RhdHVzID09PSA0MDkpIHtcblx0XHRcdFx0aWYgKEFjdGl2aXR5U3luYy5pc0NvbGxhYm9yYXRpb25FbmFibGVkKG1QYXJhbWV0ZXJzLm9WaWV3KSkge1xuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc2libGluZ0luZm8gPSBhd2FpdCBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSAobVBhcmFtZXRlcnMub1ZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIGFueSkuX3JvdXRpbmcuX2NyZWF0ZUJpbmRpbmdDb250ZXh0KFxuXHRcdFx0XHRcdFx0c2libGluZ0luZm8/LnRhcmdldENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0b3BlbmluZ1NpYmxpbmdDb250ZXh0ID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm4gc2libGluZ0NvbnRleHQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0RyYWZ0Q29udGV4dCA9IGF3YWl0IG92ZXJ3cml0ZU9uRGVtYW5kKFxuXHRcdFx0XHRcdFx0bVBhcmFtLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQgPyBtUGFyYW0uZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZCgpIDogdHJ1ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihvUmVzcG9uc2UpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAob3BlbmluZ1NpYmxpbmdDb250ZXh0KSB7XG5cdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dDtcblx0XHR9XG5cblx0XHRvRHJhZnRDb250ZXh0ID1cblx0XHRcdG9EcmFmdENvbnRleHQgJiYgbVBhcmFtLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuXHRcdFx0XHQ/IG1QYXJhbS5mbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQob0NvbnRleHQsIG9EcmFmdENvbnRleHQpXG5cdFx0XHRcdDogb0RyYWZ0Q29udGV4dDtcblxuXHRcdGlmIChvRHJhZnRDb250ZXh0KSB7XG5cdFx0XHRjb25zdCBzRWRpdEFjdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9EcmFmdENvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElUKTtcblx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0cyA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzRWRpdEFjdGlvbk5hbWUsIG9EcmFmdENvbnRleHQpO1xuXHRcdFx0aWYgKG9TaWRlRWZmZWN0cz8udHJpZ2dlckFjdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0XHRhd2FpdCBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck9EYXRhQWN0aW9uKG9TaWRlRWZmZWN0cywgb0RyYWZ0Q29udGV4dCk7XG5cblx0XHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdH0gY2F0Y2ggKGV4YzogYW55KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGV4Yyk7XG5cdH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBhY3RpdmUgZG9jdW1lbnQgZnJvbSBhIGRyYWZ0IGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjaG9yZW9ncmFwaHkgZGVmaW5lZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjYWN0aXZhdGVEb2N1bWVudFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge3NhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgdGhhdCBhbGxvd3MgdmV0byBiZWZvcmUgY3JlYXRlIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suZm5BZnRlckFjdGl2YXRlRG9jdW1lbnR9IFttUGFyYW1ldGVycy5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW9uZyBhZnRlciBkb2N1bWVudCB3YXMgYWN0aXZhdGVkLlxuICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gYWN0aXZhdGVEb2N1bWVudChcblx0b0NvbnRleHQ6IGFueSxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtUGFyYW1ldGVyczogeyBmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQ/OiBhbnk7IGZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50PzogYW55IH1cbikge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBkcmFmdCBkb2N1bWVudCBpcyByZXF1aXJlZFwiKSk7XG5cdH1cblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50ID8gbVBhcmFtLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCkgOiB0cnVlKVxuXHRcdC50aGVuKGZ1bmN0aW9uIChiRXhlY3V0ZTogYW55KSB7XG5cdFx0XHRpZiAoIWJFeGVjdXRlKSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJBY3RpdmF0aW9uIG9mIHRoZSBkb2N1bWVudCB3YXMgYWJvcnRlZCBieSBleHRlbnNpb24gZm9yIGRvY3VtZW50OiBcIiArIG9Db250ZXh0LmdldFBhdGgoKSkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpKSB7XG5cdFx0XHRcdHJldHVybiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50KTtcblx0XHRcdH1cblxuXHRcdFx0LyogYWN0aXZhdGlvbiByZXF1aXJlcyBwcmVwYXJhdGlvbiAqL1xuXHRcdFx0Y29uc3Qgc0JhdGNoR3JvdXAgPSBcImRyYWZ0XCI7XG5cdFx0XHQvLyB3ZSB1c2UgdGhlIHNhbWUgYmF0Y2hHcm91cCB0byBmb3JjZSBwcmVwYXJlIGFuZCBhY3RpdmF0ZSBpbiBhIHNhbWUgYmF0Y2ggYnV0IHdpdGggZGlmZmVyZW50IGNoYW5nZXNldFxuXHRcdFx0Y29uc3Qgb1ByZXBhcmVQcm9taXNlID0gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQsIHNCYXRjaEdyb3VwKTtcblx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0JhdGNoR3JvdXApO1xuXG5cdFx0XHRjb25zdCBvQWN0aXZhdGVQcm9taXNlID0gZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihvQ29udGV4dCwgb0FwcENvbXBvbmVudCwgc0JhdGNoR3JvdXApO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW29QcmVwYXJlUHJvbWlzZSwgb0FjdGl2YXRlUHJvbWlzZV0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uICh2YWx1ZXM6IFthbnksIGFueV0pIHtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWVzWzFdO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGV4YzogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGV4Yyk7XG5cdFx0XHRcdH0pO1xuXHRcdH0pXG5cdFx0LnRoZW4oZnVuY3Rpb24gKG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0bVBhcmFtLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50ID8gbVBhcmFtLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0LCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KSA6IG9BY3RpdmVEb2N1bWVudENvbnRleHRcblx0XHRcdCk7XG5cdFx0fSlcblx0XHQuY2F0Y2goZnVuY3Rpb24gKGV4YzogYW55KSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXhjKTtcblx0XHR9KTtcbn1cbi8qKlxuICogSFRUUCBQT1NUIGNhbGwgd2hlbiBEcmFmdEFjdGlvbiBpcyBwcmVzZW50IGZvciBEcmFmdCBEZWxldGU7IEhUVFAgREVMRVRFIGZvciBEcmFmdCh3aGVuIG5vIERyYWZ0QWN0aW9uKVxuICogYW5kIEFjdGl2ZSBJbnN0YW5jZSB1c2VzIERFTEVURSBhbHdheXMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0I2RlbGV0ZURyYWZ0XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgZGlzY2FyZGVkXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge1Byb21pc2V9XG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZGVsZXRlRHJhZnQob0NvbnRleHQ6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRjb25zdCBzRGlzY2FyZEFjdGlvbiA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKSxcblx0XHRiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eTtcblxuXHRpZiAoYklzQWN0aXZlRW50aXR5IHx8ICghYklzQWN0aXZlRW50aXR5ICYmICFzRGlzY2FyZEFjdGlvbikpIHtcblx0XHQvL1VzZSBEZWxldGUgaW4gY2FzZSBvZiBhY3RpdmUgZW50aXR5IGFuZCBubyBkaXNjYXJkIGFjdGlvbiBhdmFpbGFibGUgZm9yIGRyYWZ0XG5cdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdHJldHVybiBvQ29udGV4dFxuXHRcdFx0XHQuZ2V0QmluZGluZygpXG5cdFx0XHRcdC5yZXNldENoYW5nZXMoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvL1VzZSBEaXNjYXJkIFBvc3QgQWN0aW9uIGlmIGl0IGlzIGEgZHJhZnQgZW50aXR5IGFuZCBkaXNjYXJkIGFjdGlvbiBleGlzdHNcblx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dCk7XG5cdH1cbn1cbmNvbnN0IGRyYWZ0ID0ge1xuXHRjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudDogY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQsXG5cdGFjdGl2YXRlRG9jdW1lbnQ6IGFjdGl2YXRlRG9jdW1lbnQsXG5cdGRlbGV0ZURyYWZ0OiBkZWxldGVEcmFmdCxcblx0ZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbjogZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbixcblx0Y29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbjogY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvblxufTtcblxuZXhwb3J0IGRlZmF1bHQgZHJhZnQ7XG4iXX0=