@sapui5/sap.fe.core 1.97.0 → 1.99.1
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 -4
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +377 -405
- package/src/sap/fe/core/AnnotationHelper.ts +385 -0
- package/src/sap/fe/core/AppComponent.js +6 -3
- package/src/sap/fe/core/AppStateHandler.js +229 -181
- package/src/sap/fe/core/AppStateHandler.ts +171 -0
- package/src/sap/fe/core/BaseController.js +3 -2
- package/src/sap/fe/core/BusyLocker.js +105 -121
- package/src/sap/fe/core/BusyLocker.ts +98 -0
- package/src/sap/fe/core/CommonUtils.js +2073 -2379
- package/src/sap/fe/core/CommonUtils.ts +2078 -0
- package/src/sap/fe/core/ExtensionAPI.js +16 -7
- package/src/sap/fe/core/PageController.js +84 -119
- package/src/sap/fe/core/PageController.ts +101 -0
- package/src/sap/fe/core/RouterProxy.js +986 -807
- package/src/sap/fe/core/RouterProxy.ts +838 -0
- package/src/sap/fe/core/Synchronization.js +51 -35
- package/src/sap/fe/core/Synchronization.ts +29 -0
- package/src/sap/fe/core/TemplateComponent.js +173 -155
- package/src/sap/fe/core/TemplateComponent.ts +166 -0
- package/src/sap/fe/core/TemplateModel.js +97 -54
- package/src/sap/fe/core/TemplateModel.ts +64 -0
- package/src/sap/fe/core/TransactionHelper.js +1576 -1579
- package/src/sap/fe/core/TransactionHelper.ts +1706 -0
- package/src/sap/fe/core/actions/draft.js +560 -581
- package/src/sap/fe/core/actions/draft.ts +594 -0
- package/src/sap/fe/core/actions/messageHandling.js +545 -511
- package/src/sap/fe/core/actions/messageHandling.ts +532 -0
- package/src/sap/fe/core/actions/nonDraft.js +17 -19
- package/src/sap/fe/core/actions/nonDraft.ts +12 -0
- package/src/sap/fe/core/actions/operations.js +1074 -1211
- package/src/sap/fe/core/actions/operations.ts +1162 -0
- package/src/sap/fe/core/actions/sticky.js +102 -105
- package/src/sap/fe/core/actions/sticky.ts +102 -0
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
- package/src/sap/fe/core/controllerextensions/EditFlow.js +229 -260
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +288 -13
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +27 -23
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +82 -46
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +113 -25
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +135 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.js +172 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +22 -9
- package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
- package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
- package/src/sap/fe/core/controllerextensions/Paginator.js +37 -9
- package/src/sap/fe/core/controllerextensions/Placeholder.js +8 -4
- package/src/sap/fe/core/controllerextensions/Routing.js +25 -5
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
- package/src/sap/fe/core/controllerextensions/Share.js +22 -8
- package/src/sap/fe/core/controllerextensions/SideEffects.js +9 -9
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -21
- package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -1
- package/src/sap/fe/core/controls/CommandExecution.js +3 -2
- package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +9 -5
- package/src/sap/fe/core/controls/FieldWrapper.js +18 -23
- package/src/sap/fe/core/controls/FilterBar.js +3 -2
- package/src/sap/fe/core/controls/FormElementWrapper.js +3 -7
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
- package/src/sap/fe/core/converters/ConverterContext.js +14 -2
- package/src/sap/fe/core/converters/ConverterContext.ts +14 -3
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
- package/src/sap/fe/core/converters/ManifestWrapper.js +56 -32
- package/src/sap/fe/core/converters/ManifestWrapper.ts +24 -6
- package/src/sap/fe/core/converters/MetaModelConverter.js +67 -6
- package/src/sap/fe/core/converters/MetaModelConverter.ts +70 -14
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
- package/src/sap/fe/core/converters/annotations/DataField.js +3 -3
- package/src/sap/fe/core/converters/annotations/DataField.ts +1 -1
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
- package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
- package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
- package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Form.js +20 -10
- package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -4
- package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +72 -0
- package/src/sap/fe/core/converters/controls/Common/Table.js +390 -398
- package/src/sap/fe/core/converters/controls/Common/Table.ts +497 -484
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +527 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +655 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +489 -37
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +506 -58
- 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 +17 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
- package/src/sap/fe/core/converters/helpers/Aggregation.js +18 -3
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
- package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -6
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
- package/src/sap/fe/core/formatters/TableFormatter.js +39 -28
- package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
- package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
- package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
- package/src/sap/fe/core/fpm/Component.js +3 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +391 -0
- package/src/sap/fe/core/helpers/BindingExpression.js +484 -437
- package/src/sap/fe/core/helpers/BindingExpression.ts +480 -463
- package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
- package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
- package/src/sap/fe/core/helpers/EditState.js +81 -84
- package/src/sap/fe/core/helpers/EditState.ts +81 -0
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
- package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
- package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
- package/src/sap/fe/core/helpers/MassEditHelper.js +687 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
- package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
- package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
- package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
- package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
- package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
- package/src/sap/fe/core/library.js +30 -3
- package/src/sap/fe/core/library.support.js +12 -5
- 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 +61 -13
- package/src/sap/fe/core/messagebundle_ar.properties +33 -2
- package/src/sap/fe/core/messagebundle_bg.properties +33 -2
- package/src/sap/fe/core/messagebundle_ca.properties +33 -2
- package/src/sap/fe/core/messagebundle_cs.properties +34 -3
- package/src/sap/fe/core/messagebundle_cy.properties +33 -2
- package/src/sap/fe/core/messagebundle_da.properties +33 -2
- package/src/sap/fe/core/messagebundle_de.properties +33 -2
- package/src/sap/fe/core/messagebundle_el.properties +33 -2
- package/src/sap/fe/core/messagebundle_en.properties +32 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +32 -1
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +36 -1
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +33 -2
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +33 -2
- package/src/sap/fe/core/messagebundle_es.properties +33 -2
- package/src/sap/fe/core/messagebundle_es_MX.properties +33 -2
- package/src/sap/fe/core/messagebundle_et.properties +33 -2
- package/src/sap/fe/core/messagebundle_fi.properties +34 -3
- package/src/sap/fe/core/messagebundle_fr.properties +38 -7
- package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -2
- package/src/sap/fe/core/messagebundle_hi.properties +33 -2
- package/src/sap/fe/core/messagebundle_hr.properties +33 -2
- package/src/sap/fe/core/messagebundle_hu.properties +34 -3
- package/src/sap/fe/core/messagebundle_id.properties +36 -5
- package/src/sap/fe/core/messagebundle_it.properties +33 -2
- package/src/sap/fe/core/messagebundle_iw.properties +33 -2
- package/src/sap/fe/core/messagebundle_ja.properties +33 -2
- package/src/sap/fe/core/messagebundle_kk.properties +33 -2
- package/src/sap/fe/core/messagebundle_ko.properties +33 -2
- package/src/sap/fe/core/messagebundle_lt.properties +33 -2
- package/src/sap/fe/core/messagebundle_lv.properties +33 -2
- package/src/sap/fe/core/messagebundle_ms.properties +33 -2
- package/src/sap/fe/core/messagebundle_nl.properties +33 -2
- package/src/sap/fe/core/messagebundle_no.properties +33 -2
- package/src/sap/fe/core/messagebundle_pl.properties +33 -2
- package/src/sap/fe/core/messagebundle_pt.properties +34 -3
- package/src/sap/fe/core/messagebundle_pt_PT.properties +33 -2
- package/src/sap/fe/core/messagebundle_ro.properties +33 -2
- package/src/sap/fe/core/messagebundle_ru.properties +33 -2
- package/src/sap/fe/core/messagebundle_sh.properties +33 -2
- package/src/sap/fe/core/messagebundle_sk.properties +33 -2
- package/src/sap/fe/core/messagebundle_sl.properties +33 -2
- package/src/sap/fe/core/messagebundle_sv.properties +34 -3
- package/src/sap/fe/core/messagebundle_th.properties +33 -2
- package/src/sap/fe/core/messagebundle_tr.properties +33 -2
- package/src/sap/fe/core/messagebundle_uk.properties +33 -2
- package/src/sap/fe/core/messagebundle_vi.properties +33 -2
- package/src/sap/fe/core/messagebundle_zh_CN.properties +33 -2
- package/src/sap/fe/core/messagebundle_zh_TW.properties +33 -2
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +9 -5
- package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -1152
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
- package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
- package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -11
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +42 -85
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +57 -100
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -478
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
- package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +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 +10 -48
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +14 -46
- 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/FieldControlHelper.js +8 -8
- package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
- package/src/sap/fe/core/templating/FilterHelper.js +139 -70
- package/src/sap/fe/core/templating/FilterHelper.ts +140 -70
- 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 +45 -110
- package/src/sap/fe/core/templating/UIFormatters.ts +39 -75
- package/src/sap/fe/core/type/Email.js +1 -1
- package/src/sap/fe/core/type/Email.ts +4 -6
- package/ui5.yaml +0 -3
- package/src/sap/fe/core/controls/filterbar.d.js +0 -8
- package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
|
@@ -16,6 +16,12 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
16
16
|
|
|
17
17
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
18
18
|
|
|
19
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
20
|
+
|
|
21
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
22
|
+
|
|
23
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
24
|
+
|
|
19
25
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
20
26
|
|
|
21
27
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
@@ -34,15 +40,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
34
40
|
_exports.unresolveableExpression = unresolveableExpression;
|
|
35
41
|
|
|
36
42
|
function escapeXmlAttribute(inputString) {
|
|
37
|
-
return inputString.replace(/
|
|
38
|
-
switch (c) {
|
|
39
|
-
case "'":
|
|
40
|
-
return "\\'";
|
|
41
|
-
|
|
42
|
-
default:
|
|
43
|
-
return c;
|
|
44
|
-
}
|
|
45
|
-
});
|
|
43
|
+
return inputString.replace(/'/g, "\\'");
|
|
46
44
|
}
|
|
47
45
|
|
|
48
46
|
function hasUnresolveableExpression() {
|
|
@@ -97,7 +95,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
97
95
|
return _checkExpressionsAreEqual(a.condition, b.condition) && _checkExpressionsAreEqual(a.onTrue, b.onTrue) && _checkExpressionsAreEqual(a.onFalse, b.onFalse);
|
|
98
96
|
|
|
99
97
|
case "Comparison":
|
|
100
|
-
return a.operator
|
|
98
|
+
return a.operator === b.operator && _checkExpressionsAreEqual(a.operand1, b.operand1) && _checkExpressionsAreEqual(a.operand2, b.operand2);
|
|
101
99
|
|
|
102
100
|
case "Concat":
|
|
103
101
|
var aExpressions = a.expressions;
|
|
@@ -111,6 +109,9 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
111
109
|
return _checkExpressionsAreEqual(expression, bExpressions[index]);
|
|
112
110
|
});
|
|
113
111
|
|
|
112
|
+
case "Length":
|
|
113
|
+
return _checkExpressionsAreEqual(a.bindingExpression, b.bindingExpression);
|
|
114
|
+
|
|
114
115
|
case "Binding":
|
|
115
116
|
return a.modelName === b.modelName && a.path === b.path && a.targetEntitySet === b.targetEntitySet;
|
|
116
117
|
|
|
@@ -141,6 +142,8 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
141
142
|
case "Ref":
|
|
142
143
|
return a.ref === b.ref;
|
|
143
144
|
}
|
|
145
|
+
|
|
146
|
+
return false;
|
|
144
147
|
}
|
|
145
148
|
/**
|
|
146
149
|
* Converts a nested SetExpression by inlining operands of type SetExpression with the same operator.
|
|
@@ -178,24 +181,16 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
178
181
|
|
|
179
182
|
|
|
180
183
|
function hasOppositeExpressions(expressions) {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
var i = expressions.length;
|
|
186
|
-
|
|
187
|
-
while (i--) {
|
|
188
|
-
var expression = expressions[i];
|
|
189
|
-
var negatedExpression = not(expression);
|
|
190
|
-
|
|
191
|
-
for (var j = 0; j < i; j++) {
|
|
192
|
-
if (_checkExpressionsAreEqual(expressions[j], negatedExpression)) {
|
|
184
|
+
var negatedExpressions = expressions.map(not);
|
|
185
|
+
return expressions.some(function (expression, index) {
|
|
186
|
+
for (var i = index + 1; i < negatedExpressions.length; i++) {
|
|
187
|
+
if (_checkExpressionsAreEqual(expression, negatedExpressions[i])) {
|
|
193
188
|
return true;
|
|
194
189
|
}
|
|
195
190
|
}
|
|
196
|
-
}
|
|
197
191
|
|
|
198
|
-
|
|
192
|
+
return false;
|
|
193
|
+
});
|
|
199
194
|
}
|
|
200
195
|
/**
|
|
201
196
|
* Logical `and` expression.
|
|
@@ -225,7 +220,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
225
220
|
|
|
226
221
|
var isStaticFalse = false;
|
|
227
222
|
var nonTrivialExpression = expressions.filter(function (expression) {
|
|
228
|
-
if (
|
|
223
|
+
if (isFalse(expression)) {
|
|
229
224
|
isStaticFalse = true;
|
|
230
225
|
}
|
|
231
226
|
|
|
@@ -236,8 +231,8 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
236
231
|
return constant(false);
|
|
237
232
|
} else if (nonTrivialExpression.length === 0) {
|
|
238
233
|
// Resolve the constant then
|
|
239
|
-
var isValid = expressions.reduce(function (
|
|
240
|
-
return
|
|
234
|
+
var isValid = expressions.reduce(function (result, expression) {
|
|
235
|
+
return result && isTrue(expression);
|
|
241
236
|
}, true);
|
|
242
237
|
return constant(isValid);
|
|
243
238
|
} else if (nonTrivialExpression.length === 1) {
|
|
@@ -282,7 +277,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
282
277
|
|
|
283
278
|
var isStaticTrue = false;
|
|
284
279
|
var nonTrivialExpression = expressions.filter(function (expression) {
|
|
285
|
-
if (
|
|
280
|
+
if (isTrue(expression)) {
|
|
286
281
|
isStaticTrue = true;
|
|
287
282
|
}
|
|
288
283
|
|
|
@@ -293,8 +288,8 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
293
288
|
return constant(true);
|
|
294
289
|
} else if (nonTrivialExpression.length === 0) {
|
|
295
290
|
// Resolve the constant then
|
|
296
|
-
var isValid = expressions.reduce(function (
|
|
297
|
-
return
|
|
291
|
+
var isValid = expressions.reduce(function (result, expression) {
|
|
292
|
+
return result && isTrue(expression);
|
|
298
293
|
}, true);
|
|
299
294
|
return constant(isValid);
|
|
300
295
|
} else if (nonTrivialExpression.length === 1) {
|
|
@@ -342,31 +337,43 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
342
337
|
// Create the reverse comparison
|
|
343
338
|
switch (operand.operator) {
|
|
344
339
|
case "!==":
|
|
345
|
-
return
|
|
340
|
+
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
341
|
+
operator: "==="
|
|
342
|
+
});
|
|
346
343
|
|
|
347
344
|
case "<":
|
|
348
|
-
return
|
|
345
|
+
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
346
|
+
operator: ">="
|
|
347
|
+
});
|
|
349
348
|
|
|
350
349
|
case "<=":
|
|
351
|
-
return
|
|
350
|
+
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
351
|
+
operator: ">"
|
|
352
|
+
});
|
|
352
353
|
|
|
353
354
|
case "===":
|
|
354
|
-
return
|
|
355
|
+
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
356
|
+
operator: "!=="
|
|
357
|
+
});
|
|
355
358
|
|
|
356
359
|
case ">":
|
|
357
|
-
return
|
|
360
|
+
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
361
|
+
operator: "<="
|
|
362
|
+
});
|
|
358
363
|
|
|
359
364
|
case ">=":
|
|
360
|
-
return
|
|
365
|
+
return _objectSpread(_objectSpread({}, operand), {}, {
|
|
366
|
+
operator: "<"
|
|
367
|
+
});
|
|
361
368
|
}
|
|
362
369
|
} else if (operand._type === "Not") {
|
|
363
370
|
return operand.operand;
|
|
364
|
-
} else {
|
|
365
|
-
return {
|
|
366
|
-
_type: "Not",
|
|
367
|
-
operand: operand
|
|
368
|
-
};
|
|
369
371
|
}
|
|
372
|
+
|
|
373
|
+
return {
|
|
374
|
+
_type: "Not",
|
|
375
|
+
operand: operand
|
|
376
|
+
};
|
|
370
377
|
}
|
|
371
378
|
/**
|
|
372
379
|
* Evaluates whether a binding expression is equal to true with a loose equality.
|
|
@@ -449,17 +456,19 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
449
456
|
} else if (isPrimitiveObject(value)) {
|
|
450
457
|
constantValue = value.valueOf();
|
|
451
458
|
} else {
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
459
|
+
constantValue = Object.entries(value).reduce(function (plainExpression, _ref) {
|
|
460
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
461
|
+
key = _ref2[0],
|
|
462
|
+
val = _ref2[1];
|
|
455
463
|
|
|
456
|
-
|
|
457
|
-
|
|
464
|
+
var wrappedValue = wrapPrimitive(val);
|
|
465
|
+
|
|
466
|
+
if (wrappedValue._type !== "Constant" || wrappedValue.value !== undefined) {
|
|
467
|
+
plainExpression[key] = wrappedValue;
|
|
458
468
|
}
|
|
459
469
|
|
|
460
|
-
return
|
|
470
|
+
return plainExpression;
|
|
461
471
|
}, {});
|
|
462
|
-
constantValue = obj;
|
|
463
472
|
}
|
|
464
473
|
} else {
|
|
465
474
|
constantValue = value;
|
|
@@ -487,18 +496,10 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
487
496
|
value: value
|
|
488
497
|
};
|
|
489
498
|
}
|
|
499
|
+
} else if (targetType === "boolean" && typeof value === "string" && (value === "true" || value === "false")) {
|
|
500
|
+
return constant(value === "true");
|
|
490
501
|
} else {
|
|
491
|
-
|
|
492
|
-
case "boolean":
|
|
493
|
-
if (typeof value === "string" && (value === "true" || value === "false")) {
|
|
494
|
-
return constant(value === "true");
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
return constant(value);
|
|
498
|
-
|
|
499
|
-
default:
|
|
500
|
-
return constant(value);
|
|
501
|
-
}
|
|
502
|
+
return constant(value);
|
|
502
503
|
}
|
|
503
504
|
}
|
|
504
505
|
/**
|
|
@@ -506,17 +507,17 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
506
507
|
*
|
|
507
508
|
* @see fn
|
|
508
509
|
*
|
|
509
|
-
* @param
|
|
510
|
+
* @param reference Reference
|
|
510
511
|
* @returns {ReferenceExpression} The object reference binding part
|
|
511
512
|
*/
|
|
512
513
|
|
|
513
514
|
|
|
514
515
|
_exports.resolveBindingString = resolveBindingString;
|
|
515
516
|
|
|
516
|
-
function ref(
|
|
517
|
+
function ref(reference) {
|
|
517
518
|
return {
|
|
518
519
|
_type: "Ref",
|
|
519
|
-
ref:
|
|
520
|
+
ref: reference
|
|
520
521
|
};
|
|
521
522
|
}
|
|
522
523
|
/**
|
|
@@ -563,6 +564,16 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
563
564
|
function isConstant(maybeConstant) {
|
|
564
565
|
return typeof maybeConstant !== "object" || maybeConstant._type === "Constant";
|
|
565
566
|
}
|
|
567
|
+
|
|
568
|
+
_exports.isConstant = isConstant;
|
|
569
|
+
|
|
570
|
+
function isTrue(expression) {
|
|
571
|
+
return isConstant(expression) && expression.value === true;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
function isFalse(expression) {
|
|
575
|
+
return isConstant(expression) && expression.value === false;
|
|
576
|
+
}
|
|
566
577
|
/**
|
|
567
578
|
* Checks if the expression or value provided is binding or not.
|
|
568
579
|
*
|
|
@@ -572,8 +583,6 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
572
583
|
*/
|
|
573
584
|
|
|
574
585
|
|
|
575
|
-
_exports.isConstant = isConstant;
|
|
576
|
-
|
|
577
586
|
function isBinding(maybeBinding) {
|
|
578
587
|
return typeof maybeBinding === "object" && maybeBinding._type === "Binding";
|
|
579
588
|
}
|
|
@@ -604,83 +613,85 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
604
613
|
}
|
|
605
614
|
}
|
|
606
615
|
/**
|
|
607
|
-
* Check if the passed annotation
|
|
616
|
+
* Check if the passed annotation annotationValue is a ComplexAnnotationExpression.
|
|
608
617
|
*
|
|
609
618
|
* @template T The target type
|
|
610
|
-
* @param
|
|
619
|
+
* @param annotationValue The annotation annotationValue to evaluate
|
|
611
620
|
* @returns {boolean} `true` if the object is a {ComplexAnnotationExpression}
|
|
612
621
|
*/
|
|
613
622
|
|
|
614
623
|
|
|
615
|
-
function isComplexAnnotationExpression(
|
|
616
|
-
return typeof
|
|
624
|
+
function isComplexAnnotationExpression(annotationValue) {
|
|
625
|
+
return typeof annotationValue === "object" && !isPrimitiveObject(annotationValue);
|
|
617
626
|
}
|
|
618
627
|
/**
|
|
619
|
-
* Generate the corresponding
|
|
628
|
+
* Generate the corresponding annotationValue for a given annotation annotationValue.
|
|
620
629
|
*
|
|
621
630
|
* @template T The target type
|
|
622
|
-
* @param
|
|
631
|
+
* @param annotationValue The source annotation annotationValue
|
|
623
632
|
* @param visitedNavigationPaths The path from the root entity set
|
|
624
|
-
* @param defaultValue Default value if the
|
|
633
|
+
* @param defaultValue Default value if the annotationValue is undefined
|
|
625
634
|
* @param pathVisitor A function to modify the resulting path
|
|
626
|
-
* @returns {Expression<T>} The
|
|
635
|
+
* @returns {Expression<T>} The annotationValue equivalent to that annotation annotationValue
|
|
627
636
|
*/
|
|
628
637
|
|
|
629
638
|
|
|
630
|
-
function annotationExpression(
|
|
639
|
+
function annotationExpression(annotationValue) {
|
|
631
640
|
var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
632
641
|
var defaultValue = arguments.length > 2 ? arguments[2] : undefined;
|
|
633
642
|
var pathVisitor = arguments.length > 3 ? arguments[3] : undefined;
|
|
634
643
|
|
|
635
|
-
if (
|
|
644
|
+
if (annotationValue === undefined) {
|
|
636
645
|
return wrapPrimitive(defaultValue);
|
|
637
646
|
}
|
|
638
647
|
|
|
639
|
-
if (!isComplexAnnotationExpression(
|
|
640
|
-
return constant(
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
648
|
+
if (!isComplexAnnotationExpression(annotationValue)) {
|
|
649
|
+
return constant(annotationValue);
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
switch (annotationValue.type) {
|
|
653
|
+
case "Path":
|
|
654
|
+
return bindingExpression(annotationValue.path, undefined, visitedNavigationPaths, pathVisitor);
|
|
645
655
|
|
|
646
|
-
|
|
647
|
-
|
|
656
|
+
case "If":
|
|
657
|
+
return annotationIfExpression(annotationValue.If, visitedNavigationPaths, pathVisitor);
|
|
648
658
|
|
|
649
|
-
|
|
650
|
-
|
|
659
|
+
case "Not":
|
|
660
|
+
return not(parseAnnotationCondition(annotationValue.Not, visitedNavigationPaths, pathVisitor));
|
|
651
661
|
|
|
652
|
-
|
|
653
|
-
|
|
662
|
+
case "Eq":
|
|
663
|
+
return equal(parseAnnotationCondition(annotationValue.Eq[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Eq[1], visitedNavigationPaths, pathVisitor));
|
|
654
664
|
|
|
655
|
-
|
|
656
|
-
|
|
665
|
+
case "Ne":
|
|
666
|
+
return notEqual(parseAnnotationCondition(annotationValue.Ne[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Ne[1], visitedNavigationPaths, pathVisitor));
|
|
657
667
|
|
|
658
|
-
|
|
659
|
-
|
|
668
|
+
case "Gt":
|
|
669
|
+
return greaterThan(parseAnnotationCondition(annotationValue.Gt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Gt[1], visitedNavigationPaths, pathVisitor));
|
|
660
670
|
|
|
661
|
-
|
|
662
|
-
|
|
671
|
+
case "Ge":
|
|
672
|
+
return greaterOrEqual(parseAnnotationCondition(annotationValue.Ge[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Ge[1], visitedNavigationPaths, pathVisitor));
|
|
663
673
|
|
|
664
|
-
|
|
665
|
-
|
|
674
|
+
case "Lt":
|
|
675
|
+
return lessThan(parseAnnotationCondition(annotationValue.Lt[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Lt[1], visitedNavigationPaths, pathVisitor));
|
|
666
676
|
|
|
667
|
-
|
|
668
|
-
|
|
677
|
+
case "Le":
|
|
678
|
+
return lessOrEqual(parseAnnotationCondition(annotationValue.Le[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue.Le[1], visitedNavigationPaths, pathVisitor));
|
|
669
679
|
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
680
|
+
case "Or":
|
|
681
|
+
return or.apply(void 0, _toConsumableArray(annotationValue.Or.map(function (orCondition) {
|
|
682
|
+
return parseAnnotationCondition(orCondition, visitedNavigationPaths, pathVisitor);
|
|
683
|
+
})));
|
|
674
684
|
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
685
|
+
case "And":
|
|
686
|
+
return and.apply(void 0, _toConsumableArray(annotationValue.And.map(function (andCondition) {
|
|
687
|
+
return parseAnnotationCondition(andCondition, visitedNavigationPaths, pathVisitor);
|
|
688
|
+
})));
|
|
679
689
|
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
}
|
|
690
|
+
case "Apply":
|
|
691
|
+
return annotationApplyExpression(annotationValue, visitedNavigationPaths, pathVisitor);
|
|
683
692
|
}
|
|
693
|
+
|
|
694
|
+
return unresolveableExpression;
|
|
684
695
|
}
|
|
685
696
|
/**
|
|
686
697
|
* Parse the annotation condition into an expression.
|
|
@@ -738,36 +749,36 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
738
749
|
}, visitedNavigationPaths, undefined, pathVisitor);
|
|
739
750
|
} else if (annotationValue.hasOwnProperty("$EnumMember")) {
|
|
740
751
|
return constant(resolveEnumValue(annotationValue.$EnumMember));
|
|
741
|
-
} else {
|
|
742
|
-
return constant(false);
|
|
743
752
|
}
|
|
753
|
+
|
|
754
|
+
return constant(false);
|
|
744
755
|
}
|
|
745
756
|
/**
|
|
746
757
|
* Process the {IfAnnotationExpressionValue} into an expression.
|
|
747
758
|
*
|
|
748
759
|
* @template T The target type
|
|
749
|
-
* @param
|
|
760
|
+
* @param annotationValue An If expression returning the type T
|
|
750
761
|
* @param visitedNavigationPaths The path from the root entity set
|
|
751
762
|
* @param pathVisitor A function to modify the resulting path
|
|
752
763
|
* @returns {Expression<T>} The equivalent ifElse expression
|
|
753
764
|
*/
|
|
754
765
|
|
|
755
766
|
|
|
756
|
-
function annotationIfExpression(
|
|
767
|
+
function annotationIfExpression(annotationValue) {
|
|
757
768
|
var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
758
769
|
var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
|
|
759
|
-
return ifElse(parseAnnotationCondition(
|
|
770
|
+
return ifElse(parseAnnotationCondition(annotationValue[0], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue[1], visitedNavigationPaths, pathVisitor), parseAnnotationCondition(annotationValue[2], visitedNavigationPaths, pathVisitor));
|
|
760
771
|
}
|
|
761
772
|
|
|
762
773
|
_exports.annotationIfExpression = annotationIfExpression;
|
|
763
774
|
|
|
764
|
-
function annotationApplyExpression(
|
|
775
|
+
function annotationApplyExpression(applyExpression) {
|
|
765
776
|
var visitedNavigationPaths = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
766
777
|
var pathVisitor = arguments.length > 2 ? arguments[2] : undefined;
|
|
767
778
|
|
|
768
|
-
switch (
|
|
779
|
+
switch (applyExpression.Function) {
|
|
769
780
|
case "odata.concat":
|
|
770
|
-
return concat.apply(void 0, _toConsumableArray(
|
|
781
|
+
return concat.apply(void 0, _toConsumableArray(applyExpression.Apply.map(function (applyParam) {
|
|
771
782
|
var applyParamConverted = applyParam;
|
|
772
783
|
|
|
773
784
|
if (applyParam.hasOwnProperty("$Path")) {
|
|
@@ -790,8 +801,9 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
790
801
|
|
|
791
802
|
return annotationExpression(applyParamConverted, visitedNavigationPaths, undefined, pathVisitor);
|
|
792
803
|
})));
|
|
793
|
-
break;
|
|
794
804
|
}
|
|
805
|
+
|
|
806
|
+
return unresolveableExpression;
|
|
795
807
|
}
|
|
796
808
|
/**
|
|
797
809
|
* Generic helper for the comparison operations (equal, notEqual, ...).
|
|
@@ -815,10 +827,6 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
815
827
|
}
|
|
816
828
|
|
|
817
829
|
if (isConstant(leftExpression) && isConstant(rightExpression)) {
|
|
818
|
-
if (leftExpression.value === undefined || rightExpression.value === undefined) {
|
|
819
|
-
return constant(leftExpression.value === rightExpression.value);
|
|
820
|
-
}
|
|
821
|
-
|
|
822
830
|
switch (operator) {
|
|
823
831
|
case "!==":
|
|
824
832
|
return constant(leftExpression.value !== rightExpression.value);
|
|
@@ -836,7 +844,6 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
836
844
|
return constant(leftExpression.value >= rightExpression.value);
|
|
837
845
|
|
|
838
846
|
case "===":
|
|
839
|
-
default:
|
|
840
847
|
return constant(leftExpression.value === rightExpression.value);
|
|
841
848
|
}
|
|
842
849
|
} else {
|
|
@@ -848,6 +855,17 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
848
855
|
};
|
|
849
856
|
}
|
|
850
857
|
}
|
|
858
|
+
|
|
859
|
+
function length(expression) {
|
|
860
|
+
if (expression._type === "Unresolveable") {
|
|
861
|
+
return expression;
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
return {
|
|
865
|
+
_type: "Length",
|
|
866
|
+
bindingExpression: expression
|
|
867
|
+
};
|
|
868
|
+
}
|
|
851
869
|
/**
|
|
852
870
|
* Comparison: "equal" (===).
|
|
853
871
|
*
|
|
@@ -858,7 +876,11 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
858
876
|
*/
|
|
859
877
|
|
|
860
878
|
|
|
879
|
+
_exports.length = length;
|
|
880
|
+
|
|
861
881
|
function equal(leftOperand, rightOperand) {
|
|
882
|
+
var _reduce;
|
|
883
|
+
|
|
862
884
|
var leftExpression = wrapPrimitive(leftOperand);
|
|
863
885
|
var rightExpression = wrapPrimitive(rightOperand);
|
|
864
886
|
|
|
@@ -868,24 +890,31 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
868
890
|
|
|
869
891
|
if (_checkExpressionsAreEqual(leftExpression, rightExpression)) {
|
|
870
892
|
return constant(true);
|
|
871
|
-
} // ((a === c) === true) => (a === c)
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
if (leftExpression._type === "Comparison" && isConstant(rightExpression) && rightExpression.value === true) {
|
|
875
|
-
return leftExpression;
|
|
876
|
-
} else if (leftExpression._type === "Comparison" && isConstant(rightExpression) && rightExpression.value === true) {
|
|
877
|
-
// ((a === c) === false) => !(a === c)
|
|
878
|
-
return not(leftExpression);
|
|
879
|
-
} else if (leftExpression._type === "IfElse" && _checkExpressionsAreEqual(leftExpression.onTrue, rightExpression)) {
|
|
880
|
-
// (if(xxxx) { aaa } else { bbb } ) === aaa )
|
|
881
|
-
return or(leftExpression.condition, equal(leftExpression.onFalse, rightExpression));
|
|
882
|
-
} else if (leftExpression._type === "IfElse" && _checkExpressionsAreEqual(leftExpression.onFalse, rightExpression)) {
|
|
883
|
-
return or(not(leftExpression.condition), equal(leftExpression.onTrue, rightExpression));
|
|
884
|
-
} else if (leftExpression._type === "IfElse" && isConstant(leftExpression.onTrue) && isConstant(rightExpression) && isConstant(leftExpression.onFalse) && !_checkExpressionsAreEqual(leftExpression.onTrue, rightExpression) && !_checkExpressionsAreEqual(leftExpression.onFalse, rightExpression)) {
|
|
885
|
-
return constant(false);
|
|
886
893
|
}
|
|
887
894
|
|
|
888
|
-
|
|
895
|
+
function reduce(left, right) {
|
|
896
|
+
if (left._type === "Comparison" && isTrue(right)) {
|
|
897
|
+
// compare(a, b) === true ~~> compare(a, b)
|
|
898
|
+
return left;
|
|
899
|
+
} else if (left._type === "Comparison" && isFalse(right)) {
|
|
900
|
+
// compare(a, b) === false ~~> !compare(a, b)
|
|
901
|
+
return not(left);
|
|
902
|
+
} else if (left._type === "IfElse" && _checkExpressionsAreEqual(left.onTrue, right)) {
|
|
903
|
+
// (if (x) { a } else { b }) === a ~~> x || (b === a)
|
|
904
|
+
return or(left.condition, equal(left.onFalse, right));
|
|
905
|
+
} else if (left._type === "IfElse" && _checkExpressionsAreEqual(left.onFalse, right)) {
|
|
906
|
+
// (if (x) { a } else { b }) === b ~~> !x || (a === b)
|
|
907
|
+
return or(not(left.condition), equal(left.onTrue, right));
|
|
908
|
+
} else if (left._type === "IfElse" && isConstant(left.onTrue) && isConstant(left.onFalse) && isConstant(right) && !_checkExpressionsAreEqual(left.onTrue, right) && !_checkExpressionsAreEqual(left.onFalse, right)) {
|
|
909
|
+
return constant(false);
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
return undefined;
|
|
913
|
+
} // exploit symmetry: a === b <~> b === a
|
|
914
|
+
|
|
915
|
+
|
|
916
|
+
var reduced = (_reduce = reduce(leftExpression, rightExpression)) !== null && _reduce !== void 0 ? _reduce : reduce(rightExpression, leftExpression);
|
|
917
|
+
return reduced !== null && reduced !== void 0 ? reduced : comparison("===", leftExpression, rightExpression);
|
|
889
918
|
}
|
|
890
919
|
/**
|
|
891
920
|
* Comparison: "not equal" (!==).
|
|
@@ -900,29 +929,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
900
929
|
_exports.equal = equal;
|
|
901
930
|
|
|
902
931
|
function notEqual(leftOperand, rightOperand) {
|
|
903
|
-
|
|
904
|
-
var rightExpression = wrapPrimitive(rightOperand);
|
|
905
|
-
|
|
906
|
-
if (_checkExpressionsAreEqual(leftExpression, rightExpression)) {
|
|
907
|
-
return constant(false);
|
|
908
|
-
} // ((a === c) !== true) => !(a === c)
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
if (leftExpression._type === "Comparison" && isConstant(rightExpression) && rightExpression.value === true) {
|
|
912
|
-
return not(leftExpression);
|
|
913
|
-
} else if (leftExpression._type === "Comparison" && isConstant(rightExpression) && rightExpression.value === true) {
|
|
914
|
-
// ((a === c) !== false) => (a === c)
|
|
915
|
-
return leftExpression;
|
|
916
|
-
} else if (leftExpression._type === "IfElse" && _checkExpressionsAreEqual(leftExpression.onTrue, rightExpression)) {
|
|
917
|
-
return and(not(leftExpression.condition), notEqual(leftExpression.onFalse, rightExpression));
|
|
918
|
-
} else if (leftExpression._type === "IfElse" && _checkExpressionsAreEqual(leftExpression.onFalse, rightExpression)) {
|
|
919
|
-
return and(leftExpression.condition, notEqual(leftExpression.onTrue, rightExpression));
|
|
920
|
-
} else if (leftExpression._type === "IfElse" && isConstant(leftExpression.onTrue) && isConstant(rightExpression) && isConstant(leftExpression.onFalse) && !_checkExpressionsAreEqual(leftExpression.onTrue, rightExpression) && !_checkExpressionsAreEqual(leftExpression.onFalse, rightExpression)) {
|
|
921
|
-
// If the left expression is an if else where both onTrue and onFalse are not equals to the right expression -> simplify as true
|
|
922
|
-
return constant(true);
|
|
923
|
-
}
|
|
924
|
-
|
|
925
|
-
return comparison("!==", leftExpression, rightExpression);
|
|
932
|
+
return not(equal(leftOperand, rightOperand));
|
|
926
933
|
}
|
|
927
934
|
/**
|
|
928
935
|
* Comparison: "greater or equal" (>=).
|
|
@@ -1011,9 +1018,9 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
1011
1018
|
|
|
1012
1019
|
if (conditionExpression._type === "Not") {
|
|
1013
1020
|
// ifElse(not(X), a, b) --> ifElse(X, b, a)
|
|
1014
|
-
var
|
|
1015
|
-
onTrueExpression =
|
|
1016
|
-
onFalseExpression =
|
|
1021
|
+
var _ref3 = [onFalseExpression, onTrueExpression];
|
|
1022
|
+
onTrueExpression = _ref3[0];
|
|
1023
|
+
onFalseExpression = _ref3[1];
|
|
1017
1024
|
conditionExpression = not(conditionExpression);
|
|
1018
1025
|
} // inline nested if-else expressions: onTrue branch
|
|
1019
1026
|
// ifElse(X, ifElse(X, a, b), c) ==> ifElse(X, a, c)
|
|
@@ -1027,50 +1034,40 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
1027
1034
|
|
|
1028
1035
|
if (onFalseExpression._type === "IfElse" && _checkExpressionsAreEqual(conditionExpression, onFalseExpression.condition)) {
|
|
1029
1036
|
onFalseExpression = onFalseExpression.onFalse;
|
|
1030
|
-
} //
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
if (conditionExpression._type === "IfElse") {
|
|
1034
|
-
if (isConstant(conditionExpression.onFalse) && !conditionExpression.onFalse.value && isConstant(conditionExpression.onTrue) && conditionExpression.onTrue.value) {
|
|
1035
|
-
// ifElse(ifElse(X, true, false), a, b) ==> ifElse(X, a, b)
|
|
1036
|
-
conditionExpression = conditionExpression.condition;
|
|
1037
|
-
} else if (isConstant(conditionExpression.onFalse) && conditionExpression.onFalse.value && isConstant(conditionExpression.onTrue) && !conditionExpression.onTrue.value) {
|
|
1038
|
-
// ifElse(ifElse(X, false, true), a, b) ==> ifElse(not(X), a, b)
|
|
1039
|
-
conditionExpression = not(conditionExpression.condition);
|
|
1040
|
-
} else if (isConstant(conditionExpression.onTrue) && !conditionExpression.onTrue.value && !isConstant(conditionExpression.onFalse)) {
|
|
1041
|
-
// ifElse(ifElse(X, false, a), b, c) ==> ifElse(and(not(X), a), b, c)
|
|
1042
|
-
conditionExpression = and(not(conditionExpression.condition), conditionExpression.onFalse);
|
|
1043
|
-
}
|
|
1044
|
-
} // again swap branches if needed (in case one of the optimizations above led to a negated condition)
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
if (conditionExpression._type === "Not") {
|
|
1048
|
-
// ifElse(not(X), a, b) --> ifElse(X, b, a)
|
|
1049
|
-
var _ref2 = [onFalseExpression, onTrueExpression];
|
|
1050
|
-
onTrueExpression = _ref2[0];
|
|
1051
|
-
onFalseExpression = _ref2[1];
|
|
1052
|
-
conditionExpression = not(conditionExpression);
|
|
1053
|
-
} // compute expression result for constant conditions
|
|
1037
|
+
} // (if true then a else b) ~~> a
|
|
1038
|
+
// (if false then a else b) ~~> b
|
|
1054
1039
|
|
|
1055
1040
|
|
|
1056
1041
|
if (isConstant(conditionExpression)) {
|
|
1057
1042
|
return conditionExpression.value ? onTrueExpression : onFalseExpression;
|
|
1058
|
-
} //
|
|
1043
|
+
} // if (isConstantBoolean(onTrueExpression) || isConstantBoolean(onFalseExpression)) {
|
|
1044
|
+
// return or(and(condition, onTrueExpression as Expression<boolean>), and(not(condition), onFalseExpression as Expression<boolean>)) as Expression<T>
|
|
1045
|
+
// }
|
|
1046
|
+
// (if X then a else a) ~~> a
|
|
1059
1047
|
|
|
1060
1048
|
|
|
1061
1049
|
if (_checkExpressionsAreEqual(onTrueExpression, onFalseExpression)) {
|
|
1062
1050
|
return onTrueExpression;
|
|
1063
|
-
} //
|
|
1064
|
-
// If(Condition) Then XXX Else False -> Condition && XXX
|
|
1051
|
+
} // if X then a else false ~~> X && a
|
|
1065
1052
|
|
|
1066
1053
|
|
|
1067
|
-
if (
|
|
1054
|
+
if (isFalse(onFalseExpression)) {
|
|
1068
1055
|
return and(conditionExpression, onTrueExpression);
|
|
1069
|
-
} //
|
|
1056
|
+
} // if X then a else true ~~> !X || a
|
|
1057
|
+
|
|
1070
1058
|
|
|
1059
|
+
if (isTrue(onFalseExpression)) {
|
|
1060
|
+
return or(not(conditionExpression), onTrueExpression);
|
|
1061
|
+
} // if X then false else a ~~> !X && a
|
|
1071
1062
|
|
|
1072
|
-
|
|
1063
|
+
|
|
1064
|
+
if (isFalse(onTrueExpression)) {
|
|
1073
1065
|
return and(not(conditionExpression), onFalseExpression);
|
|
1066
|
+
} // if X then true else a ~~> X || a
|
|
1067
|
+
|
|
1068
|
+
|
|
1069
|
+
if (isTrue(onTrueExpression)) {
|
|
1070
|
+
return or(conditionExpression, onFalseExpression);
|
|
1074
1071
|
}
|
|
1075
1072
|
|
|
1076
1073
|
return {
|
|
@@ -1215,7 +1212,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
1215
1212
|
/**
|
|
1216
1213
|
* Function call, optionally with arguments.
|
|
1217
1214
|
*
|
|
1218
|
-
* @param
|
|
1215
|
+
* @param func Function name or reference to function
|
|
1219
1216
|
* @param parameters Arguments
|
|
1220
1217
|
* @param on Object to call the function on
|
|
1221
1218
|
* @returns {FunctionExpression<T>} Expression representing the function call (not the result of the function call!)
|
|
@@ -1224,8 +1221,8 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
1224
1221
|
|
|
1225
1222
|
_exports.addTypeInformation = addTypeInformation;
|
|
1226
1223
|
|
|
1227
|
-
function fn(
|
|
1228
|
-
var functionName = typeof
|
|
1224
|
+
function fn(func, parameters, on) {
|
|
1225
|
+
var functionName = typeof func === "string" ? func : func.__functionName;
|
|
1229
1226
|
return {
|
|
1230
1227
|
_type: "Function",
|
|
1231
1228
|
obj: on !== undefined ? wrapPrimitive(on) : undefined,
|
|
@@ -1284,26 +1281,21 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
1284
1281
|
|
|
1285
1282
|
switch (expression._type) {
|
|
1286
1283
|
case "Function":
|
|
1287
|
-
|
|
1288
|
-
|
|
1284
|
+
case "Formatter":
|
|
1285
|
+
expression.parameters = expression.parameters.map(function (parameter) {
|
|
1286
|
+
return transformRecursively(parameter, expressionType, transformFunction, includeAllExpression);
|
|
1289
1287
|
});
|
|
1290
1288
|
break;
|
|
1291
1289
|
|
|
1292
1290
|
case "Concat":
|
|
1293
|
-
expression.expressions = expression.expressions.map(function (
|
|
1294
|
-
return transformRecursively(
|
|
1291
|
+
expression.expressions = expression.expressions.map(function (subExpression) {
|
|
1292
|
+
return transformRecursively(subExpression, expressionType, transformFunction, includeAllExpression);
|
|
1295
1293
|
});
|
|
1296
1294
|
break;
|
|
1297
1295
|
|
|
1298
1296
|
case "ComplexType":
|
|
1299
|
-
expression.bindingParameters = expression.bindingParameters.map(function (
|
|
1300
|
-
return transformRecursively(
|
|
1301
|
-
});
|
|
1302
|
-
break;
|
|
1303
|
-
|
|
1304
|
-
case "Formatter":
|
|
1305
|
-
expression.parameters = expression.parameters.map(function (expression) {
|
|
1306
|
-
return transformRecursively(expression, expressionType, transformFunction, includeAllExpression);
|
|
1297
|
+
expression.bindingParameters = expression.bindingParameters.map(function (bindingParameter) {
|
|
1298
|
+
return transformRecursively(bindingParameter, expressionType, transformFunction, includeAllExpression);
|
|
1307
1299
|
});
|
|
1308
1300
|
break;
|
|
1309
1301
|
|
|
@@ -1332,8 +1324,8 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
1332
1324
|
|
|
1333
1325
|
case "Set":
|
|
1334
1326
|
if (includeAllExpression) {
|
|
1335
|
-
expression.operands = expression.operands.map(function (
|
|
1336
|
-
return transformRecursively(
|
|
1327
|
+
expression.operands = expression.operands.map(function (operand) {
|
|
1328
|
+
return transformRecursively(operand, expressionType, transformFunction, includeAllExpression);
|
|
1337
1329
|
});
|
|
1338
1330
|
}
|
|
1339
1331
|
|
|
@@ -1350,6 +1342,7 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
1350
1342
|
|
|
1351
1343
|
case "DefaultBinding":
|
|
1352
1344
|
case "Ref":
|
|
1345
|
+
case "Length":
|
|
1353
1346
|
case "Binding":
|
|
1354
1347
|
case "Constant":
|
|
1355
1348
|
// Do nothing
|
|
@@ -1365,6 +1358,176 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
1365
1358
|
|
|
1366
1359
|
_exports.transformRecursively = transformRecursively;
|
|
1367
1360
|
|
|
1361
|
+
var needParenthesis = function (expr) {
|
|
1362
|
+
return !isConstant(expr) && !isBinding(expr) && isExpression(expr) && expr._type !== "IfElse" && expr._type !== "Function";
|
|
1363
|
+
};
|
|
1364
|
+
/**
|
|
1365
|
+
* Compiles a constant object to a string.
|
|
1366
|
+
* @param expr
|
|
1367
|
+
* @param isNullable
|
|
1368
|
+
* @returns {string} The compiled string
|
|
1369
|
+
*/
|
|
1370
|
+
|
|
1371
|
+
|
|
1372
|
+
function compileConstantObject(expr) {
|
|
1373
|
+
var isNullable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
1374
|
+
|
|
1375
|
+
if (isNullable && Object.keys(expr.value).length === 0) {
|
|
1376
|
+
return "";
|
|
1377
|
+
} // Objects
|
|
1378
|
+
|
|
1379
|
+
|
|
1380
|
+
var o = expr.value;
|
|
1381
|
+
var properties = [];
|
|
1382
|
+
Object.keys(o).forEach(function (key) {
|
|
1383
|
+
var value = o[key];
|
|
1384
|
+
var childResult = compileBinding(value, true, false, true);
|
|
1385
|
+
|
|
1386
|
+
if (childResult && childResult.length > 0) {
|
|
1387
|
+
properties.push("".concat(key, ": ").concat(childResult));
|
|
1388
|
+
}
|
|
1389
|
+
});
|
|
1390
|
+
return "{".concat(properties.join(", "), "}");
|
|
1391
|
+
}
|
|
1392
|
+
/**
|
|
1393
|
+
* Compiles a Constant Binding Expression.
|
|
1394
|
+
* @param expr
|
|
1395
|
+
* @param embeddedInBinding
|
|
1396
|
+
* @param isNullable
|
|
1397
|
+
* @returns {string} The compiled string
|
|
1398
|
+
*/
|
|
1399
|
+
|
|
1400
|
+
|
|
1401
|
+
function compileConstant(expr, embeddedInBinding) {
|
|
1402
|
+
var isNullable = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
1403
|
+
|
|
1404
|
+
if (expr.value === null) {
|
|
1405
|
+
return "null";
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
if (expr.value === undefined) {
|
|
1409
|
+
return "undefined";
|
|
1410
|
+
}
|
|
1411
|
+
|
|
1412
|
+
if (typeof expr.value === "object") {
|
|
1413
|
+
if (Array.isArray(expr.value)) {
|
|
1414
|
+
var entries = expr.value.map(function (expression) {
|
|
1415
|
+
return compileBinding(expression, true);
|
|
1416
|
+
});
|
|
1417
|
+
return "[".concat(entries.join(", "), "]");
|
|
1418
|
+
} else {
|
|
1419
|
+
return compileConstantObject(expr, isNullable);
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1423
|
+
if (embeddedInBinding) {
|
|
1424
|
+
switch (typeof expr.value) {
|
|
1425
|
+
case "number":
|
|
1426
|
+
case "bigint":
|
|
1427
|
+
case "boolean":
|
|
1428
|
+
return expr.value.toString();
|
|
1429
|
+
|
|
1430
|
+
case "string":
|
|
1431
|
+
return "'".concat(escapeXmlAttribute(expr.value.toString()), "'");
|
|
1432
|
+
|
|
1433
|
+
default:
|
|
1434
|
+
return "";
|
|
1435
|
+
}
|
|
1436
|
+
} else {
|
|
1437
|
+
return expr.value.toString();
|
|
1438
|
+
}
|
|
1439
|
+
}
|
|
1440
|
+
/**
|
|
1441
|
+
* Generates the binding string for a Binding expression.
|
|
1442
|
+
*
|
|
1443
|
+
* @param expressionForBinding The expression to compile
|
|
1444
|
+
* @param embeddedInBinding Whether the expression to compile is embedded into another expression
|
|
1445
|
+
* @param embeddedSeparator The binding value evaluator ($ or % depending on whether we want to force the type or not)
|
|
1446
|
+
* @returns {BindingExpression<T>} The corresponding expression binding
|
|
1447
|
+
*/
|
|
1448
|
+
|
|
1449
|
+
|
|
1450
|
+
function compileBindingForBinding(expressionForBinding, embeddedInBinding, embeddedSeparator) {
|
|
1451
|
+
if (expressionForBinding.type || expressionForBinding.parameters || expressionForBinding.targetType || expressionForBinding.formatOptions || expressionForBinding.constraints) {
|
|
1452
|
+
// This is now a complex binding definition, let's prepare for it
|
|
1453
|
+
var complexBindingDefinition = {
|
|
1454
|
+
path: compileBindingPath(expressionForBinding),
|
|
1455
|
+
type: expressionForBinding.type,
|
|
1456
|
+
targetType: expressionForBinding.targetType,
|
|
1457
|
+
parameters: expressionForBinding.parameters,
|
|
1458
|
+
formatOptions: expressionForBinding.formatOptions,
|
|
1459
|
+
constraints: expressionForBinding.constraints
|
|
1460
|
+
};
|
|
1461
|
+
var outBinding = compileBinding(complexBindingDefinition);
|
|
1462
|
+
|
|
1463
|
+
if (embeddedInBinding) {
|
|
1464
|
+
outBinding = "".concat(embeddedSeparator) + outBinding;
|
|
1465
|
+
}
|
|
1466
|
+
|
|
1467
|
+
return outBinding;
|
|
1468
|
+
} else if (embeddedInBinding) {
|
|
1469
|
+
return "".concat(embeddedSeparator, "{").concat(compileBindingPath(expressionForBinding), "}");
|
|
1470
|
+
} else {
|
|
1471
|
+
return "{".concat(compileBindingPath(expressionForBinding), "}");
|
|
1472
|
+
}
|
|
1473
|
+
}
|
|
1474
|
+
|
|
1475
|
+
function compileComplexTypeExpression(expression) {
|
|
1476
|
+
if (expression.bindingParameters.length === 1) {
|
|
1477
|
+
return "{".concat(compilePathParameter(expression.bindingParameters[0], true), ", type: '").concat(expression.type, "'}");
|
|
1478
|
+
}
|
|
1479
|
+
|
|
1480
|
+
var outputEnd; // this code is based on sap.ui.model.odata.v4._AnnotationHelperExpression.fetchCurrencyOrUnit
|
|
1481
|
+
|
|
1482
|
+
switch (expression.type) {
|
|
1483
|
+
case "sap.ui.model.odata.type.Unit":
|
|
1484
|
+
outputEnd = ",{mode:'OneTime',path:'/##@@requestUnitsOfMeasure',targetType:'any'}],type:'sap.ui.model.odata.type.Unit'";
|
|
1485
|
+
break;
|
|
1486
|
+
|
|
1487
|
+
case "sap.ui.model.odata.type.Currency":
|
|
1488
|
+
outputEnd = ",{mode:'OneTime',path:'/##@@requestCurrencyCodes',targetType:'any'}],type:'sap.ui.model.odata.type.Currency'";
|
|
1489
|
+
break;
|
|
1490
|
+
|
|
1491
|
+
default:
|
|
1492
|
+
outputEnd = "], type: '".concat(expression.type, "'");
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1495
|
+
if (hasElements(expression.formatOptions)) {
|
|
1496
|
+
outputEnd += ", formatOptions: ".concat(compileBinding(expression.formatOptions));
|
|
1497
|
+
}
|
|
1498
|
+
|
|
1499
|
+
if (hasElements(expression.parameters)) {
|
|
1500
|
+
outputEnd += ", parameters: ".concat(compileBinding(expression.parameters));
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
outputEnd += "}";
|
|
1504
|
+
return "{mode:'TwoWay', parts:[".concat(expression.bindingParameters.map(function (param) {
|
|
1505
|
+
return compilePathParameter(param);
|
|
1506
|
+
}).join(",")).concat(outputEnd);
|
|
1507
|
+
}
|
|
1508
|
+
/**
|
|
1509
|
+
* Wrap the compiled binding string as required dependening on its context.
|
|
1510
|
+
*
|
|
1511
|
+
* @param expression The compiled expression
|
|
1512
|
+
* @param embeddedInBinding True if the compiled expression is to be embedded in a binding
|
|
1513
|
+
* @param parenthesisRequired True if the embedded binding needs to be wrapped in parethesis so that it is evaluated as one
|
|
1514
|
+
* @returns {BindingExpression<string>} Finalized compiled expression
|
|
1515
|
+
*/
|
|
1516
|
+
|
|
1517
|
+
|
|
1518
|
+
function wrapBindingExpression(expression, embeddedInBinding) {
|
|
1519
|
+
var parenthesisRequired = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
1520
|
+
|
|
1521
|
+
if (embeddedInBinding) {
|
|
1522
|
+
if (parenthesisRequired) {
|
|
1523
|
+
return "(".concat(expression, ")");
|
|
1524
|
+
} else {
|
|
1525
|
+
return expression;
|
|
1526
|
+
}
|
|
1527
|
+
} else {
|
|
1528
|
+
return "{= ".concat(expression, "}");
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1368
1531
|
/**
|
|
1369
1532
|
* Compile an expression into an expression binding.
|
|
1370
1533
|
*
|
|
@@ -1372,61 +1535,24 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
1372
1535
|
* @param expression The expression to compile
|
|
1373
1536
|
* @param embeddedInBinding Whether the expression to compile is embedded into another expression
|
|
1374
1537
|
* @param keepTargetType Keep the target type of the embedded bindings instead of casting them to any
|
|
1538
|
+
* @param isNullable Whether binding expression can resolve to empty string or not
|
|
1375
1539
|
* @returns {BindingExpression<T>} The corresponding expression binding
|
|
1376
1540
|
*/
|
|
1541
|
+
|
|
1542
|
+
|
|
1377
1543
|
function compileBinding(expression) {
|
|
1378
1544
|
var embeddedInBinding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
1379
1545
|
var keepTargetType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
1546
|
+
var isNullable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
1380
1547
|
var expr = wrapPrimitive(expression);
|
|
1381
1548
|
var embeddedSeparator = keepTargetType ? "$" : "%";
|
|
1382
|
-
var outProperty = "";
|
|
1383
1549
|
|
|
1384
1550
|
switch (expr._type) {
|
|
1385
1551
|
case "Unresolveable":
|
|
1386
1552
|
return undefined;
|
|
1387
1553
|
|
|
1388
1554
|
case "Constant":
|
|
1389
|
-
|
|
1390
|
-
return "null";
|
|
1391
|
-
}
|
|
1392
|
-
|
|
1393
|
-
if (expr.value === undefined) {
|
|
1394
|
-
return "undefined";
|
|
1395
|
-
}
|
|
1396
|
-
|
|
1397
|
-
if (typeof expr.value === "object") {
|
|
1398
|
-
if (Array.isArray(expr.value)) {
|
|
1399
|
-
var entries = expr.value.map(function (expression) {
|
|
1400
|
-
return compileBinding(expression, true);
|
|
1401
|
-
});
|
|
1402
|
-
return "[".concat(entries.join(", "), "]");
|
|
1403
|
-
} else {
|
|
1404
|
-
// Objects
|
|
1405
|
-
var o = expr.value;
|
|
1406
|
-
var properties = Object.keys(o).map(function (key) {
|
|
1407
|
-
var value = o[key];
|
|
1408
|
-
return "".concat(key, ": ").concat(compileBinding(value, true));
|
|
1409
|
-
});
|
|
1410
|
-
return "{".concat(properties.join(", "), "}");
|
|
1411
|
-
}
|
|
1412
|
-
}
|
|
1413
|
-
|
|
1414
|
-
if (embeddedInBinding) {
|
|
1415
|
-
switch (typeof expr.value) {
|
|
1416
|
-
case "number":
|
|
1417
|
-
case "bigint":
|
|
1418
|
-
case "boolean":
|
|
1419
|
-
return expr.value.toString();
|
|
1420
|
-
|
|
1421
|
-
case "string":
|
|
1422
|
-
return "'".concat(escapeXmlAttribute(expr.value.toString()), "'");
|
|
1423
|
-
|
|
1424
|
-
default:
|
|
1425
|
-
return "";
|
|
1426
|
-
}
|
|
1427
|
-
} else {
|
|
1428
|
-
return expr.value.toString();
|
|
1429
|
-
}
|
|
1555
|
+
return compileConstant(expr, embeddedInBinding, isNullable);
|
|
1430
1556
|
|
|
1431
1557
|
case "Ref":
|
|
1432
1558
|
return expr.ref || "null";
|
|
@@ -1438,168 +1564,95 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
1438
1564
|
return expr.obj === undefined ? "".concat(expr.fn, "(").concat(argumentString, ")") : "".concat(compileBinding(expr.obj, true), ".").concat(expr.fn, "(").concat(argumentString, ")");
|
|
1439
1565
|
|
|
1440
1566
|
case "EmbeddedExpressionBinding":
|
|
1441
|
-
|
|
1442
|
-
return "(".concat(expr.value.substr(2, expr.value.length - 3), ")");
|
|
1443
|
-
} else {
|
|
1444
|
-
return "".concat(expr.value);
|
|
1445
|
-
}
|
|
1567
|
+
return embeddedInBinding ? "(".concat(expr.value.substr(2, expr.value.length - 3), ")") : "".concat(expr.value);
|
|
1446
1568
|
|
|
1447
1569
|
case "EmbeddedBinding":
|
|
1448
|
-
|
|
1449
|
-
return "".concat(embeddedSeparator).concat(expr.value);
|
|
1450
|
-
} else {
|
|
1451
|
-
return "".concat(expr.value);
|
|
1452
|
-
}
|
|
1570
|
+
return embeddedInBinding ? "".concat(embeddedSeparator).concat(expr.value) : "".concat(expr.value);
|
|
1453
1571
|
|
|
1454
1572
|
case "DefaultBinding":
|
|
1455
1573
|
case "Binding":
|
|
1456
|
-
|
|
1457
|
-
var outBinding = "";
|
|
1458
|
-
|
|
1459
|
-
if (embeddedInBinding) {
|
|
1460
|
-
outBinding += "".concat(embeddedSeparator);
|
|
1461
|
-
}
|
|
1462
|
-
|
|
1463
|
-
outBinding += "{path:'".concat(expr.modelName ? "".concat(expr.modelName, ">") : "").concat(expr.path, "'");
|
|
1464
|
-
|
|
1465
|
-
if (expr.type) {
|
|
1466
|
-
outBinding += ", type: '".concat(expr.type, "'");
|
|
1467
|
-
}
|
|
1468
|
-
|
|
1469
|
-
if (expr.constraints && Object.keys(expr.constraints).length > 0) {
|
|
1470
|
-
outBinding += ", constraints: ".concat(compileBinding(expr.constraints));
|
|
1471
|
-
}
|
|
1472
|
-
|
|
1473
|
-
if (expr.formatOptions) {
|
|
1474
|
-
outBinding += ", formatOptions: ".concat(compileBinding(expr.formatOptions));
|
|
1475
|
-
}
|
|
1476
|
-
|
|
1477
|
-
if (expr.parameters && Object.keys(expr.parameters).length > 0) {
|
|
1478
|
-
outBinding += ", parameters: ".concat(compileBinding(expr.parameters));
|
|
1479
|
-
}
|
|
1480
|
-
|
|
1481
|
-
if (expr.targetType) {
|
|
1482
|
-
outBinding += ", targetType: '".concat(expr.targetType, "'");
|
|
1483
|
-
}
|
|
1484
|
-
|
|
1485
|
-
outBinding += "}";
|
|
1486
|
-
return outBinding;
|
|
1487
|
-
} else {
|
|
1488
|
-
if (embeddedInBinding) {
|
|
1489
|
-
return "".concat(embeddedSeparator, "{").concat(expr.modelName ? "".concat(expr.modelName, ">") : "").concat(expr.path, "}");
|
|
1490
|
-
} else {
|
|
1491
|
-
return "{".concat(expr.modelName ? "".concat(expr.modelName, ">") : "").concat(expr.path, "}");
|
|
1492
|
-
}
|
|
1493
|
-
}
|
|
1574
|
+
return compileBindingForBinding(expr, embeddedInBinding, embeddedSeparator);
|
|
1494
1575
|
|
|
1495
1576
|
case "Comparison":
|
|
1496
|
-
var
|
|
1497
|
-
|
|
1498
|
-
if (embeddedInBinding) {
|
|
1499
|
-
return comparisonPart;
|
|
1500
|
-
}
|
|
1501
|
-
|
|
1502
|
-
return "{= ".concat(comparisonPart, "}");
|
|
1577
|
+
var comparisonExpression = compileComparisonExpression(expr);
|
|
1578
|
+
return wrapBindingExpression(comparisonExpression, embeddedInBinding);
|
|
1503
1579
|
|
|
1504
1580
|
case "IfElse":
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
} else {
|
|
1508
|
-
return "{= ".concat(compileBinding(expr.condition, true), " ? ").concat(compileBinding(expr.onTrue, true), " : ").concat(compileBinding(expr.onFalse, true), "}");
|
|
1509
|
-
}
|
|
1581
|
+
var ifElseExpression = "".concat(compileBinding(expr.condition, true), " ? ").concat(compileBinding(expr.onTrue, true), " : ").concat(compileBinding(expr.onFalse, true));
|
|
1582
|
+
return wrapBindingExpression(ifElseExpression, embeddedInBinding, true);
|
|
1510
1583
|
|
|
1511
1584
|
case "Set":
|
|
1512
|
-
|
|
1513
|
-
return
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
} else {
|
|
1517
|
-
return "{= (".concat(expr.operands.map(function (expression) {
|
|
1518
|
-
return compileBinding(expression, true);
|
|
1519
|
-
}).join(" ".concat(expr.operator, " ")), ")}");
|
|
1520
|
-
}
|
|
1585
|
+
var setExpression = expr.operands.map(function (operand) {
|
|
1586
|
+
return compileBinding(operand, true);
|
|
1587
|
+
}).join(" ".concat(expr.operator, " "));
|
|
1588
|
+
return wrapBindingExpression(setExpression, embeddedInBinding, true);
|
|
1521
1589
|
|
|
1522
1590
|
case "Concat":
|
|
1523
|
-
|
|
1524
|
-
return
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
}
|
|
1591
|
+
var concatExpression = expr.expressions.map(function (nestedExpression) {
|
|
1592
|
+
return compileBinding(nestedExpression, true, true);
|
|
1593
|
+
}).join(" + ");
|
|
1594
|
+
return wrapBindingExpression(concatExpression, embeddedInBinding);
|
|
1595
|
+
|
|
1596
|
+
case "Length":
|
|
1597
|
+
var lengthExpression = "".concat(compileBinding(expr.bindingExpression, true), ".length");
|
|
1598
|
+
return wrapBindingExpression(lengthExpression, embeddedInBinding);
|
|
1532
1599
|
|
|
1533
1600
|
case "Not":
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
} else {
|
|
1537
|
-
return "{= !".concat(compileBinding(expr.operand, true), "}");
|
|
1538
|
-
}
|
|
1601
|
+
var notExpression = "!".concat(compileBinding(expr.operand, true));
|
|
1602
|
+
return wrapBindingExpression(notExpression, embeddedInBinding);
|
|
1539
1603
|
|
|
1540
1604
|
case "Truthy":
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
} else {
|
|
1544
|
-
return "{= !!".concat(compileBinding(expr.operand, true), "}");
|
|
1545
|
-
}
|
|
1605
|
+
var truthyExpression = "!!".concat(compileBinding(expr.operand, true));
|
|
1606
|
+
return wrapBindingExpression(truthyExpression, embeddedInBinding);
|
|
1546
1607
|
|
|
1547
1608
|
case "Formatter":
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
} else {
|
|
1551
|
-
outProperty += "{parts:[".concat(expr.parameters.map(function (param) {
|
|
1552
|
-
return compilePathParameter(param);
|
|
1553
|
-
}).join(","), "], formatter: '").concat(expr.fn, "'}");
|
|
1554
|
-
}
|
|
1609
|
+
var formatterExpression = compileFormatterExpression(expr);
|
|
1610
|
+
return embeddedInBinding ? "$".concat(formatterExpression) : formatterExpression;
|
|
1555
1611
|
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1612
|
+
case "ComplexType":
|
|
1613
|
+
var complexTypeExpression = compileComplexTypeExpression(expr);
|
|
1614
|
+
return embeddedInBinding ? "$".concat(complexTypeExpression) : complexTypeExpression;
|
|
1559
1615
|
|
|
1560
|
-
|
|
1616
|
+
default:
|
|
1617
|
+
return "";
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1620
|
+
/**
|
|
1621
|
+
* Compile a comparison expression.
|
|
1622
|
+
*
|
|
1623
|
+
* @param expression The comparison expression.
|
|
1624
|
+
* @returns The compiled expression. Needs wrapping before it can be used as an expression binding.
|
|
1625
|
+
*/
|
|
1561
1626
|
|
|
1562
|
-
case "ComplexType":
|
|
1563
|
-
if (expr.bindingParameters.length === 1) {
|
|
1564
|
-
outProperty += "{".concat(compilePathParameter(expr.bindingParameters[0], true), ", type: '").concat(expr.type, "'}");
|
|
1565
|
-
} else {
|
|
1566
|
-
var outputEnd; // this code is based on sap.ui.model.odata.v4._AnnotationHelperExpression.fetchCurrencyOrUnit
|
|
1567
|
-
|
|
1568
|
-
switch (expr.type) {
|
|
1569
|
-
case "sap.ui.model.odata.type.Unit":
|
|
1570
|
-
outputEnd = ",{mode:'OneTime',path:'/##@@requestUnitsOfMeasure',targetType:'any'}],type:'sap.ui.model.odata.type.Unit'";
|
|
1571
|
-
break;
|
|
1572
|
-
|
|
1573
|
-
case "sap.ui.model.odata.type.Currency":
|
|
1574
|
-
outputEnd = ",{mode:'OneTime',path:'/##@@requestCurrencyCodes',targetType:'any'}],type:'sap.ui.model.odata.type.Currency'";
|
|
1575
|
-
break;
|
|
1576
|
-
|
|
1577
|
-
default:
|
|
1578
|
-
outputEnd = "], type: '".concat(expr.type, "'");
|
|
1579
|
-
}
|
|
1580
1627
|
|
|
1581
|
-
|
|
1582
|
-
outputEnd += ", formatOptions: ".concat(compileBinding(expr.formatOptions));
|
|
1583
|
-
}
|
|
1628
|
+
_exports.compileBinding = compileBinding;
|
|
1584
1629
|
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1630
|
+
function compileComparisonExpression(expression) {
|
|
1631
|
+
function compileOperand(operand) {
|
|
1632
|
+
var _compileBinding;
|
|
1588
1633
|
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
}).join(",")).concat(outputEnd);
|
|
1593
|
-
}
|
|
1634
|
+
var compiledOperand = (_compileBinding = compileBinding(operand, true)) !== null && _compileBinding !== void 0 ? _compileBinding : "undefined";
|
|
1635
|
+
return wrapBindingExpression(compiledOperand, true, needParenthesis(operand));
|
|
1636
|
+
}
|
|
1594
1637
|
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1638
|
+
return "".concat(compileOperand(expression.operand1), " ").concat(expression.operator, " ").concat(compileOperand(expression.operand2));
|
|
1639
|
+
}
|
|
1640
|
+
/**
|
|
1641
|
+
* Compile a formatter expression.
|
|
1642
|
+
*
|
|
1643
|
+
* @param expression The formatter expression.
|
|
1644
|
+
* @returns The compiled expression.
|
|
1645
|
+
*/
|
|
1598
1646
|
|
|
1599
|
-
return outProperty;
|
|
1600
1647
|
|
|
1601
|
-
|
|
1602
|
-
|
|
1648
|
+
function compileFormatterExpression(expression) {
|
|
1649
|
+
if (expression.parameters.length === 1) {
|
|
1650
|
+
return "{".concat(compilePathParameter(expression.parameters[0], true), ", formatter: '").concat(expression.fn, "'}");
|
|
1651
|
+
} else {
|
|
1652
|
+
var parts = expression.parameters.map(function (param) {
|
|
1653
|
+
return compilePathParameter(param);
|
|
1654
|
+
});
|
|
1655
|
+
return "{parts: [".concat(parts.join(", "), "], formatter: '").concat(expression.fn, "'}");
|
|
1603
1656
|
}
|
|
1604
1657
|
}
|
|
1605
1658
|
/**
|
|
@@ -1611,72 +1664,66 @@ sap.ui.define(["./AnnotationEnum"], function (AnnotationEnum) {
|
|
|
1611
1664
|
*/
|
|
1612
1665
|
|
|
1613
1666
|
|
|
1614
|
-
_exports.compileBinding = compileBinding;
|
|
1615
|
-
|
|
1616
1667
|
function compilePathParameter(expression) {
|
|
1617
1668
|
var singlePath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
1618
1669
|
var outValue = "";
|
|
1619
1670
|
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
break;
|
|
1627
|
-
|
|
1628
|
-
case "string":
|
|
1629
|
-
outValue = "value: '".concat(escapeXmlAttribute(expression.value.toString()), "'");
|
|
1630
|
-
break;
|
|
1631
|
-
|
|
1632
|
-
case "boolean":
|
|
1633
|
-
outValue = "value: '".concat(expression.value.toString(), "'");
|
|
1634
|
-
break;
|
|
1635
|
-
|
|
1636
|
-
default:
|
|
1637
|
-
outValue = "value: ''";
|
|
1638
|
-
break;
|
|
1639
|
-
}
|
|
1671
|
+
if (expression._type === "Constant") {
|
|
1672
|
+
switch (typeof expression.value) {
|
|
1673
|
+
case "number":
|
|
1674
|
+
case "bigint":
|
|
1675
|
+
outValue = "value: ".concat(expression.value.toString());
|
|
1676
|
+
break;
|
|
1640
1677
|
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1678
|
+
case "string":
|
|
1679
|
+
outValue = "value: '".concat(escapeXmlAttribute(expression.value.toString()), "'");
|
|
1680
|
+
break;
|
|
1644
1681
|
|
|
1645
|
-
|
|
1682
|
+
case "boolean":
|
|
1683
|
+
outValue = "value: '".concat(expression.value.toString(), "'");
|
|
1684
|
+
break;
|
|
1646
1685
|
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1686
|
+
default:
|
|
1687
|
+
outValue = "value: ''";
|
|
1688
|
+
break;
|
|
1689
|
+
}
|
|
1690
|
+
} else if (expression._type === "DefaultBinding" || expression._type === "Binding") {
|
|
1691
|
+
outValue = "path: '".concat(compileBindingPath(expression), "'");
|
|
1692
|
+
outValue += expression.type ? ", type: '".concat(expression.type, "'") : ", targetType: 'any'";
|
|
1650
1693
|
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
outValue += ", targetType : 'any'";
|
|
1655
|
-
}
|
|
1694
|
+
if (hasElements(expression.constraints)) {
|
|
1695
|
+
outValue += ", constraints: ".concat(compileBinding(expression.constraints));
|
|
1696
|
+
}
|
|
1656
1697
|
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1698
|
+
if (hasElements(expression.formatOptions)) {
|
|
1699
|
+
outValue += ", formatOptions: ".concat(compileBinding(expression.formatOptions));
|
|
1700
|
+
}
|
|
1660
1701
|
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1702
|
+
if (hasElements(expression.parameters)) {
|
|
1703
|
+
outValue += ", parameters: ".concat(compileBinding(expression.parameters));
|
|
1704
|
+
}
|
|
1705
|
+
} else {
|
|
1706
|
+
return "";
|
|
1707
|
+
}
|
|
1664
1708
|
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
}
|
|
1709
|
+
return singlePath ? outValue : "{".concat(outValue, "}");
|
|
1710
|
+
}
|
|
1668
1711
|
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1712
|
+
function hasElements(obj) {
|
|
1713
|
+
return obj && Object.keys(obj).length > 0;
|
|
1714
|
+
}
|
|
1715
|
+
/**
|
|
1716
|
+
* Compile a binding expression path.
|
|
1717
|
+
*
|
|
1718
|
+
* @param expression The expression to compile.
|
|
1719
|
+
* @returns The compiled path.
|
|
1720
|
+
*/
|
|
1672
1721
|
|
|
1673
|
-
return "{".concat(outValue, "}");
|
|
1674
1722
|
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
}
|
|
1723
|
+
function compileBindingPath(expression) {
|
|
1724
|
+
return "".concat(expression.modelName ? expression.modelName + ">" : "").concat(expression.path);
|
|
1678
1725
|
}
|
|
1679
1726
|
|
|
1680
1727
|
return _exports;
|
|
1681
1728
|
}, false);
|
|
1682
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJpbmRpbmdFeHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbInVucmVzb2x2ZWFibGVFeHByZXNzaW9uIiwiX3R5cGUiLCJlc2NhcGVYbWxBdHRyaWJ1dGUiLCJpbnB1dFN0cmluZyIsInJlcGxhY2UiLCJjIiwiaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24iLCJleHByZXNzaW9ucyIsImZpbmQiLCJleHByIiwidW5kZWZpbmVkIiwiX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbCIsImEiLCJiIiwidmFsdWUiLCJvcGVyYW5kIiwib3BlcmF0b3IiLCJvcGVyYW5kcyIsImxlbmd0aCIsImV2ZXJ5IiwiZXhwcmVzc2lvbiIsInNvbWUiLCJvdGhlckV4cHJlc3Npb24iLCJjb25kaXRpb24iLCJvblRydWUiLCJvbkZhbHNlIiwib3BlcmFuZDEiLCJvcGVyYW5kMiIsImFFeHByZXNzaW9ucyIsImJFeHByZXNzaW9ucyIsImluZGV4IiwibW9kZWxOYW1lIiwicGF0aCIsInRhcmdldEVudGl0eVNldCIsImZuIiwicGFyYW1ldGVycyIsInR5cGUiLCJiaW5kaW5nUGFyYW1ldGVycyIsIm90aGVyRnVuY3Rpb24iLCJvYmoiLCJyZWYiLCJmbGF0dGVuU2V0RXhwcmVzc2lvbiIsInJlZHVjZSIsInJlc3VsdCIsImNhbmRpZGF0ZXNGb3JGbGF0dGVuaW5nIiwiZm9yRWFjaCIsImNhbmRpZGF0ZSIsImUiLCJwdXNoIiwiaGFzT3Bwb3NpdGVFeHByZXNzaW9ucyIsImkiLCJuZWdhdGVkRXhwcmVzc2lvbiIsIm5vdCIsImoiLCJhbmQiLCJtYXAiLCJ3cmFwUHJpbWl0aXZlIiwiaXNTdGF0aWNGYWxzZSIsIm5vblRyaXZpYWxFeHByZXNzaW9uIiwiZmlsdGVyIiwiaXNDb25zdGFudCIsImNvbnN0YW50IiwiaXNWYWxpZCIsIm9yIiwiaXNTdGF0aWNUcnVlIiwiaXNDb21wYXJpc29uIiwiZXF1YWwiLCJncmVhdGVyT3JFcXVhbCIsImdyZWF0ZXJUaGFuIiwibm90RXF1YWwiLCJsZXNzT3JFcXVhbCIsImxlc3NUaGFuIiwiaXNUcnV0aHkiLCJiaW5kaW5nRXhwcmVzc2lvbiIsInZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMiLCJwYXRoVmlzaXRvciIsInRhcmdldFBhdGgiLCJsb2NhbFBhdGgiLCJjb25jYXQiLCJqb2luIiwiY29uc3RhbnRWYWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsImlzUHJpbWl0aXZlT2JqZWN0IiwidmFsdWVPZiIsInZhbCIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsInRhcmdldFR5cGUiLCJzdGFydHNXaXRoIiwiaXNFeHByZXNzaW9uIiwic29tZXRoaW5nIiwibWF5YmVDb25zdGFudCIsImlzQmluZGluZyIsIm1heWJlQmluZGluZyIsIm9iamVjdFR5cGUiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJpc0NvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsImFubm90YXRpb25FeHByZXNzaW9uIiwiZGVmYXVsdFZhbHVlIiwiYW5ub3RhdGlvbklmRXhwcmVzc2lvbiIsIklmIiwicGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uIiwiTm90IiwiRXEiLCJOZSIsIkd0IiwiR2UiLCJMdCIsIkxlIiwiT3IiLCJvckNvbmRpdGlvbiIsIkFuZCIsImFuZENvbmRpdGlvbiIsImFubm90YXRpb25BcHBseUV4cHJlc3Npb24iLCJhbm5vdGF0aW9uVmFsdWUiLCJoYXNPd25Qcm9wZXJ0eSIsIiRPciIsIiRBbmQiLCIkTm90IiwiJEVxIiwiJE5lIiwiJEd0IiwiJEdlIiwiJEx0IiwiJExlIiwiJFBhdGgiLCJGdW5jdGlvbiIsIiRGdW5jdGlvbiIsIkFwcGx5IiwiJEFwcGx5IiwiJElmIiwicmVzb2x2ZUVudW1WYWx1ZSIsIiRFbnVtTWVtYmVyIiwiaWZFbHNlIiwiYXBwbHlQYXJhbSIsImFwcGx5UGFyYW1Db252ZXJ0ZWQiLCJjb21wYXJpc29uIiwibGVmdE9wZXJhbmQiLCJyaWdodE9wZXJhbmQiLCJsZWZ0RXhwcmVzc2lvbiIsInJpZ2h0RXhwcmVzc2lvbiIsImNvbmRpdGlvbkV4cHJlc3Npb24iLCJvblRydWVFeHByZXNzaW9uIiwib25GYWxzZUV4cHJlc3Npb24iLCJoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0IiwiZm9ybWF0UmVzdWx0IiwiZm9ybWF0dGVyRnVuY3Rpb24iLCJjb250ZXh0RW50aXR5VHlwZSIsInBhcmFtZXRlckV4cHJlc3Npb25zIiwiX19mdW5jdGlvbk5hbWUiLCJzcGxpdCIsImZvcm1hdHRlckNsYXNzIiwiZm9ybWF0dGVyTmFtZSIsInVuc2hpZnQiLCJhZGRUeXBlSW5mb3JtYXRpb24iLCJvRm9ybWF0T3B0aW9ucyIsImluZGV4T2YiLCJwYXJzZUFzU3RyaW5nIiwiZW1wdHlTdHJpbmciLCJmb3JtYXRPcHRpb25zIiwib24iLCJmdW5jdGlvbk5hbWUiLCJpc0VtcHR5IiwiaW5FeHByZXNzaW9ucyIsImNvbmNhdGVuYXRlZCIsInRvU3RyaW5nIiwidHJhbnNmb3JtUmVjdXJzaXZlbHkiLCJpbkV4cHJlc3Npb24iLCJleHByZXNzaW9uVHlwZSIsInRyYW5zZm9ybUZ1bmN0aW9uIiwiaW5jbHVkZUFsbEV4cHJlc3Npb24iLCJjb21waWxlQmluZGluZyIsImVtYmVkZGVkSW5CaW5kaW5nIiwia2VlcFRhcmdldFR5cGUiLCJlbWJlZGRlZFNlcGFyYXRvciIsIm91dFByb3BlcnR5IiwiZW50cmllcyIsIm8iLCJwcm9wZXJ0aWVzIiwiYXJndW1lbnRTdHJpbmciLCJhcmciLCJzdWJzdHIiLCJvdXRCaW5kaW5nIiwiY29uc3RyYWludHMiLCJjb21wYXJpc29uUGFydCIsImNvbXBpbGVQYXRoUGFyYW1ldGVyIiwicGFyYW0iLCJvdXRwdXRFbmQiLCJzaW5nbGVQYXRoIiwib3V0VmFsdWUiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBLTyxNQUFNQSx1QkFBdUQsR0FBRztBQUN0RUMsSUFBQUEsS0FBSyxFQUFFO0FBRCtELEdBQWhFOzs7QUFJUCxXQUFTQyxrQkFBVCxD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LFdBQXZCLEVBQW9DekssTUFBcEMsR0FBNkMsQ0FBM0UsRUFBOEU7QUFDN0UrSyxVQUFBQSxRQUFRLDZCQUFzQmxCLGNBQWMsQ0FBQzNKLFVBQVUsQ0FBQ3VLLFdBQVosQ0FBcEMsQ0FBUjtBQUNBOztBQUNELFlBQUl2SyxVQUFVLENBQUMrSSxhQUFYLElBQTRCN0UsTUFBTSxDQUFDQyxJQUFQLENBQVluRSxVQUFVLENBQUMrSSxhQUF2QixFQUFzQ2pKLE1BQXRDLEdBQStDLENBQS9FLEVBQWtGO0FBQ2pGK0ssVUFBQUEsUUFBUSwrQkFBd0JsQixjQUFjLENBQUMzSixVQUFVLENBQUMrSSxhQUFaLENBQXRDLENBQVI7QUFDQTs7QUFDRCxZQUFJL0ksVUFBVSxDQUFDZSxVQUFYLElBQXlCbUQsTUFBTSxDQUFDQyxJQUFQLENBQVluRSxVQUFVLENBQUNlLFVBQXZCLEVBQW1DakIsTUFBbkMsR0FBNEMsQ0FBekUsRUFBNEU7QUFDM0UrSyxVQUFBQSxRQUFRLDRCQUFxQmxCLGNBQWMsQ0FBQzNKLFVBQVUsQ0FBQ2UsVUFBWixDQUFuQyxDQUFSO0FBQ0E7O0FBQ0QsWUFBSTZKLFVBQUosRUFBZ0I7QUFDZixpQkFBT0MsUUFBUDtBQUNBOztBQUNELDBCQUFXQSxRQUFYOztBQUNEO0FBQ0MsZUFBTyxFQUFQO0FBN0NGO0FBK0NBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRBbmRBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0QW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRDb25kaXRpb25hbENoZWNrT3JWYWx1ZSxcblx0RW50aXR5VHlwZSxcblx0RXFBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0RXFDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdEdlQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdEdlQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRHdEFubm90YXRpb25FeHByZXNzaW9uLFxuXHRHdENvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0SWZBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0SWZBbm5vdGF0aW9uRXhwcmVzc2lvblZhbHVlLFxuXHRMZUFubm90YXRpb25FeHByZXNzaW9uLFxuXHRMZUNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0THRBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0THRDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdE5lQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdE5lQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHROb3RBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Tm90Q29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRPckFubm90YXRpb25FeHByZXNzaW9uLFxuXHRPckNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0UGF0aENvbmRpdGlvbkV4cHJlc3Npb24sXG5cdFByb3BlcnR5QW5ub3RhdGlvblZhbHVlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgQXBwbHlBbm5vdGF0aW9uRXhwcmVzc2lvbiwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3R5cGVzL0VkbVwiO1xuaW1wb3J0IHsgRW50aXR5U2V0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvQ29udmVydGVyXCI7XG5pbXBvcnQgeyByZXNvbHZlRW51bVZhbHVlIH0gZnJvbSBcIi4vQW5ub3RhdGlvbkVudW1cIjtcblxudHlwZSBQcmltaXRpdmVUeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbnR5cGUgQmFzZUV4cHJlc3Npb248VD4gPSB7XG5cdF90eXBlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDb25zdGFudEV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQ29uc3RhbnRcIjtcblx0dmFsdWU6IFQ7XG59O1xuXG50eXBlIFNldE9wZXJhdG9yID0gXCImJlwiIHwgXCJ8fFwiO1xuZXhwb3J0IHR5cGUgU2V0RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPGJvb2xlYW4+ICYge1xuXHRfdHlwZTogXCJTZXRcIjtcblx0b3BlcmF0b3I6IFNldE9wZXJhdG9yO1xuXHRvcGVyYW5kczogRXhwcmVzc2lvbjxib29sZWFuPltdO1xufTtcblxuZXhwb3J0IHR5cGUgTm90RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPGJvb2xlYW4+ICYge1xuXHRfdHlwZTogXCJOb3RcIjtcblx0b3BlcmFuZDogRXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG5cbmV4cG9ydCB0eXBlIFRydXRoeUV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxib29sZWFuPiAmIHtcblx0X3R5cGU6IFwiVHJ1dGh5XCI7XG5cdG9wZXJhbmQ6IEV4cHJlc3Npb248c3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIFJlZmVyZW5jZUV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxvYmplY3Q+ICYge1xuXHRfdHlwZTogXCJSZWZcIjtcblx0cmVmOiBzdHJpbmcgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJGb3JtYXR0ZXJcIjtcblx0Zm46IHN0cmluZztcblx0cGFyYW1ldGVyczogRXhwcmVzc2lvbjxhbnk+W107XG59O1xuXG5leHBvcnQgdHlwZSBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQ29tcGxleFR5cGVcIjtcblx0dHlwZTogc3RyaW5nO1xuXHRmb3JtYXRPcHRpb25zOiBvYmplY3Q7XG5cdHBhcmFtZXRlcnM6IG9iamVjdDtcblx0YmluZGluZ1BhcmFtZXRlcnM6IEV4cHJlc3Npb248YW55PltdO1xufTtcblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25FeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkZ1bmN0aW9uXCI7XG5cdG9iaj86IEV4cHJlc3Npb248b2JqZWN0Pjtcblx0Zm46IHN0cmluZztcblx0cGFyYW1ldGVyczogRXhwcmVzc2lvbjxhbnk+W107XG59O1xuXG5leHBvcnQgdHlwZSBDb25jYXRFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248c3RyaW5nPiAmIHtcblx0X3R5cGU6IFwiQ29uY2F0XCI7XG5cdGV4cHJlc3Npb25zOiBFeHByZXNzaW9uPHN0cmluZz5bXTtcbn07XG5cbmV4cG9ydCB0eXBlIFVucmVzb2x2ZWFibGVCaW5kaW5nRXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPHN0cmluZz4gJiB7XG5cdF90eXBlOiBcIlVucmVzb2x2ZWFibGVcIjtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uXG4gKi9cbmV4cG9ydCB0eXBlIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJCaW5kaW5nXCI7XG5cdG1vZGVsTmFtZT86IHN0cmluZztcblx0cGF0aDogc3RyaW5nO1xuXHR0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQ7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzPzogYW55O1xuXHRwYXJhbWV0ZXJzPzogYW55O1xuXHR0YXJnZXRUeXBlPzogc3RyaW5nO1xuXHRmb3JtYXRPcHRpb25zPzogYW55O1xufTtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJEZWZhdWx0QmluZGluZ1wiO1xuXHRtb2RlbE5hbWU/OiBzdHJpbmc7XG5cdHBhdGg6IHN0cmluZztcblx0dHlwZT86IHN0cmluZztcblx0Y29uc3RyYWludHM/OiBvYmplY3Q7XG5cdHBhcmFtZXRlcnM/OiBhbnk7XG5cdHRhcmdldFR5cGU/OiBzdHJpbmc7XG5cdGZvcm1hdE9wdGlvbnM/OiBvYmplY3Q7XG59O1xuXG5leHBvcnQgdHlwZSBFbWJlZGRlZEJpbmRpbmdFeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkVtYmVkZGVkQmluZGluZ1wiO1xuXHR2YWx1ZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ0V4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ1wiO1xuXHR2YWx1ZTogc3RyaW5nO1xufTtcblxudHlwZSBDb21wYXJpc29uT3BlcmF0b3IgPSBcIj09PVwiIHwgXCIhPT1cIiB8IFwiPj1cIiB8IFwiPlwiIHwgXCI8PVwiIHwgXCI8XCI7XG5leHBvcnQgdHlwZSBDb21wYXJpc29uRXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPGJvb2xlYW4+ICYge1xuXHRfdHlwZTogXCJDb21wYXJpc29uXCI7XG5cdG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3I7XG5cdG9wZXJhbmQxOiBFeHByZXNzaW9uPGFueT47XG5cdG9wZXJhbmQyOiBFeHByZXNzaW9uPGFueT47XG59O1xuXG5leHBvcnQgdHlwZSBJZkVsc2VFeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIklmRWxzZVwiO1xuXHRjb25kaXRpb246IEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdG9uVHJ1ZTogRXhwcmVzc2lvbjxUPjtcblx0b25GYWxzZTogRXhwcmVzc2lvbjxUPjtcbn07XG5cbi8qKlxuICogQW4gZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byB0eXBlIFQuXG4gKlxuICogQHR5cGVkZWYgRXhwcmVzc2lvblxuICovXG5leHBvcnQgdHlwZSBFeHByZXNzaW9uPFQ+ID1cblx0fCBVbnJlc29sdmVhYmxlQmluZGluZ0V4cHJlc3Npb25cblx0fCBDb25zdGFudEV4cHJlc3Npb248VD5cblx0fCBTZXRFeHByZXNzaW9uXG5cdHwgTm90RXhwcmVzc2lvblxuXHR8IFRydXRoeUV4cHJlc3Npb25cblx0fCBDb25jYXRFeHByZXNzaW9uXG5cdHwgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+XG5cdHwgRW1iZWRkZWRCaW5kaW5nRXhwcmVzc2lvbjxUPlxuXHR8IEVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdFeHByZXNzaW9uPFQ+XG5cdHwgRGVmYXVsdEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPlxuXHR8IENvbXBhcmlzb25FeHByZXNzaW9uXG5cdHwgSWZFbHNlRXhwcmVzc2lvbjxUPlxuXHR8IEZvcm1hdHRlckV4cHJlc3Npb248VD5cblx0fCBDb21wbGV4VHlwZUV4cHJlc3Npb248VD5cblx0fCBSZWZlcmVuY2VFeHByZXNzaW9uXG5cdHwgRnVuY3Rpb25FeHByZXNzaW9uPFQ+O1xuXG4vKipcbiAqIEFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gdHlwZSBULCBvciBhIGNvbnN0YW50IHZhbHVlIG9mIHR5cGUgVFxuICovXG5leHBvcnQgdHlwZSBFeHByZXNzaW9uT3JQcmltaXRpdmU8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+ID0gRXhwcmVzc2lvbjxUPiB8IFQ7XG5cbmV4cG9ydCBjb25zdCB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjogVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uID0ge1xuXHRfdHlwZTogXCJVbnJlc29sdmVhYmxlXCJcbn07XG5cbmZ1bmN0aW9uIGVzY2FwZVhtbEF0dHJpYnV0ZShpbnB1dFN0cmluZzogc3RyaW5nKSB7XG5cdHJldHVybiBpbnB1dFN0cmluZy5yZXBsYWNlKC9bJ10vZywgZnVuY3Rpb24oYzogc3RyaW5nKSB7XG5cdFx0c3dpdGNoIChjKSB7XG5cdFx0XHRjYXNlIFwiJ1wiOlxuXHRcdFx0XHRyZXR1cm4gXCJcXFxcJ1wiO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGM7XG5cdFx0fVxuXHR9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKC4uLmV4cHJlc3Npb25zOiBFeHByZXNzaW9uPGFueT5bXSk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gZXhwcmVzc2lvbnMuZmluZChleHByID0+IGV4cHIuX3R5cGUgPT09IFwiVW5yZXNvbHZlYWJsZVwiKSAhPT0gdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBDaGVjayB0d28gZXhwcmVzc2lvbnMgZm9yIChkZWVwKSBlcXVhbGl0eS5cbiAqXG4gKiBAcGFyYW0gYVxuICogQHBhcmFtIGJcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHR3byBleHByZXNzaW9ucyBhcmUgZXF1YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWw8VD4oYTogRXhwcmVzc2lvbjxUPiwgYjogRXhwcmVzc2lvbjxUPik6IGJvb2xlYW4ge1xuXHRpZiAoYS5fdHlwZSAhPT0gYi5fdHlwZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHN3aXRjaCAoYS5fdHlwZSkge1xuXHRcdGNhc2UgXCJVbnJlc29sdmVhYmxlXCI6XG5cdFx0XHRyZXR1cm4gZmFsc2U7IC8vIFVucmVzb2x2ZWFibGUgaXMgbmV2ZXIgZXF1YWwgdG8gYW55dGhpbmcgZXZlbiBpdHNlbGZcblx0XHRjYXNlIFwiQ29uc3RhbnRcIjpcblx0XHRjYXNlIFwiRW1iZWRkZWRCaW5kaW5nXCI6XG5cdFx0Y2FzZSBcIkVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdcIjpcblx0XHRcdHJldHVybiBhLnZhbHVlID09PSAoYiBhcyBDb25zdGFudEV4cHJlc3Npb248VD4pLnZhbHVlO1xuXG5cdFx0Y2FzZSBcIk5vdFwiOlxuXHRcdFx0cmV0dXJuIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vcGVyYW5kLCAoYiBhcyBOb3RFeHByZXNzaW9uKS5vcGVyYW5kKTtcblx0XHRjYXNlIFwiVHJ1dGh5XCI6XG5cdFx0XHRyZXR1cm4gX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9wZXJhbmQsIChiIGFzIFRydXRoeUV4cHJlc3Npb24pLm9wZXJhbmQpO1xuXHRcdGNhc2UgXCJTZXRcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEub3BlcmF0b3IgPT09IChiIGFzIFNldEV4cHJlc3Npb24pLm9wZXJhdG9yICYmXG5cdFx0XHRcdGEub3BlcmFuZHMubGVuZ3RoID09PSAoYiBhcyBTZXRFeHByZXNzaW9uKS5vcGVyYW5kcy5sZW5ndGggJiZcblx0XHRcdFx0YS5vcGVyYW5kcy5ldmVyeShleHByZXNzaW9uID0+XG5cdFx0XHRcdFx0KGIgYXMgU2V0RXhwcmVzc2lvbikub3BlcmFuZHMuc29tZShvdGhlckV4cHJlc3Npb24gPT4gX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChleHByZXNzaW9uLCBvdGhlckV4cHJlc3Npb24pKVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIklmRWxzZVwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLmNvbmRpdGlvbiwgKGIgYXMgSWZFbHNlRXhwcmVzc2lvbjxUPikuY29uZGl0aW9uKSAmJlxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub25UcnVlLCAoYiBhcyBJZkVsc2VFeHByZXNzaW9uPFQ+KS5vblRydWUpICYmXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vbkZhbHNlLCAoYiBhcyBJZkVsc2VFeHByZXNzaW9uPFQ+KS5vbkZhbHNlKVxuXHRcdFx0KTtcblxuXHRcdGNhc2UgXCJDb21wYXJpc29uXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLm9wZXJhdG9yID09IChiIGFzIENvbXBhcmlzb25FeHByZXNzaW9uKS5vcGVyYXRvciAmJlxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub3BlcmFuZDEsIChiIGFzIENvbXBhcmlzb25FeHByZXNzaW9uKS5vcGVyYW5kMSkgJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9wZXJhbmQyLCAoYiBhcyBDb21wYXJpc29uRXhwcmVzc2lvbikub3BlcmFuZDIpXG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIkNvbmNhdFwiOlxuXHRcdFx0Y29uc3QgYUV4cHJlc3Npb25zID0gYS5leHByZXNzaW9ucztcblx0XHRcdGNvbnN0IGJFeHByZXNzaW9ucyA9IChiIGFzIENvbmNhdEV4cHJlc3Npb24pLmV4cHJlc3Npb25zO1xuXHRcdFx0aWYgKGFFeHByZXNzaW9ucy5sZW5ndGggIT09IGJFeHByZXNzaW9ucy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFFeHByZXNzaW9ucy5ldmVyeSgoZXhwcmVzc2lvbiwgaW5kZXgpID0+IHtcblx0XHRcdFx0cmV0dXJuIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoZXhwcmVzc2lvbiwgYkV4cHJlc3Npb25zW2luZGV4XSk7XG5cdFx0XHR9KTtcblxuXHRcdGNhc2UgXCJCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLm1vZGVsTmFtZSA9PT0gKGIgYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+KS5tb2RlbE5hbWUgJiZcblx0XHRcdFx0YS5wYXRoID09PSAoYiBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4pLnBhdGggJiZcblx0XHRcdFx0YS50YXJnZXRFbnRpdHlTZXQgPT09IChiIGFzIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikudGFyZ2V0RW50aXR5U2V0XG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIkRlZmF1bHRCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLm1vZGVsTmFtZSA9PT0gKGIgYXMgRGVmYXVsdEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikubW9kZWxOYW1lICYmXG5cdFx0XHRcdGEucGF0aCA9PT0gKGIgYXMgRGVmYXVsdEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikucGF0aFxuXHRcdFx0KTtcblxuXHRcdGNhc2UgXCJGb3JtYXR0ZXJcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEuZm4gPT09IChiIGFzIEZvcm1hdHRlckV4cHJlc3Npb248VD4pLmZuICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5sZW5ndGggPT09IChiIGFzIEZvcm1hdHRlckV4cHJlc3Npb248VD4pLnBhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKChiIGFzIEZvcm1hdHRlckV4cHJlc3Npb248VD4pLnBhcmFtZXRlcnNbaW5kZXhdLCB2YWx1ZSkpXG5cdFx0XHQpO1xuXHRcdGNhc2UgXCJDb21wbGV4VHlwZVwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS50eXBlID09PSAoYiBhcyBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4pLnR5cGUgJiZcblx0XHRcdFx0YS5iaW5kaW5nUGFyYW1ldGVycy5sZW5ndGggPT09IChiIGFzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikuYmluZGluZ1BhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRcdGEuYmluZGluZ1BhcmFtZXRlcnMuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT5cblx0XHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKChiIGFzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikuYmluZGluZ1BhcmFtZXRlcnNbaW5kZXhdLCB2YWx1ZSlcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRjYXNlIFwiRnVuY3Rpb25cIjpcblx0XHRcdGNvbnN0IG90aGVyRnVuY3Rpb24gPSBiIGFzIEZ1bmN0aW9uRXhwcmVzc2lvbjxUPjtcblx0XHRcdGlmIChhLm9iaiA9PT0gdW5kZWZpbmVkIHx8IG90aGVyRnVuY3Rpb24ub2JqID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGEub2JqID09PSBvdGhlckZ1bmN0aW9uO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLmZuID09PSBvdGhlckZ1bmN0aW9uLmZuICYmXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vYmosIG90aGVyRnVuY3Rpb24ub2JqKSAmJlxuXHRcdFx0XHRhLnBhcmFtZXRlcnMubGVuZ3RoID09PSBvdGhlckZ1bmN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKG90aGVyRnVuY3Rpb24ucGFyYW1ldGVyc1tpbmRleF0sIHZhbHVlKSlcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiUmVmXCI6XG5cdFx0XHRyZXR1cm4gYS5yZWYgPT09IChiIGFzIFJlZmVyZW5jZUV4cHJlc3Npb24pLnJlZjtcblx0fVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbmVzdGVkIFNldEV4cHJlc3Npb24gYnkgaW5saW5pbmcgb3BlcmFuZHMgb2YgdHlwZSBTZXRFeHByZXNzaW9uIHdpdGggdGhlIHNhbWUgb3BlcmF0b3IuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gZmxhdHRlblxuICogQHJldHVybnMge1NldEV4cHJlc3Npb259IEEgbmV3IFNldEV4cHJlc3Npb24gd2l0aCB0aGUgc2FtZSBvcGVyYXRvclxuICovXG5mdW5jdGlvbiBmbGF0dGVuU2V0RXhwcmVzc2lvbihleHByZXNzaW9uOiBTZXRFeHByZXNzaW9uKTogU2V0RXhwcmVzc2lvbiB7XG5cdHJldHVybiBleHByZXNzaW9uLm9wZXJhbmRzLnJlZHVjZShcblx0XHQocmVzdWx0OiBTZXRFeHByZXNzaW9uLCBvcGVyYW5kKSA9PiB7XG5cdFx0XHRjb25zdCBjYW5kaWRhdGVzRm9yRmxhdHRlbmluZyA9XG5cdFx0XHRcdG9wZXJhbmQuX3R5cGUgPT09IFwiU2V0XCIgJiYgb3BlcmFuZC5vcGVyYXRvciA9PT0gZXhwcmVzc2lvbi5vcGVyYXRvciA/IG9wZXJhbmQub3BlcmFuZHMgOiBbb3BlcmFuZF07XG5cdFx0XHRjYW5kaWRhdGVzRm9yRmxhdHRlbmluZy5mb3JFYWNoKGNhbmRpZGF0ZSA9PiB7XG5cdFx0XHRcdGlmIChyZXN1bHQub3BlcmFuZHMuZXZlcnkoZSA9PiAhX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChlLCBjYW5kaWRhdGUpKSkge1xuXHRcdFx0XHRcdHJlc3VsdC5vcGVyYW5kcy5wdXNoKGNhbmRpZGF0ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9LFxuXHRcdHsgX3R5cGU6IFwiU2V0XCIsIG9wZXJhdG9yOiBleHByZXNzaW9uLm9wZXJhdG9yLCBvcGVyYW5kczogW10gfVxuXHQpO1xufVxuXG4vKipcbiAqIERldGVjdHMgd2hldGhlciBhbiBhcnJheSBvZiBib29sZWFuIGV4cHJlc3Npb25zIGNvbnRhaW5zIGFuIGV4cHJlc3Npb24gYW5kIGl0cyBuZWdhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbnMgQXJyYXkgb2YgZXhwcmVzc2lvbnNcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHNldCBvZiBleHByZXNzaW9ucyBjb250YWlucyBhbiBleHByZXNzaW9uIGFuZCBpdHMgbmVnYXRpb25cbiAqL1xuZnVuY3Rpb24gaGFzT3Bwb3NpdGVFeHByZXNzaW9ucyhleHByZXNzaW9uczogRXhwcmVzc2lvbjxib29sZWFuPltdKTogYm9vbGVhbiB7XG5cdGlmIChleHByZXNzaW9ucy5sZW5ndGggPCAyKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0bGV0IGkgPSBleHByZXNzaW9ucy5sZW5ndGg7XG5cdHdoaWxlIChpLS0pIHtcblx0XHRjb25zdCBleHByZXNzaW9uID0gZXhwcmVzc2lvbnNbaV07XG5cdFx0Y29uc3QgbmVnYXRlZEV4cHJlc3Npb24gPSBub3QoZXhwcmVzc2lvbik7XG5cdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBpOyBqKyspIHtcblx0XHRcdGlmIChfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGV4cHJlc3Npb25zW2pdLCBuZWdhdGVkRXhwcmVzc2lvbikpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBMb2dpY2FsIGBhbmRgIGV4cHJlc3Npb24uXG4gKlxuICogVGhlIGV4cHJlc3Npb24gaXMgc2ltcGxpZmllZCB0byBmYWxzZSBpZiB0aGlzIGNhbiBiZSBkZWNpZGVkIHN0YXRpY2FsbHkgKHRoYXQgaXMsIGlmIG9uZSBvcGVyYW5kIGlzIGEgY29uc3RhbnRcbiAqIGZhbHNlIG9yIGlmIHRoZSBleHByZXNzaW9uIGNvbnRhaW5zIGFuIG9wZXJhbmQgYW5kIGl0cyBuZWdhdGlvbikuXG4gKlxuICogQHBhcmFtIG9wZXJhbmRzIEV4cHJlc3Npb25zIHRvIGNvbm5lY3QgYnkgYGFuZGBcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBFeHByZXNzaW9uIGV2YWx1YXRpbmcgdG8gYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kKC4uLm9wZXJhbmRzOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj5bXSk6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGZsYXR0ZW5TZXRFeHByZXNzaW9uKHtcblx0XHRfdHlwZTogXCJTZXRcIixcblx0XHRvcGVyYXRvcjogXCImJlwiLFxuXHRcdG9wZXJhbmRzOiBvcGVyYW5kcy5tYXAod3JhcFByaW1pdGl2ZSlcblx0fSkub3BlcmFuZHM7XG5cblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKC4uLmV4cHJlc3Npb25zKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRsZXQgaXNTdGF0aWNGYWxzZTogYm9vbGVhbiA9IGZhbHNlO1xuXHRjb25zdCBub25Ucml2aWFsRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25zLmZpbHRlcihleHByZXNzaW9uID0+IHtcblx0XHRpZiAoaXNDb25zdGFudChleHByZXNzaW9uKSAmJiAhZXhwcmVzc2lvbi52YWx1ZSkge1xuXHRcdFx0aXNTdGF0aWNGYWxzZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAhaXNDb25zdGFudChleHByZXNzaW9uKTtcblx0fSk7XG5cdGlmIChpc1N0YXRpY0ZhbHNlKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0fSBlbHNlIGlmIChub25Ucml2aWFsRXhwcmVzc2lvbi5sZW5ndGggPT09IDApIHtcblx0XHQvLyBSZXNvbHZlIHRoZSBjb25zdGFudCB0aGVuXG5cdFx0Y29uc3QgaXNWYWxpZCA9IGV4cHJlc3Npb25zLnJlZHVjZSgoaXNWYWxpZCwgZXhwcmVzc2lvbikgPT4ge1xuXHRcdFx0cmV0dXJuIGlzVmFsaWQgJiYgaXNDb25zdGFudChleHByZXNzaW9uKSAmJiBleHByZXNzaW9uLnZhbHVlO1xuXHRcdH0sIHRydWUpO1xuXHRcdHJldHVybiBjb25zdGFudChpc1ZhbGlkKTtcblx0fSBlbHNlIGlmIChub25Ucml2aWFsRXhwcmVzc2lvbi5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gbm9uVHJpdmlhbEV4cHJlc3Npb25bMF07XG5cdH0gZWxzZSBpZiAoaGFzT3Bwb3NpdGVFeHByZXNzaW9ucyhub25Ucml2aWFsRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoZmFsc2UpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRfdHlwZTogXCJTZXRcIixcblx0XHRcdG9wZXJhdG9yOiBcIiYmXCIsXG5cdFx0XHRvcGVyYW5kczogbm9uVHJpdmlhbEV4cHJlc3Npb25cblx0XHR9O1xuXHR9XG59XG5cbi8qKlxuICogTG9naWNhbCBgb3JgIGV4cHJlc3Npb24uXG4gKlxuICogVGhlIGV4cHJlc3Npb24gaXMgc2ltcGxpZmllZCB0byB0cnVlIGlmIHRoaXMgY2FuIGJlIGRlY2lkZWQgc3RhdGljYWxseSAodGhhdCBpcywgaWYgb25lIG9wZXJhbmQgaXMgYSBjb25zdGFudFxuICogdHJ1ZSBvciBpZiB0aGUgZXhwcmVzc2lvbiBjb250YWlucyBhbiBvcGVyYW5kIGFuZCBpdHMgbmVnYXRpb24pLlxuICpcbiAqIEBwYXJhbSBvcGVyYW5kcyBFeHByZXNzaW9ucyB0byBjb25uZWN0IGJ5IGBvcmBcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBFeHByZXNzaW9uIGV2YWx1YXRpbmcgdG8gYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gb3IoLi4ub3BlcmFuZHM6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPltdKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGV4cHJlc3Npb25zID0gZmxhdHRlblNldEV4cHJlc3Npb24oe1xuXHRcdF90eXBlOiBcIlNldFwiLFxuXHRcdG9wZXJhdG9yOiBcInx8XCIsXG5cdFx0b3BlcmFuZHM6IG9wZXJhbmRzLm1hcCh3cmFwUHJpbWl0aXZlKVxuXHR9KS5vcGVyYW5kcztcblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKC4uLmV4cHJlc3Npb25zKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRsZXQgaXNTdGF0aWNUcnVlOiBib29sZWFuID0gZmFsc2U7XG5cdGNvbnN0IG5vblRyaXZpYWxFeHByZXNzaW9uID0gZXhwcmVzc2lvbnMuZmlsdGVyKGV4cHJlc3Npb24gPT4ge1xuXHRcdGlmIChpc0NvbnN0YW50KGV4cHJlc3Npb24pICYmIGV4cHJlc3Npb24udmFsdWUpIHtcblx0XHRcdGlzU3RhdGljVHJ1ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAhaXNDb25zdGFudChleHByZXNzaW9uKSB8fCBleHByZXNzaW9uLnZhbHVlO1xuXHR9KTtcblx0aWYgKGlzU3RhdGljVHJ1ZSkge1xuXHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0fSBlbHNlIGlmIChub25Ucml2aWFsRXhwcmVzc2lvbi5sZW5ndGggPT09IDApIHtcblx0XHQvLyBSZXNvbHZlIHRoZSBjb25zdGFudCB0aGVuXG5cdFx0Y29uc3QgaXNWYWxpZCA9IGV4cHJlc3Npb25zLnJlZHVjZSgoaXNWYWxpZCwgZXhwcmVzc2lvbikgPT4ge1xuXHRcdFx0cmV0dXJuIGlzVmFsaWQgJiYgaXNDb25zdGFudChleHByZXNzaW9uKSAmJiBleHByZXNzaW9uLnZhbHVlO1xuXHRcdH0sIHRydWUpO1xuXHRcdHJldHVybiBjb25zdGFudChpc1ZhbGlkKTtcblx0fSBlbHNlIGlmIChub25Ucml2aWFsRXhwcmVzc2lvbi5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gbm9uVHJpdmlhbEV4cHJlc3Npb25bMF07XG5cdH0gZWxzZSBpZiAoaGFzT3Bwb3NpdGVFeHByZXNzaW9ucyhub25Ucml2aWFsRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdF90eXBlOiBcIlNldFwiLFxuXHRcdFx0b3BlcmF0b3I6IFwifHxcIixcblx0XHRcdG9wZXJhbmRzOiBub25Ucml2aWFsRXhwcmVzc2lvblxuXHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBMb2dpY2FsIGBub3RgIG9wZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBvcGVyYW5kIFRoZSBleHByZXNzaW9uIHRvIHJldmVyc2VcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBUaGUgcmVzdWx0aW5nIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gbm90KG9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRvcGVyYW5kID0gd3JhcFByaW1pdGl2ZShvcGVyYW5kKTtcblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKG9wZXJhbmQpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9IGVsc2UgaWYgKGlzQ29uc3RhbnQob3BlcmFuZCkpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoIW9wZXJhbmQudmFsdWUpO1xuXHR9IGVsc2UgaWYgKFxuXHRcdHR5cGVvZiBvcGVyYW5kID09PSBcIm9iamVjdFwiICYmXG5cdFx0b3BlcmFuZC5fdHlwZSA9PT0gXCJTZXRcIiAmJlxuXHRcdG9wZXJhbmQub3BlcmF0b3IgPT09IFwifHxcIiAmJlxuXHRcdG9wZXJhbmQub3BlcmFuZHMuZXZlcnkoZXhwcmVzc2lvbiA9PiBpc0NvbnN0YW50KGV4cHJlc3Npb24pIHx8IGlzQ29tcGFyaXNvbihleHByZXNzaW9uKSlcblx0KSB7XG5cdFx0cmV0dXJuIGFuZCguLi5vcGVyYW5kLm9wZXJhbmRzLm1hcChleHByZXNzaW9uID0+IG5vdChleHByZXNzaW9uKSkpO1xuXHR9IGVsc2UgaWYgKFxuXHRcdHR5cGVvZiBvcGVyYW5kID09PSBcIm9iamVjdFwiICYmXG5cdFx0b3BlcmFuZC5fdHlwZSA9PT0gXCJTZXRcIiAmJlxuXHRcdG9wZXJhbmQub3BlcmF0b3IgPT09IFwiJiZcIiAmJlxuXHRcdG9wZXJhbmQub3BlcmFuZHMuZXZlcnkoZXhwcmVzc2lvbiA9PiBpc0NvbnN0YW50KGV4cHJlc3Npb24pIHx8IGlzQ29tcGFyaXNvbihleHByZXNzaW9uKSlcblx0KSB7XG5cdFx0cmV0dXJuIG9yKC4uLm9wZXJhbmQub3BlcmFuZHMubWFwKGV4cHJlc3Npb24gPT4gbm90KGV4cHJlc3Npb24pKSk7XG5cdH0gZWxzZSBpZiAoaXNDb21wYXJpc29uKG9wZXJhbmQpKSB7XG5cdFx0Ly8gQ3JlYXRlIHRoZSByZXZlcnNlIGNvbXBhcmlzb25cblx0XHRzd2l0Y2ggKG9wZXJhbmQub3BlcmF0b3IpIHtcblx0XHRcdGNhc2UgXCIhPT1cIjpcblx0XHRcdFx0cmV0dXJuIGVxdWFsKG9wZXJhbmQub3BlcmFuZDEsIG9wZXJhbmQub3BlcmFuZDIpO1xuXHRcdFx0Y2FzZSBcIjxcIjpcblx0XHRcdFx0cmV0dXJuIGdyZWF0ZXJPckVxdWFsKG9wZXJhbmQub3BlcmFuZDEsIG9wZXJhbmQub3BlcmFuZDIpO1xuXHRcdFx0Y2FzZSBcIjw9XCI6XG5cdFx0XHRcdHJldHVybiBncmVhdGVyVGhhbihvcGVyYW5kLm9wZXJhbmQxLCBvcGVyYW5kLm9wZXJhbmQyKTtcblx0XHRcdGNhc2UgXCI9PT1cIjpcblx0XHRcdFx0cmV0dXJuIG5vdEVxdWFsKG9wZXJhbmQub3BlcmFuZDEsIG9wZXJhbmQub3BlcmFuZDIpO1xuXHRcdFx0Y2FzZSBcIj5cIjpcblx0XHRcdFx0cmV0dXJuIGxlc3NPckVxdWFsKG9wZXJhbmQub3BlcmFuZDEsIG9wZXJhbmQub3BlcmFuZDIpO1xuXHRcdFx0Y2FzZSBcIj49XCI6XG5cdFx0XHRcdHJldHVybiBsZXNzVGhhbihvcGVyYW5kLm9wZXJhbmQxLCBvcGVyYW5kLm9wZXJhbmQyKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAob3BlcmFuZC5fdHlwZSA9PT0gXCJOb3RcIikge1xuXHRcdHJldHVybiBvcGVyYW5kLm9wZXJhbmQ7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdF90eXBlOiBcIk5vdFwiLFxuXHRcdFx0b3BlcmFuZDogb3BlcmFuZFxuXHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBFdmFsdWF0ZXMgd2hldGhlciBhIGJpbmRpbmcgZXhwcmVzc2lvbiBpcyBlcXVhbCB0byB0cnVlIHdpdGggYSBsb29zZSBlcXVhbGl0eS5cbiAqXG4gKiBAcGFyYW0gb3BlcmFuZCBUaGUgZXhwcmVzc2lvbiB0byBjaGVja1xuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IFRoZSByZXN1bHRpbmcgZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RydXRoeShvcGVyYW5kOiBFeHByZXNzaW9uPHN0cmluZz4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKGlzQ29uc3RhbnQob3BlcmFuZCkpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoISFvcGVyYW5kLnZhbHVlKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0X3R5cGU6IFwiVHJ1dGh5XCIsXG5cdFx0XHRvcGVyYW5kOiBvcGVyYW5kXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaW5kaW5nIGV4cHJlc3Npb24gdGhhdCB3aWxsIGJlIGV2YWx1YXRlZCBieSB0aGUgY29ycmVzcG9uZGluZyBtb2RlbC5cbiAqXG4gKiBAdGVtcGxhdGUgVGFyZ2V0VHlwZVxuICogQHBhcmFtIHBhdGggVGhlIHBhdGggb24gdGhlIG1vZGVsXG4gKiBAcGFyYW0gW21vZGVsTmFtZV0gVGhlIG5hbWUgb2YgdGhlIG1vZGVsXG4gKiBAcGFyYW0gW3Zpc2l0ZWROYXZpZ2F0aW9uUGF0aHNdIFRoZSBwYXRocyBmcm9tIHRoZSByb290IGVudGl0eVNldFxuICogQHBhcmFtIFtwYXRoVmlzaXRvcl0gQSBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIHJlc3VsdGluZyBwYXRoXG4gKiBAcmV0dXJucyB7QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFRhcmdldFR5cGU+fSBUaGUgZGVmYXVsdCBiaW5kaW5nIGV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRpbmdFeHByZXNzaW9uPFRhcmdldFR5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0cGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRtb2RlbE5hbWU/OiBzdHJpbmcsXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdID0gW10sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUYXJnZXRUeXBlPiB8IFVucmVzb2x2ZWFibGVCaW5kaW5nRXhwcmVzc2lvbiB7XG5cdGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0bGV0IHRhcmdldFBhdGg7XG5cdGlmIChwYXRoVmlzaXRvcikge1xuXHRcdHRhcmdldFBhdGggPSBwYXRoVmlzaXRvcihwYXRoKTtcblx0XHRpZiAodGFyZ2V0UGF0aCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGxvY2FsUGF0aCA9IHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMuY29uY2F0KCk7XG5cdFx0bG9jYWxQYXRoLnB1c2gocGF0aCk7XG5cdFx0dGFyZ2V0UGF0aCA9IGxvY2FsUGF0aC5qb2luKFwiL1wiKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIkJpbmRpbmdcIixcblx0XHRtb2RlbE5hbWU6IG1vZGVsTmFtZSxcblx0XHRwYXRoOiB0YXJnZXRQYXRoXG5cdH07XG59XG5cbnR5cGUgUGxhaW5FeHByZXNzaW9uT2JqZWN0ID0geyBbaW5kZXg6IHN0cmluZ106IEV4cHJlc3Npb248YW55PiB9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb25zdGFudCBleHByZXNzaW9uIGJhc2VkIG9uIGEgcHJpbWl0aXZlIHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0gdmFsdWUgVGhlIGNvbnN0YW50IHRvIHdyYXAgaW4gYW4gZXhwcmVzc2lvblxuICogQHJldHVybnMge0NvbnN0YW50RXhwcmVzc2lvbjxUPn0gVGhlIGNvbnN0YW50IGV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0YW50PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPih2YWx1ZTogVCk6IENvbnN0YW50RXhwcmVzc2lvbjxUPiB7XG5cdGxldCBjb25zdGFudFZhbHVlOiBUO1xuXG5cdGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0Y29uc3RhbnRWYWx1ZSA9IHZhbHVlLm1hcCh3cmFwUHJpbWl0aXZlKSBhcyBUO1xuXHRcdH0gZWxzZSBpZiAoaXNQcmltaXRpdmVPYmplY3QodmFsdWUgYXMgb2JqZWN0KSkge1xuXHRcdFx0Y29uc3RhbnRWYWx1ZSA9IHZhbHVlLnZhbHVlT2YoKSBhcyBUO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCB2YWwgPSB2YWx1ZSBhcyB7IFtuYW1lOiBzdHJpbmddOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8YW55PiB9O1xuXHRcdFx0Y29uc3Qgb2JqID0gT2JqZWN0LmtleXModmFsKS5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gd3JhcFByaW1pdGl2ZSh2YWxba2V5XSk7XG5cdFx0XHRcdGlmICh2YWx1ZS5fdHlwZSAhPT0gXCJDb25zdGFudFwiIHx8IHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRvYmpba2V5XSA9IHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvYmo7XG5cdFx0XHR9LCB7fSBhcyBQbGFpbkV4cHJlc3Npb25PYmplY3QpO1xuXG5cdFx0XHRjb25zdGFudFZhbHVlID0gb2JqIGFzIFQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbnN0YW50VmFsdWUgPSB2YWx1ZTtcblx0fVxuXG5cdHJldHVybiB7IF90eXBlOiBcIkNvbnN0YW50XCIsIHZhbHVlOiBjb25zdGFudFZhbHVlIH07XG59XG5cbnR5cGUgRXZhbHVhdGlvblR5cGUgPSBcImJvb2xlYW5cIjtcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQmluZGluZ1N0cmluZzxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyLFxuXHR0YXJnZXRUeXBlPzogRXZhbHVhdGlvblR5cGVcbik6IENvbnN0YW50RXhwcmVzc2lvbjxUPiB8IEVtYmVkZGVkQmluZGluZ0V4cHJlc3Npb248VD4gfCBFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nRXhwcmVzc2lvbjxUPiB7XG5cdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5zdGFydHNXaXRoKFwie1wiKSkge1xuXHRcdGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiez1cIikpIHtcblx0XHRcdC8vIEV4cHJlc3Npb24gYmluZGluZywgd2UgY2FuIGp1c3QgcmVtb3ZlIHRoZSBvdXRlciBiaW5kaW5nIHRoaW5nc1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0X3R5cGU6IFwiRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ1wiLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdF90eXBlOiBcIkVtYmVkZGVkQmluZGluZ1wiLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHN3aXRjaCAodGFyZ2V0VHlwZSkge1xuXHRcdFx0Y2FzZSBcImJvb2xlYW5cIjpcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAodmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSBcImZhbHNlXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KHZhbHVlID09PSBcInRydWVcIikgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjb25zdGFudCh2YWx1ZSkgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+O1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KHZhbHVlKSBhcyBDb25zdGFudEV4cHJlc3Npb248VD47XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQSBuYW1lZCByZWZlcmVuY2UuXG4gKlxuICogQHNlZSBmblxuICpcbiAqIEBwYXJhbSByZWYgUmVmZXJlbmNlXG4gKiBAcmV0dXJucyB7UmVmZXJlbmNlRXhwcmVzc2lvbn0gVGhlIG9iamVjdCByZWZlcmVuY2UgYmluZGluZyBwYXJ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWYocmVmOiBzdHJpbmcgfCBudWxsKTogUmVmZXJlbmNlRXhwcmVzc2lvbiB7XG5cdHJldHVybiB7IF90eXBlOiBcIlJlZlwiLCByZWYgfTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgdHlwZSBpcyBhbiBleHByZXNzaW9uLlxuICpcbiAqIEV2ZXJ5IG9iamVjdCBoYXZpbmcgYSBwcm9wZXJ0eSBuYW1lZCBgX3R5cGVgIG9mIHNvbWUgdmFsdWUgaXMgY29uc2lkZXJlZCBhbiBleHByZXNzaW9uLCBldmVuIGlmIHRoZXJlIGlzIGFjdHVhbGx5XG4gKiBubyBzdWNoIGV4cHJlc3Npb24gdHlwZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHNvbWV0aGluZyBUeXBlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB0eXBlIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiBpc0V4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KHNvbWV0aGluZzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+KTogc29tZXRoaW5nIGlzIEV4cHJlc3Npb248VD4ge1xuXHRyZXR1cm4gc29tZXRoaW5nICE9PSBudWxsICYmIHR5cGVvZiBzb21ldGhpbmcgPT09IFwib2JqZWN0XCIgJiYgKHNvbWV0aGluZyBhcyBCYXNlRXhwcmVzc2lvbjxUPikuX3R5cGUgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcmFwIGEgcHJpbWl0aXZlIGludG8gYSBjb25zdGFudCBleHByZXNzaW9uIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGFuIGV4cHJlc3Npb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSBzb21ldGhpbmcgVGhlIG9iamVjdCB0byB3cmFwIGluIGEgQ29uc3RhbnQgZXhwcmVzc2lvblxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IEVpdGhlciB0aGUgb3JpZ2luYWwgb2JqZWN0IG9yIHRoZSB3cmFwcGVkIG9uZSBkZXBlbmRpbmcgb24gdGhlIGNhc2VcbiAqL1xuZnVuY3Rpb24gd3JhcFByaW1pdGl2ZTxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oc29tZXRoaW5nOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBFeHByZXNzaW9uPFQ+IHtcblx0aWYgKGlzRXhwcmVzc2lvbihzb21ldGhpbmcpKSB7XG5cdFx0cmV0dXJuIHNvbWV0aGluZztcblx0fVxuXG5cdHJldHVybiBjb25zdGFudChzb21ldGhpbmcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZXhwcmVzc2lvbiBvciB2YWx1ZSBwcm92aWRlZCBpcyBjb25zdGFudCBvciBub3QuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gIG1heWJlQ29uc3RhbnQgVGhlIGV4cHJlc3Npb24gb3IgcHJpbWl0aXZlIHZhbHVlIHRoYXQgaXMgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBpdCBpcyBjb25zdGFudFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb25zdGFudDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4obWF5YmVDb25zdGFudDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+KTogbWF5YmVDb25zdGFudCBpcyBDb25zdGFudEV4cHJlc3Npb248VD4ge1xuXHRyZXR1cm4gdHlwZW9mIG1heWJlQ29uc3RhbnQgIT09IFwib2JqZWN0XCIgfHwgKG1heWJlQ29uc3RhbnQgYXMgQmFzZUV4cHJlc3Npb248VD4pLl90eXBlID09PSBcIkNvbnN0YW50XCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBleHByZXNzaW9uIG9yIHZhbHVlIHByb3ZpZGVkIGlzIGJpbmRpbmcgb3Igbm90LlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtICBtYXliZUJpbmRpbmcgVGhlIGV4cHJlc3Npb24gb3IgcHJpbWl0aXZlIHZhbHVlIHRoYXQgaXMgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBpdCBpcyBiaW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmRpbmc8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KG1heWJlQmluZGluZzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+KTogbWF5YmVCaW5kaW5nIGlzIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPiB7XG5cdHJldHVybiB0eXBlb2YgbWF5YmVCaW5kaW5nID09PSBcIm9iamVjdFwiICYmIChtYXliZUJpbmRpbmcgYXMgQmFzZUV4cHJlc3Npb248VD4pLl90eXBlID09PSBcIkJpbmRpbmdcIjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGV4cHJlc3Npb24gcHJvdmlkZWQgaXMgYSBjb21wYXJpc29uIG9yIG5vdC5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgQ29tcGFyaXNvbkV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gaXNDb21wYXJpc29uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByZXNzaW9uOiBFeHByZXNzaW9uPFQ+KTogZXhwcmVzc2lvbiBpcyBDb21wYXJpc29uRXhwcmVzc2lvbiB7XG5cdHJldHVybiBleHByZXNzaW9uLl90eXBlID09PSBcIkNvbXBhcmlzb25cIjtcbn1cblxudHlwZSBDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb248UD4gPVxuXHR8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IEFwcGx5QW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBJZkFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgT3JBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IEFuZEFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgTmVBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IEVxQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBOb3RBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IEd0QW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBHZUFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgTGVBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IEx0QW5ub3RhdGlvbkV4cHJlc3Npb248UD47XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlT2JqZWN0KG9iamVjdFR5cGU6IG9iamVjdCk6IGJvb2xlYW4ge1xuXHRzd2l0Y2ggKG9iamVjdFR5cGUuY29uc3RydWN0b3IubmFtZSkge1xuXHRcdGNhc2UgXCJTdHJpbmdcIjpcblx0XHRjYXNlIFwiTnVtYmVyXCI6XG5cdFx0Y2FzZSBcIkJvb2xlYW5cIjpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHBhc3NlZCBhbm5vdGF0aW9uIGV4cHJlc3Npb24gaXMgYSBDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb24uXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gIGFubm90YXRpb25FeHByZXNzaW9uIFRoZSBhbm5vdGF0aW9uIGV4cHJlc3Npb24gdG8gZXZhbHVhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBpcyBhIHtDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb259XG4gKi9cbmZ1bmN0aW9uIGlzQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uPFQ+KFxuXHRhbm5vdGF0aW9uRXhwcmVzc2lvbjogUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8VD5cbik6IGFubm90YXRpb25FeHByZXNzaW9uIGlzIENvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbjxUPiB7XG5cdHJldHVybiB0eXBlb2YgYW5ub3RhdGlvbkV4cHJlc3Npb24gPT09IFwib2JqZWN0XCIgJiYgIWlzUHJpbWl0aXZlT2JqZWN0KGFubm90YXRpb25FeHByZXNzaW9uIGFzIG9iamVjdCk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvbiBmb3IgYSBnaXZlbiBhbm5vdGF0aW9uIGV4cHJlc3Npb24uXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkV4cHJlc3Npb24gVGhlIHNvdXJjZSBhbm5vdGF0aW9uIGV4cHJlc3Npb25cbiAqIEBwYXJhbSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzIFRoZSBwYXRoIGZyb20gdGhlIHJvb3QgZW50aXR5IHNldFxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlIGlmIHRoZSBhbm5vdGF0aW9uRXhwcmVzc2lvbiBpcyB1bmRlZmluZWRcbiAqIEBwYXJhbSBwYXRoVmlzaXRvciBBIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgcmVzdWx0aW5nIHBhdGhcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPFQ+fSBUaGUgZXhwcmVzc2lvbiBlcXVpdmFsZW50IHRvIHRoYXQgYW5ub3RhdGlvbiBleHByZXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0aW9uRXhwcmVzc2lvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGFubm90YXRpb25FeHByZXNzaW9uOiBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxUPixcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0ZGVmYXVsdFZhbHVlPzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0aWYgKGFubm90YXRpb25FeHByZXNzaW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gd3JhcFByaW1pdGl2ZShkZWZhdWx0VmFsdWUgYXMgVCk7XG5cdH1cblx0aWYgKCFpc0NvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbihhbm5vdGF0aW9uRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoYW5ub3RhdGlvbkV4cHJlc3Npb24pO1xuXHR9IGVsc2Uge1xuXHRcdHN3aXRjaCAoYW5ub3RhdGlvbkV4cHJlc3Npb24udHlwZSkge1xuXHRcdFx0Y2FzZSBcIlBhdGhcIjpcblx0XHRcdFx0cmV0dXJuIGJpbmRpbmdFeHByZXNzaW9uKGFubm90YXRpb25FeHByZXNzaW9uLnBhdGgsIHVuZGVmaW5lZCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdFx0Y2FzZSBcIklmXCI6XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uSWZFeHByZXNzaW9uKGFubm90YXRpb25FeHByZXNzaW9uLklmLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0XHRjYXNlIFwiTm90XCI6XG5cdFx0XHRcdHJldHVybiBub3QocGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25FeHByZXNzaW9uLk5vdCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpKSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdFx0Y2FzZSBcIkVxXCI6XG5cdFx0XHRcdHJldHVybiBlcXVhbChcblx0XHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvbkV4cHJlc3Npb24uRXFbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvbkV4cHJlc3Npb24uRXFbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0XHRjYXNlIFwiTmVcIjpcblx0XHRcdFx0cmV0dXJuIG5vdEVxdWFsKFxuXHRcdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uRXhwcmVzc2lvbi5OZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uRXhwcmVzc2lvbi5OZVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdGNhc2UgXCJHdFwiOlxuXHRcdFx0XHRyZXR1cm4gZ3JlYXRlclRoYW4oXG5cdFx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25FeHByZXNzaW9uLkd0WzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25FeHByZXNzaW9uLkd0WzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdFx0Y2FzZSBcIkdlXCI6XG5cdFx0XHRcdHJldHVybiBncmVhdGVyT3JFcXVhbChcblx0XHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvbkV4cHJlc3Npb24uR2VbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvbkV4cHJlc3Npb24uR2VbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0XHRjYXNlIFwiTHRcIjpcblx0XHRcdFx0cmV0dXJuIGxlc3NUaGFuKFxuXHRcdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uRXhwcmVzc2lvbi5MdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uRXhwcmVzc2lvbi5MdFsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdGNhc2UgXCJMZVwiOlxuXHRcdFx0XHRyZXR1cm4gbGVzc09yRXF1YWwoXG5cdFx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25FeHByZXNzaW9uLkxlWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25FeHByZXNzaW9uLkxlWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdFx0Y2FzZSBcIk9yXCI6XG5cdFx0XHRcdHJldHVybiBvcihcblx0XHRcdFx0XHQuLi4oYW5ub3RhdGlvbkV4cHJlc3Npb24uT3IubWFwKGZ1bmN0aW9uKG9yQ29uZGl0aW9uKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKG9yQ29uZGl0aW9uLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0XHRcdFx0fSkgYXMgRXhwcmVzc2lvbjxib29sZWFuPltdKVxuXHRcdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0XHRjYXNlIFwiQW5kXCI6XG5cdFx0XHRcdHJldHVybiBhbmQoXG5cdFx0XHRcdFx0Li4uKGFubm90YXRpb25FeHByZXNzaW9uLkFuZC5tYXAoZnVuY3Rpb24oYW5kQ29uZGl0aW9uKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFuZENvbmRpdGlvbiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdFx0XHRcdH0pIGFzIEV4cHJlc3Npb248Ym9vbGVhbj5bXSlcblx0XHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdFx0Y2FzZSBcIkFwcGx5XCI6XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQXBwbHlFeHByZXNzaW9uKFxuXHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uIGFzIEFwcGx5QW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPixcblx0XHRcdFx0XHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzLFxuXHRcdFx0XHRcdHBhdGhWaXNpdG9yXG5cdFx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgYW5ub3RhdGlvbiBjb25kaXRpb24gaW50byBhbiBleHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGFubm90YXRpb25WYWx1ZSBUaGUgY29uZGl0aW9uIG9yIHZhbHVlIGZyb20gdGhlIGFubm90YXRpb25cbiAqIEBwYXJhbSB2aXNpdGVkTmF2aWdhdGlvblBhdGhzIFRoZSBwYXRoIGZyb20gdGhlIHJvb3QgZW50aXR5IHNldFxuICogQHBhcmFtIHBhdGhWaXNpdG9yIEEgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSByZXN1bHRpbmcgcGF0aFxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IEFuIGVxdWl2YWxlbnQgZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiBwYXJzZUFubm90YXRpb25Db25kaXRpb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRhbm5vdGF0aW9uVmFsdWU6IENvbmRpdGlvbmFsQ2hlY2tPclZhbHVlLFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0aWYgKGFubm90YXRpb25WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgYW5ub3RhdGlvblZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGFubm90YXRpb25WYWx1ZSBhcyBUKTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkT3JcIikpIHtcblx0XHRyZXR1cm4gb3IoXG5cdFx0XHQuLi4oKChhbm5vdGF0aW9uVmFsdWUgYXMgT3JDb25kaXRpb25hbEV4cHJlc3Npb24pLiRPci5tYXAoZnVuY3Rpb24ob3JDb25kaXRpb24pIHtcblx0XHRcdFx0cmV0dXJuIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihvckNvbmRpdGlvbiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdFx0fSkgYXMgdW5rbm93bikgYXMgRXhwcmVzc2lvbjxib29sZWFuPltdKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkQW5kXCIpKSB7XG5cdFx0cmV0dXJuIGFuZChcblx0XHRcdC4uLigoKGFubm90YXRpb25WYWx1ZSBhcyBBbmRDb25kaXRpb25hbEV4cHJlc3Npb24pLiRBbmQubWFwKGZ1bmN0aW9uKGFuZENvbmRpdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gcGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFuZENvbmRpdGlvbiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdFx0fSkgYXMgdW5rbm93bikgYXMgRXhwcmVzc2lvbjxib29sZWFuPltdKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkTm90XCIpKSB7XG5cdFx0cmV0dXJuIG5vdChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIE5vdENvbmRpdGlvbmFsRXhwcmVzc2lvbikuJE5vdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRFcVwiKSkge1xuXHRcdHJldHVybiBlcXVhbChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEVxQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kRXFbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEVxQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kRXFbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkTmVcIikpIHtcblx0XHRyZXR1cm4gbm90RXF1YWwoXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBOZUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJE5lWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBOZUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJE5lWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEd0XCIpKSB7XG5cdFx0cmV0dXJuIGdyZWF0ZXJUaGFuKFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgR3RDb25kaXRpb25hbEV4cHJlc3Npb24pLiRHdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgR3RDb25kaXRpb25hbEV4cHJlc3Npb24pLiRHdFsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRHZVwiKSkge1xuXHRcdHJldHVybiBncmVhdGVyT3JFcXVhbChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEdlQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kR2VbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEdlQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kR2VbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkTHRcIikpIHtcblx0XHRyZXR1cm4gbGVzc1RoYW4oXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBMdENvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEx0WzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBMdENvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEx0WzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJExlXCIpKSB7XG5cdFx0cmV0dXJuIGxlc3NPckVxdWFsKFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTGVDb25kaXRpb25hbEV4cHJlc3Npb24pLiRMZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTGVDb25kaXRpb25hbEV4cHJlc3Npb24pLiRMZVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRQYXRoXCIpKSB7XG5cdFx0cmV0dXJuIGJpbmRpbmdFeHByZXNzaW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgUGF0aENvbmRpdGlvbkV4cHJlc3Npb248VD4pLiRQYXRoLCB1bmRlZmluZWQsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkQXBwbHlcIikpIHtcblx0XHRyZXR1cm4gYW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IFwiQXBwbHlcIixcblx0XHRcdFx0RnVuY3Rpb246IChhbm5vdGF0aW9uVmFsdWUgYXMgYW55KS4kRnVuY3Rpb24sXG5cdFx0XHRcdEFwcGx5OiAoYW5ub3RhdGlvblZhbHVlIGFzIGFueSkuJEFwcGx5XG5cdFx0XHR9IGFzIFQsXG5cdFx0XHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0cGF0aFZpc2l0b3Jcblx0XHQpO1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRJZlwiKSkge1xuXHRcdHJldHVybiBhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogXCJJZlwiLFxuXHRcdFx0XHRJZjogKGFubm90YXRpb25WYWx1ZSBhcyBhbnkpLiRJZlxuXHRcdFx0fSBhcyBULFxuXHRcdFx0dmlzaXRlZE5hdmlnYXRpb25QYXRocyxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHBhdGhWaXNpdG9yXG5cdFx0KTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkRW51bU1lbWJlclwiKSkge1xuXHRcdHJldHVybiBjb25zdGFudChyZXNvbHZlRW51bVZhbHVlKChhbm5vdGF0aW9uVmFsdWUgYXMgYW55KS4kRW51bU1lbWJlcikgYXMgVCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlIGFzIFQpO1xuXHR9XG59XG5cbi8qKlxuICogUHJvY2VzcyB0aGUge0lmQW5ub3RhdGlvbkV4cHJlc3Npb25WYWx1ZX0gaW50byBhbiBleHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGFubm90YXRpb25JZkV4cHJlc3Npb24gQW4gSWYgZXhwcmVzc2lvbiByZXR1cm5pbmcgdGhlIHR5cGUgVFxuICogQHBhcmFtIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMgVGhlIHBhdGggZnJvbSB0aGUgcm9vdCBlbnRpdHkgc2V0XG4gKiBAcGFyYW0gcGF0aFZpc2l0b3IgQSBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIHJlc3VsdGluZyBwYXRoXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gVGhlIGVxdWl2YWxlbnQgaWZFbHNlIGV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFubm90YXRpb25JZkV4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRhbm5vdGF0aW9uSWZFeHByZXNzaW9uOiBJZkFubm90YXRpb25FeHByZXNzaW9uVmFsdWU8VD4sXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdID0gW10sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IEV4cHJlc3Npb248VD4ge1xuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbm5vdGF0aW9uSWZFeHByZXNzaW9uWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25JZkV4cHJlc3Npb25bMV0gYXMgYW55LCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25JZkV4cHJlc3Npb25bMl0gYXMgYW55LCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFubm90YXRpb25BcHBseUV4cHJlc3Npb24oXG5cdGFubm90YXRpb25BcHBseUV4cHJlc3Npb246IEFwcGx5QW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPixcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvblxuKTogRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0c3dpdGNoIChhbm5vdGF0aW9uQXBwbHlFeHByZXNzaW9uLkZ1bmN0aW9uKSB7XG5cdFx0Y2FzZSBcIm9kYXRhLmNvbmNhdFwiOlxuXHRcdFx0cmV0dXJuIGNvbmNhdChcblx0XHRcdFx0Li4uYW5ub3RhdGlvbkFwcGx5RXhwcmVzc2lvbi5BcHBseS5tYXAoKGFwcGx5UGFyYW06IGFueSkgPT4ge1xuXHRcdFx0XHRcdGxldCBhcHBseVBhcmFtQ29udmVydGVkID0gYXBwbHlQYXJhbTtcblx0XHRcdFx0XHRpZiAoYXBwbHlQYXJhbS5oYXNPd25Qcm9wZXJ0eShcIiRQYXRoXCIpKSB7XG5cdFx0XHRcdFx0XHRhcHBseVBhcmFtQ29udmVydGVkID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIlBhdGhcIixcblx0XHRcdFx0XHRcdFx0cGF0aDogYXBwbHlQYXJhbS4kUGF0aFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFwcGx5UGFyYW0uaGFzT3duUHJvcGVydHkoXCIkSWZcIikpIHtcblx0XHRcdFx0XHRcdGFwcGx5UGFyYW1Db252ZXJ0ZWQgPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiSWZcIixcblx0XHRcdFx0XHRcdFx0SWY6IGFwcGx5UGFyYW0uJElmXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYXBwbHlQYXJhbS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdFx0XHRcdFx0YXBwbHlQYXJhbUNvbnZlcnRlZCA9IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJBcHBseVwiLFxuXHRcdFx0XHRcdFx0XHRGdW5jdGlvbjogYXBwbHlQYXJhbS4kRnVuY3Rpb24sXG5cdFx0XHRcdFx0XHRcdEFwcGx5OiBhcHBseVBhcmFtLiRBcHBseVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25FeHByZXNzaW9uKGFwcGx5UGFyYW1Db252ZXJ0ZWQsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHVuZGVmaW5lZCwgcGF0aFZpc2l0b3IpO1xuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHR9XG59XG5cbi8qKlxuICogR2VuZXJpYyBoZWxwZXIgZm9yIHRoZSBjb21wYXJpc29uIG9wZXJhdGlvbnMgKGVxdWFsLCBub3RFcXVhbCwgLi4uKS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBvcGVyYXRvciBUaGUgb3BlcmF0b3IgdG8gYXBwbHlcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBvcGVyYXRvclxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgb3BlcmF0b3JcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5mdW5jdGlvbiBjb21wYXJpc29uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0b3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBsZWZ0RXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUobGVmdE9wZXJhbmQpO1xuXHRjb25zdCByaWdodEV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKHJpZ2h0T3BlcmFuZCk7XG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbihsZWZ0RXhwcmVzc2lvbiwgcmlnaHRFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRpZiAoaXNDb25zdGFudChsZWZ0RXhwcmVzc2lvbikgJiYgaXNDb25zdGFudChyaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0aWYgKGxlZnRFeHByZXNzaW9uLnZhbHVlID09PSB1bmRlZmluZWQgfHwgcmlnaHRFeHByZXNzaW9uLnZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA9PT0gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKG9wZXJhdG9yKSB7XG5cdFx0XHRjYXNlIFwiIT09XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSAhPT0gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI8XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA8IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0XHRjYXNlIFwiPD1cIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlIDw9IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0XHRjYXNlIFwiPlwiOlxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgPiByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdFx0Y2FzZSBcIj49XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA+PSByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdFx0Y2FzZSBcIj09PVwiOlxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlID09PSByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0X3R5cGU6IFwiQ29tcGFyaXNvblwiLFxuXHRcdFx0b3BlcmF0b3I6IG9wZXJhdG9yLFxuXHRcdFx0b3BlcmFuZDE6IGxlZnRFeHByZXNzaW9uLFxuXHRcdFx0b3BlcmFuZDI6IHJpZ2h0RXhwcmVzc2lvblxuXHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImVxdWFsXCIgKD09PSkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZVxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY29tcGFyaXNvblxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgbGVmdEV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKGxlZnRPcGVyYW5kKTtcblx0Y29uc3QgcmlnaHRFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShyaWdodE9wZXJhbmQpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24obGVmdEV4cHJlc3Npb24sIHJpZ2h0RXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0aWYgKF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdEV4cHJlc3Npb24sIHJpZ2h0RXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdH1cblxuXHQvLyAoKGEgPT09IGMpID09PSB0cnVlKSA9PiAoYSA9PT0gYylcblx0aWYgKGxlZnRFeHByZXNzaW9uLl90eXBlID09PSBcIkNvbXBhcmlzb25cIiAmJiBpc0NvbnN0YW50KHJpZ2h0RXhwcmVzc2lvbikgJiYgcmlnaHRFeHByZXNzaW9uLnZhbHVlID09PSB0cnVlKSB7XG5cdFx0cmV0dXJuIGxlZnRFeHByZXNzaW9uO1xuXHR9IGVsc2UgaWYgKGxlZnRFeHByZXNzaW9uLl90eXBlID09PSBcIkNvbXBhcmlzb25cIiAmJiBpc0NvbnN0YW50KHJpZ2h0RXhwcmVzc2lvbikgJiYgcmlnaHRFeHByZXNzaW9uLnZhbHVlID09PSB0cnVlKSB7XG5cdFx0Ly8gKChhID09PSBjKSA9PT0gZmFsc2UpID0+ICEoYSA9PT0gYylcblx0XHRyZXR1cm4gbm90KGxlZnRFeHByZXNzaW9uKTtcblx0fSBlbHNlIGlmIChsZWZ0RXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnRFeHByZXNzaW9uLm9uVHJ1ZSwgcmlnaHRFeHByZXNzaW9uKSkge1xuXHRcdC8vIChpZih4eHh4KSB7IGFhYSB9IGVsc2UgeyBiYmIgfSApID09PSBhYWEgKVxuXHRcdHJldHVybiBvcihsZWZ0RXhwcmVzc2lvbi5jb25kaXRpb24sIGVxdWFsKGxlZnRFeHByZXNzaW9uLm9uRmFsc2UsIHJpZ2h0RXhwcmVzc2lvbikpO1xuXHR9IGVsc2UgaWYgKGxlZnRFeHByZXNzaW9uLl90eXBlID09PSBcIklmRWxzZVwiICYmIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdEV4cHJlc3Npb24ub25GYWxzZSwgcmlnaHRFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBvcihub3QobGVmdEV4cHJlc3Npb24uY29uZGl0aW9uKSwgZXF1YWwobGVmdEV4cHJlc3Npb24ub25UcnVlLCByaWdodEV4cHJlc3Npb24pKTtcblx0fSBlbHNlIGlmIChcblx0XHRsZWZ0RXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJlxuXHRcdGlzQ29uc3RhbnQobGVmdEV4cHJlc3Npb24ub25UcnVlKSAmJlxuXHRcdGlzQ29uc3RhbnQocmlnaHRFeHByZXNzaW9uKSAmJlxuXHRcdGlzQ29uc3RhbnQobGVmdEV4cHJlc3Npb24ub25GYWxzZSkgJiZcblx0XHQhX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChsZWZ0RXhwcmVzc2lvbi5vblRydWUsIHJpZ2h0RXhwcmVzc2lvbikgJiZcblx0XHQhX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChsZWZ0RXhwcmVzc2lvbi5vbkZhbHNlLCByaWdodEV4cHJlc3Npb24pXG5cdCkge1xuXHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdH1cblxuXHRyZXR1cm4gY29tcGFyaXNvbihcIj09PVwiLCBsZWZ0RXhwcmVzc2lvbiwgcmlnaHRFeHByZXNzaW9uKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcIm5vdCBlcXVhbFwiICghPT0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbm90RXF1YWw8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGxlZnRFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShsZWZ0T3BlcmFuZCk7XG5cdGNvbnN0IHJpZ2h0RXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUocmlnaHRPcGVyYW5kKTtcblxuXHRpZiAoX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChsZWZ0RXhwcmVzc2lvbiwgcmlnaHRFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdH1cblxuXHQvLyAoKGEgPT09IGMpICE9PSB0cnVlKSA9PiAhKGEgPT09IGMpXG5cdGlmIChsZWZ0RXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJDb21wYXJpc29uXCIgJiYgaXNDb25zdGFudChyaWdodEV4cHJlc3Npb24pICYmIHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSA9PT0gdHJ1ZSkge1xuXHRcdHJldHVybiBub3QobGVmdEV4cHJlc3Npb24pO1xuXHR9IGVsc2UgaWYgKGxlZnRFeHByZXNzaW9uLl90eXBlID09PSBcIkNvbXBhcmlzb25cIiAmJiBpc0NvbnN0YW50KHJpZ2h0RXhwcmVzc2lvbikgJiYgcmlnaHRFeHByZXNzaW9uLnZhbHVlID09PSB0cnVlKSB7XG5cdFx0Ly8gKChhID09PSBjKSAhPT0gZmFsc2UpID0+IChhID09PSBjKVxuXHRcdHJldHVybiBsZWZ0RXhwcmVzc2lvbjtcblx0fSBlbHNlIGlmIChsZWZ0RXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnRFeHByZXNzaW9uLm9uVHJ1ZSwgcmlnaHRFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBhbmQobm90KGxlZnRFeHByZXNzaW9uLmNvbmRpdGlvbiksIG5vdEVxdWFsKGxlZnRFeHByZXNzaW9uLm9uRmFsc2UsIHJpZ2h0RXhwcmVzc2lvbikpO1xuXHR9IGVsc2UgaWYgKGxlZnRFeHByZXNzaW9uLl90eXBlID09PSBcIklmRWxzZVwiICYmIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdEV4cHJlc3Npb24ub25GYWxzZSwgcmlnaHRFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBhbmQobGVmdEV4cHJlc3Npb24uY29uZGl0aW9uLCBub3RFcXVhbChsZWZ0RXhwcmVzc2lvbi5vblRydWUsIHJpZ2h0RXhwcmVzc2lvbikpO1xuXHR9IGVsc2UgaWYgKFxuXHRcdGxlZnRFeHByZXNzaW9uLl90eXBlID09PSBcIklmRWxzZVwiICYmXG5cdFx0aXNDb25zdGFudChsZWZ0RXhwcmVzc2lvbi5vblRydWUpICYmXG5cdFx0aXNDb25zdGFudChyaWdodEV4cHJlc3Npb24pICYmXG5cdFx0aXNDb25zdGFudChsZWZ0RXhwcmVzc2lvbi5vbkZhbHNlKSAmJlxuXHRcdCFfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnRFeHByZXNzaW9uLm9uVHJ1ZSwgcmlnaHRFeHByZXNzaW9uKSAmJlxuXHRcdCFfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnRFeHByZXNzaW9uLm9uRmFsc2UsIHJpZ2h0RXhwcmVzc2lvbilcblx0KSB7XG5cdFx0Ly8gSWYgdGhlIGxlZnQgZXhwcmVzc2lvbiBpcyBhbiBpZiBlbHNlIHdoZXJlIGJvdGggb25UcnVlIGFuZCBvbkZhbHNlIGFyZSBub3QgZXF1YWxzIHRvIHRoZSByaWdodCBleHByZXNzaW9uIC0+IHNpbXBsaWZ5IGFzIHRydWVcblx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdH1cblxuXHRyZXR1cm4gY29tcGFyaXNvbihcIiE9PVwiLCBsZWZ0RXhwcmVzc2lvbiwgcmlnaHRFeHByZXNzaW9uKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImdyZWF0ZXIgb3IgZXF1YWxcIiAoPj0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JlYXRlck9yRXF1YWw8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjb21wYXJpc29uKFwiPj1cIiwgbGVmdE9wZXJhbmQsIHJpZ2h0T3BlcmFuZCk7XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJncmVhdGVyIHRoYW5cIiAoPikuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZVxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY29tcGFyaXNvblxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncmVhdGVyVGhhbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNvbXBhcmlzb24oXCI+XCIsIGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb246IFwibGVzcyBvciBlcXVhbFwiICg8PSkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZVxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY29tcGFyaXNvblxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZXNzT3JFcXVhbDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNvbXBhcmlzb24oXCI8PVwiLCBsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImxlc3MgdGhhblwiICg8KS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlXG4gKiBAcGFyYW0gcmlnaHRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29uXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxlc3NUaGFuPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY29tcGFyaXNvbihcIjxcIiwgbGVmdE9wZXJhbmQsIHJpZ2h0T3BlcmFuZCk7XG59XG5cbi8qKlxuICogSWYtdGhlbi1lbHNlIGV4cHJlc3Npb24uXG4gKlxuICogRXZhbHVhdGVzIHRvIG9uVHJ1ZSBpZiB0aGUgY29uZGl0aW9uIGV2YWx1YXRlcyB0byB0cnVlLCBlbHNlIGV2YWx1YXRlcyB0byBvbkZhbHNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGNvbmRpdGlvbiBUaGUgY29uZGl0aW9uIHRvIGV2YWx1YXRlXG4gKiBAcGFyYW0gb25UcnVlIEV4cHJlc3Npb24gcmVzdWx0IGlmIHRoZSBjb25kaXRpb24gZXZhbHVhdGVzIHRvIHRydWVcbiAqIEBwYXJhbSBvbkZhbHNlIEV4cHJlc3Npb24gcmVzdWx0IGlmIHRoZSBjb25kaXRpb24gZXZhbHVhdGVzIHRvIGZhbHNlXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gVGhlIGV4cHJlc3Npb24gdGhhdCByZXByZXNlbnRzIHRoaXMgY29uZGl0aW9uYWwgY2hlY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlmRWxzZTxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGNvbmRpdGlvbjogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+LFxuXHRvblRydWU6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0b25GYWxzZTogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0bGV0IGNvbmRpdGlvbkV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKGNvbmRpdGlvbik7XG5cdGxldCBvblRydWVFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShvblRydWUpO1xuXHRsZXQgb25GYWxzZUV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKG9uRmFsc2UpO1xuXG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbihjb25kaXRpb25FeHByZXNzaW9uLCBvblRydWVFeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0Ly8gc3dhcCBicmFuY2hlcyBpZiB0aGUgY29uZGl0aW9uIGlzIGEgbmVnYXRpb25cblx0aWYgKGNvbmRpdGlvbkV4cHJlc3Npb24uX3R5cGUgPT09IFwiTm90XCIpIHtcblx0XHQvLyBpZkVsc2Uobm90KFgpLCBhLCBiKSAtLT4gaWZFbHNlKFgsIGIsIGEpXG5cdFx0W29uVHJ1ZUV4cHJlc3Npb24sIG9uRmFsc2VFeHByZXNzaW9uXSA9IFtvbkZhbHNlRXhwcmVzc2lvbiwgb25UcnVlRXhwcmVzc2lvbl07XG5cdFx0Y29uZGl0aW9uRXhwcmVzc2lvbiA9IG5vdChjb25kaXRpb25FeHByZXNzaW9uKTtcblx0fVxuXG5cdC8vIGlubGluZSBuZXN0ZWQgaWYtZWxzZSBleHByZXNzaW9uczogb25UcnVlIGJyYW5jaFxuXHQvLyBpZkVsc2UoWCwgaWZFbHNlKFgsIGEsIGIpLCBjKSA9PT4gaWZFbHNlKFgsIGEsIGMpXG5cdGlmIChvblRydWVFeHByZXNzaW9uLl90eXBlID09PSBcIklmRWxzZVwiICYmIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoY29uZGl0aW9uRXhwcmVzc2lvbiwgb25UcnVlRXhwcmVzc2lvbi5jb25kaXRpb24pKSB7XG5cdFx0b25UcnVlRXhwcmVzc2lvbiA9IG9uVHJ1ZUV4cHJlc3Npb24ub25UcnVlO1xuXHR9XG5cblx0Ly8gaW5saW5lIG5lc3RlZCBpZi1lbHNlIGV4cHJlc3Npb25zOiBvbkZhbHNlIGJyYW5jaFxuXHQvLyBpZkVsc2UoWCwgYSwgaWZFbHNlKFgsIGIsIGMpKSA9PT4gaWZFbHNlKFgsIGEsIGMpXG5cdGlmIChvbkZhbHNlRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGNvbmRpdGlvbkV4cHJlc3Npb24sIG9uRmFsc2VFeHByZXNzaW9uLmNvbmRpdGlvbikpIHtcblx0XHRvbkZhbHNlRXhwcmVzc2lvbiA9IG9uRmFsc2VFeHByZXNzaW9uLm9uRmFsc2U7XG5cdH1cblxuXHQvLyBpbmxpbmUgbmVzdGVkIGlmLWVsc2UgZXhwcmVzc2lvbnM6IGNvbmRpdGlvblxuXHRpZiAoY29uZGl0aW9uRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIikge1xuXHRcdGlmIChcblx0XHRcdGlzQ29uc3RhbnQoY29uZGl0aW9uRXhwcmVzc2lvbi5vbkZhbHNlKSAmJlxuXHRcdFx0IWNvbmRpdGlvbkV4cHJlc3Npb24ub25GYWxzZS52YWx1ZSAmJlxuXHRcdFx0aXNDb25zdGFudChjb25kaXRpb25FeHByZXNzaW9uLm9uVHJ1ZSkgJiZcblx0XHRcdGNvbmRpdGlvbkV4cHJlc3Npb24ub25UcnVlLnZhbHVlXG5cdFx0KSB7XG5cdFx0XHQvLyBpZkVsc2UoaWZFbHNlKFgsIHRydWUsIGZhbHNlKSwgYSwgYikgPT0+IGlmRWxzZShYLCBhLCBiKVxuXHRcdFx0Y29uZGl0aW9uRXhwcmVzc2lvbiA9IGNvbmRpdGlvbkV4cHJlc3Npb24uY29uZGl0aW9uO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRpc0NvbnN0YW50KGNvbmRpdGlvbkV4cHJlc3Npb24ub25GYWxzZSkgJiZcblx0XHRcdGNvbmRpdGlvbkV4cHJlc3Npb24ub25GYWxzZS52YWx1ZSAmJlxuXHRcdFx0aXNDb25zdGFudChjb25kaXRpb25FeHByZXNzaW9uLm9uVHJ1ZSkgJiZcblx0XHRcdCFjb25kaXRpb25FeHByZXNzaW9uLm9uVHJ1ZS52YWx1ZVxuXHRcdCkge1xuXHRcdFx0Ly8gaWZFbHNlKGlmRWxzZShYLCBmYWxzZSwgdHJ1ZSksIGEsIGIpID09PiBpZkVsc2Uobm90KFgpLCBhLCBiKVxuXHRcdFx0Y29uZGl0aW9uRXhwcmVzc2lvbiA9IG5vdChjb25kaXRpb25FeHByZXNzaW9uLmNvbmRpdGlvbik7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdGlzQ29uc3RhbnQoY29uZGl0aW9uRXhwcmVzc2lvbi5vblRydWUpICYmXG5cdFx0XHQhY29uZGl0aW9uRXhwcmVzc2lvbi5vblRydWUudmFsdWUgJiZcblx0XHRcdCFpc0NvbnN0YW50KGNvbmRpdGlvbkV4cHJlc3Npb24ub25GYWxzZSlcblx0XHQpIHtcblx0XHRcdC8vIGlmRWxzZShpZkVsc2UoWCwgZmFsc2UsIGEpLCBiLCBjKSA9PT4gaWZFbHNlKGFuZChub3QoWCksIGEpLCBiLCBjKVxuXHRcdFx0Y29uZGl0aW9uRXhwcmVzc2lvbiA9IGFuZChub3QoY29uZGl0aW9uRXhwcmVzc2lvbi5jb25kaXRpb24pLCBjb25kaXRpb25FeHByZXNzaW9uLm9uRmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8vIGFnYWluIHN3YXAgYnJhbmNoZXMgaWYgbmVlZGVkIChpbiBjYXNlIG9uZSBvZiB0aGUgb3B0aW1pemF0aW9ucyBhYm92ZSBsZWQgdG8gYSBuZWdhdGVkIGNvbmRpdGlvbilcblx0aWYgKGNvbmRpdGlvbkV4cHJlc3Npb24uX3R5cGUgPT09IFwiTm90XCIpIHtcblx0XHQvLyBpZkVsc2Uobm90KFgpLCBhLCBiKSAtLT4gaWZFbHNlKFgsIGIsIGEpXG5cdFx0W29uVHJ1ZUV4cHJlc3Npb24sIG9uRmFsc2VFeHByZXNzaW9uXSA9IFtvbkZhbHNlRXhwcmVzc2lvbiwgb25UcnVlRXhwcmVzc2lvbl07XG5cdFx0Y29uZGl0aW9uRXhwcmVzc2lvbiA9IG5vdChjb25kaXRpb25FeHByZXNzaW9uKTtcblx0fVxuXG5cdC8vIGNvbXB1dGUgZXhwcmVzc2lvbiByZXN1bHQgZm9yIGNvbnN0YW50IGNvbmRpdGlvbnNcblx0aWYgKGlzQ29uc3RhbnQoY29uZGl0aW9uRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gY29uZGl0aW9uRXhwcmVzc2lvbi52YWx1ZSA/IG9uVHJ1ZUV4cHJlc3Npb24gOiBvbkZhbHNlRXhwcmVzc2lvbjtcblx0fVxuXG5cdC8vIGNvbXB1dGUgZXhwcmVzc2lvbiByZXN1bHQgaWYgb25UcnVlIGFuZCBvbkZhbHNlIGJyYW5jaGVzIGFyZSBlcXVhbFxuXHRpZiAoX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChvblRydWVFeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gb25UcnVlRXhwcmVzc2lvbjtcblx0fVxuXG5cdC8vIElmIGVpdGhlciB0cnVlRXhwcmVzc2lvbiBvciBmYWxzZUV4cHJlc3Npb24gaXMgYSB2YWx1ZSBlcXVhbHMgdG8gZmFsc2UgdGhlIGV4cHJlc3Npb24gY2FuIGJlIHNpbXBsaWZpZWRcblx0Ly8gSWYoQ29uZGl0aW9uKSBUaGVuIFhYWCBFbHNlIEZhbHNlIC0+IENvbmRpdGlvbiAmJiBYWFhcblx0aWYgKGlzQ29uc3RhbnQob25GYWxzZUV4cHJlc3Npb24pICYmIG9uRmFsc2VFeHByZXNzaW9uLnZhbHVlID09PSBmYWxzZSkge1xuXHRcdHJldHVybiBhbmQoY29uZGl0aW9uRXhwcmVzc2lvbiwgb25UcnVlRXhwcmVzc2lvbiBhcyBFeHByZXNzaW9uPGJvb2xlYW4+KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9XG5cdC8vIElmKENvbmRpdGlvbikgVGhlbiBGYWxzZSBFbHNlIFhYWCAtPiAhQ29uZGl0aW9uICYmIFhYWFxuXHRpZiAoaXNDb25zdGFudChvblRydWVFeHByZXNzaW9uKSAmJiBvblRydWVFeHByZXNzaW9uLnZhbHVlID09PSBmYWxzZSkge1xuXHRcdHJldHVybiBhbmQobm90KGNvbmRpdGlvbkV4cHJlc3Npb24pLCBvbkZhbHNlRXhwcmVzc2lvbiBhcyBFeHByZXNzaW9uPGJvb2xlYW4+KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJJZkVsc2VcIixcblx0XHRjb25kaXRpb246IGNvbmRpdGlvbkV4cHJlc3Npb24sXG5cdFx0b25UcnVlOiBvblRydWVFeHByZXNzaW9uLFxuXHRcdG9uRmFsc2U6IG9uRmFsc2VFeHByZXNzaW9uXG5cdH07XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIGRlZmF1bHQgbW9kZWwgKHVuZGVmaW5lZCkuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGRlZmF1bHQgY29udGV4dFxuICovXG5mdW5jdGlvbiBoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb246IEV4cHJlc3Npb248YW55Pik6IGJvb2xlYW4ge1xuXHRzd2l0Y2ggKGV4cHJlc3Npb24uX3R5cGUpIHtcblx0XHRjYXNlIFwiQ29uc3RhbnRcIjpcblx0XHRjYXNlIFwiRm9ybWF0dGVyXCI6XG5cdFx0Y2FzZSBcIkNvbXBsZXhUeXBlXCI6XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0Y2FzZSBcIlNldFwiOlxuXHRcdFx0cmV0dXJuIGV4cHJlc3Npb24ub3BlcmFuZHMuc29tZShoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KTtcblx0XHRjYXNlIFwiQmluZGluZ1wiOlxuXHRcdFx0cmV0dXJuIGV4cHJlc3Npb24ubW9kZWxOYW1lID09PSB1bmRlZmluZWQ7XG5cdFx0Y2FzZSBcIkNvbXBhcmlzb25cIjpcblx0XHRcdHJldHVybiBoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb24ub3BlcmFuZDEpIHx8IGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vcGVyYW5kMik7XG5cdFx0Y2FzZSBcIkRlZmF1bHRCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRjYXNlIFwiSWZFbHNlXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb24uY29uZGl0aW9uKSB8fFxuXHRcdFx0XHRoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb24ub25UcnVlKSB8fFxuXHRcdFx0XHRoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb24ub25GYWxzZSlcblx0XHRcdCk7XG5cdFx0Y2FzZSBcIk5vdFwiOlxuXHRcdGNhc2UgXCJUcnV0aHlcIjpcblx0XHRcdHJldHVybiBoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KGV4cHJlc3Npb24ub3BlcmFuZCk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG50eXBlIEZuPFQ+ID0gKCguLi5wYXJhbXM6IGFueSkgPT4gVCkgJiB7XG5cdF9fZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIFdyYXBwZWRUdXBsZVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG50eXBlIFdyYXBwZWRUdXBsZTxUPiA9IHsgW0sgaW4ga2V5b2YgVF06IFdyYXBwZWRUdXBsZTxUW0tdPiB8IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUW0tdPiB9O1xuXG4vLyBTbywgdGhpcyB3b3JrcyBidXQgSSBjYW5ub3QgZ2V0IGl0IHRvIGNvbXBpbGUgOkQsIGJ1dCBpdCBzdGlsbCBkb2VzIHdoYXQgaXMgZXhwZWN0ZWQuLi5cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHJlZmVyZW5jZSBvciBhIGZ1bmN0aW9uIG5hbWUuXG4gKi9cbnR5cGUgRnVuY3Rpb25Pck5hbWU8VD4gPSBGbjxUPiB8IHN0cmluZztcblxuLyoqXG4gKiBGdW5jdGlvbiBwYXJhbWV0ZXJzLCBlaXRoZXIgZGVyaXZlZCBmcm9tIHRoZSBmdW5jdGlvbiBvciBhbiB1bnR5cGVkIGFycmF5LlxuICovXG50eXBlIEZ1bmN0aW9uUGFyYW1ldGVyczxULCBGIGV4dGVuZHMgRnVuY3Rpb25Pck5hbWU8VD4+ID0gRiBleHRlbmRzIEZuPFQ+ID8gUGFyYW1ldGVyczxGPiA6IGFueVtdO1xuXG4vKipcbiAqIENhbGxzIGEgZm9ybWF0dGVyIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIHBhcmFtZXRlcnMuXG4gKiBJZiByZXF1aXJlQ29udGV4dCBpcyBzZXQgdG8gdHJ1ZSBhbmQgbm8gY29udGV4dCBpcyBwYXNzZWQgYSBkZWZhdWx0IGNvbnRleHQgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHRoYXQgc2hvdWxkIG1hdGNoIHRoZSB0eXBlIGFuZCBudW1iZXIgb2YgdGhlIGZvcm1hdHRlciBmdW5jdGlvblxuICogQHBhcmFtIGZvcm1hdHRlckZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBjYWxsXG4gKiBAcGFyYW0gW2NvbnRleHRFbnRpdHlUeXBlXSBUaGUgY29udGV4dCBlbnRpdHkgdHlwZSB0byBjb25zaWRlclxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IFRoZSBjb3JyZXNwb25kaW5nIGV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlc3VsdDxULCBVIGV4dGVuZHMgRm48VD4+KFxuXHRwYXJhbWV0ZXJzOiBXcmFwcGVkVHVwbGU8UGFyYW1ldGVyczxVPj4sXG5cdGZvcm1hdHRlckZ1bmN0aW9uOiBVLFxuXHRjb250ZXh0RW50aXR5VHlwZT86IEVudGl0eVR5cGVcbik6IEV4cHJlc3Npb248VD4ge1xuXHRjb25zdCBwYXJhbWV0ZXJFeHByZXNzaW9ucyA9IChwYXJhbWV0ZXJzIGFzIGFueVtdKS5tYXAod3JhcFByaW1pdGl2ZSk7XG5cblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKC4uLnBhcmFtZXRlckV4cHJlc3Npb25zKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRpZiAoISFjb250ZXh0RW50aXR5VHlwZSkge1xuXHRcdC8vIE90aGVyd2lzZSwgaWYgdGhlIGNvbnRleHQgaXMgcmVxdWlyZWQgYW5kIG5vIGNvbnRleHQgaXMgcHJvdmlkZWQgbWFrZSBzdXJlIHRvIGFkZCB0aGUgZGVmYXVsdCBiaW5kaW5nXG5cdFx0aWYgKCFwYXJhbWV0ZXJFeHByZXNzaW9ucy5zb21lKGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQpKSB7XG5cdFx0XHRjb250ZXh0RW50aXR5VHlwZS5rZXlzLmZvckVhY2goa2V5ID0+IHBhcmFtZXRlckV4cHJlc3Npb25zLnB1c2goYmluZGluZ0V4cHJlc3Npb24oa2V5Lm5hbWUsIFwiXCIpKSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gRm9ybWF0dGVyTmFtZSBjYW4gYmUgb2YgZm9ybWF0IHNhcC5mZS5jb3JlLnh4eCNtZXRob2ROYW1lIHRvIGhhdmUgbXVsdGlwbGUgZm9ybWF0dGVyIGluIG9uZSBjbGFzc1xuXHRjb25zdCBbZm9ybWF0dGVyQ2xhc3MsIGZvcm1hdHRlck5hbWVdID0gZm9ybWF0dGVyRnVuY3Rpb24uX19mdW5jdGlvbk5hbWUuc3BsaXQoXCIjXCIpO1xuXG5cdGlmICghIWZvcm1hdHRlck5hbWUgJiYgZm9ybWF0dGVyTmFtZS5sZW5ndGggPiAwKSB7XG5cdFx0cGFyYW1ldGVyRXhwcmVzc2lvbnMudW5zaGlmdChjb25zdGFudChmb3JtYXR0ZXJOYW1lKSk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIkZvcm1hdHRlclwiLFxuXHRcdGZuOiBmb3JtYXR0ZXJDbGFzcyxcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJFeHByZXNzaW9uc1xuXHR9O1xufVxuXG4vKipcbiAqIENhbGxzIGEgY29tcGxleCB0eXBlICB0byBwcm9jZXNzIHRoZSBwYXJhbWV0ZXJzLlxuICogSWYgcmVxdWlyZUNvbnRleHQgaXMgc2V0IHRvIHRydWUgYW5kIG5vIGNvbnRleHQgaXMgcGFzc2VkIGEgZGVmYXVsdCBjb250ZXh0IHdpbGwgYmUgYWRkZWQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFVcbiAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBsaXN0IG9mIHBhcmFtZXRlciB0aGF0IHNob3VsZCBtYXRjaCB0aGUgdHlwZSBmb3IgdGhlIGNvbXBwbGV4IHR5cGVcbiAqIEBwYXJhbSB0eXBlIFRoZSBjb21wbGV4IHR5cGUgdG8gdXNlXG4gKiBAcGFyYW0gW2NvbnRleHRFbnRpdHlUeXBlXSBUaGUgY29udGV4dCBlbnRpdHkgdHlwZSB0byBjb25zaWRlclxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IFRoZSBjb3JyZXNwb25kaW5nIGV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFR5cGVJbmZvcm1hdGlvbjxULCBVIGV4dGVuZHMgRm48VD4+KFxuXHRwYXJhbWV0ZXJzOiBXcmFwcGVkVHVwbGU8UGFyYW1ldGVyczxVPj4sXG5cdHR5cGU6IHN0cmluZyxcblx0Y29udGV4dEVudGl0eVR5cGU/OiBFbnRpdHlUeXBlXG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0Y29uc3QgcGFyYW1ldGVyRXhwcmVzc2lvbnMgPSAocGFyYW1ldGVycyBhcyBhbnlbXSkubWFwKHdyYXBQcmltaXRpdmUpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4ucGFyYW1ldGVyRXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIHBhcmFtZXRlciBhbmQgaXQgaXMgYSBjb25zdGFudCBhbmQgd2UgZG9uJ3QgZXhwZWN0IHRoZSBjb250ZXh0IHRoZW4gcmV0dXJuIHRoZSBjb25zdGFudFxuXHRpZiAocGFyYW1ldGVyRXhwcmVzc2lvbnMubGVuZ3RoID09PSAxICYmIGlzQ29uc3RhbnQocGFyYW1ldGVyRXhwcmVzc2lvbnNbMF0pICYmICFjb250ZXh0RW50aXR5VHlwZSkge1xuXHRcdHJldHVybiBwYXJhbWV0ZXJFeHByZXNzaW9uc1swXTtcblx0fSBlbHNlIGlmICghIWNvbnRleHRFbnRpdHlUeXBlKSB7XG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiB0aGUgY29udGV4dCBpcyByZXF1aXJlZCBhbmQgbm8gY29udGV4dCBpcyBwcm92aWRlZCBtYWtlIHN1cmUgdG8gYWRkIHRoZSBkZWZhdWx0IGJpbmRpbmdcblx0XHRpZiAoIXBhcmFtZXRlckV4cHJlc3Npb25zLnNvbWUoaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dCkpIHtcblx0XHRcdGNvbnRleHRFbnRpdHlUeXBlLmtleXMuZm9yRWFjaChrZXkgPT4gcGFyYW1ldGVyRXhwcmVzc2lvbnMucHVzaChiaW5kaW5nRXhwcmVzc2lvbihrZXkubmFtZSwgXCJcIikpKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBvRm9ybWF0T3B0aW9ucyA9XG5cdFx0KHBhcmFtZXRlcnNbMF0gYXMgYW55KT8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCA/IHsgcGFyc2VBc1N0cmluZzogZmFsc2UsIGVtcHR5U3RyaW5nOiBcIlwiIH0gOiB7fTtcblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJDb21wbGV4VHlwZVwiLFxuXHRcdHR5cGU6IHR5cGUsXG5cdFx0Zm9ybWF0T3B0aW9uczogb0Zvcm1hdE9wdGlvbnMsXG5cdFx0cGFyYW1ldGVyczoge30sXG5cdFx0YmluZGluZ1BhcmFtZXRlcnM6IHBhcmFtZXRlckV4cHJlc3Npb25zXG5cdH07XG59XG4vKipcbiAqIEZ1bmN0aW9uIGNhbGwsIG9wdGlvbmFsbHkgd2l0aCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGZuIEZ1bmN0aW9uIG5hbWUgb3IgcmVmZXJlbmNlIHRvIGZ1bmN0aW9uXG4gKiBAcGFyYW0gcGFyYW1ldGVycyBBcmd1bWVudHNcbiAqIEBwYXJhbSBvbiBPYmplY3QgdG8gY2FsbCB0aGUgZnVuY3Rpb24gb25cbiAqIEByZXR1cm5zIHtGdW5jdGlvbkV4cHJlc3Npb248VD59IEV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBmdW5jdGlvbiBjYWxsIChub3QgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gY2FsbCEpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbjxULCBVIGV4dGVuZHMgRnVuY3Rpb25Pck5hbWU8VD4+KFxuXHRmbjogVSxcblx0cGFyYW1ldGVyczogV3JhcHBlZFR1cGxlPEZ1bmN0aW9uUGFyYW1ldGVyczxULCBVPj4sXG5cdG9uPzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPG9iamVjdD5cbik6IEZ1bmN0aW9uRXhwcmVzc2lvbjxUPiB7XG5cdGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHR5cGVvZiBmbiA9PT0gXCJzdHJpbmdcIiA/IGZuIDogKGZuIGFzIEZuPFQ+KS5fX2Z1bmN0aW9uTmFtZTtcblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJGdW5jdGlvblwiLFxuXHRcdG9iajogb24gIT09IHVuZGVmaW5lZCA/IHdyYXBQcmltaXRpdmUob24pIDogdW5kZWZpbmVkLFxuXHRcdGZuOiBmdW5jdGlvbk5hbWUsXG5cdFx0cGFyYW1ldGVyczogKHBhcmFtZXRlcnMgYXMgYW55W10pLm1hcCh3cmFwUHJpbWl0aXZlKVxuXHR9O1xufVxuXG4vKipcbiAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGJpbmRpbmcgdmFsdWUgaXMgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gZXhwcmVzc2lvbiBldmFsdWF0aW5nIHRoZSBmYWN0IHRoYXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBlbXB0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShleHByZXNzaW9uOiBFeHByZXNzaW9uPHN0cmluZz4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKGV4cHJlc3Npb24uX3R5cGUgPT09IFwiQ29uY2F0XCIpIHtcblx0XHRyZXR1cm4gb3IoLi4uZXhwcmVzc2lvbi5leHByZXNzaW9ucy5tYXAoaXNFbXB0eSkpO1xuXHR9XG5cdHJldHVybiBvcihlcXVhbChleHByZXNzaW9uLCBcIlwiKSwgZXF1YWwoZXhwcmVzc2lvbiwgdW5kZWZpbmVkKSwgZXF1YWwoZXhwcmVzc2lvbiwgbnVsbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0KC4uLmluRXhwcmVzc2lvbnM6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxzdHJpbmc+W10pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGluRXhwcmVzc2lvbnMubWFwKHdyYXBQcmltaXRpdmUpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4uZXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChleHByZXNzaW9ucy5ldmVyeShpc0NvbnN0YW50KSkge1xuXHRcdHJldHVybiBjb25zdGFudChcblx0XHRcdGV4cHJlc3Npb25zLnJlZHVjZSgoY29uY2F0ZW5hdGVkOiBzdHJpbmcsIHZhbHVlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBjb25jYXRlbmF0ZWQgKyAodmFsdWUgYXMgQ29uc3RhbnRFeHByZXNzaW9uPGFueT4pLnZhbHVlLnRvU3RyaW5nKCk7XG5cdFx0XHR9LCBcIlwiKVxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJDb25jYXRcIixcblx0XHRleHByZXNzaW9uczogZXhwcmVzc2lvbnNcblx0fTtcbn1cblxuZXhwb3J0IHR5cGUgVHJhbnNmb3JtRnVuY3Rpb24gPSA8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGUgfCB1bmtub3duPihleHByZXNzaW9uUGFydDogYW55KSA9PiBFeHByZXNzaW9uPFQ+O1xuZXhwb3J0IHR5cGUgRXhwcmVzc2lvblR5cGUgPSBQaWNrPEV4cHJlc3Npb248YW55PiwgXCJfdHlwZVwiPltcIl90eXBlXCJdO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVJlY3Vyc2l2ZWx5PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIHwgdW5rbm93bj4oXG5cdGluRXhwcmVzc2lvbjogRXhwcmVzc2lvbjxUPixcblx0ZXhwcmVzc2lvblR5cGU6IEV4cHJlc3Npb25UeXBlLFxuXHR0cmFuc2Zvcm1GdW5jdGlvbjogVHJhbnNmb3JtRnVuY3Rpb24sXG5cdGluY2x1ZGVBbGxFeHByZXNzaW9uOiBib29sZWFuID0gZmFsc2Vcbik6IEV4cHJlc3Npb248VD4ge1xuXHRsZXQgZXhwcmVzc2lvbiA9IGluRXhwcmVzc2lvbjtcblx0c3dpdGNoIChleHByZXNzaW9uLl90eXBlKSB7XG5cdFx0Y2FzZSBcIkZ1bmN0aW9uXCI6XG5cdFx0XHRleHByZXNzaW9uLnBhcmFtZXRlcnMgPSBleHByZXNzaW9uLnBhcmFtZXRlcnMubWFwKGV4cHJlc3Npb24gPT5cblx0XHRcdFx0dHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbiwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbilcblx0XHRcdCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiQ29uY2F0XCI6XG5cdFx0XHRleHByZXNzaW9uLmV4cHJlc3Npb25zID0gZXhwcmVzc2lvbi5leHByZXNzaW9ucy5tYXAoZXhwcmVzc2lvbiA9PlxuXHRcdFx0XHR0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJDb21wbGV4VHlwZVwiOlxuXHRcdFx0ZXhwcmVzc2lvbi5iaW5kaW5nUGFyYW1ldGVycyA9IGV4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnMubWFwKGV4cHJlc3Npb24gPT5cblx0XHRcdFx0dHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbiwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbilcblx0XHRcdCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRm9ybWF0dGVyXCI6XG5cdFx0XHRleHByZXNzaW9uLnBhcmFtZXRlcnMgPSBleHByZXNzaW9uLnBhcmFtZXRlcnMubWFwKGV4cHJlc3Npb24gPT5cblx0XHRcdFx0dHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbiwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbilcblx0XHRcdCk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdGNvbnN0IG9uVHJ1ZSA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub25UcnVlLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdGNvbnN0IG9uRmFsc2UgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLm9uRmFsc2UsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pO1xuXHRcdFx0bGV0IGNvbmRpdGlvbiA9IGV4cHJlc3Npb24uY29uZGl0aW9uO1xuXHRcdFx0aWYgKGluY2x1ZGVBbGxFeHByZXNzaW9uKSB7XG5cdFx0XHRcdGNvbmRpdGlvbiA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24uY29uZGl0aW9uLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdH1cblx0XHRcdGV4cHJlc3Npb24gPSBpZkVsc2UoY29uZGl0aW9uLCBvblRydWUsIG9uRmFsc2UpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiTm90XCI6XG5cdFx0XHRpZiAoaW5jbHVkZUFsbEV4cHJlc3Npb24pIHtcblx0XHRcdFx0Y29uc3Qgb3BlcmFuZCA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub3BlcmFuZCwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGV4cHJlc3Npb24gPSBub3Qob3BlcmFuZCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJUcnV0aHlcIjpcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJTZXRcIjpcblx0XHRcdGlmIChpbmNsdWRlQWxsRXhwcmVzc2lvbikge1xuXHRcdFx0XHRleHByZXNzaW9uLm9wZXJhbmRzID0gZXhwcmVzc2lvbi5vcGVyYW5kcy5tYXAoZXhwcmVzc2lvbiA9PlxuXHRcdFx0XHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0aWYgKGluY2x1ZGVBbGxFeHByZXNzaW9uKSB7XG5cdFx0XHRcdGNvbnN0IG9wZXJhbmQxID0gdHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbi5vcGVyYW5kMSwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGNvbnN0IG9wZXJhbmQyID0gdHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbi5vcGVyYW5kMiwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGV4cHJlc3Npb24gPSBjb21wYXJpc29uKGV4cHJlc3Npb24ub3BlcmF0b3IsIG9wZXJhbmQxLCBvcGVyYW5kMikgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJEZWZhdWx0QmluZGluZ1wiOlxuXHRcdGNhc2UgXCJSZWZcIjpcblx0XHRjYXNlIFwiQmluZGluZ1wiOlxuXHRcdGNhc2UgXCJDb25zdGFudFwiOlxuXHRcdFx0Ly8gRG8gbm90aGluZ1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0aWYgKGV4cHJlc3Npb25UeXBlID09PSBleHByZXNzaW9uLl90eXBlKSB7XG5cdFx0ZXhwcmVzc2lvbiA9IHRyYW5zZm9ybUZ1bmN0aW9uKGluRXhwcmVzc2lvbik7XG5cdH1cblx0cmV0dXJuIGV4cHJlc3Npb247XG59XG5cbmV4cG9ydCB0eXBlIEJpbmRpbmdFeHByZXNzaW9uPFQ+ID0gVCB8IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDb21waWxlIGFuIGV4cHJlc3Npb24gaW50byBhbiBleHByZXNzaW9uIGJpbmRpbmcuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBjb21waWxlXG4gKiBAcGFyYW0gZW1iZWRkZWRJbkJpbmRpbmcgV2hldGhlciB0aGUgZXhwcmVzc2lvbiB0byBjb21waWxlIGlzIGVtYmVkZGVkIGludG8gYW5vdGhlciBleHByZXNzaW9uXG4gKiBAcGFyYW0ga2VlcFRhcmdldFR5cGUgS2VlcCB0aGUgdGFyZ2V0IHR5cGUgb2YgdGhlIGVtYmVkZGVkIGJpbmRpbmdzIGluc3RlYWQgb2YgY2FzdGluZyB0aGVtIHRvIGFueVxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPFQ+fSBUaGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uIGJpbmRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVCaW5kaW5nPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0ZXhwcmVzc2lvbjogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRlbWJlZGRlZEluQmluZGluZzogYm9vbGVhbiA9IGZhbHNlLFxuXHRrZWVwVGFyZ2V0VHlwZTogYm9vbGVhbiA9IGZhbHNlXG4pOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3QgZXhwciA9IHdyYXBQcmltaXRpdmUoZXhwcmVzc2lvbik7XG5cdGNvbnN0IGVtYmVkZGVkU2VwYXJhdG9yID0ga2VlcFRhcmdldFR5cGUgPyBcIiRcIiA6IFwiJVwiO1xuXHRsZXQgb3V0UHJvcGVydHkgPSBcIlwiO1xuXHRzd2l0Y2ggKGV4cHIuX3R5cGUpIHtcblx0XHRjYXNlIFwiVW5yZXNvbHZlYWJsZVwiOlxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRjYXNlIFwiQ29uc3RhbnRcIjpcblx0XHRcdGlmIChleHByLnZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBcIm51bGxcIjtcblx0XHRcdH1cblx0XHRcdGlmIChleHByLnZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIFwidW5kZWZpbmVkXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZW9mIGV4cHIudmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoZXhwci52YWx1ZSkpIHtcblx0XHRcdFx0XHRjb25zdCBlbnRyaWVzID0gZXhwci52YWx1ZS5tYXAoZXhwcmVzc2lvbiA9PiBjb21waWxlQmluZGluZyhleHByZXNzaW9uLCB0cnVlKSk7XG5cdFx0XHRcdFx0cmV0dXJuIGBbJHtlbnRyaWVzLmpvaW4oXCIsIFwiKX1dYDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBPYmplY3RzXG5cdFx0XHRcdFx0Y29uc3QgbyA9IGV4cHIudmFsdWUgYXMgUGxhaW5FeHByZXNzaW9uT2JqZWN0O1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhvKS5tYXAoa2V5ID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gb1trZXldO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGAke2tleX06ICR7Y29tcGlsZUJpbmRpbmcodmFsdWUsIHRydWUpfWA7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzLmpvaW4oXCIsIFwiKX19YDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRcdFx0c3dpdGNoICh0eXBlb2YgZXhwci52YWx1ZSkge1xuXHRcdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdFx0XHRjYXNlIFwiYmlnaW50XCI6XG5cdFx0XHRcdFx0Y2FzZSBcImJvb2xlYW5cIjpcblx0XHRcdFx0XHRcdHJldHVybiBleHByLnZhbHVlLnRvU3RyaW5nKCk7XG5cdFx0XHRcdFx0Y2FzZSBcInN0cmluZ1wiOlxuXHRcdFx0XHRcdFx0cmV0dXJuIGAnJHtlc2NhcGVYbWxBdHRyaWJ1dGUoZXhwci52YWx1ZS50b1N0cmluZygpKX0nYDtcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBleHByLnZhbHVlLnRvU3RyaW5nKCk7XG5cdFx0XHR9XG5cblx0XHRjYXNlIFwiUmVmXCI6XG5cdFx0XHRyZXR1cm4gZXhwci5yZWYgfHwgXCJudWxsXCI7XG5cblx0XHRjYXNlIFwiRnVuY3Rpb25cIjpcblx0XHRcdGNvbnN0IGFyZ3VtZW50U3RyaW5nID0gYCR7ZXhwci5wYXJhbWV0ZXJzLm1hcChhcmcgPT4gY29tcGlsZUJpbmRpbmcoYXJnLCB0cnVlKSkuam9pbihcIiwgXCIpfWA7XG5cdFx0XHRyZXR1cm4gZXhwci5vYmogPT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IGAke2V4cHIuZm59KCR7YXJndW1lbnRTdHJpbmd9KWBcblx0XHRcdFx0OiBgJHtjb21waWxlQmluZGluZyhleHByLm9iaiwgdHJ1ZSl9LiR7ZXhwci5mbn0oJHthcmd1bWVudFN0cmluZ30pYDtcblx0XHRjYXNlIFwiRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ1wiOlxuXHRcdFx0aWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0XHRcdHJldHVybiBgKCR7ZXhwci52YWx1ZS5zdWJzdHIoMiwgZXhwci52YWx1ZS5sZW5ndGggLSAzKX0pYDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBgJHtleHByLnZhbHVlfWA7XG5cdFx0XHR9XG5cdFx0Y2FzZSBcIkVtYmVkZGVkQmluZGluZ1wiOlxuXHRcdFx0aWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0XHRcdHJldHVybiBgJHtlbWJlZGRlZFNlcGFyYXRvcn0ke2V4cHIudmFsdWV9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBgJHtleHByLnZhbHVlfWA7XG5cdFx0XHR9XG5cdFx0Y2FzZSBcIkRlZmF1bHRCaW5kaW5nXCI6XG5cdFx0Y2FzZSBcIkJpbmRpbmdcIjpcblx0XHRcdGlmIChleHByLnR5cGUgfHwgZXhwci5wYXJhbWV0ZXJzIHx8IGV4cHIudGFyZ2V0VHlwZSkge1xuXHRcdFx0XHRsZXQgb3V0QmluZGluZyA9IFwiXCI7XG5cdFx0XHRcdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdFx0XHRcdG91dEJpbmRpbmcgKz0gYCR7ZW1iZWRkZWRTZXBhcmF0b3J9YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRvdXRCaW5kaW5nICs9IGB7cGF0aDonJHtleHByLm1vZGVsTmFtZSA/IGAke2V4cHIubW9kZWxOYW1lfT5gIDogXCJcIn0ke2V4cHIucGF0aH0nYDtcblx0XHRcdFx0aWYgKGV4cHIudHlwZSkge1xuXHRcdFx0XHRcdG91dEJpbmRpbmcgKz0gYCwgdHlwZTogJyR7ZXhwci50eXBlfSdgO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChleHByLmNvbnN0cmFpbnRzICYmIE9iamVjdC5rZXlzKGV4cHIuY29uc3RyYWludHMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvdXRCaW5kaW5nICs9IGAsIGNvbnN0cmFpbnRzOiAke2NvbXBpbGVCaW5kaW5nKGV4cHIuY29uc3RyYWludHMpfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGV4cHIuZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRcdG91dEJpbmRpbmcgKz0gYCwgZm9ybWF0T3B0aW9uczogJHtjb21waWxlQmluZGluZyhleHByLmZvcm1hdE9wdGlvbnMpfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGV4cHIucGFyYW1ldGVycyAmJiBPYmplY3Qua2V5cyhleHByLnBhcmFtZXRlcnMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvdXRCaW5kaW5nICs9IGAsIHBhcmFtZXRlcnM6ICR7Y29tcGlsZUJpbmRpbmcoZXhwci5wYXJhbWV0ZXJzKX1gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChleHByLnRhcmdldFR5cGUpIHtcblx0XHRcdFx0XHRvdXRCaW5kaW5nICs9IGAsIHRhcmdldFR5cGU6ICcke2V4cHIudGFyZ2V0VHlwZX0nYDtcblx0XHRcdFx0fVxuXHRcdFx0XHRvdXRCaW5kaW5nICs9IFwifVwiO1xuXHRcdFx0XHRyZXR1cm4gb3V0QmluZGluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdFx0XHRcdHJldHVybiBgJHtlbWJlZGRlZFNlcGFyYXRvcn17JHtleHByLm1vZGVsTmFtZSA/IGAke2V4cHIubW9kZWxOYW1lfT5gIDogXCJcIn0ke2V4cHIucGF0aH19YDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gYHske2V4cHIubW9kZWxOYW1lID8gYCR7ZXhwci5tb2RlbE5hbWV9PmAgOiBcIlwifSR7ZXhwci5wYXRofX1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0Y29uc3QgY29tcGFyaXNvblBhcnQgPSBgJHtjb21waWxlQmluZGluZyhleHByLm9wZXJhbmQxLCB0cnVlKX0gJHtleHByLm9wZXJhdG9yfSAke2NvbXBpbGVCaW5kaW5nKGV4cHIub3BlcmFuZDIsIHRydWUpfWA7XG5cdFx0XHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRcdFx0cmV0dXJuIGNvbXBhcmlzb25QYXJ0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGB7PSAke2NvbXBhcmlzb25QYXJ0fX1gO1xuXG5cdFx0Y2FzZSBcIklmRWxzZVwiOlxuXHRcdFx0aWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0XHRcdHJldHVybiBgKCR7Y29tcGlsZUJpbmRpbmcoZXhwci5jb25kaXRpb24sIHRydWUpfSA/ICR7Y29tcGlsZUJpbmRpbmcoZXhwci5vblRydWUsIHRydWUpfSA6ICR7Y29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdFx0ZXhwci5vbkZhbHNlLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KX0pYDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBgez0gJHtjb21waWxlQmluZGluZyhleHByLmNvbmRpdGlvbiwgdHJ1ZSl9ID8gJHtjb21waWxlQmluZGluZyhleHByLm9uVHJ1ZSwgdHJ1ZSl9IDogJHtjb21waWxlQmluZGluZyhcblx0XHRcdFx0XHRleHByLm9uRmFsc2UsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpfX1gO1xuXHRcdFx0fVxuXG5cdFx0Y2FzZSBcIlNldFwiOlxuXHRcdFx0aWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0XHRcdHJldHVybiBgKCR7ZXhwci5vcGVyYW5kcy5tYXAoZXhwcmVzc2lvbiA9PiBjb21waWxlQmluZGluZyhleHByZXNzaW9uLCB0cnVlKSkuam9pbihgICR7ZXhwci5vcGVyYXRvcn0gYCl9KWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gYHs9ICgke2V4cHIub3BlcmFuZHMubWFwKGV4cHJlc3Npb24gPT4gY29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbiwgdHJ1ZSkpLmpvaW4oYCAke2V4cHIub3BlcmF0b3J9IGApfSl9YDtcblx0XHRcdH1cblxuXHRcdGNhc2UgXCJDb25jYXRcIjpcblx0XHRcdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdFx0XHRyZXR1cm4gYCR7ZXhwci5leHByZXNzaW9ucy5tYXAoZXhwcmVzc2lvbiA9PiBjb21waWxlQmluZGluZyhleHByZXNzaW9uLCB0cnVlLCB0cnVlKSkuam9pbihgICsgYCl9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBgez0gJHtleHByLmV4cHJlc3Npb25zLm1hcChleHByZXNzaW9uID0+IGNvbXBpbGVCaW5kaW5nKGV4cHJlc3Npb24sIHRydWUsIHRydWUpKS5qb2luKGAgKyBgKX0gfWA7XG5cdFx0XHR9XG5cblx0XHRjYXNlIFwiTm90XCI6XG5cdFx0XHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRcdFx0cmV0dXJuIGAhJHtjb21waWxlQmluZGluZyhleHByLm9wZXJhbmQsIHRydWUpfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gYHs9ICEke2NvbXBpbGVCaW5kaW5nKGV4cHIub3BlcmFuZCwgdHJ1ZSl9fWA7XG5cdFx0XHR9XG5cblx0XHRjYXNlIFwiVHJ1dGh5XCI6XG5cdFx0XHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRcdFx0cmV0dXJuIGAhISR7Y29tcGlsZUJpbmRpbmcoZXhwci5vcGVyYW5kLCB0cnVlKX1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGB7PSAhISR7Y29tcGlsZUJpbmRpbmcoZXhwci5vcGVyYW5kLCB0cnVlKX19YDtcblx0XHRcdH1cblxuXHRcdGNhc2UgXCJGb3JtYXR0ZXJcIjpcblx0XHRcdGlmIChleHByLnBhcmFtZXRlcnMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdG91dFByb3BlcnR5ICs9IGB7JHtjb21waWxlUGF0aFBhcmFtZXRlcihleHByLnBhcmFtZXRlcnNbMF0sIHRydWUpfSwgZm9ybWF0dGVyOiAnJHtleHByLmZufSd9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dFByb3BlcnR5ICs9IGB7cGFydHM6WyR7ZXhwci5wYXJhbWV0ZXJzLm1hcCgocGFyYW06IGFueSkgPT4gY29tcGlsZVBhdGhQYXJhbWV0ZXIocGFyYW0pKS5qb2luKFwiLFwiKX1dLCBmb3JtYXR0ZXI6ICcke1xuXHRcdFx0XHRcdGV4cHIuZm5cblx0XHRcdFx0fSd9YDtcblx0XHRcdH1cblx0XHRcdGlmIChlbWJlZGRlZEluQmluZGluZykge1xuXHRcdFx0XHRvdXRQcm9wZXJ0eSA9IGBcXCQke291dFByb3BlcnR5fWA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb3V0UHJvcGVydHk7XG5cdFx0Y2FzZSBcIkNvbXBsZXhUeXBlXCI6XG5cdFx0XHRpZiAoZXhwci5iaW5kaW5nUGFyYW1ldGVycy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0b3V0UHJvcGVydHkgKz0gYHske2NvbXBpbGVQYXRoUGFyYW1ldGVyKGV4cHIuYmluZGluZ1BhcmFtZXRlcnNbMF0sIHRydWUpfSwgdHlwZTogJyR7ZXhwci50eXBlfSd9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGxldCBvdXRwdXRFbmQ7XG5cdFx0XHRcdC8vIHRoaXMgY29kZSBpcyBiYXNlZCBvbiBzYXAudWkubW9kZWwub2RhdGEudjQuX0Fubm90YXRpb25IZWxwZXJFeHByZXNzaW9uLmZldGNoQ3VycmVuY3lPclVuaXRcblx0XHRcdFx0c3dpdGNoIChleHByLnR5cGUpIHtcblx0XHRcdFx0XHRjYXNlIFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiOlxuXHRcdFx0XHRcdFx0b3V0cHV0RW5kID0gYCx7bW9kZTonT25lVGltZScscGF0aDonLyMjQEByZXF1ZXN0VW5pdHNPZk1lYXN1cmUnLHRhcmdldFR5cGU6J2FueSd9XSx0eXBlOidzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0J2A7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuQ3VycmVuY3lcIjpcblx0XHRcdFx0XHRcdG91dHB1dEVuZCA9IGAse21vZGU6J09uZVRpbWUnLHBhdGg6Jy8jI0BAcmVxdWVzdEN1cnJlbmN5Q29kZXMnLHRhcmdldFR5cGU6J2FueSd9XSx0eXBlOidzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeSdgO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdG91dHB1dEVuZCA9IGBdLCB0eXBlOiAnJHtleHByLnR5cGV9J2A7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGV4cHIuZm9ybWF0T3B0aW9ucyAmJiBPYmplY3Qua2V5cyhleHByLmZvcm1hdE9wdGlvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvdXRwdXRFbmQgKz0gYCwgZm9ybWF0T3B0aW9uczogJHtjb21waWxlQmluZGluZyhleHByLmZvcm1hdE9wdGlvbnMpfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGV4cHIucGFyYW1ldGVycyAmJiBPYmplY3Qua2V5cyhleHByLnBhcmFtZXRlcnMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvdXRwdXRFbmQgKz0gYCwgcGFyYW1ldGVyczogJHtjb21waWxlQmluZGluZyhleHByLnBhcmFtZXRlcnMpfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0b3V0cHV0RW5kICs9IFwifVwiO1xuXHRcdFx0XHRvdXRQcm9wZXJ0eSArPSBge21vZGU6J1R3b1dheScsIHBhcnRzOlske2V4cHIuYmluZGluZ1BhcmFtZXRlcnNcblx0XHRcdFx0XHQubWFwKChwYXJhbTogYW55KSA9PiBjb21waWxlUGF0aFBhcmFtZXRlcihwYXJhbSkpXG5cdFx0XHRcdFx0LmpvaW4oXCIsXCIpfSR7b3V0cHV0RW5kfWA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRcdFx0b3V0UHJvcGVydHkgPSBgXFwkJHtvdXRQcm9wZXJ0eX1gO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG91dFByb3BlcnR5O1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0fVxufVxuXG4vKipcbiAqIENvbXBpbGUgdGhlIHBhdGggcGFyYW1ldGVyIG9mIGEgZm9ybWF0dGVyIGNhbGwuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGJpbmRpbmcgcGFydCB0byBldmFsdWF0ZVxuICogQHBhcmFtIHNpbmdsZVBhdGggV2hldGhlciB0aGVyZSBpcyBvbmUgb3IgbXVsdGlwbGUgcGF0aCB0byBjb25zaWRlclxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHN0cmluZyBzbmlwcGV0IHRvIGluY2x1ZGUgaW4gdGhlIG92ZXJhbGwgYmluZGluZyBkZWZpbml0aW9uXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVQYXRoUGFyYW1ldGVyKGV4cHJlc3Npb246IEV4cHJlc3Npb248YW55Piwgc2luZ2xlUGF0aDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcblx0bGV0IG91dFZhbHVlID0gXCJcIjtcblx0c3dpdGNoIChleHByZXNzaW9uLl90eXBlKSB7XG5cdFx0Y2FzZSBcIkNvbnN0YW50XCI6XG5cdFx0XHRzd2l0Y2ggKHR5cGVvZiBleHByZXNzaW9uLnZhbHVlKSB7XG5cdFx0XHRcdGNhc2UgXCJudW1iZXJcIjpcblx0XHRcdFx0Y2FzZSBcImJpZ2ludFwiOlxuXHRcdFx0XHRcdG91dFZhbHVlID0gYHZhbHVlOiAke2V4cHJlc3Npb24udmFsdWUudG9TdHJpbmcoKX1gO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwic3RyaW5nXCI6XG5cdFx0XHRcdFx0b3V0VmFsdWUgPSBgdmFsdWU6ICcke2VzY2FwZVhtbEF0dHJpYnV0ZShleHByZXNzaW9uLnZhbHVlLnRvU3RyaW5nKCkpfSdgO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRcdG91dFZhbHVlID0gYHZhbHVlOiAnJHtleHByZXNzaW9uLnZhbHVlLnRvU3RyaW5nKCl9J2A7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0b3V0VmFsdWUgPSBcInZhbHVlOiAnJ1wiO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNpbmdsZVBhdGgpIHtcblx0XHRcdFx0cmV0dXJuIG91dFZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGB7JHtvdXRWYWx1ZX19YDtcblxuXHRcdGNhc2UgXCJEZWZhdWx0QmluZGluZ1wiOlxuXHRcdGNhc2UgXCJCaW5kaW5nXCI6XG5cdFx0XHRvdXRWYWx1ZSA9IGBwYXRoOicke2V4cHJlc3Npb24ubW9kZWxOYW1lID8gYCR7ZXhwcmVzc2lvbi5tb2RlbE5hbWV9PmAgOiBcIlwifSR7ZXhwcmVzc2lvbi5wYXRofSdgO1xuXG5cdFx0XHRpZiAoZXhwcmVzc2lvbi50eXBlKSB7XG5cdFx0XHRcdG91dFZhbHVlICs9IGAsIHR5cGUgOiAnJHtleHByZXNzaW9uLnR5cGV9J2A7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvdXRWYWx1ZSArPSBgLCB0YXJnZXRUeXBlIDogJ2FueSdgO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGV4cHJlc3Npb24uY29uc3RyYWludHMgJiYgT2JqZWN0LmtleXMoZXhwcmVzc2lvbi5jb25zdHJhaW50cykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRvdXRWYWx1ZSArPSBgLCBjb25zdHJhaW50czogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLmNvbnN0cmFpbnRzKX1gO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucyAmJiBPYmplY3Qua2V5cyhleHByZXNzaW9uLmZvcm1hdE9wdGlvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0b3V0VmFsdWUgKz0gYCwgZm9ybWF0T3B0aW9uczogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLmZvcm1hdE9wdGlvbnMpfWA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzICYmIE9iamVjdC5rZXlzKGV4cHJlc3Npb24ucGFyYW1ldGVycykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRvdXRWYWx1ZSArPSBgLCBwYXJhbWV0ZXJzOiAke2NvbXBpbGVCaW5kaW5nKGV4cHJlc3Npb24ucGFyYW1ldGVycyl9YDtcblx0XHRcdH1cblx0XHRcdGlmIChzaW5nbGVQYXRoKSB7XG5cdFx0XHRcdHJldHVybiBvdXRWYWx1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBgeyR7b3V0VmFsdWV9fWA7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBcIlwiO1xuXHR9XG59XG4iXX0=
|
|
1729
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJpbmRpbmdFeHByZXNzaW9uLnRzIl0sIm5hbWVzIjpbInVucmVzb2x2ZWFibGVFeHByZXNzaW9uIiwiX3R5cGUiLCJlc2NhcGVYbWxBdHRyaWJ1dGUiLCJpbnB1dFN0cmluZyIsInJlcGxhY2UiLCJoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiIsImV4cHJlc3Npb25zIiwiZmluZCIsImV4cHIiLCJ1bmRlZmluZWQiLCJfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsIiwiYSIsImIiLCJ2YWx1ZSIsIm9wZXJhbmQiLCJvcGVyYXRvciIsIm9wZXJhbmRzIiwibGVuZ3RoIiwiZXZlcnkiLCJleHByZXNzaW9uIiwic29tZSIsIm90aGVyRXhwcmVzc2lvbiIsImNvbmRpdGlvbiIsIm9uVHJ1ZSIsIm9uRmFsc2UiLCJvcGVyYW5kMSIsIm9wZXJhbmQyIiwiYUV4cHJlc3Npb25zIiwiYkV4cHJlc3Npb25zIiwiaW5kZXgiLCJiaW5kaW5nRXhwcmVzc2lvbiIsIm1vZGVsTmFtZSIsInBhdGgiLCJ0YXJnZXRFbnRpdHlTZXQiLCJmbiIsInBhcmFtZXRlcnMiLCJ0eXBlIiwiYmluZGluZ1BhcmFtZXRlcnMiLCJvdGhlckZ1bmN0aW9uIiwib2JqIiwicmVmIiwiZmxhdHRlblNldEV4cHJlc3Npb24iLCJyZWR1Y2UiLCJyZXN1bHQiLCJjYW5kaWRhdGVzRm9yRmxhdHRlbmluZyIsImZvckVhY2giLCJjYW5kaWRhdGUiLCJlIiwicHVzaCIsImhhc09wcG9zaXRlRXhwcmVzc2lvbnMiLCJuZWdhdGVkRXhwcmVzc2lvbnMiLCJtYXAiLCJub3QiLCJpIiwiYW5kIiwid3JhcFByaW1pdGl2ZSIsImlzU3RhdGljRmFsc2UiLCJub25Ucml2aWFsRXhwcmVzc2lvbiIsImZpbHRlciIsImlzRmFsc2UiLCJpc0NvbnN0YW50IiwiY29uc3RhbnQiLCJpc1ZhbGlkIiwiaXNUcnVlIiwib3IiLCJpc1N0YXRpY1RydWUiLCJpc0NvbXBhcmlzb24iLCJpc1RydXRoeSIsInZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMiLCJwYXRoVmlzaXRvciIsInRhcmdldFBhdGgiLCJsb2NhbFBhdGgiLCJjb25jYXQiLCJqb2luIiwiY29uc3RhbnRWYWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsImlzUHJpbWl0aXZlT2JqZWN0IiwidmFsdWVPZiIsIk9iamVjdCIsImVudHJpZXMiLCJwbGFpbkV4cHJlc3Npb24iLCJrZXkiLCJ2YWwiLCJ3cmFwcGVkVmFsdWUiLCJyZXNvbHZlQmluZGluZ1N0cmluZyIsInRhcmdldFR5cGUiLCJzdGFydHNXaXRoIiwicmVmZXJlbmNlIiwiaXNFeHByZXNzaW9uIiwic29tZXRoaW5nIiwibWF5YmVDb25zdGFudCIsImlzQmluZGluZyIsIm1heWJlQmluZGluZyIsIm9iamVjdFR5cGUiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJpc0NvbXBsZXhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsImFubm90YXRpb25WYWx1ZSIsImFubm90YXRpb25FeHByZXNzaW9uIiwiZGVmYXVsdFZhbHVlIiwiYW5ub3RhdGlvbklmRXhwcmVzc2lvbiIsIklmIiwicGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uIiwiTm90IiwiZXF1YWwiLCJFcSIsIm5vdEVxdWFsIiwiTmUiLCJncmVhdGVyVGhhbiIsIkd0IiwiZ3JlYXRlck9yRXF1YWwiLCJHZSIsImxlc3NUaGFuIiwiTHQiLCJsZXNzT3JFcXVhbCIsIkxlIiwiT3IiLCJvckNvbmRpdGlvbiIsIkFuZCIsImFuZENvbmRpdGlvbiIsImFubm90YXRpb25BcHBseUV4cHJlc3Npb24iLCJoYXNPd25Qcm9wZXJ0eSIsIiRPciIsIiRBbmQiLCIkTm90IiwiJEVxIiwiJE5lIiwiJEd0IiwiJEdlIiwiJEx0IiwiJExlIiwiJFBhdGgiLCJGdW5jdGlvbiIsIiRGdW5jdGlvbiIsIkFwcGx5IiwiJEFwcGx5IiwiJElmIiwicmVzb2x2ZUVudW1WYWx1ZSIsIiRFbnVtTWVtYmVyIiwiaWZFbHNlIiwiYXBwbHlFeHByZXNzaW9uIiwiYXBwbHlQYXJhbSIsImFwcGx5UGFyYW1Db252ZXJ0ZWQiLCJjb21wYXJpc29uIiwibGVmdE9wZXJhbmQiLCJyaWdodE9wZXJhbmQiLCJsZWZ0RXhwcmVzc2lvbiIsInJpZ2h0RXhwcmVzc2lvbiIsImxlZnQiLCJyaWdodCIsInJlZHVjZWQiLCJjb25kaXRpb25FeHByZXNzaW9uIiwib25UcnVlRXhwcmVzc2lvbiIsIm9uRmFsc2VFeHByZXNzaW9uIiwiaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dCIsImZvcm1hdFJlc3VsdCIsImZvcm1hdHRlckZ1bmN0aW9uIiwiY29udGV4dEVudGl0eVR5cGUiLCJwYXJhbWV0ZXJFeHByZXNzaW9ucyIsImtleXMiLCJfX2Z1bmN0aW9uTmFtZSIsInNwbGl0IiwiZm9ybWF0dGVyQ2xhc3MiLCJmb3JtYXR0ZXJOYW1lIiwidW5zaGlmdCIsImFkZFR5cGVJbmZvcm1hdGlvbiIsIm9Gb3JtYXRPcHRpb25zIiwiaW5kZXhPZiIsInBhcnNlQXNTdHJpbmciLCJlbXB0eVN0cmluZyIsImZvcm1hdE9wdGlvbnMiLCJmdW5jIiwib24iLCJmdW5jdGlvbk5hbWUiLCJpc0VtcHR5IiwiaW5FeHByZXNzaW9ucyIsImNvbmNhdGVuYXRlZCIsInRvU3RyaW5nIiwidHJhbnNmb3JtUmVjdXJzaXZlbHkiLCJpbkV4cHJlc3Npb24iLCJleHByZXNzaW9uVHlwZSIsInRyYW5zZm9ybUZ1bmN0aW9uIiwiaW5jbHVkZUFsbEV4cHJlc3Npb24iLCJwYXJhbWV0ZXIiLCJzdWJFeHByZXNzaW9uIiwiYmluZGluZ1BhcmFtZXRlciIsIm5lZWRQYXJlbnRoZXNpcyIsImNvbXBpbGVDb25zdGFudE9iamVjdCIsImlzTnVsbGFibGUiLCJvIiwicHJvcGVydGllcyIsImNoaWxkUmVzdWx0IiwiY29tcGlsZUJpbmRpbmciLCJjb21waWxlQ29uc3RhbnQiLCJlbWJlZGRlZEluQmluZGluZyIsImNvbXBpbGVCaW5kaW5nRm9yQmluZGluZyIsImV4cHJlc3Npb25Gb3JCaW5kaW5nIiwiZW1iZWRkZWRTZXBhcmF0b3IiLCJjb25zdHJhaW50cyIsImNvbXBsZXhCaW5kaW5nRGVmaW5pdGlvbiIsImNvbXBpbGVCaW5kaW5nUGF0aCIsIm91dEJpbmRpbmciLCJjb21waWxlQ29tcGxleFR5cGVFeHByZXNzaW9uIiwiY29tcGlsZVBhdGhQYXJhbWV0ZXIiLCJvdXRwdXRFbmQiLCJoYXNFbGVtZW50cyIsInBhcmFtIiwid3JhcEJpbmRpbmdFeHByZXNzaW9uIiwicGFyZW50aGVzaXNSZXF1aXJlZCIsImtlZXBUYXJnZXRUeXBlIiwiYXJndW1lbnRTdHJpbmciLCJhcmciLCJzdWJzdHIiLCJjb21wYXJpc29uRXhwcmVzc2lvbiIsImNvbXBpbGVDb21wYXJpc29uRXhwcmVzc2lvbiIsImlmRWxzZUV4cHJlc3Npb24iLCJzZXRFeHByZXNzaW9uIiwiY29uY2F0RXhwcmVzc2lvbiIsIm5lc3RlZEV4cHJlc3Npb24iLCJsZW5ndGhFeHByZXNzaW9uIiwibm90RXhwcmVzc2lvbiIsInRydXRoeUV4cHJlc3Npb24iLCJmb3JtYXR0ZXJFeHByZXNzaW9uIiwiY29tcGlsZUZvcm1hdHRlckV4cHJlc3Npb24iLCJjb21wbGV4VHlwZUV4cHJlc3Npb24iLCJjb21waWxlT3BlcmFuZCIsImNvbXBpbGVkT3BlcmFuZCIsInBhcnRzIiwic2luZ2xlUGF0aCIsIm91dFZhbHVlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnTE8sTUFBTUEsdUJBQXVELEdBQUc7QUFDdEVDLElBQUFBLEtBQUssRUFBRTtBQUQrRCxHQUFoRTs7O0FBSVAsV0FBU0Msa0JBQVQsQ0FBNEJDLFdBQTVCLEVBQWlEO0FBQ2hELFdBQU9BLFdBQVcsQ0FBQ0MsT0FBWixDQUFvQixJQUFwQixFQUEwQixLQUExQixDQUFQO0FBQ0E7O0FBRU0sV0FBU0MsMEJBQVQsR0FBZ0Y7QUFBQSxzQ0FBekNDLFdBQXlDO0FBQXpDQSxNQUFBQSxXQUF5QztBQUFBOztBQUN0RixXQUFPQSxXQUFXLENBQUNDLElBQVosQ0FBaUIsVUFBQUMsSUFBSTtBQUFB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QXFCckMsY0FBYyxDQUFDOUssVUFBVSxDQUFDZ0IsVUFBWixDQUFuQyxDQUFSO0FBQ0E7QUFDRCxLQWRNLE1BY0E7QUFDTixhQUFPLEVBQVA7QUFDQTs7QUFDRCxXQUFPa00sVUFBVSxHQUFHQyxRQUFILGNBQWtCQSxRQUFsQixNQUFqQjtBQUNBOztBQUVELFdBQVN4QixXQUFULENBQXFCdkssR0FBckIsRUFBK0I7QUFDOUIsV0FBT0EsR0FBRyxJQUFJd0MsTUFBTSxDQUFDaUYsSUFBUCxDQUFZekgsR0FBWixFQUFpQnRCLE1BQWpCLEdBQTBCLENBQXhDO0FBQ0E7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFdBQVN3TCxrQkFBVCxDQUFxRHRMLFVBQXJELEVBQXlJO0FBQ3hJLHFCQUFVQSxVQUFVLENBQUNZLFNBQVgsR0FBdUJaLFVBQVUsQ0FBQ1ksU0FBWCxHQUF1QixHQUE5QyxHQUFvRCxFQUE5RCxTQUFtRVosVUFBVSxDQUFDYSxJQUE5RTtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRBbmRBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0QW5kQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRDb25kaXRpb25hbENoZWNrT3JWYWx1ZSxcblx0RW50aXR5VHlwZSxcblx0RXFBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0RXFDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdEdlQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdEdlQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRHdEFubm90YXRpb25FeHByZXNzaW9uLFxuXHRHdENvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0SWZBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0SWZBbm5vdGF0aW9uRXhwcmVzc2lvblZhbHVlLFxuXHRMZUFubm90YXRpb25FeHByZXNzaW9uLFxuXHRMZUNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0THRBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0THRDb25kaXRpb25hbEV4cHJlc3Npb24sXG5cdE5lQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdE5lQ29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHROb3RBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Tm90Q29uZGl0aW9uYWxFeHByZXNzaW9uLFxuXHRPckFubm90YXRpb25FeHByZXNzaW9uLFxuXHRPckNvbmRpdGlvbmFsRXhwcmVzc2lvbixcblx0UGF0aENvbmRpdGlvbkV4cHJlc3Npb24sXG5cdFByb3BlcnR5QW5ub3RhdGlvblZhbHVlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgQXBwbHlBbm5vdGF0aW9uRXhwcmVzc2lvbiwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3R5cGVzL0VkbVwiO1xuaW1wb3J0IHsgRW50aXR5U2V0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvQ29udmVydGVyXCI7XG5pbXBvcnQgeyByZXNvbHZlRW51bVZhbHVlIH0gZnJvbSBcIi4vQW5ub3RhdGlvbkVudW1cIjtcblxudHlwZSBQcmltaXRpdmVUeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHwgYm9vbGVhbiB8IG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbnR5cGUgQmFzZUV4cHJlc3Npb248VD4gPSB7XG5cdF90eXBlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDb25zdGFudEV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQ29uc3RhbnRcIjtcblx0dmFsdWU6IFQ7XG59O1xuXG50eXBlIFNldE9wZXJhdG9yID0gXCImJlwiIHwgXCJ8fFwiO1xuZXhwb3J0IHR5cGUgU2V0RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPGJvb2xlYW4+ICYge1xuXHRfdHlwZTogXCJTZXRcIjtcblx0b3BlcmF0b3I6IFNldE9wZXJhdG9yO1xuXHRvcGVyYW5kczogRXhwcmVzc2lvbjxib29sZWFuPltdO1xufTtcblxuZXhwb3J0IHR5cGUgTm90RXhwcmVzc2lvbiA9IEJhc2VFeHByZXNzaW9uPGJvb2xlYW4+ICYge1xuXHRfdHlwZTogXCJOb3RcIjtcblx0b3BlcmFuZDogRXhwcmVzc2lvbjxib29sZWFuPjtcbn07XG5cbmV4cG9ydCB0eXBlIFRydXRoeUV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxib29sZWFuPiAmIHtcblx0X3R5cGU6IFwiVHJ1dGh5XCI7XG5cdG9wZXJhbmQ6IEV4cHJlc3Npb248c3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIFJlZmVyZW5jZUV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxvYmplY3Q+ICYge1xuXHRfdHlwZTogXCJSZWZcIjtcblx0cmVmOiBzdHJpbmcgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJGb3JtYXR0ZXJcIjtcblx0Zm46IHN0cmluZztcblx0cGFyYW1ldGVyczogRXhwcmVzc2lvbjxhbnk+W107XG59O1xuXG5leHBvcnQgdHlwZSBDb21wbGV4VHlwZUV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiQ29tcGxleFR5cGVcIjtcblx0dHlwZTogc3RyaW5nO1xuXHRmb3JtYXRPcHRpb25zOiBvYmplY3Q7XG5cdHBhcmFtZXRlcnM6IG9iamVjdDtcblx0YmluZGluZ1BhcmFtZXRlcnM6IEV4cHJlc3Npb248YW55PltdO1xufTtcblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25FeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkZ1bmN0aW9uXCI7XG5cdG9iaj86IEV4cHJlc3Npb248b2JqZWN0Pjtcblx0Zm46IHN0cmluZztcblx0cGFyYW1ldGVyczogRXhwcmVzc2lvbjxhbnk+W107XG59O1xuXG5leHBvcnQgdHlwZSBDb25jYXRFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248c3RyaW5nPiAmIHtcblx0X3R5cGU6IFwiQ29uY2F0XCI7XG5cdGV4cHJlc3Npb25zOiBFeHByZXNzaW9uPHN0cmluZz5bXTtcbn07XG5cbmV4cG9ydCB0eXBlIExlbmd0aEV4cHJlc3Npb24gPSBCYXNlRXhwcmVzc2lvbjxzdHJpbmc+ICYge1xuXHRfdHlwZTogXCJMZW5ndGhcIjtcblx0YmluZGluZ0V4cHJlc3Npb246IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxhbnk+O1xufTtcblxuZXhwb3J0IHR5cGUgVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248c3RyaW5nPiAmIHtcblx0X3R5cGU6IFwiVW5yZXNvbHZlYWJsZVwiO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb25cbiAqL1xuZXhwb3J0IHR5cGUgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkJpbmRpbmdcIjtcblx0bW9kZWxOYW1lPzogc3RyaW5nO1xuXHRwYXRoOiBzdHJpbmc7XG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldDtcblx0dHlwZT86IHN0cmluZztcblx0Y29uc3RyYWludHM/OiBhbnk7XG5cdHBhcmFtZXRlcnM/OiBhbnk7XG5cdHRhcmdldFR5cGU/OiBzdHJpbmc7XG5cdGZvcm1hdE9wdGlvbnM/OiBhbnk7XG59O1xuXG5leHBvcnQgdHlwZSBEZWZhdWx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+ID0gQmFzZUV4cHJlc3Npb248VD4gJiB7XG5cdF90eXBlOiBcIkRlZmF1bHRCaW5kaW5nXCI7XG5cdG1vZGVsTmFtZT86IHN0cmluZztcblx0cGF0aDogc3RyaW5nO1xuXHR0eXBlPzogc3RyaW5nO1xuXHRjb25zdHJhaW50cz86IG9iamVjdDtcblx0cGFyYW1ldGVycz86IGFueTtcblx0dGFyZ2V0VHlwZT86IHN0cmluZztcblx0Zm9ybWF0T3B0aW9ucz86IG9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIEVtYmVkZGVkQmluZGluZ0V4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiRW1iZWRkZWRCaW5kaW5nXCI7XG5cdHZhbHVlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nRXhwcmVzc2lvbjxUPiA9IEJhc2VFeHByZXNzaW9uPFQ+ICYge1xuXHRfdHlwZTogXCJFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nXCI7XG5cdHZhbHVlOiBzdHJpbmc7XG59O1xuXG50eXBlIENvbXBhcmlzb25PcGVyYXRvciA9IFwiPT09XCIgfCBcIiE9PVwiIHwgXCI+PVwiIHwgXCI+XCIgfCBcIjw9XCIgfCBcIjxcIjtcbmV4cG9ydCB0eXBlIENvbXBhcmlzb25FeHByZXNzaW9uID0gQmFzZUV4cHJlc3Npb248Ym9vbGVhbj4gJiB7XG5cdF90eXBlOiBcIkNvbXBhcmlzb25cIjtcblx0b3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcjtcblx0b3BlcmFuZDE6IEV4cHJlc3Npb248YW55Pjtcblx0b3BlcmFuZDI6IEV4cHJlc3Npb248YW55Pjtcbn07XG5cbmV4cG9ydCB0eXBlIElmRWxzZUV4cHJlc3Npb248VD4gPSBCYXNlRXhwcmVzc2lvbjxUPiAmIHtcblx0X3R5cGU6IFwiSWZFbHNlXCI7XG5cdGNvbmRpdGlvbjogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0b25UcnVlOiBFeHByZXNzaW9uPFQ+O1xuXHRvbkZhbHNlOiBFeHByZXNzaW9uPFQ+O1xufTtcblxuLyoqXG4gKiBBbiBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHR5cGUgVC5cbiAqXG4gKiBAdHlwZWRlZiBFeHByZXNzaW9uXG4gKi9cbmV4cG9ydCB0eXBlIEV4cHJlc3Npb248VD4gPVxuXHR8IFVucmVzb2x2ZWFibGVCaW5kaW5nRXhwcmVzc2lvblxuXHR8IENvbnN0YW50RXhwcmVzc2lvbjxUPlxuXHR8IFNldEV4cHJlc3Npb25cblx0fCBOb3RFeHByZXNzaW9uXG5cdHwgVHJ1dGh5RXhwcmVzc2lvblxuXHR8IENvbmNhdEV4cHJlc3Npb25cblx0fCBMZW5ndGhFeHByZXNzaW9uXG5cdHwgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+XG5cdHwgRW1iZWRkZWRCaW5kaW5nRXhwcmVzc2lvbjxUPlxuXHR8IEVtYmVkZGVkRXhwcmVzc2lvbkJpbmRpbmdFeHByZXNzaW9uPFQ+XG5cdHwgRGVmYXVsdEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPlxuXHR8IENvbXBhcmlzb25FeHByZXNzaW9uXG5cdHwgSWZFbHNlRXhwcmVzc2lvbjxUPlxuXHR8IEZvcm1hdHRlckV4cHJlc3Npb248VD5cblx0fCBDb21wbGV4VHlwZUV4cHJlc3Npb248VD5cblx0fCBSZWZlcmVuY2VFeHByZXNzaW9uXG5cdHwgRnVuY3Rpb25FeHByZXNzaW9uPFQ+O1xuXG4vKipcbiAqIEFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gdHlwZSBULCBvciBhIGNvbnN0YW50IHZhbHVlIG9mIHR5cGUgVFxuICovXG5leHBvcnQgdHlwZSBFeHByZXNzaW9uT3JQcmltaXRpdmU8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+ID0gRXhwcmVzc2lvbjxUPiB8IFQ7XG5cbmV4cG9ydCBjb25zdCB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjogVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uID0ge1xuXHRfdHlwZTogXCJVbnJlc29sdmVhYmxlXCJcbn07XG5cbmZ1bmN0aW9uIGVzY2FwZVhtbEF0dHJpYnV0ZShpbnB1dFN0cmluZzogc3RyaW5nKSB7XG5cdHJldHVybiBpbnB1dFN0cmluZy5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5leHByZXNzaW9uczogRXhwcmVzc2lvbjxhbnk+W10pOiBib29sZWFuIHtcblx0cmV0dXJuIGV4cHJlc3Npb25zLmZpbmQoZXhwciA9PiBleHByLl90eXBlID09PSBcIlVucmVzb2x2ZWFibGVcIikgIT09IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogQ2hlY2sgdHdvIGV4cHJlc3Npb25zIGZvciAoZGVlcCkgZXF1YWxpdHkuXG4gKlxuICogQHBhcmFtIGFcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB0d28gZXhwcmVzc2lvbnMgYXJlIGVxdWFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsPFQ+KGE6IEV4cHJlc3Npb248VD4sIGI6IEV4cHJlc3Npb248VD4pOiBib29sZWFuIHtcblx0aWYgKGEuX3R5cGUgIT09IGIuX3R5cGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRzd2l0Y2ggKGEuX3R5cGUpIHtcblx0XHRjYXNlIFwiVW5yZXNvbHZlYWJsZVwiOlxuXHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBVbnJlc29sdmVhYmxlIGlzIG5ldmVyIGVxdWFsIHRvIGFueXRoaW5nIGV2ZW4gaXRzZWxmXG5cdFx0Y2FzZSBcIkNvbnN0YW50XCI6XG5cdFx0Y2FzZSBcIkVtYmVkZGVkQmluZGluZ1wiOlxuXHRcdGNhc2UgXCJFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gYS52YWx1ZSA9PT0gKGIgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+KS52YWx1ZTtcblxuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRcdHJldHVybiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub3BlcmFuZCwgKGIgYXMgTm90RXhwcmVzc2lvbikub3BlcmFuZCk7XG5cdFx0Y2FzZSBcIlRydXRoeVwiOlxuXHRcdFx0cmV0dXJuIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vcGVyYW5kLCAoYiBhcyBUcnV0aHlFeHByZXNzaW9uKS5vcGVyYW5kKTtcblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLm9wZXJhdG9yID09PSAoYiBhcyBTZXRFeHByZXNzaW9uKS5vcGVyYXRvciAmJlxuXHRcdFx0XHRhLm9wZXJhbmRzLmxlbmd0aCA9PT0gKGIgYXMgU2V0RXhwcmVzc2lvbikub3BlcmFuZHMubGVuZ3RoICYmXG5cdFx0XHRcdGEub3BlcmFuZHMuZXZlcnkoZXhwcmVzc2lvbiA9PlxuXHRcdFx0XHRcdChiIGFzIFNldEV4cHJlc3Npb24pLm9wZXJhbmRzLnNvbWUob3RoZXJFeHByZXNzaW9uID0+IF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoZXhwcmVzc2lvbiwgb3RoZXJFeHByZXNzaW9uKSlcblx0XHRcdFx0KVxuXHRcdFx0KTtcblxuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5jb25kaXRpb24sIChiIGFzIElmRWxzZUV4cHJlc3Npb248VD4pLmNvbmRpdGlvbikgJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9uVHJ1ZSwgKGIgYXMgSWZFbHNlRXhwcmVzc2lvbjxUPikub25UcnVlKSAmJlxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub25GYWxzZSwgKGIgYXMgSWZFbHNlRXhwcmVzc2lvbjxUPikub25GYWxzZSlcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS5vcGVyYXRvciA9PT0gKGIgYXMgQ29tcGFyaXNvbkV4cHJlc3Npb24pLm9wZXJhdG9yICYmXG5cdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5vcGVyYW5kMSwgKGIgYXMgQ29tcGFyaXNvbkV4cHJlc3Npb24pLm9wZXJhbmQxKSAmJlxuXHRcdFx0XHRfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGEub3BlcmFuZDIsIChiIGFzIENvbXBhcmlzb25FeHByZXNzaW9uKS5vcGVyYW5kMilcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiQ29uY2F0XCI6XG5cdFx0XHRjb25zdCBhRXhwcmVzc2lvbnMgPSBhLmV4cHJlc3Npb25zO1xuXHRcdFx0Y29uc3QgYkV4cHJlc3Npb25zID0gKGIgYXMgQ29uY2F0RXhwcmVzc2lvbikuZXhwcmVzc2lvbnM7XG5cdFx0XHRpZiAoYUV4cHJlc3Npb25zLmxlbmd0aCAhPT0gYkV4cHJlc3Npb25zLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYUV4cHJlc3Npb25zLmV2ZXJ5KChleHByZXNzaW9uLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChleHByZXNzaW9uLCBiRXhwcmVzc2lvbnNbaW5kZXhdKTtcblx0XHRcdH0pO1xuXG5cdFx0Y2FzZSBcIkxlbmd0aFwiOlxuXHRcdFx0cmV0dXJuIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoYS5iaW5kaW5nRXhwcmVzc2lvbiwgKGIgYXMgTGVuZ3RoRXhwcmVzc2lvbikuYmluZGluZ0V4cHJlc3Npb24pO1xuXG5cdFx0Y2FzZSBcIkJpbmRpbmdcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEubW9kZWxOYW1lID09PSAoYiBhcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4pLm1vZGVsTmFtZSAmJlxuXHRcdFx0XHRhLnBhdGggPT09IChiIGFzIEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikucGF0aCAmJlxuXHRcdFx0XHRhLnRhcmdldEVudGl0eVNldCA9PT0gKGIgYXMgQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+KS50YXJnZXRFbnRpdHlTZXRcblx0XHRcdCk7XG5cblx0XHRjYXNlIFwiRGVmYXVsdEJpbmRpbmdcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEubW9kZWxOYW1lID09PSAoYiBhcyBEZWZhdWx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+KS5tb2RlbE5hbWUgJiZcblx0XHRcdFx0YS5wYXRoID09PSAoYiBhcyBEZWZhdWx0QmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+KS5wYXRoXG5cdFx0XHQpO1xuXG5cdFx0Y2FzZSBcIkZvcm1hdHRlclwiOlxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0YS5mbiA9PT0gKGIgYXMgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPikuZm4gJiZcblx0XHRcdFx0YS5wYXJhbWV0ZXJzLmxlbmd0aCA9PT0gKGIgYXMgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPikucGFyYW1ldGVycy5sZW5ndGggJiZcblx0XHRcdFx0YS5wYXJhbWV0ZXJzLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoKGIgYXMgRm9ybWF0dGVyRXhwcmVzc2lvbjxUPikucGFyYW1ldGVyc1tpbmRleF0sIHZhbHVlKSlcblx0XHRcdCk7XG5cdFx0Y2FzZSBcIkNvbXBsZXhUeXBlXCI6XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhLnR5cGUgPT09IChiIGFzIENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikudHlwZSAmJlxuXHRcdFx0XHRhLmJpbmRpbmdQYXJhbWV0ZXJzLmxlbmd0aCA9PT0gKGIgYXMgQ29tcGxleFR5cGVFeHByZXNzaW9uPFQ+KS5iaW5kaW5nUGFyYW1ldGVycy5sZW5ndGggJiZcblx0XHRcdFx0YS5iaW5kaW5nUGFyYW1ldGVycy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PlxuXHRcdFx0XHRcdF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoKGIgYXMgQ29tcGxleFR5cGVFeHByZXNzaW9uPFQ+KS5iaW5kaW5nUGFyYW1ldGVyc1tpbmRleF0sIHZhbHVlKVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdGNhc2UgXCJGdW5jdGlvblwiOlxuXHRcdFx0Y29uc3Qgb3RoZXJGdW5jdGlvbiA9IGIgYXMgRnVuY3Rpb25FeHByZXNzaW9uPFQ+O1xuXHRcdFx0aWYgKGEub2JqID09PSB1bmRlZmluZWQgfHwgb3RoZXJGdW5jdGlvbi5vYmogPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gYS5vYmogPT09IG90aGVyRnVuY3Rpb247XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGEuZm4gPT09IG90aGVyRnVuY3Rpb24uZm4gJiZcblx0XHRcdFx0X2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChhLm9iaiwgb3RoZXJGdW5jdGlvbi5vYmopICYmXG5cdFx0XHRcdGEucGFyYW1ldGVycy5sZW5ndGggPT09IG90aGVyRnVuY3Rpb24ucGFyYW1ldGVycy5sZW5ndGggJiZcblx0XHRcdFx0YS5wYXJhbWV0ZXJzLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwob3RoZXJGdW5jdGlvbi5wYXJhbWV0ZXJzW2luZGV4XSwgdmFsdWUpKVxuXHRcdFx0KTtcblxuXHRcdGNhc2UgXCJSZWZcIjpcblx0XHRcdHJldHVybiBhLnJlZiA9PT0gKGIgYXMgUmVmZXJlbmNlRXhwcmVzc2lvbikucmVmO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG5lc3RlZCBTZXRFeHByZXNzaW9uIGJ5IGlubGluaW5nIG9wZXJhbmRzIG9mIHR5cGUgU2V0RXhwcmVzc2lvbiB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGZsYXR0ZW5cbiAqIEByZXR1cm5zIHtTZXRFeHByZXNzaW9ufSBBIG5ldyBTZXRFeHByZXNzaW9uIHdpdGggdGhlIHNhbWUgb3BlcmF0b3JcbiAqL1xuZnVuY3Rpb24gZmxhdHRlblNldEV4cHJlc3Npb24oZXhwcmVzc2lvbjogU2V0RXhwcmVzc2lvbik6IFNldEV4cHJlc3Npb24ge1xuXHRyZXR1cm4gZXhwcmVzc2lvbi5vcGVyYW5kcy5yZWR1Y2UoXG5cdFx0KHJlc3VsdDogU2V0RXhwcmVzc2lvbiwgb3BlcmFuZCkgPT4ge1xuXHRcdFx0Y29uc3QgY2FuZGlkYXRlc0ZvckZsYXR0ZW5pbmcgPVxuXHRcdFx0XHRvcGVyYW5kLl90eXBlID09PSBcIlNldFwiICYmIG9wZXJhbmQub3BlcmF0b3IgPT09IGV4cHJlc3Npb24ub3BlcmF0b3IgPyBvcGVyYW5kLm9wZXJhbmRzIDogW29wZXJhbmRdO1xuXHRcdFx0Y2FuZGlkYXRlc0ZvckZsYXR0ZW5pbmcuZm9yRWFjaChjYW5kaWRhdGUgPT4ge1xuXHRcdFx0XHRpZiAocmVzdWx0Lm9wZXJhbmRzLmV2ZXJ5KGUgPT4gIV9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoZSwgY2FuZGlkYXRlKSkpIHtcblx0XHRcdFx0XHRyZXN1bHQub3BlcmFuZHMucHVzaChjYW5kaWRhdGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSxcblx0XHR7IF90eXBlOiBcIlNldFwiLCBvcGVyYXRvcjogZXhwcmVzc2lvbi5vcGVyYXRvciwgb3BlcmFuZHM6IFtdIH1cblx0KTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHdoZXRoZXIgYW4gYXJyYXkgb2YgYm9vbGVhbiBleHByZXNzaW9ucyBjb250YWlucyBhbiBleHByZXNzaW9uIGFuZCBpdHMgbmVnYXRpb24uXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb25zIEFycmF5IG9mIGV4cHJlc3Npb25zXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBzZXQgb2YgZXhwcmVzc2lvbnMgY29udGFpbnMgYW4gZXhwcmVzc2lvbiBhbmQgaXRzIG5lZ2F0aW9uXG4gKi9cbmZ1bmN0aW9uIGhhc09wcG9zaXRlRXhwcmVzc2lvbnMoZXhwcmVzc2lvbnM6IEV4cHJlc3Npb248Ym9vbGVhbj5bXSk6IGJvb2xlYW4ge1xuXHRjb25zdCBuZWdhdGVkRXhwcmVzc2lvbnMgPSBleHByZXNzaW9ucy5tYXAobm90KTtcblx0cmV0dXJuIGV4cHJlc3Npb25zLnNvbWUoKGV4cHJlc3Npb24sIGluZGV4KSA9PiB7XG5cdFx0Zm9yIChsZXQgaSA9IGluZGV4ICsgMTsgaSA8IG5lZ2F0ZWRFeHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwoZXhwcmVzc2lvbiwgbmVnYXRlZEV4cHJlc3Npb25zW2ldKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBMb2dpY2FsIGBhbmRgIGV4cHJlc3Npb24uXG4gKlxuICogVGhlIGV4cHJlc3Npb24gaXMgc2ltcGxpZmllZCB0byBmYWxzZSBpZiB0aGlzIGNhbiBiZSBkZWNpZGVkIHN0YXRpY2FsbHkgKHRoYXQgaXMsIGlmIG9uZSBvcGVyYW5kIGlzIGEgY29uc3RhbnRcbiAqIGZhbHNlIG9yIGlmIHRoZSBleHByZXNzaW9uIGNvbnRhaW5zIGFuIG9wZXJhbmQgYW5kIGl0cyBuZWdhdGlvbikuXG4gKlxuICogQHBhcmFtIG9wZXJhbmRzIEV4cHJlc3Npb25zIHRvIGNvbm5lY3QgYnkgYGFuZGBcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBFeHByZXNzaW9uIGV2YWx1YXRpbmcgdG8gYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kKC4uLm9wZXJhbmRzOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj5bXSk6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGZsYXR0ZW5TZXRFeHByZXNzaW9uKHtcblx0XHRfdHlwZTogXCJTZXRcIixcblx0XHRvcGVyYXRvcjogXCImJlwiLFxuXHRcdG9wZXJhbmRzOiBvcGVyYW5kcy5tYXAod3JhcFByaW1pdGl2ZSlcblx0fSkub3BlcmFuZHM7XG5cblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKC4uLmV4cHJlc3Npb25zKSkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRsZXQgaXNTdGF0aWNGYWxzZSA9IGZhbHNlO1xuXHRjb25zdCBub25Ucml2aWFsRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25zLmZpbHRlcihleHByZXNzaW9uID0+IHtcblx0XHRpZiAoaXNGYWxzZShleHByZXNzaW9uKSkge1xuXHRcdFx0aXNTdGF0aWNGYWxzZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAhaXNDb25zdGFudChleHByZXNzaW9uKTtcblx0fSk7XG5cdGlmIChpc1N0YXRpY0ZhbHNlKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0fSBlbHNlIGlmIChub25Ucml2aWFsRXhwcmVzc2lvbi5sZW5ndGggPT09IDApIHtcblx0XHQvLyBSZXNvbHZlIHRoZSBjb25zdGFudCB0aGVuXG5cdFx0Y29uc3QgaXNWYWxpZCA9IGV4cHJlc3Npb25zLnJlZHVjZSgocmVzdWx0LCBleHByZXNzaW9uKSA9PiByZXN1bHQgJiYgaXNUcnVlKGV4cHJlc3Npb24pLCB0cnVlKTtcblx0XHRyZXR1cm4gY29uc3RhbnQoaXNWYWxpZCk7XG5cdH0gZWxzZSBpZiAobm9uVHJpdmlhbEV4cHJlc3Npb24ubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIG5vblRyaXZpYWxFeHByZXNzaW9uWzBdO1xuXHR9IGVsc2UgaWYgKGhhc09wcG9zaXRlRXhwcmVzc2lvbnMobm9uVHJpdmlhbEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGZhbHNlKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0X3R5cGU6IFwiU2V0XCIsXG5cdFx0XHRvcGVyYXRvcjogXCImJlwiLFxuXHRcdFx0b3BlcmFuZHM6IG5vblRyaXZpYWxFeHByZXNzaW9uXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljYWwgYG9yYCBleHByZXNzaW9uLlxuICpcbiAqIFRoZSBleHByZXNzaW9uIGlzIHNpbXBsaWZpZWQgdG8gdHJ1ZSBpZiB0aGlzIGNhbiBiZSBkZWNpZGVkIHN0YXRpY2FsbHkgKHRoYXQgaXMsIGlmIG9uZSBvcGVyYW5kIGlzIGEgY29uc3RhbnRcbiAqIHRydWUgb3IgaWYgdGhlIGV4cHJlc3Npb24gY29udGFpbnMgYW4gb3BlcmFuZCBhbmQgaXRzIG5lZ2F0aW9uKS5cbiAqXG4gKiBAcGFyYW0gb3BlcmFuZHMgRXhwcmVzc2lvbnMgdG8gY29ubmVjdCBieSBgb3JgXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gRXhwcmVzc2lvbiBldmFsdWF0aW5nIHRvIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9yKC4uLm9wZXJhbmRzOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8Ym9vbGVhbj5bXSk6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGZsYXR0ZW5TZXRFeHByZXNzaW9uKHtcblx0XHRfdHlwZTogXCJTZXRcIixcblx0XHRvcGVyYXRvcjogXCJ8fFwiLFxuXHRcdG9wZXJhbmRzOiBvcGVyYW5kcy5tYXAod3JhcFByaW1pdGl2ZSlcblx0fSkub3BlcmFuZHM7XG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5leHByZXNzaW9ucykpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0bGV0IGlzU3RhdGljVHJ1ZSA9IGZhbHNlO1xuXHRjb25zdCBub25Ucml2aWFsRXhwcmVzc2lvbiA9IGV4cHJlc3Npb25zLmZpbHRlcihleHByZXNzaW9uID0+IHtcblx0XHRpZiAoaXNUcnVlKGV4cHJlc3Npb24pKSB7XG5cdFx0XHRpc1N0YXRpY1RydWUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gIWlzQ29uc3RhbnQoZXhwcmVzc2lvbikgfHwgZXhwcmVzc2lvbi52YWx1ZTtcblx0fSk7XG5cdGlmIChpc1N0YXRpY1RydWUpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQodHJ1ZSk7XG5cdH0gZWxzZSBpZiAobm9uVHJpdmlhbEV4cHJlc3Npb24ubGVuZ3RoID09PSAwKSB7XG5cdFx0Ly8gUmVzb2x2ZSB0aGUgY29uc3RhbnQgdGhlblxuXHRcdGNvbnN0IGlzVmFsaWQgPSBleHByZXNzaW9ucy5yZWR1Y2UoKHJlc3VsdCwgZXhwcmVzc2lvbikgPT4gcmVzdWx0ICYmIGlzVHJ1ZShleHByZXNzaW9uKSwgdHJ1ZSk7XG5cdFx0cmV0dXJuIGNvbnN0YW50KGlzVmFsaWQpO1xuXHR9IGVsc2UgaWYgKG5vblRyaXZpYWxFeHByZXNzaW9uLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBub25Ucml2aWFsRXhwcmVzc2lvblswXTtcblx0fSBlbHNlIGlmIChoYXNPcHBvc2l0ZUV4cHJlc3Npb25zKG5vblRyaXZpYWxFeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0X3R5cGU6IFwiU2V0XCIsXG5cdFx0XHRvcGVyYXRvcjogXCJ8fFwiLFxuXHRcdFx0b3BlcmFuZHM6IG5vblRyaXZpYWxFeHByZXNzaW9uXG5cdFx0fTtcblx0fVxufVxuXG4vKipcbiAqIExvZ2ljYWwgYG5vdGAgb3BlcmF0b3IuXG4gKlxuICogQHBhcmFtIG9wZXJhbmQgVGhlIGV4cHJlc3Npb24gdG8gcmV2ZXJzZVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IFRoZSByZXN1bHRpbmcgZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3Qob3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPGJvb2xlYW4+KTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdG9wZXJhbmQgPSB3cmFwUHJpbWl0aXZlKG9wZXJhbmQpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24ob3BlcmFuZCkpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH0gZWxzZSBpZiAoaXNDb25zdGFudChvcGVyYW5kKSkge1xuXHRcdHJldHVybiBjb25zdGFudCghb3BlcmFuZC52YWx1ZSk7XG5cdH0gZWxzZSBpZiAoXG5cdFx0dHlwZW9mIG9wZXJhbmQgPT09IFwib2JqZWN0XCIgJiZcblx0XHRvcGVyYW5kLl90eXBlID09PSBcIlNldFwiICYmXG5cdFx0b3BlcmFuZC5vcGVyYXRvciA9PT0gXCJ8fFwiICYmXG5cdFx0b3BlcmFuZC5vcGVyYW5kcy5ldmVyeShleHByZXNzaW9uID0+IGlzQ29uc3RhbnQoZXhwcmVzc2lvbikgfHwgaXNDb21wYXJpc29uKGV4cHJlc3Npb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gYW5kKC4uLm9wZXJhbmQub3BlcmFuZHMubWFwKGV4cHJlc3Npb24gPT4gbm90KGV4cHJlc3Npb24pKSk7XG5cdH0gZWxzZSBpZiAoXG5cdFx0dHlwZW9mIG9wZXJhbmQgPT09IFwib2JqZWN0XCIgJiZcblx0XHRvcGVyYW5kLl90eXBlID09PSBcIlNldFwiICYmXG5cdFx0b3BlcmFuZC5vcGVyYXRvciA9PT0gXCImJlwiICYmXG5cdFx0b3BlcmFuZC5vcGVyYW5kcy5ldmVyeShleHByZXNzaW9uID0+IGlzQ29uc3RhbnQoZXhwcmVzc2lvbikgfHwgaXNDb21wYXJpc29uKGV4cHJlc3Npb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gb3IoLi4ub3BlcmFuZC5vcGVyYW5kcy5tYXAoZXhwcmVzc2lvbiA9PiBub3QoZXhwcmVzc2lvbikpKTtcblx0fSBlbHNlIGlmIChpc0NvbXBhcmlzb24ob3BlcmFuZCkpIHtcblx0XHQvLyBDcmVhdGUgdGhlIHJldmVyc2UgY29tcGFyaXNvblxuXHRcdHN3aXRjaCAob3BlcmFuZC5vcGVyYXRvcikge1xuXHRcdFx0Y2FzZSBcIiE9PVwiOlxuXHRcdFx0XHRyZXR1cm4geyAuLi5vcGVyYW5kLCBvcGVyYXRvcjogXCI9PT1cIiB9O1xuXHRcdFx0Y2FzZSBcIjxcIjpcblx0XHRcdFx0cmV0dXJuIHsgLi4ub3BlcmFuZCwgb3BlcmF0b3I6IFwiPj1cIiB9O1xuXHRcdFx0Y2FzZSBcIjw9XCI6XG5cdFx0XHRcdHJldHVybiB7IC4uLm9wZXJhbmQsIG9wZXJhdG9yOiBcIj5cIiB9O1xuXHRcdFx0Y2FzZSBcIj09PVwiOlxuXHRcdFx0XHRyZXR1cm4geyAuLi5vcGVyYW5kLCBvcGVyYXRvcjogXCIhPT1cIiB9O1xuXHRcdFx0Y2FzZSBcIj5cIjpcblx0XHRcdFx0cmV0dXJuIHsgLi4ub3BlcmFuZCwgb3BlcmF0b3I6IFwiPD1cIiB9O1xuXHRcdFx0Y2FzZSBcIj49XCI6XG5cdFx0XHRcdHJldHVybiB7IC4uLm9wZXJhbmQsIG9wZXJhdG9yOiBcIjxcIiB9O1xuXHRcdH1cblx0fSBlbHNlIGlmIChvcGVyYW5kLl90eXBlID09PSBcIk5vdFwiKSB7XG5cdFx0cmV0dXJuIG9wZXJhbmQub3BlcmFuZDtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiTm90XCIsXG5cdFx0b3BlcmFuZDogb3BlcmFuZFxuXHR9O1xufVxuXG4vKipcbiAqIEV2YWx1YXRlcyB3aGV0aGVyIGEgYmluZGluZyBleHByZXNzaW9uIGlzIGVxdWFsIHRvIHRydWUgd2l0aCBhIGxvb3NlIGVxdWFsaXR5LlxuICpcbiAqIEBwYXJhbSBvcGVyYW5kIFRoZSBleHByZXNzaW9uIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gVGhlIHJlc3VsdGluZyBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJ1dGh5KG9wZXJhbmQ6IEV4cHJlc3Npb248c3RyaW5nPik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRpZiAoaXNDb25zdGFudChvcGVyYW5kKSkge1xuXHRcdHJldHVybiBjb25zdGFudCghIW9wZXJhbmQudmFsdWUpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRfdHlwZTogXCJUcnV0aHlcIixcblx0XHRcdG9wZXJhbmQ6IG9wZXJhbmRcblx0XHR9O1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJpbmRpbmcgZXhwcmVzc2lvbiB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIG1vZGVsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUYXJnZXRUeXBlXG4gKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBvbiB0aGUgbW9kZWxcbiAqIEBwYXJhbSBbbW9kZWxOYW1lXSBUaGUgbmFtZSBvZiB0aGUgbW9kZWxcbiAqIEBwYXJhbSBbdmlzaXRlZE5hdmlnYXRpb25QYXRoc10gVGhlIHBhdGhzIGZyb20gdGhlIHJvb3QgZW50aXR5U2V0XG4gKiBAcGFyYW0gW3BhdGhWaXNpdG9yXSBBIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgcmVzdWx0aW5nIHBhdGhcbiAqIEByZXR1cm5zIHtCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VGFyZ2V0VHlwZT59IFRoZSBkZWZhdWx0IGJpbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZGluZ0V4cHJlc3Npb248VGFyZ2V0VHlwZSBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1vZGVsTmFtZT86IHN0cmluZyxcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvblxuKTogQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFRhcmdldFR5cGU+IHwgVW5yZXNvbHZlYWJsZUJpbmRpbmdFeHByZXNzaW9uIHtcblx0aWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0fVxuXHRsZXQgdGFyZ2V0UGF0aDtcblx0aWYgKHBhdGhWaXNpdG9yKSB7XG5cdFx0dGFyZ2V0UGF0aCA9IHBhdGhWaXNpdG9yKHBhdGgpO1xuXHRcdGlmICh0YXJnZXRQYXRoID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bnJlc29sdmVhYmxlRXhwcmVzc2lvbjtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgbG9jYWxQYXRoID0gdmlzaXRlZE5hdmlnYXRpb25QYXRocy5jb25jYXQoKTtcblx0XHRsb2NhbFBhdGgucHVzaChwYXRoKTtcblx0XHR0YXJnZXRQYXRoID0gbG9jYWxQYXRoLmpvaW4oXCIvXCIpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiQmluZGluZ1wiLFxuXHRcdG1vZGVsTmFtZTogbW9kZWxOYW1lLFxuXHRcdHBhdGg6IHRhcmdldFBhdGhcblx0fTtcbn1cblxudHlwZSBQbGFpbkV4cHJlc3Npb25PYmplY3QgPSB7IFtpbmRleDogc3RyaW5nXTogRXhwcmVzc2lvbjxhbnk+IH07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbnN0YW50IGV4cHJlc3Npb24gYmFzZWQgb24gYSBwcmltaXRpdmUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgY29uc3RhbnQgdG8gd3JhcCBpbiBhbiBleHByZXNzaW9uXG4gKiBAcmV0dXJucyB7Q29uc3RhbnRFeHByZXNzaW9uPFQ+fSBUaGUgY29uc3RhbnQgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3RhbnQ8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KHZhbHVlOiBUKTogQ29uc3RhbnRFeHByZXNzaW9uPFQ+IHtcblx0bGV0IGNvbnN0YW50VmFsdWU6IFQ7XG5cblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRjb25zdGFudFZhbHVlID0gdmFsdWUubWFwKHdyYXBQcmltaXRpdmUpIGFzIFQ7XG5cdFx0fSBlbHNlIGlmIChpc1ByaW1pdGl2ZU9iamVjdCh2YWx1ZSkpIHtcblx0XHRcdGNvbnN0YW50VmFsdWUgPSB2YWx1ZS52YWx1ZU9mKCkgYXMgVDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3RhbnRWYWx1ZSA9IE9iamVjdC5lbnRyaWVzKHZhbHVlKS5yZWR1Y2UoKHBsYWluRXhwcmVzc2lvbiwgW2tleSwgdmFsXSkgPT4ge1xuXHRcdFx0XHRjb25zdCB3cmFwcGVkVmFsdWUgPSB3cmFwUHJpbWl0aXZlKHZhbCk7XG5cdFx0XHRcdGlmICh3cmFwcGVkVmFsdWUuX3R5cGUgIT09IFwiQ29uc3RhbnRcIiB8fCB3cmFwcGVkVmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHBsYWluRXhwcmVzc2lvbltrZXldID0gd3JhcHBlZFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBwbGFpbkV4cHJlc3Npb247XG5cdFx0XHR9LCB7fSBhcyBQbGFpbkV4cHJlc3Npb25PYmplY3QpIGFzIFQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbnN0YW50VmFsdWUgPSB2YWx1ZTtcblx0fVxuXG5cdHJldHVybiB7IF90eXBlOiBcIkNvbnN0YW50XCIsIHZhbHVlOiBjb25zdGFudFZhbHVlIH07XG59XG5cbnR5cGUgRXZhbHVhdGlvblR5cGUgPSBcImJvb2xlYW5cIjtcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQmluZGluZ1N0cmluZzxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyLFxuXHR0YXJnZXRUeXBlPzogRXZhbHVhdGlvblR5cGVcbik6IENvbnN0YW50RXhwcmVzc2lvbjxUPiB8IEVtYmVkZGVkQmluZGluZ0V4cHJlc3Npb248VD4gfCBFbWJlZGRlZEV4cHJlc3Npb25CaW5kaW5nRXhwcmVzc2lvbjxUPiB7XG5cdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5zdGFydHNXaXRoKFwie1wiKSkge1xuXHRcdGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiez1cIikpIHtcblx0XHRcdC8vIEV4cHJlc3Npb24gYmluZGluZywgd2UgY2FuIGp1c3QgcmVtb3ZlIHRoZSBvdXRlciBiaW5kaW5nIHRoaW5nc1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0X3R5cGU6IFwiRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ1wiLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdF90eXBlOiBcIkVtYmVkZGVkQmluZGluZ1wiLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHRhcmdldFR5cGUgPT09IFwiYm9vbGVhblwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAodmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSBcImZhbHNlXCIpKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHZhbHVlID09PSBcInRydWVcIikgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb25zdGFudCh2YWx1ZSkgYXMgQ29uc3RhbnRFeHByZXNzaW9uPFQ+O1xuXHR9XG59XG5cbi8qKlxuICogQSBuYW1lZCByZWZlcmVuY2UuXG4gKlxuICogQHNlZSBmblxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgUmVmZXJlbmNlXG4gKiBAcmV0dXJucyB7UmVmZXJlbmNlRXhwcmVzc2lvbn0gVGhlIG9iamVjdCByZWZlcmVuY2UgYmluZGluZyBwYXJ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWYocmVmZXJlbmNlOiBzdHJpbmcgfCBudWxsKTogUmVmZXJlbmNlRXhwcmVzc2lvbiB7XG5cdHJldHVybiB7IF90eXBlOiBcIlJlZlwiLCByZWY6IHJlZmVyZW5jZSB9O1xufVxuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRoZSB0eXBlIGlzIGFuIGV4cHJlc3Npb24uXG4gKlxuICogRXZlcnkgb2JqZWN0IGhhdmluZyBhIHByb3BlcnR5IG5hbWVkIGBfdHlwZWAgb2Ygc29tZSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFuIGV4cHJlc3Npb24sIGV2ZW4gaWYgdGhlcmUgaXMgYWN0dWFsbHlcbiAqIG5vIHN1Y2ggZXhwcmVzc2lvbiB0eXBlIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0gc29tZXRoaW5nIFR5cGUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHR5cGUgaXMgY29uc2lkZXJlZCB0byBiZSBhbiBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGlzRXhwcmVzc2lvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oc29tZXRoaW5nOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBzb21ldGhpbmcgaXMgRXhwcmVzc2lvbjxUPiB7XG5cdHJldHVybiBzb21ldGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHNvbWV0aGluZyA9PT0gXCJvYmplY3RcIiAmJiAoc29tZXRoaW5nIGFzIEJhc2VFeHByZXNzaW9uPFQ+KS5fdHlwZSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdyYXAgYSBwcmltaXRpdmUgaW50byBhIGNvbnN0YW50IGV4cHJlc3Npb24gaWYgaXQgaXMgbm90IGFscmVhZHkgYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHNvbWV0aGluZyBUaGUgb2JqZWN0IHRvIHdyYXAgaW4gYSBDb25zdGFudCBleHByZXNzaW9uXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gRWl0aGVyIHRoZSBvcmlnaW5hbCBvYmplY3Qgb3IgdGhlIHdyYXBwZWQgb25lIGRlcGVuZGluZyBvbiB0aGUgY2FzZVxuICovXG5mdW5jdGlvbiB3cmFwUHJpbWl0aXZlPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihzb21ldGhpbmc6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPik6IEV4cHJlc3Npb248VD4ge1xuXHRpZiAoaXNFeHByZXNzaW9uKHNvbWV0aGluZykpIHtcblx0XHRyZXR1cm4gc29tZXRoaW5nO1xuXHR9XG5cblx0cmV0dXJuIGNvbnN0YW50KHNvbWV0aGluZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBleHByZXNzaW9uIG9yIHZhbHVlIHByb3ZpZGVkIGlzIGNvbnN0YW50IG9yIG5vdC5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSAgbWF5YmVDb25zdGFudCBUaGUgZXhwcmVzc2lvbiBvciBwcmltaXRpdmUgdmFsdWUgdGhhdCBpcyB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGl0IGlzIGNvbnN0YW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnN0YW50PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihtYXliZUNvbnN0YW50OiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBtYXliZUNvbnN0YW50IGlzIENvbnN0YW50RXhwcmVzc2lvbjxUPiB7XG5cdHJldHVybiB0eXBlb2YgbWF5YmVDb25zdGFudCAhPT0gXCJvYmplY3RcIiB8fCAobWF5YmVDb25zdGFudCBhcyBCYXNlRXhwcmVzc2lvbjxUPikuX3R5cGUgPT09IFwiQ29uc3RhbnRcIjtcbn1cblxuZnVuY3Rpb24gaXNUcnVlKGV4cHJlc3Npb246IEV4cHJlc3Npb248UHJpbWl0aXZlVHlwZT4pIHtcblx0cmV0dXJuIGlzQ29uc3RhbnQoZXhwcmVzc2lvbikgJiYgZXhwcmVzc2lvbi52YWx1ZSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNGYWxzZShleHByZXNzaW9uOiBFeHByZXNzaW9uPFByaW1pdGl2ZVR5cGU+KSB7XG5cdHJldHVybiBpc0NvbnN0YW50KGV4cHJlc3Npb24pICYmIGV4cHJlc3Npb24udmFsdWUgPT09IGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZXhwcmVzc2lvbiBvciB2YWx1ZSBwcm92aWRlZCBpcyBiaW5kaW5nIG9yIG5vdC5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSAgbWF5YmVCaW5kaW5nIFRoZSBleHByZXNzaW9uIG9yIHByaW1pdGl2ZSB2YWx1ZSB0aGF0IGlzIHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgaXQgaXMgYmluZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCaW5kaW5nPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihtYXliZUJpbmRpbmc6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPik6IG1heWJlQmluZGluZyBpcyBCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4ge1xuXHRyZXR1cm4gdHlwZW9mIG1heWJlQmluZGluZyA9PT0gXCJvYmplY3RcIiAmJiAobWF5YmVCaW5kaW5nIGFzIEJhc2VFeHByZXNzaW9uPFQ+KS5fdHlwZSA9PT0gXCJCaW5kaW5nXCI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBleHByZXNzaW9uIHByb3ZpZGVkIGlzIGEgY29tcGFyaXNvbiBvciBub3QuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvblxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXhwcmVzc2lvbiBpcyBhIENvbXBhcmlzb25FeHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGlzQ29tcGFyaXNvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxUPik6IGV4cHJlc3Npb24gaXMgQ29tcGFyaXNvbkV4cHJlc3Npb24ge1xuXHRyZXR1cm4gZXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJDb21wYXJpc29uXCI7XG59XG5cbnR5cGUgQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uPFA+ID1cblx0fCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBBcHBseUFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgSWZBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IE9yQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBBbmRBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IE5lQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBFcUFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgTm90QW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBHdEFubm90YXRpb25FeHByZXNzaW9uPFA+XG5cdHwgR2VBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPlxuXHR8IExlQW5ub3RhdGlvbkV4cHJlc3Npb248UD5cblx0fCBMdEFubm90YXRpb25FeHByZXNzaW9uPFA+O1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZU9iamVjdChvYmplY3RUeXBlOiBvYmplY3QpOiBib29sZWFuIHtcblx0c3dpdGNoIChvYmplY3RUeXBlLmNvbnN0cnVjdG9yLm5hbWUpIHtcblx0XHRjYXNlIFwiU3RyaW5nXCI6XG5cdFx0Y2FzZSBcIk51bWJlclwiOlxuXHRcdGNhc2UgXCJCb29sZWFuXCI6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG4vKipcbiAqIENoZWNrIGlmIHRoZSBwYXNzZWQgYW5ub3RhdGlvbiBhbm5vdGF0aW9uVmFsdWUgaXMgYSBDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb24uXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gIGFubm90YXRpb25WYWx1ZSBUaGUgYW5ub3RhdGlvbiBhbm5vdGF0aW9uVmFsdWUgdG8gZXZhbHVhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBpcyBhIHtDb21wbGV4QW5ub3RhdGlvbkV4cHJlc3Npb259XG4gKi9cbmZ1bmN0aW9uIGlzQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uPFQ+KGFubm90YXRpb25WYWx1ZTogUHJvcGVydHlBbm5vdGF0aW9uVmFsdWU8VD4pOiBhbm5vdGF0aW9uVmFsdWUgaXMgQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIHR5cGVvZiBhbm5vdGF0aW9uVmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIWlzUHJpbWl0aXZlT2JqZWN0KGFubm90YXRpb25WYWx1ZSBhcyBvYmplY3QpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIGFubm90YXRpb25WYWx1ZSBmb3IgYSBnaXZlbiBhbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBhbm5vdGF0aW9uVmFsdWUgVGhlIHNvdXJjZSBhbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZVxuICogQHBhcmFtIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMgVGhlIHBhdGggZnJvbSB0aGUgcm9vdCBlbnRpdHkgc2V0XG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIERlZmF1bHQgdmFsdWUgaWYgdGhlIGFubm90YXRpb25WYWx1ZSBpcyB1bmRlZmluZWRcbiAqIEBwYXJhbSBwYXRoVmlzaXRvciBBIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgcmVzdWx0aW5nIHBhdGhcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPFQ+fSBUaGUgYW5ub3RhdGlvblZhbHVlIGVxdWl2YWxlbnQgdG8gdGhhdCBhbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5ub3RhdGlvbkV4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRhbm5vdGF0aW9uVmFsdWU6IFByb3BlcnR5QW5ub3RhdGlvblZhbHVlPFQ+LFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuXHRkZWZhdWx0VmFsdWU/OiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IEV4cHJlc3Npb248VD4ge1xuXHRpZiAoYW5ub3RhdGlvblZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gd3JhcFByaW1pdGl2ZShkZWZhdWx0VmFsdWUgYXMgVCk7XG5cdH1cblxuXHRpZiAoIWlzQ29tcGxleEFubm90YXRpb25FeHByZXNzaW9uKGFubm90YXRpb25WYWx1ZSkpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoYW5ub3RhdGlvblZhbHVlKTtcblx0fVxuXG5cdHN3aXRjaCAoYW5ub3RhdGlvblZhbHVlLnR5cGUpIHtcblx0XHRjYXNlIFwiUGF0aFwiOlxuXHRcdFx0cmV0dXJuIGJpbmRpbmdFeHByZXNzaW9uKGFubm90YXRpb25WYWx1ZS5wYXRoLCB1bmRlZmluZWQsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRjYXNlIFwiSWZcIjpcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uSWZFeHByZXNzaW9uKGFubm90YXRpb25WYWx1ZS5JZiwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRcdHJldHVybiBub3QocGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5Ob3QsIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiRXFcIjpcblx0XHRcdHJldHVybiBlcXVhbChcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5FcVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkVxWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiTmVcIjpcblx0XHRcdHJldHVybiBub3RFcXVhbChcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5OZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLk5lWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiR3RcIjpcblx0XHRcdHJldHVybiBncmVhdGVyVGhhbihcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5HdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkd0WzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiR2VcIjpcblx0XHRcdHJldHVybiBncmVhdGVyT3JFcXVhbChcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5HZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkdlWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiTHRcIjpcblx0XHRcdHJldHVybiBsZXNzVGhhbihcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5MdFswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkx0WzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiTGVcIjpcblx0XHRcdHJldHVybiBsZXNzT3JFcXVhbChcblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZS5MZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlLkxlWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiT3JcIjpcblx0XHRcdHJldHVybiBvcihcblx0XHRcdFx0Li4uKGFubm90YXRpb25WYWx1ZS5Pci5tYXAoZnVuY3Rpb24ob3JDb25kaXRpb24pIHtcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKG9yQ29uZGl0aW9uLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0XHRcdH0pIGFzIEV4cHJlc3Npb248Ym9vbGVhbj5bXSlcblx0XHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRjYXNlIFwiQW5kXCI6XG5cdFx0XHRyZXR1cm4gYW5kKFxuXHRcdFx0XHQuLi4oYW5ub3RhdGlvblZhbHVlLkFuZC5tYXAoZnVuY3Rpb24oYW5kQ29uZGl0aW9uKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbihhbmRDb25kaXRpb24sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKTtcblx0XHRcdFx0fSkgYXMgRXhwcmVzc2lvbjxib29sZWFuPltdKVxuXHRcdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHRcdGNhc2UgXCJBcHBseVwiOlxuXHRcdFx0cmV0dXJuIGFubm90YXRpb25BcHBseUV4cHJlc3Npb24oXG5cdFx0XHRcdGFubm90YXRpb25WYWx1ZSBhcyBBcHBseUFubm90YXRpb25FeHByZXNzaW9uPHN0cmluZz4sXG5cdFx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHRcdHBhdGhWaXNpdG9yXG5cdFx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBhbm5vdGF0aW9uIGNvbmRpdGlvbiBpbnRvIGFuIGV4cHJlc3Npb24uXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gYW5ub3RhdGlvblZhbHVlIFRoZSBjb25kaXRpb24gb3IgdmFsdWUgZnJvbSB0aGUgYW5ub3RhdGlvblxuICogQHBhcmFtIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMgVGhlIHBhdGggZnJvbSB0aGUgcm9vdCBlbnRpdHkgc2V0XG4gKiBAcGFyYW0gcGF0aFZpc2l0b3IgQSBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIHJlc3VsdGluZyBwYXRoXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gQW4gZXF1aXZhbGVudCBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGFubm90YXRpb25WYWx1ZTogQ29uZGl0aW9uYWxDaGVja09yVmFsdWUsXG5cdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHM6IHN0cmluZ1tdID0gW10sXG5cdHBhdGhWaXNpdG9yPzogRnVuY3Rpb25cbik6IEV4cHJlc3Npb248VD4ge1xuXHRpZiAoYW5ub3RhdGlvblZhbHVlID09PSBudWxsIHx8IHR5cGVvZiBhbm5vdGF0aW9uVmFsdWUgIT09IFwib2JqZWN0XCIpIHtcblx0XHRyZXR1cm4gY29uc3RhbnQoYW5ub3RhdGlvblZhbHVlIGFzIFQpO1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRPclwiKSkge1xuXHRcdHJldHVybiBvcihcblx0XHRcdC4uLigoKGFubm90YXRpb25WYWx1ZSBhcyBPckNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJE9yLm1hcChmdW5jdGlvbihvckNvbmRpdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gcGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKG9yQ29uZGl0aW9uLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0XHR9KSBhcyB1bmtub3duKSBhcyBFeHByZXNzaW9uPGJvb2xlYW4+W10pXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRBbmRcIikpIHtcblx0XHRyZXR1cm4gYW5kKFxuXHRcdFx0Li4uKCgoYW5ub3RhdGlvblZhbHVlIGFzIEFuZENvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEFuZC5tYXAoZnVuY3Rpb24oYW5kQ29uZGl0aW9uKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5kQ29uZGl0aW9uLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcik7XG5cdFx0XHR9KSBhcyB1bmtub3duKSBhcyBFeHByZXNzaW9uPGJvb2xlYW4+W10pXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiROb3RcIikpIHtcblx0XHRyZXR1cm4gbm90KFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgTm90Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTm90WzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEVxXCIpKSB7XG5cdFx0cmV0dXJuIGVxdWFsKFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgRXFDb25kaXRpb25hbEV4cHJlc3Npb24pLiRFcVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgRXFDb25kaXRpb25hbEV4cHJlc3Npb24pLiRFcVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiROZVwiKSkge1xuXHRcdHJldHVybiBub3RFcXVhbChcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIE5lQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTmVbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIE5lQ29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTmVbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkR3RcIikpIHtcblx0XHRyZXR1cm4gZ3JlYXRlclRoYW4oXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBHdENvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEd0WzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBHdENvbmRpdGlvbmFsRXhwcmVzc2lvbikuJEd0WzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJEdlXCIpKSB7XG5cdFx0cmV0dXJuIGdyZWF0ZXJPckVxdWFsKFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgR2VDb25kaXRpb25hbEV4cHJlc3Npb24pLiRHZVswXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpLFxuXHRcdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKChhbm5vdGF0aW9uVmFsdWUgYXMgR2VDb25kaXRpb25hbEV4cHJlc3Npb24pLiRHZVsxXSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdFx0KSBhcyBFeHByZXNzaW9uPFQ+O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRMdFwiKSkge1xuXHRcdHJldHVybiBsZXNzVGhhbihcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEx0Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTHRbMF0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRcdHBhcnNlQW5ub3RhdGlvbkNvbmRpdGlvbigoYW5ub3RhdGlvblZhbHVlIGFzIEx0Q29uZGl0aW9uYWxFeHByZXNzaW9uKS4kTHRbMV0sIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKVxuXHRcdCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUuaGFzT3duUHJvcGVydHkoXCIkTGVcIikpIHtcblx0XHRyZXR1cm4gbGVzc09yRXF1YWwoXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBMZUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJExlWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oKGFubm90YXRpb25WYWx1ZSBhcyBMZUNvbmRpdGlvbmFsRXhwcmVzc2lvbikuJExlWzFdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvcilcblx0XHQpIGFzIEV4cHJlc3Npb248VD47XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJFBhdGhcIikpIHtcblx0XHRyZXR1cm4gYmluZGluZ0V4cHJlc3Npb24oKGFubm90YXRpb25WYWx1ZSBhcyBQYXRoQ29uZGl0aW9uRXhwcmVzc2lvbjxUPikuJFBhdGgsIHVuZGVmaW5lZCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpO1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdHJldHVybiBhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogXCJBcHBseVwiLFxuXHRcdFx0XHRGdW5jdGlvbjogKGFubm90YXRpb25WYWx1ZSBhcyBhbnkpLiRGdW5jdGlvbixcblx0XHRcdFx0QXBwbHk6IChhbm5vdGF0aW9uVmFsdWUgYXMgYW55KS4kQXBwbHlcblx0XHRcdH0gYXMgVCxcblx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRwYXRoVmlzaXRvclxuXHRcdCk7XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvblZhbHVlLmhhc093blByb3BlcnR5KFwiJElmXCIpKSB7XG5cdFx0cmV0dXJuIGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiBcIklmXCIsXG5cdFx0XHRcdElmOiAoYW5ub3RhdGlvblZhbHVlIGFzIGFueSkuJElmXG5cdFx0XHR9IGFzIFQsXG5cdFx0XHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0cGF0aFZpc2l0b3Jcblx0XHQpO1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIiRFbnVtTWVtYmVyXCIpKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHJlc29sdmVFbnVtVmFsdWUoKGFubm90YXRpb25WYWx1ZSBhcyBhbnkpLiRFbnVtTWVtYmVyKSBhcyBUKTtcblx0fVxuXHRyZXR1cm4gY29uc3RhbnQoZmFsc2UgYXMgVCk7XG59XG5cbi8qKlxuICogUHJvY2VzcyB0aGUge0lmQW5ub3RhdGlvbkV4cHJlc3Npb25WYWx1ZX0gaW50byBhbiBleHByZXNzaW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGFubm90YXRpb25WYWx1ZSBBbiBJZiBleHByZXNzaW9uIHJldHVybmluZyB0aGUgdHlwZSBUXG4gKiBAcGFyYW0gdmlzaXRlZE5hdmlnYXRpb25QYXRocyBUaGUgcGF0aCBmcm9tIHRoZSByb290IGVudGl0eSBzZXRcbiAqIEBwYXJhbSBwYXRoVmlzaXRvciBBIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgcmVzdWx0aW5nIHBhdGhcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPFQ+fSBUaGUgZXF1aXZhbGVudCBpZkVsc2UgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5ub3RhdGlvbklmRXhwcmVzc2lvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGFubm90YXRpb25WYWx1ZTogSWZBbm5vdGF0aW9uRXhwcmVzc2lvblZhbHVlPFQ+LFxuXHR2aXNpdGVkTmF2aWdhdGlvblBhdGhzOiBzdHJpbmdbXSA9IFtdLFxuXHRwYXRoVmlzaXRvcj86IEZ1bmN0aW9uXG4pOiBFeHByZXNzaW9uPFQ+IHtcblx0cmV0dXJuIGlmRWxzZShcblx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlWzBdLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCBwYXRoVmlzaXRvciksXG5cdFx0cGFyc2VBbm5vdGF0aW9uQ29uZGl0aW9uKGFubm90YXRpb25WYWx1ZVsxXSBhcyBhbnksIHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsIHBhdGhWaXNpdG9yKSxcblx0XHRwYXJzZUFubm90YXRpb25Db25kaXRpb24oYW5ub3RhdGlvblZhbHVlWzJdIGFzIGFueSwgdmlzaXRlZE5hdmlnYXRpb25QYXRocywgcGF0aFZpc2l0b3IpXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0aW9uQXBwbHlFeHByZXNzaW9uKFxuXHRhcHBseUV4cHJlc3Npb246IEFwcGx5QW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPixcblx0dmlzaXRlZE5hdmlnYXRpb25QYXRoczogc3RyaW5nW10gPSBbXSxcblx0cGF0aFZpc2l0b3I/OiBGdW5jdGlvblxuKTogRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0c3dpdGNoIChhcHBseUV4cHJlc3Npb24uRnVuY3Rpb24pIHtcblx0XHRjYXNlIFwib2RhdGEuY29uY2F0XCI6XG5cdFx0XHRyZXR1cm4gY29uY2F0KFxuXHRcdFx0XHQuLi5hcHBseUV4cHJlc3Npb24uQXBwbHkubWFwKChhcHBseVBhcmFtOiBhbnkpID0+IHtcblx0XHRcdFx0XHRsZXQgYXBwbHlQYXJhbUNvbnZlcnRlZCA9IGFwcGx5UGFyYW07XG5cdFx0XHRcdFx0aWYgKGFwcGx5UGFyYW0uaGFzT3duUHJvcGVydHkoXCIkUGF0aFwiKSkge1xuXHRcdFx0XHRcdFx0YXBwbHlQYXJhbUNvbnZlcnRlZCA9IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJQYXRoXCIsXG5cdFx0XHRcdFx0XHRcdHBhdGg6IGFwcGx5UGFyYW0uJFBhdGhcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhcHBseVBhcmFtLmhhc093blByb3BlcnR5KFwiJElmXCIpKSB7XG5cdFx0XHRcdFx0XHRhcHBseVBhcmFtQ29udmVydGVkID0ge1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBcIklmXCIsXG5cdFx0XHRcdFx0XHRcdElmOiBhcHBseVBhcmFtLiRJZlxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFwcGx5UGFyYW0uaGFzT3duUHJvcGVydHkoXCIkQXBwbHlcIikpIHtcblx0XHRcdFx0XHRcdGFwcGx5UGFyYW1Db252ZXJ0ZWQgPSB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiQXBwbHlcIixcblx0XHRcdFx0XHRcdFx0RnVuY3Rpb246IGFwcGx5UGFyYW0uJEZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRBcHBseTogYXBwbHlQYXJhbS4kQXBwbHlcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uRXhwcmVzc2lvbihhcHBseVBhcmFtQ29udmVydGVkLCB2aXNpdGVkTmF2aWdhdGlvblBhdGhzLCB1bmRlZmluZWQsIHBhdGhWaXNpdG9yKTtcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdH1cblx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xufVxuXG4vKipcbiAqIEdlbmVyaWMgaGVscGVyIGZvciB0aGUgY29tcGFyaXNvbiBvcGVyYXRpb25zIChlcXVhbCwgbm90RXF1YWwsIC4uLikuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gb3BlcmF0b3IgVGhlIG9wZXJhdG9yIHRvIGFwcGx5XG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgb3BlcmF0b3JcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIG9wZXJhdG9yXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZnVuY3Rpb24gY29tcGFyaXNvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgbGVmdEV4cHJlc3Npb24gPSB3cmFwUHJpbWl0aXZlKGxlZnRPcGVyYW5kKTtcblx0Y29uc3QgcmlnaHRFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShyaWdodE9wZXJhbmQpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24obGVmdEV4cHJlc3Npb24sIHJpZ2h0RXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0aWYgKGlzQ29uc3RhbnQobGVmdEV4cHJlc3Npb24pICYmIGlzQ29uc3RhbnQocmlnaHRFeHByZXNzaW9uKSkge1xuXHRcdHN3aXRjaCAob3BlcmF0b3IpIHtcblx0XHRcdGNhc2UgXCIhPT1cIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlICE9PSByaWdodEV4cHJlc3Npb24udmFsdWUpO1xuXHRcdFx0Y2FzZSBcIjxcIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlIDwgcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI8PVwiOlxuXHRcdFx0XHRyZXR1cm4gY29uc3RhbnQobGVmdEV4cHJlc3Npb24udmFsdWUgPD0gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHRcdGNhc2UgXCI+XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA+IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0XHRjYXNlIFwiPj1cIjpcblx0XHRcdFx0cmV0dXJuIGNvbnN0YW50KGxlZnRFeHByZXNzaW9uLnZhbHVlID49IHJpZ2h0RXhwcmVzc2lvbi52YWx1ZSk7XG5cdFx0XHRjYXNlIFwiPT09XCI6XG5cdFx0XHRcdHJldHVybiBjb25zdGFudChsZWZ0RXhwcmVzc2lvbi52YWx1ZSA9PT0gcmlnaHRFeHByZXNzaW9uLnZhbHVlKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdF90eXBlOiBcIkNvbXBhcmlzb25cIixcblx0XHRcdG9wZXJhdG9yOiBvcGVyYXRvcixcblx0XHRcdG9wZXJhbmQxOiBsZWZ0RXhwcmVzc2lvbixcblx0XHRcdG9wZXJhbmQyOiByaWdodEV4cHJlc3Npb25cblx0XHR9O1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoZXhwcmVzc2lvbjogQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPGFueT4gfCBVbnJlc29sdmVhYmxlQmluZGluZ0V4cHJlc3Npb24pOiBFeHByZXNzaW9uPG51bWJlcj4ge1xuXHRpZiAoZXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJVbnJlc29sdmVhYmxlXCIpIHtcblx0XHRyZXR1cm4gZXhwcmVzc2lvbjtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIkxlbmd0aFwiLFxuXHRcdGJpbmRpbmdFeHByZXNzaW9uOiBleHByZXNzaW9uXG5cdH07XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJlcXVhbFwiICg9PT0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWw8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGxlZnRFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShsZWZ0T3BlcmFuZCk7XG5cdGNvbnN0IHJpZ2h0RXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUocmlnaHRPcGVyYW5kKTtcblx0aWYgKGhhc1VucmVzb2x2ZWFibGVFeHByZXNzaW9uKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcmVkdWNlKGxlZnQ6IEV4cHJlc3Npb248VD4sIHJpZ2h0OiBFeHByZXNzaW9uPFQ+KSB7XG5cdFx0aWYgKGxlZnQuX3R5cGUgPT09IFwiQ29tcGFyaXNvblwiICYmIGlzVHJ1ZShyaWdodCkpIHtcblx0XHRcdC8vIGNvbXBhcmUoYSwgYikgPT09IHRydWUgfn4+IGNvbXBhcmUoYSwgYilcblx0XHRcdHJldHVybiBsZWZ0O1xuXHRcdH0gZWxzZSBpZiAobGVmdC5fdHlwZSA9PT0gXCJDb21wYXJpc29uXCIgJiYgaXNGYWxzZShyaWdodCkpIHtcblx0XHRcdC8vIGNvbXBhcmUoYSwgYikgPT09IGZhbHNlIH5+PiAhY29tcGFyZShhLCBiKVxuXHRcdFx0cmV0dXJuIG5vdChsZWZ0KTtcblx0XHR9IGVsc2UgaWYgKGxlZnQuX3R5cGUgPT09IFwiSWZFbHNlXCIgJiYgX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChsZWZ0Lm9uVHJ1ZSwgcmlnaHQpKSB7XG5cdFx0XHQvLyAoaWYgKHgpIHsgYSB9IGVsc2UgeyBiIH0pID09PSBhIH5+PiB4IHx8IChiID09PSBhKVxuXHRcdFx0cmV0dXJuIG9yKGxlZnQuY29uZGl0aW9uLCBlcXVhbChsZWZ0Lm9uRmFsc2UsIHJpZ2h0KSk7XG5cdFx0fSBlbHNlIGlmIChsZWZ0Ll90eXBlID09PSBcIklmRWxzZVwiICYmIF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdC5vbkZhbHNlLCByaWdodCkpIHtcblx0XHRcdC8vIChpZiAoeCkgeyBhIH0gZWxzZSB7IGIgfSkgPT09IGIgfn4+ICF4IHx8IChhID09PSBiKVxuXHRcdFx0cmV0dXJuIG9yKG5vdChsZWZ0LmNvbmRpdGlvbiksIGVxdWFsKGxlZnQub25UcnVlLCByaWdodCkpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRsZWZ0Ll90eXBlID09PSBcIklmRWxzZVwiICYmXG5cdFx0XHRpc0NvbnN0YW50KGxlZnQub25UcnVlKSAmJlxuXHRcdFx0aXNDb25zdGFudChsZWZ0Lm9uRmFsc2UpICYmXG5cdFx0XHRpc0NvbnN0YW50KHJpZ2h0KSAmJlxuXHRcdFx0IV9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdC5vblRydWUsIHJpZ2h0KSAmJlxuXHRcdFx0IV9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwobGVmdC5vbkZhbHNlLCByaWdodClcblx0XHQpIHtcblx0XHRcdHJldHVybiBjb25zdGFudChmYWxzZSk7XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBleHBsb2l0IHN5bW1ldHJ5OiBhID09PSBiIDx+PiBiID09PSBhXG5cdGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UobGVmdEV4cHJlc3Npb24sIHJpZ2h0RXhwcmVzc2lvbikgPz8gcmVkdWNlKHJpZ2h0RXhwcmVzc2lvbiwgbGVmdEV4cHJlc3Npb24pO1xuXHRyZXR1cm4gcmVkdWNlZCA/PyBjb21wYXJpc29uKFwiPT09XCIsIGxlZnRFeHByZXNzaW9uLCByaWdodEV4cHJlc3Npb24pO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb246IFwibm90IGVxdWFsXCIgKCE9PSkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZVxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY29tcGFyaXNvblxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3RFcXVhbDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIG5vdChlcXVhbChsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKSk7XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJncmVhdGVyIG9yIGVxdWFsXCIgKD49KS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBsZWZ0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgbGVmdCBzaWRlXG4gKiBAcGFyYW0gcmlnaHRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29uXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPn0gQW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBhcmlzb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyZWF0ZXJPckVxdWFsPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0bGVmdE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPixcblx0cmlnaHRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY29tcGFyaXNvbihcIj49XCIsIGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb246IFwiZ3JlYXRlciB0aGFuXCIgKD4pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JlYXRlclRoYW48VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjb21wYXJpc29uKFwiPlwiLCBsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKTtcbn1cblxuLyoqXG4gKiBDb21wYXJpc29uOiBcImxlc3Mgb3IgZXF1YWxcIiAoPD0pLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0YXJnZXQgdHlwZVxuICogQHBhcmFtIGxlZnRPcGVyYW5kIFRoZSBvcGVyYW5kIG9uIHRoZSBsZWZ0IHNpZGVcbiAqIEBwYXJhbSByaWdodE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGNvbXBhcmlzb25cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBBbiBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVzc09yRXF1YWw8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRsZWZ0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRyaWdodE9wZXJhbmQ6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjb21wYXJpc29uKFwiPD1cIiwgbGVmdE9wZXJhbmQsIHJpZ2h0T3BlcmFuZCk7XG59XG5cbi8qKlxuICogQ29tcGFyaXNvbjogXCJsZXNzIHRoYW5cIiAoPCkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gbGVmdE9wZXJhbmQgVGhlIG9wZXJhbmQgb24gdGhlIGxlZnQgc2lkZVxuICogQHBhcmFtIHJpZ2h0T3BlcmFuZCBUaGUgb3BlcmFuZCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY29tcGFyaXNvblxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj59IEFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZXNzVGhhbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oXG5cdGxlZnRPcGVyYW5kOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdHJpZ2h0T3BlcmFuZDogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNvbXBhcmlzb24oXCI8XCIsIGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpO1xufVxuXG4vKipcbiAqIElmLXRoZW4tZWxzZSBleHByZXNzaW9uLlxuICpcbiAqIEV2YWx1YXRlcyB0byBvblRydWUgaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZSwgZWxzZSBldmFsdWF0ZXMgdG8gb25GYWxzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdGFyZ2V0IHR5cGVcbiAqIEBwYXJhbSBjb25kaXRpb24gVGhlIGNvbmRpdGlvbiB0byBldmFsdWF0ZVxuICogQHBhcmFtIG9uVHJ1ZSBFeHByZXNzaW9uIHJlc3VsdCBpZiB0aGUgY29uZGl0aW9uIGV2YWx1YXRlcyB0byB0cnVlXG4gKiBAcGFyYW0gb25GYWxzZSBFeHByZXNzaW9uIHJlc3VsdCBpZiB0aGUgY29uZGl0aW9uIGV2YWx1YXRlcyB0byBmYWxzZVxuICogQHJldHVybnMge0V4cHJlc3Npb248VD59IFRoZSBleHByZXNzaW9uIHRoYXQgcmVwcmVzZW50cyB0aGlzIGNvbmRpdGlvbmFsIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZkVsc2U8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KFxuXHRjb25kaXRpb246IEV4cHJlc3Npb25PclByaW1pdGl2ZTxib29sZWFuPixcblx0b25UcnVlOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4sXG5cdG9uRmFsc2U6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxUPlxuKTogRXhwcmVzc2lvbjxUPiB7XG5cdGxldCBjb25kaXRpb25FeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShjb25kaXRpb24pO1xuXHRsZXQgb25UcnVlRXhwcmVzc2lvbiA9IHdyYXBQcmltaXRpdmUob25UcnVlKTtcblx0bGV0IG9uRmFsc2VFeHByZXNzaW9uID0gd3JhcFByaW1pdGl2ZShvbkZhbHNlKTtcblxuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oY29uZGl0aW9uRXhwcmVzc2lvbiwgb25UcnVlRXhwcmVzc2lvbiwgb25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdC8vIHN3YXAgYnJhbmNoZXMgaWYgdGhlIGNvbmRpdGlvbiBpcyBhIG5lZ2F0aW9uXG5cdGlmIChjb25kaXRpb25FeHByZXNzaW9uLl90eXBlID09PSBcIk5vdFwiKSB7XG5cdFx0Ly8gaWZFbHNlKG5vdChYKSwgYSwgYikgLS0+IGlmRWxzZShYLCBiLCBhKVxuXHRcdFtvblRydWVFeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbl0gPSBbb25GYWxzZUV4cHJlc3Npb24sIG9uVHJ1ZUV4cHJlc3Npb25dO1xuXHRcdGNvbmRpdGlvbkV4cHJlc3Npb24gPSBub3QoY29uZGl0aW9uRXhwcmVzc2lvbik7XG5cdH1cblxuXHQvLyBpbmxpbmUgbmVzdGVkIGlmLWVsc2UgZXhwcmVzc2lvbnM6IG9uVHJ1ZSBicmFuY2hcblx0Ly8gaWZFbHNlKFgsIGlmRWxzZShYLCBhLCBiKSwgYykgPT0+IGlmRWxzZShYLCBhLCBjKVxuXHRpZiAob25UcnVlRXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJJZkVsc2VcIiAmJiBfY2hlY2tFeHByZXNzaW9uc0FyZUVxdWFsKGNvbmRpdGlvbkV4cHJlc3Npb24sIG9uVHJ1ZUV4cHJlc3Npb24uY29uZGl0aW9uKSkge1xuXHRcdG9uVHJ1ZUV4cHJlc3Npb24gPSBvblRydWVFeHByZXNzaW9uLm9uVHJ1ZTtcblx0fVxuXG5cdC8vIGlubGluZSBuZXN0ZWQgaWYtZWxzZSBleHByZXNzaW9uczogb25GYWxzZSBicmFuY2hcblx0Ly8gaWZFbHNlKFgsIGEsIGlmRWxzZShYLCBiLCBjKSkgPT0+IGlmRWxzZShYLCBhLCBjKVxuXHRpZiAob25GYWxzZUV4cHJlc3Npb24uX3R5cGUgPT09IFwiSWZFbHNlXCIgJiYgX2NoZWNrRXhwcmVzc2lvbnNBcmVFcXVhbChjb25kaXRpb25FeHByZXNzaW9uLCBvbkZhbHNlRXhwcmVzc2lvbi5jb25kaXRpb24pKSB7XG5cdFx0b25GYWxzZUV4cHJlc3Npb24gPSBvbkZhbHNlRXhwcmVzc2lvbi5vbkZhbHNlO1xuXHR9XG5cblx0Ly8gKGlmIHRydWUgdGhlbiBhIGVsc2UgYikgIH5+PiBhXG5cdC8vIChpZiBmYWxzZSB0aGVuIGEgZWxzZSBiKSB+fj4gYlxuXHRpZiAoaXNDb25zdGFudChjb25kaXRpb25FeHByZXNzaW9uKSkge1xuXHRcdHJldHVybiBjb25kaXRpb25FeHByZXNzaW9uLnZhbHVlID8gb25UcnVlRXhwcmVzc2lvbiA6IG9uRmFsc2VFeHByZXNzaW9uO1xuXHR9XG5cblx0Ly8gaWYgKGlzQ29uc3RhbnRCb29sZWFuKG9uVHJ1ZUV4cHJlc3Npb24pIHx8IGlzQ29uc3RhbnRCb29sZWFuKG9uRmFsc2VFeHByZXNzaW9uKSkge1xuXHQvLyBcdHJldHVybiBvcihhbmQoY29uZGl0aW9uLCBvblRydWVFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pLCBhbmQobm90KGNvbmRpdGlvbiksIG9uRmFsc2VFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pKSBhcyBFeHByZXNzaW9uPFQ+XG5cdC8vIH1cblx0Ly8gKGlmIFggdGhlbiBhIGVsc2UgYSkgfn4+IGFcblx0aWYgKF9jaGVja0V4cHJlc3Npb25zQXJlRXF1YWwob25UcnVlRXhwcmVzc2lvbiwgb25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIG9uVHJ1ZUV4cHJlc3Npb247XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gYSBlbHNlIGZhbHNlIH5+PiBYICYmIGFcblx0aWYgKGlzRmFsc2Uob25GYWxzZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGFuZChjb25kaXRpb25FeHByZXNzaW9uLCBvblRydWVFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gYSBlbHNlIHRydWUgfn4+ICFYIHx8IGFcblx0aWYgKGlzVHJ1ZShvbkZhbHNlRXhwcmVzc2lvbikpIHtcblx0XHRyZXR1cm4gb3Iobm90KGNvbmRpdGlvbkV4cHJlc3Npb24pLCBvblRydWVFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gZmFsc2UgZWxzZSBhIH5+PiAhWCAmJiBhXG5cdGlmIChpc0ZhbHNlKG9uVHJ1ZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIGFuZChub3QoY29uZGl0aW9uRXhwcmVzc2lvbiksIG9uRmFsc2VFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblxuXHQvLyBpZiBYIHRoZW4gdHJ1ZSBlbHNlIGEgfn4+IFggfHwgYVxuXHRpZiAoaXNUcnVlKG9uVHJ1ZUV4cHJlc3Npb24pKSB7XG5cdFx0cmV0dXJuIG9yKGNvbmRpdGlvbkV4cHJlc3Npb24sIG9uRmFsc2VFeHByZXNzaW9uIGFzIEV4cHJlc3Npb248Ym9vbGVhbj4pIGFzIEV4cHJlc3Npb248VD47XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIklmRWxzZVwiLFxuXHRcdGNvbmRpdGlvbjogY29uZGl0aW9uRXhwcmVzc2lvbixcblx0XHRvblRydWU6IG9uVHJ1ZUV4cHJlc3Npb24sXG5cdFx0b25GYWxzZTogb25GYWxzZUV4cHJlc3Npb25cblx0fTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBleHByZXNzaW9uIGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgZGVmYXVsdCBtb2RlbCAodW5kZWZpbmVkKS5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZGVmYXVsdCBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxhbnk+KTogYm9vbGVhbiB7XG5cdHN3aXRjaCAoZXhwcmVzc2lvbi5fdHlwZSkge1xuXHRcdGNhc2UgXCJDb25zdGFudFwiOlxuXHRcdGNhc2UgXCJGb3JtYXR0ZXJcIjpcblx0XHRjYXNlIFwiQ29tcGxleFR5cGVcIjpcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbi5vcGVyYW5kcy5zb21lKGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQpO1xuXHRcdGNhc2UgXCJCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbi5tb2RlbE5hbWUgPT09IHVuZGVmaW5lZDtcblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0cmV0dXJuIGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vcGVyYW5kMSkgfHwgaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dChleHByZXNzaW9uLm9wZXJhbmQyKTtcblx0XHRjYXNlIFwiRGVmYXVsdEJpbmRpbmdcIjpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5jb25kaXRpb24pIHx8XG5cdFx0XHRcdGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vblRydWUpIHx8XG5cdFx0XHRcdGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vbkZhbHNlKVxuXHRcdFx0KTtcblx0XHRjYXNlIFwiTm90XCI6XG5cdFx0Y2FzZSBcIlRydXRoeVwiOlxuXHRcdFx0cmV0dXJuIGhhc1JlZmVyZW5jZVRvRGVmYXVsdENvbnRleHQoZXhwcmVzc2lvbi5vcGVyYW5kKTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbnR5cGUgRm48VD4gPSAoKC4uLnBhcmFtczogYW55KSA9PiBUKSAmIHtcblx0X19mdW5jdGlvbk5hbWU6IHN0cmluZztcbn07XG5cbi8qKlxuICogQHR5cGVkZWYgV3JhcHBlZFR1cGxlXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbnR5cGUgV3JhcHBlZFR1cGxlPFQ+ID0geyBbSyBpbiBrZXlvZiBUXTogV3JhcHBlZFR1cGxlPFRbS10+IHwgRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFRbS10+IH07XG5cbi8vIFNvLCB0aGlzIHdvcmtzIGJ1dCBJIGNhbm5vdCBnZXQgaXQgdG8gY29tcGlsZSA6RCwgYnV0IGl0IHN0aWxsIGRvZXMgd2hhdCBpcyBleHBlY3RlZC4uLlxuXG4vKipcbiAqIEEgZnVuY3Rpb24gcmVmZXJlbmNlIG9yIGEgZnVuY3Rpb24gbmFtZS5cbiAqL1xudHlwZSBGdW5jdGlvbk9yTmFtZTxUPiA9IEZuPFQ+IHwgc3RyaW5nO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHBhcmFtZXRlcnMsIGVpdGhlciBkZXJpdmVkIGZyb20gdGhlIGZ1bmN0aW9uIG9yIGFuIHVudHlwZWQgYXJyYXkuXG4gKi9cbnR5cGUgRnVuY3Rpb25QYXJhbWV0ZXJzPFQsIEYgZXh0ZW5kcyBGdW5jdGlvbk9yTmFtZTxUPj4gPSBGIGV4dGVuZHMgRm48VD4gPyBQYXJhbWV0ZXJzPEY+IDogYW55W107XG5cbi8qKlxuICogQ2FsbHMgYSBmb3JtYXR0ZXIgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgcGFyYW1ldGVycy5cbiAqIElmIHJlcXVpcmVDb250ZXh0IGlzIHNldCB0byB0cnVlIGFuZCBubyBjb250ZXh0IGlzIHBhc3NlZCBhIGRlZmF1bHQgY29udGV4dCB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgbGlzdCBvZiBwYXJhbWV0ZXIgdGhhdCBzaG91bGQgbWF0Y2ggdGhlIHR5cGUgYW5kIG51bWJlciBvZiB0aGUgZm9ybWF0dGVyIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZm9ybWF0dGVyRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGNhbGxcbiAqIEBwYXJhbSBbY29udGV4dEVudGl0eVR5cGVdIFRoZSBjb250ZXh0IGVudGl0eSB0eXBlIHRvIGNvbnNpZGVyXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gVGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVzdWx0PFQsIFUgZXh0ZW5kcyBGbjxUPj4oXG5cdHBhcmFtZXRlcnM6IFdyYXBwZWRUdXBsZTxQYXJhbWV0ZXJzPFU+Pixcblx0Zm9ybWF0dGVyRnVuY3Rpb246IFUsXG5cdGNvbnRleHRFbnRpdHlUeXBlPzogRW50aXR5VHlwZVxuKTogRXhwcmVzc2lvbjxUPiB7XG5cdGNvbnN0IHBhcmFtZXRlckV4cHJlc3Npb25zID0gKHBhcmFtZXRlcnMgYXMgYW55W10pLm1hcCh3cmFwUHJpbWl0aXZlKTtcblxuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4ucGFyYW1ldGVyRXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmICghIWNvbnRleHRFbnRpdHlUeXBlKSB7XG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiB0aGUgY29udGV4dCBpcyByZXF1aXJlZCBhbmQgbm8gY29udGV4dCBpcyBwcm92aWRlZCBtYWtlIHN1cmUgdG8gYWRkIHRoZSBkZWZhdWx0IGJpbmRpbmdcblx0XHRpZiAoIXBhcmFtZXRlckV4cHJlc3Npb25zLnNvbWUoaGFzUmVmZXJlbmNlVG9EZWZhdWx0Q29udGV4dCkpIHtcblx0XHRcdGNvbnRleHRFbnRpdHlUeXBlLmtleXMuZm9yRWFjaChrZXkgPT4gcGFyYW1ldGVyRXhwcmVzc2lvbnMucHVzaChiaW5kaW5nRXhwcmVzc2lvbihrZXkubmFtZSwgXCJcIikpKTtcblx0XHR9XG5cdH1cblxuXHQvLyBGb3JtYXR0ZXJOYW1lIGNhbiBiZSBvZiBmb3JtYXQgc2FwLmZlLmNvcmUueHh4I21ldGhvZE5hbWUgdG8gaGF2ZSBtdWx0aXBsZSBmb3JtYXR0ZXIgaW4gb25lIGNsYXNzXG5cdGNvbnN0IFtmb3JtYXR0ZXJDbGFzcywgZm9ybWF0dGVyTmFtZV0gPSBmb3JtYXR0ZXJGdW5jdGlvbi5fX2Z1bmN0aW9uTmFtZS5zcGxpdChcIiNcIik7XG5cblx0aWYgKCEhZm9ybWF0dGVyTmFtZSAmJiBmb3JtYXR0ZXJOYW1lLmxlbmd0aCA+IDApIHtcblx0XHRwYXJhbWV0ZXJFeHByZXNzaW9ucy51bnNoaWZ0KGNvbnN0YW50KGZvcm1hdHRlck5hbWUpKTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0X3R5cGU6IFwiRm9ybWF0dGVyXCIsXG5cdFx0Zm46IGZvcm1hdHRlckNsYXNzLFxuXHRcdHBhcmFtZXRlcnM6IHBhcmFtZXRlckV4cHJlc3Npb25zXG5cdH07XG59XG5cbi8qKlxuICogQ2FsbHMgYSBjb21wbGV4IHR5cGUgIHRvIHByb2Nlc3MgdGhlIHBhcmFtZXRlcnMuXG4gKiBJZiByZXF1aXJlQ29udGV4dCBpcyBzZXQgdG8gdHJ1ZSBhbmQgbm8gY29udGV4dCBpcyBwYXNzZWQgYSBkZWZhdWx0IGNvbnRleHQgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIGxpc3Qgb2YgcGFyYW1ldGVyIHRoYXQgc2hvdWxkIG1hdGNoIHRoZSB0eXBlIGZvciB0aGUgY29tcHBsZXggdHlwZVxuICogQHBhcmFtIHR5cGUgVGhlIGNvbXBsZXggdHlwZSB0byB1c2VcbiAqIEBwYXJhbSBbY29udGV4dEVudGl0eVR5cGVdIFRoZSBjb250ZXh0IGVudGl0eSB0eXBlIHRvIGNvbnNpZGVyXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxUPn0gVGhlIGNvcnJlc3BvbmRpbmcgZXhwcmVzc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkVHlwZUluZm9ybWF0aW9uPFQsIFUgZXh0ZW5kcyBGbjxUPj4oXG5cdHBhcmFtZXRlcnM6IFdyYXBwZWRUdXBsZTxQYXJhbWV0ZXJzPFU+Pixcblx0dHlwZTogc3RyaW5nLFxuXHRjb250ZXh0RW50aXR5VHlwZT86IEVudGl0eVR5cGVcbik6IEV4cHJlc3Npb248VD4ge1xuXHRjb25zdCBwYXJhbWV0ZXJFeHByZXNzaW9ucyA9IChwYXJhbWV0ZXJzIGFzIGFueVtdKS5tYXAod3JhcFByaW1pdGl2ZSk7XG5cdGlmIChoYXNVbnJlc29sdmVhYmxlRXhwcmVzc2lvbiguLi5wYXJhbWV0ZXJFeHByZXNzaW9ucykpIHtcblx0XHRyZXR1cm4gdW5yZXNvbHZlYWJsZUV4cHJlc3Npb247XG5cdH1cblx0Ly8gSWYgdGhlcmUgaXMgb25seSBvbmUgcGFyYW1ldGVyIGFuZCBpdCBpcyBhIGNvbnN0YW50IGFuZCB3ZSBkb24ndCBleHBlY3QgdGhlIGNvbnRleHQgdGhlbiByZXR1cm4gdGhlIGNvbnN0YW50XG5cdGlmIChwYXJhbWV0ZXJFeHByZXNzaW9ucy5sZW5ndGggPT09IDEgJiYgaXNDb25zdGFudChwYXJhbWV0ZXJFeHByZXNzaW9uc1swXSkgJiYgIWNvbnRleHRFbnRpdHlUeXBlKSB7XG5cdFx0cmV0dXJuIHBhcmFtZXRlckV4cHJlc3Npb25zWzBdO1xuXHR9IGVsc2UgaWYgKCEhY29udGV4dEVudGl0eVR5cGUpIHtcblx0XHQvLyBPdGhlcndpc2UsIGlmIHRoZSBjb250ZXh0IGlzIHJlcXVpcmVkIGFuZCBubyBjb250ZXh0IGlzIHByb3ZpZGVkIG1ha2Ugc3VyZSB0byBhZGQgdGhlIGRlZmF1bHQgYmluZGluZ1xuXHRcdGlmICghcGFyYW1ldGVyRXhwcmVzc2lvbnMuc29tZShoYXNSZWZlcmVuY2VUb0RlZmF1bHRDb250ZXh0KSkge1xuXHRcdFx0Y29udGV4dEVudGl0eVR5cGUua2V5cy5mb3JFYWNoKGtleSA9PiBwYXJhbWV0ZXJFeHByZXNzaW9ucy5wdXNoKGJpbmRpbmdFeHByZXNzaW9uKGtleS5uYW1lLCBcIlwiKSkpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IG9Gb3JtYXRPcHRpb25zID1cblx0XHQocGFyYW1ldGVyc1swXSBhcyBhbnkpPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwID8geyBwYXJzZUFzU3RyaW5nOiBmYWxzZSwgZW1wdHlTdHJpbmc6IFwiXCIgfSA6IHt9O1xuXHRyZXR1cm4ge1xuXHRcdF90eXBlOiBcIkNvbXBsZXhUeXBlXCIsXG5cdFx0dHlwZTogdHlwZSxcblx0XHRmb3JtYXRPcHRpb25zOiBvRm9ybWF0T3B0aW9ucyxcblx0XHRwYXJhbWV0ZXJzOiB7fSxcblx0XHRiaW5kaW5nUGFyYW1ldGVyczogcGFyYW1ldGVyRXhwcmVzc2lvbnNcblx0fTtcbn1cbi8qKlxuICogRnVuY3Rpb24gY2FsbCwgb3B0aW9uYWxseSB3aXRoIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZnVuYyBGdW5jdGlvbiBuYW1lIG9yIHJlZmVyZW5jZSB0byBmdW5jdGlvblxuICogQHBhcmFtIHBhcmFtZXRlcnMgQXJndW1lbnRzXG4gKiBAcGFyYW0gb24gT2JqZWN0IHRvIGNhbGwgdGhlIGZ1bmN0aW9uIG9uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb25FeHByZXNzaW9uPFQ+fSBFeHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgZnVuY3Rpb24gY2FsbCAobm90IHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwhKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm48VCwgVSBleHRlbmRzIEZ1bmN0aW9uT3JOYW1lPFQ+Pihcblx0ZnVuYzogVSxcblx0cGFyYW1ldGVyczogV3JhcHBlZFR1cGxlPEZ1bmN0aW9uUGFyYW1ldGVyczxULCBVPj4sXG5cdG9uPzogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPG9iamVjdD5cbik6IEZ1bmN0aW9uRXhwcmVzc2lvbjxUPiB7XG5cdGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHR5cGVvZiBmdW5jID09PSBcInN0cmluZ1wiID8gZnVuYyA6IChmdW5jIGFzIEZuPFQ+KS5fX2Z1bmN0aW9uTmFtZTtcblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJGdW5jdGlvblwiLFxuXHRcdG9iajogb24gIT09IHVuZGVmaW5lZCA/IHdyYXBQcmltaXRpdmUob24pIDogdW5kZWZpbmVkLFxuXHRcdGZuOiBmdW5jdGlvbk5hbWUsXG5cdFx0cGFyYW1ldGVyczogKHBhcmFtZXRlcnMgYXMgYW55W10pLm1hcCh3cmFwUHJpbWl0aXZlKVxuXHR9O1xufVxuXG4vKipcbiAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGJpbmRpbmcgdmFsdWUgaXMgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gZXhwcmVzc2lvbiBldmFsdWF0aW5nIHRoZSBmYWN0IHRoYXQgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBlbXB0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShleHByZXNzaW9uOiBFeHByZXNzaW9uPHN0cmluZz4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKGV4cHJlc3Npb24uX3R5cGUgPT09IFwiQ29uY2F0XCIpIHtcblx0XHRyZXR1cm4gb3IoLi4uZXhwcmVzc2lvbi5leHByZXNzaW9ucy5tYXAoaXNFbXB0eSkpO1xuXHR9XG5cdHJldHVybiBvcihlcXVhbChleHByZXNzaW9uLCBcIlwiKSwgZXF1YWwoZXhwcmVzc2lvbiwgdW5kZWZpbmVkKSwgZXF1YWwoZXhwcmVzc2lvbiwgbnVsbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0KC4uLmluRXhwcmVzc2lvbnM6IEV4cHJlc3Npb25PclByaW1pdGl2ZTxzdHJpbmc+W10pOiBFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBleHByZXNzaW9ucyA9IGluRXhwcmVzc2lvbnMubWFwKHdyYXBQcmltaXRpdmUpO1xuXHRpZiAoaGFzVW5yZXNvbHZlYWJsZUV4cHJlc3Npb24oLi4uZXhwcmVzc2lvbnMpKSB7XG5cdFx0cmV0dXJuIHVucmVzb2x2ZWFibGVFeHByZXNzaW9uO1xuXHR9XG5cdGlmIChleHByZXNzaW9ucy5ldmVyeShpc0NvbnN0YW50KSkge1xuXHRcdHJldHVybiBjb25zdGFudChcblx0XHRcdGV4cHJlc3Npb25zLnJlZHVjZSgoY29uY2F0ZW5hdGVkOiBzdHJpbmcsIHZhbHVlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBjb25jYXRlbmF0ZWQgKyAodmFsdWUgYXMgQ29uc3RhbnRFeHByZXNzaW9uPGFueT4pLnZhbHVlLnRvU3RyaW5nKCk7XG5cdFx0XHR9LCBcIlwiKVxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJDb25jYXRcIixcblx0XHRleHByZXNzaW9uczogZXhwcmVzc2lvbnNcblx0fTtcbn1cblxuZXhwb3J0IHR5cGUgVHJhbnNmb3JtRnVuY3Rpb24gPSA8VCBleHRlbmRzIFByaW1pdGl2ZVR5cGUgfCB1bmtub3duPihleHByZXNzaW9uUGFydDogYW55KSA9PiBFeHByZXNzaW9uPFQ+O1xuZXhwb3J0IHR5cGUgRXhwcmVzc2lvblR5cGUgPSBQaWNrPEV4cHJlc3Npb248YW55PiwgXCJfdHlwZVwiPltcIl90eXBlXCJdO1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVJlY3Vyc2l2ZWx5PFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIHwgdW5rbm93bj4oXG5cdGluRXhwcmVzc2lvbjogRXhwcmVzc2lvbjxUPixcblx0ZXhwcmVzc2lvblR5cGU6IEV4cHJlc3Npb25UeXBlLFxuXHR0cmFuc2Zvcm1GdW5jdGlvbjogVHJhbnNmb3JtRnVuY3Rpb24sXG5cdGluY2x1ZGVBbGxFeHByZXNzaW9uID0gZmFsc2Vcbik6IEV4cHJlc3Npb248VD4ge1xuXHRsZXQgZXhwcmVzc2lvbiA9IGluRXhwcmVzc2lvbjtcblx0c3dpdGNoIChleHByZXNzaW9uLl90eXBlKSB7XG5cdFx0Y2FzZSBcIkZ1bmN0aW9uXCI6XG5cdFx0Y2FzZSBcIkZvcm1hdHRlclwiOlxuXHRcdFx0ZXhwcmVzc2lvbi5wYXJhbWV0ZXJzID0gZXhwcmVzc2lvbi5wYXJhbWV0ZXJzLm1hcChwYXJhbWV0ZXIgPT5cblx0XHRcdFx0dHJhbnNmb3JtUmVjdXJzaXZlbHkocGFyYW1ldGVyLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJDb25jYXRcIjpcblx0XHRcdGV4cHJlc3Npb24uZXhwcmVzc2lvbnMgPSBleHByZXNzaW9uLmV4cHJlc3Npb25zLm1hcChzdWJFeHByZXNzaW9uID0+XG5cdFx0XHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KHN1YkV4cHJlc3Npb24sIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pXG5cdFx0XHQpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkNvbXBsZXhUeXBlXCI6XG5cdFx0XHRleHByZXNzaW9uLmJpbmRpbmdQYXJhbWV0ZXJzID0gZXhwcmVzc2lvbi5iaW5kaW5nUGFyYW1ldGVycy5tYXAoYmluZGluZ1BhcmFtZXRlciA9PlxuXHRcdFx0XHR0cmFuc2Zvcm1SZWN1cnNpdmVseShiaW5kaW5nUGFyYW1ldGVyLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJJZkVsc2VcIjpcblx0XHRcdGNvbnN0IG9uVHJ1ZSA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub25UcnVlLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdGNvbnN0IG9uRmFsc2UgPSB0cmFuc2Zvcm1SZWN1cnNpdmVseShleHByZXNzaW9uLm9uRmFsc2UsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pO1xuXHRcdFx0bGV0IGNvbmRpdGlvbiA9IGV4cHJlc3Npb24uY29uZGl0aW9uO1xuXHRcdFx0aWYgKGluY2x1ZGVBbGxFeHByZXNzaW9uKSB7XG5cdFx0XHRcdGNvbmRpdGlvbiA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24uY29uZGl0aW9uLCBleHByZXNzaW9uVHlwZSwgdHJhbnNmb3JtRnVuY3Rpb24sIGluY2x1ZGVBbGxFeHByZXNzaW9uKTtcblx0XHRcdH1cblx0XHRcdGV4cHJlc3Npb24gPSBpZkVsc2UoY29uZGl0aW9uLCBvblRydWUsIG9uRmFsc2UpIGFzIEV4cHJlc3Npb248VD47XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiTm90XCI6XG5cdFx0XHRpZiAoaW5jbHVkZUFsbEV4cHJlc3Npb24pIHtcblx0XHRcdFx0Y29uc3Qgb3BlcmFuZCA9IHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KGV4cHJlc3Npb24ub3BlcmFuZCwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGV4cHJlc3Npb24gPSBub3Qob3BlcmFuZCkgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJUcnV0aHlcIjpcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJTZXRcIjpcblx0XHRcdGlmIChpbmNsdWRlQWxsRXhwcmVzc2lvbikge1xuXHRcdFx0XHRleHByZXNzaW9uLm9wZXJhbmRzID0gZXhwcmVzc2lvbi5vcGVyYW5kcy5tYXAob3BlcmFuZCA9PlxuXHRcdFx0XHRcdHRyYW5zZm9ybVJlY3Vyc2l2ZWx5KG9wZXJhbmQsIGV4cHJlc3Npb25UeXBlLCB0cmFuc2Zvcm1GdW5jdGlvbiwgaW5jbHVkZUFsbEV4cHJlc3Npb24pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0aWYgKGluY2x1ZGVBbGxFeHByZXNzaW9uKSB7XG5cdFx0XHRcdGNvbnN0IG9wZXJhbmQxID0gdHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbi5vcGVyYW5kMSwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGNvbnN0IG9wZXJhbmQyID0gdHJhbnNmb3JtUmVjdXJzaXZlbHkoZXhwcmVzc2lvbi5vcGVyYW5kMiwgZXhwcmVzc2lvblR5cGUsIHRyYW5zZm9ybUZ1bmN0aW9uLCBpbmNsdWRlQWxsRXhwcmVzc2lvbik7XG5cdFx0XHRcdGV4cHJlc3Npb24gPSBjb21wYXJpc29uKGV4cHJlc3Npb24ub3BlcmF0b3IsIG9wZXJhbmQxLCBvcGVyYW5kMikgYXMgRXhwcmVzc2lvbjxUPjtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJEZWZhdWx0QmluZGluZ1wiOlxuXHRcdGNhc2UgXCJSZWZcIjpcblx0XHRjYXNlIFwiTGVuZ3RoXCI6XG5cdFx0Y2FzZSBcIkJpbmRpbmdcIjpcblx0XHRjYXNlIFwiQ29uc3RhbnRcIjpcblx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdGJyZWFrO1xuXHR9XG5cdGlmIChleHByZXNzaW9uVHlwZSA9PT0gZXhwcmVzc2lvbi5fdHlwZSkge1xuXHRcdGV4cHJlc3Npb24gPSB0cmFuc2Zvcm1GdW5jdGlvbihpbkV4cHJlc3Npb24pO1xuXHR9XG5cdHJldHVybiBleHByZXNzaW9uO1xufVxuXG5leHBvcnQgdHlwZSBCaW5kaW5nRXhwcmVzc2lvbjxUPiA9IFQgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmNvbnN0IG5lZWRQYXJlbnRoZXNpcyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihleHByOiBFeHByZXNzaW9uT3JQcmltaXRpdmU8VD4pOiBib29sZWFuIHtcblx0cmV0dXJuICFpc0NvbnN0YW50KGV4cHIpICYmICFpc0JpbmRpbmcoZXhwcikgJiYgaXNFeHByZXNzaW9uKGV4cHIpICYmIGV4cHIuX3R5cGUgIT09IFwiSWZFbHNlXCIgJiYgZXhwci5fdHlwZSAhPT0gXCJGdW5jdGlvblwiO1xufTtcblxuLyoqXG4gKiBDb21waWxlcyBhIGNvbnN0YW50IG9iamVjdCB0byBhIHN0cmluZy5cbiAqIEBwYXJhbSBleHByXG4gKiBAcGFyYW0gaXNOdWxsYWJsZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbXBpbGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiBjb21waWxlQ29uc3RhbnRPYmplY3Q8VD4oZXhwcjogQ29uc3RhbnRFeHByZXNzaW9uPG9iamVjdD4sIGlzTnVsbGFibGUgPSBmYWxzZSkge1xuXHRpZiAoaXNOdWxsYWJsZSAmJiBPYmplY3Qua2V5cyhleHByLnZhbHVlKS5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXHQvLyBPYmplY3RzXG5cdGNvbnN0IG8gPSBleHByLnZhbHVlIGFzIFBsYWluRXhwcmVzc2lvbk9iamVjdDtcblx0Y29uc3QgcHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0T2JqZWN0LmtleXMobykuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlID0gb1trZXldO1xuXHRcdGNvbnN0IGNoaWxkUmVzdWx0ID0gY29tcGlsZUJpbmRpbmcodmFsdWUsIHRydWUsIGZhbHNlLCB0cnVlKTtcblx0XHRpZiAoY2hpbGRSZXN1bHQgJiYgY2hpbGRSZXN1bHQubGVuZ3RoID4gMCkge1xuXHRcdFx0cHJvcGVydGllcy5wdXNoKGAke2tleX06ICR7Y2hpbGRSZXN1bHR9YCk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzLmpvaW4oXCIsIFwiKX19YDtcbn1cblxuLyoqXG4gKiBDb21waWxlcyBhIENvbnN0YW50IEJpbmRpbmcgRXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBleHByXG4gKiBAcGFyYW0gZW1iZWRkZWRJbkJpbmRpbmdcbiAqIEBwYXJhbSBpc051bGxhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tcGlsZWQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVDb25zdGFudDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcjogQ29uc3RhbnRFeHByZXNzaW9uPFQ+LCBlbWJlZGRlZEluQmluZGluZzogYm9vbGVhbiwgaXNOdWxsYWJsZSA9IGZhbHNlKSB7XG5cdGlmIChleHByLnZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIFwibnVsbFwiO1xuXHR9XG5cdGlmIChleHByLnZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gXCJ1bmRlZmluZWRcIjtcblx0fVxuXHRpZiAodHlwZW9mIGV4cHIudmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShleHByLnZhbHVlKSkge1xuXHRcdFx0Y29uc3QgZW50cmllcyA9IGV4cHIudmFsdWUubWFwKGV4cHJlc3Npb24gPT4gY29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbiwgdHJ1ZSkpO1xuXHRcdFx0cmV0dXJuIGBbJHtlbnRyaWVzLmpvaW4oXCIsIFwiKX1dYDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVDb25zdGFudE9iamVjdChleHByIGFzIENvbnN0YW50RXhwcmVzc2lvbjxvYmplY3Q+LCBpc051bGxhYmxlKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRzd2l0Y2ggKHR5cGVvZiBleHByLnZhbHVlKSB7XG5cdFx0XHRjYXNlIFwibnVtYmVyXCI6XG5cdFx0XHRjYXNlIFwiYmlnaW50XCI6XG5cdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRyZXR1cm4gZXhwci52YWx1ZS50b1N0cmluZygpO1xuXHRcdFx0Y2FzZSBcInN0cmluZ1wiOlxuXHRcdFx0XHRyZXR1cm4gYCcke2VzY2FwZVhtbEF0dHJpYnV0ZShleHByLnZhbHVlLnRvU3RyaW5nKCkpfSdgO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBleHByLnZhbHVlLnRvU3RyaW5nKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGJpbmRpbmcgc3RyaW5nIGZvciBhIEJpbmRpbmcgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbkZvckJpbmRpbmcgVGhlIGV4cHJlc3Npb24gdG8gY29tcGlsZVxuICogQHBhcmFtIGVtYmVkZGVkSW5CaW5kaW5nIFdoZXRoZXIgdGhlIGV4cHJlc3Npb24gdG8gY29tcGlsZSBpcyBlbWJlZGRlZCBpbnRvIGFub3RoZXIgZXhwcmVzc2lvblxuICogQHBhcmFtIGVtYmVkZGVkU2VwYXJhdG9yIFRoZSBiaW5kaW5nIHZhbHVlIGV2YWx1YXRvciAoJCBvciAlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIHdhbnQgdG8gZm9yY2UgdGhlIHR5cGUgb3Igbm90KVxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPFQ+fSBUaGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uIGJpbmRpbmdcbiAqL1xuZnVuY3Rpb24gY29tcGlsZUJpbmRpbmdGb3JCaW5kaW5nPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0ZXhwcmVzc2lvbkZvckJpbmRpbmc6IEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPiB8IERlZmF1bHRCaW5kaW5nRXhwcmVzc2lvbkV4cHJlc3Npb248VD4sXG5cdGVtYmVkZGVkSW5CaW5kaW5nOiBib29sZWFuLFxuXHRlbWJlZGRlZFNlcGFyYXRvcjogc3RyaW5nXG4pIHtcblx0aWYgKFxuXHRcdGV4cHJlc3Npb25Gb3JCaW5kaW5nLnR5cGUgfHxcblx0XHRleHByZXNzaW9uRm9yQmluZGluZy5wYXJhbWV0ZXJzIHx8XG5cdFx0ZXhwcmVzc2lvbkZvckJpbmRpbmcudGFyZ2V0VHlwZSB8fFxuXHRcdGV4cHJlc3Npb25Gb3JCaW5kaW5nLmZvcm1hdE9wdGlvbnMgfHxcblx0XHRleHByZXNzaW9uRm9yQmluZGluZy5jb25zdHJhaW50c1xuXHQpIHtcblx0XHQvLyBUaGlzIGlzIG5vdyBhIGNvbXBsZXggYmluZGluZyBkZWZpbml0aW9uLCBsZXQncyBwcmVwYXJlIGZvciBpdFxuXHRcdGNvbnN0IGNvbXBsZXhCaW5kaW5nRGVmaW5pdGlvbiA9IHtcblx0XHRcdHBhdGg6IGNvbXBpbGVCaW5kaW5nUGF0aChleHByZXNzaW9uRm9yQmluZGluZyksXG5cdFx0XHR0eXBlOiBleHByZXNzaW9uRm9yQmluZGluZy50eXBlLFxuXHRcdFx0dGFyZ2V0VHlwZTogZXhwcmVzc2lvbkZvckJpbmRpbmcudGFyZ2V0VHlwZSxcblx0XHRcdHBhcmFtZXRlcnM6IGV4cHJlc3Npb25Gb3JCaW5kaW5nLnBhcmFtZXRlcnMsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBleHByZXNzaW9uRm9yQmluZGluZy5mb3JtYXRPcHRpb25zLFxuXHRcdFx0Y29uc3RyYWludHM6IGV4cHJlc3Npb25Gb3JCaW5kaW5nLmNvbnN0cmFpbnRzXG5cdFx0fTtcblx0XHRsZXQgb3V0QmluZGluZyA9IGNvbXBpbGVCaW5kaW5nKGNvbXBsZXhCaW5kaW5nRGVmaW5pdGlvbik7XG5cdFx0aWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0XHRvdXRCaW5kaW5nID0gYCR7ZW1iZWRkZWRTZXBhcmF0b3J9YCArIG91dEJpbmRpbmc7XG5cdFx0fVxuXHRcdHJldHVybiBvdXRCaW5kaW5nO1xuXHR9IGVsc2UgaWYgKGVtYmVkZGVkSW5CaW5kaW5nKSB7XG5cdFx0cmV0dXJuIGAke2VtYmVkZGVkU2VwYXJhdG9yfXske2NvbXBpbGVCaW5kaW5nUGF0aChleHByZXNzaW9uRm9yQmluZGluZyl9fWA7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGB7JHtjb21waWxlQmluZGluZ1BhdGgoZXhwcmVzc2lvbkZvckJpbmRpbmcpfX1gO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVDb21wbGV4VHlwZUV4cHJlc3Npb248VCBleHRlbmRzIFByaW1pdGl2ZVR5cGU+KGV4cHJlc3Npb246IENvbXBsZXhUeXBlRXhwcmVzc2lvbjxUPikge1xuXHRpZiAoZXhwcmVzc2lvbi5iaW5kaW5nUGFyYW1ldGVycy5sZW5ndGggPT09IDEpIHtcblx0XHRyZXR1cm4gYHske2NvbXBpbGVQYXRoUGFyYW1ldGVyKGV4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnNbMF0sIHRydWUpfSwgdHlwZTogJyR7ZXhwcmVzc2lvbi50eXBlfSd9YDtcblx0fVxuXG5cdGxldCBvdXRwdXRFbmQ7XG5cdC8vIHRoaXMgY29kZSBpcyBiYXNlZCBvbiBzYXAudWkubW9kZWwub2RhdGEudjQuX0Fubm90YXRpb25IZWxwZXJFeHByZXNzaW9uLmZldGNoQ3VycmVuY3lPclVuaXRcblx0c3dpdGNoIChleHByZXNzaW9uLnR5cGUpIHtcblx0XHRjYXNlIFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuVW5pdFwiOlxuXHRcdFx0b3V0cHV0RW5kID0gYCx7bW9kZTonT25lVGltZScscGF0aDonLyMjQEByZXF1ZXN0VW5pdHNPZk1lYXN1cmUnLHRhcmdldFR5cGU6J2FueSd9XSx0eXBlOidzYXAudWkubW9kZWwub2RhdGEudHlwZS5Vbml0J2A7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuQ3VycmVuY3lcIjpcblx0XHRcdG91dHB1dEVuZCA9IGAse21vZGU6J09uZVRpbWUnLHBhdGg6Jy8jI0BAcmVxdWVzdEN1cnJlbmN5Q29kZXMnLHRhcmdldFR5cGU6J2FueSd9XSx0eXBlOidzYXAudWkubW9kZWwub2RhdGEudHlwZS5DdXJyZW5jeSdgO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdG91dHB1dEVuZCA9IGBdLCB0eXBlOiAnJHtleHByZXNzaW9uLnR5cGV9J2A7XG5cdH1cblx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykpIHtcblx0XHRvdXRwdXRFbmQgKz0gYCwgZm9ybWF0T3B0aW9uczogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLmZvcm1hdE9wdGlvbnMpfWA7XG5cdH1cblx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24ucGFyYW1ldGVycykpIHtcblx0XHRvdXRwdXRFbmQgKz0gYCwgcGFyYW1ldGVyczogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLnBhcmFtZXRlcnMpfWA7XG5cdH1cblx0b3V0cHV0RW5kICs9IFwifVwiO1xuXG5cdHJldHVybiBge21vZGU6J1R3b1dheScsIHBhcnRzOlske2V4cHJlc3Npb24uYmluZGluZ1BhcmFtZXRlcnMubWFwKChwYXJhbTogYW55KSA9PiBjb21waWxlUGF0aFBhcmFtZXRlcihwYXJhbSkpLmpvaW4oXCIsXCIpfSR7b3V0cHV0RW5kfWA7XG59XG5cbi8qKlxuICogV3JhcCB0aGUgY29tcGlsZWQgYmluZGluZyBzdHJpbmcgYXMgcmVxdWlyZWQgZGVwZW5kZW5pbmcgb24gaXRzIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGNvbXBpbGVkIGV4cHJlc3Npb25cbiAqIEBwYXJhbSBlbWJlZGRlZEluQmluZGluZyBUcnVlIGlmIHRoZSBjb21waWxlZCBleHByZXNzaW9uIGlzIHRvIGJlIGVtYmVkZGVkIGluIGEgYmluZGluZ1xuICogQHBhcmFtIHBhcmVudGhlc2lzUmVxdWlyZWQgVHJ1ZSBpZiB0aGUgZW1iZWRkZWQgYmluZGluZyBuZWVkcyB0byBiZSB3cmFwcGVkIGluIHBhcmV0aGVzaXMgc28gdGhhdCBpdCBpcyBldmFsdWF0ZWQgYXMgb25lXG4gKiBAcmV0dXJucyB7QmluZGluZ0V4cHJlc3Npb248c3RyaW5nPn0gRmluYWxpemVkIGNvbXBpbGVkIGV4cHJlc3Npb25cbiAqL1xuZnVuY3Rpb24gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZywgZW1iZWRkZWRJbkJpbmRpbmc6IGJvb2xlYW4sIHBhcmVudGhlc2lzUmVxdWlyZWQgPSBmYWxzZSk6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRpZiAoZW1iZWRkZWRJbkJpbmRpbmcpIHtcblx0XHRpZiAocGFyZW50aGVzaXNSZXF1aXJlZCkge1xuXHRcdFx0cmV0dXJuIGAoJHtleHByZXNzaW9ufSlgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbjtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGB7PSAke2V4cHJlc3Npb259fWA7XG5cdH1cbn1cblxuLyoqXG4gKiBDb21waWxlIGFuIGV4cHJlc3Npb24gaW50byBhbiBleHByZXNzaW9uIGJpbmRpbmcuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHRhcmdldCB0eXBlXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBjb21waWxlXG4gKiBAcGFyYW0gZW1iZWRkZWRJbkJpbmRpbmcgV2hldGhlciB0aGUgZXhwcmVzc2lvbiB0byBjb21waWxlIGlzIGVtYmVkZGVkIGludG8gYW5vdGhlciBleHByZXNzaW9uXG4gKiBAcGFyYW0ga2VlcFRhcmdldFR5cGUgS2VlcCB0aGUgdGFyZ2V0IHR5cGUgb2YgdGhlIGVtYmVkZGVkIGJpbmRpbmdzIGluc3RlYWQgb2YgY2FzdGluZyB0aGVtIHRvIGFueVxuICogQHBhcmFtIGlzTnVsbGFibGUgV2hldGhlciBiaW5kaW5nIGV4cHJlc3Npb24gY2FuIHJlc29sdmUgdG8gZW1wdHkgc3RyaW5nIG9yIG5vdFxuICogQHJldHVybnMge0JpbmRpbmdFeHByZXNzaW9uPFQ+fSBUaGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uIGJpbmRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVCaW5kaW5nPFQgZXh0ZW5kcyBQcmltaXRpdmVUeXBlPihcblx0ZXhwcmVzc2lvbjogRXhwcmVzc2lvbk9yUHJpbWl0aXZlPFQ+LFxuXHRlbWJlZGRlZEluQmluZGluZyA9IGZhbHNlLFxuXHRrZWVwVGFyZ2V0VHlwZSA9IGZhbHNlLFxuXHRpc051bGxhYmxlID0gZmFsc2Vcbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCBleHByID0gd3JhcFByaW1pdGl2ZShleHByZXNzaW9uKTtcblx0Y29uc3QgZW1iZWRkZWRTZXBhcmF0b3IgPSBrZWVwVGFyZ2V0VHlwZSA/IFwiJFwiIDogXCIlXCI7XG5cblx0c3dpdGNoIChleHByLl90eXBlKSB7XG5cdFx0Y2FzZSBcIlVucmVzb2x2ZWFibGVcIjpcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRjYXNlIFwiQ29uc3RhbnRcIjpcblx0XHRcdHJldHVybiBjb21waWxlQ29uc3RhbnQoZXhwciwgZW1iZWRkZWRJbkJpbmRpbmcsIGlzTnVsbGFibGUpO1xuXG5cdFx0Y2FzZSBcIlJlZlwiOlxuXHRcdFx0cmV0dXJuIGV4cHIucmVmIHx8IFwibnVsbFwiO1xuXG5cdFx0Y2FzZSBcIkZ1bmN0aW9uXCI6XG5cdFx0XHRjb25zdCBhcmd1bWVudFN0cmluZyA9IGAke2V4cHIucGFyYW1ldGVycy5tYXAoYXJnID0+IGNvbXBpbGVCaW5kaW5nKGFyZywgdHJ1ZSkpLmpvaW4oXCIsIFwiKX1gO1xuXHRcdFx0cmV0dXJuIGV4cHIub2JqID09PSB1bmRlZmluZWRcblx0XHRcdFx0PyBgJHtleHByLmZufSgke2FyZ3VtZW50U3RyaW5nfSlgXG5cdFx0XHRcdDogYCR7Y29tcGlsZUJpbmRpbmcoZXhwci5vYmosIHRydWUpfS4ke2V4cHIuZm59KCR7YXJndW1lbnRTdHJpbmd9KWA7XG5cblx0XHRjYXNlIFwiRW1iZWRkZWRFeHByZXNzaW9uQmluZGluZ1wiOlxuXHRcdFx0cmV0dXJuIGVtYmVkZGVkSW5CaW5kaW5nID8gYCgke2V4cHIudmFsdWUuc3Vic3RyKDIsIGV4cHIudmFsdWUubGVuZ3RoIC0gMyl9KWAgOiBgJHtleHByLnZhbHVlfWA7XG5cblx0XHRjYXNlIFwiRW1iZWRkZWRCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gZW1iZWRkZWRJbkJpbmRpbmcgPyBgJHtlbWJlZGRlZFNlcGFyYXRvcn0ke2V4cHIudmFsdWV9YCA6IGAke2V4cHIudmFsdWV9YDtcblxuXHRcdGNhc2UgXCJEZWZhdWx0QmluZGluZ1wiOlxuXHRcdGNhc2UgXCJCaW5kaW5nXCI6XG5cdFx0XHRyZXR1cm4gY29tcGlsZUJpbmRpbmdGb3JCaW5kaW5nKGV4cHIsIGVtYmVkZGVkSW5CaW5kaW5nLCBlbWJlZGRlZFNlcGFyYXRvcik7XG5cblx0XHRjYXNlIFwiQ29tcGFyaXNvblwiOlxuXHRcdFx0Y29uc3QgY29tcGFyaXNvbkV4cHJlc3Npb24gPSBjb21waWxlQ29tcGFyaXNvbkV4cHJlc3Npb24oZXhwcik7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGNvbXBhcmlzb25FeHByZXNzaW9uLCBlbWJlZGRlZEluQmluZGluZyk7XG5cblx0XHRjYXNlIFwiSWZFbHNlXCI6XG5cdFx0XHRjb25zdCBpZkVsc2VFeHByZXNzaW9uID0gYCR7Y29tcGlsZUJpbmRpbmcoZXhwci5jb25kaXRpb24sIHRydWUpfSA/ICR7Y29tcGlsZUJpbmRpbmcoZXhwci5vblRydWUsIHRydWUpfSA6ICR7Y29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdGV4cHIub25GYWxzZSxcblx0XHRcdFx0dHJ1ZVxuXHRcdFx0KX1gO1xuXHRcdFx0cmV0dXJuIHdyYXBCaW5kaW5nRXhwcmVzc2lvbihpZkVsc2VFeHByZXNzaW9uLCBlbWJlZGRlZEluQmluZGluZywgdHJ1ZSk7XG5cblx0XHRjYXNlIFwiU2V0XCI6XG5cdFx0XHRjb25zdCBzZXRFeHByZXNzaW9uID0gZXhwci5vcGVyYW5kcy5tYXAob3BlcmFuZCA9PiBjb21waWxlQmluZGluZyhvcGVyYW5kLCB0cnVlKSkuam9pbihgICR7ZXhwci5vcGVyYXRvcn0gYCk7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKHNldEV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nLCB0cnVlKTtcblxuXHRcdGNhc2UgXCJDb25jYXRcIjpcblx0XHRcdGNvbnN0IGNvbmNhdEV4cHJlc3Npb24gPSBleHByLmV4cHJlc3Npb25zLm1hcChuZXN0ZWRFeHByZXNzaW9uID0+IGNvbXBpbGVCaW5kaW5nKG5lc3RlZEV4cHJlc3Npb24sIHRydWUsIHRydWUpKS5qb2luKFwiICsgXCIpO1xuXHRcdFx0cmV0dXJuIHdyYXBCaW5kaW5nRXhwcmVzc2lvbihjb25jYXRFeHByZXNzaW9uLCBlbWJlZGRlZEluQmluZGluZyk7XG5cblx0XHRjYXNlIFwiTGVuZ3RoXCI6XG5cdFx0XHRjb25zdCBsZW5ndGhFeHByZXNzaW9uID0gYCR7Y29tcGlsZUJpbmRpbmcoZXhwci5iaW5kaW5nRXhwcmVzc2lvbiwgdHJ1ZSl9Lmxlbmd0aGA7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGxlbmd0aEV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJOb3RcIjpcblx0XHRcdGNvbnN0IG5vdEV4cHJlc3Npb24gPSBgISR7Y29tcGlsZUJpbmRpbmcoZXhwci5vcGVyYW5kLCB0cnVlKX1gO1xuXHRcdFx0cmV0dXJuIHdyYXBCaW5kaW5nRXhwcmVzc2lvbihub3RFeHByZXNzaW9uLCBlbWJlZGRlZEluQmluZGluZyk7XG5cblx0XHRjYXNlIFwiVHJ1dGh5XCI6XG5cdFx0XHRjb25zdCB0cnV0aHlFeHByZXNzaW9uID0gYCEhJHtjb21waWxlQmluZGluZyhleHByLm9wZXJhbmQsIHRydWUpfWA7XG5cdFx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKHRydXRoeUV4cHJlc3Npb24sIGVtYmVkZGVkSW5CaW5kaW5nKTtcblxuXHRcdGNhc2UgXCJGb3JtYXR0ZXJcIjpcblx0XHRcdGNvbnN0IGZvcm1hdHRlckV4cHJlc3Npb24gPSBjb21waWxlRm9ybWF0dGVyRXhwcmVzc2lvbihleHByKTtcblx0XHRcdHJldHVybiBlbWJlZGRlZEluQmluZGluZyA/IGBcXCQke2Zvcm1hdHRlckV4cHJlc3Npb259YCA6IGZvcm1hdHRlckV4cHJlc3Npb247XG5cblx0XHRjYXNlIFwiQ29tcGxleFR5cGVcIjpcblx0XHRcdGNvbnN0IGNvbXBsZXhUeXBlRXhwcmVzc2lvbiA9IGNvbXBpbGVDb21wbGV4VHlwZUV4cHJlc3Npb24oZXhwcik7XG5cdFx0XHRyZXR1cm4gZW1iZWRkZWRJbkJpbmRpbmcgPyBgXFwkJHtjb21wbGV4VHlwZUV4cHJlc3Npb259YCA6IGNvbXBsZXhUeXBlRXhwcmVzc2lvbjtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0fVxufVxuXG4vKipcbiAqIENvbXBpbGUgYSBjb21wYXJpc29uIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGNvbXBhcmlzb24gZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBjb21waWxlZCBleHByZXNzaW9uLiBOZWVkcyB3cmFwcGluZyBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgYXMgYW4gZXhwcmVzc2lvbiBiaW5kaW5nLlxuICovXG5mdW5jdGlvbiBjb21waWxlQ29tcGFyaXNvbkV4cHJlc3Npb24oZXhwcmVzc2lvbjogQ29tcGFyaXNvbkV4cHJlc3Npb24pIHtcblx0ZnVuY3Rpb24gY29tcGlsZU9wZXJhbmQob3BlcmFuZDogRXhwcmVzc2lvbjxhbnk+KSB7XG5cdFx0Y29uc3QgY29tcGlsZWRPcGVyYW5kID0gY29tcGlsZUJpbmRpbmcob3BlcmFuZCwgdHJ1ZSkgPz8gXCJ1bmRlZmluZWRcIjtcblx0XHRyZXR1cm4gd3JhcEJpbmRpbmdFeHByZXNzaW9uKGNvbXBpbGVkT3BlcmFuZCwgdHJ1ZSwgbmVlZFBhcmVudGhlc2lzKG9wZXJhbmQpKTtcblx0fVxuXG5cdHJldHVybiBgJHtjb21waWxlT3BlcmFuZChleHByZXNzaW9uLm9wZXJhbmQxKX0gJHtleHByZXNzaW9uLm9wZXJhdG9yfSAke2NvbXBpbGVPcGVyYW5kKGV4cHJlc3Npb24ub3BlcmFuZDIpfWA7XG59XG5cbi8qKlxuICogQ29tcGlsZSBhIGZvcm1hdHRlciBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBmb3JtYXR0ZXIgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBjb21waWxlZCBleHByZXNzaW9uLlxuICovXG5mdW5jdGlvbiBjb21waWxlRm9ybWF0dGVyRXhwcmVzc2lvbjxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcmVzc2lvbjogRm9ybWF0dGVyRXhwcmVzc2lvbjxUPikge1xuXHRpZiAoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBgeyR7Y29tcGlsZVBhdGhQYXJhbWV0ZXIoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzWzBdLCB0cnVlKX0sIGZvcm1hdHRlcjogJyR7ZXhwcmVzc2lvbi5mbn0nfWA7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgcGFydHMgPSBleHByZXNzaW9uLnBhcmFtZXRlcnMubWFwKHBhcmFtID0+IGNvbXBpbGVQYXRoUGFyYW1ldGVyKHBhcmFtKSk7XG5cdFx0cmV0dXJuIGB7cGFydHM6IFske3BhcnRzLmpvaW4oXCIsIFwiKX1dLCBmb3JtYXR0ZXI6ICcke2V4cHJlc3Npb24uZm59J31gO1xuXHR9XG59XG5cbi8qKlxuICogQ29tcGlsZSB0aGUgcGF0aCBwYXJhbWV0ZXIgb2YgYSBmb3JtYXR0ZXIgY2FsbC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgYmluZGluZyBwYXJ0IHRvIGV2YWx1YXRlXG4gKiBAcGFyYW0gc2luZ2xlUGF0aCBXaGV0aGVyIHRoZXJlIGlzIG9uZSBvciBtdWx0aXBsZSBwYXRoIHRvIGNvbnNpZGVyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc3RyaW5nIHNuaXBwZXQgdG8gaW5jbHVkZSBpbiB0aGUgb3ZlcmFsbCBiaW5kaW5nIGRlZmluaXRpb25cbiAqL1xuZnVuY3Rpb24gY29tcGlsZVBhdGhQYXJhbWV0ZXIoZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxhbnk+LCBzaW5nbGVQYXRoID0gZmFsc2UpOiBzdHJpbmcge1xuXHRsZXQgb3V0VmFsdWUgPSBcIlwiO1xuXHRpZiAoZXhwcmVzc2lvbi5fdHlwZSA9PT0gXCJDb25zdGFudFwiKSB7XG5cdFx0c3dpdGNoICh0eXBlb2YgZXhwcmVzc2lvbi52YWx1ZSkge1xuXHRcdFx0Y2FzZSBcIm51bWJlclwiOlxuXHRcdFx0Y2FzZSBcImJpZ2ludFwiOlxuXHRcdFx0XHRvdXRWYWx1ZSA9IGB2YWx1ZTogJHtleHByZXNzaW9uLnZhbHVlLnRvU3RyaW5nKCl9YDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwic3RyaW5nXCI6XG5cdFx0XHRcdG91dFZhbHVlID0gYHZhbHVlOiAnJHtlc2NhcGVYbWxBdHRyaWJ1dGUoZXhwcmVzc2lvbi52YWx1ZS50b1N0cmluZygpKX0nYDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiYm9vbGVhblwiOlxuXHRcdFx0XHRvdXRWYWx1ZSA9IGB2YWx1ZTogJyR7ZXhwcmVzc2lvbi52YWx1ZS50b1N0cmluZygpfSdgO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdG91dFZhbHVlID0gXCJ2YWx1ZTogJydcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGV4cHJlc3Npb24uX3R5cGUgPT09IFwiRGVmYXVsdEJpbmRpbmdcIiB8fCBleHByZXNzaW9uLl90eXBlID09PSBcIkJpbmRpbmdcIikge1xuXHRcdG91dFZhbHVlID0gYHBhdGg6ICcke2NvbXBpbGVCaW5kaW5nUGF0aChleHByZXNzaW9uKX0nYDtcblxuXHRcdG91dFZhbHVlICs9IGV4cHJlc3Npb24udHlwZSA/IGAsIHR5cGU6ICcke2V4cHJlc3Npb24udHlwZX0nYCA6IGAsIHRhcmdldFR5cGU6ICdhbnknYDtcblxuXHRcdGlmIChoYXNFbGVtZW50cyhleHByZXNzaW9uLmNvbnN0cmFpbnRzKSkge1xuXHRcdFx0b3V0VmFsdWUgKz0gYCwgY29uc3RyYWludHM6ICR7Y29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbi5jb25zdHJhaW50cyl9YDtcblx0XHR9XG5cdFx0aWYgKGhhc0VsZW1lbnRzKGV4cHJlc3Npb24uZm9ybWF0T3B0aW9ucykpIHtcblx0XHRcdG91dFZhbHVlICs9IGAsIGZvcm1hdE9wdGlvbnM6ICR7Y29tcGlsZUJpbmRpbmcoZXhwcmVzc2lvbi5mb3JtYXRPcHRpb25zKX1gO1xuXHRcdH1cblx0XHRpZiAoaGFzRWxlbWVudHMoZXhwcmVzc2lvbi5wYXJhbWV0ZXJzKSkge1xuXHRcdFx0b3V0VmFsdWUgKz0gYCwgcGFyYW1ldGVyczogJHtjb21waWxlQmluZGluZyhleHByZXNzaW9uLnBhcmFtZXRlcnMpfWA7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cdHJldHVybiBzaW5nbGVQYXRoID8gb3V0VmFsdWUgOiBgeyR7b3V0VmFsdWV9fWA7XG59XG5cbmZ1bmN0aW9uIGhhc0VsZW1lbnRzKG9iajogYW55KSB7XG5cdHJldHVybiBvYmogJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIENvbXBpbGUgYSBiaW5kaW5nIGV4cHJlc3Npb24gcGF0aC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBjb21waWxlLlxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVCaW5kaW5nUGF0aDxUIGV4dGVuZHMgUHJpbWl0aXZlVHlwZT4oZXhwcmVzc2lvbjogQmluZGluZ0V4cHJlc3Npb25FeHByZXNzaW9uPFQ+IHwgRGVmYXVsdEJpbmRpbmdFeHByZXNzaW9uRXhwcmVzc2lvbjxUPikge1xuXHRyZXR1cm4gYCR7ZXhwcmVzc2lvbi5tb2RlbE5hbWUgPyBleHByZXNzaW9uLm1vZGVsTmFtZSArIFwiPlwiIDogXCJcIn0ke2V4cHJlc3Npb24ucGF0aH1gO1xufVxuIl19
|