@sapui5/sap.fe.core 1.95.0 → 1.98.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 +5 -5
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +3 -3
- package/src/sap/fe/core/AppComponent.js +9 -44
- package/src/sap/fe/core/AppStateHandler.js +2 -2
- package/src/sap/fe/core/BaseController.js +1 -1
- package/src/sap/fe/core/BusyLocker.js +13 -1
- package/src/sap/fe/core/CommonUtils.js +129 -219
- package/src/sap/fe/core/ExtensionAPI.js +14 -6
- package/src/sap/fe/core/PageController.js +9 -35
- package/src/sap/fe/core/RouterProxy.js +79 -75
- package/src/sap/fe/core/Synchronization.js +1 -1
- package/src/sap/fe/core/TemplateComponent.js +16 -7
- package/src/sap/fe/core/TemplateModel.js +1 -1
- package/src/sap/fe/core/TransactionHelper.js +183 -65
- package/src/sap/fe/core/actions/draft.js +50 -23
- package/src/sap/fe/core/actions/messageHandling.js +86 -7
- package/src/sap/fe/core/actions/nonDraft.js +1 -1
- package/src/sap/fe/core/actions/operations.js +75 -33
- package/src/sap/fe/core/actions/sticky.js +1 -1
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +276 -122
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +14 -6
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +90 -46
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +234 -232
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +539 -209
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +550 -213
- package/src/sap/fe/core/controllerextensions/MassEdit.js +79 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +227 -103
- package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
- package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -7
- package/src/sap/fe/core/controllerextensions/Paginator.js +38 -12
- package/src/sap/fe/core/controllerextensions/Placeholder.js +16 -19
- package/src/sap/fe/core/controllerextensions/Routing.js +17 -2
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +20 -7
- package/src/sap/fe/core/controllerextensions/SideEffects.js +8 -9
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +19 -17
- package/src/sap/fe/core/controllerextensions/ViewState.js +54 -9
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +40 -34
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
- package/src/sap/fe/core/controls/CommandExecution.js +1 -1
- package/src/sap/fe/core/controls/ConditionalWrapper.js +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +110 -109
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +7 -4
- package/src/sap/fe/core/controls/FieldWrapper.js +10 -4
- package/src/sap/fe/core/controls/FilterBar.js +1 -1
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -6
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -1
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +78 -0
- package/src/sap/fe/core/converters/ConverterContext.js +13 -1
- package/src/sap/fe/core/converters/ConverterContext.ts +10 -0
- package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +7 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +18 -7
- package/src/sap/fe/core/converters/ManifestWrapper.ts +15 -6
- package/src/sap/fe/core/converters/MetaModelConverter.js +920 -882
- package/src/sap/fe/core/converters/MetaModelConverter.ts +829 -853
- package/src/sap/fe/core/converters/annotations/DataField.js +54 -4
- package/src/sap/fe/core/converters/annotations/DataField.ts +53 -3
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +83 -48
- package/src/sap/fe/core/converters/controls/Common/Action.js +15 -3
- package/src/sap/fe/core/converters/controls/Common/Action.ts +12 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -2
- package/src/sap/fe/core/converters/controls/Common/Form.js +68 -21
- package/src/sap/fe/core/converters/controls/Common/Form.ts +60 -16
- package/src/sap/fe/core/converters/controls/Common/KPI.js +331 -248
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +355 -287
- package/src/sap/fe/core/converters/controls/Common/Table.js +426 -332
- package/src/sap/fe/core/converters/controls/Common/Table.ts +516 -383
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +468 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +609 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +30 -13
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +31 -12
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +15 -7
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +27 -6
- package/src/sap/fe/core/converters/helpers/Aggregation.js +8 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +9 -1
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +2 -2
- package/src/sap/fe/core/converters/helpers/ID.js +9 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +6 -2
- package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -5
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +2 -2
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +34 -4
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -7
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +2 -5
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -2
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
- package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
- package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
- package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
- package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -3
- package/src/sap/fe/core/fpm/Component.js +2 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +388 -0
- package/src/sap/fe/core/helpers/BindingExpression.js +199 -111
- package/src/sap/fe/core/helpers/BindingExpression.ts +193 -102
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -1
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -3
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
- package/src/sap/fe/core/helpers/MassEditHelper.js +678 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +64 -1
- package/src/sap/fe/core/helpers/PasteHelper.js +7 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
- package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
- package/src/sap/fe/core/library.js +28 -2
- package/src/sap/fe/core/library.support.js +10 -4
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
- package/src/sap/fe/core/messagebundle.properties +67 -3
- package/src/sap/fe/core/messagebundle_ar.properties +40 -3
- package/src/sap/fe/core/messagebundle_bg.properties +40 -3
- package/src/sap/fe/core/messagebundle_ca.properties +41 -4
- package/src/sap/fe/core/messagebundle_cs.properties +41 -4
- package/src/sap/fe/core/messagebundle_cy.properties +40 -3
- package/src/sap/fe/core/messagebundle_da.properties +40 -3
- package/src/sap/fe/core/messagebundle_de.properties +40 -3
- package/src/sap/fe/core/messagebundle_el.properties +40 -3
- package/src/sap/fe/core/messagebundle_en.properties +37 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +37 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +46 -2
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -0
- package/src/sap/fe/core/messagebundle_es.properties +40 -3
- package/src/sap/fe/core/messagebundle_es_MX.properties +41 -4
- package/src/sap/fe/core/messagebundle_et.properties +40 -3
- package/src/sap/fe/core/messagebundle_fi.properties +40 -3
- package/src/sap/fe/core/messagebundle_fr.properties +41 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +40 -3
- package/src/sap/fe/core/messagebundle_hi.properties +40 -3
- package/src/sap/fe/core/messagebundle_hr.properties +40 -3
- package/src/sap/fe/core/messagebundle_hu.properties +41 -4
- package/src/sap/fe/core/messagebundle_id.properties +42 -5
- package/src/sap/fe/core/messagebundle_it.properties +40 -3
- package/src/sap/fe/core/messagebundle_iw.properties +40 -3
- package/src/sap/fe/core/messagebundle_ja.properties +49 -12
- package/src/sap/fe/core/messagebundle_kk.properties +40 -3
- package/src/sap/fe/core/messagebundle_ko.properties +40 -3
- package/src/sap/fe/core/messagebundle_lt.properties +40 -3
- package/src/sap/fe/core/messagebundle_lv.properties +40 -3
- package/src/sap/fe/core/messagebundle_ms.properties +40 -3
- package/src/sap/fe/core/messagebundle_nl.properties +40 -3
- package/src/sap/fe/core/messagebundle_no.properties +40 -3
- package/src/sap/fe/core/messagebundle_pl.properties +40 -3
- package/src/sap/fe/core/messagebundle_pt.properties +42 -5
- package/src/sap/fe/core/messagebundle_pt_PT.properties +40 -3
- package/src/sap/fe/core/messagebundle_ro.properties +40 -3
- package/src/sap/fe/core/messagebundle_ru.properties +40 -3
- package/src/sap/fe/core/messagebundle_sh.properties +40 -3
- package/src/sap/fe/core/messagebundle_sk.properties +40 -3
- package/src/sap/fe/core/messagebundle_sl.properties +40 -3
- package/src/sap/fe/core/messagebundle_sv.properties +41 -4
- package/src/sap/fe/core/messagebundle_th.properties +40 -3
- package/src/sap/fe/core/messagebundle_tr.properties +40 -3
- package/src/sap/fe/core/messagebundle_uk.properties +40 -3
- package/src/sap/fe/core/messagebundle_vi.properties +40 -3
- package/src/sap/fe/core/messagebundle_zh_CN.properties +40 -3
- package/src/sap/fe/core/messagebundle_zh_TW.properties +40 -3
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -0
- package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +98 -328
- package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
- package/src/sap/fe/core/services/ShellServicesFactory.ts +30 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +8 -5
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +11 -6
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +14 -5
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
- package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -37
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +13 -33
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
- package/src/sap/fe/core/templating/EntitySetHelper.js +86 -3
- package/src/sap/fe/core/templating/EntitySetHelper.ts +44 -0
- package/src/sap/fe/core/templating/FilterHelper.js +10 -7
- package/src/sap/fe/core/templating/FilterHelper.ts +8 -6
- package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
- package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
- package/src/sap/fe/core/templating/UIFormatters.js +47 -107
- package/src/sap/fe/core/templating/UIFormatters.ts +76 -72
|
@@ -39,1035 +39,1026 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
|
|
|
39
39
|
Chart: true,
|
|
40
40
|
MicroChart: true,
|
|
41
41
|
UShell: true,
|
|
42
|
-
IntentBasedNavigation: true
|
|
42
|
+
IntentBasedNavigation: true,
|
|
43
|
+
Situations: false
|
|
43
44
|
};
|
|
44
45
|
_exports.DefaultEnvironmentCapabilities = DefaultEnvironmentCapabilities;
|
|
45
|
-
var MetaModelConverter = {
|
|
46
|
-
parsePropertyValue: function (annotationObject, propertyKey, currentTarget, annotationsLists, oCapabilities) {
|
|
47
|
-
var _this = this;
|
|
48
46
|
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
function parsePropertyValue(annotationObject, propertyKey, currentTarget, annotationsLists, oCapabilities) {
|
|
48
|
+
var value;
|
|
49
|
+
var currentPropertyTarget = currentTarget + "/" + propertyKey;
|
|
50
|
+
var typeOfAnnotation = typeof annotationObject;
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
52
|
+
if (annotationObject === null) {
|
|
53
|
+
value = {
|
|
54
|
+
type: "Null",
|
|
55
|
+
Null: null
|
|
56
|
+
};
|
|
57
|
+
} else if (typeOfAnnotation === "string") {
|
|
58
|
+
value = {
|
|
59
|
+
type: "String",
|
|
60
|
+
String: annotationObject
|
|
61
|
+
};
|
|
62
|
+
} else if (typeOfAnnotation === "boolean") {
|
|
63
|
+
value = {
|
|
64
|
+
type: "Bool",
|
|
65
|
+
Bool: annotationObject
|
|
66
|
+
};
|
|
67
|
+
} else if (typeOfAnnotation === "number") {
|
|
68
|
+
value = {
|
|
69
|
+
type: "Int",
|
|
70
|
+
Int: annotationObject
|
|
71
|
+
};
|
|
72
|
+
} else if (Array.isArray(annotationObject)) {
|
|
73
|
+
value = {
|
|
74
|
+
type: "Collection",
|
|
75
|
+
Collection: annotationObject.map(function (subAnnotationObject, subAnnotationObjectIndex) {
|
|
76
|
+
return parseAnnotationObject(subAnnotationObject, currentPropertyTarget + "/" + subAnnotationObjectIndex, annotationsLists, oCapabilities);
|
|
77
|
+
})
|
|
78
|
+
};
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
80
|
+
if (annotationObject.length > 0) {
|
|
81
|
+
if (annotationObject[0].hasOwnProperty("$PropertyPath")) {
|
|
82
|
+
value.Collection.type = "PropertyPath";
|
|
83
|
+
} else if (annotationObject[0].hasOwnProperty("$Path")) {
|
|
84
|
+
value.Collection.type = "Path";
|
|
85
|
+
} else if (annotationObject[0].hasOwnProperty("$NavigationPropertyPath")) {
|
|
86
|
+
value.Collection.type = "NavigationPropertyPath";
|
|
87
|
+
} else if (annotationObject[0].hasOwnProperty("$AnnotationPath")) {
|
|
88
|
+
value.Collection.type = "AnnotationPath";
|
|
89
|
+
} else if (annotationObject[0].hasOwnProperty("$Type")) {
|
|
90
|
+
value.Collection.type = "Record";
|
|
91
|
+
} else if (annotationObject[0].hasOwnProperty("$If")) {
|
|
92
|
+
value.Collection.type = "If";
|
|
93
|
+
} else if (annotationObject[0].hasOwnProperty("$Or")) {
|
|
94
|
+
value.Collection.type = "Or";
|
|
95
|
+
} else if (annotationObject[0].hasOwnProperty("$And")) {
|
|
96
|
+
value.Collection.type = "And";
|
|
97
|
+
} else if (annotationObject[0].hasOwnProperty("$Eq")) {
|
|
98
|
+
value.Collection.type = "Eq";
|
|
99
|
+
} else if (annotationObject[0].hasOwnProperty("$Ne")) {
|
|
100
|
+
value.Collection.type = "Ne";
|
|
101
|
+
} else if (annotationObject[0].hasOwnProperty("$Not")) {
|
|
102
|
+
value.Collection.type = "Not";
|
|
103
|
+
} else if (annotationObject[0].hasOwnProperty("$Gt")) {
|
|
104
|
+
value.Collection.type = "Gt";
|
|
105
|
+
} else if (annotationObject[0].hasOwnProperty("$Ge")) {
|
|
106
|
+
value.Collection.type = "Ge";
|
|
107
|
+
} else if (annotationObject[0].hasOwnProperty("$Lt")) {
|
|
108
|
+
value.Collection.type = "Lt";
|
|
109
|
+
} else if (annotationObject[0].hasOwnProperty("$Le")) {
|
|
110
|
+
value.Collection.type = "Le";
|
|
111
|
+
} else if (annotationObject[0].hasOwnProperty("$Apply")) {
|
|
112
|
+
value.Collection.type = "Apply";
|
|
113
|
+
} else if (typeof annotationObject[0] === "object") {
|
|
114
|
+
// $Type is optional...
|
|
115
|
+
value.Collection.type = "Record";
|
|
116
|
+
} else {
|
|
117
|
+
value.Collection.type = "String";
|
|
119
118
|
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
119
|
+
}
|
|
120
|
+
} else if (annotationObject.$Path !== undefined) {
|
|
121
|
+
value = {
|
|
122
|
+
type: "Path",
|
|
123
|
+
Path: annotationObject.$Path
|
|
124
|
+
};
|
|
125
|
+
} else if (annotationObject.$Decimal !== undefined) {
|
|
126
|
+
value = {
|
|
127
|
+
type: "Decimal",
|
|
128
|
+
Decimal: parseFloat(annotationObject.$Decimal)
|
|
129
|
+
};
|
|
130
|
+
} else if (annotationObject.$PropertyPath !== undefined) {
|
|
131
|
+
value = {
|
|
132
|
+
type: "PropertyPath",
|
|
133
|
+
PropertyPath: annotationObject.$PropertyPath
|
|
134
|
+
};
|
|
135
|
+
} else if (annotationObject.$NavigationPropertyPath !== undefined) {
|
|
136
|
+
value = {
|
|
137
|
+
type: "NavigationPropertyPath",
|
|
138
|
+
NavigationPropertyPath: annotationObject.$NavigationPropertyPath
|
|
139
|
+
};
|
|
140
|
+
} else if (annotationObject.$If !== undefined) {
|
|
141
|
+
value = {
|
|
142
|
+
type: "If",
|
|
143
|
+
If: annotationObject.$If
|
|
144
|
+
};
|
|
145
|
+
} else if (annotationObject.$And !== undefined) {
|
|
146
|
+
value = {
|
|
147
|
+
type: "And",
|
|
148
|
+
And: annotationObject.$And
|
|
149
|
+
};
|
|
150
|
+
} else if (annotationObject.$Or !== undefined) {
|
|
151
|
+
value = {
|
|
152
|
+
type: "Or",
|
|
153
|
+
Or: annotationObject.$Or
|
|
154
|
+
};
|
|
155
|
+
} else if (annotationObject.$Not !== undefined) {
|
|
156
|
+
value = {
|
|
157
|
+
type: "Not",
|
|
158
|
+
Not: annotationObject.$Not
|
|
159
|
+
};
|
|
160
|
+
} else if (annotationObject.$Eq !== undefined) {
|
|
161
|
+
value = {
|
|
162
|
+
type: "Eq",
|
|
163
|
+
Eq: annotationObject.$Eq
|
|
164
|
+
};
|
|
165
|
+
} else if (annotationObject.$Ne !== undefined) {
|
|
166
|
+
value = {
|
|
167
|
+
type: "Ne",
|
|
168
|
+
Ne: annotationObject.$Ne
|
|
169
|
+
};
|
|
170
|
+
} else if (annotationObject.$Gt !== undefined) {
|
|
171
|
+
value = {
|
|
172
|
+
type: "Gt",
|
|
173
|
+
Gt: annotationObject.$Gt
|
|
174
|
+
};
|
|
175
|
+
} else if (annotationObject.$Ge !== undefined) {
|
|
176
|
+
value = {
|
|
177
|
+
type: "Ge",
|
|
178
|
+
Ge: annotationObject.$Ge
|
|
179
|
+
};
|
|
180
|
+
} else if (annotationObject.$Lt !== undefined) {
|
|
181
|
+
value = {
|
|
182
|
+
type: "Lt",
|
|
183
|
+
Lt: annotationObject.$Lt
|
|
184
|
+
};
|
|
185
|
+
} else if (annotationObject.$Le !== undefined) {
|
|
186
|
+
value = {
|
|
187
|
+
type: "Le",
|
|
188
|
+
Le: annotationObject.$Le
|
|
189
|
+
};
|
|
190
|
+
} else if (annotationObject.$Apply !== undefined) {
|
|
191
|
+
value = {
|
|
192
|
+
type: "Apply",
|
|
193
|
+
Apply: annotationObject.$Apply,
|
|
194
|
+
Function: annotationObject.$Function
|
|
195
|
+
};
|
|
196
|
+
} else if (annotationObject.$AnnotationPath !== undefined) {
|
|
197
|
+
value = {
|
|
198
|
+
type: "AnnotationPath",
|
|
199
|
+
AnnotationPath: annotationObject.$AnnotationPath
|
|
200
|
+
};
|
|
201
|
+
} else if (annotationObject.$EnumMember !== undefined) {
|
|
202
|
+
value = {
|
|
203
|
+
type: "EnumMember",
|
|
204
|
+
EnumMember: mapNameToAlias(annotationObject.$EnumMember.split("/")[0]) + "/" + annotationObject.$EnumMember.split("/")[1]
|
|
205
|
+
};
|
|
206
|
+
} else if (annotationObject.$Type) {
|
|
207
|
+
value = {
|
|
208
|
+
type: "Record",
|
|
209
|
+
Record: parseAnnotationObject(annotationObject, currentTarget, annotationsLists, oCapabilities)
|
|
210
|
+
};
|
|
211
|
+
} else {
|
|
212
|
+
value = {
|
|
213
|
+
type: "Record",
|
|
214
|
+
Record: parseAnnotationObject(annotationObject, currentTarget, annotationsLists, oCapabilities)
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return {
|
|
219
|
+
name: propertyKey,
|
|
220
|
+
value: value
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function mapNameToAlias(annotationName) {
|
|
225
|
+
var _annotationName$split = annotationName.split("@"),
|
|
226
|
+
_annotationName$split2 = _slicedToArray(_annotationName$split, 2),
|
|
227
|
+
pathPart = _annotationName$split2[0],
|
|
228
|
+
annoPart = _annotationName$split2[1];
|
|
229
|
+
|
|
230
|
+
if (!annoPart) {
|
|
231
|
+
annoPart = pathPart;
|
|
232
|
+
pathPart = "";
|
|
233
|
+
} else {
|
|
234
|
+
pathPart += "@";
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
var lastDot = annoPart.lastIndexOf(".");
|
|
238
|
+
return pathPart + VOCABULARY_ALIAS[annoPart.substr(0, lastDot)] + "." + annoPart.substr(lastDot + 1);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function parseAnnotationObject(annotationObject, currentObjectTarget, annotationsLists, oCapabilities) {
|
|
242
|
+
var parsedAnnotationObject = {};
|
|
243
|
+
var typeOfObject = typeof annotationObject;
|
|
244
|
+
|
|
245
|
+
if (annotationObject === null) {
|
|
246
|
+
parsedAnnotationObject = {
|
|
247
|
+
type: "Null",
|
|
248
|
+
Null: null
|
|
249
|
+
};
|
|
250
|
+
} else if (typeOfObject === "string") {
|
|
251
|
+
parsedAnnotationObject = {
|
|
252
|
+
type: "String",
|
|
253
|
+
String: annotationObject
|
|
254
|
+
};
|
|
255
|
+
} else if (typeOfObject === "boolean") {
|
|
256
|
+
parsedAnnotationObject = {
|
|
257
|
+
type: "Bool",
|
|
258
|
+
Bool: annotationObject
|
|
259
|
+
};
|
|
260
|
+
} else if (typeOfObject === "number") {
|
|
261
|
+
parsedAnnotationObject = {
|
|
262
|
+
type: "Int",
|
|
263
|
+
Int: annotationObject
|
|
264
|
+
};
|
|
265
|
+
} else if (annotationObject.$AnnotationPath !== undefined) {
|
|
266
|
+
parsedAnnotationObject = {
|
|
267
|
+
type: "AnnotationPath",
|
|
268
|
+
AnnotationPath: annotationObject.$AnnotationPath
|
|
269
|
+
};
|
|
270
|
+
} else if (annotationObject.$Path !== undefined) {
|
|
271
|
+
parsedAnnotationObject = {
|
|
272
|
+
type: "Path",
|
|
273
|
+
Path: annotationObject.$Path
|
|
274
|
+
};
|
|
275
|
+
} else if (annotationObject.$Decimal !== undefined) {
|
|
276
|
+
parsedAnnotationObject = {
|
|
277
|
+
type: "Decimal",
|
|
278
|
+
Decimal: parseFloat(annotationObject.$Decimal)
|
|
279
|
+
};
|
|
280
|
+
} else if (annotationObject.$PropertyPath !== undefined) {
|
|
281
|
+
parsedAnnotationObject = {
|
|
282
|
+
type: "PropertyPath",
|
|
283
|
+
PropertyPath: annotationObject.$PropertyPath
|
|
284
|
+
};
|
|
285
|
+
} else if (annotationObject.$If !== undefined) {
|
|
286
|
+
parsedAnnotationObject = {
|
|
287
|
+
type: "If",
|
|
288
|
+
If: annotationObject.$If
|
|
289
|
+
};
|
|
290
|
+
} else if (annotationObject.$And !== undefined) {
|
|
291
|
+
parsedAnnotationObject = {
|
|
292
|
+
type: "And",
|
|
293
|
+
And: annotationObject.$And
|
|
294
|
+
};
|
|
295
|
+
} else if (annotationObject.$Or !== undefined) {
|
|
296
|
+
parsedAnnotationObject = {
|
|
297
|
+
type: "Or",
|
|
298
|
+
Or: annotationObject.$Or
|
|
299
|
+
};
|
|
300
|
+
} else if (annotationObject.$Not !== undefined) {
|
|
301
|
+
parsedAnnotationObject = {
|
|
302
|
+
type: "Not",
|
|
303
|
+
Not: annotationObject.$Not
|
|
304
|
+
};
|
|
305
|
+
} else if (annotationObject.$Eq !== undefined) {
|
|
306
|
+
parsedAnnotationObject = {
|
|
307
|
+
type: "Eq",
|
|
308
|
+
Eq: annotationObject.$Eq
|
|
309
|
+
};
|
|
310
|
+
} else if (annotationObject.$Ne !== undefined) {
|
|
311
|
+
parsedAnnotationObject = {
|
|
312
|
+
type: "Ne",
|
|
313
|
+
Ne: annotationObject.$Ne
|
|
314
|
+
};
|
|
315
|
+
} else if (annotationObject.$Gt !== undefined) {
|
|
316
|
+
parsedAnnotationObject = {
|
|
317
|
+
type: "Gt",
|
|
318
|
+
Gt: annotationObject.$Gt
|
|
319
|
+
};
|
|
320
|
+
} else if (annotationObject.$Ge !== undefined) {
|
|
321
|
+
parsedAnnotationObject = {
|
|
322
|
+
type: "Ge",
|
|
323
|
+
Ge: annotationObject.$Ge
|
|
324
|
+
};
|
|
325
|
+
} else if (annotationObject.$Lt !== undefined) {
|
|
326
|
+
parsedAnnotationObject = {
|
|
327
|
+
type: "Lt",
|
|
328
|
+
Lt: annotationObject.$Lt
|
|
329
|
+
};
|
|
330
|
+
} else if (annotationObject.$Le !== undefined) {
|
|
331
|
+
parsedAnnotationObject = {
|
|
332
|
+
type: "Le",
|
|
333
|
+
Le: annotationObject.$Le
|
|
334
|
+
};
|
|
335
|
+
} else if (annotationObject.$Apply !== undefined) {
|
|
336
|
+
parsedAnnotationObject = {
|
|
337
|
+
type: "Apply",
|
|
338
|
+
Apply: annotationObject.$Apply,
|
|
339
|
+
Function: annotationObject.$Function
|
|
340
|
+
};
|
|
341
|
+
} else if (annotationObject.$NavigationPropertyPath !== undefined) {
|
|
342
|
+
parsedAnnotationObject = {
|
|
343
|
+
type: "NavigationPropertyPath",
|
|
344
|
+
NavigationPropertyPath: annotationObject.$NavigationPropertyPath
|
|
345
|
+
};
|
|
346
|
+
} else if (annotationObject.$EnumMember !== undefined) {
|
|
347
|
+
parsedAnnotationObject = {
|
|
348
|
+
type: "EnumMember",
|
|
349
|
+
EnumMember: mapNameToAlias(annotationObject.$EnumMember.split("/")[0]) + "/" + annotationObject.$EnumMember.split("/")[1]
|
|
350
|
+
};
|
|
351
|
+
} else if (Array.isArray(annotationObject)) {
|
|
352
|
+
var parsedAnnotationCollection = parsedAnnotationObject;
|
|
353
|
+
parsedAnnotationCollection.collection = annotationObject.map(function (subAnnotationObject, subAnnotationIndex) {
|
|
354
|
+
return parseAnnotationObject(subAnnotationObject, currentObjectTarget + "/" + subAnnotationIndex, annotationsLists, oCapabilities);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
if (annotationObject.length > 0) {
|
|
358
|
+
if (annotationObject[0].hasOwnProperty("$PropertyPath")) {
|
|
359
|
+
parsedAnnotationCollection.collection.type = "PropertyPath";
|
|
360
|
+
} else if (annotationObject[0].hasOwnProperty("$Path")) {
|
|
361
|
+
parsedAnnotationCollection.collection.type = "Path";
|
|
362
|
+
} else if (annotationObject[0].hasOwnProperty("$NavigationPropertyPath")) {
|
|
363
|
+
parsedAnnotationCollection.collection.type = "NavigationPropertyPath";
|
|
364
|
+
} else if (annotationObject[0].hasOwnProperty("$AnnotationPath")) {
|
|
365
|
+
parsedAnnotationCollection.collection.type = "AnnotationPath";
|
|
366
|
+
} else if (annotationObject[0].hasOwnProperty("$Type")) {
|
|
367
|
+
parsedAnnotationCollection.collection.type = "Record";
|
|
368
|
+
} else if (annotationObject[0].hasOwnProperty("$If")) {
|
|
369
|
+
parsedAnnotationCollection.collection.type = "If";
|
|
370
|
+
} else if (annotationObject[0].hasOwnProperty("$And")) {
|
|
371
|
+
parsedAnnotationCollection.collection.type = "And";
|
|
372
|
+
} else if (annotationObject[0].hasOwnProperty("$Or")) {
|
|
373
|
+
parsedAnnotationCollection.collection.type = "Or";
|
|
374
|
+
} else if (annotationObject[0].hasOwnProperty("$Eq")) {
|
|
375
|
+
parsedAnnotationCollection.collection.type = "Eq";
|
|
376
|
+
} else if (annotationObject[0].hasOwnProperty("$Ne")) {
|
|
377
|
+
parsedAnnotationCollection.collection.type = "Ne";
|
|
378
|
+
} else if (annotationObject[0].hasOwnProperty("$Not")) {
|
|
379
|
+
parsedAnnotationCollection.collection.type = "Not";
|
|
380
|
+
} else if (annotationObject[0].hasOwnProperty("$Gt")) {
|
|
381
|
+
parsedAnnotationCollection.collection.type = "Gt";
|
|
382
|
+
} else if (annotationObject[0].hasOwnProperty("$Ge")) {
|
|
383
|
+
parsedAnnotationCollection.collection.type = "Ge";
|
|
384
|
+
} else if (annotationObject[0].hasOwnProperty("$Lt")) {
|
|
385
|
+
parsedAnnotationCollection.collection.type = "Lt";
|
|
386
|
+
} else if (annotationObject[0].hasOwnProperty("$Le")) {
|
|
387
|
+
parsedAnnotationCollection.collection.type = "Le";
|
|
388
|
+
} else if (annotationObject[0].hasOwnProperty("$Apply")) {
|
|
389
|
+
parsedAnnotationCollection.collection.type = "Apply";
|
|
390
|
+
} else if (typeof annotationObject[0] === "object") {
|
|
391
|
+
parsedAnnotationCollection.collection.type = "Record";
|
|
392
|
+
} else {
|
|
393
|
+
parsedAnnotationCollection.collection.type = "String";
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
} else {
|
|
397
|
+
if (annotationObject.$Type) {
|
|
398
|
+
var typeValue = annotationObject.$Type;
|
|
399
|
+
parsedAnnotationObject.type = typeValue; //`${typeAlias}.${typeTerm}`;
|
|
216
400
|
}
|
|
217
401
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
402
|
+
var propertyValues = [];
|
|
403
|
+
Object.keys(annotationObject).forEach(function (propertyKey) {
|
|
404
|
+
if (propertyKey !== "$Type" && propertyKey !== "$If" && propertyKey !== "$Apply" && propertyKey !== "$And" && propertyKey !== "$Or" && propertyKey !== "$Ne" && propertyKey !== "$Gt" && propertyKey !== "$Ge" && propertyKey !== "$Lt" && propertyKey !== "$Le" && propertyKey !== "$Not" && propertyKey !== "$Eq" && !propertyKey.startsWith("@")) {
|
|
405
|
+
propertyValues.push(parsePropertyValue(annotationObject[propertyKey], propertyKey, currentObjectTarget, annotationsLists, oCapabilities));
|
|
406
|
+
} else if (propertyKey.startsWith("@")) {
|
|
407
|
+
// Annotation of annotation
|
|
408
|
+
createAnnotationLists(_defineProperty({}, propertyKey, annotationObject[propertyKey]), currentObjectTarget, annotationsLists, oCapabilities);
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
parsedAnnotationObject.propertyValues = propertyValues;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return parsedAnnotationObject;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
function getOrCreateAnnotationList(target, annotationsLists) {
|
|
418
|
+
if (!annotationsLists.hasOwnProperty(target)) {
|
|
419
|
+
annotationsLists[target] = {
|
|
420
|
+
target: target,
|
|
421
|
+
annotations: []
|
|
221
422
|
};
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
if (
|
|
230
|
-
|
|
231
|
-
pathPart = "";
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
return annotationsLists[target];
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
function removeChartAnnotations(annotationObject) {
|
|
429
|
+
return annotationObject.filter(function (oRecord) {
|
|
430
|
+
if (oRecord.Target && oRecord.Target.$AnnotationPath) {
|
|
431
|
+
return oRecord.Target.$AnnotationPath.indexOf("@com.sap.vocabularies.UI.v1.Chart") === -1;
|
|
232
432
|
} else {
|
|
233
|
-
|
|
433
|
+
return true;
|
|
234
434
|
}
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
function removeIBNAnnotations(annotationObject) {
|
|
439
|
+
return annotationObject.filter(function (oRecord) {
|
|
440
|
+
return oRecord.$Type !== "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation";
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
function handlePresentationVariant(annotationObject) {
|
|
445
|
+
return annotationObject.filter(function (oRecord) {
|
|
446
|
+
return oRecord.$AnnotationPath !== "@com.sap.vocabularies.UI.v1.Chart";
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
function createAnnotationLists(annotationObjects, annotationTarget, annotationLists, oCapabilities) {
|
|
451
|
+
if (Object.keys(annotationObjects).length === 0) {
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
var outAnnotationObject = getOrCreateAnnotationList(annotationTarget, annotationLists);
|
|
235
456
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
|
|
457
|
+
if (!oCapabilities.MicroChart) {
|
|
458
|
+
delete annotationObjects["@com.sap.vocabularies.UI.v1.Chart"];
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
var _loop = function (_annotationKey) {
|
|
462
|
+
var annotationObject = annotationObjects[_annotationKey];
|
|
463
|
+
|
|
464
|
+
switch (_annotationKey) {
|
|
465
|
+
case "@com.sap.vocabularies.UI.v1.HeaderFacets":
|
|
466
|
+
if (!oCapabilities.MicroChart) {
|
|
467
|
+
annotationObject = removeChartAnnotations(annotationObject);
|
|
468
|
+
annotationObjects[_annotationKey] = annotationObject;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
break;
|
|
472
|
+
|
|
473
|
+
case "@com.sap.vocabularies.UI.v1.Identification":
|
|
474
|
+
if (!oCapabilities.IntentBasedNavigation) {
|
|
475
|
+
annotationObject = removeIBNAnnotations(annotationObject);
|
|
476
|
+
annotationObjects[_annotationKey] = annotationObject;
|
|
477
|
+
}
|
|
241
478
|
|
|
242
|
-
|
|
479
|
+
break;
|
|
480
|
+
|
|
481
|
+
case "@com.sap.vocabularies.UI.v1.LineItem":
|
|
482
|
+
if (!oCapabilities.IntentBasedNavigation) {
|
|
483
|
+
annotationObject = removeIBNAnnotations(annotationObject);
|
|
484
|
+
annotationObjects[_annotationKey] = annotationObject;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
if (!oCapabilities.MicroChart) {
|
|
488
|
+
annotationObject = removeChartAnnotations(annotationObject);
|
|
489
|
+
annotationObjects[_annotationKey] = annotationObject;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
break;
|
|
493
|
+
|
|
494
|
+
case "@com.sap.vocabularies.UI.v1.FieldGroup":
|
|
495
|
+
if (!oCapabilities.IntentBasedNavigation) {
|
|
496
|
+
annotationObject.Data = removeIBNAnnotations(annotationObject.Data);
|
|
497
|
+
annotationObjects[_annotationKey] = annotationObject;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
if (!oCapabilities.MicroChart) {
|
|
501
|
+
annotationObject.Data = removeChartAnnotations(annotationObject.Data);
|
|
502
|
+
annotationObjects[_annotationKey] = annotationObject;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
break;
|
|
506
|
+
|
|
507
|
+
case "@com.sap.vocabularies.UI.v1.PresentationVariant":
|
|
508
|
+
if (!oCapabilities.Chart && annotationObject.Visualizations) {
|
|
509
|
+
annotationObject.Visualizations = handlePresentationVariant(annotationObject.Visualizations);
|
|
510
|
+
annotationObjects[_annotationKey] = annotationObject;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
break;
|
|
514
|
+
|
|
515
|
+
default:
|
|
516
|
+
break;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
var currentOutAnnotationObject = outAnnotationObject; // Check for annotation of annotation
|
|
520
|
+
|
|
521
|
+
var annotationOfAnnotationSplit = _annotationKey.split("@");
|
|
522
|
+
|
|
523
|
+
if (annotationOfAnnotationSplit.length > 2) {
|
|
524
|
+
currentOutAnnotationObject = getOrCreateAnnotationList(annotationTarget + "@" + annotationOfAnnotationSplit[1], annotationLists);
|
|
525
|
+
_annotationKey = annotationOfAnnotationSplit[2];
|
|
526
|
+
} else {
|
|
527
|
+
_annotationKey = annotationOfAnnotationSplit[1];
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
var annotationQualifierSplit = _annotationKey.split("#");
|
|
531
|
+
|
|
532
|
+
var qualifier = annotationQualifierSplit[1];
|
|
533
|
+
_annotationKey = annotationQualifierSplit[0];
|
|
534
|
+
var parsedAnnotationObject = {
|
|
535
|
+
term: "".concat(_annotationKey),
|
|
536
|
+
qualifier: qualifier
|
|
537
|
+
};
|
|
538
|
+
var currentAnnotationTarget = annotationTarget + "@" + parsedAnnotationObject.term;
|
|
539
|
+
|
|
540
|
+
if (qualifier) {
|
|
541
|
+
currentAnnotationTarget += "#" + qualifier;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
var isCollection = false;
|
|
545
|
+
var typeofAnnotation = typeof annotationObject;
|
|
243
546
|
|
|
244
547
|
if (annotationObject === null) {
|
|
245
|
-
parsedAnnotationObject = {
|
|
246
|
-
type: "
|
|
247
|
-
|
|
548
|
+
parsedAnnotationObject.value = {
|
|
549
|
+
type: "Bool",
|
|
550
|
+
Bool: annotationObject
|
|
248
551
|
};
|
|
249
|
-
} else if (
|
|
250
|
-
parsedAnnotationObject = {
|
|
552
|
+
} else if (typeofAnnotation === "string") {
|
|
553
|
+
parsedAnnotationObject.value = {
|
|
251
554
|
type: "String",
|
|
252
555
|
String: annotationObject
|
|
253
556
|
};
|
|
254
|
-
} else if (
|
|
255
|
-
parsedAnnotationObject = {
|
|
557
|
+
} else if (typeofAnnotation === "boolean") {
|
|
558
|
+
parsedAnnotationObject.value = {
|
|
256
559
|
type: "Bool",
|
|
257
560
|
Bool: annotationObject
|
|
258
561
|
};
|
|
259
|
-
} else if (
|
|
260
|
-
parsedAnnotationObject = {
|
|
562
|
+
} else if (typeofAnnotation === "number") {
|
|
563
|
+
parsedAnnotationObject.value = {
|
|
261
564
|
type: "Int",
|
|
262
565
|
Int: annotationObject
|
|
263
566
|
};
|
|
264
|
-
} else if (annotationObject.$AnnotationPath !== undefined) {
|
|
265
|
-
parsedAnnotationObject = {
|
|
266
|
-
type: "AnnotationPath",
|
|
267
|
-
AnnotationPath: annotationObject.$AnnotationPath
|
|
268
|
-
};
|
|
269
|
-
} else if (annotationObject.$Path !== undefined) {
|
|
270
|
-
parsedAnnotationObject = {
|
|
271
|
-
type: "Path",
|
|
272
|
-
Path: annotationObject.$Path
|
|
273
|
-
};
|
|
274
|
-
} else if (annotationObject.$Decimal !== undefined) {
|
|
275
|
-
parsedAnnotationObject = {
|
|
276
|
-
type: "Decimal",
|
|
277
|
-
Decimal: parseFloat(annotationObject.$Decimal)
|
|
278
|
-
};
|
|
279
|
-
} else if (annotationObject.$PropertyPath !== undefined) {
|
|
280
|
-
parsedAnnotationObject = {
|
|
281
|
-
type: "PropertyPath",
|
|
282
|
-
PropertyPath: annotationObject.$PropertyPath
|
|
283
|
-
};
|
|
284
567
|
} else if (annotationObject.$If !== undefined) {
|
|
285
|
-
parsedAnnotationObject = {
|
|
568
|
+
parsedAnnotationObject.value = {
|
|
286
569
|
type: "If",
|
|
287
570
|
If: annotationObject.$If
|
|
288
571
|
};
|
|
289
572
|
} else if (annotationObject.$And !== undefined) {
|
|
290
|
-
parsedAnnotationObject = {
|
|
573
|
+
parsedAnnotationObject.value = {
|
|
291
574
|
type: "And",
|
|
292
575
|
And: annotationObject.$And
|
|
293
576
|
};
|
|
294
577
|
} else if (annotationObject.$Or !== undefined) {
|
|
295
|
-
parsedAnnotationObject = {
|
|
578
|
+
parsedAnnotationObject.value = {
|
|
296
579
|
type: "Or",
|
|
297
580
|
Or: annotationObject.$Or
|
|
298
581
|
};
|
|
299
582
|
} else if (annotationObject.$Not !== undefined) {
|
|
300
|
-
parsedAnnotationObject = {
|
|
583
|
+
parsedAnnotationObject.value = {
|
|
301
584
|
type: "Not",
|
|
302
585
|
Not: annotationObject.$Not
|
|
303
586
|
};
|
|
304
587
|
} else if (annotationObject.$Eq !== undefined) {
|
|
305
|
-
parsedAnnotationObject = {
|
|
588
|
+
parsedAnnotationObject.value = {
|
|
306
589
|
type: "Eq",
|
|
307
590
|
Eq: annotationObject.$Eq
|
|
308
591
|
};
|
|
309
592
|
} else if (annotationObject.$Ne !== undefined) {
|
|
310
|
-
parsedAnnotationObject = {
|
|
593
|
+
parsedAnnotationObject.value = {
|
|
311
594
|
type: "Ne",
|
|
312
595
|
Ne: annotationObject.$Ne
|
|
313
596
|
};
|
|
314
597
|
} else if (annotationObject.$Gt !== undefined) {
|
|
315
|
-
parsedAnnotationObject = {
|
|
598
|
+
parsedAnnotationObject.value = {
|
|
316
599
|
type: "Gt",
|
|
317
600
|
Gt: annotationObject.$Gt
|
|
318
601
|
};
|
|
319
602
|
} else if (annotationObject.$Ge !== undefined) {
|
|
320
|
-
parsedAnnotationObject = {
|
|
603
|
+
parsedAnnotationObject.value = {
|
|
321
604
|
type: "Ge",
|
|
322
605
|
Ge: annotationObject.$Ge
|
|
323
606
|
};
|
|
324
607
|
} else if (annotationObject.$Lt !== undefined) {
|
|
325
|
-
parsedAnnotationObject = {
|
|
608
|
+
parsedAnnotationObject.value = {
|
|
326
609
|
type: "Lt",
|
|
327
610
|
Lt: annotationObject.$Lt
|
|
328
611
|
};
|
|
329
612
|
} else if (annotationObject.$Le !== undefined) {
|
|
330
|
-
parsedAnnotationObject = {
|
|
613
|
+
parsedAnnotationObject.value = {
|
|
331
614
|
type: "Le",
|
|
332
615
|
Le: annotationObject.$Le
|
|
333
616
|
};
|
|
334
617
|
} else if (annotationObject.$Apply !== undefined) {
|
|
335
|
-
parsedAnnotationObject = {
|
|
618
|
+
parsedAnnotationObject.value = {
|
|
336
619
|
type: "Apply",
|
|
337
620
|
Apply: annotationObject.$Apply,
|
|
338
621
|
Function: annotationObject.$Function
|
|
339
622
|
};
|
|
340
|
-
} else if (annotationObject.$
|
|
341
|
-
parsedAnnotationObject = {
|
|
342
|
-
type: "
|
|
343
|
-
|
|
623
|
+
} else if (annotationObject.$Path !== undefined) {
|
|
624
|
+
parsedAnnotationObject.value = {
|
|
625
|
+
type: "Path",
|
|
626
|
+
Path: annotationObject.$Path
|
|
627
|
+
};
|
|
628
|
+
} else if (annotationObject.$AnnotationPath !== undefined) {
|
|
629
|
+
parsedAnnotationObject.value = {
|
|
630
|
+
type: "AnnotationPath",
|
|
631
|
+
AnnotationPath: annotationObject.$AnnotationPath
|
|
632
|
+
};
|
|
633
|
+
} else if (annotationObject.$Decimal !== undefined) {
|
|
634
|
+
parsedAnnotationObject.value = {
|
|
635
|
+
type: "Decimal",
|
|
636
|
+
Decimal: parseFloat(annotationObject.$Decimal)
|
|
344
637
|
};
|
|
345
638
|
} else if (annotationObject.$EnumMember !== undefined) {
|
|
346
|
-
parsedAnnotationObject = {
|
|
639
|
+
parsedAnnotationObject.value = {
|
|
347
640
|
type: "EnumMember",
|
|
348
|
-
EnumMember:
|
|
641
|
+
EnumMember: mapNameToAlias(annotationObject.$EnumMember.split("/")[0]) + "/" + annotationObject.$EnumMember.split("/")[1]
|
|
349
642
|
};
|
|
350
643
|
} else if (Array.isArray(annotationObject)) {
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
return
|
|
644
|
+
isCollection = true;
|
|
645
|
+
parsedAnnotationObject.collection = annotationObject.map(function (subAnnotationObject, subAnnotationIndex) {
|
|
646
|
+
return parseAnnotationObject(subAnnotationObject, currentAnnotationTarget + "/" + subAnnotationIndex, annotationLists, oCapabilities);
|
|
354
647
|
});
|
|
355
648
|
|
|
356
649
|
if (annotationObject.length > 0) {
|
|
357
650
|
if (annotationObject[0].hasOwnProperty("$PropertyPath")) {
|
|
358
|
-
|
|
651
|
+
parsedAnnotationObject.collection.type = "PropertyPath";
|
|
359
652
|
} else if (annotationObject[0].hasOwnProperty("$Path")) {
|
|
360
|
-
|
|
653
|
+
parsedAnnotationObject.collection.type = "Path";
|
|
361
654
|
} else if (annotationObject[0].hasOwnProperty("$NavigationPropertyPath")) {
|
|
362
|
-
|
|
655
|
+
parsedAnnotationObject.collection.type = "NavigationPropertyPath";
|
|
363
656
|
} else if (annotationObject[0].hasOwnProperty("$AnnotationPath")) {
|
|
364
|
-
|
|
657
|
+
parsedAnnotationObject.collection.type = "AnnotationPath";
|
|
365
658
|
} else if (annotationObject[0].hasOwnProperty("$Type")) {
|
|
366
|
-
|
|
659
|
+
parsedAnnotationObject.collection.type = "Record";
|
|
367
660
|
} else if (annotationObject[0].hasOwnProperty("$If")) {
|
|
368
|
-
|
|
369
|
-
} else if (annotationObject[0].hasOwnProperty("$And")) {
|
|
370
|
-
parsedAnnotationCollection.collection.type = "And";
|
|
661
|
+
parsedAnnotationObject.collection.type = "If";
|
|
371
662
|
} else if (annotationObject[0].hasOwnProperty("$Or")) {
|
|
372
|
-
|
|
663
|
+
parsedAnnotationObject.collection.type = "Or";
|
|
373
664
|
} else if (annotationObject[0].hasOwnProperty("$Eq")) {
|
|
374
|
-
|
|
665
|
+
parsedAnnotationObject.collection.type = "Eq";
|
|
375
666
|
} else if (annotationObject[0].hasOwnProperty("$Ne")) {
|
|
376
|
-
|
|
667
|
+
parsedAnnotationObject.collection.type = "Ne";
|
|
377
668
|
} else if (annotationObject[0].hasOwnProperty("$Not")) {
|
|
378
|
-
|
|
669
|
+
parsedAnnotationObject.collection.type = "Not";
|
|
379
670
|
} else if (annotationObject[0].hasOwnProperty("$Gt")) {
|
|
380
|
-
|
|
671
|
+
parsedAnnotationObject.collection.type = "Gt";
|
|
381
672
|
} else if (annotationObject[0].hasOwnProperty("$Ge")) {
|
|
382
|
-
|
|
673
|
+
parsedAnnotationObject.collection.type = "Ge";
|
|
383
674
|
} else if (annotationObject[0].hasOwnProperty("$Lt")) {
|
|
384
|
-
|
|
675
|
+
parsedAnnotationObject.collection.type = "Lt";
|
|
385
676
|
} else if (annotationObject[0].hasOwnProperty("$Le")) {
|
|
386
|
-
|
|
677
|
+
parsedAnnotationObject.collection.type = "Le";
|
|
678
|
+
} else if (annotationObject[0].hasOwnProperty("$And")) {
|
|
679
|
+
parsedAnnotationObject.collection.type = "And";
|
|
387
680
|
} else if (annotationObject[0].hasOwnProperty("$Apply")) {
|
|
388
|
-
|
|
681
|
+
parsedAnnotationObject.collection.type = "Apply";
|
|
389
682
|
} else if (typeof annotationObject[0] === "object") {
|
|
390
|
-
|
|
683
|
+
parsedAnnotationObject.collection.type = "Record";
|
|
391
684
|
} else {
|
|
392
|
-
|
|
685
|
+
parsedAnnotationObject.collection.type = "String";
|
|
393
686
|
}
|
|
394
687
|
}
|
|
395
688
|
} else {
|
|
689
|
+
var record = {
|
|
690
|
+
propertyValues: []
|
|
691
|
+
};
|
|
692
|
+
|
|
396
693
|
if (annotationObject.$Type) {
|
|
397
694
|
var typeValue = annotationObject.$Type;
|
|
398
|
-
|
|
695
|
+
record.type = "".concat(typeValue);
|
|
399
696
|
}
|
|
400
697
|
|
|
401
698
|
var propertyValues = [];
|
|
402
|
-
Object.keys(annotationObject).forEach(function (propertyKey) {
|
|
403
|
-
if (propertyKey !== "$Type" && propertyKey !== "$If" && propertyKey !== "$Apply" && propertyKey !== "$And" && propertyKey !== "$Or" && propertyKey !== "$Ne" && propertyKey !== "$Gt" && propertyKey !== "$Ge" && propertyKey !== "$Lt" && propertyKey !== "$Le" && propertyKey !== "$Not" && propertyKey !== "$Eq" && !propertyKey.startsWith("@")) {
|
|
404
|
-
propertyValues.push(_this2.parsePropertyValue(annotationObject[propertyKey], propertyKey, currentObjectTarget, annotationsLists, oCapabilities));
|
|
405
|
-
} else if (propertyKey.startsWith("@")) {
|
|
406
|
-
// Annotation of annotation
|
|
407
|
-
_this2.createAnnotationLists(_defineProperty({}, propertyKey, annotationObject[propertyKey]), currentObjectTarget, annotationsLists, oCapabilities);
|
|
408
|
-
}
|
|
409
|
-
});
|
|
410
|
-
parsedAnnotationObject.propertyValues = propertyValues;
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
return parsedAnnotationObject;
|
|
414
|
-
},
|
|
415
|
-
getOrCreateAnnotationList: function (target, annotationsLists) {
|
|
416
|
-
var potentialTarget = annotationsLists.find(function (annotationList) {
|
|
417
|
-
return annotationList.target === target;
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
if (!potentialTarget) {
|
|
421
|
-
potentialTarget = {
|
|
422
|
-
target: target,
|
|
423
|
-
annotations: []
|
|
424
|
-
};
|
|
425
|
-
annotationsLists.push(potentialTarget);
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
return potentialTarget;
|
|
429
|
-
},
|
|
430
|
-
createAnnotationLists: function (annotationObjects, annotationTarget, annotationLists, oCapabilities) {
|
|
431
|
-
var _this3 = this;
|
|
432
|
-
|
|
433
|
-
var outAnnotationObject = this.getOrCreateAnnotationList(annotationTarget, annotationLists);
|
|
434
|
-
|
|
435
|
-
if (!oCapabilities.MicroChart) {
|
|
436
|
-
delete annotationObjects["@com.sap.vocabularies.UI.v1.Chart"];
|
|
437
|
-
}
|
|
438
699
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
700
|
+
for (var propertyKey in annotationObject) {
|
|
701
|
+
if (propertyKey !== "$Type" && !propertyKey.startsWith("@")) {
|
|
702
|
+
propertyValues.push(parsePropertyValue(annotationObject[propertyKey], propertyKey, currentAnnotationTarget, annotationLists, oCapabilities));
|
|
703
|
+
} else if (propertyKey.startsWith("@")) {
|
|
704
|
+
// Annotation of record
|
|
705
|
+
createAnnotationLists(_defineProperty({}, propertyKey, annotationObject[propertyKey]), currentAnnotationTarget, annotationLists, oCapabilities);
|
|
445
706
|
}
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
function removeIBNAnnotations(annotationObject) {
|
|
450
|
-
return annotationObject.filter(function (oRecord) {
|
|
451
|
-
return oRecord.$Type !== "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation";
|
|
452
|
-
});
|
|
453
|
-
}
|
|
707
|
+
}
|
|
454
708
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
return oRecord.$AnnotationPath !== "@com.sap.vocabularies.UI.v1.Chart";
|
|
458
|
-
});
|
|
709
|
+
record.propertyValues = propertyValues;
|
|
710
|
+
parsedAnnotationObject.record = record;
|
|
459
711
|
}
|
|
460
712
|
|
|
461
|
-
|
|
462
|
-
|
|
713
|
+
parsedAnnotationObject.isCollection = isCollection;
|
|
714
|
+
currentOutAnnotationObject.annotations.push(parsedAnnotationObject);
|
|
715
|
+
annotationKey = _annotationKey;
|
|
716
|
+
};
|
|
463
717
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
}
|
|
718
|
+
for (var annotationKey in annotationObjects) {
|
|
719
|
+
_loop(annotationKey);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
469
722
|
|
|
470
|
-
|
|
723
|
+
function prepareProperty(propertyDefinition, entityTypeObject, propertyName) {
|
|
724
|
+
var propertyObject = {
|
|
725
|
+
_type: "Property",
|
|
726
|
+
name: propertyName,
|
|
727
|
+
fullyQualifiedName: "".concat(entityTypeObject.fullyQualifiedName, "/").concat(propertyName),
|
|
728
|
+
type: propertyDefinition.$Type,
|
|
729
|
+
maxLength: propertyDefinition.$MaxLength,
|
|
730
|
+
precision: propertyDefinition.$Precision,
|
|
731
|
+
scale: propertyDefinition.$Scale,
|
|
732
|
+
nullable: propertyDefinition.$Nullable
|
|
733
|
+
};
|
|
734
|
+
return propertyObject;
|
|
735
|
+
}
|
|
471
736
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
annotationObject = removeIBNAnnotations(annotationObject);
|
|
475
|
-
}
|
|
737
|
+
function prepareNavigationProperty(navPropertyDefinition, entityTypeObject, navPropertyName) {
|
|
738
|
+
var referentialConstraint = [];
|
|
476
739
|
|
|
477
|
-
|
|
740
|
+
if (navPropertyDefinition.$ReferentialConstraint) {
|
|
741
|
+
referentialConstraint = Object.keys(navPropertyDefinition.$ReferentialConstraint).map(function (sourcePropertyName) {
|
|
742
|
+
return {
|
|
743
|
+
sourceTypeName: entityTypeObject.name,
|
|
744
|
+
sourceProperty: sourcePropertyName,
|
|
745
|
+
targetTypeName: navPropertyDefinition.$Type,
|
|
746
|
+
targetProperty: navPropertyDefinition.$ReferentialConstraint[sourcePropertyName]
|
|
747
|
+
};
|
|
748
|
+
});
|
|
749
|
+
}
|
|
478
750
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
751
|
+
var navigationProperty = {
|
|
752
|
+
_type: "NavigationProperty",
|
|
753
|
+
name: navPropertyName,
|
|
754
|
+
fullyQualifiedName: "".concat(entityTypeObject.fullyQualifiedName, "/").concat(navPropertyName),
|
|
755
|
+
partner: navPropertyDefinition.$Partner,
|
|
756
|
+
isCollection: navPropertyDefinition.$isCollection ? navPropertyDefinition.$isCollection : false,
|
|
757
|
+
containsTarget: navPropertyDefinition.$ContainsTarget,
|
|
758
|
+
targetTypeName: navPropertyDefinition.$Type,
|
|
759
|
+
referentialConstraint: referentialConstraint
|
|
760
|
+
};
|
|
761
|
+
return navigationProperty;
|
|
762
|
+
}
|
|
483
763
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
764
|
+
function prepareEntitySet(entitySetDefinition, entitySetName, entityContainerName) {
|
|
765
|
+
var entitySetObject = {
|
|
766
|
+
_type: "EntitySet",
|
|
767
|
+
name: entitySetName,
|
|
768
|
+
navigationPropertyBinding: {},
|
|
769
|
+
entityTypeName: entitySetDefinition.$Type,
|
|
770
|
+
fullyQualifiedName: "".concat(entityContainerName, "/").concat(entitySetName)
|
|
771
|
+
};
|
|
772
|
+
return entitySetObject;
|
|
773
|
+
}
|
|
487
774
|
|
|
488
|
-
|
|
775
|
+
function prepareSingleton(singletonDefinition, singletonName, entityContainerName) {
|
|
776
|
+
var singletonObject = {
|
|
777
|
+
_type: "Singleton",
|
|
778
|
+
name: singletonName,
|
|
779
|
+
navigationPropertyBinding: {},
|
|
780
|
+
typeName: singletonDefinition.$Type,
|
|
781
|
+
fullyQualifiedName: "".concat(entityContainerName, "/").concat(singletonName),
|
|
782
|
+
nullable: true
|
|
783
|
+
};
|
|
784
|
+
return singletonObject;
|
|
785
|
+
}
|
|
489
786
|
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
787
|
+
function prepareTypeDefinition(typeDefinition, typeName, namespace) {
|
|
788
|
+
var typeObject = {
|
|
789
|
+
_type: "TypeDefinition",
|
|
790
|
+
name: typeName.replace(namespace + ".", ""),
|
|
791
|
+
fullyQualifiedName: typeName,
|
|
792
|
+
underlyingType: typeDefinition.$UnderlyingType
|
|
793
|
+
};
|
|
794
|
+
return typeObject;
|
|
795
|
+
}
|
|
494
796
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
797
|
+
function prepareComplexType(complexTypeDefinition, complexTypeName, namespace) {
|
|
798
|
+
var complexTypeObject = {
|
|
799
|
+
_type: "ComplexType",
|
|
800
|
+
name: complexTypeName.replace(namespace + ".", ""),
|
|
801
|
+
fullyQualifiedName: complexTypeName,
|
|
802
|
+
properties: [],
|
|
803
|
+
navigationProperties: []
|
|
804
|
+
};
|
|
805
|
+
var complexTypeProperties = Object.keys(complexTypeDefinition).filter(function (propertyNameOrNot) {
|
|
806
|
+
if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
|
|
807
|
+
return complexTypeDefinition[propertyNameOrNot].$kind === "Property";
|
|
808
|
+
}
|
|
809
|
+
}).sort(function (a, b) {
|
|
810
|
+
return a > b ? 1 : -1;
|
|
811
|
+
}).map(function (propertyName) {
|
|
812
|
+
return prepareProperty(complexTypeDefinition[propertyName], complexTypeObject, propertyName);
|
|
813
|
+
});
|
|
814
|
+
complexTypeObject.properties = complexTypeProperties;
|
|
815
|
+
var complexTypeNavigationProperties = Object.keys(complexTypeDefinition).filter(function (propertyNameOrNot) {
|
|
816
|
+
if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
|
|
817
|
+
return complexTypeDefinition[propertyNameOrNot].$kind === "NavigationProperty";
|
|
818
|
+
}
|
|
819
|
+
}).sort(function (a, b) {
|
|
820
|
+
return a > b ? 1 : -1;
|
|
821
|
+
}).map(function (navPropertyName) {
|
|
822
|
+
return prepareNavigationProperty(complexTypeDefinition[navPropertyName], complexTypeObject, navPropertyName);
|
|
823
|
+
});
|
|
824
|
+
complexTypeObject.navigationProperties = complexTypeNavigationProperties;
|
|
825
|
+
return complexTypeObject;
|
|
826
|
+
}
|
|
498
827
|
|
|
499
|
-
|
|
828
|
+
function prepareEntityKeys(entityTypeDefinition, oMetaModelData) {
|
|
829
|
+
if (!entityTypeDefinition.$Key && entityTypeDefinition.$BaseType) {
|
|
830
|
+
return prepareEntityKeys(oMetaModelData["".concat(entityTypeDefinition.$BaseType)], oMetaModelData);
|
|
831
|
+
}
|
|
500
832
|
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
annotationObject.Visualizations = handlePresentationVariant(annotationObject.Visualizations);
|
|
504
|
-
}
|
|
833
|
+
return entityTypeDefinition.$Key || []; //handling of entity types without key as well as basetype
|
|
834
|
+
}
|
|
505
835
|
|
|
506
|
-
|
|
836
|
+
function prepareEntityType(entityTypeDefinition, entityTypeName, namespace, metaModelData) {
|
|
837
|
+
var entityKeys = prepareEntityKeys(entityTypeDefinition, metaModelData);
|
|
838
|
+
var entityTypeObject = {
|
|
839
|
+
_type: "EntityType",
|
|
840
|
+
name: entityTypeName.replace(namespace + ".", ""),
|
|
841
|
+
fullyQualifiedName: entityTypeName,
|
|
842
|
+
keys: [],
|
|
843
|
+
entityProperties: [],
|
|
844
|
+
navigationProperties: []
|
|
845
|
+
};
|
|
846
|
+
var entityProperties = Object.keys(entityTypeDefinition).filter(function (propertyNameOrNot) {
|
|
847
|
+
if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
|
|
848
|
+
return entityTypeDefinition[propertyNameOrNot].$kind === "Property";
|
|
849
|
+
}
|
|
850
|
+
}).map(function (propertyName) {
|
|
851
|
+
return prepareProperty(entityTypeDefinition[propertyName], entityTypeObject, propertyName);
|
|
852
|
+
});
|
|
853
|
+
var navigationProperties = Object.keys(entityTypeDefinition).filter(function (propertyNameOrNot) {
|
|
854
|
+
if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
|
|
855
|
+
return entityTypeDefinition[propertyNameOrNot].$kind === "NavigationProperty";
|
|
856
|
+
}
|
|
857
|
+
}).map(function (navPropertyName) {
|
|
858
|
+
return prepareNavigationProperty(entityTypeDefinition[navPropertyName], entityTypeObject, navPropertyName);
|
|
859
|
+
});
|
|
860
|
+
entityTypeObject.keys = entityKeys.map(function (entityKey) {
|
|
861
|
+
return entityProperties.find(function (property) {
|
|
862
|
+
return property.name === entityKey;
|
|
863
|
+
});
|
|
864
|
+
}).filter(function (property) {
|
|
865
|
+
return property !== undefined;
|
|
866
|
+
});
|
|
867
|
+
entityTypeObject.entityProperties = entityProperties;
|
|
868
|
+
entityTypeObject.navigationProperties = navigationProperties;
|
|
869
|
+
return entityTypeObject;
|
|
870
|
+
}
|
|
507
871
|
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
872
|
+
function prepareAction(actionName, actionRawData, namespace, entityContainerName) {
|
|
873
|
+
var actionEntityType = "";
|
|
874
|
+
var actionFQN = "".concat(actionName);
|
|
875
|
+
var actionShortName = actionName.substr(namespace.length + 1);
|
|
511
876
|
|
|
512
|
-
|
|
513
|
-
|
|
877
|
+
if (actionRawData.$IsBound) {
|
|
878
|
+
var bindingParameter = actionRawData.$Parameter[0];
|
|
879
|
+
actionEntityType = bindingParameter.$Type;
|
|
514
880
|
|
|
515
|
-
|
|
881
|
+
if (bindingParameter.$isCollection === true) {
|
|
882
|
+
actionFQN = "".concat(actionName, "(Collection(").concat(actionEntityType, "))");
|
|
883
|
+
} else {
|
|
884
|
+
actionFQN = "".concat(actionName, "(").concat(actionEntityType, ")");
|
|
885
|
+
}
|
|
886
|
+
} else {
|
|
887
|
+
actionFQN = "".concat(entityContainerName, "/").concat(actionShortName);
|
|
888
|
+
}
|
|
516
889
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
890
|
+
var parameters = actionRawData.$Parameter || [];
|
|
891
|
+
return {
|
|
892
|
+
_type: "Action",
|
|
893
|
+
name: actionShortName,
|
|
894
|
+
fullyQualifiedName: actionFQN,
|
|
895
|
+
isBound: actionRawData.$IsBound,
|
|
896
|
+
isFunction: false,
|
|
897
|
+
sourceType: actionEntityType,
|
|
898
|
+
returnType: actionRawData.$ReturnType ? actionRawData.$ReturnType.$Type : "",
|
|
899
|
+
parameters: parameters.map(function (param) {
|
|
900
|
+
return {
|
|
901
|
+
_type: "ActionParameter",
|
|
902
|
+
isEntitySet: param.$Type === actionRawData.$EntitySetPath,
|
|
903
|
+
fullyQualifiedName: "".concat(actionFQN, "/").concat(param.$Name),
|
|
904
|
+
type: param.$Type // TODO missing properties ?
|
|
523
905
|
|
|
524
|
-
var annotationQualifierSplit = annotationKey.split("#");
|
|
525
|
-
var qualifier = annotationQualifierSplit[1];
|
|
526
|
-
annotationKey = annotationQualifierSplit[0];
|
|
527
|
-
var parsedAnnotationObject = {
|
|
528
|
-
term: "".concat(annotationKey),
|
|
529
|
-
qualifier: qualifier
|
|
530
906
|
};
|
|
531
|
-
|
|
907
|
+
})
|
|
908
|
+
};
|
|
909
|
+
}
|
|
532
910
|
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
911
|
+
function prepareEntityTypes(oMetaModel) {
|
|
912
|
+
var oCapabilities = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DefaultEnvironmentCapabilities;
|
|
913
|
+
var oMetaModelData = oMetaModel.getObject("/$");
|
|
914
|
+
var annotationLists = {};
|
|
915
|
+
var entityTypes = [];
|
|
916
|
+
var entitySets = [];
|
|
917
|
+
var singletons = [];
|
|
918
|
+
var complexTypes = [];
|
|
919
|
+
var typeDefinitions = [];
|
|
920
|
+
var entityContainerName = oMetaModelData.$EntityContainer;
|
|
921
|
+
var namespace = "";
|
|
922
|
+
var schemaKeys = Object.keys(oMetaModelData).filter(function (metamodelKey) {
|
|
923
|
+
return oMetaModelData[metamodelKey].$kind === "Schema";
|
|
924
|
+
});
|
|
536
925
|
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
};
|
|
544
|
-
} else if (typeof annotationObject === "string") {
|
|
545
|
-
parsedAnnotationObject.value = {
|
|
546
|
-
type: "String",
|
|
547
|
-
String: annotationObject
|
|
548
|
-
};
|
|
549
|
-
} else if (typeof annotationObject === "boolean") {
|
|
550
|
-
parsedAnnotationObject.value = {
|
|
551
|
-
type: "Bool",
|
|
552
|
-
Bool: annotationObject
|
|
553
|
-
};
|
|
554
|
-
} else if (typeof annotationObject === "number") {
|
|
555
|
-
parsedAnnotationObject.value = {
|
|
556
|
-
type: "Int",
|
|
557
|
-
Int: annotationObject
|
|
558
|
-
};
|
|
559
|
-
} else if (annotationObject.$If !== undefined) {
|
|
560
|
-
parsedAnnotationObject.value = {
|
|
561
|
-
type: "If",
|
|
562
|
-
If: annotationObject.$If
|
|
563
|
-
};
|
|
564
|
-
} else if (annotationObject.$And !== undefined) {
|
|
565
|
-
parsedAnnotationObject.value = {
|
|
566
|
-
type: "And",
|
|
567
|
-
And: annotationObject.$And
|
|
568
|
-
};
|
|
569
|
-
} else if (annotationObject.$Or !== undefined) {
|
|
570
|
-
parsedAnnotationObject.value = {
|
|
571
|
-
type: "Or",
|
|
572
|
-
Or: annotationObject.$Or
|
|
573
|
-
};
|
|
574
|
-
} else if (annotationObject.$Not !== undefined) {
|
|
575
|
-
parsedAnnotationObject.value = {
|
|
576
|
-
type: "Not",
|
|
577
|
-
Not: annotationObject.$Not
|
|
578
|
-
};
|
|
579
|
-
} else if (annotationObject.$Eq !== undefined) {
|
|
580
|
-
parsedAnnotationObject.value = {
|
|
581
|
-
type: "Eq",
|
|
582
|
-
Eq: annotationObject.$Eq
|
|
583
|
-
};
|
|
584
|
-
} else if (annotationObject.$Ne !== undefined) {
|
|
585
|
-
parsedAnnotationObject.value = {
|
|
586
|
-
type: "Ne",
|
|
587
|
-
Ne: annotationObject.$Ne
|
|
588
|
-
};
|
|
589
|
-
} else if (annotationObject.$Gt !== undefined) {
|
|
590
|
-
parsedAnnotationObject.value = {
|
|
591
|
-
type: "Gt",
|
|
592
|
-
Gt: annotationObject.$Gt
|
|
593
|
-
};
|
|
594
|
-
} else if (annotationObject.$Ge !== undefined) {
|
|
595
|
-
parsedAnnotationObject.value = {
|
|
596
|
-
type: "Ge",
|
|
597
|
-
Ge: annotationObject.$Ge
|
|
598
|
-
};
|
|
599
|
-
} else if (annotationObject.$Lt !== undefined) {
|
|
600
|
-
parsedAnnotationObject.value = {
|
|
601
|
-
type: "Lt",
|
|
602
|
-
Lt: annotationObject.$Lt
|
|
603
|
-
};
|
|
604
|
-
} else if (annotationObject.$Le !== undefined) {
|
|
605
|
-
parsedAnnotationObject.value = {
|
|
606
|
-
type: "Le",
|
|
607
|
-
Le: annotationObject.$Le
|
|
608
|
-
};
|
|
609
|
-
} else if (annotationObject.$Apply !== undefined) {
|
|
610
|
-
parsedAnnotationObject.value = {
|
|
611
|
-
type: "Apply",
|
|
612
|
-
Apply: annotationObject.$Apply,
|
|
613
|
-
Function: annotationObject.$Function
|
|
614
|
-
};
|
|
615
|
-
} else if (annotationObject.$Path !== undefined) {
|
|
616
|
-
parsedAnnotationObject.value = {
|
|
617
|
-
type: "Path",
|
|
618
|
-
Path: annotationObject.$Path
|
|
619
|
-
};
|
|
620
|
-
} else if (annotationObject.$AnnotationPath !== undefined) {
|
|
621
|
-
parsedAnnotationObject.value = {
|
|
622
|
-
type: "AnnotationPath",
|
|
623
|
-
AnnotationPath: annotationObject.$AnnotationPath
|
|
624
|
-
};
|
|
625
|
-
} else if (annotationObject.$Decimal !== undefined) {
|
|
626
|
-
parsedAnnotationObject.value = {
|
|
627
|
-
type: "Decimal",
|
|
628
|
-
Decimal: parseFloat(annotationObject.$Decimal)
|
|
629
|
-
};
|
|
630
|
-
} else if (annotationObject.$EnumMember !== undefined) {
|
|
631
|
-
parsedAnnotationObject.value = {
|
|
632
|
-
type: "EnumMember",
|
|
633
|
-
EnumMember: _this3.mapNameToAlias(annotationObject.$EnumMember.split("/")[0]) + "/" + annotationObject.$EnumMember.split("/")[1]
|
|
634
|
-
};
|
|
635
|
-
} else if (Array.isArray(annotationObject)) {
|
|
636
|
-
isCollection = true;
|
|
637
|
-
parsedAnnotationObject.collection = annotationObject.map(function (subAnnotationObject, subAnnotationIndex) {
|
|
638
|
-
return _this3.parseAnnotationObject(subAnnotationObject, currentAnnotationTarget + "/" + subAnnotationIndex, annotationLists, oCapabilities);
|
|
639
|
-
});
|
|
926
|
+
if (schemaKeys && schemaKeys.length > 0) {
|
|
927
|
+
namespace = schemaKeys[0].substr(0, schemaKeys[0].length - 1);
|
|
928
|
+
} else if (entityTypes && entityTypes.length) {
|
|
929
|
+
namespace = entityTypes[0].fullyQualifiedName.replace(entityTypes[0].name, "");
|
|
930
|
+
namespace = namespace.substr(0, namespace.length - 1);
|
|
931
|
+
}
|
|
640
932
|
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
parsedAnnotationObject.collection.type = "Or";
|
|
656
|
-
} else if (annotationObject[0].hasOwnProperty("$Eq")) {
|
|
657
|
-
parsedAnnotationObject.collection.type = "Eq";
|
|
658
|
-
} else if (annotationObject[0].hasOwnProperty("$Ne")) {
|
|
659
|
-
parsedAnnotationObject.collection.type = "Ne";
|
|
660
|
-
} else if (annotationObject[0].hasOwnProperty("$Not")) {
|
|
661
|
-
parsedAnnotationObject.collection.type = "Not";
|
|
662
|
-
} else if (annotationObject[0].hasOwnProperty("$Gt")) {
|
|
663
|
-
parsedAnnotationObject.collection.type = "Gt";
|
|
664
|
-
} else if (annotationObject[0].hasOwnProperty("$Ge")) {
|
|
665
|
-
parsedAnnotationObject.collection.type = "Ge";
|
|
666
|
-
} else if (annotationObject[0].hasOwnProperty("$Lt")) {
|
|
667
|
-
parsedAnnotationObject.collection.type = "Lt";
|
|
668
|
-
} else if (annotationObject[0].hasOwnProperty("$Le")) {
|
|
669
|
-
parsedAnnotationObject.collection.type = "Le";
|
|
670
|
-
} else if (annotationObject[0].hasOwnProperty("$And")) {
|
|
671
|
-
parsedAnnotationObject.collection.type = "And";
|
|
672
|
-
} else if (annotationObject[0].hasOwnProperty("$Apply")) {
|
|
673
|
-
parsedAnnotationObject.collection.type = "Apply";
|
|
674
|
-
} else if (typeof annotationObject[0] === "object") {
|
|
675
|
-
parsedAnnotationObject.collection.type = "Record";
|
|
676
|
-
} else {
|
|
677
|
-
parsedAnnotationObject.collection.type = "String";
|
|
933
|
+
Object.keys(oMetaModelData).forEach(function (sObjectName) {
|
|
934
|
+
if (sObjectName !== "$kind") {
|
|
935
|
+
switch (oMetaModelData[sObjectName].$kind) {
|
|
936
|
+
case "EntityType":
|
|
937
|
+
var entityType = prepareEntityType(oMetaModelData[sObjectName], sObjectName, namespace, oMetaModelData); // Check if there are filter facets defined for the entityType and if yes, check if all of them have an ID
|
|
938
|
+
// The ID is optional, but it is internally taken for grouping filter fields and if it's not present
|
|
939
|
+
// a fallback ID needs to be generated here.
|
|
940
|
+
|
|
941
|
+
if (oMetaModelData.$Annotations[entityType.fullyQualifiedName] && oMetaModelData.$Annotations[entityType.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.FilterFacets"]) {
|
|
942
|
+
oMetaModelData.$Annotations[entityType.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.FilterFacets"].forEach(function (filterFacetAnnotation) {
|
|
943
|
+
filterFacetAnnotation.ID = filterFacetAnnotation.ID || generate([{
|
|
944
|
+
Facet: filterFacetAnnotation
|
|
945
|
+
}]);
|
|
946
|
+
});
|
|
678
947
|
}
|
|
679
|
-
}
|
|
680
|
-
} else {
|
|
681
|
-
var record = {
|
|
682
|
-
propertyValues: []
|
|
683
|
-
};
|
|
684
948
|
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
949
|
+
entityType.entityProperties.forEach(function (entityProperty) {
|
|
950
|
+
if (!oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]) {
|
|
951
|
+
oMetaModelData.$Annotations[entityProperty.fullyQualifiedName] = {};
|
|
952
|
+
}
|
|
689
953
|
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
}
|
|
954
|
+
if (!oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.DataFieldDefault"]) {
|
|
955
|
+
oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.DataFieldDefault"] = {
|
|
956
|
+
$Type: "com.sap.vocabularies.UI.v1.DataField",
|
|
957
|
+
Value: {
|
|
958
|
+
$Path: entityProperty.name
|
|
959
|
+
}
|
|
960
|
+
};
|
|
961
|
+
}
|
|
962
|
+
});
|
|
963
|
+
entityTypes.push(entityType);
|
|
964
|
+
break;
|
|
702
965
|
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
parseProperty: function (oMetaModel, entityTypeObject, propertyName, annotationLists, oCapabilities) {
|
|
708
|
-
var propertyAnnotation = oMetaModel.getObject("/".concat(entityTypeObject.fullyQualifiedName, "/").concat(propertyName, "@"));
|
|
709
|
-
var propertyDefinition = oMetaModel.getObject("/".concat(entityTypeObject.fullyQualifiedName, "/").concat(propertyName));
|
|
710
|
-
var propertyObject = {
|
|
711
|
-
_type: "Property",
|
|
712
|
-
name: propertyName,
|
|
713
|
-
fullyQualifiedName: "".concat(entityTypeObject.fullyQualifiedName, "/").concat(propertyName),
|
|
714
|
-
type: propertyDefinition.$Type,
|
|
715
|
-
maxLength: propertyDefinition.$MaxLength,
|
|
716
|
-
precision: propertyDefinition.$Precision,
|
|
717
|
-
scale: propertyDefinition.$Scale,
|
|
718
|
-
nullable: propertyDefinition.$Nullable
|
|
719
|
-
};
|
|
720
|
-
this.createAnnotationLists(propertyAnnotation, propertyObject.fullyQualifiedName, annotationLists, oCapabilities);
|
|
721
|
-
return propertyObject;
|
|
722
|
-
},
|
|
723
|
-
parseNavigationProperty: function (oMetaModel, entityTypeObject, navPropertyName, annotationLists, oCapabilities) {
|
|
724
|
-
var navPropertyAnnotation = oMetaModel.getObject("/".concat(entityTypeObject.fullyQualifiedName, "/").concat(navPropertyName, "@"));
|
|
725
|
-
var navPropertyDefinition = oMetaModel.getObject("/".concat(entityTypeObject.fullyQualifiedName, "/").concat(navPropertyName));
|
|
726
|
-
var referentialConstraint = [];
|
|
727
|
-
|
|
728
|
-
if (navPropertyDefinition.$ReferentialConstraint) {
|
|
729
|
-
referentialConstraint = Object.keys(navPropertyDefinition.$ReferentialConstraint).map(function (sourcePropertyName) {
|
|
730
|
-
return {
|
|
731
|
-
sourceTypeName: entityTypeObject.name,
|
|
732
|
-
sourceProperty: sourcePropertyName,
|
|
733
|
-
targetTypeName: navPropertyDefinition.$Type,
|
|
734
|
-
targetProperty: navPropertyDefinition.$ReferentialConstraint[sourcePropertyName]
|
|
735
|
-
};
|
|
736
|
-
});
|
|
737
|
-
}
|
|
966
|
+
case "ComplexType":
|
|
967
|
+
var complexType = prepareComplexType(oMetaModelData[sObjectName], sObjectName, namespace);
|
|
968
|
+
complexTypes.push(complexType);
|
|
969
|
+
break;
|
|
738
970
|
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
partner: navPropertyDefinition.$Partner,
|
|
744
|
-
isCollection: navPropertyDefinition.$isCollection ? navPropertyDefinition.$isCollection : false,
|
|
745
|
-
containsTarget: navPropertyDefinition.$ContainsTarget,
|
|
746
|
-
targetTypeName: navPropertyDefinition.$Type,
|
|
747
|
-
referentialConstraint: referentialConstraint
|
|
748
|
-
};
|
|
749
|
-
this.createAnnotationLists(navPropertyAnnotation, navigationProperty.fullyQualifiedName, annotationLists, oCapabilities);
|
|
750
|
-
return navigationProperty;
|
|
751
|
-
},
|
|
752
|
-
parseEntitySet: function (oMetaModel, entitySetName, annotationLists, entityContainerName, oCapabilities) {
|
|
753
|
-
var entitySetDefinition = oMetaModel.getObject("/".concat(entitySetName));
|
|
754
|
-
var entitySetAnnotation = oMetaModel.getObject("/".concat(entitySetName, "@"));
|
|
755
|
-
var entitySetObject = {
|
|
756
|
-
_type: "EntitySet",
|
|
757
|
-
name: entitySetName,
|
|
758
|
-
navigationPropertyBinding: {},
|
|
759
|
-
entityTypeName: entitySetDefinition.$Type,
|
|
760
|
-
fullyQualifiedName: "".concat(entityContainerName, "/").concat(entitySetName)
|
|
761
|
-
};
|
|
762
|
-
this.createAnnotationLists(entitySetAnnotation, entitySetObject.fullyQualifiedName, annotationLists, oCapabilities);
|
|
763
|
-
return entitySetObject;
|
|
764
|
-
},
|
|
765
|
-
parseSingleton: function (oMetaModel, singletonName, annotationLists, entityContainerName, oCapabilities) {
|
|
766
|
-
var singletonDefinition = oMetaModel.getObject("/".concat(singletonName));
|
|
767
|
-
var singletonAnnotation = oMetaModel.getObject("/".concat(singletonName, "@"));
|
|
768
|
-
var singletonObject = {
|
|
769
|
-
_type: "Singleton",
|
|
770
|
-
name: singletonName,
|
|
771
|
-
navigationPropertyBinding: {},
|
|
772
|
-
typeName: singletonDefinition.$Type,
|
|
773
|
-
fullyQualifiedName: "".concat(entityContainerName, "/").concat(singletonName),
|
|
774
|
-
nullable: true
|
|
775
|
-
};
|
|
776
|
-
this.createAnnotationLists(singletonAnnotation, singletonObject.fullyQualifiedName, annotationLists, oCapabilities);
|
|
777
|
-
return singletonObject;
|
|
778
|
-
},
|
|
779
|
-
parseEntityType: function (oMetaModel, entityTypeName, annotationLists, namespace, oCapabilities) {
|
|
780
|
-
var _this4 = this;
|
|
781
|
-
|
|
782
|
-
var entityTypeAnnotation = oMetaModel.getObject("/".concat(entityTypeName, "@"));
|
|
783
|
-
var entityTypeDefinition = oMetaModel.getObject("/".concat(entityTypeName));
|
|
784
|
-
var entityKeys = getEntityKeys(entityTypeDefinition);
|
|
785
|
-
|
|
786
|
-
function getEntityKeys(entityTypeDefinition) {
|
|
787
|
-
if (!entityTypeDefinition.$Key && entityTypeDefinition.$BaseType) {
|
|
788
|
-
return getEntityKeys(oMetaModel.getObject("/".concat(entityTypeDefinition.$BaseType)));
|
|
971
|
+
case "TypeDefinition":
|
|
972
|
+
var typeDefinition = prepareTypeDefinition(oMetaModelData[sObjectName], sObjectName, namespace);
|
|
973
|
+
typeDefinitions.push(typeDefinition);
|
|
974
|
+
break;
|
|
789
975
|
}
|
|
790
|
-
|
|
791
|
-
return entityTypeDefinition.$Key || []; //handling of entity types without key as well as basetype
|
|
792
976
|
}
|
|
977
|
+
});
|
|
978
|
+
var oEntityContainer = oMetaModelData[entityContainerName];
|
|
979
|
+
Object.keys(oEntityContainer).forEach(function (sObjectName) {
|
|
980
|
+
if (sObjectName !== "$kind") {
|
|
981
|
+
switch (oEntityContainer[sObjectName].$kind) {
|
|
982
|
+
case "EntitySet":
|
|
983
|
+
var entitySet = prepareEntitySet(oEntityContainer[sObjectName], sObjectName, entityContainerName);
|
|
984
|
+
entitySets.push(entitySet);
|
|
985
|
+
break;
|
|
793
986
|
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
keys: [],
|
|
799
|
-
entityProperties: [],
|
|
800
|
-
navigationProperties: []
|
|
801
|
-
};
|
|
802
|
-
this.createAnnotationLists(entityTypeAnnotation, entityTypeObject.fullyQualifiedName, annotationLists, oCapabilities);
|
|
803
|
-
var entityProperties = Object.keys(entityTypeDefinition).filter(function (propertyNameOrNot) {
|
|
804
|
-
if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
|
|
805
|
-
return entityTypeDefinition[propertyNameOrNot].$kind === "Property";
|
|
806
|
-
}
|
|
807
|
-
}).map(function (propertyName) {
|
|
808
|
-
return _this4.parseProperty(oMetaModel, entityTypeObject, propertyName, annotationLists, oCapabilities);
|
|
809
|
-
});
|
|
810
|
-
var navigationProperties = Object.keys(entityTypeDefinition).filter(function (propertyNameOrNot) {
|
|
811
|
-
if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
|
|
812
|
-
return entityTypeDefinition[propertyNameOrNot].$kind === "NavigationProperty";
|
|
813
|
-
}
|
|
814
|
-
}).map(function (navPropertyName) {
|
|
815
|
-
return _this4.parseNavigationProperty(oMetaModel, entityTypeObject, navPropertyName, annotationLists, oCapabilities);
|
|
816
|
-
});
|
|
817
|
-
entityTypeObject.keys = entityKeys.map(function (entityKey) {
|
|
818
|
-
return entityProperties.find(function (property) {
|
|
819
|
-
return property.name === entityKey;
|
|
820
|
-
});
|
|
821
|
-
}).filter(function (property) {
|
|
822
|
-
return property !== undefined;
|
|
823
|
-
});
|
|
824
|
-
entityTypeObject.entityProperties = entityProperties;
|
|
825
|
-
entityTypeObject.navigationProperties = navigationProperties;
|
|
826
|
-
return entityTypeObject;
|
|
827
|
-
},
|
|
828
|
-
parseComplexType: function (oMetaModel, complexTypeName, annotationLists, namespace, oCapabilities) {
|
|
829
|
-
var _this5 = this;
|
|
830
|
-
|
|
831
|
-
var complexTypeAnnotation = oMetaModel.getObject("/".concat(complexTypeName, "@"));
|
|
832
|
-
var complexTypeDefinition = oMetaModel.getObject("/".concat(complexTypeName));
|
|
833
|
-
var complexTypeObject = {
|
|
834
|
-
_type: "ComplexType",
|
|
835
|
-
name: complexTypeName.replace(namespace + ".", ""),
|
|
836
|
-
fullyQualifiedName: complexTypeName,
|
|
837
|
-
properties: [],
|
|
838
|
-
navigationProperties: []
|
|
839
|
-
};
|
|
840
|
-
this.createAnnotationLists(complexTypeAnnotation, complexTypeObject.fullyQualifiedName, annotationLists, oCapabilities);
|
|
841
|
-
var complexTypeProperties = Object.keys(complexTypeDefinition).filter(function (propertyNameOrNot) {
|
|
842
|
-
if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
|
|
843
|
-
return complexTypeDefinition[propertyNameOrNot].$kind === "Property";
|
|
844
|
-
}
|
|
845
|
-
}).map(function (propertyName) {
|
|
846
|
-
return _this5.parseProperty(oMetaModel, complexTypeObject, propertyName, annotationLists, oCapabilities);
|
|
847
|
-
});
|
|
848
|
-
complexTypeObject.properties = complexTypeProperties;
|
|
849
|
-
var complexTypeNavigationProperties = Object.keys(complexTypeDefinition).filter(function (propertyNameOrNot) {
|
|
850
|
-
if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
|
|
851
|
-
return complexTypeDefinition[propertyNameOrNot].$kind === "NavigationProperty";
|
|
852
|
-
}
|
|
853
|
-
}).map(function (navPropertyName) {
|
|
854
|
-
return _this5.parseNavigationProperty(oMetaModel, complexTypeObject, navPropertyName, annotationLists, oCapabilities);
|
|
855
|
-
});
|
|
856
|
-
complexTypeObject.navigationProperties = complexTypeNavigationProperties;
|
|
857
|
-
return complexTypeObject;
|
|
858
|
-
},
|
|
859
|
-
parseAction: function (actionName, actionRawData, namespace, entityContainerName) {
|
|
860
|
-
var actionEntityType = "";
|
|
861
|
-
var actionFQN = "".concat(actionName);
|
|
862
|
-
var actionShortName = actionName.substr(namespace.length + 1);
|
|
863
|
-
|
|
864
|
-
if (actionRawData.$IsBound) {
|
|
865
|
-
var bindingParameter = actionRawData.$Parameter[0];
|
|
866
|
-
actionEntityType = bindingParameter.$Type;
|
|
867
|
-
|
|
868
|
-
if (bindingParameter.$isCollection === true) {
|
|
869
|
-
actionFQN = "".concat(actionName, "(Collection(").concat(actionEntityType, "))");
|
|
870
|
-
} else {
|
|
871
|
-
actionFQN = "".concat(actionName, "(").concat(actionEntityType, ")");
|
|
987
|
+
case "Singleton":
|
|
988
|
+
var singleton = prepareSingleton(oEntityContainer[sObjectName], sObjectName, entityContainerName);
|
|
989
|
+
singletons.push(singleton);
|
|
990
|
+
break;
|
|
872
991
|
}
|
|
873
|
-
} else {
|
|
874
|
-
actionFQN = "".concat(entityContainerName, "/").concat(actionShortName);
|
|
875
992
|
}
|
|
993
|
+
});
|
|
994
|
+
var entityContainer = {};
|
|
876
995
|
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
fullyQualifiedName: actionFQN,
|
|
882
|
-
isBound: actionRawData.$IsBound,
|
|
883
|
-
sourceType: actionEntityType,
|
|
884
|
-
returnType: actionRawData.$ReturnType ? actionRawData.$ReturnType.$Type : "",
|
|
885
|
-
parameters: parameters.map(function (param) {
|
|
886
|
-
return {
|
|
887
|
-
_type: "ActionParameter",
|
|
888
|
-
isEntitySet: param.$Type === actionRawData.$EntitySetPath,
|
|
889
|
-
fullyQualifiedName: "".concat(actionFQN, "/").concat(param.$Name),
|
|
890
|
-
type: param.$Type // TODO missing properties ?
|
|
891
|
-
|
|
892
|
-
};
|
|
893
|
-
})
|
|
996
|
+
if (entityContainerName) {
|
|
997
|
+
entityContainer = {
|
|
998
|
+
name: entityContainerName.replace(namespace + ".", ""),
|
|
999
|
+
fullyQualifiedName: entityContainerName
|
|
894
1000
|
};
|
|
895
|
-
}
|
|
896
|
-
parseEntityTypes: function (oMetaModel, oInCapabilities) {
|
|
897
|
-
var _this6 = this;
|
|
898
|
-
|
|
899
|
-
var oCapabilities;
|
|
900
|
-
|
|
901
|
-
if (!oInCapabilities) {
|
|
902
|
-
oCapabilities = DefaultEnvironmentCapabilities;
|
|
903
|
-
} else {
|
|
904
|
-
oCapabilities = oInCapabilities;
|
|
905
|
-
}
|
|
906
|
-
|
|
907
|
-
var oMetaModelData = oMetaModel.getObject("/$");
|
|
908
|
-
var oEntitySets = oMetaModel.getObject("/");
|
|
909
|
-
var annotationLists = [];
|
|
910
|
-
var entityTypes = [];
|
|
911
|
-
var entitySets = [];
|
|
912
|
-
var singletons = [];
|
|
913
|
-
var complexTypes = [];
|
|
914
|
-
var entityContainerName = oMetaModelData.$EntityContainer;
|
|
915
|
-
var namespace = "";
|
|
916
|
-
var schemaKeys = Object.keys(oMetaModelData).filter(function (metamodelKey) {
|
|
917
|
-
return oMetaModelData[metamodelKey].$kind === "Schema";
|
|
918
|
-
});
|
|
919
|
-
|
|
920
|
-
if (schemaKeys && schemaKeys.length > 0) {
|
|
921
|
-
namespace = schemaKeys[0].substr(0, schemaKeys[0].length - 1);
|
|
922
|
-
} else if (entityTypes && entityTypes.length) {
|
|
923
|
-
namespace = entityTypes[0].fullyQualifiedName.replace(entityTypes[0].name, "");
|
|
924
|
-
namespace = namespace.substr(0, namespace.length - 1);
|
|
925
|
-
}
|
|
926
|
-
|
|
927
|
-
Object.keys(oMetaModelData).filter(function (entityTypeName) {
|
|
928
|
-
return entityTypeName !== "$kind" && oMetaModelData[entityTypeName].$kind === "EntityType";
|
|
929
|
-
}).forEach(function (entityTypeName) {
|
|
930
|
-
var entityType = _this6.parseEntityType(oMetaModel, entityTypeName, annotationLists, namespace, oCapabilities); // Check if there are filter facets defined for the entityType and if yes, check if all of them have an ID
|
|
931
|
-
// The ID is optional, but it is internally taken for grouping filter fields and if it's not present
|
|
932
|
-
// a fallback ID needs to be generated here.
|
|
933
|
-
|
|
1001
|
+
}
|
|
934
1002
|
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
filterFacetAnnotation.ID = filterFacetAnnotation.ID || generate([{
|
|
938
|
-
Facet: filterFacetAnnotation
|
|
939
|
-
}]);
|
|
1003
|
+
entitySets.forEach(function (entitySet) {
|
|
1004
|
+
var navPropertyBindings = oEntityContainer[entitySet.name].$NavigationPropertyBinding;
|
|
940
1005
|
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
1006
|
+
if (navPropertyBindings) {
|
|
1007
|
+
Object.keys(navPropertyBindings).forEach(function (navPropName) {
|
|
1008
|
+
var targetEntitySet = entitySets.find(function (entitySetName) {
|
|
1009
|
+
return entitySetName.name === navPropertyBindings[navPropName];
|
|
944
1010
|
});
|
|
945
|
-
}
|
|
946
1011
|
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
oMetaModelData.$Annotations[entityProperty.fullyQualifiedName] = {};
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
if (!oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.DataFieldDefault"]) {
|
|
953
|
-
oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.DataFieldDefault"] = {
|
|
954
|
-
$Type: "com.sap.vocabularies.UI.v1.DataField",
|
|
955
|
-
Value: {
|
|
956
|
-
$Path: entityProperty.name
|
|
957
|
-
}
|
|
958
|
-
};
|
|
959
|
-
|
|
960
|
-
_this6.createAnnotationLists({
|
|
961
|
-
"@com.sap.vocabularies.UI.v1.DataFieldDefault": oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.DataFieldDefault"]
|
|
962
|
-
}, entityProperty.fullyQualifiedName, annotationLists, oCapabilities);
|
|
1012
|
+
if (targetEntitySet) {
|
|
1013
|
+
entitySet.navigationPropertyBinding[navPropName] = targetEntitySet;
|
|
963
1014
|
}
|
|
964
1015
|
});
|
|
965
|
-
entityTypes.push(entityType);
|
|
966
|
-
});
|
|
967
|
-
Object.keys(oEntitySets).filter(function (entitySetName) {
|
|
968
|
-
return entitySetName !== "$kind" && oEntitySets[entitySetName].$kind === "EntitySet";
|
|
969
|
-
}).forEach(function (entitySetName) {
|
|
970
|
-
var entitySet = _this6.parseEntitySet(oMetaModel, entitySetName, annotationLists, entityContainerName, oCapabilities);
|
|
971
|
-
|
|
972
|
-
entitySets.push(entitySet);
|
|
973
|
-
});
|
|
974
|
-
Object.keys(oEntitySets).filter(function (singletonName) {
|
|
975
|
-
return singletonName !== "$kind" && oEntitySets[singletonName].$kind === "Singleton";
|
|
976
|
-
}).forEach(function (singletonName) {
|
|
977
|
-
var singleton = _this6.parseSingleton(oMetaModel, singletonName, annotationLists, entityContainerName, oCapabilities);
|
|
978
|
-
|
|
979
|
-
singletons.push(singleton);
|
|
980
|
-
});
|
|
981
|
-
Object.keys(oMetaModelData).filter(function (complexTypeName) {
|
|
982
|
-
return complexTypeName !== "$kind" && oMetaModelData[complexTypeName].$kind === "ComplexType";
|
|
983
|
-
}).forEach(function (complexTypeName) {
|
|
984
|
-
var complexType = _this6.parseComplexType(oMetaModel, complexTypeName, annotationLists, namespace, oCapabilities);
|
|
985
|
-
|
|
986
|
-
complexTypes.push(complexType);
|
|
987
|
-
});
|
|
988
|
-
var oEntityContainerName = Object.keys(oMetaModelData).find(function (entityContainerName) {
|
|
989
|
-
return entityContainerName !== "$kind" && oMetaModelData[entityContainerName].$kind === "EntityContainer";
|
|
990
|
-
});
|
|
991
|
-
var entityContainer = {};
|
|
992
|
-
|
|
993
|
-
if (oEntityContainerName) {
|
|
994
|
-
entityContainer = {
|
|
995
|
-
name: oEntityContainerName.replace(namespace + ".", ""),
|
|
996
|
-
fullyQualifiedName: oEntityContainerName
|
|
997
|
-
};
|
|
998
1016
|
}
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
return entitySetName.name === navPropertyBindings[navPropName];
|
|
1007
|
-
});
|
|
1008
|
-
|
|
1009
|
-
if (targetEntitySet) {
|
|
1010
|
-
entitySet.navigationPropertyBinding[navPropName] = targetEntitySet;
|
|
1011
|
-
}
|
|
1012
|
-
});
|
|
1013
|
-
}
|
|
1017
|
+
});
|
|
1018
|
+
var actions = Object.keys(oMetaModelData).filter(function (key) {
|
|
1019
|
+
return Array.isArray(oMetaModelData[key]) && oMetaModelData[key].length > 0 && oMetaModelData[key][0].$kind === "Action";
|
|
1020
|
+
}).reduce(function (outActions, actionName) {
|
|
1021
|
+
var actions = oMetaModelData[actionName];
|
|
1022
|
+
actions.forEach(function (action) {
|
|
1023
|
+
outActions.push(prepareAction(actionName, action, namespace, entityContainerName));
|
|
1014
1024
|
});
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
}).reduce(function (outActions, actionName) {
|
|
1018
|
-
var actions = oMetaModelData[actionName];
|
|
1019
|
-
actions.forEach(function (action) {
|
|
1020
|
-
outActions.push(_this6.parseAction(actionName, action, namespace, entityContainerName));
|
|
1021
|
-
});
|
|
1022
|
-
return outActions;
|
|
1023
|
-
}, []); // FIXME Crappy code to deal with annotations for functions
|
|
1025
|
+
return outActions;
|
|
1026
|
+
}, []);
|
|
1024
1027
|
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
});
|
|
1029
|
-
actionAnnotations.forEach(function (target) {
|
|
1030
|
-
_this6.createAnnotationLists(oMetaModelData.$Annotations[target], target, annotationLists, oCapabilities);
|
|
1031
|
-
});
|
|
1032
|
-
var actionsNameWithoutOverload = actions.map(function (action) {
|
|
1033
|
-
return action.fullyQualifiedName.split("(")[0];
|
|
1034
|
-
});
|
|
1035
|
-
actionsNameWithoutOverload.forEach(function (actionName) {
|
|
1036
|
-
if (annotations.hasOwnProperty(actionName)) {
|
|
1037
|
-
_this6.createAnnotationLists(oMetaModelData.$Annotations[actionName], actionName, annotationLists, oCapabilities);
|
|
1038
|
-
}
|
|
1039
|
-
});
|
|
1040
|
-
var entityContainerAnnotations = annotations[entityContainerName]; // Retrieve Entity Container annotations
|
|
1028
|
+
for (var target in oMetaModelData.$Annotations) {
|
|
1029
|
+
createAnnotationLists(oMetaModelData.$Annotations[target], target, annotationLists, oCapabilities);
|
|
1030
|
+
} // Sort by target length
|
|
1041
1031
|
|
|
1042
|
-
if (entityContainerAnnotations) {
|
|
1043
|
-
this.createAnnotationLists(entityContainerAnnotations, entityContainerName, annotationLists, oCapabilities);
|
|
1044
|
-
} // Sort by target length
|
|
1045
1032
|
|
|
1033
|
+
var outAnnotationLists = Object.keys(annotationLists).sort(function (a, b) {
|
|
1034
|
+
return a.length >= b.length ? 1 : -1;
|
|
1035
|
+
}).map(function (sAnnotationName) {
|
|
1036
|
+
return annotationLists[sAnnotationName];
|
|
1037
|
+
});
|
|
1038
|
+
var references = [];
|
|
1039
|
+
return {
|
|
1040
|
+
identification: "metamodelResult",
|
|
1041
|
+
version: "4.0",
|
|
1042
|
+
schema: {
|
|
1043
|
+
entityContainer: entityContainer,
|
|
1044
|
+
entitySets: entitySets,
|
|
1045
|
+
entityTypes: entityTypes,
|
|
1046
|
+
complexTypes: complexTypes,
|
|
1047
|
+
typeDefinitions: typeDefinitions,
|
|
1048
|
+
singletons: singletons,
|
|
1049
|
+
associations: [],
|
|
1050
|
+
associationSets: [],
|
|
1051
|
+
actions: actions,
|
|
1052
|
+
namespace: namespace,
|
|
1053
|
+
annotations: {
|
|
1054
|
+
"metamodelResult": outAnnotationLists
|
|
1055
|
+
}
|
|
1056
|
+
},
|
|
1057
|
+
references: references
|
|
1058
|
+
};
|
|
1059
|
+
}
|
|
1046
1060
|
|
|
1047
|
-
|
|
1048
|
-
return a.target.length >= b.target.length ? 1 : -1;
|
|
1049
|
-
});
|
|
1050
|
-
var references = [];
|
|
1051
|
-
return {
|
|
1052
|
-
identification: "metamodelResult",
|
|
1053
|
-
version: "4.0",
|
|
1054
|
-
schema: {
|
|
1055
|
-
entityContainer: entityContainer,
|
|
1056
|
-
entitySets: entitySets,
|
|
1057
|
-
entityTypes: entityTypes,
|
|
1058
|
-
complexTypes: complexTypes,
|
|
1059
|
-
singletons: singletons,
|
|
1060
|
-
associations: [],
|
|
1061
|
-
actions: actions,
|
|
1062
|
-
namespace: namespace,
|
|
1063
|
-
annotations: {
|
|
1064
|
-
"metamodelResult": annotationLists
|
|
1065
|
-
}
|
|
1066
|
-
},
|
|
1067
|
-
references: references
|
|
1068
|
-
};
|
|
1069
|
-
}
|
|
1070
|
-
};
|
|
1061
|
+
_exports.prepareEntityTypes = prepareEntityTypes;
|
|
1071
1062
|
var mMetaModelMap = {};
|
|
1072
1063
|
/**
|
|
1073
1064
|
* Convert the ODataMetaModel into another format that allow for easy manipulation of the annotations.
|
|
@@ -1081,8 +1072,14 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
|
|
|
1081
1072
|
var sMetaModelId = oMetaModel.id;
|
|
1082
1073
|
|
|
1083
1074
|
if (!mMetaModelMap.hasOwnProperty(sMetaModelId)) {
|
|
1084
|
-
var parsedOutput =
|
|
1085
|
-
|
|
1075
|
+
var parsedOutput = prepareEntityTypes(oMetaModel, oCapabilities);
|
|
1076
|
+
|
|
1077
|
+
if (oCapabilities && oCapabilities.Situations) {
|
|
1078
|
+
// Only Experimental Feature!
|
|
1079
|
+
mMetaModelMap[sMetaModelId] = addSyntheticAnnotations(AnnotationConverter.convertTypes(parsedOutput));
|
|
1080
|
+
} else {
|
|
1081
|
+
mMetaModelMap[sMetaModelId] = AnnotationConverter.convertTypes(parsedOutput);
|
|
1082
|
+
}
|
|
1086
1083
|
}
|
|
1087
1084
|
|
|
1088
1085
|
return mMetaModelMap[sMetaModelId];
|
|
@@ -1090,6 +1087,32 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
|
|
|
1090
1087
|
|
|
1091
1088
|
_exports.convertTypes = convertTypes;
|
|
1092
1089
|
|
|
1090
|
+
function addSyntheticAnnotations(metaModel) {
|
|
1091
|
+
// [Situations POC] Determine mixed-in situations navigation property.
|
|
1092
|
+
// This will probably happen either
|
|
1093
|
+
// - by a fixed navigation property name ("SAP__Situation"), or
|
|
1094
|
+
// - by an entity type annotation that declares the navigation property to use (similar to com.sap.vocabularies.Common.v1.Messages)
|
|
1095
|
+
//
|
|
1096
|
+
// For now, we add an 'invented' annotation "com.sap.vocabularies.FioriElements.v1.Situations" consisting of a path to the situations navigation property
|
|
1097
|
+
metaModel.entityTypes.forEach(function (entityType) {
|
|
1098
|
+
var situationsNavProp = entityType.navigationProperties.find(function (navProp) {
|
|
1099
|
+
return navProp.name === "SAP__Situation" || navProp.name === "_SAP__Situation";
|
|
1100
|
+
});
|
|
1101
|
+
|
|
1102
|
+
if (situationsNavProp) {
|
|
1103
|
+
entityType.annotations.FE = {
|
|
1104
|
+
Situations: {
|
|
1105
|
+
term: "com.sap.vocabularies.FioriElements.v1.Situations",
|
|
1106
|
+
type: "Path",
|
|
1107
|
+
path: situationsNavProp.name,
|
|
1108
|
+
$target: situationsNavProp
|
|
1109
|
+
}
|
|
1110
|
+
};
|
|
1111
|
+
}
|
|
1112
|
+
});
|
|
1113
|
+
return metaModel;
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1093
1116
|
function deleteModelCacheData(oMetaModel) {
|
|
1094
1117
|
delete mMetaModelMap[oMetaModel.id];
|
|
1095
1118
|
}
|
|
@@ -1104,6 +1127,13 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
|
|
|
1104
1127
|
var targetEntitySet = oConverterOutput.entitySets.find(function (entitySet) {
|
|
1105
1128
|
return entitySet.name === aPathSplit[1];
|
|
1106
1129
|
});
|
|
1130
|
+
|
|
1131
|
+
if (!targetEntitySet) {
|
|
1132
|
+
targetEntitySet = oConverterOutput.singletons.find(function (singleton) {
|
|
1133
|
+
return singleton.name === aPathSplit[1];
|
|
1134
|
+
});
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1107
1137
|
var relativePath = aPathSplit.slice(2).join("/");
|
|
1108
1138
|
var localObjects = [targetEntitySet];
|
|
1109
1139
|
|
|
@@ -1135,7 +1165,7 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
|
|
|
1135
1165
|
_step;
|
|
1136
1166
|
|
|
1137
1167
|
try {
|
|
1138
|
-
var
|
|
1168
|
+
var _loop2 = function () {
|
|
1139
1169
|
var sNavProp = _step.value;
|
|
1140
1170
|
// Pushing all nav props to the visited objects. example: "Set", "_SalesOrder" for "Set/_SalesOrder"(in NavigationPropertyBinding)
|
|
1141
1171
|
var targetNavProp = targetEntityType && targetEntityType.navigationProperties.find(function (navProp) {
|
|
@@ -1151,7 +1181,7 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
|
|
|
1151
1181
|
};
|
|
1152
1182
|
|
|
1153
1183
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
1154
|
-
var _ret =
|
|
1184
|
+
var _ret = _loop2();
|
|
1155
1185
|
|
|
1156
1186
|
if (_ret === "break") break;
|
|
1157
1187
|
}
|
|
@@ -1167,9 +1197,17 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
|
|
|
1167
1197
|
// Pushing the target entitySet to visited objects
|
|
1168
1198
|
localObjects.push(targetEntitySet);
|
|
1169
1199
|
} // Re-calculating the relative path
|
|
1200
|
+
// As each navigation name is enclosed between '$NavigationPropertyBinding' and '$' (to be able to access the entityset easily in the metamodel)
|
|
1201
|
+
// we need to remove the closing '$' to be able to switch to the next navigation
|
|
1170
1202
|
|
|
1171
1203
|
|
|
1172
|
-
|
|
1204
|
+
relativeSplit = relativeSplit.slice(aNavProps.length || 1);
|
|
1205
|
+
|
|
1206
|
+
if (relativeSplit.length && relativeSplit[0] === "$") {
|
|
1207
|
+
relativeSplit.shift();
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
relativePath = relativeSplit.join("/");
|
|
1173
1211
|
}
|
|
1174
1212
|
|
|
1175
1213
|
if (relativePath.startsWith("$Type")) {
|
|
@@ -1307,4 +1345,4 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
|
|
|
1307
1345
|
_exports.getInvolvedDataModelObjectFromPath = getInvolvedDataModelObjectFromPath;
|
|
1308
1346
|
return _exports;
|
|
1309
1347
|
}, false);
|
|
1310
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1ldGFNb2RlbENvbnZlcnRlci50cyJdLCJuYW1lcyI6WyJWT0NBQlVMQVJZX0FMSUFTIiwiRGVmYXVsdEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiQ2hhcnQiLCJNaWNyb0NoYXJ0IiwiVVNoZWxsIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiTWV0YU1vZGVsQ29udmVydGVyIiwicGFyc2VQcm9wZXJ0eVZhbHVlIiwiYW5ub3RhdGlvbk9iamVjdCIsInByb3BlcnR5S2V5IiwiY3VycmVudFRhcmdldCIsImFubm90YXRpb25zTGlzdHMiLCJvQ2FwYWJpbGl0aWVzIiwidmFsdWUiLCJjdXJyZW50UHJvcGVydHlUYXJnZXQiLCJ0eXBlIiwiTnVsbCIsIlN0cmluZyIsIkJvb2wiLCJJbnQiLCJBcnJheSIsImlzQXJyYXkiLCJDb2xsZWN0aW9uIiwibWFwIiwic3ViQW5ub3RhdGlvbk9iamVjdCIsInN1YkFubm90YXRpb25PYmplY3RJbmRleCIsInBhcnNlQW5ub3RhdGlvbk9iamVjdCIsImxlbmd0aCIsImhhc093blByb3BlcnR5IiwiJFBhdGgiLCJ1bmRlZmluZWQiLCJQYXRoIiwiJERlY2ltYWwiLCJEZWNpbWFsIiwicGFyc2VGbG9hdCIsIiRQcm9wZXJ0eVBhdGgiLCJQcm9wZXJ0eVBhdGgiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCIkSWYiLCJJZiIsIiRBbmQiLCJBbmQiLCIkT3IiLCJPciIsIiROb3QiLCJOb3QiLCIkRXEiLCJFcSIsIiROZSIsIk5lIiwiJEd0IiwiR3QiLCIkR2UiLCJHZSIsIiRMdCIsIkx0IiwiJExlIiwiTGUiLCIkQXBwbHkiLCJBcHBseSIsIkZ1bmN0aW9uIiwiJEZ1bmN0aW9uIiwiJEFubm90YXRpb25QYXRoIiwiQW5ub3RhdGlvblBhdGgiLCIkRW51bU1lbWJlciIsIkVudW1NZW1iZXIiLCJtYXBOYW1lVG9BbGlhcyIsInNwbGl0IiwiJFR5cGUiLCJSZWNvcmQiLCJuYW1lIiwiYW5ub3RhdGlvbk5hbWUiLCJwYXRoUGFydCIsImFubm9QYXJ0IiwibGFzdERvdCIsImxhc3RJbmRleE9mIiwic3Vic3RyIiwiY3VycmVudE9iamVjdFRhcmdldCIsInBhcnNlZEFubm90YXRpb25PYmplY3QiLCJwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbiIsImNvbGxlY3Rpb24iLCJzdWJBbm5vdGF0aW9uSW5kZXgiLCJ0eXBlVmFsdWUiLCJwcm9wZXJ0eVZhbHVlcyIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwic3RhcnRzV2l0aCIsInB1c2giLCJjcmVhdGVBbm5vdGF0aW9uTGlzdHMiLCJnZXRPckNyZWF0ZUFubm90YXRpb25MaXN0IiwidGFyZ2V0IiwicG90ZW50aWFsVGFyZ2V0IiwiZmluZCIsImFubm90YXRpb25MaXN0IiwiYW5ub3RhdGlvbnMiLCJhbm5vdGF0aW9uT2JqZWN0cyIsImFubm90YXRpb25UYXJnZXQiLCJhbm5vdGF0aW9uTGlzdHMiLCJvdXRBbm5vdGF0aW9uT2JqZWN0IiwicmVtb3ZlQ2hhcnRBbm5vdGF0aW9ucyIsImZpbHRlciIsIm9SZWNvcmQiLCJUYXJnZXQiLCJpbmRleE9mIiwicmVtb3ZlSUJOQW5ub3RhdGlvbnMiLCJoYW5kbGVQcmVzZW50YXRpb25WYXJpYW50IiwiYW5ub3RhdGlvbktleSIsIkRhdGEiLCJWaXN1YWxpemF0aW9ucyIsImN1cnJlbnRPdXRBbm5vdGF0aW9uT2JqZWN0IiwiYW5ub3RhdGlvbk9mQW5ub3RhdGlvblNwbGl0IiwiYW5ub3RhdGlvblF1YWxpZmllclNwbGl0IiwicXVhbGlmaWVyIiwidGVybSIsImN1cnJlbnRBbm5vdGF0aW9uVGFyZ2V0IiwiaXNDb2xsZWN0aW9uIiwicmVjb3JkIiwicGFyc2VQcm9wZXJ0eSIsIm9NZXRhTW9kZWwiLCJlbnRpdHlUeXBlT2JqZWN0IiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlBbm5vdGF0aW9uIiwiZ2V0T2JqZWN0IiwiZnVsbHlRdWFsaWZpZWROYW1lIiwicHJvcGVydHlEZWZpbml0aW9uIiwicHJvcGVydHlPYmplY3QiLCJfdHlwZSIsIm1heExlbmd0aCIsIiRNYXhMZW5ndGgiLCJwcmVjaXNpb24iLCIkUHJlY2lzaW9uIiwic2NhbGUiLCIkU2NhbGUiLCJudWxsYWJsZSIsIiROdWxsYWJsZSIsInBhcnNlTmF2aWdhdGlvblByb3BlcnR5IiwibmF2UHJvcGVydHlOYW1lIiwibmF2UHJvcGVydHlBbm5vdGF0aW9uIiwibmF2UHJvcGVydHlEZWZpbml0aW9uIiwicmVmZXJlbnRpYWxDb25zdHJhaW50IiwiJFJlZmVyZW50aWFsQ29uc3RyYWludCIsInNvdXJjZVByb3BlcnR5TmFtZSIsInNvdXJjZVR5cGVOYW1lIiwic291cmNlUHJvcGVydHkiLCJ0YXJnZXRUeXBlTmFtZSIsInRhcmdldFByb3BlcnR5IiwibmF2aWdhdGlvblByb3BlcnR5IiwicGFydG5lciIsIiRQYXJ0bmVyIiwiJGlzQ29sbGVjdGlvbiIsImNvbnRhaW5zVGFyZ2V0IiwiJENvbnRhaW5zVGFyZ2V0IiwicGFyc2VFbnRpdHlTZXQiLCJlbnRpdHlTZXROYW1lIiwiZW50aXR5Q29udGFpbmVyTmFtZSIsImVudGl0eVNldERlZmluaXRpb24iLCJlbnRpdHlTZXRBbm5vdGF0aW9uIiwiZW50aXR5U2V0T2JqZWN0IiwibmF2aWdhdGlvblByb3BlcnR5QmluZGluZyIsImVudGl0eVR5cGVOYW1lIiwicGFyc2VTaW5nbGV0b24iLCJzaW5nbGV0b25OYW1lIiwic2luZ2xldG9uRGVmaW5pdGlvbiIsInNpbmdsZXRvbkFubm90YXRpb24iLCJzaW5nbGV0b25PYmplY3QiLCJ0eXBlTmFtZSIsInBhcnNlRW50aXR5VHlwZSIsIm5hbWVzcGFjZSIsImVudGl0eVR5cGVBbm5vdGF0aW9uIiwiZW50aXR5VHlwZURlZmluaXRpb24iLCJlbnRpdHlLZXlzIiwiZ2V0RW50aXR5S2V5cyIsIiRLZXkiLCIkQmFzZVR5cGUiLCJyZXBsYWNlIiwiZW50aXR5UHJvcGVydGllcyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwicHJvcGVydHlOYW1lT3JOb3QiLCIka2luZCIsImVudGl0eUtleSIsInByb3BlcnR5IiwicGFyc2VDb21wbGV4VHlwZSIsImNvbXBsZXhUeXBlTmFtZSIsImNvbXBsZXhUeXBlQW5ub3RhdGlvbiIsImNvbXBsZXhUeXBlRGVmaW5pdGlvbiIsImNvbXBsZXhUeXBlT2JqZWN0IiwicHJvcGVydGllcyIsImNvbXBsZXhUeXBlUHJvcGVydGllcyIsImNvbXBsZXhUeXBlTmF2aWdhdGlvblByb3BlcnRpZXMiLCJwYXJzZUFjdGlvbiIsImFjdGlvbk5hbWUiLCJhY3Rpb25SYXdEYXRhIiwiYWN0aW9uRW50aXR5VHlwZSIsImFjdGlvbkZRTiIsImFjdGlvblNob3J0TmFtZSIsIiRJc0JvdW5kIiwiYmluZGluZ1BhcmFtZXRlciIsIiRQYXJhbWV0ZXIiLCJwYXJhbWV0ZXJzIiwiaXNCb3VuZCIsInNvdXJjZVR5cGUiLCJyZXR1cm5UeXBlIiwiJFJldHVyblR5cGUiLCJwYXJhbSIsImlzRW50aXR5U2V0IiwiJEVudGl0eVNldFBhdGgiLCIkTmFtZSIsInBhcnNlRW50aXR5VHlwZXMiLCJvSW5DYXBhYmlsaXRpZXMiLCJvTWV0YU1vZGVsRGF0YSIsIm9FbnRpdHlTZXRzIiwiZW50aXR5VHlwZXMiLCJlbnRpdHlTZXRzIiwic2luZ2xldG9ucyIsImNvbXBsZXhUeXBlcyIsIiRFbnRpdHlDb250YWluZXIiLCJzY2hlbWFLZXlzIiwibWV0YW1vZGVsS2V5IiwiZW50aXR5VHlwZSIsIiRBbm5vdGF0aW9ucyIsImZpbHRlckZhY2V0QW5ub3RhdGlvbiIsIklEIiwiZ2VuZXJhdGUiLCJGYWNldCIsImVudGl0eVByb3BlcnR5IiwiVmFsdWUiLCJlbnRpdHlTZXQiLCJzaW5nbGV0b24iLCJjb21wbGV4VHlwZSIsIm9FbnRpdHlDb250YWluZXJOYW1lIiwiZW50aXR5Q29udGFpbmVyIiwibmF2UHJvcGVydHlCaW5kaW5ncyIsIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nIiwibmF2UHJvcE5hbWUiLCJ0YXJnZXRFbnRpdHlTZXQiLCJhY3Rpb25zIiwia2V5IiwicmVkdWNlIiwib3V0QWN0aW9ucyIsImFjdGlvbiIsImFjdGlvbkFubm90YXRpb25zIiwiYWN0aW9uc05hbWVXaXRob3V0T3ZlcmxvYWQiLCJlbnRpdHlDb250YWluZXJBbm5vdGF0aW9ucyIsInNvcnQiLCJhIiwiYiIsInJlZmVyZW5jZXMiLCJpZGVudGlmaWNhdGlvbiIsInZlcnNpb24iLCJzY2hlbWEiLCJhc3NvY2lhdGlvbnMiLCJtTWV0YU1vZGVsTWFwIiwiY29udmVydFR5cGVzIiwic01ldGFNb2RlbElkIiwiaWQiLCJwYXJzZWRPdXRwdXQiLCJBbm5vdGF0aW9uQ29udmVydGVyIiwiZGVsZXRlTW9kZWxDYWNoZURhdGEiLCJjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCIsIm9NZXRhTW9kZWxDb250ZXh0IiwiYkluY2x1ZGVWaXNpdGVkT2JqZWN0cyIsIm9Db252ZXJ0ZXJPdXRwdXQiLCJnZXRNb2RlbCIsInNQYXRoIiwiZ2V0UGF0aCIsImFQYXRoU3BsaXQiLCJyZWxhdGl2ZVBhdGgiLCJzbGljZSIsImpvaW4iLCJsb2NhbE9iamVjdHMiLCJyZWxhdGl2ZVNwbGl0IiwiaWR4IiwiY3VycmVudEVudGl0eVNldCIsInNOYXZQcm9wVG9DaGVjayIsImFOYXZQcm9wcyIsInRhcmdldEVudGl0eVR5cGUiLCJzTmF2UHJvcCIsInRhcmdldE5hdlByb3AiLCJuYXZQcm9wIiwidGFyZ2V0VHlwZSIsIm9UYXJnZXQiLCJyZXNvbHZlUGF0aCIsInZpc2l0ZWRPYmplY3RzIiwiY29uY2F0IiwicGFyYW1ldGVyTmFtZSIsInRhcmdldFBhcmFtZXRlciIsInBhcmFtZXRlciIsImVuZHNXaXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwib0VudGl0eVNldE1ldGFNb2RlbENvbnRleHQiLCJtZXRhTW9kZWxDb250ZXh0IiwidGFyZ2V0RW50aXR5U2V0TG9jYXRpb24iLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdEZyb21QYXRoIiwiZGF0YU1vZGVsT2JqZWN0cyIsInZpc2l0ZWRPYmplY3QiLCJyb290RW50aXR5U2V0IiwiY3VycmVudEVudGl0eVR5cGUiLCJpIiwiY3VycmVudE9iamVjdCIsIm5hdmlnYXRlZFBhdGhzIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJzdGFydGluZ0luZGV4IiwicmVxdWlyZWREYXRhTW9kZWxPYmplY3RzIiwib2JqZWN0Iiwib3V0RGF0YU1vZGVsUGF0aCIsInRhcmdldE9iamVjdCIsImNvbnRleHRMb2NhdGlvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QkEsTUFBTUEsZ0JBQXFCLEdBQUc7QUFDN0IsaUNBQTZCLGNBREE7QUFFN0IseUJBQXFCLE1BRlE7QUFHN0IsNkJBQXlCLFVBSEk7QUFJN0Isc0NBQWtDLFFBSkw7QUFLN0Isa0NBQThCLElBTEQ7QUFNN0IsdUNBQW1DLFNBTk47QUFPN0IseUNBQXFDLFdBUFI7QUFRN0IsNENBQXdDLGNBUlg7QUFTN0IsNkNBQXlDO0FBVFosR0FBOUI7QUFtQk8sTUFBTUMsOEJBQThCLEdBQUc7QUFDN0NDLElBQUFBLEtBQUssRUFBRSxJQURzQztBQUU3Q0MsSUFBQUEsVUFBVSxFQUFFLElBRmlDO0FBRzdDQyxJQUFBQSxNQUFNLEVBQUUsSUFIcUM7QUFJN0NDLElBQUFBLHFCQUFxQixFQUFFO0FBSnNCLEdBQXZDOztBQXlCUCxNQUFNQyxrQkFBa0IsR0FBRztBQUMxQkMsSUFBQUEsa0JBRDBCLFlBRXpCQyxnQkFGeUIsRUFHekJDLFdBSHlCLEVBSXpCQyxhQUp5QixFQUt6QkMsZ0JBTHlCLEVBTXpCQyxhQU55QixFQU9uQjtBQUFBOztBQUNOLFVBQUlDLEtBQUo7QUFDQSxVQUFNQyxxQkFBNkIsR0FBR0osYUFBYSxHQUFHLEdBQWhCLEdBQXNCRCxXQUE1RDs7QUFDQSxVQUFJRCxnQkFBZ0IsS0FBSyxJQUF6QixFQUErQjtBQUM5QkssUUFBQUEsS0FBSyxHQUFHO0FBQUVFLFVBQUFBLElBQUksRUFBRSxNQUFSO0FBQWdCQyxVQUFBQSxJQUFJLEVBQUU7QUFBdEIs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LFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsS0FBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQm9CLGNBQXBCLENBQW1DLEtBQW5DLENBQUosRUFBK0M7QUFDcERmLFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsSUFBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQm9CLGNBQXBCLENBQW1DLEtBQW5DLENBQUosRUFBK0M7QUFDcERmLFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsSUFBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQm9CLGNBQXBCLENBQW1DLE1BQW5DLENBQUosRUFBZ0Q7QUFDckRmLFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsS0FBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQm9CLGNBQXBCLENBQW1DLEtBQW5DLENBQUosRUFBK0M7QUFDcERmLFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsSUFBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQm9CLGNBQXBCLENBQW1DLEtBQW5DLENBQUosRUFBK0M7QUFDcERmLFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsSUFBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQm9CLGNBQXBCLENBQW1DLEtBQW5DLENBQUosRUFBK0M7QUFDcERmLFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsSUFBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFo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dUIsQ0FBdkIsRUFBMEJrQyxhQUExQixDQUFqQztBQUNBVixRQUFBQSx1QkFBdUIsQ0FBQ1MsaUJBQXhCLEdBQTRDTCxhQUE1QztBQUNBSixRQUFBQSx1QkFBdUIsQ0FBQ25ILG9CQUF4QixHQUErQzhILHdCQUF3QixDQUNyRTFNLE1BRDZDLENBQ3RDLFVBQUMyTSxNQUFEO0FBQUEsaUJBQWlCQSxNQUFNLENBQUNqTCxLQUFQLEtBQWlCLG9CQUFsQztBQUFBLFNBRHNDLEVBRTdDNkosTUFGNkMsQ0FFdENRLHVCQUF1QixDQUFDbkgsb0JBRmMsQ0FBL0M7QUFHQTtBQUNEOztBQUNELFFBQU1nSSxnQkFBZ0IsR0FBRztBQUN4QkosTUFBQUEsaUJBQWlCLEVBQUVMLGFBREs7QUFFeEI3RCxNQUFBQSxlQUFlLEVBQUVzQyxnQkFGTztBQUd4QkcsTUFBQUEsZ0JBQWdCLEVBQUVxQixpQkFITTtBQUl4QlMsTUFBQUEsWUFBWSxFQUFFZixnQkFBZ0IsQ0FBQ3hNLE1BSlA7QUFLeEJzRixNQUFBQSxvQkFBb0IsRUFBcEJBLG9CQUx3QjtBQU14QmtJLE1BQUFBLGVBQWUsRUFBRWY7QUFOTyxLQUF6Qjs7QUFRQSxRQUFJLENBQUNhLGdCQUFnQixDQUFDRSxlQUF0QixFQUF1QztBQUN0Q0YsTUFBQUEsZ0JBQWdCLENBQUNFLGVBQWpCLEdBQW1DRixnQkFBbkM7QUFDQTs7QUFDRCxXQUFPQSxnQkFBUDtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9uLCBBbm5vdGF0aW9uTGlzdCwgQW5ub3RhdGlvblJlY29yZCwgRXhwcmVzc2lvbiwgUGFyc2VyT3V0cHV0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG4vLyBUaGlzIGZpbGUgaXMgcmV0cmlldmVkIGZyb20gQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlciwgc2hhcmVkIGNvZGUgd2l0aCB0b29sIHN1aXRlXG5pbXBvcnQgeyBBbm5vdGF0aW9uQ29udmVydGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29tbW9uXCI7XG5pbXBvcnQgeyBPRGF0YU1ldGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcbmltcG9ydCB7XG5cdENvbnZlcnRlck91dHB1dCxcblx0RW50aXR5U2V0IGFzIF9FbnRpdHlTZXQsXG5cdEVudGl0eVR5cGUgYXMgX0VudGl0eVR5cGUsXG5cdE5hdmlnYXRpb25Qcm9wZXJ0eSBhcyBfTmF2aWdhdGlvblByb3BlcnR5XG59IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQge1xuXHRFbnRpdHlUeXBlLFxuXHRFbnRpdHlTZXQsXG5cdFByb3BlcnR5LFxuXHRDb21wbGV4VHlwZSxcblx0UmVmZXJlbnRpYWxDb25zdHJhaW50LFxuXHRWNE5hdmlnYXRpb25Qcm9wZXJ0eSxcblx0QWN0aW9uLFxuXHRSZWZlcmVuY2UsXG5cdEVudGl0eUNvbnRhaW5lcixcblx0U2luZ2xldG9uXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L1BhcnNlclwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWxcIjtcbmltcG9ydCB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCIuLi9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5cbmNvbnN0IFZPQ0FCVUxBUllfQUxJQVM6IGFueSA9IHtcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxXCI6IFwiQ2FwYWJpbGl0aWVzXCIsXG5cdFwiT3JnLk9EYXRhLkNvcmUuVjFcIjogXCJDb3JlXCIsXG5cdFwiT3JnLk9EYXRhLk1lYXN1cmVzLlYxXCI6IFwiTWVhc3VyZXNcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjFcIjogXCJDb21tb25cIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MVwiOiBcIlVJXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MVwiOiBcIlNlc3Npb25cIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjFcIjogXCJBbmFseXRpY3NcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjFcIjogXCJQZXJzb25hbERhdGFcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxXCI6IFwiQ29tbXVuaWNhdGlvblwiXG59O1xuXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudENhcGFiaWxpdGllcyA9IHtcblx0Q2hhcnQ6IGJvb2xlYW47XG5cdE1pY3JvQ2hhcnQ6IGJvb2xlYW47XG5cdFVTaGVsbDogYm9vbGVhbjtcblx0SW50ZW50QmFzZWROYXZpZ2F0aW9uOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRFbnZpcm9ubWVudENhcGFiaWxpdGllcyA9IHtcblx0Q2hhcnQ6IHRydWUsXG5cdE1pY3JvQ2hhcnQ6IHRydWUsXG5cdFVTaGVsbDogdHJ1ZSxcblx0SW50ZW50QmFzZWROYXZpZ2F0aW9uOiB0cnVlXG59O1xuXG50eXBlIE1ldGFNb2RlbEFjdGlvbiA9IHtcblx0JGtpbmQ6IFwiQWN0aW9uXCI7XG5cdCRJc0JvdW5kOiBib29sZWFuO1xuXHQkRW50aXR5U2V0UGF0aDogc3RyaW5nO1xuXHQkUGFyYW1ldGVyOiB7XG5cdFx0JFR5cGU6IHN0cmluZztcblx0XHQkTmFtZTogc3RyaW5nO1xuXHRcdCROdWxsYWJsZT86IGJvb2xlYW47XG5cdFx0JE1heExlbmd0aD86IG51bWJlcjtcblx0XHQkUHJlY2lzaW9uPzogbnVtYmVyO1xuXHRcdCRTY2FsZT86IG51bWJlcjtcblx0XHQkaXNDb2xsZWN0aW9uPzogYm9vbGVhbjtcblx0fVtdO1xuXHQkUmV0dXJuVHlwZToge1xuXHRcdCRUeXBlOiBzdHJpbmc7XG5cdH07XG59O1xuXG5jb25zdCBNZXRhTW9kZWxDb252ZXJ0ZXIgPSB7XG5cdHBhcnNlUHJvcGVydHlWYWx1ZShcblx0XHRhbm5vdGF0aW9uT2JqZWN0OiBhbnksXG5cdFx0cHJvcGVydHlLZXk6IHN0cmluZyxcblx0XHRjdXJyZW50VGFyZ2V0OiBzdHJpbmcsXG5cdFx0YW5ub3RhdGlvbnNMaXN0czogYW55W10sXG5cdFx0b0NhcGFiaWxpdGllczogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNcblx0KTogYW55IHtcblx0XHRsZXQgdmFsdWU7XG5cdFx0Y29uc3QgY3VycmVudFByb3BlcnR5VGFyZ2V0OiBzdHJpbmcgPSBjdXJyZW50VGFyZ2V0ICsgXCIvXCIgKyBwcm9wZXJ0eUtleTtcblx0XHRpZiAoYW5ub3RhdGlvbk9iamVjdCA9PT0gbnVsbCkge1xuXHRcdFx0dmFsdWUgPSB7IHR5cGU6IFwiTnVsbFwiLCBOdWxsOiBudWxsIH07XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgYW5ub3RhdGlvbk9iamVjdCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0dmFsdWUgPSB7IHR5cGU6IFwiU3RyaW5nXCIsIFN0cmluZzogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGFubm90YXRpb25PYmplY3QgPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJCb29sXCIsIEJvb2w6IGFubm90YXRpb25PYmplY3QgfTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0ID09PSBcIm51bWJlclwiKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJJbnRcIiwgSW50OiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFubm90YXRpb25PYmplY3QpKSB7XG5cdFx0XHR2YWx1ZSA9IHtcblx0XHRcdFx0dHlwZTogXCJDb2xsZWN0aW9uXCIsXG5cdFx0XHRcdENvbGxlY3Rpb246IGFubm90YXRpb25PYmplY3QubWFwKChzdWJBbm5vdGF0aW9uT2JqZWN0LCBzdWJBbm5vdGF0aW9uT2JqZWN0SW5kZXgpID0+XG5cdFx0XHRcdFx0dGhpcy5wYXJzZUFubm90YXRpb25PYmplY3QoXG5cdFx0XHRcdFx0XHRzdWJBbm5vdGF0aW9uT2JqZWN0LFxuXHRcdFx0XHRcdFx0Y3VycmVudFByb3BlcnR5VGFyZ2V0ICsgXCIvXCIgKyBzdWJBbm5vdGF0aW9uT2JqZWN0SW5kZXgsXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uc0xpc3RzLFxuXHRcdFx0XHRcdFx0b0NhcGFiaWxpdGllc1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0fTtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0aWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJQcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJFBhdGhcIikpIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIikpIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFubm90YXRpb25QYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJBbm5vdGF0aW9uUGF0aFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSkge1xuXHRcdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRJZlwiKSkge1xuXHRcdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiSWZcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE9yXCIpKSB7XG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJPclwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkQW5kXCIpKSB7XG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJBbmRcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEVxXCIpKSB7XG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJFcVwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTmVcIikpIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5lXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiROb3RcIikpIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5vdFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkR3RcIikpIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkd0XCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRHZVwiKSkge1xuXHRcdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiR2VcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEx0XCIpKSB7XG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJMdFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTGVcIikpIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkxlXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQXBwbHlcIjtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgYW5ub3RhdGlvbk9iamVjdFswXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdC8vICRUeXBlIGlzIG9wdGlvbmFsLi4uXG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJSZWNvcmRcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlN0cmluZ1wiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRQYXRoICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhbHVlID0geyB0eXBlOiBcIlBhdGhcIiwgUGF0aDogYW5ub3RhdGlvbk9iamVjdC4kUGF0aCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRGVjaW1hbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJEZWNpbWFsXCIsIERlY2ltYWw6IHBhcnNlRmxvYXQoYW5ub3RhdGlvbk9iamVjdC4kRGVjaW1hbCkgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJFByb3BlcnR5UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJQcm9wZXJ0eVBhdGhcIiwgUHJvcGVydHlQYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiRQcm9wZXJ0eVBhdGggfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSB7XG5cdFx0XHRcdHR5cGU6IFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiLFxuXHRcdFx0XHROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kSWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSB7IHR5cGU6IFwiSWZcIiwgSWY6IGFubm90YXRpb25PYmplY3QuJElmIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRBbmQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSB7IHR5cGU6IFwiQW5kXCIsIEFuZDogYW5ub3RhdGlvbk9iamVjdC4kQW5kIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRPciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJPclwiLCBPcjogYW5ub3RhdGlvbk9iamVjdC4kT3IgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5vdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJOb3RcIiwgTm90OiBhbm5vdGF0aW9uT2JqZWN0LiROb3QgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEVxICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhbHVlID0geyB0eXBlOiBcIkVxXCIsIEVxOiBhbm5vdGF0aW9uT2JqZWN0LiRFcSB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kTmUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSB7IHR5cGU6IFwiTmVcIiwgTmU6IGFubm90YXRpb25PYmplY3QuJE5lIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRHdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJHdFwiLCBHdDogYW5ub3RhdGlvbk9iamVjdC4kR3QgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEdlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhbHVlID0geyB0eXBlOiBcIkdlXCIsIEdlOiBhbm5vdGF0aW9uT2JqZWN0LiRHZSB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kTHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSB7IHR5cGU6IFwiTHRcIiwgTHQ6IGFubm90YXRpb25PYmplY3QuJEx0IH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRMZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJMZVwiLCBMZTogYW5ub3RhdGlvbk9iamVjdC4kTGUgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEFwcGx5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhbHVlID0geyB0eXBlOiBcIkFwcGx5XCIsIEFwcGx5OiBhbm5vdGF0aW9uT2JqZWN0LiRBcHBseSwgRnVuY3Rpb246IGFubm90YXRpb25PYmplY3QuJEZ1bmN0aW9uIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRBbm5vdGF0aW9uUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJBbm5vdGF0aW9uUGF0aFwiLCBBbm5vdGF0aW9uUGF0aDogYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGggfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEVudW1NZW1iZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSB7XG5cdFx0XHRcdHR5cGU6IFwiRW51bU1lbWJlclwiLFxuXHRcdFx0XHRFbnVtTWVtYmVyOlxuXHRcdFx0XHRcdHRoaXMubWFwTmFtZVRvQWxpYXMoYW5ub3RhdGlvbk9iamVjdC4kRW51bU1lbWJlci5zcGxpdChcIi9cIilbMF0pICsgXCIvXCIgKyBhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyLnNwbGl0KFwiL1wiKVsxXVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJFR5cGUpIHtcblx0XHRcdHZhbHVlID0ge1xuXHRcdFx0XHR0eXBlOiBcIlJlY29yZFwiLFxuXHRcdFx0XHRSZWNvcmQ6IHRoaXMucGFyc2VBbm5vdGF0aW9uT2JqZWN0KGFubm90YXRpb25PYmplY3QsIGN1cnJlbnRUYXJnZXQsIGFubm90YXRpb25zTGlzdHMsIG9DYXBhYmlsaXRpZXMpXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YWx1ZSA9IHtcblx0XHRcdFx0dHlwZTogXCJSZWNvcmRcIixcblx0XHRcdFx0UmVjb3JkOiB0aGlzLnBhcnNlQW5ub3RhdGlvbk9iamVjdChhbm5vdGF0aW9uT2JqZWN0LCBjdXJyZW50VGFyZ2V0LCBhbm5vdGF0aW9uc0xpc3RzLCBvQ2FwYWJpbGl0aWVzKVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bmFtZTogcHJvcGVydHlLZXksXG5cdFx0XHR2YWx1ZVxuXHRcdH07XG5cdH0sXG5cdG1hcE5hbWVUb0FsaWFzKGFubm90YXRpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGxldCBbcGF0aFBhcnQsIGFubm9QYXJ0XSA9IGFubm90YXRpb25OYW1lLnNwbGl0KFwiQFwiKTtcblx0XHRpZiAoIWFubm9QYXJ0KSB7XG5cdFx0XHRhbm5vUGFydCA9IHBhdGhQYXJ0O1xuXHRcdFx0cGF0aFBhcnQgPSBcIlwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXRoUGFydCArPSBcIkBcIjtcblx0XHR9XG5cdFx0Y29uc3QgbGFzdERvdCA9IGFubm9QYXJ0Lmxhc3RJbmRleE9mKFwiLlwiKTtcblx0XHRyZXR1cm4gcGF0aFBhcnQgKyBWT0NBQlVMQVJZX0FMSUFTW2Fubm9QYXJ0LnN1YnN0cigwLCBsYXN0RG90KV0gKyBcIi5cIiArIGFubm9QYXJ0LnN1YnN0cihsYXN0RG90ICsgMSk7XG5cdH0sXG5cdHBhcnNlQW5ub3RhdGlvbk9iamVjdChcblx0XHRhbm5vdGF0aW9uT2JqZWN0OiBhbnksXG5cdFx0Y3VycmVudE9iamVjdFRhcmdldDogc3RyaW5nLFxuXHRcdGFubm90YXRpb25zTGlzdHM6IGFueVtdLFxuXHRcdG9DYXBhYmlsaXRpZXM6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzXG5cdCk6IEV4cHJlc3Npb24gfCBBbm5vdGF0aW9uUmVjb3JkIHwgQW5ub3RhdGlvbiB7XG5cdFx0bGV0IHBhcnNlZEFubm90YXRpb25PYmplY3Q6IGFueSA9IHt9O1xuXHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0ID09PSBudWxsKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIk51bGxcIiwgTnVsbDogbnVsbCB9O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGFubm90YXRpb25PYmplY3QgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiU3RyaW5nXCIsIFN0cmluZzogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGFubm90YXRpb25PYmplY3QgPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkJvb2xcIiwgQm9vbDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGFubm90YXRpb25PYmplY3QgPT09IFwibnVtYmVyXCIpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiSW50XCIsIEludDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJBbm5vdGF0aW9uUGF0aFwiLCBBbm5vdGF0aW9uUGF0aDogYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGggfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJFBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJQYXRoXCIsIFBhdGg6IGFubm90YXRpb25PYmplY3QuJFBhdGggfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJERlY2ltYWwgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJEZWNpbWFsXCIsIERlY2ltYWw6IHBhcnNlRmxvYXQoYW5ub3RhdGlvbk9iamVjdC4kRGVjaW1hbCkgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJFByb3BlcnR5UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIlByb3BlcnR5UGF0aFwiLCBQcm9wZXJ0eVBhdGg6IGFubm90YXRpb25PYmplY3QuJFByb3BlcnR5UGF0aCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kSWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJJZlwiLCBJZjogYW5ub3RhdGlvbk9iamVjdC4kSWYgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEFuZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkFuZFwiLCBBbmQ6IGFubm90YXRpb25PYmplY3QuJEFuZCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kT3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJPclwiLCBPcjogYW5ub3RhdGlvbk9iamVjdC4kT3IgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5vdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIk5vdFwiLCBOb3Q6IGFubm90YXRpb25PYmplY3QuJE5vdCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRXEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJFcVwiLCBFcTogYW5ub3RhdGlvbk9iamVjdC4kRXEgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiTmVcIiwgTmU6IGFubm90YXRpb25PYmplY3QuJE5lIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRHdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkd0XCIsIEd0OiBhbm5vdGF0aW9uT2JqZWN0LiRHdCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kR2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJHZVwiLCBHZTogYW5ub3RhdGlvbk9iamVjdC4kR2UgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiTHRcIiwgTHQ6IGFubm90YXRpb25PYmplY3QuJEx0IH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRMZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkxlXCIsIExlOiBhbm5vdGF0aW9uT2JqZWN0LiRMZSB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQXBwbHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJBcHBseVwiLCBBcHBseTogYW5ub3RhdGlvbk9iamVjdC4kQXBwbHksIEZ1bmN0aW9uOiBhbm5vdGF0aW9uT2JqZWN0LiRGdW5jdGlvbiB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0ge1xuXHRcdFx0XHR0eXBlOiBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIixcblx0XHRcdFx0TmF2aWdhdGlvblByb3BlcnR5UGF0aDogYW5ub3RhdGlvbk9iamVjdC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEVudW1NZW1iZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHtcblx0XHRcdFx0dHlwZTogXCJFbnVtTWVtYmVyXCIsXG5cdFx0XHRcdEVudW1NZW1iZXI6XG5cdFx0XHRcdFx0dGhpcy5tYXBOYW1lVG9BbGlhcyhhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyLnNwbGl0KFwiL1wiKVswXSkgKyBcIi9cIiArIGFubm90YXRpb25PYmplY3QuJEVudW1NZW1iZXIuc3BsaXQoXCIvXCIpWzFdXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhbm5vdGF0aW9uT2JqZWN0KSkge1xuXHRcdFx0Y29uc3QgcGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24gPSBwYXJzZWRBbm5vdGF0aW9uT2JqZWN0IGFzIGFueTtcblx0XHRcdHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gPSBhbm5vdGF0aW9uT2JqZWN0Lm1hcCgoc3ViQW5ub3RhdGlvbk9iamVjdCwgc3ViQW5ub3RhdGlvbkluZGV4KSA9PlxuXHRcdFx0XHR0aGlzLnBhcnNlQW5ub3RhdGlvbk9iamVjdChcblx0XHRcdFx0XHRzdWJBbm5vdGF0aW9uT2JqZWN0LFxuXHRcdFx0XHRcdGN1cnJlbnRPYmplY3RUYXJnZXQgKyBcIi9cIiArIHN1YkFubm90YXRpb25JbmRleCxcblx0XHRcdFx0XHRhbm5vdGF0aW9uc0xpc3RzLFxuXHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0aWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJQcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJFBhdGhcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFubm90YXRpb25QYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJBbm5vdGF0aW9uUGF0aFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRJZlwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiSWZcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFuZFwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQW5kXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRPclwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiT3JcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEVxXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJFcVwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTmVcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5lXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiROb3RcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5vdFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkR3RcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkd0XCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRHZVwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiR2VcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEx0XCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJMdFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTGVcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkxlXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQXBwbHlcIjtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgYW5ub3RhdGlvbk9iamVjdFswXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJTdHJpbmdcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoYW5ub3RhdGlvbk9iamVjdC4kVHlwZSkge1xuXHRcdFx0XHRjb25zdCB0eXBlVmFsdWUgPSBhbm5vdGF0aW9uT2JqZWN0LiRUeXBlO1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnR5cGUgPSB0eXBlVmFsdWU7IC8vYCR7dHlwZUFsaWFzfS4ke3R5cGVUZXJtfWA7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlczogYW55ID0gW107XG5cdFx0XHRPYmplY3Qua2V5cyhhbm5vdGF0aW9uT2JqZWN0KS5mb3JFYWNoKHByb3BlcnR5S2V5ID0+IHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRUeXBlXCIgJiZcblx0XHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkSWZcIiAmJlxuXHRcdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRBcHBseVwiICYmXG5cdFx0XHRcdFx0cHJvcGVydHlLZXkgIT09IFwiJEFuZFwiICYmXG5cdFx0XHRcdFx0cHJvcGVydHlLZXkgIT09IFwiJE9yXCIgJiZcblx0XHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkTmVcIiAmJlxuXHRcdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRHdFwiICYmXG5cdFx0XHRcdFx0cHJvcGVydHlLZXkgIT09IFwiJEdlXCIgJiZcblx0XHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkTHRcIiAmJlxuXHRcdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRMZVwiICYmXG5cdFx0XHRcdFx0cHJvcGVydHlLZXkgIT09IFwiJE5vdFwiICYmXG5cdFx0XHRcdFx0cHJvcGVydHlLZXkgIT09IFwiJEVxXCIgJiZcblx0XHRcdFx0XHQhcHJvcGVydHlLZXkuc3RhcnRzV2l0aChcIkBcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXMucHVzaChcblx0XHRcdFx0XHRcdHRoaXMucGFyc2VQcm9wZXJ0eVZhbHVlKFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0W3Byb3BlcnR5S2V5XSxcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlLZXksXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRPYmplY3RUYXJnZXQsXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25zTGlzdHMsXG5cdFx0XHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5S2V5LnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG5cdFx0XHRcdFx0Ly8gQW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9uXG5cdFx0XHRcdFx0dGhpcy5jcmVhdGVBbm5vdGF0aW9uTGlzdHMoXG5cdFx0XHRcdFx0XHR7IFtwcm9wZXJ0eUtleV06IGFubm90YXRpb25PYmplY3RbcHJvcGVydHlLZXldIH0sXG5cdFx0XHRcdFx0XHRjdXJyZW50T2JqZWN0VGFyZ2V0LFxuXHRcdFx0XHRcdFx0YW5ub3RhdGlvbnNMaXN0cyxcblx0XHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QucHJvcGVydHlWYWx1ZXMgPSBwcm9wZXJ0eVZhbHVlcztcblx0XHR9XG5cdFx0cmV0dXJuIHBhcnNlZEFubm90YXRpb25PYmplY3Q7XG5cdH0sXG5cdGdldE9yQ3JlYXRlQW5ub3RhdGlvbkxpc3QodGFyZ2V0OiBzdHJpbmcsIGFubm90YXRpb25zTGlzdHM6IEFubm90YXRpb25MaXN0W10pOiBBbm5vdGF0aW9uTGlzdCB7XG5cdFx0bGV0IHBvdGVudGlhbFRhcmdldCA9IGFubm90YXRpb25zTGlzdHMuZmluZChhbm5vdGF0aW9uTGlzdCA9PiBhbm5vdGF0aW9uTGlzdC50YXJnZXQgPT09IHRhcmdldCk7XG5cdFx0aWYgKCFwb3RlbnRpYWxUYXJnZXQpIHtcblx0XHRcdHBvdGVudGlhbFRhcmdldCA9IHtcblx0XHRcdFx0dGFyZ2V0OiB0YXJnZXQsXG5cdFx0XHRcdGFubm90YXRpb25zOiBbXVxuXHRcdFx0fTtcblx0XHRcdGFubm90YXRpb25zTGlzdHMucHVzaChwb3RlbnRpYWxUYXJnZXQpO1xuXHRcdH1cblx0XHRyZXR1cm4gcG90ZW50aWFsVGFyZ2V0O1xuXHR9LFxuXG5cdGNyZWF0ZUFubm90YXRpb25MaXN0cyhcblx0XHRhbm5vdGF0aW9uT2JqZWN0czogYW55LFxuXHRcdGFubm90YXRpb25UYXJnZXQ6IHN0cmluZyxcblx0XHRhbm5vdGF0aW9uTGlzdHM6IGFueVtdLFxuXHRcdG9DYXBhYmlsaXRpZXM6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzXG5cdCkge1xuXHRcdGNvbnN0IG91dEFubm90YXRpb25PYmplY3QgPSB0aGlzLmdldE9yQ3JlYXRlQW5ub3RhdGlvbkxpc3QoYW5ub3RhdGlvblRhcmdldCwgYW5ub3RhdGlvbkxpc3RzKTtcblx0XHRpZiAoIW9DYXBhYmlsaXRpZXMuTWljcm9DaGFydCkge1xuXHRcdFx0ZGVsZXRlIGFubm90YXRpb25PYmplY3RzW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCJdO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHJlbW92ZUNoYXJ0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdDogYW55KSB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdC5maWx0ZXIoKG9SZWNvcmQ6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAob1JlY29yZC5UYXJnZXQgJiYgb1JlY29yZC5UYXJnZXQuJEFubm90YXRpb25QYXRoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9SZWNvcmQuVGFyZ2V0LiRBbm5vdGF0aW9uUGF0aC5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCIpID09PSAtMTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcmVtb3ZlSUJOQW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdDogYW55KSB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdC5maWx0ZXIoKG9SZWNvcmQ6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gb1JlY29yZC4kVHlwZSAhPT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGhhbmRsZVByZXNlbnRhdGlvblZhcmlhbnQoYW5ub3RhdGlvbk9iamVjdDogYW55KSB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdC5maWx0ZXIoKG9SZWNvcmQ6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gb1JlY29yZC4kQW5ub3RhdGlvblBhdGggIT09IFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCI7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRPYmplY3Qua2V5cyhhbm5vdGF0aW9uT2JqZWN0cykuZm9yRWFjaChhbm5vdGF0aW9uS2V5ID0+IHtcblx0XHRcdGxldCBhbm5vdGF0aW9uT2JqZWN0ID0gYW5ub3RhdGlvbk9iamVjdHNbYW5ub3RhdGlvbktleV07XG5cdFx0XHRzd2l0Y2ggKGFubm90YXRpb25LZXkpIHtcblx0XHRcdFx0Y2FzZSBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJGYWNldHNcIjpcblx0XHRcdFx0XHRpZiAoIW9DYXBhYmlsaXRpZXMuTWljcm9DaGFydCkge1xuXHRcdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdCA9IHJlbW92ZUNoYXJ0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLklkZW50aWZpY2F0aW9uXCI6XG5cdFx0XHRcdFx0aWYgKCFvQ2FwYWJpbGl0aWVzLkludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdCA9IHJlbW92ZUlCTkFubm90YXRpb25zKGFubm90YXRpb25PYmplY3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbVwiOlxuXHRcdFx0XHRcdGlmICghb0NhcGFiaWxpdGllcy5JbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRcdGFubm90YXRpb25PYmplY3QgPSByZW1vdmVJQk5Bbm5vdGF0aW9ucyhhbm5vdGF0aW9uT2JqZWN0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFvQ2FwYWJpbGl0aWVzLk1pY3JvQ2hhcnQpIHtcblx0XHRcdFx0XHRcdGFubm90YXRpb25PYmplY3QgPSByZW1vdmVDaGFydEFubm90YXRpb25zKGFubm90YXRpb25PYmplY3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWVsZEdyb3VwXCI6XG5cdFx0XHRcdFx0aWYgKCFvQ2FwYWJpbGl0aWVzLkludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdC5EYXRhID0gcmVtb3ZlSUJOQW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdC5EYXRhKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFvQ2FwYWJpbGl0aWVzLk1pY3JvQ2hhcnQpIHtcblx0XHRcdFx0XHRcdGFubm90YXRpb25PYmplY3QuRGF0YSA9IHJlbW92ZUNoYXJ0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdC5EYXRhKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUHJlc2VudGF0aW9uVmFyaWFudFwiOlxuXHRcdFx0XHRcdGlmICghb0NhcGFiaWxpdGllcy5DaGFydCAmJiBhbm5vdGF0aW9uT2JqZWN0LlZpc3VhbGl6YXRpb25zKSB7XG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0LlZpc3VhbGl6YXRpb25zID0gaGFuZGxlUHJlc2VudGF0aW9uVmFyaWFudChhbm5vdGF0aW9uT2JqZWN0LlZpc3VhbGl6YXRpb25zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRhbm5vdGF0aW9uT2JqZWN0c1thbm5vdGF0aW9uS2V5XSA9IGFubm90YXRpb25PYmplY3Q7XG5cdFx0XHRsZXQgY3VycmVudE91dEFubm90YXRpb25PYmplY3QgPSBvdXRBbm5vdGF0aW9uT2JqZWN0O1xuXG5cdFx0XHQvLyBDaGVjayBmb3IgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9uXG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXQgPSBhbm5vdGF0aW9uS2V5LnNwbGl0KFwiQFwiKTtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXQubGVuZ3RoID4gMikge1xuXHRcdFx0XHRjdXJyZW50T3V0QW5ub3RhdGlvbk9iamVjdCA9IHRoaXMuZ2V0T3JDcmVhdGVBbm5vdGF0aW9uTGlzdChcblx0XHRcdFx0XHRhbm5vdGF0aW9uVGFyZ2V0ICsgXCJAXCIgKyBhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXRbMV0sXG5cdFx0XHRcdFx0YW5ub3RhdGlvbkxpc3RzXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFubm90YXRpb25LZXkgPSBhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXRbMl07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhbm5vdGF0aW9uS2V5ID0gYW5ub3RhdGlvbk9mQW5ub3RhdGlvblNwbGl0WzFdO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uUXVhbGlmaWVyU3BsaXQgPSBhbm5vdGF0aW9uS2V5LnNwbGl0KFwiI1wiKTtcblx0XHRcdGNvbnN0IHF1YWxpZmllciA9IGFubm90YXRpb25RdWFsaWZpZXJTcGxpdFsxXTtcblx0XHRcdGFubm90YXRpb25LZXkgPSBhbm5vdGF0aW9uUXVhbGlmaWVyU3BsaXRbMF07XG5cblx0XHRcdGNvbnN0IHBhcnNlZEFubm90YXRpb25PYmplY3Q6IGFueSA9IHtcblx0XHRcdFx0dGVybTogYCR7YW5ub3RhdGlvbktleX1gLFxuXHRcdFx0XHRxdWFsaWZpZXI6IHF1YWxpZmllclxuXHRcdFx0fTtcblx0XHRcdGxldCBjdXJyZW50QW5ub3RhdGlvblRhcmdldCA9IGFubm90YXRpb25UYXJnZXQgKyBcIkBcIiArIHBhcnNlZEFubm90YXRpb25PYmplY3QudGVybTtcblx0XHRcdGlmIChxdWFsaWZpZXIpIHtcblx0XHRcdFx0Y3VycmVudEFubm90YXRpb25UYXJnZXQgKz0gXCIjXCIgKyBxdWFsaWZpZXI7XG5cdFx0XHR9XG5cdFx0XHRsZXQgaXNDb2xsZWN0aW9uID0gZmFsc2U7XG5cdFx0XHRpZiAoYW5ub3RhdGlvbk9iamVjdCA9PT0gbnVsbCkge1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkJvb2xcIiwgQm9vbDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgYW5ub3RhdGlvbk9iamVjdCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIlN0cmluZ1wiLCBTdHJpbmc6IGFubm90YXRpb25PYmplY3QgfTtcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGFubm90YXRpb25PYmplY3QgPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiQm9vbFwiLCBCb29sOiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0ID09PSBcIm51bWJlclwiKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiSW50XCIsIEludDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRJZiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiSWZcIiwgSWY6IGFubm90YXRpb25PYmplY3QuJElmIH07XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEFuZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiQW5kXCIsIEFuZDogYW5ub3RhdGlvbk9iamVjdC4kQW5kIH07XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJPclwiLCBPcjogYW5ub3RhdGlvbk9iamVjdC4kT3IgfTtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kTm90ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJOb3RcIiwgTm90OiBhbm5vdGF0aW9uT2JqZWN0LiROb3QgfTtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRXEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkVxXCIsIEVxOiBhbm5vdGF0aW9uT2JqZWN0LiRFcSB9O1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiROZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiTmVcIiwgTmU6IGFubm90YXRpb25PYmplY3QuJE5lIH07XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEd0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJHdFwiLCBHdDogYW5ub3RhdGlvbk9iamVjdC4kR3QgfTtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kR2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkdlXCIsIEdlOiBhbm5vdGF0aW9uT2JqZWN0LiRHZSB9O1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRMdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiTHRcIiwgTHQ6IGFubm90YXRpb25PYmplY3QuJEx0IH07XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJExlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJMZVwiLCBMZTogYW5ub3RhdGlvbk9iamVjdC4kTGUgfTtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQXBwbHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkFwcGx5XCIsIEFwcGx5OiBhbm5vdGF0aW9uT2JqZWN0LiRBcHBseSwgRnVuY3Rpb246IGFubm90YXRpb25PYmplY3QuJEZ1bmN0aW9uIH07XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJFBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIlBhdGhcIiwgUGF0aDogYW5ub3RhdGlvbk9iamVjdC4kUGF0aCB9O1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRBbm5vdGF0aW9uUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7XG5cdFx0XHRcdFx0dHlwZTogXCJBbm5vdGF0aW9uUGF0aFwiLFxuXHRcdFx0XHRcdEFubm90YXRpb25QYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiRBbm5vdGF0aW9uUGF0aFxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiREZWNpbWFsICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJEZWNpbWFsXCIsIERlY2ltYWw6IHBhcnNlRmxvYXQoYW5ub3RhdGlvbk9iamVjdC4kRGVjaW1hbCkgfTtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRW51bU1lbWJlciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7XG5cdFx0XHRcdFx0dHlwZTogXCJFbnVtTWVtYmVyXCIsXG5cdFx0XHRcdFx0RW51bU1lbWJlcjpcblx0XHRcdFx0XHRcdHRoaXMubWFwTmFtZVRvQWxpYXMoYW5ub3RhdGlvbk9iamVjdC4kRW51bU1lbWJlci5zcGxpdChcIi9cIilbMF0pICsgXCIvXCIgKyBhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyLnNwbGl0KFwiL1wiKVsxXVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFubm90YXRpb25PYmplY3QpKSB7XG5cdFx0XHRcdGlzQ29sbGVjdGlvbiA9IHRydWU7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiA9IGFubm90YXRpb25PYmplY3QubWFwKChzdWJBbm5vdGF0aW9uT2JqZWN0LCBzdWJBbm5vdGF0aW9uSW5kZXgpID0+XG5cdFx0XHRcdFx0dGhpcy5wYXJzZUFubm90YXRpb25PYmplY3QoXG5cdFx0XHRcdFx0XHRzdWJBbm5vdGF0aW9uT2JqZWN0LFxuXHRcdFx0XHRcdFx0Y3VycmVudEFubm90YXRpb25UYXJnZXQgKyBcIi9cIiArIHN1YkFubm90YXRpb25JbmRleCxcblx0XHRcdFx0XHRcdGFubm90YXRpb25MaXN0cyxcblx0XHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRQcm9wZXJ0eVBhdGhcIikpIHtcblx0XHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJQcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUGF0aFwiKSkge1xuXHRcdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlBhdGhcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiKSkge1xuXHRcdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkQW5ub3RhdGlvblBhdGhcIikpIHtcblx0XHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJBbm5vdGF0aW9uUGF0aFwiO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJElmXCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiSWZcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkT3JcIikpIHtcblx0XHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJPclwiO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRFcVwiKSkge1xuXHRcdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkVxXCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE5lXCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTmVcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTm90XCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTm90XCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEd0XCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiR3RcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkR2VcIikpIHtcblx0XHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJHZVwiO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRMdFwiKSkge1xuXHRcdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkx0XCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJExlXCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTGVcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkQW5kXCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQW5kXCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFwcGx5XCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQXBwbHlcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0WzBdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJTdHJpbmdcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHJlY29yZDogQW5ub3RhdGlvblJlY29yZCA9IHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlczogW11cblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKGFubm90YXRpb25PYmplY3QuJFR5cGUpIHtcblx0XHRcdFx0XHRjb25zdCB0eXBlVmFsdWUgPSBhbm5vdGF0aW9uT2JqZWN0LiRUeXBlO1xuXHRcdFx0XHRcdHJlY29yZC50eXBlID0gYCR7dHlwZVZhbHVlfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZXM6IGFueVtdID0gW107XG5cdFx0XHRcdE9iamVjdC5rZXlzKGFubm90YXRpb25PYmplY3QpLmZvckVhY2gocHJvcGVydHlLZXkgPT4ge1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eUtleSAhPT0gXCIkVHlwZVwiICYmICFwcm9wZXJ0eUtleS5zdGFydHNXaXRoKFwiQFwiKSkge1xuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXMucHVzaChcblx0XHRcdFx0XHRcdFx0dGhpcy5wYXJzZVByb3BlcnR5VmFsdWUoXG5cdFx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdFtwcm9wZXJ0eUtleV0sXG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlLZXksXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudEFubm90YXRpb25UYXJnZXQsXG5cdFx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvbkxpc3RzLFxuXHRcdFx0XHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5S2V5LnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG5cdFx0XHRcdFx0XHQvLyBBbm5vdGF0aW9uIG9mIHJlY29yZFxuXHRcdFx0XHRcdFx0dGhpcy5jcmVhdGVBbm5vdGF0aW9uTGlzdHMoXG5cdFx0XHRcdFx0XHRcdHsgW3Byb3BlcnR5S2V5XTogYW5ub3RhdGlvbk9iamVjdFtwcm9wZXJ0eUtleV0gfSxcblx0XHRcdFx0XHRcdFx0Y3VycmVudEFubm90YXRpb25UYXJnZXQsXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25MaXN0cyxcblx0XHRcdFx0XHRcdFx0b0NhcGFiaWxpdGllc1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZWNvcmQucHJvcGVydHlWYWx1ZXMgPSBwcm9wZXJ0eVZhbHVlcztcblx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC5yZWNvcmQgPSByZWNvcmQ7XG5cdFx0XHR9XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmlzQ29sbGVjdGlvbiA9IGlzQ29sbGVjdGlvbjtcblx0XHRcdGN1cnJlbnRPdXRBbm5vdGF0aW9uT2JqZWN0LmFubm90YXRpb25zLnB1c2gocGFyc2VkQW5ub3RhdGlvbk9iamVjdCk7XG5cdFx0fSk7XG5cdH0sXG5cdHBhcnNlUHJvcGVydHkoXG5cdFx0b01ldGFNb2RlbDogYW55LFxuXHRcdGVudGl0eVR5cGVPYmplY3Q6IEVudGl0eVR5cGUgfCBDb21wbGV4VHlwZSxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRhbm5vdGF0aW9uTGlzdHM6IEFubm90YXRpb25MaXN0W10sXG5cdFx0b0NhcGFiaWxpdGllczogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNcblx0KTogUHJvcGVydHkge1xuXHRcdGNvbnN0IHByb3BlcnR5QW5ub3RhdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlUeXBlT2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtwcm9wZXJ0eU5hbWV9QGApO1xuXHRcdGNvbnN0IHByb3BlcnR5RGVmaW5pdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlUeXBlT2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtwcm9wZXJ0eU5hbWV9YCk7XG5cblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdDogUHJvcGVydHkgPSB7XG5cdFx0XHRfdHlwZTogXCJQcm9wZXJ0eVwiLFxuXHRcdFx0bmFtZTogcHJvcGVydHlOYW1lLFxuXHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtlbnRpdHlUeXBlT2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtwcm9wZXJ0eU5hbWV9YCxcblx0XHRcdHR5cGU6IHByb3BlcnR5RGVmaW5pdGlvbi4kVHlwZSxcblx0XHRcdG1heExlbmd0aDogcHJvcGVydHlEZWZpbml0aW9uLiRNYXhMZW5ndGgsXG5cdFx0XHRwcmVjaXNpb246IHByb3BlcnR5RGVmaW5pdGlvbi4kUHJlY2lzaW9uLFxuXHRcdFx0c2NhbGU6IHByb3BlcnR5RGVmaW5pdGlvbi4kU2NhbGUsXG5cdFx0XHRudWxsYWJsZTogcHJvcGVydHlEZWZpbml0aW9uLiROdWxsYWJsZVxuXHRcdH07XG5cblx0XHR0aGlzLmNyZWF0ZUFubm90YXRpb25MaXN0cyhwcm9wZXJ0eUFubm90YXRpb24sIHByb3BlcnR5T2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgYW5ub3RhdGlvbkxpc3RzLCBvQ2FwYWJpbGl0aWVzKTtcblxuXHRcdHJldHVybiBwcm9wZXJ0eU9iamVjdDtcblx0fSxcblx0cGFyc2VOYXZpZ2F0aW9uUHJvcGVydHkoXG5cdFx0b01ldGFNb2RlbDogYW55LFxuXHRcdGVudGl0eVR5cGVPYmplY3Q6IEVudGl0eVR5cGUgfCBDb21wbGV4VHlwZSxcblx0XHRuYXZQcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRhbm5vdGF0aW9uTGlzdHM6IEFubm90YXRpb25MaXN0W10sXG5cdFx0b0NhcGFiaWxpdGllczogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNcblx0KTogVjROYXZpZ2F0aW9uUHJvcGVydHkge1xuXHRcdGNvbnN0IG5hdlByb3BlcnR5QW5ub3RhdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlUeXBlT2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtuYXZQcm9wZXJ0eU5hbWV9QGApO1xuXHRcdGNvbnN0IG5hdlByb3BlcnR5RGVmaW5pdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlUeXBlT2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtuYXZQcm9wZXJ0eU5hbWV9YCk7XG5cblx0XHRsZXQgcmVmZXJlbnRpYWxDb25zdHJhaW50OiBSZWZlcmVudGlhbENvbnN0cmFpbnRbXSA9IFtdO1xuXHRcdGlmIChuYXZQcm9wZXJ0eURlZmluaXRpb24uJFJlZmVyZW50aWFsQ29uc3RyYWludCkge1xuXHRcdFx0cmVmZXJlbnRpYWxDb25zdHJhaW50ID0gT2JqZWN0LmtleXMobmF2UHJvcGVydHlEZWZpbml0aW9uLiRSZWZlcmVudGlhbENvbnN0cmFpbnQpLm1hcChzb3VyY2VQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHNvdXJjZVR5cGVOYW1lOiBlbnRpdHlUeXBlT2JqZWN0Lm5hbWUsXG5cdFx0XHRcdFx0c291cmNlUHJvcGVydHk6IHNvdXJjZVByb3BlcnR5TmFtZSxcblx0XHRcdFx0XHR0YXJnZXRUeXBlTmFtZTogbmF2UHJvcGVydHlEZWZpbml0aW9uLiRUeXBlLFxuXHRcdFx0XHRcdHRhcmdldFByb3BlcnR5OiBuYXZQcm9wZXJ0eURlZmluaXRpb24uJFJlZmVyZW50aWFsQ29uc3RyYWludFtzb3VyY2VQcm9wZXJ0eU5hbWVdXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnR5OiBWNE5hdmlnYXRpb25Qcm9wZXJ0eSA9IHtcblx0XHRcdF90eXBlOiBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiLFxuXHRcdFx0bmFtZTogbmF2UHJvcGVydHlOYW1lLFxuXHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtlbnRpdHlUeXBlT2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtuYXZQcm9wZXJ0eU5hbWV9YCxcblx0XHRcdHBhcnRuZXI6IG5hdlByb3BlcnR5RGVmaW5pdGlvbi4kUGFydG5lcixcblx0XHRcdGlzQ29sbGVjdGlvbjogbmF2UHJvcGVydHlEZWZpbml0aW9uLiRpc0NvbGxlY3Rpb24gPyBuYXZQcm9wZXJ0eURlZmluaXRpb24uJGlzQ29sbGVjdGlvbiA6IGZhbHNlLFxuXHRcdFx0Y29udGFpbnNUYXJnZXQ6IG5hdlByb3BlcnR5RGVmaW5pdGlvbi4kQ29udGFpbnNUYXJnZXQsXG5cdFx0XHR0YXJnZXRUeXBlTmFtZTogbmF2UHJvcGVydHlEZWZpbml0aW9uLiRUeXBlLFxuXHRcdFx0cmVmZXJlbnRpYWxDb25zdHJhaW50XG5cdFx0fTtcblxuXHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKG5hdlByb3BlcnR5QW5ub3RhdGlvbiwgbmF2aWdhdGlvblByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZSwgYW5ub3RhdGlvbkxpc3RzLCBvQ2FwYWJpbGl0aWVzKTtcblxuXHRcdHJldHVybiBuYXZpZ2F0aW9uUHJvcGVydHk7XG5cdH0sXG5cdHBhcnNlRW50aXR5U2V0KFxuXHRcdG9NZXRhTW9kZWw6IGFueSxcblx0XHRlbnRpdHlTZXROYW1lOiBzdHJpbmcsXG5cdFx0YW5ub3RhdGlvbkxpc3RzOiBBbm5vdGF0aW9uTGlzdFtdLFxuXHRcdGVudGl0eUNvbnRhaW5lck5hbWU6IHN0cmluZyxcblx0XHRvQ2FwYWJpbGl0aWVzOiBFbnZpcm9ubWVudENhcGFiaWxpdGllc1xuXHQpOiBFbnRpdHlTZXQge1xuXHRcdGNvbnN0IGVudGl0eVNldERlZmluaXRpb24gPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7ZW50aXR5U2V0TmFtZX1gKTtcblx0XHRjb25zdCBlbnRpdHlTZXRBbm5vdGF0aW9uID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke2VudGl0eVNldE5hbWV9QGApO1xuXHRcdGNvbnN0IGVudGl0eVNldE9iamVjdDogRW50aXR5U2V0ID0ge1xuXHRcdFx0X3R5cGU6IFwiRW50aXR5U2V0XCIsXG5cdFx0XHRuYW1lOiBlbnRpdHlTZXROYW1lLFxuXHRcdFx0bmF2aWdhdGlvblByb3BlcnR5QmluZGluZzoge30sXG5cdFx0XHRlbnRpdHlUeXBlTmFtZTogZW50aXR5U2V0RGVmaW5pdGlvbi4kVHlwZSxcblx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7ZW50aXR5Q29udGFpbmVyTmFtZX0vJHtlbnRpdHlTZXROYW1lfWBcblx0XHR9O1xuXHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKGVudGl0eVNldEFubm90YXRpb24sIGVudGl0eVNldE9iamVjdC5mdWxseVF1YWxpZmllZE5hbWUsIGFubm90YXRpb25MaXN0cywgb0NhcGFiaWxpdGllcyk7XG5cdFx0cmV0dXJuIGVudGl0eVNldE9iamVjdDtcblx0fSxcblxuXHRwYXJzZVNpbmdsZXRvbihcblx0XHRvTWV0YU1vZGVsOiBhbnksXG5cdFx0c2luZ2xldG9uTmFtZTogc3RyaW5nLFxuXHRcdGFubm90YXRpb25MaXN0czogQW5ub3RhdGlvbkxpc3RbXSxcblx0XHRlbnRpdHlDb250YWluZXJOYW1lOiBzdHJpbmcsXG5cdFx0b0NhcGFiaWxpdGllczogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNcblx0KTogU2luZ2xldG9uIHtcblx0XHRjb25zdCBzaW5nbGV0b25EZWZpbml0aW9uID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke3NpbmdsZXRvbk5hbWV9YCk7XG5cdFx0Y29uc3Qgc2luZ2xldG9uQW5ub3RhdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtzaW5nbGV0b25OYW1lfUBgKTtcblx0XHRjb25zdCBzaW5nbGV0b25PYmplY3Q6IFNpbmdsZXRvbiA9IHtcblx0XHRcdF90eXBlOiBcIlNpbmdsZXRvblwiLFxuXHRcdFx0bmFtZTogc2luZ2xldG9uTmFtZSxcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmc6IHt9LFxuXHRcdFx0dHlwZU5hbWU6IHNpbmdsZXRvbkRlZmluaXRpb24uJFR5cGUsXG5cdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGAke2VudGl0eUNvbnRhaW5lck5hbWV9LyR7c2luZ2xldG9uTmFtZX1gLFxuXHRcdFx0bnVsbGFibGU6IHRydWVcblx0XHR9O1xuXHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKHNpbmdsZXRvbkFubm90YXRpb24sIHNpbmdsZXRvbk9iamVjdC5mdWxseVF1YWxpZmllZE5hbWUsIGFubm90YXRpb25MaXN0cywgb0NhcGFiaWxpdGllcyk7XG5cdFx0cmV0dXJuIHNpbmdsZXRvbk9iamVjdDtcblx0fSxcblxuXHRwYXJzZUVudGl0eVR5cGUoXG5cdFx0b01ldGFNb2RlbDogYW55LFxuXHRcdGVudGl0eVR5cGVOYW1lOiBzdHJpbmcsXG5cdFx0YW5ub3RhdGlvbkxpc3RzOiBBbm5vdGF0aW9uTGlzdFtdLFxuXHRcdG5hbWVzcGFjZTogc3RyaW5nLFxuXHRcdG9DYXBhYmlsaXRpZXM6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzXG5cdCk6IEVudGl0eVR5cGUge1xuXHRcdGNvbnN0IGVudGl0eVR5cGVBbm5vdGF0aW9uID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke2VudGl0eVR5cGVOYW1lfUBgKTtcblx0XHRjb25zdCBlbnRpdHlUeXBlRGVmaW5pdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlUeXBlTmFtZX1gKTtcblxuXHRcdGNvbnN0IGVudGl0eUtleXM6IGFueSA9IGdldEVudGl0eUtleXMoZW50aXR5VHlwZURlZmluaXRpb24pO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0RW50aXR5S2V5cyhlbnRpdHlUeXBlRGVmaW5pdGlvbjogYW55KTogYW55IHtcblx0XHRcdGlmICghZW50aXR5VHlwZURlZmluaXRpb24uJEtleSAmJiBlbnRpdHlUeXBlRGVmaW5pdGlvbi4kQmFzZVR5cGUpIHtcblx0XHRcdFx0cmV0dXJuIGdldEVudGl0eUtleXMob01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke2VudGl0eVR5cGVEZWZpbml0aW9uLiRCYXNlVHlwZX1gKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZW50aXR5VHlwZURlZmluaXRpb24uJEtleSB8fCBbXTsgLy9oYW5kbGluZyBvZiBlbnRpdHkgdHlwZXMgd2l0aG91dCBrZXkgYXMgd2VsbCBhcyBiYXNldHlwZVxuXHRcdH1cblx0XHRjb25zdCBlbnRpdHlUeXBlT2JqZWN0OiBFbnRpdHlUeXBlID0ge1xuXHRcdFx0X3R5cGU6IFwiRW50aXR5VHlwZVwiLFxuXHRcdFx0bmFtZTogZW50aXR5VHlwZU5hbWUucmVwbGFjZShuYW1lc3BhY2UgKyBcIi5cIiwgXCJcIiksXG5cdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGVudGl0eVR5cGVOYW1lLFxuXHRcdFx0a2V5czogW10sXG5cdFx0XHRlbnRpdHlQcm9wZXJ0aWVzOiBbXSxcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXVxuXHRcdH07XG5cblx0XHR0aGlzLmNyZWF0ZUFubm90YXRpb25MaXN0cyhlbnRpdHlUeXBlQW5ub3RhdGlvbiwgZW50aXR5VHlwZU9iamVjdC5mdWxseVF1YWxpZmllZE5hbWUsIGFubm90YXRpb25MaXN0cywgb0NhcGFiaWxpdGllcyk7XG5cdFx0Y29uc3QgZW50aXR5UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGVudGl0eVR5cGVEZWZpbml0aW9uKVxuXHRcdFx0LmZpbHRlcihwcm9wZXJ0eU5hbWVPck5vdCA9PiB7XG5cdFx0XHRcdGlmIChwcm9wZXJ0eU5hbWVPck5vdCAhPSBcIiRLZXlcIiAmJiBwcm9wZXJ0eU5hbWVPck5vdCAhPSBcIiRraW5kXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW50aXR5VHlwZURlZmluaXRpb25bcHJvcGVydHlOYW1lT3JOb3RdLiRraW5kID09PSBcIlByb3BlcnR5XCI7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQubWFwKHByb3BlcnR5TmFtZSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnBhcnNlUHJvcGVydHkob01ldGFNb2RlbCwgZW50aXR5VHlwZU9iamVjdCwgcHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uTGlzdHMsIG9DYXBhYmlsaXRpZXMpO1xuXHRcdFx0fSk7XG5cblx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGVudGl0eVR5cGVEZWZpbml0aW9uKVxuXHRcdFx0LmZpbHRlcihwcm9wZXJ0eU5hbWVPck5vdCA9PiB7XG5cdFx0XHRcdGlmIChwcm9wZXJ0eU5hbWVPck5vdCAhPSBcIiRLZXlcIiAmJiBwcm9wZXJ0eU5hbWVPck5vdCAhPSBcIiRraW5kXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW50aXR5VHlwZURlZmluaXRpb25bcHJvcGVydHlOYW1lT3JOb3RdLiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0Lm1hcChuYXZQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5wYXJzZU5hdmlnYXRpb25Qcm9wZXJ0eShvTWV0YU1vZGVsLCBlbnRpdHlUeXBlT2JqZWN0LCBuYXZQcm9wZXJ0eU5hbWUsIGFubm90YXRpb25MaXN0cywgb0NhcGFiaWxpdGllcyk7XG5cdFx0XHR9KTtcblxuXHRcdGVudGl0eVR5cGVPYmplY3Qua2V5cyA9IGVudGl0eUtleXNcblx0XHRcdC5tYXAoKGVudGl0eUtleTogc3RyaW5nKSA9PiBlbnRpdHlQcm9wZXJ0aWVzLmZpbmQoKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSA9PT0gZW50aXR5S2V5KSlcblx0XHRcdC5maWx0ZXIoKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4gcHJvcGVydHkgIT09IHVuZGVmaW5lZCk7XG5cdFx0ZW50aXR5VHlwZU9iamVjdC5lbnRpdHlQcm9wZXJ0aWVzID0gZW50aXR5UHJvcGVydGllcztcblx0XHRlbnRpdHlUeXBlT2JqZWN0Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gbmF2aWdhdGlvblByb3BlcnRpZXM7XG5cblx0XHRyZXR1cm4gZW50aXR5VHlwZU9iamVjdDtcblx0fSxcblx0cGFyc2VDb21wbGV4VHlwZShcblx0XHRvTWV0YU1vZGVsOiBhbnksXG5cdFx0Y29tcGxleFR5cGVOYW1lOiBzdHJpbmcsXG5cdFx0YW5ub3RhdGlvbkxpc3RzOiBBbm5vdGF0aW9uTGlzdFtdLFxuXHRcdG5hbWVzcGFjZTogc3RyaW5nLFxuXHRcdG9DYXBhYmlsaXRpZXM6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzXG5cdCk6IENvbXBsZXhUeXBlIHtcblx0XHRjb25zdCBjb21wbGV4VHlwZUFubm90YXRpb24gPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7Y29tcGxleFR5cGVOYW1lfUBgKTtcblx0XHRjb25zdCBjb21wbGV4VHlwZURlZmluaXRpb24gPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7Y29tcGxleFR5cGVOYW1lfWApO1xuXHRcdGNvbnN0IGNvbXBsZXhUeXBlT2JqZWN0OiBDb21wbGV4VHlwZSA9IHtcblx0XHRcdF90eXBlOiBcIkNvbXBsZXhUeXBlXCIsXG5cdFx0XHRuYW1lOiBjb21wbGV4VHlwZU5hbWUucmVwbGFjZShuYW1lc3BhY2UgKyBcIi5cIiwgXCJcIiksXG5cdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGNvbXBsZXhUeXBlTmFtZSxcblx0XHRcdHByb3BlcnRpZXM6IFtdLFxuXHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdXG5cdFx0fTtcblxuXHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKGNvbXBsZXhUeXBlQW5ub3RhdGlvbiwgY29tcGxleFR5cGVPYmplY3QuZnVsbHlRdWFsaWZpZWROYW1lLCBhbm5vdGF0aW9uTGlzdHMsIG9DYXBhYmlsaXRpZXMpO1xuXHRcdGNvbnN0IGNvbXBsZXhUeXBlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGNvbXBsZXhUeXBlRGVmaW5pdGlvbilcblx0XHRcdC5maWx0ZXIocHJvcGVydHlOYW1lT3JOb3QgPT4ge1xuXHRcdFx0XHRpZiAocHJvcGVydHlOYW1lT3JOb3QgIT0gXCIkS2V5XCIgJiYgcHJvcGVydHlOYW1lT3JOb3QgIT0gXCIka2luZFwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXhUeXBlRGVmaW5pdGlvbltwcm9wZXJ0eU5hbWVPck5vdF0uJGtpbmQgPT09IFwiUHJvcGVydHlcIjtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5tYXAocHJvcGVydHlOYW1lID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucGFyc2VQcm9wZXJ0eShvTWV0YU1vZGVsLCBjb21wbGV4VHlwZU9iamVjdCwgcHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uTGlzdHMsIG9DYXBhYmlsaXRpZXMpO1xuXHRcdFx0fSk7XG5cblx0XHRjb21wbGV4VHlwZU9iamVjdC5wcm9wZXJ0aWVzID0gY29tcGxleFR5cGVQcm9wZXJ0aWVzO1xuXHRcdGNvbnN0IGNvbXBsZXhUeXBlTmF2aWdhdGlvblByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhjb21wbGV4VHlwZURlZmluaXRpb24pXG5cdFx0XHQuZmlsdGVyKHByb3BlcnR5TmFtZU9yTm90ID0+IHtcblx0XHRcdFx0aWYgKHByb3BlcnR5TmFtZU9yTm90ICE9IFwiJEtleVwiICYmIHByb3BlcnR5TmFtZU9yTm90ICE9IFwiJGtpbmRcIikge1xuXHRcdFx0XHRcdHJldHVybiBjb21wbGV4VHlwZURlZmluaXRpb25bcHJvcGVydHlOYW1lT3JOb3RdLiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0Lm1hcChuYXZQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5wYXJzZU5hdmlnYXRpb25Qcm9wZXJ0eShvTWV0YU1vZGVsLCBjb21wbGV4VHlwZU9iamVjdCwgbmF2UHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uTGlzdHMsIG9DYXBhYmlsaXRpZXMpO1xuXHRcdFx0fSk7XG5cdFx0Y29tcGxleFR5cGVPYmplY3QubmF2aWdhdGlvblByb3BlcnRpZXMgPSBjb21wbGV4VHlwZU5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xuXHRcdHJldHVybiBjb21wbGV4VHlwZU9iamVjdDtcblx0fSxcblx0cGFyc2VBY3Rpb24oYWN0aW9uTmFtZTogc3RyaW5nLCBhY3Rpb25SYXdEYXRhOiBNZXRhTW9kZWxBY3Rpb24sIG5hbWVzcGFjZTogc3RyaW5nLCBlbnRpdHlDb250YWluZXJOYW1lOiBzdHJpbmcpOiBBY3Rpb24ge1xuXHRcdGxldCBhY3Rpb25FbnRpdHlUeXBlOiBzdHJpbmcgPSBcIlwiO1xuXHRcdGxldCBhY3Rpb25GUU4gPSBgJHthY3Rpb25OYW1lfWA7XG5cdFx0Y29uc3QgYWN0aW9uU2hvcnROYW1lID0gYWN0aW9uTmFtZS5zdWJzdHIobmFtZXNwYWNlLmxlbmd0aCArIDEpO1xuXHRcdGlmIChhY3Rpb25SYXdEYXRhLiRJc0JvdW5kKSB7XG5cdFx0XHRjb25zdCBiaW5kaW5nUGFyYW1ldGVyID0gYWN0aW9uUmF3RGF0YS4kUGFyYW1ldGVyWzBdO1xuXHRcdFx0YWN0aW9uRW50aXR5VHlwZSA9IGJpbmRpbmdQYXJhbWV0ZXIuJFR5cGU7XG5cdFx0XHRpZiAoYmluZGluZ1BhcmFtZXRlci4kaXNDb2xsZWN0aW9uID09PSB0cnVlKSB7XG5cdFx0XHRcdGFjdGlvbkZRTiA9IGAke2FjdGlvbk5hbWV9KENvbGxlY3Rpb24oJHthY3Rpb25FbnRpdHlUeXBlfSkpYDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFjdGlvbkZRTiA9IGAke2FjdGlvbk5hbWV9KCR7YWN0aW9uRW50aXR5VHlwZX0pYDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YWN0aW9uRlFOID0gYCR7ZW50aXR5Q29udGFpbmVyTmFtZX0vJHthY3Rpb25TaG9ydE5hbWV9YDtcblx0XHR9XG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IGFjdGlvblJhd0RhdGEuJFBhcmFtZXRlciB8fCBbXTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0X3R5cGU6IFwiQWN0aW9uXCIsXG5cdFx0XHRuYW1lOiBhY3Rpb25TaG9ydE5hbWUsXG5cdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGFjdGlvbkZRTixcblx0XHRcdGlzQm91bmQ6IGFjdGlvblJhd0RhdGEuJElzQm91bmQsXG5cdFx0XHRzb3VyY2VUeXBlOiBhY3Rpb25FbnRpdHlUeXBlLFxuXHRcdFx0cmV0dXJuVHlwZTogYWN0aW9uUmF3RGF0YS4kUmV0dXJuVHlwZSA/IGFjdGlvblJhd0RhdGEuJFJldHVyblR5cGUuJFR5cGUgOiBcIlwiLFxuXHRcdFx0cGFyYW1ldGVyczogcGFyYW1ldGVycy5tYXAocGFyYW0gPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdF90eXBlOiBcIkFjdGlvblBhcmFtZXRlclwiLFxuXHRcdFx0XHRcdGlzRW50aXR5U2V0OiBwYXJhbS4kVHlwZSA9PT0gYWN0aW9uUmF3RGF0YS4kRW50aXR5U2V0UGF0aCxcblx0XHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGAke2FjdGlvbkZRTn0vJHtwYXJhbS4kTmFtZX1gLFxuXHRcdFx0XHRcdHR5cGU6IHBhcmFtLiRUeXBlXG5cdFx0XHRcdFx0Ly8gVE9ETyBtaXNzaW5nIHByb3BlcnRpZXMgP1xuXHRcdFx0XHR9O1xuXHRcdFx0fSlcblx0XHR9O1xuXHR9LFxuXHRwYXJzZUVudGl0eVR5cGVzKG9NZXRhTW9kZWw6IGFueSwgb0luQ2FwYWJpbGl0aWVzPzogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMpOiBQYXJzZXJPdXRwdXQge1xuXHRcdGxldCBvQ2FwYWJpbGl0aWVzOiBFbnZpcm9ubWVudENhcGFiaWxpdGllcztcblx0XHRpZiAoIW9JbkNhcGFiaWxpdGllcykge1xuXHRcdFx0b0NhcGFiaWxpdGllcyA9IERlZmF1bHRFbnZpcm9ubWVudENhcGFiaWxpdGllcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0NhcGFiaWxpdGllcyA9IG9JbkNhcGFiaWxpdGllcztcblx0XHR9XG5cdFx0Y29uc3Qgb01ldGFNb2RlbERhdGEgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi8kXCIpO1xuXHRcdGNvbnN0IG9FbnRpdHlTZXRzID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvXCIpO1xuXHRcdGxldCBhbm5vdGF0aW9uTGlzdHM6IEFubm90YXRpb25MaXN0W10gPSBbXTtcblx0XHRjb25zdCBlbnRpdHlUeXBlczogRW50aXR5VHlwZVtdID0gW107XG5cdFx0Y29uc3QgZW50aXR5U2V0czogRW50aXR5U2V0W10gPSBbXTtcblx0XHRjb25zdCBzaW5nbGV0b25zOiBTaW5nbGV0b25bXSA9IFtdO1xuXHRcdGNvbnN0IGNvbXBsZXhUeXBlczogQ29tcGxleFR5cGVbXSA9IFtdO1xuXHRcdGNvbnN0IGVudGl0eUNvbnRhaW5lck5hbWUgPSBvTWV0YU1vZGVsRGF0YS4kRW50aXR5Q29udGFpbmVyO1xuXHRcdGxldCBuYW1lc3BhY2UgPSBcIlwiO1xuXHRcdGNvbnN0IHNjaGVtYUtleXMgPSBPYmplY3Qua2V5cyhvTWV0YU1vZGVsRGF0YSkuZmlsdGVyKG1ldGFtb2RlbEtleSA9PiBvTWV0YU1vZGVsRGF0YVttZXRhbW9kZWxLZXldLiRraW5kID09PSBcIlNjaGVtYVwiKTtcblx0XHRpZiAoc2NoZW1hS2V5cyAmJiBzY2hlbWFLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRcdG5hbWVzcGFjZSA9IHNjaGVtYUtleXNbMF0uc3Vic3RyKDAsIHNjaGVtYUtleXNbMF0ubGVuZ3RoIC0gMSk7XG5cdFx0fSBlbHNlIGlmIChlbnRpdHlUeXBlcyAmJiBlbnRpdHlUeXBlcy5sZW5ndGgpIHtcblx0XHRcdG5hbWVzcGFjZSA9IGVudGl0eVR5cGVzWzBdLmZ1bGx5UXVhbGlmaWVkTmFtZS5yZXBsYWNlKGVudGl0eVR5cGVzWzBdLm5hbWUsIFwiXCIpO1xuXHRcdFx0bmFtZXNwYWNlID0gbmFtZXNwYWNlLnN1YnN0cigwLCBuYW1lc3BhY2UubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXHRcdE9iamVjdC5rZXlzKG9NZXRhTW9kZWxEYXRhKVxuXHRcdFx0LmZpbHRlcihlbnRpdHlUeXBlTmFtZSA9PiB7XG5cdFx0XHRcdHJldHVybiBlbnRpdHlUeXBlTmFtZSAhPT0gXCIka2luZFwiICYmIG9NZXRhTW9kZWxEYXRhW2VudGl0eVR5cGVOYW1lXS4ka2luZCA9PT0gXCJFbnRpdHlUeXBlXCI7XG5cdFx0XHR9KVxuXHRcdFx0LmZvckVhY2goZW50aXR5VHlwZU5hbWUgPT4ge1xuXHRcdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gdGhpcy5wYXJzZUVudGl0eVR5cGUob01ldGFNb2RlbCwgZW50aXR5VHlwZU5hbWUsIGFubm90YXRpb25MaXN0cywgbmFtZXNwYWNlLCBvQ2FwYWJpbGl0aWVzKTtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlcmUgYXJlIGZpbHRlciBmYWNldHMgZGVmaW5lZCBmb3IgdGhlIGVudGl0eVR5cGUgYW5kIGlmIHllcywgY2hlY2sgaWYgYWxsIG9mIHRoZW0gaGF2ZSBhbiBJRFxuXHRcdFx0XHQvLyBUaGUgSUQgaXMgb3B0aW9uYWwsIGJ1dCBpdCBpcyBpbnRlcm5hbGx5IHRha2VuIGZvciBncm91cGluZyBmaWx0ZXIgZmllbGRzIGFuZCBpZiBpdCdzIG5vdCBwcmVzZW50XG5cdFx0XHRcdC8vIGEgZmFsbGJhY2sgSUQgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIGhlcmUuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdICYmXG5cdFx0XHRcdFx0b01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWx0ZXJGYWNldHNcIl1cblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWx0ZXJGYWNldHNcIl0uZm9yRWFjaChcblx0XHRcdFx0XHRcdChmaWx0ZXJGYWNldEFubm90YXRpb246IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRmaWx0ZXJGYWNldEFubm90YXRpb24uSUQgPSBmaWx0ZXJGYWNldEFubm90YXRpb24uSUQgfHwgZ2VuZXJhdGUoW3sgRmFjZXQ6IGZpbHRlckZhY2V0QW5ub3RhdGlvbiB9XSk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpbHRlckZhY2V0c1wiOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpbHRlckZhY2V0c1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdGFubm90YXRpb25MaXN0cyxcblx0XHRcdFx0XHRcdFx0XHRvQ2FwYWJpbGl0aWVzXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaChlbnRpdHlQcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXSkge1xuXHRcdFx0XHRcdFx0b01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2VudGl0eVByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB7fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGREZWZhdWx0XCJdKSB7XG5cdFx0XHRcdFx0XHRvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGREZWZhdWx0XCJdID0ge1xuXHRcdFx0XHRcdFx0XHQkVHlwZTogXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRcIixcblx0XHRcdFx0XHRcdFx0VmFsdWU6IHsgJFBhdGg6IGVudGl0eVByb3BlcnR5Lm5hbWUgfVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRGVmYXVsdFwiOlxuXHRcdFx0XHRcdFx0XHRcdFx0b01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2VudGl0eVByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZV1bXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZERlZmF1bHRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRlbnRpdHlQcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25MaXN0cyxcblx0XHRcdFx0XHRcdFx0b0NhcGFiaWxpdGllc1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRlbnRpdHlUeXBlcy5wdXNoKGVudGl0eVR5cGUpO1xuXHRcdFx0fSk7XG5cdFx0T2JqZWN0LmtleXMob0VudGl0eVNldHMpXG5cdFx0XHQuZmlsdGVyKGVudGl0eVNldE5hbWUgPT4ge1xuXHRcdFx0XHRyZXR1cm4gZW50aXR5U2V0TmFtZSAhPT0gXCIka2luZFwiICYmIG9FbnRpdHlTZXRzW2VudGl0eVNldE5hbWVdLiRraW5kID09PSBcIkVudGl0eVNldFwiO1xuXHRcdFx0fSlcblx0XHRcdC5mb3JFYWNoKGVudGl0eVNldE5hbWUgPT4ge1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXQgPSB0aGlzLnBhcnNlRW50aXR5U2V0KG9NZXRhTW9kZWwsIGVudGl0eVNldE5hbWUsIGFubm90YXRpb25MaXN0cywgZW50aXR5Q29udGFpbmVyTmFtZSwgb0NhcGFiaWxpdGllcyk7XG5cdFx0XHRcdGVudGl0eVNldHMucHVzaChlbnRpdHlTZXQpO1xuXHRcdFx0fSk7XG5cdFx0T2JqZWN0LmtleXMob0VudGl0eVNldHMpXG5cdFx0XHQuZmlsdGVyKHNpbmdsZXRvbk5hbWUgPT4ge1xuXHRcdFx0XHRyZXR1cm4gc2luZ2xldG9uTmFtZSAhPT0gXCIka2luZFwiICYmIG9FbnRpdHlTZXRzW3NpbmdsZXRvbk5hbWVdLiRraW5kID09PSBcIlNpbmdsZXRvblwiO1xuXHRcdFx0fSlcblx0XHRcdC5mb3JFYWNoKHNpbmdsZXRvbk5hbWUgPT4ge1xuXHRcdFx0XHRjb25zdCBzaW5nbGV0b24gPSB0aGlzLnBhcnNlU2luZ2xldG9uKG9NZXRhTW9kZWwsIHNpbmdsZXRvbk5hbWUsIGFubm90YXRpb25MaXN0cywgZW50aXR5Q29udGFpbmVyTmFtZSwgb0NhcGFiaWxpdGllcyk7XG5cdFx0XHRcdHNpbmdsZXRvbnMucHVzaChzaW5nbGV0b24pO1xuXHRcdFx0fSk7XG5cdFx0T2JqZWN0LmtleXMob01ldGFNb2RlbERhdGEpXG5cdFx0XHQuZmlsdGVyKGNvbXBsZXhUeXBlTmFtZSA9PiB7XG5cdFx0XHRcdHJldHVybiBjb21wbGV4VHlwZU5hbWUgIT09IFwiJGtpbmRcIiAmJiBvTWV0YU1vZGVsRGF0YVtjb21wbGV4VHlwZU5hbWVdLiRraW5kID09PSBcIkNvbXBsZXhUeXBlXCI7XG5cdFx0XHR9KVxuXHRcdFx0LmZvckVhY2goY29tcGxleFR5cGVOYW1lID0+IHtcblx0XHRcdFx0Y29uc3QgY29tcGxleFR5cGUgPSB0aGlzLnBhcnNlQ29tcGxleFR5cGUob01ldGFNb2RlbCwgY29tcGxleFR5cGVOYW1lLCBhbm5vdGF0aW9uTGlzdHMsIG5hbWVzcGFjZSwgb0NhcGFiaWxpdGllcyk7XG5cdFx0XHRcdGNvbXBsZXhUeXBlcy5wdXNoKGNvbXBsZXhUeXBlKTtcblx0XHRcdH0pO1xuXHRcdGNvbnN0IG9FbnRpdHlDb250YWluZXJOYW1lID0gT2JqZWN0LmtleXMob01ldGFNb2RlbERhdGEpLmZpbmQoZW50aXR5Q29udGFpbmVyTmFtZSA9PiB7XG5cdFx0XHRyZXR1cm4gZW50aXR5Q29udGFpbmVyTmFtZSAhPT0gXCIka2luZFwiICYmIG9NZXRhTW9kZWxEYXRhW2VudGl0eUNvbnRhaW5lck5hbWVdLiRraW5kID09PSBcIkVudGl0eUNvbnRhaW5lclwiO1xuXHRcdH0pO1xuXHRcdGxldCBlbnRpdHlDb250YWluZXI6IEVudGl0eUNvbnRhaW5lciA9IHt9O1xuXHRcdGlmIChvRW50aXR5Q29udGFpbmVyTmFtZSkge1xuXHRcdFx0ZW50aXR5Q29udGFpbmVyID0ge1xuXHRcdFx0XHRuYW1lOiBvRW50aXR5Q29udGFpbmVyTmFtZS5yZXBsYWNlKG5hbWVzcGFjZSArIFwiLlwiLCBcIlwiKSxcblx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBvRW50aXR5Q29udGFpbmVyTmFtZVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0ZW50aXR5U2V0cy5mb3JFYWNoKGVudGl0eVNldCA9PiB7XG5cdFx0XHRjb25zdCBuYXZQcm9wZXJ0eUJpbmRpbmdzID0gb01ldGFNb2RlbERhdGFbZW50aXR5Q29udGFpbmVyTmFtZV1bZW50aXR5U2V0Lm5hbWVdLiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nO1xuXHRcdFx0aWYgKG5hdlByb3BlcnR5QmluZGluZ3MpIHtcblx0XHRcdFx0T2JqZWN0LmtleXMobmF2UHJvcGVydHlCaW5kaW5ncykuZm9yRWFjaChuYXZQcm9wTmFtZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgdGFyZ2V0RW50aXR5U2V0ID0gZW50aXR5U2V0cy5maW5kKGVudGl0eVNldE5hbWUgPT4gZW50aXR5U2V0TmFtZS5uYW1lID09PSBuYXZQcm9wZXJ0eUJpbmRpbmdzW25hdlByb3BOYW1lXSk7XG5cdFx0XHRcdFx0aWYgKHRhcmdldEVudGl0eVNldCkge1xuXHRcdFx0XHRcdFx0ZW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdbbmF2UHJvcE5hbWVdID0gdGFyZ2V0RW50aXR5U2V0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRjb25zdCBhY3Rpb25zOiBBY3Rpb25bXSA9IE9iamVjdC5rZXlzKG9NZXRhTW9kZWxEYXRhKVxuXHRcdFx0LmZpbHRlcihrZXkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShvTWV0YU1vZGVsRGF0YVtrZXldKSAmJiBvTWV0YU1vZGVsRGF0YVtrZXldLmxlbmd0aCA+IDAgJiYgb01ldGFNb2RlbERhdGFba2V5XVswXS4ka2luZCA9PT0gXCJBY3Rpb25cIjtcblx0XHRcdH0pXG5cdFx0XHQucmVkdWNlKChvdXRBY3Rpb25zOiBBY3Rpb25bXSwgYWN0aW9uTmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBhY3Rpb25zID0gb01ldGFNb2RlbERhdGFbYWN0aW9uTmFtZV07XG5cdFx0XHRcdGFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uOiBNZXRhTW9kZWxBY3Rpb24pID0+IHtcblx0XHRcdFx0XHRvdXRBY3Rpb25zLnB1c2godGhpcy5wYXJzZUFjdGlvbihhY3Rpb25OYW1lLCBhY3Rpb24sIG5hbWVzcGFjZSwgZW50aXR5Q29udGFpbmVyTmFtZSkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIG91dEFjdGlvbnM7XG5cdFx0XHR9LCBbXSk7XG5cdFx0Ly8gRklYTUUgQ3JhcHB5IGNvZGUgdG8gZGVhbCB3aXRoIGFubm90YXRpb25zIGZvciBmdW5jdGlvbnNcblx0XHRjb25zdCBhbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWxEYXRhLiRBbm5vdGF0aW9ucztcblx0XHRjb25zdCBhY3Rpb25Bbm5vdGF0aW9ucyA9IE9iamVjdC5rZXlzKGFubm90YXRpb25zKS5maWx0ZXIodGFyZ2V0ID0+IHRhcmdldC5pbmRleE9mKFwiKFwiKSAhPT0gLTEpO1xuXHRcdGFjdGlvbkFubm90YXRpb25zLmZvckVhY2godGFyZ2V0ID0+IHtcblx0XHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKG9NZXRhTW9kZWxEYXRhLiRBbm5vdGF0aW9uc1t0YXJnZXRdLCB0YXJnZXQsIGFubm90YXRpb25MaXN0cywgb0NhcGFiaWxpdGllcyk7XG5cdFx0fSk7XG5cdFx0Y29uc3QgYWN0aW9uc05hbWVXaXRob3V0T3ZlcmxvYWQgPSBhY3Rpb25zLm1hcChhY3Rpb24gPT4gYWN0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdChcIihcIilbMF0pO1xuXHRcdGFjdGlvbnNOYW1lV2l0aG91dE92ZXJsb2FkLmZvckVhY2goYWN0aW9uTmFtZSA9PiB7XG5cdFx0XHRpZiAoYW5ub3RhdGlvbnMuaGFzT3duUHJvcGVydHkoYWN0aW9uTmFtZSkpIHtcblx0XHRcdFx0dGhpcy5jcmVhdGVBbm5vdGF0aW9uTGlzdHMob01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2FjdGlvbk5hbWVdLCBhY3Rpb25OYW1lLCBhbm5vdGF0aW9uTGlzdHMsIG9DYXBhYmlsaXRpZXMpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGNvbnN0IGVudGl0eUNvbnRhaW5lckFubm90YXRpb25zID0gYW5ub3RhdGlvbnNbZW50aXR5Q29udGFpbmVyTmFtZV07XG5cblx0XHQvLyBSZXRyaWV2ZSBFbnRpdHkgQ29udGFpbmVyIGFubm90YXRpb25zXG5cdFx0aWYgKGVudGl0eUNvbnRhaW5lckFubm90YXRpb25zKSB7XG5cdFx0XHR0aGlzLmNyZWF0ZUFubm90YXRpb25MaXN0cyhlbnRpdHlDb250YWluZXJBbm5vdGF0aW9ucywgZW50aXR5Q29udGFpbmVyTmFtZSwgYW5ub3RhdGlvbkxpc3RzLCBvQ2FwYWJpbGl0aWVzKTtcblx0XHR9XG5cdFx0Ly8gU29ydCBieSB0YXJnZXQgbGVuZ3RoXG5cdFx0YW5ub3RhdGlvbkxpc3RzID0gYW5ub3RhdGlvbkxpc3RzLnNvcnQoKGEsIGIpID0+IChhLnRhcmdldC5sZW5ndGggPj0gYi50YXJnZXQubGVuZ3RoID8gMSA6IC0xKSk7XG5cdFx0Y29uc3QgcmVmZXJlbmNlczogUmVmZXJlbmNlW10gPSBbXTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aWRlbnRpZmljYXRpb246IFwibWV0YW1vZGVsUmVzdWx0XCIsXG5cdFx0XHR2ZXJzaW9uOiBcIjQuMFwiLFxuXHRcdFx0c2NoZW1hOiB7XG5cdFx0XHRcdGVudGl0eUNvbnRhaW5lcixcblx0XHRcdFx0ZW50aXR5U2V0cyxcblx0XHRcdFx0ZW50aXR5VHlwZXMsXG5cdFx0XHRcdGNvbXBsZXhUeXBlcyxcblx0XHRcdFx0c2luZ2xldG9ucyxcblx0XHRcdFx0YXNzb2NpYXRpb25zOiBbXSxcblx0XHRcdFx0YWN0aW9ucyxcblx0XHRcdFx0bmFtZXNwYWNlLFxuXHRcdFx0XHRhbm5vdGF0aW9uczoge1xuXHRcdFx0XHRcdFwibWV0YW1vZGVsUmVzdWx0XCI6IGFubm90YXRpb25MaXN0c1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0cmVmZXJlbmNlczogcmVmZXJlbmNlc1xuXHRcdH07XG5cdH1cbn07XG5cbmNvbnN0IG1NZXRhTW9kZWxNYXA6IFJlY29yZDxzdHJpbmcsIFBhcnNlck91dHB1dD4gPSB7fTtcblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBPRGF0YU1ldGFNb2RlbCBpbnRvIGFub3RoZXIgZm9ybWF0IHRoYXQgYWxsb3cgZm9yIGVhc3kgbWFuaXB1bGF0aW9uIG9mIHRoZSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09EYXRhTWV0YU1vZGVsfSBvTWV0YU1vZGVsIFRoZSBjdXJyZW50IG9EYXRhTWV0YU1vZGVsXG4gKiBAcGFyYW0gb0NhcGFiaWxpdGllcyBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXNcbiAqIEByZXR1cm5zIHtDb252ZXJ0ZXJPdXRwdXR9IEFuIG9iamVjdCBjb250YWluaW5nIG9iamVjdCBsaWtlIGFubm90YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgb0NhcGFiaWxpdGllcz86IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKTogQ29udmVydGVyT3V0cHV0IHtcblx0Y29uc3Qgc01ldGFNb2RlbElkID0gKG9NZXRhTW9kZWwgYXMgYW55KS5pZDtcblx0aWYgKCFtTWV0YU1vZGVsTWFwLmhhc093blByb3BlcnR5KHNNZXRhTW9kZWxJZCkpIHtcblx0XHRjb25zdCBwYXJzZWRPdXRwdXQgPSBNZXRhTW9kZWxDb252ZXJ0ZXIucGFyc2VFbnRpdHlUeXBlcyhvTWV0YU1vZGVsLCBvQ2FwYWJpbGl0aWVzKTtcblx0XHRtTWV0YU1vZGVsTWFwW3NNZXRhTW9kZWxJZF0gPSBBbm5vdGF0aW9uQ29udmVydGVyLmNvbnZlcnRUeXBlcyhwYXJzZWRPdXRwdXQpO1xuXHR9XG5cdHJldHVybiAobU1ldGFNb2RlbE1hcFtzTWV0YU1vZGVsSWRdIGFzIGFueSkgYXMgQ29udmVydGVyT3V0cHV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlTW9kZWxDYWNoZURhdGEob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpIHtcblx0ZGVsZXRlIG1NZXRhTW9kZWxNYXBbKG9NZXRhTW9kZWwgYXMgYW55KS5pZF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvTWV0YU1vZGVsQ29udGV4dDogQ29udGV4dCwgYkluY2x1ZGVWaXNpdGVkT2JqZWN0czogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcblx0Y29uc3Qgb0NvbnZlcnRlck91dHB1dCA9IGNvbnZlcnRUeXBlcygob01ldGFNb2RlbENvbnRleHQuZ2V0TW9kZWwoKSBhcyB1bmtub3duKSBhcyBPRGF0YU1ldGFNb2RlbCk7XG5cdGNvbnN0IHNQYXRoID0gb01ldGFNb2RlbENvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdGNvbnN0IGFQYXRoU3BsaXQgPSBzUGF0aC5zcGxpdChcIi9cIik7XG5cdGxldCB0YXJnZXRFbnRpdHlTZXQ6IF9FbnRpdHlTZXQgPSBvQ29udmVydGVyT3V0cHV0LmVudGl0eVNldHMuZmluZChlbnRpdHlTZXQgPT4gZW50aXR5U2V0Lm5hbWUgPT09IGFQYXRoU3BsaXRbMV0pIGFzIF9FbnRpdHlTZXQ7XG5cdGxldCByZWxhdGl2ZVBhdGggPSBhUGF0aFNwbGl0LnNsaWNlKDIpLmpvaW4oXCIvXCIpO1xuXG5cdGNvbnN0IGxvY2FsT2JqZWN0czogYW55W10gPSBbdGFyZ2V0RW50aXR5U2V0XTtcblx0d2hpbGUgKHJlbGF0aXZlUGF0aCAmJiByZWxhdGl2ZVBhdGgubGVuZ3RoID4gMCAmJiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChcIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nXCIpKSB7XG5cdFx0bGV0IHJlbGF0aXZlU3BsaXQgPSByZWxhdGl2ZVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBpZHggPSAwO1xuXHRcdGxldCBjdXJyZW50RW50aXR5U2V0LCBzTmF2UHJvcFRvQ2hlY2s7XG5cblx0XHRyZWxhdGl2ZVNwbGl0ID0gcmVsYXRpdmVTcGxpdC5zbGljZSgxKTsgLy8gUmVtb3ZpbmcgXCIkTmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1wiXG5cdFx0d2hpbGUgKCFjdXJyZW50RW50aXR5U2V0ICYmIHJlbGF0aXZlU3BsaXQubGVuZ3RoID4gaWR4ICYmIHJlbGF0aXZlU3BsaXRbaWR4XSAhPT0gXCIkTmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1wiKSB7XG5cdFx0XHQvLyBGaW5kaW5nIHRoZSBjb3JyZWN0IGVudGl0eVNldCBmb3IgdGhlIG5hdmlnYWl0b24gcHJvcGVydHkgYmluZGluZyBleGFtcGxlOiBcIlNldC9fU2FsZXNPcmRlclwiXG5cdFx0XHRzTmF2UHJvcFRvQ2hlY2sgPSByZWxhdGl2ZVNwbGl0LnNsaWNlKDAsIGlkeCArIDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0Y3VycmVudEVudGl0eVNldCA9IHRhcmdldEVudGl0eVNldCAmJiB0YXJnZXRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tzTmF2UHJvcFRvQ2hlY2tdO1xuXHRcdFx0aWR4Kys7XG5cdFx0fVxuXHRcdGlmICghY3VycmVudEVudGl0eVNldCkge1xuXHRcdFx0Ly8gRmFsbCBiYWNrIHRvIFNpbmdsZSBuYXYgcHJvcCBpZiBlbnRpdHlTZXQgaXMgbm90IGZvdW5kLlxuXHRcdFx0c05hdlByb3BUb0NoZWNrID0gcmVsYXRpdmVTcGxpdFswXTtcblx0XHR9XG5cdFx0Y29uc3QgYU5hdlByb3BzID0gc05hdlByb3BUb0NoZWNrPy5zcGxpdChcIi9cIikgfHwgW107XG5cdFx0bGV0IHRhcmdldEVudGl0eVR5cGUgPSB0YXJnZXRFbnRpdHlTZXQgJiYgdGFyZ2V0RW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdFx0Zm9yIChjb25zdCBzTmF2UHJvcCBvZiBhTmF2UHJvcHMpIHtcblx0XHRcdC8vIFB1c2hpbmcgYWxsIG5hdiBwcm9wcyB0byB0aGUgdmlzaXRlZCBvYmplY3RzLiBleGFtcGxlOiBcIlNldFwiLCBcIl9TYWxlc09yZGVyXCIgZm9yIFwiU2V0L19TYWxlc09yZGVyXCIoaW4gTmF2aWdhdGlvblByb3BlcnR5QmluZGluZylcblx0XHRcdGNvbnN0IHRhcmdldE5hdlByb3AgPSB0YXJnZXRFbnRpdHlUeXBlICYmIHRhcmdldEVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZChuYXZQcm9wID0+IG5hdlByb3AubmFtZSA9PT0gc05hdlByb3ApO1xuXHRcdFx0aWYgKHRhcmdldE5hdlByb3ApIHtcblx0XHRcdFx0bG9jYWxPYmplY3RzLnB1c2godGFyZ2V0TmF2UHJvcCk7XG5cdFx0XHRcdHRhcmdldEVudGl0eVR5cGUgPSB0YXJnZXROYXZQcm9wLnRhcmdldFR5cGU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0dGFyZ2V0RW50aXR5U2V0ID1cblx0XHRcdCh0YXJnZXRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldCkgfHwgKHRhcmdldEVudGl0eVNldCAmJiB0YXJnZXRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tyZWxhdGl2ZVNwbGl0WzBdXSk7XG5cdFx0aWYgKHRhcmdldEVudGl0eVNldCkge1xuXHRcdFx0Ly8gUHVzaGluZyB0aGUgdGFyZ2V0IGVudGl0eVNldCB0byB2aXNpdGVkIG9iamVjdHNcblx0XHRcdGxvY2FsT2JqZWN0cy5wdXNoKHRhcmdldEVudGl0eVNldCk7XG5cdFx0fVxuXHRcdC8vIFJlLWNhbGN1bGF0aW5nIHRoZSByZWxhdGl2ZSBwYXRoXG5cdFx0cmVsYXRpdmVQYXRoID0gcmVsYXRpdmVTcGxpdC5zbGljZShhTmF2UHJvcHMubGVuZ3RoIHx8IDEpLmpvaW4oXCIvXCIpO1xuXHR9XG5cdGlmIChyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChcIiRUeXBlXCIpKSB7XG5cdFx0Ly8gV2UncmUgYW55d2F5IGdvaW5nIHRvIGxvb2sgb24gdGhlIGVudGl0eVR5cGUuLi5cblx0XHRyZWxhdGl2ZVBhdGggPSBhUGF0aFNwbGl0LnNsaWNlKDMpLmpvaW4oXCIvXCIpO1xuXHR9XG5cdGlmICh0YXJnZXRFbnRpdHlTZXQgJiYgcmVsYXRpdmVQYXRoLmxlbmd0aCkge1xuXHRcdGNvbnN0IG9UYXJnZXQgPSB0YXJnZXRFbnRpdHlTZXQuZW50aXR5VHlwZS5yZXNvbHZlUGF0aChyZWxhdGl2ZVBhdGgsIGJJbmNsdWRlVmlzaXRlZE9iamVjdHMpO1xuXHRcdGlmIChvVGFyZ2V0KSB7XG5cdFx0XHRpZiAoYkluY2x1ZGVWaXNpdGVkT2JqZWN0cykge1xuXHRcdFx0XHRvVGFyZ2V0LnZpc2l0ZWRPYmplY3RzID0gbG9jYWxPYmplY3RzLmNvbmNhdChvVGFyZ2V0LnZpc2l0ZWRPYmplY3RzKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlICYmIHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlLmFjdGlvbnMpIHtcblx0XHRcdC8vIGlmIHRhcmdldCBpcyBhbiBhY3Rpb24gb3IgYW4gYWN0aW9uIHBhcmFtZXRlclxuXHRcdFx0Y29uc3QgYWN0aW9ucyA9IHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlICYmIHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlLmFjdGlvbnM7XG5cdFx0XHRjb25zdCByZWxhdGl2ZVNwbGl0ID0gcmVsYXRpdmVQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGlmIChhY3Rpb25zW3JlbGF0aXZlU3BsaXRbMF1dKSB7XG5cdFx0XHRcdGNvbnN0IGFjdGlvbiA9IGFjdGlvbnNbcmVsYXRpdmVTcGxpdFswXV07XG5cdFx0XHRcdGlmIChyZWxhdGl2ZVNwbGl0WzFdICYmIGFjdGlvbi5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyYW1ldGVyTmFtZSA9IHJlbGF0aXZlU3BsaXRbMV07XG5cdFx0XHRcdFx0Y29uc3QgdGFyZ2V0UGFyYW1ldGVyID0gYWN0aW9uLnBhcmFtZXRlcnMuZmluZChwYXJhbWV0ZXIgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlci5mdWxseVF1YWxpZmllZE5hbWUuZW5kc1dpdGgoXCIvXCIgKyBwYXJhbWV0ZXJOYW1lKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0UGFyYW1ldGVyO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJlbGF0aXZlUGF0aC5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRyZXR1cm4gYWN0aW9uO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvVGFyZ2V0O1xuXHR9IGVsc2Uge1xuXHRcdGlmIChiSW5jbHVkZVZpc2l0ZWRPYmplY3RzKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXQ6IHRhcmdldEVudGl0eVNldCxcblx0XHRcdFx0dmlzaXRlZE9iamVjdHM6IGxvY2FsT2JqZWN0c1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhcmdldEVudGl0eVNldDtcblx0fVxufVxuXG50eXBlIENvbnZlcnRlck9iamVjdCA9IHtcblx0X3R5cGU6IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFJlc29sdmVkVGFyZ2V0ID0ge1xuXHR0YXJnZXQ/OiBDb252ZXJ0ZXJPYmplY3Q7XG5cdHZpc2l0ZWRPYmplY3RzOiBDb252ZXJ0ZXJPYmplY3RbXTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbENvbnRleHQ6IENvbnRleHQsIG9FbnRpdHlTZXRNZXRhTW9kZWxDb250ZXh0PzogQ29udGV4dCk6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRjb25zdCBtZXRhTW9kZWxDb250ZXh0ID0gY29udmVydE1ldGFNb2RlbENvbnRleHQob01ldGFNb2RlbENvbnRleHQsIHRydWUpO1xuXHRsZXQgdGFyZ2V0RW50aXR5U2V0TG9jYXRpb247XG5cdGlmIChvRW50aXR5U2V0TWV0YU1vZGVsQ29udGV4dCAmJiBvRW50aXR5U2V0TWV0YU1vZGVsQ29udGV4dC5nZXRQYXRoKCkgIT09IFwiL1wiKSB7XG5cdFx0dGFyZ2V0RW50aXR5U2V0TG9jYXRpb24gPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0VudGl0eVNldE1ldGFNb2RlbENvbnRleHQpO1xuXHR9XG5cdHJldHVybiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdEZyb21QYXRoKG1ldGFNb2RlbENvbnRleHQsIHRhcmdldEVudGl0eVNldExvY2F0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0RnJvbVBhdGgoXG5cdG1ldGFNb2RlbENvbnRleHQ6IFJlc29sdmVkVGFyZ2V0LFxuXHR0YXJnZXRFbnRpdHlTZXRMb2NhdGlvbj86IERhdGFNb2RlbE9iamVjdFBhdGhcbik6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RzID0gbWV0YU1vZGVsQ29udGV4dC52aXNpdGVkT2JqZWN0cy5maWx0ZXIoXG5cdFx0KHZpc2l0ZWRPYmplY3Q6IGFueSkgPT4gdmlzaXRlZE9iamVjdCAmJiB2aXNpdGVkT2JqZWN0Lmhhc093blByb3BlcnR5KFwiX3R5cGVcIikgJiYgdmlzaXRlZE9iamVjdC5fdHlwZSAhPT0gXCJFbnRpdHlUeXBlXCJcblx0KTtcblx0aWYgKG1ldGFNb2RlbENvbnRleHQudGFyZ2V0ICYmIG1ldGFNb2RlbENvbnRleHQudGFyZ2V0Lmhhc093blByb3BlcnR5KFwiX3R5cGVcIikgJiYgbWV0YU1vZGVsQ29udGV4dC50YXJnZXQuX3R5cGUgIT09IFwiRW50aXR5VHlwZVwiKSB7XG5cdFx0ZGF0YU1vZGVsT2JqZWN0cy5wdXNoKG1ldGFNb2RlbENvbnRleHQudGFyZ2V0KTtcblx0fVxuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllczogX05hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW107XG5cdGNvbnN0IHJvb3RFbnRpdHlTZXQ6IF9FbnRpdHlTZXQgPSBkYXRhTW9kZWxPYmplY3RzWzBdIGFzIF9FbnRpdHlTZXQ7XG5cdC8vIGN1cnJlbnRFbnRpdHlTZXQgY2FuIGJlIHVuZGVmaW5lZC5cblx0bGV0IGN1cnJlbnRFbnRpdHlTZXQ6IF9FbnRpdHlTZXQgfCB1bmRlZmluZWQgPSByb290RW50aXR5U2V0IGFzIF9FbnRpdHlTZXQ7XG5cdGxldCBjdXJyZW50RW50aXR5VHlwZTogX0VudGl0eVR5cGUgPSByb290RW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdGxldCBpID0gMTtcblx0bGV0IGN1cnJlbnRPYmplY3Q7XG5cdGxldCBuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHR3aGlsZSAoaSA8IGRhdGFNb2RlbE9iamVjdHMubGVuZ3RoKSB7XG5cdFx0Y3VycmVudE9iamVjdCA9IGRhdGFNb2RlbE9iamVjdHNbaSsrXTtcblx0XHRpZiAoY3VycmVudE9iamVjdC5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0bmF2aWdhdGVkUGF0aHMucHVzaChjdXJyZW50T2JqZWN0Lm5hbWUpO1xuXHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMucHVzaChjdXJyZW50T2JqZWN0IGFzIF9OYXZpZ2F0aW9uUHJvcGVydHkpO1xuXHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSAoY3VycmVudE9iamVjdCBhcyBfTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlO1xuXHRcdFx0aWYgKGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLmhhc093blByb3BlcnR5KG5hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpKSkge1xuXHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW2N1cnJlbnRPYmplY3QubmFtZV07XG5cdFx0XHRcdG5hdmlnYXRlZFBhdGhzID0gW107XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoY3VycmVudE9iamVjdC5fdHlwZSA9PT0gXCJFbnRpdHlTZXRcIikge1xuXHRcdFx0Y3VycmVudEVudGl0eVNldCA9IGN1cnJlbnRPYmplY3QgYXMgX0VudGl0eVNldDtcblx0XHRcdGN1cnJlbnRFbnRpdHlUeXBlID0gY3VycmVudEVudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRcdH1cblx0fVxuXG5cdGlmICh0YXJnZXRFbnRpdHlTZXRMb2NhdGlvbiAmJiB0YXJnZXRFbnRpdHlTZXRMb2NhdGlvbi5zdGFydGluZ0VudGl0eVNldCAhPT0gcm9vdEVudGl0eVNldCkge1xuXHRcdC8vIEluIGNhc2UgdGhlIGVudGl0eXNldCBpcyBub3Qgc3RhcnRpbmcgZnJvbSB0aGUgc2FtZSBsb2NhdGlvbiBpdCBtYXkgbWVhbiB0aGF0IHdlIGFyZSBkb2luZyB0b28gbXVjaCB3b3JrIGVhcmxpZXIgZm9yIHNvbWUgcmVhc29uXG5cdFx0Ly8gQXMgc3VjaCB3ZSBuZWVkIHRvIHJlZGVmaW5lIHRoZSBjb250ZXh0IHNvdXJjZSBmb3IgdGhlIHRhcmdldEVudGl0eVNldExvY2F0aW9uXG5cdFx0Y29uc3Qgc3RhcnRpbmdJbmRleCA9IGRhdGFNb2RlbE9iamVjdHMuaW5kZXhPZih0YXJnZXRFbnRpdHlTZXRMb2NhdGlvbi5zdGFydGluZ0VudGl0eVNldCk7XG5cdFx0aWYgKHN0YXJ0aW5nSW5kZXggIT09IC0xKSB7XG5cdFx0XHQvLyBJZiBpdCdzIG5vdCBmb3VuZCBJIGRvbid0IGtub3cgd2hhdCB3ZSBjYW4gZG8gKHByb2JhYmx5IG5vdGhpbmcpXG5cdFx0XHRjb25zdCByZXF1aXJlZERhdGFNb2RlbE9iamVjdHMgPSBkYXRhTW9kZWxPYmplY3RzLnNsaWNlKDAsIHN0YXJ0aW5nSW5kZXgpO1xuXHRcdFx0dGFyZ2V0RW50aXR5U2V0TG9jYXRpb24uc3RhcnRpbmdFbnRpdHlTZXQgPSByb290RW50aXR5U2V0O1xuXHRcdFx0dGFyZ2V0RW50aXR5U2V0TG9jYXRpb24ubmF2aWdhdGlvblByb3BlcnRpZXMgPSByZXF1aXJlZERhdGFNb2RlbE9iamVjdHNcblx0XHRcdFx0LmZpbHRlcigob2JqZWN0OiBhbnkpID0+IG9iamVjdC5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIilcblx0XHRcdFx0LmNvbmNhdCh0YXJnZXRFbnRpdHlTZXRMb2NhdGlvbi5uYXZpZ2F0aW9uUHJvcGVydGllcykgYXMgX05hdmlnYXRpb25Qcm9wZXJ0eVtdO1xuXHRcdH1cblx0fVxuXHRjb25zdCBvdXREYXRhTW9kZWxQYXRoID0ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiByb290RW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVNldDogY3VycmVudEVudGl0eVNldCxcblx0XHR0YXJnZXRFbnRpdHlUeXBlOiBjdXJyZW50RW50aXR5VHlwZSxcblx0XHR0YXJnZXRPYmplY3Q6IG1ldGFNb2RlbENvbnRleHQudGFyZ2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuXHRcdGNvbnRleHRMb2NhdGlvbjogdGFyZ2V0RW50aXR5U2V0TG9jYXRpb25cblx0fTtcblx0aWYgKCFvdXREYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbikge1xuXHRcdG91dERhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uID0gb3V0RGF0YU1vZGVsUGF0aDtcblx0fVxuXHRyZXR1cm4gb3V0RGF0YU1vZGVsUGF0aDtcbn1cbiJdfQ==
|
|
1348
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1ldGFNb2RlbENvbnZlcnRlci50cyJdLCJuYW1lcyI6WyJWT0NBQlVMQVJZX0FMSUFTIiwiRGVmYXVsdEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiQ2hhcnQiLCJNaWNyb0NoYXJ0IiwiVVNoZWxsIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiU2l0dWF0aW9ucyIsInBhcnNlUHJvcGVydHlWYWx1ZSIsImFubm90YXRpb25PYmplY3QiLCJwcm9wZXJ0eUtleSIsImN1cnJlbnRUYXJnZXQiLCJhbm5vdGF0aW9uc0xpc3RzIiwib0NhcGFiaWxpdGllcyIsInZhbHVlIiwiY3VycmVudFByb3BlcnR5VGFyZ2V0IiwidHlwZU9mQW5ub3RhdGlvbiIsInR5cGUiLCJOdWxsIiwiU3RyaW5nIiwiQm9vbCIsIkludCIsIkFycmF5IiwiaXNBcnJheSIsIkNvbGxlY3Rpb24iLCJtYXAiLCJzdWJBbm5vdGF0aW9uT2JqZWN0Iiwic3ViQW5ub3RhdGlvbk9iamVjdEluZGV4IiwicGFyc2VBbm5vdGF0aW9uT2JqZWN0IiwibGVuZ3RoIiwiaGFzT3duUHJvcGVydHkiLCIkUGF0aCIsInVuZGVmaW5lZCIsIlBhdGgiLCIkRGVjaW1hbCIsIkRlY2ltYWwiLCJwYXJzZUZsb2F0IiwiJFByb3BlcnR5UGF0aCIsIlByb3BlcnR5UGF0aCIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIiRJZiIsIklmIiwiJEFuZCIsIkFuZCIsIiRPciIsIk9yIiwiJE5vdCIsIk5vdCIsIiRFcSIsIkVxIiwiJE5lIiwiTmUiLCIkR3QiLCJHdCIsIiRHZSIsIkdlIiwiJEx0IiwiTHQiLCIkTGUiLCJMZSIsIiRBcHBseSIsIkFwcGx5IiwiRnVuY3Rpb24iLCIkRnVuY3Rpb24iLCIkQW5ub3RhdGlvblBhdGgiLCJBbm5vdGF0aW9uUGF0aCIsIiRFbnVtTWVtYmVyIiwiRW51bU1lbWJlciIsIm1hcE5hbWVUb0FsaWFzIiwic3BsaXQiLCIkVHlwZSIsIlJlY29yZCIsIm5hbWUiLCJhbm5vdGF0aW9uTmFtZSIsInBhdGhQYXJ0IiwiYW5ub1BhcnQiLCJsYXN0RG90IiwibGFzdEluZGV4T2YiLCJzdWJzdHIiLCJjdXJyZW50T2JqZWN0VGFyZ2V0IiwicGFyc2VkQW5ub3RhdGlvbk9iamVjdCIsInR5cGVPZk9iamVjdCIsInBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uIiwiY29sbGVjdGlvbiIsInN1YkFubm90YXRpb25JbmRleCIsInR5cGVWYWx1ZSIsInByb3BlcnR5VmFsdWVzIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJzdGFydHNXaXRoIiwicHVzaCIsImNyZWF0ZUFubm90YXRpb25MaXN0cyIsImdldE9yQ3JlYXRlQW5ub3RhdGlvbkxpc3QiLCJ0YXJnZXQiLCJhbm5vdGF0aW9ucyIsInJlbW92ZUNoYXJ0QW5ub3RhdGlvbnMiLCJmaWx0ZXIiLCJvUmVjb3JkIiwiVGFyZ2V0IiwiaW5kZXhPZiIsInJlbW92ZUlCTkFubm90YXRpb25zIiwiaGFuZGxlUHJlc2VudGF0aW9uVmFyaWFudCIsImFubm90YXRpb25PYmplY3RzIiwiYW5ub3RhdGlvblRhcmdldCIsImFubm90YXRpb25MaXN0cyIsIm91dEFubm90YXRpb25PYmplY3QiLCJhbm5vdGF0aW9uS2V5IiwiRGF0YSIsIlZpc3VhbGl6YXRpb25zIiwiY3VycmVudE91dEFubm90YXRpb25PYmplY3QiLCJhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXQiLCJhbm5vdGF0aW9uUXVhbGlmaWVyU3BsaXQiLCJxdWFsaWZpZXIiLCJ0ZXJtIiwiY3VycmVudEFubm90YXRpb25UYXJnZXQiLCJpc0NvbGxlY3Rpb24iLCJ0eXBlb2ZBbm5vdGF0aW9uIiwicmVjb3JkIiwicHJlcGFyZVByb3BlcnR5IiwicHJvcGVydHlEZWZpbml0aW9uIiwiZW50aXR5VHlwZU9iamVjdCIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5T2JqZWN0IiwiX3R5cGUiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJtYXhMZW5ndGgiLCIkTWF4TGVuZ3RoIiwicHJlY2lzaW9uIiwiJFByZWNpc2lvbiIsInNjYWxlIiwiJFNjYWxlIiwibnVsbGFibGUiLCIkTnVsbGFibGUiLCJwcmVwYXJlTmF2aWdhdGlvblByb3BlcnR5IiwibmF2UHJvcGVydHlEZWZpbml0aW9uIiwibmF2UHJvcGVydHlOYW1lIiwicmVmZXJlbnRpYWxDb25zdHJhaW50IiwiJFJlZmVyZW50aWFsQ29uc3RyYWludCIsInNvdXJjZVByb3BlcnR5TmFtZSIsInNvdXJjZVR5cGVOYW1lIiwic291cmNlUHJvcGVydHkiLCJ0YXJnZXRUeXBlTmFtZSIsInRhcmdldFByb3BlcnR5IiwibmF2aWdhdGlvblByb3BlcnR5IiwicGFydG5lciIsIiRQYXJ0bmVyIiwiJGlzQ29sbGVjdGlvbiIsImNvbnRhaW5zVGFyZ2V0IiwiJENvbnRhaW5zVGFyZ2V0IiwicHJlcGFyZUVudGl0eVNldCIsImVudGl0eVNldERlZmluaXRpb24iLCJlbnRpdHlTZXROYW1lIiwiZW50aXR5Q29udGFpbmVyTmFtZSIsImVudGl0eVNldE9iamVjdCIsIm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJlbnRpdHlUeXBlTmFtZSIsInByZXBhcmVTaW5nbGV0b24iLCJzaW5nbGV0b25EZWZpbml0aW9uIiwic2luZ2xldG9uTmFtZSIsInNpbmdsZXRvbk9iamVjdCIsInR5cGVOYW1lIiwicHJlcGFyZVR5cGVEZWZpbml0aW9uIiwidHlwZURlZmluaXRpb24iLCJuYW1lc3BhY2UiLCJ0eXBlT2JqZWN0IiwicmVwbGFjZSIsInVuZGVybHlpbmdUeXBlIiwiJFVuZGVybHlpbmdUeXBlIiwicHJlcGFyZUNvbXBsZXhUeXBlIiwiY29tcGxleFR5cGVEZWZpbml0aW9uIiwiY29tcGxleFR5cGVOYW1lIiwiY29tcGxleFR5cGVPYmplY3QiLCJwcm9wZXJ0aWVzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJjb21wbGV4VHlwZVByb3BlcnRpZXMiLCJwcm9wZXJ0eU5hbWVPck5vdCIsIiRraW5kIiwic29ydCIsImEiLCJiIiwiY29tcGxleFR5cGVOYXZpZ2F0aW9uUHJvcGVydGllcyIsInByZXBhcmVFbnRpdHlLZXlzIiwiZW50aXR5VHlwZURlZmluaXRpb24iLCJvTWV0YU1vZGVsRGF0YSIsIiRLZXkiLCIkQmFzZVR5cGUiLCJwcmVwYXJlRW50aXR5VHlwZSIsIm1ldGFNb2RlbERhdGEiLCJlbnRpdHlLZXlzIiwiZW50aXR5UHJvcGVydGllcyIsImVudGl0eUtleSIsImZpbmQiLCJwcm9wZXJ0eSIsInByZXBhcmVBY3Rpb24iLCJhY3Rpb25OYW1lIiwiYWN0aW9uUmF3RGF0YSIsImFjdGlvbkVudGl0eVR5cGUiLCJhY3Rpb25GUU4iLCJhY3Rpb25TaG9ydE5hbWUiLCIkSXNCb3VuZCIsImJpbmRpbmdQYXJhbWV0ZXIiLCIkUGFyYW1ldGVyIiwicGFyYW1ldGVycyIsImlzQm91bmQiLCJpc0Z1bmN0aW9uIiwic291cmNlVHlwZSIsInJldHVyblR5cGUiLCIkUmV0dXJuVHlwZSIsInBhcmFtIiwiaXNFbnRpdHlTZXQiLCIkRW50aXR5U2V0UGF0aCIsIiROYW1lIiwicHJlcGFyZUVudGl0eVR5cGVzIiwib01ldGFNb2RlbCIsImdldE9iamVjdCIsImVudGl0eVR5cGVzIiwiZW50aXR5U2V0cyIsInNpbmdsZXRvbnMiLCJjb21wbGV4VHlwZXMiLCJ0eXBlRGVmaW5pdGlvbnMiLCIkRW50aXR5Q29udGFpbmVyIiwic2NoZW1hS2V5cyIsIm1ldGFtb2RlbEtleSIsInNPYmplY3ROYW1lIiwiZW50aXR5VHlwZSIsIiRBbm5vdGF0aW9ucyIsImZpbHRlckZhY2V0QW5ub3RhdGlvbiIsIklEIiwiZ2VuZXJhdGUiLCJGYWNldCIsImVudGl0eVByb3BlcnR5IiwiVmFsdWUiLCJjb21wbGV4VHlwZSIsIm9FbnRpdHlDb250YWluZXIiLCJlbnRpdHlTZXQiLCJzaW5nbGV0b24iLCJlbnRpdHlDb250YWluZXIiLCJuYXZQcm9wZXJ0eUJpbmRpbmdzIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJuYXZQcm9wTmFtZSIsInRhcmdldEVudGl0eVNldCIsImFjdGlvbnMiLCJrZXkiLCJyZWR1Y2UiLCJvdXRBY3Rpb25zIiwiYWN0aW9uIiwib3V0QW5ub3RhdGlvbkxpc3RzIiwic0Fubm90YXRpb25OYW1lIiwicmVmZXJlbmNlcyIsImlkZW50aWZpY2F0aW9uIiwidmVyc2lvbiIsInNjaGVtYSIsImFzc29jaWF0aW9ucyIsImFzc29jaWF0aW9uU2V0cyIsIm1NZXRhTW9kZWxNYXAiLCJjb252ZXJ0VHlwZXMiLCJzTWV0YU1vZGVsSWQiLCJpZCIsInBhcnNlZE91dHB1dCIsImFkZFN5bnRoZXRpY0Fubm90YXRpb25zIiwiQW5ub3RhdGlvbkNvbnZlcnRlciIsIm1ldGFNb2RlbCIsInNpdHVhdGlvbnNOYXZQcm9wIiwibmF2UHJvcCIsIkZFIiwicGF0aCIsIiR0YXJnZXQiLCJkZWxldGVNb2RlbENhY2hlRGF0YSIsImNvbnZlcnRNZXRhTW9kZWxDb250ZXh0Iiwib01ldGFNb2RlbENvbnRleHQiLCJiSW5jbHVkZVZpc2l0ZWRPYmplY3RzIiwib0NvbnZlcnRlck91dHB1dCIsImdldE1vZGVsIiwic1BhdGgiLCJnZXRQYXRoIiwiYVBhdGhTcGxpdCIsInJlbGF0aXZlUGF0aCIsInNsaWNlIiwiam9pbiIsImxvY2FsT2JqZWN0cyIsInJlbGF0aXZlU3BsaXQiLCJpZHgiLCJjdXJyZW50RW50aXR5U2V0Iiwic05hdlByb3BUb0NoZWNrIiwiYU5hdlByb3BzIiwidGFyZ2V0RW50aXR5VHlwZSIsInNOYXZQcm9wIiwidGFyZ2V0TmF2UHJvcCIsInRhcmdldFR5cGUiLCJzaGlmdCIsIm9UYXJnZXQiLCJyZXNvbHZlUGF0aCIsInZpc2l0ZWRPYmplY3RzIiwiY29uY2F0IiwicGFyYW1ldGVyTmFtZSIsInRhcmdldFBhcmFtZXRlciIsInBhcmFtZXRlciIsImVuZHNXaXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwib0VudGl0eVNldE1ldGFNb2RlbENvbnRleHQiLCJtZXRhTW9kZWxDb250ZXh0IiwidGFyZ2V0RW50aXR5U2V0TG9jYXRpb24iLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdEZyb21QYXRoIiwiZGF0YU1vZGVsT2JqZWN0cyIsInZpc2l0ZWRPYmplY3QiLCJyb290RW50aXR5U2V0IiwiY3VycmVudEVudGl0eVR5cGUiLCJpIiwiY3VycmVudE9iamVjdCIsIm5hdmlnYXRlZFBhdGhzIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJzdGFydGluZ0luZGV4IiwicmVxdWlyZWREYXRhTW9kZWxPYmplY3RzIiwib2JqZWN0Iiwib3V0RGF0YU1vZGVsUGF0aCIsInRhcmdldE9iamVjdCIsImNvbnRleHRMb2NhdGlvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQkEsTUFBTUEsZ0JBQXFCLEdBQUc7QUFDN0IsaUNBQTZCLGNBREE7QUFFN0IseUJBQXFCLE1BRlE7QUFHN0IsNkJBQXlCLFVBSEk7QUFJN0Isc0NBQWtDLFFBSkw7QUFLN0Isa0NBQThCLElBTEQ7QUFNN0IsdUNBQW1DLFNBTk47QUFPN0IseUNBQXFDLFdBUFI7QUFRN0IsNENBQXdDLGNBUlg7QUFTN0IsNkNBQXlDO0FBVFosR0FBOUI7QUFvQk8sTUFBTUMsOEJBQThCLEdBQUc7QUFDN0NDLElBQUFBLEtBQUssRUFBRSxJQURzQztBQUU3Q0MsSUFBQUEsVUFBVSxFQUFFLElBRmlDO0FBRzdDQyxJQUFBQSxNQUFNLEVBQUUsSUFIcUM7QUFJN0NDLElBQUFBLHFCQUFxQixFQUFFLElBSnNCO0FBSzdDQyxJQUFBQSxVQUFVLEVBQUU7QUFMaUMsR0FBdkM7OztBQTBCUCxXQUFTQyxrQkFBVCxDQUNDQyxnQkFERCxFQUVDQyxXQUZELEVBR0NDLGFBSEQsRUFJQ0MsZ0JBSkQsRUFLQ0MsYUFMRCxFQU1PO0FBQ04sUUFBSUMsS0FBSjtBQUNBLFFBQU1DLHFCQUE2QixHQUFHSixhQUFhLEdBQUcsR0FBaEIsR0FBc0JELFdBQTVEO0FBQ0EsUUFBTU0sZ0JBQWdCLEdBQUcsT0FBT1AsZ0JBQWhDOztBQUNBLFFBQUlBLGdCQUFn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QTtBQUNBLFVBQU1NLGFBQWEsR0FBR1IsZ0JBQWdCLENBQUM1TSxPQUFqQixDQUF5QjBNLHVCQUF1QixDQUFDUyxpQkFBakQsQ0FBdEI7O0FBQ0EsVUFBSUMsYUFBYSxLQUFLLENBQUMsQ0FBdkIsRUFBMEI7QUFDekI7QUFDQSxZQUFNQyx3QkFBd0IsR0FBR1QsZ0JBQWdCLENBQUMxQixLQUFqQixDQUF1QixDQUF2QixFQUEwQmtDLGFBQTFCLENBQWpDO0FBQ0FWLFFBQUFBLHVCQUF1QixDQUFDUyxpQkFBeEIsR0FBNENMLGFBQTVDO0FBQ0FKLFFBQUFBLHVCQUF1QixDQUFDaEksb0JBQXhCLEdBQStDMkksd0JBQXdCLENBQ3JFeE4sTUFENkMsQ0FDdEMsVUFBQ3lOLE1BQUQ7QUFBQSxpQkFBaUJBLE1BQU0sQ0FBQzlMLEtBQVAsS0FBaUIsb0JBQWxDO0FBQUEsU0FEc0MsRUFFN0MwSyxNQUY2QyxDQUV0Q1EsdUJBQXVCLENBQUNoSSxvQkFGYyxDQUEvQztBQUdBO0FBQ0Q7O0FBQ0QsUUFBTTZJLGdCQUFnQixHQUFHO0FBQ3hCSixNQUFBQSxpQkFBaUIsRUFBRUwsYUFESztBQUV4QmpFLE1BQUFBLGVBQWUsRUFBRTBDLGdCQUZPO0FBR3hCRyxNQUFBQSxnQkFBZ0IsRUFBRXFCLGlCQUhNO0FBSXhCUyxNQUFBQSxZQUFZLEVBQUVmLGdCQUFnQixDQUFDL00sTUFKUDtBQUt4QmdGLE1BQUFBLG9CQUFvQixFQUFwQkEsb0JBTHdCO0FBTXhCK0ksTUFBQUEsZUFBZSxFQUFFZjtBQU5PLEtBQXpCOztBQVFBLFFBQUksQ0FBQ2EsZ0JBQWdCLENBQUNFLGVBQXRCLEVBQXVDO0FBQ3RDRixNQUFBQSxnQkFBZ0IsQ0FBQ0UsZUFBakIsR0FBbUNGLGdCQUFuQztBQUNBOztBQUNELFdBQU9BLGdCQUFQO0FBQ0EiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb24sIEFubm90YXRpb25MaXN0LCBBbm5vdGF0aW9uUmVjb3JkLCBFeHByZXNzaW9uLCBQYXJzZXJPdXRwdXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbi8vIFRoaXMgZmlsZSBpcyByZXRyaWV2ZWQgZnJvbSBAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyLCBzaGFyZWQgY29kZSB3aXRoIHRvb2wgc3VpdGVcbmltcG9ydCB7IEFubm90YXRpb25Db252ZXJ0ZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb21tb25cIjtcbmltcG9ydCB7IE9EYXRhTWV0YU1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NFwiO1xuaW1wb3J0IHtcblx0Q29udmVydGVyT3V0cHV0LFxuXHRFbnRpdHlTZXQgYXMgX0VudGl0eVNldCxcblx0RW50aXR5VHlwZSBhcyBfRW50aXR5VHlwZSxcblx0U2luZ2xldG9uIGFzIF9TaW5nbGV0b24sXG5cdE5hdmlnYXRpb25Qcm9wZXJ0eSBhcyBfTmF2aWdhdGlvblByb3BlcnR5XG59IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQge1xuXHRFbnRpdHlUeXBlLFxuXHRFbnRpdHlTZXQsXG5cdFByb3BlcnR5LFxuXHRDb21wbGV4VHlwZSxcblx0UmVmZXJlbnRpYWxDb25zdHJhaW50LFxuXHRWNE5hdmlnYXRpb25Qcm9wZXJ0eSxcblx0QWN0aW9uLFxuXHRSZWZlcmVuY2UsXG5cdEVudGl0eUNvbnRhaW5lcixcblx0U2luZ2xldG9uLFxuXHRUeXBlRGVmaW5pdGlvblxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9QYXJzZXJcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsXCI7XG5pbXBvcnQgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwiLi4vaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuXG5jb25zdCBWT0NBQlVMQVJZX0FMSUFTOiBhbnkgPSB7XG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMVwiOiBcIkNhcGFiaWxpdGllc1wiLFxuXHRcIk9yZy5PRGF0YS5Db3JlLlYxXCI6IFwiQ29yZVwiLFxuXHRcIk9yZy5PRGF0YS5NZWFzdXJlcy5WMVwiOiBcIk1lYXN1cmVzXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxXCI6IFwiQ29tbW9uXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjFcIjogXCJVSVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjFcIjogXCJTZXNzaW9uXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxXCI6IFwiQW5hbHl0aWNzXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxXCI6IFwiUGVyc29uYWxEYXRhXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MVwiOiBcIkNvbW11bmljYXRpb25cIlxufTtcblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgPSB7XG5cdENoYXJ0OiBib29sZWFuO1xuXHRNaWNyb0NoYXJ0OiBib29sZWFuO1xuXHRVU2hlbGw6IGJvb2xlYW47XG5cdEludGVudEJhc2VkTmF2aWdhdGlvbjogYm9vbGVhbjtcblx0U2l0dWF0aW9uczogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgPSB7XG5cdENoYXJ0OiB0cnVlLFxuXHRNaWNyb0NoYXJ0OiB0cnVlLFxuXHRVU2hlbGw6IHRydWUsXG5cdEludGVudEJhc2VkTmF2aWdhdGlvbjogdHJ1ZSxcblx0U2l0dWF0aW9uczogZmFsc2Vcbn07XG5cbnR5cGUgTWV0YU1vZGVsQWN0aW9uID0ge1xuXHQka2luZDogXCJBY3Rpb25cIjtcblx0JElzQm91bmQ6IGJvb2xlYW47XG5cdCRFbnRpdHlTZXRQYXRoOiBzdHJpbmc7XG5cdCRQYXJhbWV0ZXI6IHtcblx0XHQkVHlwZTogc3RyaW5nO1xuXHRcdCROYW1lOiBzdHJpbmc7XG5cdFx0JE51bGxhYmxlPzogYm9vbGVhbjtcblx0XHQkTWF4TGVuZ3RoPzogbnVtYmVyO1xuXHRcdCRQcmVjaXNpb24/OiBudW1iZXI7XG5cdFx0JFNjYWxlPzogbnVtYmVyO1xuXHRcdCRpc0NvbGxlY3Rpb24/OiBib29sZWFuO1xuXHR9W107XG5cdCRSZXR1cm5UeXBlOiB7XG5cdFx0JFR5cGU6IHN0cmluZztcblx0fTtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlUHJvcGVydHlWYWx1ZShcblx0YW5ub3RhdGlvbk9iamVjdDogYW55LFxuXHRwcm9wZXJ0eUtleTogc3RyaW5nLFxuXHRjdXJyZW50VGFyZ2V0OiBzdHJpbmcsXG5cdGFubm90YXRpb25zTGlzdHM6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25MaXN0Pixcblx0b0NhcGFiaWxpdGllczogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNcbik6IGFueSB7XG5cdGxldCB2YWx1ZTtcblx0Y29uc3QgY3VycmVudFByb3BlcnR5VGFyZ2V0OiBzdHJpbmcgPSBjdXJyZW50VGFyZ2V0ICsgXCIvXCIgKyBwcm9wZXJ0eUtleTtcblx0Y29uc3QgdHlwZU9mQW5ub3RhdGlvbiA9IHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0O1xuXHRpZiAoYW5ub3RhdGlvbk9iamVjdCA9PT0gbnVsbCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIk51bGxcIiwgTnVsbDogbnVsbCB9O1xuXHR9IGVsc2UgaWYgKHR5cGVPZkFubm90YXRpb24gPT09IFwic3RyaW5nXCIpIHtcblx0XHR2YWx1ZSA9IHsgdHlwZTogXCJTdHJpbmdcIiwgU3RyaW5nOiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdH0gZWxzZSBpZiAodHlwZU9mQW5ub3RhdGlvbiA9PT0gXCJib29sZWFuXCIpIHtcblx0XHR2YWx1ZSA9IHsgdHlwZTogXCJCb29sXCIsIEJvb2w6IGFubm90YXRpb25PYmplY3QgfTtcblx0fSBlbHNlIGlmICh0eXBlT2ZBbm5vdGF0aW9uID09PSBcIm51bWJlclwiKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiSW50XCIsIEludDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYW5ub3RhdGlvbk9iamVjdCkpIHtcblx0XHR2YWx1ZSA9IHtcblx0XHRcdHR5cGU6IFwiQ29sbGVjdGlvblwiLFxuXHRcdFx0Q29sbGVjdGlvbjogYW5ub3RhdGlvbk9iamVjdC5tYXAoKHN1YkFubm90YXRpb25PYmplY3QsIHN1YkFubm90YXRpb25PYmplY3RJbmRleCkgPT5cblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uT2JqZWN0KFxuXHRcdFx0XHRcdHN1YkFubm90YXRpb25PYmplY3QsXG5cdFx0XHRcdFx0Y3VycmVudFByb3BlcnR5VGFyZ2V0ICsgXCIvXCIgKyBzdWJBbm5vdGF0aW9uT2JqZWN0SW5kZXgsXG5cdFx0XHRcdFx0YW5ub3RhdGlvbnNMaXN0cyxcblx0XHRcdFx0XHRvQ2FwYWJpbGl0aWVzXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHR9O1xuXHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJFByb3BlcnR5UGF0aFwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlByb3BlcnR5UGF0aFwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJFBhdGhcIikpIHtcblx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJQYXRoXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRBbm5vdGF0aW9uUGF0aFwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkFubm90YXRpb25QYXRoXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlJlY29yZFwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJElmXCIpKSB7XG5cdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiSWZcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRPclwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk9yXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkQW5kXCIpKSB7XG5cdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQW5kXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkRXFcIikpIHtcblx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJFcVwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE5lXCIpKSB7XG5cdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTmVcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiROb3RcIikpIHtcblx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJOb3RcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRHdFwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkd0XCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkR2VcIikpIHtcblx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJHZVwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEx0XCIpKSB7XG5cdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTHRcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRMZVwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkxlXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkQXBwbHlcIikpIHtcblx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJBcHBseVwiO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgYW5ub3RhdGlvbk9iamVjdFswXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHQvLyAkVHlwZSBpcyBvcHRpb25hbC4uLlxuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlJlY29yZFwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJTdHJpbmdcIjtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiUGF0aFwiLCBQYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiRQYXRoIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRGVjaW1hbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiRGVjaW1hbFwiLCBEZWNpbWFsOiBwYXJzZUZsb2F0KGFubm90YXRpb25PYmplY3QuJERlY2ltYWwpIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kUHJvcGVydHlQYXRoICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YWx1ZSA9IHsgdHlwZTogXCJQcm9wZXJ0eVBhdGhcIiwgUHJvcGVydHlQYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiRQcm9wZXJ0eVBhdGggfTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YWx1ZSA9IHtcblx0XHRcdHR5cGU6IFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiLFxuXHRcdFx0TmF2aWdhdGlvblByb3BlcnR5UGF0aDogYW5ub3RhdGlvbk9iamVjdC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kSWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIklmXCIsIElmOiBhbm5vdGF0aW9uT2JqZWN0LiRJZiB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEFuZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiQW5kXCIsIEFuZDogYW5ub3RhdGlvbk9iamVjdC4kQW5kIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kT3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIk9yXCIsIE9yOiBhbm5vdGF0aW9uT2JqZWN0LiRPciB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5vdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiTm90XCIsIE5vdDogYW5ub3RhdGlvbk9iamVjdC4kTm90IH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRXEgIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIkVxXCIsIEVxOiBhbm5vdGF0aW9uT2JqZWN0LiRFcSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5lICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YWx1ZSA9IHsgdHlwZTogXCJOZVwiLCBOZTogYW5ub3RhdGlvbk9iamVjdC4kTmUgfTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRHdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiR3RcIiwgR3Q6IGFubm90YXRpb25PYmplY3QuJEd0IH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kR2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIkdlXCIsIEdlOiBhbm5vdGF0aW9uT2JqZWN0LiRHZSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YWx1ZSA9IHsgdHlwZTogXCJMdFwiLCBMdDogYW5ub3RhdGlvbk9iamVjdC4kTHQgfTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRMZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiTGVcIiwgTGU6IGFubm90YXRpb25PYmplY3QuJExlIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQXBwbHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIkFwcGx5XCIsIEFwcGx5OiBhbm5vdGF0aW9uT2JqZWN0LiRBcHBseSwgRnVuY3Rpb246IGFubm90YXRpb25PYmplY3QuJEZ1bmN0aW9uIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIkFubm90YXRpb25QYXRoXCIsIEFubm90YXRpb25QYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiRBbm5vdGF0aW9uUGF0aCB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEVudW1NZW1iZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0ge1xuXHRcdFx0dHlwZTogXCJFbnVtTWVtYmVyXCIsXG5cdFx0XHRFbnVtTWVtYmVyOiBtYXBOYW1lVG9BbGlhcyhhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyLnNwbGl0KFwiL1wiKVswXSkgKyBcIi9cIiArIGFubm90YXRpb25PYmplY3QuJEVudW1NZW1iZXIuc3BsaXQoXCIvXCIpWzFdXG5cdFx0fTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRUeXBlKSB7XG5cdFx0dmFsdWUgPSB7XG5cdFx0XHR0eXBlOiBcIlJlY29yZFwiLFxuXHRcdFx0UmVjb3JkOiBwYXJzZUFubm90YXRpb25PYmplY3QoYW5ub3RhdGlvbk9iamVjdCwgY3VycmVudFRhcmdldCwgYW5ub3RhdGlvbnNMaXN0cywgb0NhcGFiaWxpdGllcylcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHZhbHVlID0ge1xuXHRcdFx0dHlwZTogXCJSZWNvcmRcIixcblx0XHRcdFJlY29yZDogcGFyc2VBbm5vdGF0aW9uT2JqZWN0KGFubm90YXRpb25PYmplY3QsIGN1cnJlbnRUYXJnZXQsIGFubm90YXRpb25zTGlzdHMsIG9DYXBhYmlsaXRpZXMpXG5cdFx0fTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bmFtZTogcHJvcGVydHlLZXksXG5cdFx0dmFsdWVcblx0fTtcbn1cbmZ1bmN0aW9uIG1hcE5hbWVUb0FsaWFzKGFubm90YXRpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRsZXQgW3BhdGhQYXJ0LCBhbm5vUGFydF0gPSBhbm5vdGF0aW9uTmFtZS5zcGxpdChcIkBcIik7XG5cdGlmICghYW5ub1BhcnQpIHtcblx0XHRhbm5vUGFydCA9IHBhdGhQYXJ0O1xuXHRcdHBhdGhQYXJ0ID0gXCJcIjtcblx0fSBlbHNlIHtcblx0XHRwYXRoUGFydCArPSBcIkBcIjtcblx0fVxuXHRjb25zdCBsYXN0RG90ID0gYW5ub1BhcnQubGFzdEluZGV4T2YoXCIuXCIpO1xuXHRyZXR1cm4gcGF0aFBhcnQgKyBWT0NBQlVMQVJZX0FMSUFTW2Fubm9QYXJ0LnN1YnN0cigwLCBsYXN0RG90KV0gKyBcIi5cIiArIGFubm9QYXJ0LnN1YnN0cihsYXN0RG90ICsgMSk7XG59XG5mdW5jdGlvbiBwYXJzZUFubm90YXRpb25PYmplY3QoXG5cdGFubm90YXRpb25PYmplY3Q6IGFueSxcblx0Y3VycmVudE9iamVjdFRhcmdldDogc3RyaW5nLFxuXHRhbm5vdGF0aW9uc0xpc3RzOiBSZWNvcmQ8c3RyaW5nLCBBbm5vdGF0aW9uTGlzdD4sXG5cdG9DYXBhYmlsaXRpZXM6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzXG4pOiBFeHByZXNzaW9uIHwgQW5ub3RhdGlvblJlY29yZCB8IEFubm90YXRpb24ge1xuXHRsZXQgcGFyc2VkQW5ub3RhdGlvbk9iamVjdDogYW55ID0ge307XG5cdGNvbnN0IHR5cGVPZk9iamVjdCA9IHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0O1xuXHRpZiAoYW5ub3RhdGlvbk9iamVjdCA9PT0gbnVsbCkge1xuXHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiTnVsbFwiLCBOdWxsOiBudWxsIH07XG5cdH0gZWxzZSBpZiAodHlwZU9mT2JqZWN0ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJTdHJpbmdcIiwgU3RyaW5nOiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdH0gZWxzZSBpZiAodHlwZU9mT2JqZWN0ID09PSBcImJvb2xlYW5cIikge1xuXHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiQm9vbFwiLCBCb29sOiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdH0gZWxzZSBpZiAodHlwZU9mT2JqZWN0ID09PSBcIm51bWJlclwiKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJJbnRcIiwgSW50OiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiQW5ub3RhdGlvblBhdGhcIiwgQW5ub3RhdGlvblBhdGg6IGFubm90YXRpb25PYmplY3QuJEFubm90YXRpb25QYXRoIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJQYXRoXCIsIFBhdGg6IGFubm90YXRpb25PYmplY3QuJFBhdGggfTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiREZWNpbWFsICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkRlY2ltYWxcIiwgRGVjaW1hbDogcGFyc2VGbG9hdChhbm5vdGF0aW9uT2JqZWN0LiREZWNpbWFsKSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJFByb3BlcnR5UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJQcm9wZXJ0eVBhdGhcIiwgUHJvcGVydHlQYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiRQcm9wZXJ0eVBhdGggfTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRJZiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJJZlwiLCBJZjogYW5ub3RhdGlvbk9iamVjdC4kSWYgfTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRBbmQgIT09IHVuZGVmaW5lZCkge1xuXHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiQW5kXCIsIEFuZDogYW5ub3RhdGlvbk9iamVjdC4kQW5kIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kT3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiT3JcIiwgT3I6IGFubm90YXRpb25PYmplY3QuJE9yIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kTm90ICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIk5vdFwiLCBOb3Q6IGFubm90YXRpb25PYmplY3QuJE5vdCB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEVxICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkVxXCIsIEVxOiBhbm5vdGF0aW9uT2JqZWN0LiRFcSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5lICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIk5lXCIsIE5lOiBhbm5vdGF0aW9uT2JqZWN0LiROZSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEd0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkd0XCIsIEd0OiBhbm5vdGF0aW9uT2JqZWN0LiRHdCB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEdlICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkdlXCIsIEdlOiBhbm5vdGF0aW9uT2JqZWN0LiRHZSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkx0XCIsIEx0OiBhbm5vdGF0aW9uT2JqZWN0LiRMdCB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJExlICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkxlXCIsIExlOiBhbm5vdGF0aW9uT2JqZWN0LiRMZSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEFwcGx5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkFwcGx5XCIsIEFwcGx5OiBhbm5vdGF0aW9uT2JqZWN0LiRBcHBseSwgRnVuY3Rpb246IGFubm90YXRpb25PYmplY3QuJEZ1bmN0aW9uIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHtcblx0XHRcdHR5cGU6IFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiLFxuXHRcdFx0TmF2aWdhdGlvblByb3BlcnR5UGF0aDogYW5ub3RhdGlvbk9iamVjdC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRW51bU1lbWJlciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHtcblx0XHRcdHR5cGU6IFwiRW51bU1lbWJlclwiLFxuXHRcdFx0RW51bU1lbWJlcjogbWFwTmFtZVRvQWxpYXMoYW5ub3RhdGlvbk9iamVjdC4kRW51bU1lbWJlci5zcGxpdChcIi9cIilbMF0pICsgXCIvXCIgKyBhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyLnNwbGl0KFwiL1wiKVsxXVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhbm5vdGF0aW9uT2JqZWN0KSkge1xuXHRcdGNvbnN0IHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uID0gcGFyc2VkQW5ub3RhdGlvbk9iamVjdCBhcyBhbnk7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiA9IGFubm90YXRpb25PYmplY3QubWFwKChzdWJBbm5vdGF0aW9uT2JqZWN0LCBzdWJBbm5vdGF0aW9uSW5kZXgpID0+XG5cdFx0XHRwYXJzZUFubm90YXRpb25PYmplY3Qoc3ViQW5ub3RhdGlvbk9iamVjdCwgY3VycmVudE9iamVjdFRhcmdldCArIFwiL1wiICsgc3ViQW5ub3RhdGlvbkluZGV4LCBhbm5vdGF0aW9uc0xpc3RzLCBvQ2FwYWJpbGl0aWVzKVxuXHRcdCk7XG5cdFx0aWYgKGFubm90YXRpb25PYmplY3QubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUHJvcGVydHlQYXRoXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUGF0aFwiKSkge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlBhdGhcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFubm90YXRpb25QYXRoXCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQW5ub3RhdGlvblBhdGhcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkSWZcIikpIHtcblx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJJZlwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFuZFwiKSkge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkFuZFwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE9yXCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiT3JcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRFcVwiKSkge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkVxXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTmVcIikpIHtcblx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJOZVwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE5vdFwiKSkge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5vdFwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEd0XCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiR3RcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRHZVwiKSkge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkdlXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTHRcIikpIHtcblx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJMdFwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJExlXCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTGVcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkFwcGx5XCI7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0WzBdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlN0cmluZ1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZiAoYW5ub3RhdGlvbk9iamVjdC4kVHlwZSkge1xuXHRcdFx0Y29uc3QgdHlwZVZhbHVlID0gYW5ub3RhdGlvbk9iamVjdC4kVHlwZTtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudHlwZSA9IHR5cGVWYWx1ZTsgLy9gJHt0eXBlQWxpYXN9LiR7dHlwZVRlcm19YDtcblx0XHR9XG5cdFx0Y29uc3QgcHJvcGVydHlWYWx1ZXM6IGFueSA9IFtdO1xuXHRcdE9iamVjdC5rZXlzKGFubm90YXRpb25PYmplY3QpLmZvckVhY2gocHJvcGVydHlLZXkgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkVHlwZVwiICYmXG5cdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRJZlwiICYmXG5cdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRBcHBseVwiICYmXG5cdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRBbmRcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkT3JcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkTmVcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkR3RcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkR2VcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkTHRcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkTGVcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkTm90XCIgJiZcblx0XHRcdFx0cHJvcGVydHlLZXkgIT09IFwiJEVxXCIgJiZcblx0XHRcdFx0IXByb3BlcnR5S2V5LnN0YXJ0c1dpdGgoXCJAXCIpXG5cdFx0XHQpIHtcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXMucHVzaChcblx0XHRcdFx0XHRwYXJzZVByb3BlcnR5VmFsdWUoYW5ub3RhdGlvbk9iamVjdFtwcm9wZXJ0eUtleV0sIHByb3BlcnR5S2V5LCBjdXJyZW50T2JqZWN0VGFyZ2V0LCBhbm5vdGF0aW9uc0xpc3RzLCBvQ2FwYWJpbGl0aWVzKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChwcm9wZXJ0eUtleS5zdGFydHNXaXRoKFwiQFwiKSkge1xuXHRcdFx0XHQvLyBBbm5vdGF0aW9uIG9mIGFubm90YXRpb25cblx0XHRcdFx0Y3JlYXRlQW5ub3RhdGlvbkxpc3RzKFxuXHRcdFx0XHRcdHsgW3Byb3BlcnR5S2V5XTogYW5ub3RhdGlvbk9iamVjdFtwcm9wZXJ0eUtleV0gfSxcblx0XHRcdFx0XHRjdXJyZW50T2JqZWN0VGFyZ2V0LFxuXHRcdFx0XHRcdGFubm90YXRpb25zTGlzdHMsXG5cdFx0XHRcdFx0b0NhcGFiaWxpdGllc1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QucHJvcGVydHlWYWx1ZXMgPSBwcm9wZXJ0eVZhbHVlcztcblx0fVxuXHRyZXR1cm4gcGFyc2VkQW5ub3RhdGlvbk9iamVjdDtcbn1cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlQW5ub3RhdGlvbkxpc3QodGFyZ2V0OiBzdHJpbmcsIGFubm90YXRpb25zTGlzdHM6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25MaXN0Pik6IEFubm90YXRpb25MaXN0IHtcblx0aWYgKCFhbm5vdGF0aW9uc0xpc3RzLmhhc093blByb3BlcnR5KHRhcmdldCkpIHtcblx0XHRhbm5vdGF0aW9uc0xpc3RzW3RhcmdldF0gPSB7XG5cdFx0XHR0YXJnZXQ6IHRhcmdldCxcblx0XHRcdGFubm90YXRpb25zOiBbXVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIGFubm90YXRpb25zTGlzdHNbdGFyZ2V0XTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hhcnRBbm5vdGF0aW9ucyhhbm5vdGF0aW9uT2JqZWN0OiBhbnkpIHtcblx0cmV0dXJuIGFubm90YXRpb25PYmplY3QuZmlsdGVyKChvUmVjb3JkOiBhbnkpID0+IHtcblx0XHRpZiAob1JlY29yZC5UYXJnZXQgJiYgb1JlY29yZC5UYXJnZXQuJEFubm90YXRpb25QYXRoKSB7XG5cdFx0XHRyZXR1cm4gb1JlY29yZC5UYXJnZXQuJEFubm90YXRpb25QYXRoLmluZGV4T2YoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnRcIikgPT09IC0xO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVJQk5Bbm5vdGF0aW9ucyhhbm5vdGF0aW9uT2JqZWN0OiBhbnkpIHtcblx0cmV0dXJuIGFubm90YXRpb25PYmplY3QuZmlsdGVyKChvUmVjb3JkOiBhbnkpID0+IHtcblx0XHRyZXR1cm4gb1JlY29yZC4kVHlwZSAhPT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVByZXNlbnRhdGlvblZhcmlhbnQoYW5ub3RhdGlvbk9iamVjdDogYW55KSB7XG5cdHJldHVybiBhbm5vdGF0aW9uT2JqZWN0LmZpbHRlcigob1JlY29yZDogYW55KSA9PiB7XG5cdFx0cmV0dXJuIG9SZWNvcmQuJEFubm90YXRpb25QYXRoICE9PSBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydFwiO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQW5ub3RhdGlvbkxpc3RzKFxuXHRhbm5vdGF0aW9uT2JqZWN0czogYW55LFxuXHRhbm5vdGF0aW9uVGFyZ2V0OiBzdHJpbmcsXG5cdGFubm90YXRpb25MaXN0czogUmVjb3JkPHN0cmluZywgQW5ub3RhdGlvbkxpc3Q+LFxuXHRvQ2FwYWJpbGl0aWVzOiBFbnZpcm9ubWVudENhcGFiaWxpdGllc1xuKSB7XG5cdGlmIChPYmplY3Qua2V5cyhhbm5vdGF0aW9uT2JqZWN0cykubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IG91dEFubm90YXRpb25PYmplY3QgPSBnZXRPckNyZWF0ZUFubm90YXRpb25MaXN0KGFubm90YXRpb25UYXJnZXQsIGFubm90YXRpb25MaXN0cyk7XG5cdGlmICghb0NhcGFiaWxpdGllcy5NaWNyb0NoYXJ0KSB7XG5cdFx0ZGVsZXRlIGFubm90YXRpb25PYmplY3RzW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCJdO1xuXHR9XG5cblx0Zm9yIChsZXQgYW5ub3RhdGlvbktleSBpbiBhbm5vdGF0aW9uT2JqZWN0cykge1xuXHRcdGxldCBhbm5vdGF0aW9uT2JqZWN0ID0gYW5ub3RhdGlvbk9iamVjdHNbYW5ub3RhdGlvbktleV07XG5cdFx0c3dpdGNoIChhbm5vdGF0aW9uS2V5KSB7XG5cdFx0XHRjYXNlIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckZhY2V0c1wiOlxuXHRcdFx0XHRpZiAoIW9DYXBhYmlsaXRpZXMuTWljcm9DaGFydCkge1xuXHRcdFx0XHRcdGFubm90YXRpb25PYmplY3QgPSByZW1vdmVDaGFydEFubm90YXRpb25zKGFubm90YXRpb25PYmplY3QpO1xuXHRcdFx0XHRcdGFubm90YXRpb25PYmplY3RzW2Fubm90YXRpb25LZXldID0gYW5ub3RhdGlvbk9iamVjdDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSWRlbnRpZmljYXRpb25cIjpcblx0XHRcdFx0aWYgKCFvQ2FwYWJpbGl0aWVzLkludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGFubm90YXRpb25PYmplY3QgPSByZW1vdmVJQk5Bbm5vdGF0aW9ucyhhbm5vdGF0aW9uT2JqZWN0KTtcblx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0c1thbm5vdGF0aW9uS2V5XSA9IGFubm90YXRpb25PYmplY3Q7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtXCI6XG5cdFx0XHRcdGlmICghb0NhcGFiaWxpdGllcy5JbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0ID0gcmVtb3ZlSUJOQW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdCk7XG5cdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdHNbYW5ub3RhdGlvbktleV0gPSBhbm5vdGF0aW9uT2JqZWN0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghb0NhcGFiaWxpdGllcy5NaWNyb0NoYXJ0KSB7XG5cdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdCA9IHJlbW92ZUNoYXJ0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdCk7XG5cdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdHNbYW5ub3RhdGlvbktleV0gPSBhbm5vdGF0aW9uT2JqZWN0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWVsZEdyb3VwXCI6XG5cdFx0XHRcdGlmICghb0NhcGFiaWxpdGllcy5JbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0LkRhdGEgPSByZW1vdmVJQk5Bbm5vdGF0aW9ucyhhbm5vdGF0aW9uT2JqZWN0LkRhdGEpO1xuXHRcdFx0XHRcdGFubm90YXRpb25PYmplY3RzW2Fubm90YXRpb25LZXldID0gYW5ub3RhdGlvbk9iamVjdDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIW9DYXBhYmlsaXRpZXMuTWljcm9DaGFydCkge1xuXHRcdFx0XHRcdGFubm90YXRpb25PYmplY3QuRGF0YSA9IHJlbW92ZUNoYXJ0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdC5EYXRhKTtcblx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0c1thbm5vdGF0aW9uS2V5XSA9IGFubm90YXRpb25PYmplY3Q7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlByZXNlbnRhdGlvblZhcmlhbnRcIjpcblx0XHRcdFx0aWYgKCFvQ2FwYWJpbGl0aWVzLkNoYXJ0ICYmIGFubm90YXRpb25PYmplY3QuVmlzdWFsaXphdGlvbnMpIHtcblx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0LlZpc3VhbGl6YXRpb25zID0gaGFuZGxlUHJlc2VudGF0aW9uVmFyaWFudChhbm5vdGF0aW9uT2JqZWN0LlZpc3VhbGl6YXRpb25zKTtcblx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0c1thbm5vdGF0aW9uS2V5XSA9IGFubm90YXRpb25PYmplY3Q7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRsZXQgY3VycmVudE91dEFubm90YXRpb25PYmplY3QgPSBvdXRBbm5vdGF0aW9uT2JqZWN0O1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGFubm90YXRpb24gb2YgYW5ub3RhdGlvblxuXHRcdGNvbnN0IGFubm90YXRpb25PZkFubm90YXRpb25TcGxpdCA9IGFubm90YXRpb25LZXkuc3BsaXQoXCJAXCIpO1xuXHRcdGlmIChhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXQubGVuZ3RoID4gMikge1xuXHRcdFx0Y3VycmVudE91dEFubm90YXRpb25PYmplY3QgPSBnZXRPckNyZWF0ZUFubm90YXRpb25MaXN0KFxuXHRcdFx0XHRhbm5vdGF0aW9uVGFyZ2V0ICsgXCJAXCIgKyBhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXRbMV0sXG5cdFx0XHRcdGFubm90YXRpb25MaXN0c1xuXHRcdFx0KTtcblx0XHRcdGFubm90YXRpb25LZXkgPSBhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXRbMl07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFubm90YXRpb25LZXkgPSBhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXRbMV07XG5cdFx0fVxuXG5cdFx0Y29uc3QgYW5ub3RhdGlvblF1YWxpZmllclNwbGl0ID0gYW5ub3RhdGlvbktleS5zcGxpdChcIiNcIik7XG5cdFx0Y29uc3QgcXVhbGlmaWVyID0gYW5ub3RhdGlvblF1YWxpZmllclNwbGl0WzFdO1xuXHRcdGFubm90YXRpb25LZXkgPSBhbm5vdGF0aW9uUXVhbGlmaWVyU3BsaXRbMF07XG5cblx0XHRjb25zdCBwYXJzZWRBbm5vdGF0aW9uT2JqZWN0OiBhbnkgPSB7XG5cdFx0XHR0ZXJtOiBgJHthbm5vdGF0aW9uS2V5fWAsXG5cdFx0XHRxdWFsaWZpZXI6IHF1YWxpZmllclxuXHRcdH07XG5cdFx0bGV0IGN1cnJlbnRBbm5vdGF0aW9uVGFyZ2V0ID0gYW5ub3RhdGlvblRhcmdldCArIFwiQFwiICsgcGFyc2VkQW5ub3RhdGlvbk9iamVjdC50ZXJtO1xuXHRcdGlmIChxdWFsaWZpZXIpIHtcblx0XHRcdGN1cnJlbnRBbm5vdGF0aW9uVGFyZ2V0ICs9IFwiI1wiICsgcXVhbGlmaWVyO1xuXHRcdH1cblx0XHRsZXQgaXNDb2xsZWN0aW9uID0gZmFsc2U7XG5cdFx0Y29uc3QgdHlwZW9mQW5ub3RhdGlvbiA9IHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0O1xuXHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0ID09PSBudWxsKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkJvb2xcIiwgQm9vbDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mQW5ub3RhdGlvbiA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJTdHJpbmdcIiwgU3RyaW5nOiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdFx0fSBlbHNlIGlmICh0eXBlb2ZBbm5vdGF0aW9uID09PSBcImJvb2xlYW5cIikge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJCb29sXCIsIEJvb2w6IGFubm90YXRpb25PYmplY3QgfTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZkFubm90YXRpb24gPT09IFwibnVtYmVyXCIpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiSW50XCIsIEludDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kSWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJJZlwiLCBJZjogYW5ub3RhdGlvbk9iamVjdC4kSWYgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEFuZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkFuZFwiLCBBbmQ6IGFubm90YXRpb25PYmplY3QuJEFuZCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kT3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJPclwiLCBPcjogYW5ub3RhdGlvbk9iamVjdC4kT3IgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5vdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIk5vdFwiLCBOb3Q6IGFubm90YXRpb25PYmplY3QuJE5vdCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRXEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJFcVwiLCBFcTogYW5ub3RhdGlvbk9iamVjdC4kRXEgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiTmVcIiwgTmU6IGFubm90YXRpb25PYmplY3QuJE5lIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRHdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkd0XCIsIEd0OiBhbm5vdGF0aW9uT2JqZWN0LiRHdCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kR2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJHZVwiLCBHZTogYW5ub3RhdGlvbk9iamVjdC4kR2UgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiTHRcIiwgTHQ6IGFubm90YXRpb25PYmplY3QuJEx0IH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRMZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkxlXCIsIExlOiBhbm5vdGF0aW9uT2JqZWN0LiRMZSB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQXBwbHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJBcHBseVwiLCBBcHBseTogYW5ub3RhdGlvbk9iamVjdC4kQXBwbHksIEZ1bmN0aW9uOiBhbm5vdGF0aW9uT2JqZWN0LiRGdW5jdGlvbiB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIlBhdGhcIiwgUGF0aDogYW5ub3RhdGlvbk9iamVjdC4kUGF0aCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHtcblx0XHRcdFx0dHlwZTogXCJBbm5vdGF0aW9uUGF0aFwiLFxuXHRcdFx0XHRBbm5vdGF0aW9uUGF0aDogYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGhcblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiREZWNpbWFsICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiRGVjaW1hbFwiLCBEZWNpbWFsOiBwYXJzZUZsb2F0KGFubm90YXRpb25PYmplY3QuJERlY2ltYWwpIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7XG5cdFx0XHRcdHR5cGU6IFwiRW51bU1lbWJlclwiLFxuXHRcdFx0XHRFbnVtTWVtYmVyOiBtYXBOYW1lVG9BbGlhcyhhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyLnNwbGl0KFwiL1wiKVswXSkgKyBcIi9cIiArIGFubm90YXRpb25PYmplY3QuJEVudW1NZW1iZXIuc3BsaXQoXCIvXCIpWzFdXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhbm5vdGF0aW9uT2JqZWN0KSkge1xuXHRcdFx0aXNDb2xsZWN0aW9uID0gdHJ1ZTtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiA9IGFubm90YXRpb25PYmplY3QubWFwKChzdWJBbm5vdGF0aW9uT2JqZWN0LCBzdWJBbm5vdGF0aW9uSW5kZXgpID0+XG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbk9iamVjdChcblx0XHRcdFx0XHRzdWJBbm5vdGF0aW9uT2JqZWN0LFxuXHRcdFx0XHRcdGN1cnJlbnRBbm5vdGF0aW9uVGFyZ2V0ICsgXCIvXCIgKyBzdWJBbm5vdGF0aW9uSW5kZXgsXG5cdFx0XHRcdFx0YW5ub3RhdGlvbkxpc3RzLFxuXHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0aWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlByb3BlcnR5UGF0aFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUGF0aFwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJQYXRoXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFubm90YXRpb25QYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkFubm90YXRpb25QYXRoXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlJlY29yZFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkSWZcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiSWZcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE9yXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk9yXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRFcVwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJFcVwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTmVcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTmVcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE5vdFwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJOb3RcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEd0XCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkd0XCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRHZVwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJHZVwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTHRcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTHRcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJExlXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkxlXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRBbmRcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQW5kXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJBcHBseVwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0WzBdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlJlY29yZFwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJTdHJpbmdcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCByZWNvcmQ6IEFubm90YXRpb25SZWNvcmQgPSB7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzOiBbXVxuXHRcdFx0fTtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0LiRUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IHR5cGVWYWx1ZSA9IGFubm90YXRpb25PYmplY3QuJFR5cGU7XG5cdFx0XHRcdHJlY29yZC50eXBlID0gYCR7dHlwZVZhbHVlfWA7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlczogYW55W10gPSBbXTtcblx0XHRcdGZvciAoY29uc3QgcHJvcGVydHlLZXkgaW4gYW5ub3RhdGlvbk9iamVjdCkge1xuXHRcdFx0XHRpZiAocHJvcGVydHlLZXkgIT09IFwiJFR5cGVcIiAmJiAhcHJvcGVydHlLZXkuc3RhcnRzV2l0aChcIkBcIikpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlcy5wdXNoKFxuXHRcdFx0XHRcdFx0cGFyc2VQcm9wZXJ0eVZhbHVlKFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0W3Byb3BlcnR5S2V5XSxcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlLZXksXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRBbm5vdGF0aW9uVGFyZ2V0LFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uTGlzdHMsXG5cdFx0XHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5S2V5LnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG5cdFx0XHRcdFx0Ly8gQW5ub3RhdGlvbiBvZiByZWNvcmRcblx0XHRcdFx0XHRjcmVhdGVBbm5vdGF0aW9uTGlzdHMoXG5cdFx0XHRcdFx0XHR7IFtwcm9wZXJ0eUtleV06IGFubm90YXRpb25PYmplY3RbcHJvcGVydHlLZXldIH0sXG5cdFx0XHRcdFx0XHRjdXJyZW50QW5ub3RhdGlvblRhcmdldCxcblx0XHRcdFx0XHRcdGFubm90YXRpb25MaXN0cyxcblx0XHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZWNvcmQucHJvcGVydHlWYWx1ZXMgPSBwcm9wZXJ0eVZhbHVlcztcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QucmVjb3JkID0gcmVjb3JkO1xuXHRcdH1cblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmlzQ29sbGVjdGlvbiA9IGlzQ29sbGVjdGlvbjtcblx0XHRjdXJyZW50T3V0QW5ub3RhdGlvbk9iamVjdC5hbm5vdGF0aW9ucy5wdXNoKHBhcnNlZEFubm90YXRpb25PYmplY3QpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVQcm9wZXJ0eShwcm9wZXJ0eURlZmluaXRpb246IGFueSwgZW50aXR5VHlwZU9iamVjdDogRW50aXR5VHlwZSB8IENvbXBsZXhUeXBlLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IFByb3BlcnR5IHtcblx0Y29uc3QgcHJvcGVydHlPYmplY3Q6IFByb3BlcnR5ID0ge1xuXHRcdF90eXBlOiBcIlByb3BlcnR5XCIsXG5cdFx0bmFtZTogcHJvcGVydHlOYW1lLFxuXHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7ZW50aXR5VHlwZU9iamVjdC5mdWxseVF1YWxpZmllZE5hbWV9LyR7cHJvcGVydHlOYW1lfWAsXG5cdFx0dHlwZTogcHJvcGVydHlEZWZpbml0aW9uLiRUeXBlLFxuXHRcdG1heExlbmd0aDogcHJvcGVydHlEZWZpbml0aW9uLiRNYXhMZW5ndGgsXG5cdFx0cHJlY2lzaW9uOiBwcm9wZXJ0eURlZmluaXRpb24uJFByZWNpc2lvbixcblx0XHRzY2FsZTogcHJvcGVydHlEZWZpbml0aW9uLiRTY2FsZSxcblx0XHRudWxsYWJsZTogcHJvcGVydHlEZWZpbml0aW9uLiROdWxsYWJsZVxuXHR9O1xuXHRyZXR1cm4gcHJvcGVydHlPYmplY3Q7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVOYXZpZ2F0aW9uUHJvcGVydHkoXG5cdG5hdlByb3BlcnR5RGVmaW5pdGlvbjogYW55LFxuXHRlbnRpdHlUeXBlT2JqZWN0OiBFbnRpdHlUeXBlIHwgQ29tcGxleFR5cGUsXG5cdG5hdlByb3BlcnR5TmFtZTogc3RyaW5nXG4pOiBWNE5hdmlnYXRpb25Qcm9wZXJ0eSB7XG5cdGxldCByZWZlcmVudGlhbENvbnN0cmFpbnQ6IFJlZmVyZW50aWFsQ29uc3RyYWludFtdID0gW107XG5cdGlmIChuYXZQcm9wZXJ0eURlZmluaXRpb24uJFJlZmVyZW50aWFsQ29uc3RyYWludCkge1xuXHRcdHJlZmVyZW50aWFsQ29uc3RyYWludCA9IE9iamVjdC5rZXlzKG5hdlByb3BlcnR5RGVmaW5pdGlvbi4kUmVmZXJlbnRpYWxDb25zdHJhaW50KS5tYXAoc291cmNlUHJvcGVydHlOYW1lID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNvdXJjZVR5cGVOYW1lOiBlbnRpdHlUeXBlT2JqZWN0Lm5hbWUsXG5cdFx0XHRcdHNvdXJjZVByb3BlcnR5OiBzb3VyY2VQcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHRhcmdldFR5cGVOYW1lOiBuYXZQcm9wZXJ0eURlZmluaXRpb24uJFR5cGUsXG5cdFx0XHRcdHRhcmdldFByb3BlcnR5OiBuYXZQcm9wZXJ0eURlZmluaXRpb24uJFJlZmVyZW50aWFsQ29uc3RyYWludFtzb3VyY2VQcm9wZXJ0eU5hbWVdXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eTogVjROYXZpZ2F0aW9uUHJvcGVydHkgPSB7XG5cdFx0X3R5cGU6IFwiTmF2aWdhdGlvblByb3BlcnR5XCIsXG5cdFx0bmFtZTogbmF2UHJvcGVydHlOYW1lLFxuXHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7ZW50aXR5VHlwZU9iamVjdC5mdWxseVF1YWxpZmllZE5hbWV9LyR7bmF2UHJvcGVydHlOYW1lfWAsXG5cdFx0cGFydG5lcjogbmF2UHJvcGVydHlEZWZpbml0aW9uLiRQYXJ0bmVyLFxuXHRcdGlzQ29sbGVjdGlvbjogbmF2UHJvcGVydHlEZWZpbml0aW9uLiRpc0NvbGxlY3Rpb24gPyBuYXZQcm9wZXJ0eURlZmluaXRpb24uJGlzQ29sbGVjdGlvbiA6IGZhbHNlLFxuXHRcdGNvbnRhaW5zVGFyZ2V0OiBuYXZQcm9wZXJ0eURlZmluaXRpb24uJENvbnRhaW5zVGFyZ2V0LFxuXHRcdHRhcmdldFR5cGVOYW1lOiBuYXZQcm9wZXJ0eURlZmluaXRpb24uJFR5cGUsXG5cdFx0cmVmZXJlbnRpYWxDb25zdHJhaW50XG5cdH07XG5cblx0cmV0dXJuIG5hdmlnYXRpb25Qcm9wZXJ0eTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUVudGl0eVNldChlbnRpdHlTZXREZWZpbml0aW9uOiBhbnksIGVudGl0eVNldE5hbWU6IHN0cmluZywgZW50aXR5Q29udGFpbmVyTmFtZTogc3RyaW5nKTogRW50aXR5U2V0IHtcblx0Y29uc3QgZW50aXR5U2V0T2JqZWN0OiBFbnRpdHlTZXQgPSB7XG5cdFx0X3R5cGU6IFwiRW50aXR5U2V0XCIsXG5cdFx0bmFtZTogZW50aXR5U2V0TmFtZSxcblx0XHRuYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nOiB7fSxcblx0XHRlbnRpdHlUeXBlTmFtZTogZW50aXR5U2V0RGVmaW5pdGlvbi4kVHlwZSxcblx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGAke2VudGl0eUNvbnRhaW5lck5hbWV9LyR7ZW50aXR5U2V0TmFtZX1gXG5cdH07XG5cdHJldHVybiBlbnRpdHlTZXRPYmplY3Q7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVTaW5nbGV0b24oc2luZ2xldG9uRGVmaW5pdGlvbjogYW55LCBzaW5nbGV0b25OYW1lOiBzdHJpbmcsIGVudGl0eUNvbnRhaW5lck5hbWU6IHN0cmluZyk6IFNpbmdsZXRvbiB7XG5cdGNvbnN0IHNpbmdsZXRvbk9iamVjdDogU2luZ2xldG9uID0ge1xuXHRcdF90eXBlOiBcIlNpbmdsZXRvblwiLFxuXHRcdG5hbWU6IHNpbmdsZXRvbk5hbWUsXG5cdFx0bmF2aWdhdGlvblByb3BlcnR5QmluZGluZzoge30sXG5cdFx0dHlwZU5hbWU6IHNpbmdsZXRvbkRlZmluaXRpb24uJFR5cGUsXG5cdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtlbnRpdHlDb250YWluZXJOYW1lfS8ke3NpbmdsZXRvbk5hbWV9YCxcblx0XHRudWxsYWJsZTogdHJ1ZVxuXHR9O1xuXHRyZXR1cm4gc2luZ2xldG9uT2JqZWN0O1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVHlwZURlZmluaXRpb24odHlwZURlZmluaXRpb246IGFueSwgdHlwZU5hbWU6IHN0cmluZywgbmFtZXNwYWNlOiBzdHJpbmcpOiBUeXBlRGVmaW5pdGlvbiB7XG5cdGNvbnN0IHR5cGVPYmplY3Q6IFR5cGVEZWZpbml0aW9uID0ge1xuXHRcdF90eXBlOiBcIlR5cGVEZWZpbml0aW9uXCIsXG5cdFx0bmFtZTogdHlwZU5hbWUucmVwbGFjZShuYW1lc3BhY2UgKyBcIi5cIiwgXCJcIiksXG5cdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiB0eXBlTmFtZSxcblx0XHR1bmRlcmx5aW5nVHlwZTogdHlwZURlZmluaXRpb24uJFVuZGVybHlpbmdUeXBlXG5cdH07XG5cdHJldHVybiB0eXBlT2JqZWN0O1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlQ29tcGxleFR5cGUoY29tcGxleFR5cGVEZWZpbml0aW9uOiBhbnksIGNvbXBsZXhUeXBlTmFtZTogc3RyaW5nLCBuYW1lc3BhY2U6IHN0cmluZyk6IENvbXBsZXhUeXBlIHtcblx0Y29uc3QgY29tcGxleFR5cGVPYmplY3Q6IENvbXBsZXhUeXBlID0ge1xuXHRcdF90eXBlOiBcIkNvbXBsZXhUeXBlXCIsXG5cdFx0bmFtZTogY29tcGxleFR5cGVOYW1lLnJlcGxhY2UobmFtZXNwYWNlICsgXCIuXCIsIFwiXCIpLFxuXHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogY29tcGxleFR5cGVOYW1lLFxuXHRcdHByb3BlcnRpZXM6IFtdLFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXVxuXHR9O1xuXG5cdGNvbnN0IGNvbXBsZXhUeXBlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGNvbXBsZXhUeXBlRGVmaW5pdGlvbilcblx0XHQuZmlsdGVyKHByb3BlcnR5TmFtZU9yTm90ID0+IHtcblx0XHRcdGlmIChwcm9wZXJ0eU5hbWVPck5vdCAhPSBcIiRLZXlcIiAmJiBwcm9wZXJ0eU5hbWVPck5vdCAhPSBcIiRraW5kXCIpIHtcblx0XHRcdFx0cmV0dXJuIGNvbXBsZXhUeXBlRGVmaW5pdGlvbltwcm9wZXJ0eU5hbWVPck5vdF0uJGtpbmQgPT09IFwiUHJvcGVydHlcIjtcblx0XHRcdH1cblx0XHR9KVxuXHRcdC5zb3J0KChhLCBiKSA9PiAoYSA+IGIgPyAxIDogLTEpKVxuXHRcdC5tYXAocHJvcGVydHlOYW1lID0+IHtcblx0XHRcdHJldHVybiBwcmVwYXJlUHJvcGVydHkoY29tcGxleFR5cGVEZWZpbml0aW9uW3Byb3BlcnR5TmFtZV0sIGNvbXBsZXhUeXBlT2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXHRcdH0pO1xuXG5cdGNvbXBsZXhUeXBlT2JqZWN0LnByb3BlcnRpZXMgPSBjb21wbGV4VHlwZVByb3BlcnRpZXM7XG5cdGNvbnN0IGNvbXBsZXhUeXBlTmF2aWdhdGlvblByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhjb21wbGV4VHlwZURlZmluaXRpb24pXG5cdFx0LmZpbHRlcihwcm9wZXJ0eU5hbWVPck5vdCA9PiB7XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lT3JOb3QgIT0gXCIkS2V5XCIgJiYgcHJvcGVydHlOYW1lT3JOb3QgIT0gXCIka2luZFwiKSB7XG5cdFx0XHRcdHJldHVybiBjb21wbGV4VHlwZURlZmluaXRpb25bcHJvcGVydHlOYW1lT3JOb3RdLiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiO1xuXHRcdFx0fVxuXHRcdH0pXG5cdFx0LnNvcnQoKGEsIGIpID0+IChhID4gYiA/IDEgOiAtMSkpXG5cdFx0Lm1hcChuYXZQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0cmV0dXJuIHByZXBhcmVOYXZpZ2F0aW9uUHJvcGVydHkoY29tcGxleFR5cGVEZWZpbml0aW9uW25hdlByb3BlcnR5TmFtZV0sIGNvbXBsZXhUeXBlT2JqZWN0LCBuYXZQcm9wZXJ0eU5hbWUpO1xuXHRcdH0pO1xuXHRjb21wbGV4VHlwZU9iamVjdC5uYXZpZ2F0aW9uUHJvcGVydGllcyA9IGNvbXBsZXhUeXBlTmF2aWdhdGlvblByb3BlcnRpZXM7XG5cdHJldHVybiBjb21wbGV4VHlwZU9iamVjdDtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUVudGl0eUtleXMoZW50aXR5VHlwZURlZmluaXRpb246IGFueSwgb01ldGFNb2RlbERhdGE6IGFueSk6IGFueSB7XG5cdGlmICghZW50aXR5VHlwZURlZmluaXRpb24uJEtleSAmJiBlbnRpdHlUeXBlRGVmaW5pdGlvbi4kQmFzZVR5cGUpIHtcblx0XHRyZXR1cm4gcHJlcGFyZUVudGl0eUtleXMob01ldGFNb2RlbERhdGFbYCR7ZW50aXR5VHlwZURlZmluaXRpb24uJEJhc2VUeXBlfWBdLCBvTWV0YU1vZGVsRGF0YSk7XG5cdH1cblx0cmV0dXJuIGVudGl0eVR5cGVEZWZpbml0aW9uLiRLZXkgfHwgW107IC8vaGFuZGxpbmcgb2YgZW50aXR5IHR5cGVzIHdpdGhvdXQga2V5IGFzIHdlbGwgYXMgYmFzZXR5cGVcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUVudGl0eVR5cGUoZW50aXR5VHlwZURlZmluaXRpb246IGFueSwgZW50aXR5VHlwZU5hbWU6IHN0cmluZywgbmFtZXNwYWNlOiBzdHJpbmcsIG1ldGFNb2RlbERhdGE6IGFueSk6IEVudGl0eVR5cGUge1xuXHRjb25zdCBlbnRpdHlLZXlzOiBhbnkgPSBwcmVwYXJlRW50aXR5S2V5cyhlbnRpdHlUeXBlRGVmaW5pdGlvbiwgbWV0YU1vZGVsRGF0YSk7XG5cblx0Y29uc3QgZW50aXR5VHlwZU9iamVjdDogRW50aXR5VHlwZSA9IHtcblx0XHRfdHlwZTogXCJFbnRpdHlUeXBlXCIsXG5cdFx0bmFtZTogZW50aXR5VHlwZU5hbWUucmVwbGFjZShuYW1lc3BhY2UgKyBcIi5cIiwgXCJcIiksXG5cdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBlbnRpdHlUeXBlTmFtZSxcblx0XHRrZXlzOiBbXSxcblx0XHRlbnRpdHlQcm9wZXJ0aWVzOiBbXSxcblx0XHRuYXZpZ2F0aW9uUHJvcGVydGllczogW11cblx0fTtcblxuXHRjb25zdCBlbnRpdHlQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoZW50aXR5VHlwZURlZmluaXRpb24pXG5cdFx0LmZpbHRlcihwcm9wZXJ0eU5hbWVPck5vdCA9PiB7XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lT3JOb3QgIT0gXCIkS2V5XCIgJiYgcHJvcGVydHlOYW1lT3JOb3QgIT0gXCIka2luZFwiKSB7XG5cdFx0XHRcdHJldHVybiBlbnRpdHlUeXBlRGVmaW5pdGlvbltwcm9wZXJ0eU5hbWVPck5vdF0uJGtpbmQgPT09IFwiUHJvcGVydHlcIjtcblx0XHRcdH1cblx0XHR9KVxuXHRcdC5tYXAocHJvcGVydHlOYW1lID0+IHtcblx0XHRcdHJldHVybiBwcmVwYXJlUHJvcGVydHkoZW50aXR5VHlwZURlZmluaXRpb25bcHJvcGVydHlOYW1lXSwgZW50aXR5VHlwZU9iamVjdCwgcHJvcGVydHlOYW1lKTtcblx0XHR9KTtcblxuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGVudGl0eVR5cGVEZWZpbml0aW9uKVxuXHRcdC5maWx0ZXIocHJvcGVydHlOYW1lT3JOb3QgPT4ge1xuXHRcdFx0aWYgKHByb3BlcnR5TmFtZU9yTm90ICE9IFwiJEtleVwiICYmIHByb3BlcnR5TmFtZU9yTm90ICE9IFwiJGtpbmRcIikge1xuXHRcdFx0XHRyZXR1cm4gZW50aXR5VHlwZURlZmluaXRpb25bcHJvcGVydHlOYW1lT3JOb3RdLiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiO1xuXHRcdFx0fVxuXHRcdH0pXG5cdFx0Lm1hcChuYXZQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0cmV0dXJuIHByZXBhcmVOYXZpZ2F0aW9uUHJvcGVydHkoZW50aXR5VHlwZURlZmluaXRpb25bbmF2UHJvcGVydHlOYW1lXSwgZW50aXR5VHlwZU9iamVjdCwgbmF2UHJvcGVydHlOYW1lKTtcblx0XHR9KTtcblxuXHRlbnRpdHlUeXBlT2JqZWN0LmtleXMgPSBlbnRpdHlLZXlzXG5cdFx0Lm1hcCgoZW50aXR5S2V5OiBzdHJpbmcpID0+IGVudGl0eVByb3BlcnRpZXMuZmluZCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBlbnRpdHlLZXkpKVxuXHRcdC5maWx0ZXIoKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4gcHJvcGVydHkgIT09IHVuZGVmaW5lZCk7XG5cdGVudGl0eVR5cGVPYmplY3QuZW50aXR5UHJvcGVydGllcyA9IGVudGl0eVByb3BlcnRpZXM7XG5cdGVudGl0eVR5cGVPYmplY3QubmF2aWdhdGlvblByb3BlcnRpZXMgPSBuYXZpZ2F0aW9uUHJvcGVydGllcztcblxuXHRyZXR1cm4gZW50aXR5VHlwZU9iamVjdDtcbn1cbmZ1bmN0aW9uIHByZXBhcmVBY3Rpb24oYWN0aW9uTmFtZTogc3RyaW5nLCBhY3Rpb25SYXdEYXRhOiBNZXRhTW9kZWxBY3Rpb24sIG5hbWVzcGFjZTogc3RyaW5nLCBlbnRpdHlDb250YWluZXJOYW1lOiBzdHJpbmcpOiBBY3Rpb24ge1xuXHRsZXQgYWN0aW9uRW50aXR5VHlwZTogc3RyaW5nID0gXCJcIjtcblx0bGV0IGFjdGlvbkZRTiA9IGAke2FjdGlvbk5hbWV9YDtcblx0Y29uc3QgYWN0aW9uU2hvcnROYW1lID0gYWN0aW9uTmFtZS5zdWJzdHIobmFtZXNwYWNlLmxlbmd0aCArIDEpO1xuXHRpZiAoYWN0aW9uUmF3RGF0YS4kSXNCb3VuZCkge1xuXHRcdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXIgPSBhY3Rpb25SYXdEYXRhLiRQYXJhbWV0ZXJbMF07XG5cdFx0YWN0aW9uRW50aXR5VHlwZSA9IGJpbmRpbmdQYXJhbWV0ZXIuJFR5cGU7XG5cdFx0aWYgKGJpbmRpbmdQYXJhbWV0ZXIuJGlzQ29sbGVjdGlvbiA9PT0gdHJ1ZSkge1xuXHRcdFx0YWN0aW9uRlFOID0gYCR7YWN0aW9uTmFtZX0oQ29sbGVjdGlvbigke2FjdGlvbkVudGl0eVR5cGV9KSlgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhY3Rpb25GUU4gPSBgJHthY3Rpb25OYW1lfSgke2FjdGlvbkVudGl0eVR5cGV9KWA7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGFjdGlvbkZRTiA9IGAke2VudGl0eUNvbnRhaW5lck5hbWV9LyR7YWN0aW9uU2hvcnROYW1lfWA7XG5cdH1cblx0Y29uc3QgcGFyYW1ldGVycyA9IGFjdGlvblJhd0RhdGEuJFBhcmFtZXRlciB8fCBbXTtcblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJBY3Rpb25cIixcblx0XHRuYW1lOiBhY3Rpb25TaG9ydE5hbWUsXG5cdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBhY3Rpb25GUU4sXG5cdFx0aXNCb3VuZDogYWN0aW9uUmF3RGF0YS4kSXNCb3VuZCxcblx0XHRpc0Z1bmN0aW9uOiBmYWxzZSxcblx0XHRzb3VyY2VUeXBlOiBhY3Rpb25FbnRpdHlUeXBlLFxuXHRcdHJldHVyblR5cGU6IGFjdGlvblJhd0RhdGEuJFJldHVyblR5cGUgPyBhY3Rpb25SYXdEYXRhLiRSZXR1cm5UeXBlLiRUeXBlIDogXCJcIixcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzLm1hcChwYXJhbSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRfdHlwZTogXCJBY3Rpb25QYXJhbWV0ZXJcIixcblx0XHRcdFx0aXNFbnRpdHlTZXQ6IHBhcmFtLiRUeXBlID09PSBhY3Rpb25SYXdEYXRhLiRFbnRpdHlTZXRQYXRoLFxuXHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGAke2FjdGlvbkZRTn0vJHtwYXJhbS4kTmFtZX1gLFxuXHRcdFx0XHR0eXBlOiBwYXJhbS4kVHlwZVxuXHRcdFx0XHQvLyBUT0RPIG1pc3NpbmcgcHJvcGVydGllcyA/XG5cdFx0XHR9O1xuXHRcdH0pXG5cdH07XG59XG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUVudGl0eVR5cGVzKFxuXHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0b0NhcGFiaWxpdGllczogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgPSBEZWZhdWx0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXNcbik6IFBhcnNlck91dHB1dCB7XG5cdGNvbnN0IG9NZXRhTW9kZWxEYXRhID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvJFwiKTtcblx0Y29uc3QgYW5ub3RhdGlvbkxpc3RzOiBSZWNvcmQ8c3RyaW5nLCBBbm5vdGF0aW9uTGlzdD4gPSB7fTtcblx0Y29uc3QgZW50aXR5VHlwZXM6IEVudGl0eVR5cGVbXSA9IFtdO1xuXHRjb25zdCBlbnRpdHlTZXRzOiBFbnRpdHlTZXRbXSA9IFtdO1xuXHRjb25zdCBzaW5nbGV0b25zOiBTaW5nbGV0b25bXSA9IFtdO1xuXHRjb25zdCBjb21wbGV4VHlwZXM6IENvbXBsZXhUeXBlW10gPSBbXTtcblx0Y29uc3QgdHlwZURlZmluaXRpb25zOiBUeXBlRGVmaW5pdGlvbltdID0gW107XG5cdGNvbnN0IGVudGl0eUNvbnRhaW5lck5hbWUgPSBvTWV0YU1vZGVsRGF0YS4kRW50aXR5Q29udGFpbmVyO1xuXHRsZXQgbmFtZXNwYWNlID0gXCJcIjtcblx0Y29uc3Qgc2NoZW1hS2V5cyA9IE9iamVjdC5rZXlzKG9NZXRhTW9kZWxEYXRhKS5maWx0ZXIobWV0YW1vZGVsS2V5ID0+IG9NZXRhTW9kZWxEYXRhW21ldGFtb2RlbEtleV0uJGtpbmQgPT09IFwiU2NoZW1hXCIpO1xuXHRpZiAoc2NoZW1hS2V5cyAmJiBzY2hlbWFLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRuYW1lc3BhY2UgPSBzY2hlbWFLZXlzWzBdLnN1YnN0cigwLCBzY2hlbWFLZXlzWzBdLmxlbmd0aCAtIDEpO1xuXHR9IGVsc2UgaWYgKGVudGl0eVR5cGVzICYmIGVudGl0eVR5cGVzLmxlbmd0aCkge1xuXHRcdG5hbWVzcGFjZSA9IGVudGl0eVR5cGVzWzBdLmZ1bGx5UXVhbGlmaWVkTmFtZS5yZXBsYWNlKGVudGl0eVR5cGVzWzBdLm5hbWUsIFwiXCIpO1xuXHRcdG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5zdWJzdHIoMCwgbmFtZXNwYWNlLmxlbmd0aCAtIDEpO1xuXHR9XG5cdE9iamVjdC5rZXlzKG9NZXRhTW9kZWxEYXRhKS5mb3JFYWNoKHNPYmplY3ROYW1lID0+IHtcblx0XHRpZiAoc09iamVjdE5hbWUgIT09IFwiJGtpbmRcIikge1xuXHRcdFx0c3dpdGNoIChvTWV0YU1vZGVsRGF0YVtzT2JqZWN0TmFtZV0uJGtpbmQpIHtcblx0XHRcdFx0Y2FzZSBcIkVudGl0eVR5cGVcIjpcblx0XHRcdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gcHJlcGFyZUVudGl0eVR5cGUob01ldGFNb2RlbERhdGFbc09iamVjdE5hbWVdLCBzT2JqZWN0TmFtZSwgbmFtZXNwYWNlLCBvTWV0YU1vZGVsRGF0YSk7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlcmUgYXJlIGZpbHRlciBmYWNldHMgZGVmaW5lZCBmb3IgdGhlIGVudGl0eVR5cGUgYW5kIGlmIHllcywgY2hlY2sgaWYgYWxsIG9mIHRoZW0gaGF2ZSBhbiBJRFxuXHRcdFx0XHRcdC8vIFRoZSBJRCBpcyBvcHRpb25hbCwgYnV0IGl0IGlzIGludGVybmFsbHkgdGFrZW4gZm9yIGdyb3VwaW5nIGZpbHRlciBmaWVsZHMgYW5kIGlmIGl0J3Mgbm90IHByZXNlbnRcblx0XHRcdFx0XHQvLyBhIGZhbGxiYWNrIElEIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBoZXJlLlxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWxEYXRhLiRBbm5vdGF0aW9uc1tlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gJiZcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWxEYXRhLiRBbm5vdGF0aW9uc1tlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV1bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmlsdGVyRmFjZXRzXCJdXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpbHRlckZhY2V0c1wiXS5mb3JFYWNoKFxuXHRcdFx0XHRcdFx0XHQoZmlsdGVyRmFjZXRBbm5vdGF0aW9uOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXJGYWNldEFubm90YXRpb24uSUQgPSBmaWx0ZXJGYWNldEFubm90YXRpb24uSUQgfHwgZ2VuZXJhdGUoW3sgRmFjZXQ6IGZpbHRlckZhY2V0QW5ub3RhdGlvbiB9XSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5mb3JFYWNoKGVudGl0eVByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdGlmICghb01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2VudGl0eVByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0b01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2VudGl0eVByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB7fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0IW9NZXRhTW9kZWxEYXRhLiRBbm5vdGF0aW9uc1tlbnRpdHlQcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWVdW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZERlZmF1bHRcIl1cblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXVtcblx0XHRcdFx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGREZWZhdWx0XCJcblx0XHRcdFx0XHRcdFx0XSA9IHtcblx0XHRcdFx0XHRcdFx0XHQkVHlwZTogXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRcIixcblx0XHRcdFx0XHRcdFx0XHRWYWx1ZTogeyAkUGF0aDogZW50aXR5UHJvcGVydHkubmFtZSB9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0ZW50aXR5VHlwZXMucHVzaChlbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIkNvbXBsZXhUeXBlXCI6XG5cdFx0XHRcdFx0Y29uc3QgY29tcGxleFR5cGUgPSBwcmVwYXJlQ29tcGxleFR5cGUob01ldGFNb2RlbERhdGFbc09iamVjdE5hbWVdLCBzT2JqZWN0TmFtZSwgbmFtZXNwYWNlKTtcblx0XHRcdFx0XHRjb21wbGV4VHlwZXMucHVzaChjb21wbGV4VHlwZSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJUeXBlRGVmaW5pdGlvblwiOlxuXHRcdFx0XHRcdGNvbnN0IHR5cGVEZWZpbml0aW9uID0gcHJlcGFyZVR5cGVEZWZpbml0aW9uKG9NZXRhTW9kZWxEYXRhW3NPYmplY3ROYW1lXSwgc09iamVjdE5hbWUsIG5hbWVzcGFjZSk7XG5cdFx0XHRcdFx0dHlwZURlZmluaXRpb25zLnB1c2godHlwZURlZmluaXRpb24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Y29uc3Qgb0VudGl0eUNvbnRhaW5lciA9IG9NZXRhTW9kZWxEYXRhW2VudGl0eUNvbnRhaW5lck5hbWVdO1xuXHRPYmplY3Qua2V5cyhvRW50aXR5Q29udGFpbmVyKS5mb3JFYWNoKHNPYmplY3ROYW1lID0+IHtcblx0XHRpZiAoc09iamVjdE5hbWUgIT09IFwiJGtpbmRcIikge1xuXHRcdFx0c3dpdGNoIChvRW50aXR5Q29udGFpbmVyW3NPYmplY3ROYW1lXS4ka2luZCkge1xuXHRcdFx0XHRjYXNlIFwiRW50aXR5U2V0XCI6XG5cdFx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gcHJlcGFyZUVudGl0eVNldChvRW50aXR5Q29udGFpbmVyW3NPYmplY3ROYW1lXSwgc09iamVjdE5hbWUsIGVudGl0eUNvbnRhaW5lck5hbWUpO1xuXHRcdFx0XHRcdGVudGl0eVNldHMucHVzaChlbnRpdHlTZXQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiU2luZ2xldG9uXCI6XG5cdFx0XHRcdFx0Y29uc3Qgc2luZ2xldG9uID0gcHJlcGFyZVNpbmdsZXRvbihvRW50aXR5Q29udGFpbmVyW3NPYmplY3ROYW1lXSwgc09iamVjdE5hbWUsIGVudGl0eUNvbnRhaW5lck5hbWUpO1xuXHRcdFx0XHRcdHNpbmdsZXRvbnMucHVzaChzaW5nbGV0b24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0bGV0IGVudGl0eUNvbnRhaW5lcjogRW50aXR5Q29udGFpbmVyID0ge307XG5cdGlmIChlbnRpdHlDb250YWluZXJOYW1lKSB7XG5cdFx0ZW50aXR5Q29udGFpbmVyID0ge1xuXHRcdFx0bmFtZTogZW50aXR5Q29udGFpbmVyTmFtZS5yZXBsYWNlKG5hbWVzcGFjZSArIFwiLlwiLCBcIlwiKSxcblx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogZW50aXR5Q29udGFpbmVyTmFtZVxuXHRcdH07XG5cdH1cblx0ZW50aXR5U2V0cy5mb3JFYWNoKGVudGl0eVNldCA9PiB7XG5cdFx0Y29uc3QgbmF2UHJvcGVydHlCaW5kaW5ncyA9IG9FbnRpdHlDb250YWluZXJbZW50aXR5U2V0Lm5hbWVdLiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nO1xuXHRcdGlmIChuYXZQcm9wZXJ0eUJpbmRpbmdzKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhuYXZQcm9wZXJ0eUJpbmRpbmdzKS5mb3JFYWNoKG5hdlByb3BOYW1lID0+IHtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0RW50aXR5U2V0ID0gZW50aXR5U2V0cy5maW5kKGVudGl0eVNldE5hbWUgPT4gZW50aXR5U2V0TmFtZS5uYW1lID09PSBuYXZQcm9wZXJ0eUJpbmRpbmdzW25hdlByb3BOYW1lXSk7XG5cdFx0XHRcdGlmICh0YXJnZXRFbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRlbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tuYXZQcm9wTmFtZV0gPSB0YXJnZXRFbnRpdHlTZXQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fSk7XG5cblx0Y29uc3QgYWN0aW9uczogQWN0aW9uW10gPSBPYmplY3Qua2V5cyhvTWV0YU1vZGVsRGF0YSlcblx0XHQuZmlsdGVyKGtleSA9PiB7XG5cdFx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShvTWV0YU1vZGVsRGF0YVtrZXldKSAmJiBvTWV0YU1vZGVsRGF0YVtrZXldLmxlbmd0aCA+IDAgJiYgb01ldGFNb2RlbERhdGFba2V5XVswXS4ka2luZCA9PT0gXCJBY3Rpb25cIjtcblx0XHR9KVxuXHRcdC5yZWR1Y2UoKG91dEFjdGlvbnM6IEFjdGlvbltdLCBhY3Rpb25OYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBhY3Rpb25zID0gb01ldGFNb2RlbERhdGFbYWN0aW9uTmFtZV07XG5cdFx0XHRhY3Rpb25zLmZvckVhY2goKGFjdGlvbjogTWV0YU1vZGVsQWN0aW9uKSA9PiB7XG5cdFx0XHRcdG91dEFjdGlvbnMucHVzaChwcmVwYXJlQWN0aW9uKGFjdGlvbk5hbWUsIGFjdGlvbiwgbmFtZXNwYWNlLCBlbnRpdHlDb250YWluZXJOYW1lKSk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBvdXRBY3Rpb25zO1xuXHRcdH0sIFtdKTtcblxuXHRmb3IgKGNvbnN0IHRhcmdldCBpbiBvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnMpIHtcblx0XHRjcmVhdGVBbm5vdGF0aW9uTGlzdHMob01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW3RhcmdldF0sIHRhcmdldCwgYW5ub3RhdGlvbkxpc3RzLCBvQ2FwYWJpbGl0aWVzKTtcblx0fVxuXG5cdC8vIFNvcnQgYnkgdGFyZ2V0IGxlbmd0aFxuXHRjb25zdCBvdXRBbm5vdGF0aW9uTGlzdHMgPSBPYmplY3Qua2V5cyhhbm5vdGF0aW9uTGlzdHMpXG5cdFx0LnNvcnQoKGEsIGIpID0+IChhLmxlbmd0aCA+PSBiLmxlbmd0aCA/IDEgOiAtMSkpXG5cdFx0Lm1hcChzQW5ub3RhdGlvbk5hbWUgPT4gYW5ub3RhdGlvbkxpc3RzW3NBbm5vdGF0aW9uTmFtZV0pO1xuXHRjb25zdCByZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSA9IFtdO1xuXHRyZXR1cm4ge1xuXHRcdGlkZW50aWZpY2F0aW9uOiBcIm1ldGFtb2RlbFJlc3VsdFwiLFxuXHRcdHZlcnNpb246IFwiNC4wXCIsXG5cdFx0c2NoZW1hOiB7XG5cdFx0XHRlbnRpdHlDb250YWluZXIsXG5cdFx0XHRlbnRpdHlTZXRzLFxuXHRcdFx0ZW50aXR5VHlwZXMsXG5cdFx0XHRjb21wbGV4VHlwZXMsXG5cdFx0XHR0eXBlRGVmaW5pdGlvbnMsXG5cdFx0XHRzaW5nbGV0b25zLFxuXHRcdFx0YXNzb2NpYXRpb25zOiBbXSxcblx0XHRcdGFzc29jaWF0aW9uU2V0czogW10sXG5cdFx0XHRhY3Rpb25zLFxuXHRcdFx0bmFtZXNwYWNlLFxuXHRcdFx0YW5ub3RhdGlvbnM6IHtcblx0XHRcdFx0XCJtZXRhbW9kZWxSZXN1bHRcIjogb3V0QW5ub3RhdGlvbkxpc3RzXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZWZlcmVuY2VzOiByZWZlcmVuY2VzXG5cdH07XG59XG5cbmNvbnN0IG1NZXRhTW9kZWxNYXA6IFJlY29yZDxzdHJpbmcsIFBhcnNlck91dHB1dD4gPSB7fTtcblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBPRGF0YU1ldGFNb2RlbCBpbnRvIGFub3RoZXIgZm9ybWF0IHRoYXQgYWxsb3cgZm9yIGVhc3kgbWFuaXB1bGF0aW9uIG9mIHRoZSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09EYXRhTWV0YU1vZGVsfSBvTWV0YU1vZGVsIFRoZSBjdXJyZW50IG9EYXRhTWV0YU1vZGVsXG4gKiBAcGFyYW0gb0NhcGFiaWxpdGllcyBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXNcbiAqIEByZXR1cm5zIHtDb252ZXJ0ZXJPdXRwdXR9IEFuIG9iamVjdCBjb250YWluaW5nIG9iamVjdCBsaWtlIGFubm90YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgb0NhcGFiaWxpdGllcz86IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKTogQ29udmVydGVyT3V0cHV0IHtcblx0Y29uc3Qgc01ldGFNb2RlbElkID0gKG9NZXRhTW9kZWwgYXMgYW55KS5pZDtcblx0aWYgKCFtTWV0YU1vZGVsTWFwLmhhc093blByb3BlcnR5KHNNZXRhTW9kZWxJZCkpIHtcblx0XHRjb25zdCBwYXJzZWRPdXRwdXQgPSBwcmVwYXJlRW50aXR5VHlwZXMob01ldGFNb2RlbCwgb0NhcGFiaWxpdGllcyk7XG5cdFx0aWYgKG9DYXBhYmlsaXRpZXMgJiYgb0NhcGFiaWxpdGllcy5TaXR1YXRpb25zKSB7XG5cdFx0XHQvLyBPbmx5IEV4cGVyaW1lbnRhbCBGZWF0dXJlIVxuXHRcdFx0bU1ldGFNb2RlbE1hcFtzTWV0YU1vZGVsSWRdID0gYWRkU3ludGhldGljQW5ub3RhdGlvbnMoQW5ub3RhdGlvbkNvbnZlcnRlci5jb252ZXJ0VHlwZXMocGFyc2VkT3V0cHV0KSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1NZXRhTW9kZWxNYXBbc01ldGFNb2RlbElkXSA9IEFubm90YXRpb25Db252ZXJ0ZXIuY29udmVydFR5cGVzKHBhcnNlZE91dHB1dCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiAobU1ldGFNb2RlbE1hcFtzTWV0YU1vZGVsSWRdIGFzIGFueSkgYXMgQ29udmVydGVyT3V0cHV0O1xufVxuXG5mdW5jdGlvbiBhZGRTeW50aGV0aWNBbm5vdGF0aW9ucyhtZXRhTW9kZWw6IFBhcnNlck91dHB1dCkge1xuXHQvLyBbU2l0dWF0aW9ucyBQT0NdIERldGVybWluZSBtaXhlZC1pbiBzaXR1YXRpb25zIG5hdmlnYXRpb24gcHJvcGVydHkuXG5cdC8vIFRoaXMgd2lsbCBwcm9iYWJseSBoYXBwZW4gZWl0aGVyXG5cdC8vICAtIGJ5IGEgZml4ZWQgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lIChcIlNBUF9fU2l0dWF0aW9uXCIpLCBvclxuXHQvLyAgLSBieSBhbiBlbnRpdHkgdHlwZSBhbm5vdGF0aW9uIHRoYXQgZGVjbGFyZXMgdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgdG8gdXNlIChzaW1pbGFyIHRvIGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcylcblx0Ly9cblx0Ly8gRm9yIG5vdywgd2UgYWRkIGFuICdpbnZlbnRlZCcgYW5ub3RhdGlvbiBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkZpb3JpRWxlbWVudHMudjEuU2l0dWF0aW9uc1wiIGNvbnNpc3Rpbmcgb2YgYSBwYXRoIHRvIHRoZSBzaXR1YXRpb25zIG5hdmlnYXRpb24gcHJvcGVydHlcblx0KChtZXRhTW9kZWwgYXMgYW55KSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVR5cGVzLmZvckVhY2goZW50aXR5VHlwZSA9PiB7XG5cdFx0Y29uc3Qgc2l0dWF0aW9uc05hdlByb3AgPSBlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmQoXG5cdFx0XHRuYXZQcm9wID0+IG5hdlByb3AubmFtZSA9PT0gXCJTQVBfX1NpdHVhdGlvblwiIHx8IG5hdlByb3AubmFtZSA9PT0gXCJfU0FQX19TaXR1YXRpb25cIlxuXHRcdCk7XG5cblx0XHRpZiAoc2l0dWF0aW9uc05hdlByb3ApIHtcblx0XHRcdChlbnRpdHlUeXBlLmFubm90YXRpb25zIGFzIGFueSkuRkUgPSB7XG5cdFx0XHRcdFNpdHVhdGlvbnM6IHtcblx0XHRcdFx0XHR0ZXJtOiBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkZpb3JpRWxlbWVudHMudjEuU2l0dWF0aW9uc1wiLFxuXHRcdFx0XHRcdHR5cGU6IFwiUGF0aFwiLFxuXHRcdFx0XHRcdHBhdGg6IHNpdHVhdGlvbnNOYXZQcm9wLm5hbWUsXG5cdFx0XHRcdFx0JHRhcmdldDogc2l0dWF0aW9uc05hdlByb3Bcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gbWV0YU1vZGVsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlTW9kZWxDYWNoZURhdGEob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpIHtcblx0ZGVsZXRlIG1NZXRhTW9kZWxNYXBbKG9NZXRhTW9kZWwgYXMgYW55KS5pZF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvTWV0YU1vZGVsQ29udGV4dDogQ29udGV4dDxPRGF0YU1ldGFNb2RlbD4sIGJJbmNsdWRlVmlzaXRlZE9iamVjdHM6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XG5cdGNvbnN0IG9Db252ZXJ0ZXJPdXRwdXQgPSBjb252ZXJ0VHlwZXMob01ldGFNb2RlbENvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdGNvbnN0IHNQYXRoID0gb01ldGFNb2RlbENvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdGNvbnN0IGFQYXRoU3BsaXQgPSBzUGF0aC5zcGxpdChcIi9cIik7XG5cdGxldCB0YXJnZXRFbnRpdHlTZXQ6IF9FbnRpdHlTZXQgfCBfU2luZ2xldG9uID0gb0NvbnZlcnRlck91dHB1dC5lbnRpdHlTZXRzLmZpbmQoXG5cdFx0ZW50aXR5U2V0ID0+IGVudGl0eVNldC5uYW1lID09PSBhUGF0aFNwbGl0WzFdXG5cdCkgYXMgX0VudGl0eVNldDtcblx0aWYgKCF0YXJnZXRFbnRpdHlTZXQpIHtcblx0XHR0YXJnZXRFbnRpdHlTZXQgPSBvQ29udmVydGVyT3V0cHV0LnNpbmdsZXRvbnMuZmluZChzaW5nbGV0b24gPT4gc2luZ2xldG9uLm5hbWUgPT09IGFQYXRoU3BsaXRbMV0pIGFzIF9TaW5nbGV0b247XG5cdH1cblx0bGV0IHJlbGF0aXZlUGF0aCA9IGFQYXRoU3BsaXQuc2xpY2UoMikuam9pbihcIi9cIik7XG5cblx0Y29uc3QgbG9jYWxPYmplY3RzOiBhbnlbXSA9IFt0YXJnZXRFbnRpdHlTZXRdO1xuXHR3aGlsZSAocmVsYXRpdmVQYXRoICYmIHJlbGF0aXZlUGF0aC5sZW5ndGggPiAwICYmIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIikpIHtcblx0XHRsZXQgcmVsYXRpdmVTcGxpdCA9IHJlbGF0aXZlUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0bGV0IGlkeCA9IDA7XG5cdFx0bGV0IGN1cnJlbnRFbnRpdHlTZXQsIHNOYXZQcm9wVG9DaGVjaztcblxuXHRcdHJlbGF0aXZlU3BsaXQgPSByZWxhdGl2ZVNwbGl0LnNsaWNlKDEpOyAvLyBSZW1vdmluZyBcIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nXCJcblx0XHR3aGlsZSAoIWN1cnJlbnRFbnRpdHlTZXQgJiYgcmVsYXRpdmVTcGxpdC5sZW5ndGggPiBpZHggJiYgcmVsYXRpdmVTcGxpdFtpZHhdICE9PSBcIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nXCIpIHtcblx0XHRcdC8vIEZpbmRpbmcgdGhlIGNvcnJlY3QgZW50aXR5U2V0IGZvciB0aGUgbmF2aWdhaXRvbiBwcm9wZXJ0eSBiaW5kaW5nIGV4YW1wbGU6IFwiU2V0L19TYWxlc09yZGVyXCJcblx0XHRcdHNOYXZQcm9wVG9DaGVjayA9IHJlbGF0aXZlU3BsaXQuc2xpY2UoMCwgaWR4ICsgMSkuam9pbihcIi9cIik7XG5cdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gdGFyZ2V0RW50aXR5U2V0ICYmIHRhcmdldEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW3NOYXZQcm9wVG9DaGVja107XG5cdFx0XHRpZHgrKztcblx0XHR9XG5cdFx0aWYgKCFjdXJyZW50RW50aXR5U2V0KSB7XG5cdFx0XHQvLyBGYWxsIGJhY2sgdG8gU2luZ2xlIG5hdiBwcm9wIGlmIGVudGl0eVNldCBpcyBub3QgZm91bmQuXG5cdFx0XHRzTmF2UHJvcFRvQ2hlY2sgPSByZWxhdGl2ZVNwbGl0WzBdO1xuXHRcdH1cblx0XHRjb25zdCBhTmF2UHJvcHMgPSBzTmF2UHJvcFRvQ2hlY2s/LnNwbGl0KFwiL1wiKSB8fCBbXTtcblx0XHRsZXQgdGFyZ2V0RW50aXR5VHlwZSA9IHRhcmdldEVudGl0eVNldCAmJiB0YXJnZXRFbnRpdHlTZXQuZW50aXR5VHlwZTtcblx0XHRmb3IgKGNvbnN0IHNOYXZQcm9wIG9mIGFOYXZQcm9wcykge1xuXHRcdFx0Ly8gUHVzaGluZyBhbGwgbmF2IHByb3BzIHRvIHRoZSB2aXNpdGVkIG9iamVjdHMuIGV4YW1wbGU6IFwiU2V0XCIsIFwiX1NhbGVzT3JkZXJcIiBmb3IgXCJTZXQvX1NhbGVzT3JkZXJcIihpbiBOYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nKVxuXHRcdFx0Y29uc3QgdGFyZ2V0TmF2UHJvcCA9IHRhcmdldEVudGl0eVR5cGUgJiYgdGFyZ2V0RW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kKG5hdlByb3AgPT4gbmF2UHJvcC5uYW1lID09PSBzTmF2UHJvcCk7XG5cdFx0XHRpZiAodGFyZ2V0TmF2UHJvcCkge1xuXHRcdFx0XHRsb2NhbE9iamVjdHMucHVzaCh0YXJnZXROYXZQcm9wKTtcblx0XHRcdFx0dGFyZ2V0RW50aXR5VHlwZSA9IHRhcmdldE5hdlByb3AudGFyZ2V0VHlwZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0YXJnZXRFbnRpdHlTZXQgPVxuXHRcdFx0KHRhcmdldEVudGl0eVNldCAmJiBjdXJyZW50RW50aXR5U2V0KSB8fCAodGFyZ2V0RW50aXR5U2V0ICYmIHRhcmdldEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW3JlbGF0aXZlU3BsaXRbMF1dKTtcblx0XHRpZiAodGFyZ2V0RW50aXR5U2V0KSB7XG5cdFx0XHQvLyBQdXNoaW5nIHRoZSB0YXJnZXQgZW50aXR5U2V0IHRvIHZpc2l0ZWQgb2JqZWN0c1xuXHRcdFx0bG9jYWxPYmplY3RzLnB1c2godGFyZ2V0RW50aXR5U2V0KTtcblx0XHR9XG5cdFx0Ly8gUmUtY2FsY3VsYXRpbmcgdGhlIHJlbGF0aXZlIHBhdGhcblx0XHQvLyBBcyBlYWNoIG5hdmlnYXRpb24gbmFtZSBpcyBlbmNsb3NlZCBiZXR3ZWVuICckTmF2aWdhdGlvblByb3BlcnR5QmluZGluZycgYW5kICckJyAodG8gYmUgYWJsZSB0byBhY2Nlc3MgdGhlIGVudGl0eXNldCBlYXNpbHkgaW4gdGhlIG1ldGFtb2RlbClcblx0XHQvLyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgY2xvc2luZyAnJCcgdG8gYmUgYWJsZSB0byBzd2l0Y2ggdG8gdGhlIG5leHQgbmF2aWdhdGlvblxuXHRcdHJlbGF0aXZlU3BsaXQgPSByZWxhdGl2ZVNwbGl0LnNsaWNlKGFOYXZQcm9wcy5sZW5ndGggfHwgMSk7XG5cdFx0aWYgKHJlbGF0aXZlU3BsaXQubGVuZ3RoICYmIHJlbGF0aXZlU3BsaXRbMF0gPT09IFwiJFwiKSB7XG5cdFx0XHRyZWxhdGl2ZVNwbGl0LnNoaWZ0KCk7XG5cdFx0fVxuXHRcdHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlU3BsaXQuam9pbihcIi9cIik7XG5cdH1cblx0aWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiJFR5cGVcIikpIHtcblx0XHQvLyBXZSdyZSBhbnl3YXkgZ29pbmcgdG8gbG9vayBvbiB0aGUgZW50aXR5VHlwZS4uLlxuXHRcdHJlbGF0aXZlUGF0aCA9IGFQYXRoU3BsaXQuc2xpY2UoMykuam9pbihcIi9cIik7XG5cdH1cblx0aWYgKHRhcmdldEVudGl0eVNldCAmJiByZWxhdGl2ZVBhdGgubGVuZ3RoKSB7XG5cdFx0Y29uc3Qgb1RhcmdldCA9IHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlLnJlc29sdmVQYXRoKHJlbGF0aXZlUGF0aCwgYkluY2x1ZGVWaXNpdGVkT2JqZWN0cyk7XG5cdFx0aWYgKG9UYXJnZXQpIHtcblx0XHRcdGlmIChiSW5jbHVkZVZpc2l0ZWRPYmplY3RzKSB7XG5cdFx0XHRcdG9UYXJnZXQudmlzaXRlZE9iamVjdHMgPSBsb2NhbE9iamVjdHMuY29uY2F0KG9UYXJnZXQudmlzaXRlZE9iamVjdHMpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodGFyZ2V0RW50aXR5U2V0LmVudGl0eVR5cGUgJiYgdGFyZ2V0RW50aXR5U2V0LmVudGl0eVR5cGUuYWN0aW9ucykge1xuXHRcdFx0Ly8gaWYgdGFyZ2V0IGlzIGFuIGFjdGlvbiBvciBhbiBhY3Rpb24gcGFyYW1ldGVyXG5cdFx0XHRjb25zdCBhY3Rpb25zID0gdGFyZ2V0RW50aXR5U2V0LmVudGl0eVR5cGUgJiYgdGFyZ2V0RW50aXR5U2V0LmVudGl0eVR5cGUuYWN0aW9ucztcblx0XHRcdGNvbnN0IHJlbGF0aXZlU3BsaXQgPSByZWxhdGl2ZVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0aWYgKGFjdGlvbnNbcmVsYXRpdmVTcGxpdFswXV0pIHtcblx0XHRcdFx0Y29uc3QgYWN0aW9uID0gYWN0aW9uc1tyZWxhdGl2ZVNwbGl0WzBdXTtcblx0XHRcdFx0aWYgKHJlbGF0aXZlU3BsaXRbMV0gJiYgYWN0aW9uLnBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRjb25zdCBwYXJhbWV0ZXJOYW1lID0gcmVsYXRpdmVTcGxpdFsxXTtcblx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXJhbWV0ZXIgPSBhY3Rpb24ucGFyYW1ldGVycy5maW5kKHBhcmFtZXRlciA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVyLmZ1bGx5UXVhbGlmaWVkTmFtZS5lbmRzV2l0aChcIi9cIiArIHBhcmFtZXRlck5hbWUpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiB0YXJnZXRQYXJhbWV0ZXI7XG5cdFx0XHRcdH0gZWxzZSBpZiAocmVsYXRpdmVQYXRoLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdHJldHVybiBhY3Rpb247XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9UYXJnZXQ7XG5cdH0gZWxzZSB7XG5cdFx0aWYgKGJJbmNsdWRlVmlzaXRlZE9iamVjdHMpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldDogdGFyZ2V0RW50aXR5U2V0LFxuXHRcdFx0XHR2aXNpdGVkT2JqZWN0czogbG9jYWxPYmplY3RzXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gdGFyZ2V0RW50aXR5U2V0O1xuXHR9XG59XG5cbnR5cGUgQ29udmVydGVyT2JqZWN0ID0ge1xuXHRfdHlwZTogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWRUYXJnZXQgPSB7XG5cdHRhcmdldD86IENvbnZlcnRlck9iamVjdDtcblx0dmlzaXRlZE9iamVjdHM6IENvbnZlcnRlck9iamVjdFtdO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhcblx0b01ldGFNb2RlbENvbnRleHQ6IENvbnRleHQ8T0RhdGFNZXRhTW9kZWw+LFxuXHRvRW50aXR5U2V0TWV0YU1vZGVsQ29udGV4dD86IENvbnRleHQ8T0RhdGFNZXRhTW9kZWw+XG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0Y29uc3QgbWV0YU1vZGVsQ29udGV4dCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9NZXRhTW9kZWxDb250ZXh0LCB0cnVlKTtcblx0bGV0IHRhcmdldEVudGl0eVNldExvY2F0aW9uO1xuXHRpZiAob0VudGl0eVNldE1ldGFNb2RlbENvbnRleHQgJiYgb0VudGl0eVNldE1ldGFNb2RlbENvbnRleHQuZ2V0UGF0aCgpICE9PSBcIi9cIikge1xuXHRcdHRhcmdldEVudGl0eVNldExvY2F0aW9uID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9FbnRpdHlTZXRNZXRhTW9kZWxDb250ZXh0KTtcblx0fVxuXHRyZXR1cm4gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RGcm9tUGF0aChtZXRhTW9kZWxDb250ZXh0LCB0YXJnZXRFbnRpdHlTZXRMb2NhdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdEZyb21QYXRoKFxuXHRtZXRhTW9kZWxDb250ZXh0OiBSZXNvbHZlZFRhcmdldCxcblx0dGFyZ2V0RW50aXR5U2V0TG9jYXRpb24/OiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0cyA9IG1ldGFNb2RlbENvbnRleHQudmlzaXRlZE9iamVjdHMuZmlsdGVyKFxuXHRcdCh2aXNpdGVkT2JqZWN0OiBhbnkpID0+IHZpc2l0ZWRPYmplY3QgJiYgdmlzaXRlZE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIl90eXBlXCIpICYmIHZpc2l0ZWRPYmplY3QuX3R5cGUgIT09IFwiRW50aXR5VHlwZVwiXG5cdCk7XG5cdGlmIChtZXRhTW9kZWxDb250ZXh0LnRhcmdldCAmJiBtZXRhTW9kZWxDb250ZXh0LnRhcmdldC5oYXNPd25Qcm9wZXJ0eShcIl90eXBlXCIpICYmIG1ldGFNb2RlbENvbnRleHQudGFyZ2V0Ll90eXBlICE9PSBcIkVudGl0eVR5cGVcIikge1xuXHRcdGRhdGFNb2RlbE9iamVjdHMucHVzaChtZXRhTW9kZWxDb250ZXh0LnRhcmdldCk7XG5cdH1cblx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnRpZXM6IF9OYXZpZ2F0aW9uUHJvcGVydHlbXSA9IFtdO1xuXHRjb25zdCByb290RW50aXR5U2V0OiBfRW50aXR5U2V0ID0gZGF0YU1vZGVsT2JqZWN0c1swXSBhcyBfRW50aXR5U2V0O1xuXHQvLyBjdXJyZW50RW50aXR5U2V0IGNhbiBiZSB1bmRlZmluZWQuXG5cdGxldCBjdXJyZW50RW50aXR5U2V0OiBfRW50aXR5U2V0IHwgdW5kZWZpbmVkID0gcm9vdEVudGl0eVNldCBhcyBfRW50aXR5U2V0O1xuXHRsZXQgY3VycmVudEVudGl0eVR5cGU6IF9FbnRpdHlUeXBlID0gcm9vdEVudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRsZXQgaSA9IDE7XG5cdGxldCBjdXJyZW50T2JqZWN0O1xuXHRsZXQgbmF2aWdhdGVkUGF0aHMgPSBbXTtcblx0d2hpbGUgKGkgPCBkYXRhTW9kZWxPYmplY3RzLmxlbmd0aCkge1xuXHRcdGN1cnJlbnRPYmplY3QgPSBkYXRhTW9kZWxPYmplY3RzW2krK107XG5cdFx0aWYgKGN1cnJlbnRPYmplY3QuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpIHtcblx0XHRcdG5hdmlnYXRlZFBhdGhzLnB1c2goY3VycmVudE9iamVjdC5uYW1lKTtcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLnB1c2goY3VycmVudE9iamVjdCBhcyBfTmF2aWdhdGlvblByb3BlcnR5KTtcblx0XHRcdGN1cnJlbnRFbnRpdHlUeXBlID0gKGN1cnJlbnRPYmplY3QgYXMgX05hdmlnYXRpb25Qcm9wZXJ0eSkudGFyZ2V0VHlwZTtcblx0XHRcdGlmIChjdXJyZW50RW50aXR5U2V0ICYmIGN1cnJlbnRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZy5oYXNPd25Qcm9wZXJ0eShuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKSkpIHtcblx0XHRcdFx0Y3VycmVudEVudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tjdXJyZW50T2JqZWN0Lm5hbWVdO1xuXHRcdFx0XHRuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3VycmVudEVudGl0eVNldCA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGN1cnJlbnRPYmplY3QuX3R5cGUgPT09IFwiRW50aXR5U2V0XCIpIHtcblx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBjdXJyZW50T2JqZWN0IGFzIF9FbnRpdHlTZXQ7XG5cdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9IGN1cnJlbnRFbnRpdHlTZXQuZW50aXR5VHlwZTtcblx0XHR9XG5cdH1cblxuXHRpZiAodGFyZ2V0RW50aXR5U2V0TG9jYXRpb24gJiYgdGFyZ2V0RW50aXR5U2V0TG9jYXRpb24uc3RhcnRpbmdFbnRpdHlTZXQgIT09IHJvb3RFbnRpdHlTZXQpIHtcblx0XHQvLyBJbiBjYXNlIHRoZSBlbnRpdHlzZXQgaXMgbm90IHN0YXJ0aW5nIGZyb20gdGhlIHNhbWUgbG9jYXRpb24gaXQgbWF5IG1lYW4gdGhhdCB3ZSBhcmUgZG9pbmcgdG9vIG11Y2ggd29yayBlYXJsaWVyIGZvciBzb21lIHJlYXNvblxuXHRcdC8vIEFzIHN1Y2ggd2UgbmVlZCB0byByZWRlZmluZSB0aGUgY29udGV4dCBzb3VyY2UgZm9yIHRoZSB0YXJnZXRFbnRpdHlTZXRMb2NhdGlvblxuXHRcdGNvbnN0IHN0YXJ0aW5nSW5kZXggPSBkYXRhTW9kZWxPYmplY3RzLmluZGV4T2YodGFyZ2V0RW50aXR5U2V0TG9jYXRpb24uc3RhcnRpbmdFbnRpdHlTZXQpO1xuXHRcdGlmIChzdGFydGluZ0luZGV4ICE9PSAtMSkge1xuXHRcdFx0Ly8gSWYgaXQncyBub3QgZm91bmQgSSBkb24ndCBrbm93IHdoYXQgd2UgY2FuIGRvIChwcm9iYWJseSBub3RoaW5nKVxuXHRcdFx0Y29uc3QgcmVxdWlyZWREYXRhTW9kZWxPYmplY3RzID0gZGF0YU1vZGVsT2JqZWN0cy5zbGljZSgwLCBzdGFydGluZ0luZGV4KTtcblx0XHRcdHRhcmdldEVudGl0eVNldExvY2F0aW9uLnN0YXJ0aW5nRW50aXR5U2V0ID0gcm9vdEVudGl0eVNldDtcblx0XHRcdHRhcmdldEVudGl0eVNldExvY2F0aW9uLm5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gcmVxdWlyZWREYXRhTW9kZWxPYmplY3RzXG5cdFx0XHRcdC5maWx0ZXIoKG9iamVjdDogYW55KSA9PiBvYmplY3QuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpXG5cdFx0XHRcdC5jb25jYXQodGFyZ2V0RW50aXR5U2V0TG9jYXRpb24ubmF2aWdhdGlvblByb3BlcnRpZXMpIGFzIF9OYXZpZ2F0aW9uUHJvcGVydHlbXTtcblx0XHR9XG5cdH1cblx0Y29uc3Qgb3V0RGF0YU1vZGVsUGF0aCA9IHtcblx0XHRzdGFydGluZ0VudGl0eVNldDogcm9vdEVudGl0eVNldCxcblx0XHR0YXJnZXRFbnRpdHlTZXQ6IGN1cnJlbnRFbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogY3VycmVudEVudGl0eVR5cGUsXG5cdFx0dGFyZ2V0T2JqZWN0OiBtZXRhTW9kZWxDb250ZXh0LnRhcmdldCxcblx0XHRuYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRjb250ZXh0TG9jYXRpb246IHRhcmdldEVudGl0eVNldExvY2F0aW9uXG5cdH07XG5cdGlmICghb3V0RGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24pIHtcblx0XHRvdXREYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbiA9IG91dERhdGFNb2RlbFBhdGg7XG5cdH1cblx0cmV0dXJuIG91dERhdGFNb2RlbFBhdGg7XG59XG4iXX0=
|