@sapui5/sap.fe.templates 1.146.0 → 1.148.0
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.
- package/package.json +1 -1
- package/src/sap/fe/templates/.library +1 -1
- package/src/sap/fe/templates/AnalyticalListPage/manifest.json +1 -1
- package/src/sap/fe/templates/ListReport/ExtensionAPI.js +1 -1
- package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +1 -1
- package/src/sap/fe/templates/ListReport/ListReport.view.xml +45 -10
- package/src/sap/fe/templates/ListReport/ListReportController.controller.js +43 -16
- package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +51 -15
- package/src/sap/fe/templates/ListReport/ListReportTemplating.js +39 -3
- package/src/sap/fe/templates/ListReport/ListReportTemplating.ts +35 -1
- package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +4 -1
- package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.ts +3 -0
- package/src/sap/fe/templates/ListReport/manifest.json +1 -1
- package/src/sap/fe/templates/ListReport/overrides/MessageHandler.js +3 -2
- package/src/sap/fe/templates/ListReport/overrides/MessageHandler.ts +2 -1
- package/src/sap/fe/templates/ObjectPage/Component.js +4 -2
- package/src/sap/fe/templates/ObjectPage/Component.ts +3 -1
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +163 -28
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +163 -23
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +246 -35
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +286 -42
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +32 -16
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +46 -33
- package/src/sap/fe/templates/ObjectPage/components/CollaborationDiscardDialog.js +4 -1
- package/src/sap/fe/templates/ObjectPage/components/CollaborationDiscardDialog.tsx +1 -0
- package/src/sap/fe/templates/ObjectPage/components/CollaborationDraft.js +15 -4
- package/src/sap/fe/templates/ObjectPage/components/CollaborationDraft.tsx +11 -2
- package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +28 -1
- package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +31 -0
- package/src/sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper.js +72 -0
- package/src/sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper.ts +75 -0
- package/src/sap/fe/templates/ObjectPage/manifest.json +1 -15
- package/src/sap/fe/templates/ObjectPage/overrides/CollaborationManager.js +29 -20
- package/src/sap/fe/templates/ObjectPage/overrides/CollaborationManager.ts +28 -21
- package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +4 -3
- package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +4 -4
- package/src/sap/fe/templates/ObjectPage/overrides/Share.js +2 -2
- package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +93 -17
- package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +108 -22
- package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +12 -2
- package/src/sap/fe/templates/ObjectPage/view/fragments/EmphasizedFirstHeaderAction.fragment.xml +182 -0
- package/src/sap/fe/templates/ObjectPage/view/fragments/ExpandedHeading.fragment.xml +4 -4
- package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +4 -4
- package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderAddress.fragment.xml +1 -1
- package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderContact.fragment.xml +1 -1
- package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +1 -0
- package/src/sap/fe/templates/ObjectPage/view/fragments/Section.fragment.xml +2 -0
- package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContent.fragment.xml +18 -12
- package/src/sap/fe/templates/ObjectPage/view/fragments/SectionFormContent.fragment.xml +2 -0
- package/src/sap/fe/templates/ObjectPage/view/fragments/SectionMoreFormContent.fragment.xml +2 -0
- package/src/sap/fe/templates/library.js +1 -1
- package/src/sap/fe/templates/messagebundle.properties +1 -1
- package/src/sap/fe/templates/messagebundle_ar.properties +1 -1
- package/src/sap/fe/templates/messagebundle_bg.properties +1 -1
- package/src/sap/fe/templates/messagebundle_ca.properties +1 -1
- package/src/sap/fe/templates/messagebundle_cnr.properties +1 -1
- package/src/sap/fe/templates/messagebundle_cs.properties +1 -1
- package/src/sap/fe/templates/messagebundle_cy.properties +1 -1
- package/src/sap/fe/templates/messagebundle_da.properties +1 -1
- package/src/sap/fe/templates/messagebundle_de.properties +1 -1
- package/src/sap/fe/templates/messagebundle_el.properties +1 -1
- package/src/sap/fe/templates/messagebundle_en.properties +1 -1
- package/src/sap/fe/templates/messagebundle_en_GB.properties +1 -1
- package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +1 -1
- package/src/sap/fe/templates/messagebundle_es.properties +1 -1
- package/src/sap/fe/templates/messagebundle_es_MX.properties +1 -1
- package/src/sap/fe/templates/messagebundle_et.properties +1 -1
- package/src/sap/fe/templates/messagebundle_fi.properties +1 -1
- package/src/sap/fe/templates/messagebundle_fr.properties +1 -1
- package/src/sap/fe/templates/messagebundle_fr_CA.properties +1 -1
- package/src/sap/fe/templates/messagebundle_hi.properties +1 -1
- package/src/sap/fe/templates/messagebundle_hr.properties +1 -1
- package/src/sap/fe/templates/messagebundle_hu.properties +1 -1
- package/src/sap/fe/templates/messagebundle_id.properties +1 -1
- package/src/sap/fe/templates/messagebundle_it.properties +1 -1
- package/src/sap/fe/templates/messagebundle_iw.properties +2 -2
- package/src/sap/fe/templates/messagebundle_ja.properties +1 -1
- package/src/sap/fe/templates/messagebundle_kk.properties +1 -1
- package/src/sap/fe/templates/messagebundle_ko.properties +1 -1
- package/src/sap/fe/templates/messagebundle_lt.properties +1 -1
- package/src/sap/fe/templates/messagebundle_lv.properties +1 -1
- package/src/sap/fe/templates/messagebundle_mk.properties +1 -1
- package/src/sap/fe/templates/messagebundle_ms.properties +1 -1
- package/src/sap/fe/templates/messagebundle_nl.properties +1 -1
- package/src/sap/fe/templates/messagebundle_no.properties +2 -2
- package/src/sap/fe/templates/messagebundle_pl.properties +1 -1
- package/src/sap/fe/templates/messagebundle_pt.properties +1 -1
- package/src/sap/fe/templates/messagebundle_pt_PT.properties +1 -1
- package/src/sap/fe/templates/messagebundle_ro.properties +1 -1
- package/src/sap/fe/templates/messagebundle_ru.properties +1 -1
- package/src/sap/fe/templates/messagebundle_sh.properties +1 -1
- package/src/sap/fe/templates/messagebundle_sk.properties +1 -1
- package/src/sap/fe/templates/messagebundle_sl.properties +1 -1
- package/src/sap/fe/templates/messagebundle_sr.properties +1 -1
- package/src/sap/fe/templates/messagebundle_sv.properties +1 -1
- package/src/sap/fe/templates/messagebundle_th.properties +1 -1
- package/src/sap/fe/templates/messagebundle_tr.properties +1 -1
- package/src/sap/fe/templates/messagebundle_uk.properties +3 -3
- package/src/sap/fe/templates/messagebundle_vi.properties +1 -1
- package/src/sap/fe/templates/messagebundle_zh_CN.properties +1 -1
- package/src/sap/fe/templates/messagebundle_zh_TW.properties +1 -1
|
@@ -2,33 +2,109 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2026 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library"], function (Log, CommonUtils, KeepAliveHelper, ModelHelper, CoreLibrary) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/KeepAliveHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper"], function (Log, CommonUtils, KeepAliveHelper, ModelHelper, CoreLibrary, SectionNavigationHelper) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
+
var pollForSectionStability = SectionNavigationHelper.pollForSectionStability;
|
|
8
9
|
const VariantManagement = CoreLibrary.VariantManagement;
|
|
9
10
|
const opControlHandlers = {
|
|
10
11
|
retrieve: function (oOPLayout) {
|
|
12
|
+
const controller = this.getView().getController();
|
|
13
|
+
// Get subsection from controller's stored target subsection (set by onNavigateChange or targetControlId navigation)
|
|
14
|
+
const targetSubSection = controller.targetSubSection;
|
|
15
|
+
const selectedSection = oOPLayout.getSelectedSection();
|
|
16
|
+
const selectedSubSection = targetSubSection?.getId() ?? null;
|
|
11
17
|
return {
|
|
12
|
-
selectedSection
|
|
18
|
+
selectedSection,
|
|
19
|
+
selectedSubSection
|
|
13
20
|
};
|
|
14
21
|
},
|
|
15
22
|
apply: function (opLayout, controlState) {
|
|
16
23
|
const selectedSection = controlState?.selectedSection;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const controller = this.getView().getController();
|
|
21
|
-
controller.pageReady.waitPageReady().then(function () {
|
|
22
|
-
opLayout.setSelectedSection(selectedSection);
|
|
23
|
-
return undefined;
|
|
24
|
-
}).catch(err => {
|
|
25
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
26
|
-
Log.error(`FE V4 : OP : ViewState : ObjectPageLayout state couldn't be applied : ${message}`);
|
|
27
|
-
});
|
|
28
|
-
} else {
|
|
29
|
-
opLayout.setSelectedSection(selectedSection);
|
|
30
|
-
}
|
|
24
|
+
const selectedSubSection = controlState?.selectedSubSection;
|
|
25
|
+
if (!selectedSection) {
|
|
26
|
+
return;
|
|
31
27
|
}
|
|
28
|
+
|
|
29
|
+
// Check if the selected section is a section or subsection
|
|
30
|
+
const opSectionToSelect = opLayout.getSections().find(section => section.getId() === selectedSection);
|
|
31
|
+
const isSubSectionId = !opSectionToSelect && this.getView().byId(selectedSection)?.isA("sap.uxap.ObjectPageSubSection");
|
|
32
|
+
const controller = this.getView().getController();
|
|
33
|
+
|
|
34
|
+
// Determine the target to navigate to: prefer subsection if available
|
|
35
|
+
const navigationTarget = selectedSubSection ?? selectedSection;
|
|
36
|
+
const isNavigatingToSubSection = !!selectedSubSection || isSubSectionId;
|
|
37
|
+
|
|
38
|
+
// Determine target section ID for comparison (needed before pageReady)
|
|
39
|
+
const getTargetSectionId = () => {
|
|
40
|
+
if (isSubSectionId) {
|
|
41
|
+
return opLayout.getSections().find(s => s.getSubSections().some(ss => ss.getId() === navigationTarget))?.getId();
|
|
42
|
+
}
|
|
43
|
+
return selectedSection;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// Wait for pageReady, then navigate and poll for UX rules reset
|
|
47
|
+
controller.pageReady.waitPageReady().then(async () => {
|
|
48
|
+
const targetSectionId = getTargetSectionId();
|
|
49
|
+
|
|
50
|
+
// Skip if no valid target section (e.g., subsection's parent no longer exists)
|
|
51
|
+
// or already on target section - no navigation or polling needed
|
|
52
|
+
if (!targetSectionId || opLayout.getSelectedSection() === targetSectionId) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const performNavigation = () => {
|
|
56
|
+
// Guard: don't navigate if ObjectPageLayout has been destroyed
|
|
57
|
+
if (!opLayout.getDomRef()) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Guard: don't navigate if already on target section
|
|
62
|
+
const currentSection = opLayout.getSelectedSection();
|
|
63
|
+
if (currentSection === targetSectionId) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (isNavigatingToSubSection) {
|
|
67
|
+
// For subsection navigation, use navigateToSubSection which handles parent section activation
|
|
68
|
+
const localId = controller.getView().getLocalId(navigationTarget);
|
|
69
|
+
if (localId) {
|
|
70
|
+
controller.getExtensionAPI().navigateToSubSection(localId);
|
|
71
|
+
} else {
|
|
72
|
+
opLayout.scrollToSection(navigationTarget, 0);
|
|
73
|
+
}
|
|
74
|
+
} else if (opSectionToSelect && opSectionToSelect.getVisible() === true) {
|
|
75
|
+
// For section IDs, navigate if section is visible
|
|
76
|
+
opLayout.scrollToSection(selectedSection, 0);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// Skip navigation and polling on subsequent loads - only restore section during initial load
|
|
81
|
+
// This prevents overriding user's manual tab selection when state is restored later
|
|
82
|
+
const controllerWithFlag = controller;
|
|
83
|
+
if (controllerWithFlag.hasInitialLoadCompleted === true) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Navigate immediately
|
|
88
|
+
performNavigation();
|
|
89
|
+
|
|
90
|
+
// Skip polling if already on target section
|
|
91
|
+
if (opLayout.getSelectedSection() === targetSectionId) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Poll to detect UX rules reset during initial load
|
|
96
|
+
// Uses shared utility from helpers/SectionNavigationHelper.ts
|
|
97
|
+
await pollForSectionStability({
|
|
98
|
+
getSelectedSection: () => opLayout.getSelectedSection(),
|
|
99
|
+
targetSectionId,
|
|
100
|
+
onResetDetected: performNavigation,
|
|
101
|
+
guardCheck: () => !!opLayout.getDomRef()
|
|
102
|
+
});
|
|
103
|
+
return; // Required by linter rule promise/always-return
|
|
104
|
+
}).catch(() => {
|
|
105
|
+
// ViewState: ObjectPageLayout section state couldn't be applied
|
|
106
|
+
// Don't re-throw - allow page to continue even if navigation fails
|
|
107
|
+
});
|
|
32
108
|
},
|
|
33
109
|
refreshBinding: function (oOPLayout) {
|
|
34
110
|
const oBindingContext = oOPLayout.getBindingContext();
|
|
@@ -160,4 +236,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/K
|
|
|
160
236
|
};
|
|
161
237
|
return ViewStateExtensionOverride;
|
|
162
238
|
}, false);
|
|
163
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYXJpYW50TWFuYWdlbWVudCIsIkNvcmVMaWJyYXJ5Iiwib3BDb250cm9sSGFuZGxlcnMiLCJyZXRyaWV2ZSIsIm9PUExheW91dCIsInNlbGVjdGVkU2VjdGlvbiIsImdldFNlbGVjdGVkU2VjdGlvbiIsImFwcGx5Iiwib3BMYXlvdXQiLCJjb250cm9sU3RhdGUiLCJvcFNlY3Rpb25Ub1NlbGVjdCIsImdldFNlY3Rpb25zIiwiZmluZCIsInNlY3Rpb24iLCJnZXRJZCIsImdldFZpc2libGUiLCJjb250cm9sbGVyIiwiZ2V0VmlldyIsImdldENvbnRyb2xsZXIiLCJwYWdlUmVhZHkiLCJ3YWl0UGFnZVJlYWR5IiwidGhlbiIsInNldFNlbGVjdGVkU2VjdGlvbiIsInVuZGVmaW5lZCIsImNhdGNoIiwiZXJyIiwibWVzc2FnZSIsIkVycm9yIiwiU3RyaW5nIiwiTG9nIiwiZXJyb3IiLCJyZWZyZXNoQmluZGluZyIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0JpbmRpbmciLCJnZXRCaW5kaW5nIiwic01ldGFQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJzU3RyYXRlZ3kiLCJLZWVwQWxpdmVIZWxwZXIiLCJnZXRDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9yQ29udGV4dFBhdGgiLCJvTW9kZWwiLCJnZXRNb2RlbCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJvTmF2aWdhdGlvblByb3BlcnRpZXMiLCJDb21tb25VdGlscyIsImdldENvbnRleHRQYXRoUHJvcGVydGllcyIsIiRraW5kIiwiYU5hdlByb3BlcnRpZXNUb1JlcXVlc3QiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwiYVByZXYiLCJzTmF2UHJvcCIsIiRpc0NvbGxlY3Rpb24iLCJwdXNoIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJhUHJvcGVydGllcyIsIiRQcm9wZXJ0eVBhdGgiLCJzR3JvdXBJZCIsImdldEdyb3VwSWQiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJjb25jYXQiLCJyZWZyZXNoIiwiaW5mbyIsIlZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlIiwiX2dldE9iamVjdFBhZ2VMYXlvdXQiLCJ2aWV3IiwiX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sIiwiX2dldE9QU3RhdGVIYW5kbGVyIiwiY29udHJvbCIsInZpZXdPUCIsImNhbGwiLCJfZ2V0T1BSZWZyZXNoSGFuZGxlciIsImFkYXB0Q29udHJvbFN0YXRlSGFuZGxlciIsImNvbnRyb2xTdGF0ZUhhbmRsZXJzIiwib3BTdGF0ZUhhbmRsZXIiLCJhZGFwdEJpbmRpbmdSZWZyZXNoSGFuZGxlciIsImNvbnRyb2xSZWZyZXNoSGFuZGxlcnMiLCJhcHBseUluaXRpYWxTdGF0ZU9ubHkiLCJhZGFwdFN0YXRlQ29udHJvbHMiLCJhU3RhdGVDb250cm9scyIsIm9WaWV3IiwiYmFzZSIsIm9WaWV3RGF0YSIsImdldFZpZXdEYXRhIiwidmFyaWFudE1hbmFnZW1lbnQiLCJDb250cm9sIiwiUGFnZSIsIk5vbmUiLCJieUlkIiwiYWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzIiwiYUNvbnRyb2xzIiwic1JlZnJlc2hTdHJhdGVneSIsImdldFZpZXdSZWZyZXNoSW5mbyIsIm9Db250cm9sbGVyIiwiYUNvbnRyb2xzVG9SZWZyZXNoIiwib09iamVjdFBhZ2VDb250cm9sIiwiYVZpZXdDb250cm9scyIsIl9maW5kVGFibGVzIiwiZ2V0Q29udHJvbHNGb3JSZWZyZXNoIiwiYVByZXZDb250cm9scyIsIm9Db250cm9sIiwiaW5jbHVkZXMiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlZpZXdTdGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFZpZXdTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvVmlld1N0YXRlXCI7XG5pbXBvcnQgeyB0eXBlIENvbnRyb2xTdGF0ZUhhbmRsZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvVmlld1N0YXRlXCI7XG5pbXBvcnQgS2VlcEFsaXZlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0tlZXBBbGl2ZUhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgQ29yZUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVNlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsTmF2UHJvcGVydHkgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5cbmNvbnN0IFZhcmlhbnRNYW5hZ2VtZW50ID0gQ29yZUxpYnJhcnkuVmFyaWFudE1hbmFnZW1lbnQ7XG5leHBvcnQgdHlwZSBPYmplY3RQYWdlU3RhdGUgPSB7IHNlbGVjdGVkU2VjdGlvbjogc3RyaW5nIHwgbnVsbCB9O1xuXG5jb25zdCBvcENvbnRyb2xIYW5kbGVycyA9IHtcblx0cmV0cmlldmU6IGZ1bmN0aW9uIChvT1BMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQpOiBPYmplY3RQYWdlU3RhdGUge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZWxlY3RlZFNlY3Rpb246IG9PUExheW91dC5nZXRTZWxlY3RlZFNlY3Rpb24oKVxuXHRcdH07XG5cdH0sXG5cdGFwcGx5OiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBvcExheW91dDogT2JqZWN0UGFnZUxheW91dCwgY29udHJvbFN0YXRlPzogeyBzZWxlY3RlZFNlY3Rpb246IHN0cmluZyB8IG51bGwgfSk6IHZvaWQge1xuXHRcdGNvbnN0IHNlbGVjdGVkU2VjdGlvbiA9IGNvbnRyb2xTdGF0ZT8uc2VsZWN0ZWRTZWN0aW9uO1xuXHRcdGlmIChzZWxlY3RlZFNlY3Rpb24pIHtcblx0XHRcdGNvbnN0IG9wU2VjdGlvblRvU2VsZWN0ID0gb3BMYXlvdXQuZ2V0U2VjdGlvbnMoKS5maW5kKChzZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikgPT4gc2VjdGlvbi5nZXRJZCgpID09PSBzZWxlY3RlZFNlY3Rpb24pO1xuXHRcdFx0aWYgKG9wU2VjdGlvblRvU2VsZWN0Py5nZXRWaXNpYmxlKCkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG5cdFx0XHRcdGNvbnRyb2xsZXIucGFnZVJlYWR5XG5cdFx0XHRcdFx0LndhaXRQYWdlUmVhZHkoKVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRcdG9wTGF5b3V0LnNldFNlbGVjdGVkU2VjdGlvbihzZWxlY3RlZFNlY3Rpb24pO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoZXJyOiB1bmtub3duKTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBGRSBWNCA6IE9QIDogVmlld1N0YXRlIDogT2JqZWN0UGFnZUxheW91dCBzdGF0ZSBjb3VsZG4ndCBiZSBhcHBsaWVkIDogJHttZXNzYWdlfWApO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3BMYXlvdXQuc2V0U2VsZWN0ZWRTZWN0aW9uKHNlbGVjdGVkU2VjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRyZWZyZXNoQmluZGluZzogZnVuY3Rpb24gKG9PUExheW91dDogT2JqZWN0UGFnZUxheW91dCk6IHZvaWQge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9PUExheW91dC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0JpbmRpbmdDb250ZXh0ICYmIG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0aWYgKG9CaW5kaW5nKSB7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBNb2RlbEhlbHBlci5nZXRNZXRhUGF0aEZvckNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdGNvbnN0IHNTdHJhdGVneSA9IEtlZXBBbGl2ZUhlbHBlci5nZXRDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9yQ29udGV4dFBhdGgob09QTGF5b3V0LCBzTWV0YVBhdGgpO1xuXHRcdFx0aWYgKHNTdHJhdGVneSA9PT0gXCJzZWxmXCIpIHtcblx0XHRcdFx0Ly8gUmVmcmVzaCBtYWluIGNvbnRleHQgYW5kIDEtMSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgb3IgT1Bcblx0XHRcdFx0Y29uc3Qgb01vZGVsID0gb0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0XHRvTmF2aWdhdGlvblByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIE1ldGFNb2RlbE5hdlByb3BlcnR5PiA9XG5cdFx0XHRcdFx0XHQoQ29tbW9uVXRpbHMuZ2V0Q29udGV4dFBhdGhQcm9wZXJ0aWVzKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCwge1xuXHRcdFx0XHRcdFx0XHQka2luZDogXCJOYXZpZ2F0aW9uUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0fSkgYXMgUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsTmF2UHJvcGVydHk+KSB8fCB7fSxcblx0XHRcdFx0XHRhTmF2UHJvcGVydGllc1RvUmVxdWVzdCA9IE9iamVjdC5rZXlzKG9OYXZpZ2F0aW9uUHJvcGVydGllcykucmVkdWNlKGZ1bmN0aW9uIChcblx0XHRcdFx0XHRcdGFQcmV2OiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgfVtdLFxuXHRcdFx0XHRcdFx0c05hdlByb3A6IHN0cmluZ1xuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0aWYgKG9OYXZpZ2F0aW9uUHJvcGVydGllc1tzTmF2UHJvcF0uJGlzQ29sbGVjdGlvbiAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0XHRhUHJldi5wdXNoKHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNOYXZQcm9wIH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIGFQcmV2O1xuXHRcdFx0XHRcdH0sIFtdKSxcblx0XHRcdFx0XHRhUHJvcGVydGllczogKHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyB9IHwgeyAkUHJvcGVydHlQYXRoOiBzdHJpbmcgfSlbXSA9IFt7ICRQcm9wZXJ0eVBhdGg6IFwiKlwiIH1dLFxuXHRcdFx0XHRcdHNHcm91cElkID0gb0JpbmRpbmcuZ2V0R3JvdXBJZCgpO1xuXG5cdFx0XHRcdG9CaW5kaW5nQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoYVByb3BlcnRpZXMuY29uY2F0KGFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0KSwgc0dyb3VwSWQpO1xuXHRcdFx0fSBlbHNlIGlmIChzU3RyYXRlZ3kgPT09IFwiaW5jbHVkaW5nRGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdC8vIENvbXBsZXRlIHJlZnJlc2hcblx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRMb2cuaW5mbyhgT2JqZWN0UGFnZTogJHtvT1BMYXlvdXQuZ2V0SWQoKX0gd2FzIG5vdCByZWZyZXNoZWQuIE5vIGJpbmRpbmcgZm91bmQhYCk7XG5cdFx0fVxuXHR9XG59O1xuXG5jb25zdCBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZSA9IHtcblx0X2dldE9iamVjdFBhZ2VMYXlvdXQ6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUpOiBPYmplY3RQYWdlTGF5b3V0IHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyO1xuXHRcdHJldHVybiBjb250cm9sbGVyLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHN0YXRlIGhhbmRsZXIgZm9yIE9iamVjdFBhZ2VMYXlvdXQgaW4gdmlldy5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgZm9yIHN0YXRlIGludGVyYWN0aW9uXG5cdCAqIEByZXR1cm5zIFN0YXRlIGhhbmRsZXJcblx0ICovXG5cdF9nZXRPUFN0YXRlSGFuZGxlcjogZnVuY3Rpb24gKFxuXHRcdHRoaXM6IFZpZXdTdGF0ZSxcblx0XHRjb250cm9sOiBNYW5hZ2VkT2JqZWN0XG5cdCk6IENvbnRyb2xTdGF0ZUhhbmRsZXI8T2JqZWN0UGFnZUxheW91dCwgT2JqZWN0UGFnZVN0YXRlPiB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgdmlld09QID0gVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUuX2dldE9iamVjdFBhZ2VMYXlvdXQuY2FsbCh0aGlzKTtcblx0XHRpZiAodmlld09QID09PSBjb250cm9sKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRyZXRyaWV2ZTogb3BDb250cm9sSGFuZGxlcnMucmV0cmlldmUsXG5cdFx0XHRcdGFwcGx5OiBvcENvbnRyb2xIYW5kbGVycy5hcHBseVxuXHRcdFx0fTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgcmVmcmVzaCBoYW5kbGVyIGZvciBPYmplY3RQYWdlTGF5b3V0IGluIHZpZXcuXG5cdCAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIGJlaW5nIHJlZnJlc2hlZFxuXHQgKiBAcmV0dXJucyBSZWZyZXNoIGhhbmRsZXJcblx0ICovXG5cdF9nZXRPUFJlZnJlc2hIYW5kbGVyOiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdGNvbnRyb2w6IE1hbmFnZWRPYmplY3Rcblx0KTogQ29udHJvbFN0YXRlSGFuZGxlcjxPYmplY3RQYWdlTGF5b3V0LCBPYmplY3RQYWdlU3RhdGU+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB2aWV3T1AgPSBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZS5fZ2V0T2JqZWN0UGFnZUxheW91dC5jYWxsKHRoaXMpO1xuXHRcdGlmICh2aWV3T1AgPT09IGNvbnRyb2wpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJlZnJlc2hCaW5kaW5nOiBvcENvbnRyb2xIYW5kbGVycy5yZWZyZXNoQmluZGluZ1xuXHRcdFx0fTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFBhc3MgdGhlIHN0YXRlIGhhbmRsZXJzIG9mIG9iamVjdCBwYWdlIHZpZXcgYWNjb3JkaW5nIHRvIHRoZSBjb250cm9sIGluIGNvbmNlcm4uXG5cdCAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIGZvciBzdGF0ZSBpbnRlcmFjdGlvblxuXHQgKiBAcGFyYW0gY29udHJvbFN0YXRlSGFuZGxlcnMgU3RhdGUgaGFuZGxlcnNcblx0ICovXG5cdGFkYXB0Q29udHJvbFN0YXRlSGFuZGxlcjogZnVuY3Rpb24gKFxuXHRcdHRoaXM6IFZpZXdTdGF0ZSxcblx0XHRjb250cm9sOiBNYW5hZ2VkT2JqZWN0LFxuXHRcdGNvbnRyb2xTdGF0ZUhhbmRsZXJzOiBDb250cm9sU3RhdGVIYW5kbGVyPE9iamVjdFBhZ2VMYXlvdXQsIE9iamVjdFBhZ2VTdGF0ZT5bXVxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBvcFN0YXRlSGFuZGxlciA9IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlLl9nZXRPUFN0YXRlSGFuZGxlci5jYWxsKHRoaXMsIGNvbnRyb2wpO1xuXHRcdGlmIChvcFN0YXRlSGFuZGxlcikge1xuXHRcdFx0Y29udHJvbFN0YXRlSGFuZGxlcnMucHVzaChvcFN0YXRlSGFuZGxlcik7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBQYXNzIHRoZSByZWZyZXNoIGhhbmRsZXJzIG9mIG9iamVjdCBwYWdlIHZpZXcgYWNjb3JkaW5nIHRvIHRoZSBjb250cm9sIGJlaW5nIHJlZnJlc2hlZC5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgYmVpbmcgcmVmcmVzaGVkXG5cdCAqIEBwYXJhbSBjb250cm9sUmVmcmVzaEhhbmRsZXJzIFJlZnJlc2ggaGFuZGxlcnNcblx0ICovXG5cdGFkYXB0QmluZGluZ1JlZnJlc2hIYW5kbGVyOiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdGNvbnRyb2w6IE1hbmFnZWRPYmplY3QsXG5cdFx0Y29udHJvbFJlZnJlc2hIYW5kbGVyczogQ29udHJvbFN0YXRlSGFuZGxlcjxPYmplY3RQYWdlTGF5b3V0LCBPYmplY3RQYWdlU3RhdGU+XG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9wU3RhdGVIYW5kbGVyID0gVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUuX2dldE9QUmVmcmVzaEhhbmRsZXIuY2FsbCh0aGlzLCBjb250cm9sKTtcblx0XHRpZiAob3BTdGF0ZUhhbmRsZXIpIHtcblx0XHQgICAgY29udHJvbFJlZnJlc2hIYW5kbGVycy5yZWZyZXNoQmluZGluZyA9IG9wU3RhdGVIYW5kbGVyLnJlZnJlc2hCaW5kaW5nO1xuXHRcdH1cblx0fSxcblxuXHRhcHBseUluaXRpYWxTdGF0ZU9ubHk6IGZ1bmN0aW9uICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cdGFkYXB0U3RhdGVDb250cm9sczogZnVuY3Rpb24gKHRoaXM6IFZpZXdTdGF0ZSwgYVN0YXRlQ29udHJvbHM6IENvbnRyb2xbXSk6IHZvaWQge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdG9WaWV3RGF0YSA9IG9WaWV3LmdldFZpZXdEYXRhKCk7XG5cdFx0c3dpdGNoIChvVmlld0RhdGEudmFyaWFudE1hbmFnZW1lbnQpIHtcblx0XHRcdGNhc2UgVmFyaWFudE1hbmFnZW1lbnQuQ29udHJvbDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50LlBhZ2U6XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50Lk5vbmU6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgdmFyaWFudCBzZXR0aW5nOiAke29WaWV3RGF0YS52YXJpYW50TWFuYWdlbWVudH1gKTtcblx0XHR9XG5cblx0XHRhU3RhdGVDb250cm9scy5wdXNoKG9WaWV3LmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBDb250cm9sKTtcblx0fSxcblx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBhQ29udHJvbHM6IENvbnRyb2xbXSk6IENvbnRyb2xbXSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLFxuXHRcdFx0c1JlZnJlc2hTdHJhdGVneSA9IEtlZXBBbGl2ZUhlbHBlci5nZXRWaWV3UmVmcmVzaEluZm8ob1ZpZXcpLFxuXHRcdFx0b0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0bGV0IGFDb250cm9sc1RvUmVmcmVzaDogQ29udHJvbFtdID0gW107XG5cblx0XHRpZiAoc1JlZnJlc2hTdHJhdGVneSkge1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2VDb250cm9sID0gKG9Db250cm9sbGVyIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaC5wdXNoKG9PYmplY3RQYWdlQ29udHJvbCk7XG5cdFx0fVxuXHRcdGlmIChzUmVmcmVzaFN0cmF0ZWd5ICE9PSBcImluY2x1ZGluZ0RlcGVuZGVudHNcIikge1xuXHRcdFx0Y29uc3QgYVZpZXdDb250cm9scyA9IChvQ29udHJvbGxlciBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuX2ZpbmRUYWJsZXMoKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaCA9IGFDb250cm9sc1RvUmVmcmVzaC5jb25jYXQoS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xzRm9yUmVmcmVzaChvVmlldywgYVZpZXdDb250cm9scykgfHwgW10pO1xuXHRcdH1cblx0XHRyZXR1cm4gYUNvbnRyb2xzVG9SZWZyZXNoLnJlZHVjZShmdW5jdGlvbiAoYVByZXZDb250cm9scywgb0NvbnRyb2wpIHtcblx0XHRcdGlmICghYVByZXZDb250cm9scy5pbmNsdWRlcyhvQ29udHJvbCkpIHtcblx0XHRcdFx0YVByZXZDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhUHJldkNvbnRyb2xzO1xuXHRcdH0sIGFDb250cm9scyk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0VBZUEsTUFBTUEsaUJBQWlCLEdBQUdDLFdBQVcsQ0FBQ0QsaUJBQWlCO0VBR3ZELE1BQU1FLGlCQUFpQixHQUFHO0lBQ3pCQyxRQUFRLEVBQUUsU0FBQUEsQ0FBVUMsU0FBMkIsRUFBbUI7TUFDakUsT0FBTztRQUNOQyxlQUFlLEVBQUVELFNBQVMsQ0FBQ0Usa0JBQWtCLENBQUM7TUFDL0MsQ0FBQztJQUNGLENBQUM7SUFDREMsS0FBSyxFQUFFLFNBQUFBLENBQTJCQyxRQUEwQixFQUFFQyxZQUFpRCxFQUFRO01BQ3RILE1BQU1KLGVBQWUsR0FBR0ksWUFBWSxFQUFFSixlQUFlO01BQ3JELElBQUlBLGVBQWUsRUFBRTtRQUNwQixNQUFNSyxpQkFBaUIsR0FBR0YsUUFBUSxDQUFDRyxXQUFXLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUVDLE9BQTBCLElBQUtBLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLENBQUMsS0FBS1QsZUFBZSxDQUFDO1FBQzFILElBQUlLLGlCQUFpQixFQUFFSyxVQUFVLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRTtVQUM5QyxNQUFNQyxVQUFVLEdBQUcsSUFBSSxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDQyxhQUFhLENBQUMsQ0FBeUI7VUFDekVGLFVBQVUsQ0FBQ0csU0FBUyxDQUNsQkMsYUFBYSxDQUFDLENBQUMsQ0FDZkMsSUFBSSxDQUFDLFlBQWtCO1lBQ3ZCYixRQUFRLENBQUNjLGtCQUFrQixDQUFDakIsZUFBZSxDQUFDO1lBQzVDLE9BQU9rQixTQUFTO1VBQ2pCLENBQUMsQ0FBQyxDQUNEQyxLQUFLLENBQUVDLEdBQVksSUFBVztZQUM5QixNQUFNQyxPQUFPLEdBQUdELEdBQUcsWUFBWUUsS0FBSyxHQUFHRixHQUFHLENBQUNDLE9BQU8sR0FBR0UsTUFBTSxDQUFDSCxHQUFHLENBQUM7WUFDaEVJLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLHlFQUF5RUosT0FBTyxFQUFFLENBQUM7VUFDOUYsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxNQUFNO1VBQ05sQixRQUFRLENBQUNjLGtCQUFrQixDQUFDakIsZUFBZSxDQUFDO1FBQzdDO01BQ0Q7SUFDRCxDQUFDO0lBQ0QwQixjQUFjLEVBQUUsU0FBQUEsQ0FBVTNCLFNBQTJCLEVBQVE7TUFDNUQsTUFBTTRCLGVBQWUsR0FBRzVCLFNBQVMsQ0FBQzZCLGlCQUFpQixDQUFDLENBQStCO01BQ25GLE1BQU1DLFFBQVEsR0FBR0YsZUFBZSxJQUFJQSxlQUFlLENBQUNHLFVBQVUsQ0FBQyxDQUFDO01BQ2hFLElBQUlELFFBQVEsRUFBRTtRQUNiLE1BQU1FLFNBQVMsR0FBR0MsV0FBVyxDQUFDQyxxQkFBcUIsQ0FBQ04sZUFBZSxDQUFDO1FBQ3BFLE1BQU1PLFNBQVMsR0FBR0MsZUFBZSxDQUFDQyx1Q0FBdUMsQ0FBQ3JDLFNBQVMsRUFBRWdDLFNBQVMsQ0FBQztRQUMvRixJQUFJRyxTQUFTLEtBQUssTUFBTSxFQUFFO1VBQ3pCO1VBQ0EsTUFBTUcsTUFBTSxHQUFHVixlQUFlLENBQUNXLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDQyxVQUFVLEdBQUdGLE1BQU0sQ0FBQ0csWUFBWSxDQUFDLENBQUM7WUFDbENDLHFCQUEyRCxHQUN6REMsV0FBVyxDQUFDQyx3QkFBd0IsQ0FBQ0osVUFBVSxFQUFFUixTQUFTLEVBQUU7Y0FDNURhLEtBQUssRUFBRTtZQUNSLENBQUMsQ0FBQyxJQUE2QyxDQUFDLENBQUM7WUFDbERDLHVCQUF1QixHQUFHQyxNQUFNLENBQUNDLElBQUksQ0FBQ04scUJBQXFCLENBQUMsQ0FBQ08sTUFBTSxDQUFDLFVBQ25FQyxLQUE0QyxFQUM1Q0MsUUFBZ0IsRUFDZjtjQUNELElBQUlULHFCQUFxQixDQUFDUyxRQUFRLENBQUMsQ0FBQ0MsYUFBYSxLQUFLLElBQUksRUFBRTtnQkFDM0RGLEtBQUssQ0FBQ0csSUFBSSxDQUFDO2tCQUFFQyx1QkFBdUIsRUFBRUg7Z0JBQVMsQ0FBQyxDQUFDO2NBQ2xEO2NBQ0EsT0FBT0QsS0FBSztZQUNiLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDTkssV0FBZ0YsR0FBRyxDQUFDO2NBQUVDLGFBQWEsRUFBRTtZQUFJLENBQUMsQ0FBQztZQUMzR0MsUUFBUSxHQUFHM0IsUUFBUSxDQUFDNEIsVUFBVSxDQUFDLENBQUM7VUFFakM5QixlQUFlLENBQUMrQixrQkFBa0IsQ0FBQ0osV0FBVyxDQUFDSyxNQUFNLENBQUNkLHVCQUF1QixDQUFDLEVBQUVXLFFBQVEsQ0FBQztRQUMxRixDQUFDLE1BQU0sSUFBSXRCLFNBQVMsS0FBSyxxQkFBcUIsRUFBRTtVQUMvQztVQUNBTCxRQUFRLENBQUMrQixPQUFPLENBQUMsQ0FBQztRQUNuQjtNQUNELENBQUMsTUFBTTtRQUNOcEMsR0FBRyxDQUFDcUMsSUFBSSxDQUFDLGVBQWU5RCxTQUFTLENBQUNVLEtBQUssQ0FBQyxDQUFDLHVDQUF1QyxDQUFDO01BQ2xGO0lBQ0Q7RUFDRCxDQUFDO0VBRUQsTUFBTXFELDBCQUEwQixHQUFHO0lBQ2xDQyxvQkFBb0IsRUFBRSxTQUFBQSxDQUFBLEVBQTZDO01BQ2xFLE1BQU1DLElBQUksR0FBRyxJQUFJLENBQUNwRCxPQUFPLENBQUMsQ0FBQztNQUMzQixNQUFNRCxVQUFVLEdBQUdxRCxJQUFJLENBQUNuRCxhQUFhLENBQUMsQ0FBeUI7TUFDL0QsT0FBT0YsVUFBVSxDQUFDc0QsMkJBQTJCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtJQUNDQyxrQkFBa0IsRUFBRSxTQUFBQSxDQUVuQkMsT0FBc0IsRUFDK0M7TUFDckUsTUFBTUMsTUFBTSxHQUFHTiwwQkFBMEIsQ0FBQ0Msb0JBQW9CLENBQUNNLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDekUsSUFBSUQsTUFBTSxLQUFLRCxPQUFPLEVBQUU7UUFDdkIsT0FBTztVQUNOckUsUUFBUSxFQUFFRCxpQkFBaUIsQ0FBQ0MsUUFBUTtVQUNwQ0ksS0FBSyxFQUFFTCxpQkFBaUIsQ0FBQ0s7UUFDMUIsQ0FBQztNQUNGO0lBQ0QsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQ29FLG9CQUFvQixFQUFFLFNBQUFBLENBRXJCSCxPQUFzQixFQUMrQztNQUNyRSxNQUFNQyxNQUFNLEdBQUdOLDBCQUEwQixDQUFDQyxvQkFBb0IsQ0FBQ00sSUFBSSxDQUFDLElBQUksQ0FBQztNQUN6RSxJQUFJRCxNQUFNLEtBQUtELE9BQU8sRUFBRTtRQUN2QixPQUFPO1VBQ056QyxjQUFjLEVBQUU3QixpQkFBaUIsQ0FBQzZCO1FBQ25DLENBQUM7TUFDRjtJQUNELENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0M2Qyx3QkFBd0IsRUFBRSxTQUFBQSxDQUV6QkosT0FBc0IsRUFDdEJLLG9CQUE4RSxFQUN2RTtNQUNQLE1BQU1DLGNBQWMsR0FBR1gsMEJBQTBCLENBQUNJLGtCQUFrQixDQUFDRyxJQUFJLENBQUMsSUFBSSxFQUFFRixPQUFPLENBQUM7TUFDeEYsSUFBSU0sY0FBYyxFQUFFO1FBQ25CRCxvQkFBb0IsQ0FBQ3BCLElBQUksQ0FBQ3FCLGNBQWMsQ0FBQztNQUMxQztJQUNELENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLDBCQUEwQixFQUFFLFNBQUFBLENBRTNCUCxPQUFzQixFQUN0QlEsc0JBQThFLEVBQ3ZFO01BQ1AsTUFBTUYsY0FBYyxHQUFHWCwwQkFBMEIsQ0FBQ1Esb0JBQW9CLENBQUNELElBQUksQ0FBQyxJQUFJLEVBQUVGLE9BQU8sQ0FBQztNQUMxRixJQUFJTSxjQUFjLEVBQUU7UUFDaEJFLHNCQUFzQixDQUFDakQsY0FBYyxHQUFHK0MsY0FBYyxDQUFDL0MsY0FBYztNQUN6RTtJQUNELENBQUM7SUFFRGtELHFCQUFxQixFQUFFLFNBQUFBLENBQUEsRUFBcUI7TUFDM0MsT0FBTyxLQUFLO0lBQ2IsQ0FBQztJQUNEQyxrQkFBa0IsRUFBRSxTQUFBQSxDQUEyQkMsY0FBeUIsRUFBUTtNQUMvRSxNQUFNQyxLQUFLLEdBQUcsSUFBSSxDQUFDQyxJQUFJLENBQUNwRSxPQUFPLENBQUMsQ0FBQztRQUNoQ3FFLFNBQVMsR0FBR0YsS0FBSyxDQUFDRyxXQUFXLENBQUMsQ0FBQztNQUNoQyxRQUFRRCxTQUFTLENBQUNFLGlCQUFpQjtRQUNsQyxLQUFLeEYsaUJBQWlCLENBQUN5RixPQUFPO1VBQzdCO1FBQ0QsS0FBS3pGLGlCQUFpQixDQUFDMEYsSUFBSTtRQUMzQixLQUFLMUYsaUJBQWlCLENBQUMyRixJQUFJO1VBQzFCO1FBQ0Q7VUFDQyxNQUFNLElBQUloRSxLQUFLLENBQUMsOEJBQThCMkQsU0FBUyxDQUFDRSxpQkFBaUIsRUFBRSxDQUFDO01BQzlFO01BRUFMLGNBQWMsQ0FBQzFCLElBQUksQ0FBQzJCLEtBQUssQ0FBQ1EsSUFBSSxDQUFDLGdCQUFnQixDQUFZLENBQUM7SUFDN0QsQ0FBQztJQUNEQywyQkFBMkIsRUFBRSxTQUFBQSxDQUEyQkMsU0FBb0IsRUFBYTtNQUN4RixNQUFNVixLQUFLLEdBQUcsSUFBSSxDQUFDQyxJQUFJLENBQUNwRSxPQUFPLENBQUMsQ0FBQztRQUNoQzhFLGdCQUFnQixHQUFHdkQsZUFBZSxDQUFDd0Qsa0JBQWtCLENBQUNaLEtBQUssQ0FBQztRQUM1RGEsV0FBVyxHQUFHYixLQUFLLENBQUNsRSxhQUFhLENBQUMsQ0FBQztNQUNwQyxJQUFJZ0Ysa0JBQTZCLEdBQUcsRUFBRTtNQUV0QyxJQUFJSCxnQkFBZ0IsRUFBRTtRQUNyQixNQUFNSSxrQkFBa0IsR0FBSUYsV0FBVyxDQUEwQjNCLDJCQUEyQixDQUFDLENBQUM7UUFDOUY0QixrQkFBa0IsQ0FBQ3pDLElBQUksQ0FBQzBDLGtCQUFrQixDQUFDO01BQzVDO01BQ0EsSUFBSUosZ0JBQWdCLEtBQUsscUJBQXFCLEVBQUU7UUFDL0MsTUFBTUssYUFBYSxHQUFJSCxXQUFXLENBQTBCSSxXQUFXLENBQUMsQ0FBQztRQUN6RUgsa0JBQWtCLEdBQUdBLGtCQUFrQixDQUFDbEMsTUFBTSxDQUFDeEIsZUFBZSxDQUFDOEQscUJBQXFCLENBQUNsQixLQUFLLEVBQUVnQixhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7TUFDbEg7TUFDQSxPQUFPRixrQkFBa0IsQ0FBQzdDLE1BQU0sQ0FBQyxVQUFVa0QsYUFBYSxFQUFFQyxRQUFRLEVBQUU7UUFDbkUsSUFBSSxDQUFDRCxhQUFhLENBQUNFLFFBQVEsQ0FBQ0QsUUFBUSxDQUFDLEVBQUU7VUFDdENELGFBQWEsQ0FBQzlDLElBQUksQ0FBQytDLFFBQVEsQ0FBQztRQUM3QjtRQUNBLE9BQU9ELGFBQWE7TUFDckIsQ0FBQyxFQUFFVCxTQUFTLENBQUM7SUFDZDtFQUNELENBQUM7RUFBQyxPQUVhM0IsMEJBQTBCO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
239
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYXJpYW50TWFuYWdlbWVudCIsIkNvcmVMaWJyYXJ5Iiwib3BDb250cm9sSGFuZGxlcnMiLCJyZXRyaWV2ZSIsIm9PUExheW91dCIsImNvbnRyb2xsZXIiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsInRhcmdldFN1YlNlY3Rpb24iLCJzZWxlY3RlZFNlY3Rpb24iLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJzZWxlY3RlZFN1YlNlY3Rpb24iLCJnZXRJZCIsImFwcGx5Iiwib3BMYXlvdXQiLCJjb250cm9sU3RhdGUiLCJvcFNlY3Rpb25Ub1NlbGVjdCIsImdldFNlY3Rpb25zIiwiZmluZCIsInNlY3Rpb24iLCJpc1N1YlNlY3Rpb25JZCIsImJ5SWQiLCJpc0EiLCJuYXZpZ2F0aW9uVGFyZ2V0IiwiaXNOYXZpZ2F0aW5nVG9TdWJTZWN0aW9uIiwiZ2V0VGFyZ2V0U2VjdGlvbklkIiwicyIsImdldFN1YlNlY3Rpb25zIiwic29tZSIsInNzIiwicGFnZVJlYWR5Iiwid2FpdFBhZ2VSZWFkeSIsInRoZW4iLCJ0YXJnZXRTZWN0aW9uSWQiLCJwZXJmb3JtTmF2aWdhdGlvbiIsImdldERvbVJlZiIsImN1cnJlbnRTZWN0aW9uIiwibG9jYWxJZCIsImdldExvY2FsSWQiLCJnZXRFeHRlbnNpb25BUEkiLCJuYXZpZ2F0ZVRvU3ViU2VjdGlvbiIsInNjcm9sbFRvU2VjdGlvbiIsImdldFZpc2libGUiLCJjb250cm9sbGVyV2l0aEZsYWciLCJoYXNJbml0aWFsTG9hZENvbXBsZXRlZCIsInBvbGxGb3JTZWN0aW9uU3RhYmlsaXR5Iiwib25SZXNldERldGVjdGVkIiwiZ3VhcmRDaGVjayIsImNhdGNoIiwicmVmcmVzaEJpbmRpbmciLCJvQmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsInNNZXRhUGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0Iiwic1N0cmF0ZWd5IiwiS2VlcEFsaXZlSGVscGVyIiwiZ2V0Q29udHJvbFJlZnJlc2hTdHJhdGVneUZvckNvbnRleHRQYXRoIiwib01vZGVsIiwiZ2V0TW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwib05hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiQ29tbW9uVXRpbHMiLCJnZXRDb250ZXh0UGF0aFByb3BlcnRpZXMiLCIka2luZCIsImFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0IiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImFQcmV2Iiwic05hdlByb3AiLCIkaXNDb2xsZWN0aW9uIiwicHVzaCIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiYVByb3BlcnRpZXMiLCIkUHJvcGVydHlQYXRoIiwic0dyb3VwSWQiLCJnZXRHcm91cElkIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiY29uY2F0IiwicmVmcmVzaCIsIkxvZyIsImluZm8iLCJWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZSIsIl9nZXRPYmplY3RQYWdlTGF5b3V0IiwidmlldyIsIl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCIsIl9nZXRPUFN0YXRlSGFuZGxlciIsImNvbnRyb2wiLCJ2aWV3T1AiLCJjYWxsIiwiX2dldE9QUmVmcmVzaEhhbmRsZXIiLCJhZGFwdENvbnRyb2xTdGF0ZUhhbmRsZXIiLCJjb250cm9sU3RhdGVIYW5kbGVycyIsIm9wU3RhdGVIYW5kbGVyIiwiYWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXIiLCJjb250cm9sUmVmcmVzaEhhbmRsZXJzIiwiYXBwbHlJbml0aWFsU3RhdGVPbmx5IiwiYWRhcHRTdGF0ZUNvbnRyb2xzIiwiYVN0YXRlQ29udHJvbHMiLCJvVmlldyIsImJhc2UiLCJvVmlld0RhdGEiLCJnZXRWaWV3RGF0YSIsInZhcmlhbnRNYW5hZ2VtZW50IiwiQ29udHJvbCIsIlBhZ2UiLCJOb25lIiwiRXJyb3IiLCJhZGFwdEJpbmRpbmdSZWZyZXNoQ29udHJvbHMiLCJhQ29udHJvbHMiLCJzUmVmcmVzaFN0cmF0ZWd5IiwiZ2V0Vmlld1JlZnJlc2hJbmZvIiwib0NvbnRyb2xsZXIiLCJhQ29udHJvbHNUb1JlZnJlc2giLCJvT2JqZWN0UGFnZUNvbnRyb2wiLCJhVmlld0NvbnRyb2xzIiwiX2ZpbmRUYWJsZXMiLCJnZXRDb250cm9sc0ZvclJlZnJlc2giLCJhUHJldkNvbnRyb2xzIiwib0NvbnRyb2wiLCJpbmNsdWRlcyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVmlld1N0YXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCB7IHR5cGUgQ29udHJvbFN0YXRlSGFuZGxlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCBLZWVwQWxpdmVIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvS2VlcEFsaXZlSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBDb3JlTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHsgcG9sbEZvclNlY3Rpb25TdGFiaWxpdHkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL2hlbHBlcnMvU2VjdGlvbk5hdmlnYXRpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVNlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsTmF2UHJvcGVydHkgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5cbmNvbnN0IFZhcmlhbnRNYW5hZ2VtZW50ID0gQ29yZUxpYnJhcnkuVmFyaWFudE1hbmFnZW1lbnQ7XG5leHBvcnQgdHlwZSBPYmplY3RQYWdlU3RhdGUgPSB7IHNlbGVjdGVkU2VjdGlvbjogc3RyaW5nIHwgbnVsbDsgc2VsZWN0ZWRTdWJTZWN0aW9uPzogc3RyaW5nIHwgbnVsbCB9O1xuXG5jb25zdCBvcENvbnRyb2xIYW5kbGVycyA9IHtcblx0cmV0cmlldmU6IGZ1bmN0aW9uICh0aGlzOiBWaWV3U3RhdGUsIG9PUExheW91dDogT2JqZWN0UGFnZUxheW91dCk6IE9iamVjdFBhZ2VTdGF0ZSB7XG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcjtcblx0XHQvLyBHZXQgc3Vic2VjdGlvbiBmcm9tIGNvbnRyb2xsZXIncyBzdG9yZWQgdGFyZ2V0IHN1YnNlY3Rpb24gKHNldCBieSBvbk5hdmlnYXRlQ2hhbmdlIG9yIHRhcmdldENvbnRyb2xJZCBuYXZpZ2F0aW9uKVxuXHRcdGNvbnN0IHRhcmdldFN1YlNlY3Rpb24gPSAoY29udHJvbGxlciBhcyB1bmtub3duIGFzIHsgdGFyZ2V0U3ViU2VjdGlvbj86IHsgZ2V0SWQ6ICgpID0+IHN0cmluZyB9IH0pLnRhcmdldFN1YlNlY3Rpb247XG5cdFx0Y29uc3Qgc2VsZWN0ZWRTZWN0aW9uID0gb09QTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpO1xuXHRcdGNvbnN0IHNlbGVjdGVkU3ViU2VjdGlvbiA9IHRhcmdldFN1YlNlY3Rpb24/LmdldElkKCkgPz8gbnVsbDtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VsZWN0ZWRTZWN0aW9uLFxuXHRcdFx0c2VsZWN0ZWRTdWJTZWN0aW9uXG5cdFx0fTtcblx0fSxcblx0YXBwbHk6IGZ1bmN0aW9uIChcblx0XHR0aGlzOiBWaWV3U3RhdGUsXG5cdFx0b3BMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdFx0Y29udHJvbFN0YXRlPzogeyBzZWxlY3RlZFNlY3Rpb246IHN0cmluZyB8IG51bGw7IHNlbGVjdGVkU3ViU2VjdGlvbj86IHN0cmluZyB8IG51bGwgfVxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBzZWxlY3RlZFNlY3Rpb24gPSBjb250cm9sU3RhdGU/LnNlbGVjdGVkU2VjdGlvbjtcblx0XHRjb25zdCBzZWxlY3RlZFN1YlNlY3Rpb24gPSBjb250cm9sU3RhdGU/LnNlbGVjdGVkU3ViU2VjdGlvbjtcblxuXHRcdGlmICghc2VsZWN0ZWRTZWN0aW9uKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIHNlY3Rpb24gaXMgYSBzZWN0aW9uIG9yIHN1YnNlY3Rpb25cblx0XHRjb25zdCBvcFNlY3Rpb25Ub1NlbGVjdCA9IG9wTGF5b3V0LmdldFNlY3Rpb25zKCkuZmluZCgoc2VjdGlvbjogT2JqZWN0UGFnZVNlY3Rpb24pID0+IHNlY3Rpb24uZ2V0SWQoKSA9PT0gc2VsZWN0ZWRTZWN0aW9uKTtcblx0XHRjb25zdCBpc1N1YlNlY3Rpb25JZCA9ICFvcFNlY3Rpb25Ub1NlbGVjdCAmJiB0aGlzLmdldFZpZXcoKS5ieUlkKHNlbGVjdGVkU2VjdGlvbik/LmlzQShcInNhcC51eGFwLk9iamVjdFBhZ2VTdWJTZWN0aW9uXCIpO1xuXHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG5cblx0XHQvLyBEZXRlcm1pbmUgdGhlIHRhcmdldCB0byBuYXZpZ2F0ZSB0bzogcHJlZmVyIHN1YnNlY3Rpb24gaWYgYXZhaWxhYmxlXG5cdFx0Y29uc3QgbmF2aWdhdGlvblRhcmdldCA9IHNlbGVjdGVkU3ViU2VjdGlvbiA/PyBzZWxlY3RlZFNlY3Rpb247XG5cdFx0Y29uc3QgaXNOYXZpZ2F0aW5nVG9TdWJTZWN0aW9uID0gISFzZWxlY3RlZFN1YlNlY3Rpb24gfHwgaXNTdWJTZWN0aW9uSWQ7XG5cblx0XHQvLyBEZXRlcm1pbmUgdGFyZ2V0IHNlY3Rpb24gSUQgZm9yIGNvbXBhcmlzb24gIChuZWVkZWQgYmVmb3JlIHBhZ2VSZWFkeSlcblx0XHRjb25zdCBnZXRUYXJnZXRTZWN0aW9uSWQgPSAoKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdGlmIChpc1N1YlNlY3Rpb25JZCkge1xuXHRcdFx0XHRyZXR1cm4gb3BMYXlvdXRcblx0XHRcdFx0XHQuZ2V0U2VjdGlvbnMoKVxuXHRcdFx0XHRcdC5maW5kKChzKSA9PiBzLmdldFN1YlNlY3Rpb25zKCkuc29tZSgoc3MpID0+IHNzLmdldElkKCkgPT09IG5hdmlnYXRpb25UYXJnZXQpKVxuXHRcdFx0XHRcdD8uZ2V0SWQoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzZWxlY3RlZFNlY3Rpb247XG5cdFx0fTtcblxuXHRcdC8vIFdhaXQgZm9yIHBhZ2VSZWFkeSwgdGhlbiBuYXZpZ2F0ZSBhbmQgcG9sbCBmb3IgVVggcnVsZXMgcmVzZXRcblx0XHRjb250cm9sbGVyLnBhZ2VSZWFkeVxuXHRcdFx0LndhaXRQYWdlUmVhZHkoKVxuXHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0YXJnZXRTZWN0aW9uSWQgPSBnZXRUYXJnZXRTZWN0aW9uSWQoKTtcblxuXHRcdFx0XHQvLyBTa2lwIGlmIG5vIHZhbGlkIHRhcmdldCBzZWN0aW9uIChlLmcuLCBzdWJzZWN0aW9uJ3MgcGFyZW50IG5vIGxvbmdlciBleGlzdHMpXG5cdFx0XHRcdC8vIG9yIGFscmVhZHkgb24gdGFyZ2V0IHNlY3Rpb24gLSBubyBuYXZpZ2F0aW9uIG9yIHBvbGxpbmcgbmVlZGVkXG5cdFx0XHRcdGlmICghdGFyZ2V0U2VjdGlvbklkIHx8IG9wTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpID09PSB0YXJnZXRTZWN0aW9uSWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBwZXJmb3JtTmF2aWdhdGlvbiA9ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHQvLyBHdWFyZDogZG9uJ3QgbmF2aWdhdGUgaWYgT2JqZWN0UGFnZUxheW91dCBoYXMgYmVlbiBkZXN0cm95ZWRcblx0XHRcdFx0XHRpZiAoIW9wTGF5b3V0LmdldERvbVJlZigpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gR3VhcmQ6IGRvbid0IG5hdmlnYXRlIGlmIGFscmVhZHkgb24gdGFyZ2V0IHNlY3Rpb25cblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VjdGlvbiA9IG9wTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpO1xuXHRcdFx0XHRcdGlmIChjdXJyZW50U2VjdGlvbiA9PT0gdGFyZ2V0U2VjdGlvbklkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGlzTmF2aWdhdGluZ1RvU3ViU2VjdGlvbikge1xuXHRcdFx0XHRcdFx0Ly8gRm9yIHN1YnNlY3Rpb24gbmF2aWdhdGlvbiwgdXNlIG5hdmlnYXRlVG9TdWJTZWN0aW9uIHdoaWNoIGhhbmRsZXMgcGFyZW50IHNlY3Rpb24gYWN0aXZhdGlvblxuXHRcdFx0XHRcdFx0Y29uc3QgbG9jYWxJZCA9IGNvbnRyb2xsZXIuZ2V0VmlldygpLmdldExvY2FsSWQobmF2aWdhdGlvblRhcmdldCk7XG5cdFx0XHRcdFx0XHRpZiAobG9jYWxJZCkge1xuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLmdldEV4dGVuc2lvbkFQSSgpLm5hdmlnYXRlVG9TdWJTZWN0aW9uKGxvY2FsSWQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b3BMYXlvdXQuc2Nyb2xsVG9TZWN0aW9uKG5hdmlnYXRpb25UYXJnZXQsIDApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAob3BTZWN0aW9uVG9TZWxlY3QgJiYgb3BTZWN0aW9uVG9TZWxlY3QuZ2V0VmlzaWJsZSgpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHQvLyBGb3Igc2VjdGlvbiBJRHMsIG5hdmlnYXRlIGlmIHNlY3Rpb24gaXMgdmlzaWJsZVxuXHRcdFx0XHRcdFx0b3BMYXlvdXQuc2Nyb2xsVG9TZWN0aW9uKHNlbGVjdGVkU2VjdGlvbiwgMCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIFNraXAgbmF2aWdhdGlvbiBhbmQgcG9sbGluZyBvbiBzdWJzZXF1ZW50IGxvYWRzIC0gb25seSByZXN0b3JlIHNlY3Rpb24gZHVyaW5nIGluaXRpYWwgbG9hZFxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIG92ZXJyaWRpbmcgdXNlcidzIG1hbnVhbCB0YWIgc2VsZWN0aW9uIHdoZW4gc3RhdGUgaXMgcmVzdG9yZWQgbGF0ZXJcblx0XHRcdFx0Y29uc3QgY29udHJvbGxlcldpdGhGbGFnID0gY29udHJvbGxlciBhcyB1bmtub3duIGFzIHsgaGFzSW5pdGlhbExvYWRDb21wbGV0ZWQ/OiBib29sZWFuIH07XG5cdFx0XHRcdGlmIChjb250cm9sbGVyV2l0aEZsYWcuaGFzSW5pdGlhbExvYWRDb21wbGV0ZWQgPT09IHRydWUpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBOYXZpZ2F0ZSBpbW1lZGlhdGVseVxuXHRcdFx0XHRwZXJmb3JtTmF2aWdhdGlvbigpO1xuXG5cdFx0XHRcdC8vIFNraXAgcG9sbGluZyBpZiBhbHJlYWR5IG9uIHRhcmdldCBzZWN0aW9uXG5cdFx0XHRcdGlmIChvcExheW91dC5nZXRTZWxlY3RlZFNlY3Rpb24oKSA9PT0gdGFyZ2V0U2VjdGlvbklkKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUG9sbCB0byBkZXRlY3QgVVggcnVsZXMgcmVzZXQgZHVyaW5nIGluaXRpYWwgbG9hZFxuXHRcdFx0XHQvLyBVc2VzIHNoYXJlZCB1dGlsaXR5IGZyb20gaGVscGVycy9TZWN0aW9uTmF2aWdhdGlvbkhlbHBlci50c1xuXHRcdFx0XHRhd2FpdCBwb2xsRm9yU2VjdGlvblN0YWJpbGl0eSh7XG5cdFx0XHRcdFx0Z2V0U2VsZWN0ZWRTZWN0aW9uOiAoKSA9PiBvcExheW91dC5nZXRTZWxlY3RlZFNlY3Rpb24oKSxcblx0XHRcdFx0XHR0YXJnZXRTZWN0aW9uSWQsXG5cdFx0XHRcdFx0b25SZXNldERldGVjdGVkOiBwZXJmb3JtTmF2aWdhdGlvbixcblx0XHRcdFx0XHRndWFyZENoZWNrOiAoKSA9PiAhIW9wTGF5b3V0LmdldERvbVJlZigpXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47IC8vIFJlcXVpcmVkIGJ5IGxpbnRlciBydWxlIHByb21pc2UvYWx3YXlzLXJldHVyblxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdC8vIFZpZXdTdGF0ZTogT2JqZWN0UGFnZUxheW91dCBzZWN0aW9uIHN0YXRlIGNvdWxkbid0IGJlIGFwcGxpZWRcblx0XHRcdFx0Ly8gRG9uJ3QgcmUtdGhyb3cgLSBhbGxvdyBwYWdlIHRvIGNvbnRpbnVlIGV2ZW4gaWYgbmF2aWdhdGlvbiBmYWlsc1xuXHRcdFx0fSk7XG5cdH0sXG5cdHJlZnJlc2hCaW5kaW5nOiBmdW5jdGlvbiAob09QTGF5b3V0OiBPYmplY3RQYWdlTGF5b3V0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb09QTGF5b3V0LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQmluZGluZ0NvbnRleHQgJiYgb0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRpZiAob0JpbmRpbmcpIHtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgc1N0cmF0ZWd5ID0gS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JDb250ZXh0UGF0aChvT1BMYXlvdXQsIHNNZXRhUGF0aCk7XG5cdFx0XHRpZiAoc1N0cmF0ZWd5ID09PSBcInNlbGZcIikge1xuXHRcdFx0XHQvLyBSZWZyZXNoIG1haW4gY29udGV4dCBhbmQgMS0xIG5hdmlnYXRpb24gcHJvcGVydGllcyBvciBPUFxuXHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgTWV0YU1vZGVsTmF2UHJvcGVydHk+ID1cblx0XHRcdFx0XHRcdChDb21tb25VdGlscy5nZXRDb250ZXh0UGF0aFByb3BlcnRpZXMob01ldGFNb2RlbCwgc01ldGFQYXRoLCB7XG5cdFx0XHRcdFx0XHRcdCRraW5kOiBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiXG5cdFx0XHRcdFx0XHR9KSBhcyBSZWNvcmQ8c3RyaW5nLCBNZXRhTW9kZWxOYXZQcm9wZXJ0eT4pIHx8IHt9LFxuXHRcdFx0XHRcdGFOYXZQcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gT2JqZWN0LmtleXMob05hdmlnYXRpb25Qcm9wZXJ0aWVzKS5yZWR1Y2UoZnVuY3Rpb24gKFxuXHRcdFx0XHRcdFx0YVByZXY6IHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10sXG5cdFx0XHRcdFx0XHRzTmF2UHJvcDogc3RyaW5nXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRpZiAob05hdmlnYXRpb25Qcm9wZXJ0aWVzW3NOYXZQcm9wXS4kaXNDb2xsZWN0aW9uICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdGFQcmV2LnB1c2goeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc05hdlByb3AgfSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gYVByZXY7XG5cdFx0XHRcdFx0fSwgW10pLFxuXHRcdFx0XHRcdGFQcm9wZXJ0aWVzOiAoeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nIH0gfCB7ICRQcm9wZXJ0eVBhdGg6IHN0cmluZyB9KVtdID0gW3sgJFByb3BlcnR5UGF0aDogXCIqXCIgfV0sXG5cdFx0XHRcdFx0c0dyb3VwSWQgPSBvQmluZGluZy5nZXRHcm91cElkKCk7XG5cblx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhhUHJvcGVydGllcy5jb25jYXQoYU5hdlByb3BlcnRpZXNUb1JlcXVlc3QpLCBzR3JvdXBJZCk7XG5cdFx0XHR9IGVsc2UgaWYgKHNTdHJhdGVneSA9PT0gXCJpbmNsdWRpbmdEZXBlbmRlbnRzXCIpIHtcblx0XHRcdFx0Ly8gQ29tcGxldGUgcmVmcmVzaFxuXHRcdFx0XHRvQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdExvZy5pbmZvKGBPYmplY3RQYWdlOiAke29PUExheW91dC5nZXRJZCgpfSB3YXMgbm90IHJlZnJlc2hlZC4gTm8gYmluZGluZyBmb3VuZCFgKTtcblx0XHR9XG5cdH1cbn07XG5cbmNvbnN0IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlID0ge1xuXHRfZ2V0T2JqZWN0UGFnZUxheW91dDogZnVuY3Rpb24gKHRoaXM6IFZpZXdTdGF0ZSk6IE9iamVjdFBhZ2VMYXlvdXQge1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBjb250cm9sbGVyID0gdmlldy5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgc3RhdGUgaGFuZGxlciBmb3IgT2JqZWN0UGFnZUxheW91dCBpbiB2aWV3LlxuXHQgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCBmb3Igc3RhdGUgaW50ZXJhY3Rpb25cblx0ICogQHJldHVybnMgU3RhdGUgaGFuZGxlclxuXHQgKi9cblx0X2dldE9QU3RhdGVIYW5kbGVyOiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdGNvbnRyb2w6IE1hbmFnZWRPYmplY3Rcblx0KTogQ29udHJvbFN0YXRlSGFuZGxlcjxPYmplY3RQYWdlTGF5b3V0LCBPYmplY3RQYWdlU3RhdGU+IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCB2aWV3T1AgPSBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZS5fZ2V0T2JqZWN0UGFnZUxheW91dC5jYWxsKHRoaXMpO1xuXHRcdGlmICh2aWV3T1AgPT09IGNvbnRyb2wpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJldHJpZXZlOiBvcENvbnRyb2xIYW5kbGVycy5yZXRyaWV2ZSxcblx0XHRcdFx0YXBwbHk6IG9wQ29udHJvbEhhbmRsZXJzLmFwcGx5XG5cdFx0XHR9O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSByZWZyZXNoIGhhbmRsZXIgZm9yIE9iamVjdFBhZ2VMYXlvdXQgaW4gdmlldy5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgYmVpbmcgcmVmcmVzaGVkXG5cdCAqIEByZXR1cm5zIFJlZnJlc2ggaGFuZGxlclxuXHQgKi9cblx0X2dldE9QUmVmcmVzaEhhbmRsZXI6IGZ1bmN0aW9uIChcblx0XHR0aGlzOiBWaWV3U3RhdGUsXG5cdFx0Y29udHJvbDogTWFuYWdlZE9iamVjdFxuXHQpOiBDb250cm9sU3RhdGVIYW5kbGVyPE9iamVjdFBhZ2VMYXlvdXQsIE9iamVjdFBhZ2VTdGF0ZT4gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHZpZXdPUCA9IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlLl9nZXRPYmplY3RQYWdlTGF5b3V0LmNhbGwodGhpcyk7XG5cdFx0aWYgKHZpZXdPUCA9PT0gY29udHJvbCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmVmcmVzaEJpbmRpbmc6IG9wQ29udHJvbEhhbmRsZXJzLnJlZnJlc2hCaW5kaW5nXG5cdFx0XHR9O1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUGFzcyB0aGUgc3RhdGUgaGFuZGxlcnMgb2Ygb2JqZWN0IHBhZ2UgdmlldyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wgaW4gY29uY2Vybi5cblx0ICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgZm9yIHN0YXRlIGludGVyYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250cm9sU3RhdGVIYW5kbGVycyBTdGF0ZSBoYW5kbGVyc1xuXHQgKi9cblx0YWRhcHRDb250cm9sU3RhdGVIYW5kbGVyOiBmdW5jdGlvbiAoXG5cdFx0dGhpczogVmlld1N0YXRlLFxuXHRcdGNvbnRyb2w6IE1hbmFnZWRPYmplY3QsXG5cdFx0Y29udHJvbFN0YXRlSGFuZGxlcnM6IENvbnRyb2xTdGF0ZUhhbmRsZXI8T2JqZWN0UGFnZUxheW91dCwgT2JqZWN0UGFnZVN0YXRlPltdXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IG9wU3RhdGVIYW5kbGVyID0gVmlld1N0YXRlRXh0ZW5zaW9uT3ZlcnJpZGUuX2dldE9QU3RhdGVIYW5kbGVyLmNhbGwodGhpcywgY29udHJvbCk7XG5cdFx0aWYgKG9wU3RhdGVIYW5kbGVyKSB7XG5cdFx0XHRjb250cm9sU3RhdGVIYW5kbGVycy5wdXNoKG9wU3RhdGVIYW5kbGVyKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFBhc3MgdGhlIHJlZnJlc2ggaGFuZGxlcnMgb2Ygb2JqZWN0IHBhZ2UgdmlldyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRyb2wgYmVpbmcgcmVmcmVzaGVkLlxuXHQgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCBiZWluZyByZWZyZXNoZWRcblx0ICogQHBhcmFtIGNvbnRyb2xSZWZyZXNoSGFuZGxlcnMgUmVmcmVzaCBoYW5kbGVyc1xuXHQgKi9cblx0YWRhcHRCaW5kaW5nUmVmcmVzaEhhbmRsZXI6IGZ1bmN0aW9uIChcblx0XHR0aGlzOiBWaWV3U3RhdGUsXG5cdFx0Y29udHJvbDogTWFuYWdlZE9iamVjdCxcblx0XHRjb250cm9sUmVmcmVzaEhhbmRsZXJzOiBDb250cm9sU3RhdGVIYW5kbGVyPE9iamVjdFBhZ2VMYXlvdXQsIE9iamVjdFBhZ2VTdGF0ZT5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3Qgb3BTdGF0ZUhhbmRsZXIgPSBWaWV3U3RhdGVFeHRlbnNpb25PdmVycmlkZS5fZ2V0T1BSZWZyZXNoSGFuZGxlci5jYWxsKHRoaXMsIGNvbnRyb2wpO1xuXHRcdGlmIChvcFN0YXRlSGFuZGxlcikge1xuXHRcdFx0Y29udHJvbFJlZnJlc2hIYW5kbGVycy5yZWZyZXNoQmluZGluZyA9IG9wU3RhdGVIYW5kbGVyLnJlZnJlc2hCaW5kaW5nO1xuXHRcdH1cblx0fSxcblxuXHRhcHBseUluaXRpYWxTdGF0ZU9ubHk6IGZ1bmN0aW9uICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cdGFkYXB0U3RhdGVDb250cm9sczogZnVuY3Rpb24gKHRoaXM6IFZpZXdTdGF0ZSwgYVN0YXRlQ29udHJvbHM6IENvbnRyb2xbXSk6IHZvaWQge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdG9WaWV3RGF0YSA9IG9WaWV3LmdldFZpZXdEYXRhKCk7XG5cdFx0c3dpdGNoIChvVmlld0RhdGEudmFyaWFudE1hbmFnZW1lbnQpIHtcblx0XHRcdGNhc2UgVmFyaWFudE1hbmFnZW1lbnQuQ29udHJvbDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50LlBhZ2U6XG5cdFx0XHRjYXNlIFZhcmlhbnRNYW5hZ2VtZW50Lk5vbmU6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgdmFyaWFudCBzZXR0aW5nOiAke29WaWV3RGF0YS52YXJpYW50TWFuYWdlbWVudH1gKTtcblx0XHR9XG5cblx0XHRhU3RhdGVDb250cm9scy5wdXNoKG9WaWV3LmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBDb250cm9sKTtcblx0fSxcblx0YWRhcHRCaW5kaW5nUmVmcmVzaENvbnRyb2xzOiBmdW5jdGlvbiAodGhpczogVmlld1N0YXRlLCBhQ29udHJvbHM6IENvbnRyb2xbXSk6IENvbnRyb2xbXSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpLFxuXHRcdFx0c1JlZnJlc2hTdHJhdGVneSA9IEtlZXBBbGl2ZUhlbHBlci5nZXRWaWV3UmVmcmVzaEluZm8ob1ZpZXcpLFxuXHRcdFx0b0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0bGV0IGFDb250cm9sc1RvUmVmcmVzaDogQ29udHJvbFtdID0gW107XG5cblx0XHRpZiAoc1JlZnJlc2hTdHJhdGVneSkge1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2VDb250cm9sID0gKG9Db250cm9sbGVyIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaC5wdXNoKG9PYmplY3RQYWdlQ29udHJvbCk7XG5cdFx0fVxuXHRcdGlmIChzUmVmcmVzaFN0cmF0ZWd5ICE9PSBcImluY2x1ZGluZ0RlcGVuZGVudHNcIikge1xuXHRcdFx0Y29uc3QgYVZpZXdDb250cm9scyA9IChvQ29udHJvbGxlciBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuX2ZpbmRUYWJsZXMoKTtcblx0XHRcdGFDb250cm9sc1RvUmVmcmVzaCA9IGFDb250cm9sc1RvUmVmcmVzaC5jb25jYXQoS2VlcEFsaXZlSGVscGVyLmdldENvbnRyb2xzRm9yUmVmcmVzaChvVmlldywgYVZpZXdDb250cm9scykgfHwgW10pO1xuXHRcdH1cblx0XHRyZXR1cm4gYUNvbnRyb2xzVG9SZWZyZXNoLnJlZHVjZShmdW5jdGlvbiAoYVByZXZDb250cm9scywgb0NvbnRyb2wpIHtcblx0XHRcdGlmICghYVByZXZDb250cm9scy5pbmNsdWRlcyhvQ29udHJvbCkpIHtcblx0XHRcdFx0YVByZXZDb250cm9scy5wdXNoKG9Db250cm9sKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhUHJldkNvbnRyb2xzO1xuXHRcdH0sIGFDb250cm9scyk7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFZpZXdTdGF0ZUV4dGVuc2lvbk92ZXJyaWRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztFQWdCQSxNQUFNQSxpQkFBaUIsR0FBR0MsV0FBVyxDQUFDRCxpQkFBaUI7RUFHdkQsTUFBTUUsaUJBQWlCLEdBQUc7SUFDekJDLFFBQVEsRUFBRSxTQUFBQSxDQUEyQkMsU0FBMkIsRUFBbUI7TUFDbEYsTUFBTUMsVUFBVSxHQUFHLElBQUksQ0FBQ0MsT0FBTyxDQUFDLENBQUMsQ0FBQ0MsYUFBYSxDQUFDLENBQXlCO01BQ3pFO01BQ0EsTUFBTUMsZ0JBQWdCLEdBQUlILFVBQVUsQ0FBK0RHLGdCQUFnQjtNQUNuSCxNQUFNQyxlQUFlLEdBQUdMLFNBQVMsQ0FBQ00sa0JBQWtCLENBQUMsQ0FBQztNQUN0RCxNQUFNQyxrQkFBa0IsR0FB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
|
|
@@ -5,6 +5,7 @@ import { type ControlStateHandler } from "sap/fe/core/controllerextensions/ViewS
|
|
|
5
5
|
import KeepAliveHelper from "sap/fe/core/helpers/KeepAliveHelper";
|
|
6
6
|
import ModelHelper from "sap/fe/core/helpers/ModelHelper";
|
|
7
7
|
import CoreLibrary from "sap/fe/core/library";
|
|
8
|
+
import { pollForSectionStability } from "sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper";
|
|
8
9
|
import type ObjectPageController from "sap/fe/templates/ObjectPage/ObjectPageController.controller";
|
|
9
10
|
import type ManagedObject from "sap/ui/base/ManagedObject";
|
|
10
11
|
import type Control from "sap/ui/core/Control";
|
|
@@ -14,34 +15,119 @@ import type ObjectPageSection from "sap/uxap/ObjectPageSection";
|
|
|
14
15
|
import type { MetaModelNavProperty } from "types/metamodel_types";
|
|
15
16
|
|
|
16
17
|
const VariantManagement = CoreLibrary.VariantManagement;
|
|
17
|
-
export type ObjectPageState = { selectedSection: string | null };
|
|
18
|
+
export type ObjectPageState = { selectedSection: string | null; selectedSubSection?: string | null };
|
|
18
19
|
|
|
19
20
|
const opControlHandlers = {
|
|
20
|
-
retrieve: function (oOPLayout: ObjectPageLayout): ObjectPageState {
|
|
21
|
+
retrieve: function (this: ViewState, oOPLayout: ObjectPageLayout): ObjectPageState {
|
|
22
|
+
const controller = this.getView().getController() as ObjectPageController;
|
|
23
|
+
// Get subsection from controller's stored target subsection (set by onNavigateChange or targetControlId navigation)
|
|
24
|
+
const targetSubSection = (controller as unknown as { targetSubSection?: { getId: () => string } }).targetSubSection;
|
|
25
|
+
const selectedSection = oOPLayout.getSelectedSection();
|
|
26
|
+
const selectedSubSection = targetSubSection?.getId() ?? null;
|
|
21
27
|
return {
|
|
22
|
-
selectedSection
|
|
28
|
+
selectedSection,
|
|
29
|
+
selectedSubSection
|
|
23
30
|
};
|
|
24
31
|
},
|
|
25
|
-
apply: function (
|
|
32
|
+
apply: function (
|
|
33
|
+
this: ViewState,
|
|
34
|
+
opLayout: ObjectPageLayout,
|
|
35
|
+
controlState?: { selectedSection: string | null; selectedSubSection?: string | null }
|
|
36
|
+
): void {
|
|
26
37
|
const selectedSection = controlState?.selectedSection;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
controller.pageReady
|
|
32
|
-
.waitPageReady()
|
|
33
|
-
.then(function (): void {
|
|
34
|
-
opLayout.setSelectedSection(selectedSection);
|
|
35
|
-
return undefined;
|
|
36
|
-
})
|
|
37
|
-
.catch((err: unknown): void => {
|
|
38
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
39
|
-
Log.error(`FE V4 : OP : ViewState : ObjectPageLayout state couldn't be applied : ${message}`);
|
|
40
|
-
});
|
|
41
|
-
} else {
|
|
42
|
-
opLayout.setSelectedSection(selectedSection);
|
|
43
|
-
}
|
|
38
|
+
const selectedSubSection = controlState?.selectedSubSection;
|
|
39
|
+
|
|
40
|
+
if (!selectedSection) {
|
|
41
|
+
return;
|
|
44
42
|
}
|
|
43
|
+
|
|
44
|
+
// Check if the selected section is a section or subsection
|
|
45
|
+
const opSectionToSelect = opLayout.getSections().find((section: ObjectPageSection) => section.getId() === selectedSection);
|
|
46
|
+
const isSubSectionId = !opSectionToSelect && this.getView().byId(selectedSection)?.isA("sap.uxap.ObjectPageSubSection");
|
|
47
|
+
const controller = this.getView().getController() as ObjectPageController;
|
|
48
|
+
|
|
49
|
+
// Determine the target to navigate to: prefer subsection if available
|
|
50
|
+
const navigationTarget = selectedSubSection ?? selectedSection;
|
|
51
|
+
const isNavigatingToSubSection = !!selectedSubSection || isSubSectionId;
|
|
52
|
+
|
|
53
|
+
// Determine target section ID for comparison (needed before pageReady)
|
|
54
|
+
const getTargetSectionId = (): string | undefined => {
|
|
55
|
+
if (isSubSectionId) {
|
|
56
|
+
return opLayout
|
|
57
|
+
.getSections()
|
|
58
|
+
.find((s) => s.getSubSections().some((ss) => ss.getId() === navigationTarget))
|
|
59
|
+
?.getId();
|
|
60
|
+
}
|
|
61
|
+
return selectedSection;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// Wait for pageReady, then navigate and poll for UX rules reset
|
|
65
|
+
controller.pageReady
|
|
66
|
+
.waitPageReady()
|
|
67
|
+
.then(async () => {
|
|
68
|
+
const targetSectionId = getTargetSectionId();
|
|
69
|
+
|
|
70
|
+
// Skip if no valid target section (e.g., subsection's parent no longer exists)
|
|
71
|
+
// or already on target section - no navigation or polling needed
|
|
72
|
+
if (!targetSectionId || opLayout.getSelectedSection() === targetSectionId) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const performNavigation = (): void => {
|
|
77
|
+
// Guard: don't navigate if ObjectPageLayout has been destroyed
|
|
78
|
+
if (!opLayout.getDomRef()) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Guard: don't navigate if already on target section
|
|
83
|
+
const currentSection = opLayout.getSelectedSection();
|
|
84
|
+
if (currentSection === targetSectionId) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (isNavigatingToSubSection) {
|
|
89
|
+
// For subsection navigation, use navigateToSubSection which handles parent section activation
|
|
90
|
+
const localId = controller.getView().getLocalId(navigationTarget);
|
|
91
|
+
if (localId) {
|
|
92
|
+
controller.getExtensionAPI().navigateToSubSection(localId);
|
|
93
|
+
} else {
|
|
94
|
+
opLayout.scrollToSection(navigationTarget, 0);
|
|
95
|
+
}
|
|
96
|
+
} else if (opSectionToSelect && opSectionToSelect.getVisible() === true) {
|
|
97
|
+
// For section IDs, navigate if section is visible
|
|
98
|
+
opLayout.scrollToSection(selectedSection, 0);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// Skip navigation and polling on subsequent loads - only restore section during initial load
|
|
103
|
+
// This prevents overriding user's manual tab selection when state is restored later
|
|
104
|
+
const controllerWithFlag = controller as unknown as { hasInitialLoadCompleted?: boolean };
|
|
105
|
+
if (controllerWithFlag.hasInitialLoadCompleted === true) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Navigate immediately
|
|
110
|
+
performNavigation();
|
|
111
|
+
|
|
112
|
+
// Skip polling if already on target section
|
|
113
|
+
if (opLayout.getSelectedSection() === targetSectionId) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Poll to detect UX rules reset during initial load
|
|
118
|
+
// Uses shared utility from helpers/SectionNavigationHelper.ts
|
|
119
|
+
await pollForSectionStability({
|
|
120
|
+
getSelectedSection: () => opLayout.getSelectedSection(),
|
|
121
|
+
targetSectionId,
|
|
122
|
+
onResetDetected: performNavigation,
|
|
123
|
+
guardCheck: () => !!opLayout.getDomRef()
|
|
124
|
+
});
|
|
125
|
+
return; // Required by linter rule promise/always-return
|
|
126
|
+
})
|
|
127
|
+
.catch(() => {
|
|
128
|
+
// ViewState: ObjectPageLayout section state couldn't be applied
|
|
129
|
+
// Don't re-throw - allow page to continue even if navigation fails
|
|
130
|
+
});
|
|
45
131
|
},
|
|
46
132
|
refreshBinding: function (oOPLayout: ObjectPageLayout): void {
|
|
47
133
|
const oBindingContext = oOPLayout.getBindingContext() as ODataV4Context | undefined;
|
|
@@ -150,7 +236,7 @@ const ViewStateExtensionOverride = {
|
|
|
150
236
|
): void {
|
|
151
237
|
const opStateHandler = ViewStateExtensionOverride._getOPRefreshHandler.call(this, control);
|
|
152
238
|
if (opStateHandler) {
|
|
153
|
-
|
|
239
|
+
controlRefreshHandlers.refreshBinding = opStateHandler.refreshBinding;
|
|
154
240
|
}
|
|
155
241
|
},
|
|
156
242
|
|
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
FE_MODEL: 'sap/fe/core/helpers/ModelHelper'
|
|
24
24
|
}"
|
|
25
25
|
>
|
|
26
|
+
<template:if test="{= !!${converterContext>header/emphasizedFirstActions} && !${converterContext>isDraftEnabled} }">
|
|
27
|
+
<core:Fragment fragmentName="sap.fe.templates.ObjectPage.view.fragments.EmphasizedFirstHeaderAction" type="XML" />
|
|
28
|
+
</template:if>
|
|
26
29
|
<template:if test="{converterContext>header/actions}">
|
|
27
30
|
<template:repeat list="{converterContext>header/actions}" var="headerAction">
|
|
28
31
|
<template:if
|
|
@@ -43,6 +46,13 @@
|
|
|
43
46
|
<components:CollaborationDraft contextPath="{entitySet>@@COMMON.getMetaPath}" id="fe::CollaborationDraft" />
|
|
44
47
|
</template:if>
|
|
45
48
|
<ToolbarSpacer />
|
|
49
|
+
|
|
50
|
+
<!-- Render emphasized-first action AFTER the flexible spacer in draft mode (prevents large gap). -->
|
|
51
|
+
<template:if
|
|
52
|
+
test="{= !!${converterContext>header/emphasizedFirstActions} && ${converterContext>isDraftEnabled} }"
|
|
53
|
+
>
|
|
54
|
+
<core:Fragment fragmentName="sap.fe.templates.ObjectPage.view.fragments.EmphasizedFirstHeaderAction" type="XML" />
|
|
55
|
+
</template:if>
|
|
46
56
|
</template:elseif>
|
|
47
57
|
<template:elseif test="{= ${headerAction>type} === 'Separator'}">
|
|
48
58
|
<ToolbarSeparator>
|
|
@@ -153,7 +163,7 @@
|
|
|
153
163
|
<Button
|
|
154
164
|
id="fe::StandardAction::Edit"
|
|
155
165
|
dt:designtime="not-adaptable"
|
|
156
|
-
type="{
|
|
166
|
+
type="{headerAction>buttonType}"
|
|
157
167
|
text="{sap.fe.i18n>C_COMMON_OBJECT_PAGE_EDIT}"
|
|
158
168
|
enabled="{headerAction>enabled}"
|
|
159
169
|
visible="{headerAction>visible}"
|
|
@@ -206,7 +216,7 @@
|
|
|
206
216
|
press="{= ${headerAction>command} ? ('cmd:' + ${headerAction>command}) : OP.getPressExpressionForEdit(${dataField>}, ${entitySet>@sapui.name}, ${headerAction>}) }"
|
|
207
217
|
visible="{headerAction>visible}"
|
|
208
218
|
enabled="{headerAction>enabled}"
|
|
209
|
-
type="{= CRIT.buildExpressionForCriticalityButtonType(${dataField>@@UI.getDataModelObjectPath}) }"
|
|
219
|
+
type="{= ${headerAction>buttonType} ? ${headerAction>buttonType} : CRIT.buildExpressionForCriticalityButtonType(${dataField>@@UI.getDataModelObjectPath}) }"
|
|
210
220
|
ariaHasPopup="{= DATAFIELDANNOTATIONS.isDataModelObjectPathForActionWithDialog(${actionContext>@@UI.getDataModelObjectPath})}"
|
|
211
221
|
macrodata:annotatedActionIdentifier="{= ID.generate([${dataField>@@UI.getDataModelObjectPath}]) }"
|
|
212
222
|
icon="{= ${headerAction>isAIOperation} ? COMMON.getAIIcon() : undefined }"
|
package/src/sap/fe/templates/ObjectPage/view/fragments/EmphasizedFirstHeaderAction.fragment.xml
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
<core:FragmentDefinition
|
|
2
|
+
xmlns:template="http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1"
|
|
3
|
+
xmlns:macrodata="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"
|
|
4
|
+
xmlns="sap.m"
|
|
5
|
+
xmlns:core="sap.ui.core"
|
|
6
|
+
xmlns:customData="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"
|
|
7
|
+
xmlns:dt="sap.ui.dt"
|
|
8
|
+
template:require="{
|
|
9
|
+
ID: 'sap/fe/core/helpers/StableIdHelper',
|
|
10
|
+
OP: 'sap/fe/templates/ObjectPage/ObjectPageTemplating',
|
|
11
|
+
COMMON: 'sap/fe/macros/CommonHelper',
|
|
12
|
+
DATAFIELDANNOTATIONS : 'sap/fe/core/converters/annotations/DataField',
|
|
13
|
+
DEFAULTACTIONHANDLER: 'sap/fe/macros/internal/helpers/DefaultActionHandler'
|
|
14
|
+
}"
|
|
15
|
+
>
|
|
16
|
+
<!--
|
|
17
|
+
Renders the *active* emphasized-first instances of all emphasized header actions.
|
|
18
|
+
Supports multiple emphasized actions with dynamic visibility (UI.Hidden) via cascading priority.
|
|
19
|
+
The caller (Actions.fragment.xml) is responsible for placing this fragment at the desired position.
|
|
20
|
+
-->
|
|
21
|
+
<template:repeat list="{converterContext>header/emphasizedFirstActions}" var="emphHeaderAction">
|
|
22
|
+
<template:if test="{= ${emphHeaderAction>type} === 'ForNavigation' }">
|
|
23
|
+
<template:with path="emphHeaderAction>annotationPath" var="dataField">
|
|
24
|
+
<Button
|
|
25
|
+
id="{= ID.generate(['fe', ${dataField>@@UI.getDataModelObjectPath}, 'EmphasizedFirst']) }"
|
|
26
|
+
dt:designtime="not-adaptable"
|
|
27
|
+
text="{emphHeaderAction>text}"
|
|
28
|
+
press="{= ${emphHeaderAction>command} ? ('cmd:' + ${emphHeaderAction>command}) : ${emphHeaderAction>press}}"
|
|
29
|
+
visible="{emphHeaderAction>emphFirstVisible}"
|
|
30
|
+
enabled="{emphHeaderAction>enabled}"
|
|
31
|
+
type="Emphasized"
|
|
32
|
+
macrodata:IBNData="{emphHeaderAction>customData}"
|
|
33
|
+
macrodata:fePrimaryActionShortcut="true"
|
|
34
|
+
>
|
|
35
|
+
<layoutData>
|
|
36
|
+
<OverflowToolbarLayoutData
|
|
37
|
+
priority="{= ${emphHeaderAction>priority} ? ${emphHeaderAction>priority} : 'Low' }"
|
|
38
|
+
group="{= ${emphHeaderAction>overflowGroup} || ${emphHeaderAction>group} }"
|
|
39
|
+
/>
|
|
40
|
+
</layoutData>
|
|
41
|
+
</Button>
|
|
42
|
+
</template:with>
|
|
43
|
+
</template:if>
|
|
44
|
+
|
|
45
|
+
<template:if test="{= (${emphHeaderAction>type} === 'ForAction' || ${emphHeaderAction>type} === 'Copy') }">
|
|
46
|
+
<template:with path="emphHeaderAction>annotationPath" var="dataField">
|
|
47
|
+
<template:if
|
|
48
|
+
test="{= ${dataField>$Type} === 'com.sap.vocabularies.UI.v1.DataFieldForAction' && ${dataField>Determining} !== true }"
|
|
49
|
+
>
|
|
50
|
+
<template:with path="dataField>Action" helper="COMMON.getActionContext" var="actionContext">
|
|
51
|
+
<Button
|
|
52
|
+
id="{= ID.generate(['fe', ${dataField>@@UI.getDataModelObjectPath}, 'EmphasizedFirst']) }"
|
|
53
|
+
dt:designtime="not-adaptable"
|
|
54
|
+
text="{= ${emphHeaderAction>text} ? ${emphHeaderAction>text} : ${dataField>Label} }"
|
|
55
|
+
press="{= ${emphHeaderAction>command} ? ('cmd:' + ${emphHeaderAction>command}) : OP.getPressExpressionForEdit(${dataField>}, ${entitySet>@sapui.name}, ${emphHeaderAction>}) }"
|
|
56
|
+
visible="{emphHeaderAction>emphFirstVisible}"
|
|
57
|
+
enabled="{emphHeaderAction>enabled}"
|
|
58
|
+
type="Emphasized"
|
|
59
|
+
ariaHasPopup="{= DATAFIELDANNOTATIONS.isDataModelObjectPathForActionWithDialog(${actionContext>@@UI.getDataModelObjectPath})}"
|
|
60
|
+
macrodata:annotatedActionIdentifier="{= ID.generate([${dataField>@@UI.getDataModelObjectPath}]) }"
|
|
61
|
+
icon="{= ${emphHeaderAction>isAIOperation} ? COMMON.getAIIcon() : undefined }"
|
|
62
|
+
ariaDescribedBy="{= ${emphHeaderAction>isAIOperation} === true ? 'fe::AiAction::AriaText' : undefined}"
|
|
63
|
+
macrodata:fePrimaryActionShortcut="true"
|
|
64
|
+
>
|
|
65
|
+
<layoutData>
|
|
66
|
+
<OverflowToolbarLayoutData
|
|
67
|
+
priority="{= ${emphHeaderAction>priority} ? ${emphHeaderAction>priority} : 'Low' }"
|
|
68
|
+
group="{emphHeaderAction>group}"
|
|
69
|
+
/>
|
|
70
|
+
</layoutData>
|
|
71
|
+
</Button>
|
|
72
|
+
</template:with>
|
|
73
|
+
</template:if>
|
|
74
|
+
</template:with>
|
|
75
|
+
</template:if>
|
|
76
|
+
|
|
77
|
+
<template:if test="{= OP.isManifestAction(${emphHeaderAction>}) }">
|
|
78
|
+
<!-- Manifest Menu: place MenuButton first and emphasize it; defaultAction stays the menu defaultAction -->
|
|
79
|
+
<template:if test="{= ${emphHeaderAction>type} === 'Menu' }">
|
|
80
|
+
<template:repeat list="{converterContext>header/actions}" var="matchedHeaderAction">
|
|
81
|
+
<template:if test="{= ${matchedHeaderAction>id} === ${emphHeaderAction>id} }">
|
|
82
|
+
<template:then>
|
|
83
|
+
<template:with path="matchedHeaderAction>defaultAction/annotationPath" var="dataFieldForDefaultAction">
|
|
84
|
+
<template:with
|
|
85
|
+
path="dataFieldForDefaultAction>Action"
|
|
86
|
+
helper="COMMON.getActionContext"
|
|
87
|
+
var="defaultActionContext"
|
|
88
|
+
>
|
|
89
|
+
<MenuButton
|
|
90
|
+
core:require="{FPM: 'sap/fe/core/helpers/FPMHelper'}"
|
|
91
|
+
text="{matchedHeaderAction>text}"
|
|
92
|
+
type="Emphasized"
|
|
93
|
+
menuPosition="BeginBottom"
|
|
94
|
+
id="{= ID.generate(['fe', ${matchedHeaderAction>id}, 'EmphasizedFirst'])}"
|
|
95
|
+
dt:designtime="not-adaptable"
|
|
96
|
+
visible="{emphHeaderAction>emphFirstVisible}"
|
|
97
|
+
enabled="{matchedHeaderAction>enabled}"
|
|
98
|
+
useDefaultActionOnly="{= DEFAULTACTIONHANDLER.getUseDefaultActionOnly(${matchedHeaderAction>})}"
|
|
99
|
+
buttonMode="{= DEFAULTACTIONHANDLER.getButtonMode(${matchedHeaderAction>})}"
|
|
100
|
+
defaultAction="{= OP.getDefaultActionHandler(${converterContext>header}, ${matchedHeaderAction>}, ${dataFieldForDefaultAction>}, ${entitySet>@sapui.name})}"
|
|
101
|
+
icon="{= ${matchedHeaderAction>isAIOperation} ? COMMON.getAIIcon() : undefined }"
|
|
102
|
+
ariaDescribedBy="{= ${matchedHeaderAction>isAIOperation} === true ? 'fe::AiAction::AriaText' : undefined}"
|
|
103
|
+
macrodata:fePrimaryActionShortcut="true"
|
|
104
|
+
>
|
|
105
|
+
<layoutData>
|
|
106
|
+
<OverflowToolbarLayoutData
|
|
107
|
+
priority="{= ${matchedHeaderAction>priority} ? ${matchedHeaderAction>priority} : 'Low' }"
|
|
108
|
+
group="{matchedHeaderAction>group}"
|
|
109
|
+
/>
|
|
110
|
+
</layoutData>
|
|
111
|
+
<menu>
|
|
112
|
+
<Menu>
|
|
113
|
+
<template:repeat list="{matchedHeaderAction>menu}" var="menuItemAction">
|
|
114
|
+
<template:with path="menuItemAction>annotationPath" var="dataField">
|
|
115
|
+
<template:if test="{= ${menuItemAction>type} === 'ForAction'}">
|
|
116
|
+
<template:then>
|
|
117
|
+
<MenuItem
|
|
118
|
+
id="{= ID.generate(['fe', ${matchedHeaderAction>id}, ${dataField>@@UI.getDataModelObjectPath}, 'EmphasizedFirst']) }"
|
|
119
|
+
text="{dataField>Label}"
|
|
120
|
+
press="{= ${menuItemAction>command} ? ('cmd:' + ${menuItemAction>command}) : OP.getPressExpressionForEdit(${dataField>}, ${entitySet>@sapui.name}, ${matchedHeaderAction>}) }"
|
|
121
|
+
visible="{menuItemAction>visible}"
|
|
122
|
+
enabled="{menuItemAction>enabled}"
|
|
123
|
+
macrodata:annotatedActionIdentifier="{= ID.generate([${dataField>@@UI.getDataModelObjectPath}]) }"
|
|
124
|
+
/>
|
|
125
|
+
</template:then>
|
|
126
|
+
<template:elseif test="{= ${menuItemAction>type} === 'ForNavigation'}">
|
|
127
|
+
<MenuItem
|
|
128
|
+
id="{= ID.generate(['fe', ${matchedHeaderAction>id}, ${dataField>@@UI.getDataModelObjectPath}, 'EmphasizedFirst']) }"
|
|
129
|
+
text="{dataField>Label}"
|
|
130
|
+
press="{= ${menuItemAction>command} ? ('cmd:' + ${menuItemAction>command}) : ${menuItemAction>press}}"
|
|
131
|
+
enabled="{menuItemAction>enabled}"
|
|
132
|
+
visible="{menuItemAction>visible}"
|
|
133
|
+
macrodata:IBNData="{menuItemAction>customData}"
|
|
134
|
+
/>
|
|
135
|
+
</template:elseif>
|
|
136
|
+
<template:else>
|
|
137
|
+
<MenuItem
|
|
138
|
+
id="{= ID.generate(['fe', ${matchedHeaderAction>id}, ${menuItemAction>id}, 'EmphasizedFirst'])}"
|
|
139
|
+
text="{menuItemAction>text}"
|
|
140
|
+
press="{= ${menuItemAction>command} ? ('cmd:' + ${menuItemAction>command}) : COMMON.buildActionWrapper(${menuItemAction>}, ${converterContext>header})}"
|
|
141
|
+
visible="{menuItemAction>visible}"
|
|
142
|
+
enabled="{menuItemAction>enabled}"
|
|
143
|
+
/>
|
|
144
|
+
</template:else>
|
|
145
|
+
</template:if>
|
|
146
|
+
</template:with>
|
|
147
|
+
</template:repeat>
|
|
148
|
+
</Menu>
|
|
149
|
+
</menu>
|
|
150
|
+
</MenuButton>
|
|
151
|
+
</template:with>
|
|
152
|
+
</template:with>
|
|
153
|
+
</template:then>
|
|
154
|
+
</template:if>
|
|
155
|
+
</template:repeat>
|
|
156
|
+
</template:if>
|
|
157
|
+
|
|
158
|
+
<template:if test="{= ${emphHeaderAction>type} !== 'Menu' }">
|
|
159
|
+
<Button
|
|
160
|
+
core:require="{FPM: 'sap/fe/core/helpers/FPMHelper'}"
|
|
161
|
+
id="{= ID.generate(['fe', (${emphHeaderAction>id} ? ${emphHeaderAction>id} : ${emphHeaderAction>key}), 'EmphasizedFirst']) }"
|
|
162
|
+
dt:designtime="not-adaptable"
|
|
163
|
+
text="{emphHeaderAction>text}"
|
|
164
|
+
press="{= ${emphHeaderAction>command} ? ('cmd:' + ${emphHeaderAction>command}) : COMMON.buildActionWrapper(${emphHeaderAction>}, ${converterContext>header}) }"
|
|
165
|
+
visible="{emphHeaderAction>emphFirstVisible}"
|
|
166
|
+
enabled="{emphHeaderAction>enabled}"
|
|
167
|
+
type="Emphasized"
|
|
168
|
+
icon="{= ${emphHeaderAction>isAIOperation} ? COMMON.getAIIcon() : undefined }"
|
|
169
|
+
ariaDescribedBy="{= ${emphHeaderAction>isAIOperation} === true ? 'fe::AiAction::AriaText' : undefined}"
|
|
170
|
+
macrodata:fePrimaryActionShortcut="true"
|
|
171
|
+
>
|
|
172
|
+
<layoutData>
|
|
173
|
+
<OverflowToolbarLayoutData
|
|
174
|
+
priority="{= ${emphHeaderAction>priority} ? ${emphHeaderAction>priority} : 'Low' }"
|
|
175
|
+
group="{emphHeaderAction>group}"
|
|
176
|
+
/>
|
|
177
|
+
</layoutData>
|
|
178
|
+
</Button>
|
|
179
|
+
</template:if>
|
|
180
|
+
</template:if>
|
|
181
|
+
</template:repeat>
|
|
182
|
+
</core:FragmentDefinition>
|
|
@@ -35,16 +35,16 @@ OP: 'sap/fe/templates/ObjectPage/ObjectPageTemplating'
|
|
|
35
35
|
<template:if test="{= ${header>aiNotice} && ${header>aiNotice/visible} !== false }">
|
|
36
36
|
<macros:AINotice visible="{header>aiNotice/visible}" placementType="Bottom">
|
|
37
37
|
<macros:popoverContent>
|
|
38
|
-
<template:if test="{header>aiNotice/
|
|
38
|
+
<template:if test="{header>aiNotice/contentFragmentName}">
|
|
39
39
|
<template:then>
|
|
40
|
-
<Text text="{header>aiNotice/contentText}" />
|
|
41
|
-
</template:then>
|
|
42
|
-
<template:elseif test="{header>aiNotice/contentFragmentName}">
|
|
43
40
|
<fpm:CustomFragment
|
|
44
41
|
id="fe::expandedHeaderNotice"
|
|
45
42
|
fragmentName="{header>aiNotice/contentFragmentName}"
|
|
46
43
|
contextPath="{fullContextPath>}"
|
|
47
44
|
/>
|
|
45
|
+
</template:then>
|
|
46
|
+
<template:elseif test="{header>aiNotice/contentText}">
|
|
47
|
+
<Text text="{header>aiNotice/contentText}" />
|
|
48
48
|
</template:elseif>
|
|
49
49
|
</template:if>
|
|
50
50
|
</macros:popoverContent>
|