@sapui5/sap.fe.core 1.99.0 → 1.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -2
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +1 -69
- package/src/sap/fe/core/AnnotationHelper.ts +0 -70
- package/src/sap/fe/core/AppComponent.js +388 -399
- package/src/sap/fe/core/AppComponent.ts +403 -0
- package/src/sap/fe/core/AppStateHandler.js +127 -158
- package/src/sap/fe/core/BaseController.js +82 -58
- package/src/sap/fe/core/BaseController.ts +68 -0
- package/src/sap/fe/core/CommonUtils.js +111 -20
- package/src/sap/fe/core/CommonUtils.ts +131 -32
- package/src/sap/fe/core/ExtensionAPI.js +278 -274
- package/src/sap/fe/core/ExtensionAPI.ts +250 -0
- package/src/sap/fe/core/PageController.js +157 -29
- package/src/sap/fe/core/PageController.ts +60 -32
- package/src/sap/fe/core/RouterProxy.js +694 -756
- package/src/sap/fe/core/RouterProxy.ts +11 -9
- package/src/sap/fe/core/Synchronization.js +21 -31
- package/src/sap/fe/core/TemplateComponent.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +10 -3
- package/src/sap/fe/core/TemplateModel.js +20 -38
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/TransactionHelper.js +1354 -1370
- package/src/sap/fe/core/TransactionHelper.ts +33 -22
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
- package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
- package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
- package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
- package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
- package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
- package/src/sap/fe/core/actions/draft.js +30 -68
- package/src/sap/fe/core/actions/draft.ts +44 -71
- package/src/sap/fe/core/actions/messageHandling.js +55 -36
- package/src/sap/fe/core/actions/messageHandling.ts +66 -46
- package/src/sap/fe/core/actions/operations.js +34 -15
- package/src/sap/fe/core/actions/operations.ts +48 -18
- package/src/sap/fe/core/actions/sticky.js +17 -4
- package/src/sap/fe/core/actions/sticky.ts +21 -4
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +69 -66
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1593 -1669
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +718 -779
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1004 -1005
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +487 -521
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -2
- package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +233 -244
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
- package/src/sap/fe/core/controllerextensions/PageReady.js +301 -336
- package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -10
- package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
- package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
- package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
- package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
- package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
- package/src/sap/fe/core/controllerextensions/Share.js +230 -268
- package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +592 -633
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -7
- package/src/sap/fe/core/controllerextensions/ViewState.js +788 -806
- package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
- package/src/sap/fe/core/controls/CommandExecution.js +67 -66
- package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
- package/src/sap/fe/core/controls/ConditionalWrapper.js +90 -75
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +130 -125
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +103 -112
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
- package/src/sap/fe/core/controls/FieldWrapper.js +122 -135
- package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
- package/src/sap/fe/core/controls/FilterBar.js +162 -159
- package/src/sap/fe/core/controls/FilterBar.ts +143 -0
- package/src/sap/fe/core/controls/FormElementWrapper.js +45 -39
- package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +126 -116
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +241 -255
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +150 -141
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +74 -74
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
- package/src/sap/fe/core/converters/ConverterContext.js +348 -379
- package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
- package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +12 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
- package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
- package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
- package/src/sap/fe/core/converters/annotations/DataField.js +26 -12
- package/src/sap/fe/core/converters/annotations/DataField.ts +37 -13
- package/src/sap/fe/core/converters/controls/Common/Form.js +2 -2
- package/src/sap/fe/core/converters/controls/Common/Form.ts +4 -2
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +130 -23
- package/src/sap/fe/core/converters/controls/Common/Table.ts +134 -29
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +118 -53
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +156 -93
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +161 -207
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +148 -206
- package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
- package/src/sap/fe/core/converters/helpers/Key.js +42 -57
- package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +25 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +20 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +10 -4
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +15 -4
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
- package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
- package/src/sap/fe/core/fpm/Component.js +50 -54
- package/src/sap/fe/core/fpm/Component.ts +48 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
- package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
- package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
- package/src/sap/fe/core/helpers/ClassSupport.js +186 -62
- package/src/sap/fe/core/helpers/ClassSupport.ts +168 -52
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js +601 -684
- package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +5 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +4 -0
- package/src/sap/fe/core/library.js +426 -451
- package/src/sap/fe/core/library.support.js +22 -33
- package/src/sap/fe/core/library.support.ts +23 -0
- package/src/sap/fe/core/library.ts +420 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -1
- package/src/sap/fe/core/messagebundle.properties +22 -5
- package/src/sap/fe/core/messagebundle_ar.properties +27 -7
- package/src/sap/fe/core/messagebundle_bg.properties +27 -7
- package/src/sap/fe/core/messagebundle_ca.properties +27 -7
- package/src/sap/fe/core/messagebundle_cs.properties +27 -7
- package/src/sap/fe/core/messagebundle_cy.properties +27 -7
- package/src/sap/fe/core/messagebundle_da.properties +27 -7
- package/src/sap/fe/core/messagebundle_de.properties +27 -7
- package/src/sap/fe/core/messagebundle_el.properties +27 -7
- package/src/sap/fe/core/messagebundle_en.properties +27 -7
- package/src/sap/fe/core/messagebundle_en_GB.properties +27 -7
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -7
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +27 -7
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +27 -7
- package/src/sap/fe/core/messagebundle_es.properties +27 -7
- package/src/sap/fe/core/messagebundle_es_MX.properties +27 -7
- package/src/sap/fe/core/messagebundle_et.properties +27 -7
- package/src/sap/fe/core/messagebundle_fi.properties +28 -8
- package/src/sap/fe/core/messagebundle_fr.properties +28 -8
- package/src/sap/fe/core/messagebundle_fr_CA.properties +29 -9
- package/src/sap/fe/core/messagebundle_hi.properties +27 -7
- package/src/sap/fe/core/messagebundle_hr.properties +27 -7
- package/src/sap/fe/core/messagebundle_hu.properties +27 -7
- package/src/sap/fe/core/messagebundle_id.properties +27 -7
- package/src/sap/fe/core/messagebundle_it.properties +27 -7
- package/src/sap/fe/core/messagebundle_iw.properties +27 -7
- package/src/sap/fe/core/messagebundle_ja.properties +26 -6
- package/src/sap/fe/core/messagebundle_kk.properties +27 -7
- package/src/sap/fe/core/messagebundle_ko.properties +27 -7
- package/src/sap/fe/core/messagebundle_lt.properties +27 -7
- package/src/sap/fe/core/messagebundle_lv.properties +28 -8
- package/src/sap/fe/core/messagebundle_ms.properties +27 -7
- package/src/sap/fe/core/messagebundle_nl.properties +27 -7
- package/src/sap/fe/core/messagebundle_no.properties +27 -7
- package/src/sap/fe/core/messagebundle_pl.properties +27 -7
- package/src/sap/fe/core/messagebundle_pt.properties +28 -8
- package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -7
- package/src/sap/fe/core/messagebundle_ro.properties +27 -7
- package/src/sap/fe/core/messagebundle_ru.properties +27 -7
- package/src/sap/fe/core/messagebundle_sh.properties +27 -7
- package/src/sap/fe/core/messagebundle_sk.properties +27 -7
- package/src/sap/fe/core/messagebundle_sl.properties +27 -7
- package/src/sap/fe/core/messagebundle_sv.properties +27 -7
- package/src/sap/fe/core/messagebundle_th.properties +26 -6
- package/src/sap/fe/core/messagebundle_tr.properties +30 -10
- package/src/sap/fe/core/messagebundle_uk.properties +27 -7
- package/src/sap/fe/core/messagebundle_vi.properties +27 -7
- package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -7
- package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -7
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +154 -192
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +66 -92
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js +284 -339
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -13
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +67 -102
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +5 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.js +754 -814
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -13
- package/src/sap/fe/core/services/ShellServicesFactory.js +649 -736
- package/src/sap/fe/core/services/ShellServicesFactory.ts +7 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +567 -592
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +22 -3
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +354 -386
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +21 -14
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.ts +1 -1
- package/src/sap/fe/core/support/Diagnostics.js +36 -48
- package/src/sap/fe/core/templating/DataModelPathHelper.js +93 -85
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +104 -95
- package/src/sap/fe/core/templating/FilterHelper.js +25 -32
- package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
- 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 +32 -26
- package/src/sap/fe/core/templating/UIFormatters.ts +37 -24
|
@@ -14,647 +14,627 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
14
14
|
|
|
15
15
|
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; }
|
|
16
16
|
|
|
17
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
18
|
-
|
|
19
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
20
|
-
|
|
21
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
22
|
-
|
|
23
17
|
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
|
24
18
|
|
|
25
19
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
26
20
|
|
|
27
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
28
|
-
|
|
29
|
-
function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
|
|
30
|
-
|
|
31
|
-
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
32
|
-
|
|
33
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
34
|
-
|
|
35
|
-
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|
36
|
-
|
|
37
21
|
var SideEffectsService = /*#__PURE__*/function (_Service) {
|
|
38
22
|
_inherits(SideEffectsService, _Service);
|
|
39
23
|
|
|
40
|
-
var _super = _createSuper(SideEffectsService);
|
|
41
|
-
|
|
42
24
|
function SideEffectsService() {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return _super.apply(this, arguments);
|
|
25
|
+
return _Service.apply(this, arguments) || this;
|
|
46
26
|
}
|
|
47
27
|
|
|
48
28
|
_exports.SideEffectsService = SideEffectsService;
|
|
29
|
+
var _proto = SideEffectsService.prototype;
|
|
30
|
+
|
|
31
|
+
// !: means that we know it will be assigned before usage
|
|
32
|
+
_proto.init = function init() {
|
|
33
|
+
this._oSideEffectsType = {
|
|
34
|
+
oData: {
|
|
35
|
+
entities: {},
|
|
36
|
+
actions: {}
|
|
37
|
+
},
|
|
38
|
+
control: {}
|
|
39
|
+
};
|
|
40
|
+
this._bInitialized = false;
|
|
41
|
+
this.initPromise = Promise.resolve(this);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Adds a SideEffects control
|
|
45
|
+
* SideEffects definition is added by a control to keep data up to date
|
|
46
|
+
* These SideEffects get limited scope compared with SideEffects coming from an OData service:
|
|
47
|
+
* - Only one SideEffects definition can be defined for the combination entity type - control Id
|
|
48
|
+
* - Only SideEffects source properties are recognized and used to trigger SideEffects
|
|
49
|
+
*
|
|
50
|
+
* Ensure the sourceControlId matches the associated SAPUI5 control ID.
|
|
51
|
+
*
|
|
52
|
+
* @private
|
|
53
|
+
* @ui5-restricted
|
|
54
|
+
* @param {string} sEntityType Name of the entity type
|
|
55
|
+
* @param {object} oSideEffect SideEffects definition
|
|
56
|
+
*/
|
|
57
|
+
;
|
|
58
|
+
|
|
59
|
+
_proto.addControlSideEffects = function addControlSideEffects(sEntityType, oSideEffect) {
|
|
60
|
+
if (oSideEffect.sourceControlId) {
|
|
61
|
+
var oControlSideEffect = _objectSpread(_objectSpread({}, oSideEffect), {}, {
|
|
62
|
+
fullyQualifiedName: sEntityType + "/SideEffectsForControl/" + oSideEffect.sourceControlId
|
|
63
|
+
});
|
|
49
64
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
function init() {
|
|
54
|
-
this._oSideEffectsType = {
|
|
55
|
-
oData: {
|
|
56
|
-
entities: {},
|
|
57
|
-
actions: {}
|
|
58
|
-
},
|
|
59
|
-
control: {}
|
|
60
|
-
};
|
|
61
|
-
this._bInitialized = false;
|
|
62
|
-
this.initPromise = Promise.resolve(this);
|
|
65
|
+
var mEntityControlSideEffects = this._oSideEffectsType.control[sEntityType] || {};
|
|
66
|
+
mEntityControlSideEffects[oControlSideEffect.sourceControlId] = oControlSideEffect;
|
|
67
|
+
this._oSideEffectsType.control[sEntityType] = mEntityControlSideEffects;
|
|
63
68
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Executes SideEffects action.
|
|
72
|
+
*
|
|
73
|
+
* @private
|
|
74
|
+
* @ui5-restricted
|
|
75
|
+
* @param {string} sTriggerAction Name of the action
|
|
76
|
+
* @param {object} oContext Context
|
|
77
|
+
* @param {string} sGroupId The group ID to be used for the request
|
|
78
|
+
* @returns {Promise} A promise that is resolved without data or with a return value context when the action call succeeded
|
|
79
|
+
*/
|
|
80
|
+
;
|
|
81
|
+
|
|
82
|
+
_proto.executeAction = function executeAction(sTriggerAction, oContext, sGroupId) {
|
|
83
|
+
var oTriggerAction = oContext.getModel().bindContext(sTriggerAction + "(...)", oContext);
|
|
84
|
+
return oTriggerAction.execute(sGroupId || oContext.getBinding().getUpdateGroupId());
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Gets converted OData metaModel.
|
|
88
|
+
*
|
|
89
|
+
* @private
|
|
90
|
+
* @ui5-restricted
|
|
91
|
+
* @returns {object} Converted OData metaModel
|
|
92
|
+
*/
|
|
93
|
+
;
|
|
94
|
+
|
|
95
|
+
_proto.getConvertedMetaModel = function getConvertedMetaModel() {
|
|
96
|
+
var oContext = this.getContext();
|
|
97
|
+
var oComponent = oContext.scopeObject;
|
|
98
|
+
var oMetaModel = oComponent.getModel().getMetaModel();
|
|
99
|
+
return convertTypes(oMetaModel, this._oCapabilities);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Gets the entity type of a context.
|
|
103
|
+
*
|
|
104
|
+
* @function
|
|
105
|
+
* @name getEntityTypeFromContext
|
|
106
|
+
* @param {object} oContext Context
|
|
107
|
+
* @returns {string | undefined } Entity Type
|
|
108
|
+
*/
|
|
109
|
+
;
|
|
110
|
+
|
|
111
|
+
_proto.getEntityTypeFromContext = function getEntityTypeFromContext(oContext) {
|
|
112
|
+
var oMetaModel = oContext.getModel().getMetaModel(),
|
|
113
|
+
sMetaPath = oMetaModel.getMetaPath(oContext.getPath()),
|
|
114
|
+
sEntityType = oMetaModel.getObject(sMetaPath)["$Type"];
|
|
115
|
+
return sEntityType;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Gets the SideEffects that come from an OData service.
|
|
119
|
+
*
|
|
120
|
+
* @private
|
|
121
|
+
* @ui5-restricted
|
|
122
|
+
* @param {string} sEntityTypeName Name of the entity type
|
|
123
|
+
* @returns {object} SideEffects dictionary
|
|
124
|
+
*/
|
|
125
|
+
;
|
|
126
|
+
|
|
127
|
+
_proto.getODataEntitySideEffects = function getODataEntitySideEffects(sEntityTypeName) {
|
|
128
|
+
return this._oSideEffectsType.oData.entities[sEntityTypeName] || {};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Gets the SideEffects that come from an OData service.
|
|
132
|
+
*
|
|
133
|
+
* @private
|
|
134
|
+
* @ui5-restricted
|
|
135
|
+
* @param {string} sActionName Name of the action
|
|
136
|
+
* @param {object} oContext Context
|
|
137
|
+
* @returns {object} SideEffects definition
|
|
138
|
+
*/
|
|
139
|
+
;
|
|
140
|
+
|
|
141
|
+
_proto.getODataActionSideEffects = function getODataActionSideEffects(sActionName, oContext) {
|
|
142
|
+
if (oContext) {
|
|
143
|
+
var sEntityType = this.getEntityTypeFromContext(oContext);
|
|
144
|
+
|
|
145
|
+
if (sEntityType) {
|
|
146
|
+
var _this$_oSideEffectsTy;
|
|
147
|
+
|
|
148
|
+
return (_this$_oSideEffectsTy = this._oSideEffectsType.oData.actions[sEntityType]) === null || _this$_oSideEffectsTy === void 0 ? void 0 : _this$_oSideEffectsTy[sActionName];
|
|
90
149
|
}
|
|
91
150
|
}
|
|
92
|
-
/**
|
|
93
|
-
* Executes SideEffects action.
|
|
94
|
-
*
|
|
95
|
-
* @private
|
|
96
|
-
* @ui5-restricted
|
|
97
|
-
* @param {string} sTriggerAction Name of the action
|
|
98
|
-
* @param {object} oContext Context
|
|
99
|
-
* @param {string} sGroupId The group ID to be used for the request
|
|
100
|
-
*/
|
|
101
|
-
|
|
102
|
-
}, {
|
|
103
|
-
key: "executeAction",
|
|
104
|
-
value: function executeAction(sTriggerAction, oContext, sGroupId) {
|
|
105
|
-
var oTriggerAction = oContext.getModel().bindContext(sTriggerAction + "(...)", oContext);
|
|
106
|
-
oTriggerAction.execute(sGroupId || oContext.getBinding().getUpdateGroupId());
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Gets converted OData metaModel.
|
|
110
|
-
*
|
|
111
|
-
* @private
|
|
112
|
-
* @ui5-restricted
|
|
113
|
-
* @returns {object} Converted OData metaModel
|
|
114
|
-
*/
|
|
115
|
-
|
|
116
|
-
}, {
|
|
117
|
-
key: "getConvertedMetaModel",
|
|
118
|
-
value: function getConvertedMetaModel() {
|
|
119
|
-
var oContext = this.getContext();
|
|
120
|
-
var oComponent = oContext.scopeObject;
|
|
121
|
-
var oMetaModel = oComponent.getModel().getMetaModel();
|
|
122
|
-
return convertTypes(oMetaModel, this._oCapabilities);
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Gets the entity type of a context.
|
|
126
|
-
*
|
|
127
|
-
* @function
|
|
128
|
-
* @name getEntityTypeFromContext
|
|
129
|
-
* @param {object} oContext Context
|
|
130
|
-
* @returns {string | undefined } Entity Type
|
|
131
|
-
*/
|
|
132
|
-
|
|
133
|
-
}, {
|
|
134
|
-
key: "getEntityTypeFromContext",
|
|
135
|
-
value: function getEntityTypeFromContext(oContext) {
|
|
136
|
-
var oMetaModel = oContext.getModel().getMetaModel(),
|
|
137
|
-
sMetaPath = oMetaModel.getMetaPath(oContext.getPath()),
|
|
138
|
-
sEntityType = oMetaModel.getObject(sMetaPath)["$Type"];
|
|
139
|
-
return sEntityType;
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Gets the SideEffects that come from an OData service.
|
|
143
|
-
*
|
|
144
|
-
* @private
|
|
145
|
-
* @ui5-restricted
|
|
146
|
-
* @param {string} sEntityTypeName Name of the entity type
|
|
147
|
-
* @returns {object} SideEffects dictionary
|
|
148
|
-
*/
|
|
149
151
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Generates the dictionary for the SideEffects.
|
|
156
|
+
*
|
|
157
|
+
* @private
|
|
158
|
+
* @ui5-restricted
|
|
159
|
+
* @param oCapabilities The current capabilities
|
|
160
|
+
*/
|
|
161
|
+
;
|
|
162
|
+
|
|
163
|
+
_proto.initializeSideEffects = function initializeSideEffects(oCapabilities) {
|
|
164
|
+
var _this = this;
|
|
165
|
+
|
|
166
|
+
this._oCapabilities = oCapabilities;
|
|
167
|
+
|
|
168
|
+
if (!this._bInitialized) {
|
|
169
|
+
var oConvertedMetaModel = this.getConvertedMetaModel();
|
|
170
|
+
oConvertedMetaModel.entityTypes.forEach(function (entityType) {
|
|
171
|
+
_this._oSideEffectsType.oData.entities[entityType.fullyQualifiedName] = _this._retrieveODataEntitySideEffects(entityType);
|
|
172
|
+
_this._oSideEffectsType.oData.actions[entityType.fullyQualifiedName] = _this._retrieveODataActionsSideEffects(entityType); // only bound actions are analyzed since unbound ones don't get SideEffects
|
|
173
|
+
});
|
|
174
|
+
this._bInitialized = true;
|
|
154
175
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
if (sEntityType) {
|
|
172
|
-
var _this$_oSideEffectsTy;
|
|
173
|
-
|
|
174
|
-
return (_this$_oSideEffectsTy = this._oSideEffectsType.oData.actions[sEntityType]) === null || _this$_oSideEffectsTy === void 0 ? void 0 : _this$_oSideEffectsTy[sActionName];
|
|
175
|
-
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Removes all SideEffects related to a control.
|
|
179
|
+
*
|
|
180
|
+
* @private
|
|
181
|
+
* @ui5-restricted
|
|
182
|
+
* @param {string} sControlId Control Id
|
|
183
|
+
*/
|
|
184
|
+
;
|
|
185
|
+
|
|
186
|
+
_proto.removeControlSideEffects = function removeControlSideEffects(sControlId) {
|
|
187
|
+
var _this2 = this;
|
|
188
|
+
|
|
189
|
+
Object.keys(this._oSideEffectsType.control).forEach(function (sEntityType) {
|
|
190
|
+
if (_this2._oSideEffectsType.control[sEntityType][sControlId]) {
|
|
191
|
+
delete _this2._oSideEffectsType.control[sEntityType][sControlId];
|
|
176
192
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Request SideEffects on a specific context.
|
|
197
|
+
*
|
|
198
|
+
* @function
|
|
199
|
+
* @name requestSideEffects
|
|
200
|
+
* @param {Array} aPathExpressions Targets of SideEffects to be executed
|
|
201
|
+
* @param {object} oContext Context where SideEffects need to be executed
|
|
202
|
+
* @param {string} sGroupId The group ID to be used for the request
|
|
203
|
+
* @returns {Promise} Promise on SideEffects request
|
|
204
|
+
*/
|
|
205
|
+
;
|
|
206
|
+
|
|
207
|
+
_proto.requestSideEffects = function requestSideEffects(aPathExpressions, oContext, sGroupId) {
|
|
208
|
+
this._logRequest(aPathExpressions, oContext);
|
|
209
|
+
|
|
210
|
+
var oPromise;
|
|
180
211
|
/**
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
* @private
|
|
184
|
-
* @ui5-restricted
|
|
185
|
-
* @param oCapabilities The current capabilities
|
|
212
|
+
* Context.requestSideEffects either returns a promise or throws a new error. This return is caught if an error is thrown
|
|
213
|
+
* to avoid breaking the promise chain.
|
|
186
214
|
*/
|
|
187
215
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
216
|
+
try {
|
|
217
|
+
oPromise = oContext.requestSideEffects(aPathExpressions, sGroupId);
|
|
218
|
+
} catch (e) {
|
|
219
|
+
oPromise = Promise.reject(e);
|
|
220
|
+
}
|
|
192
221
|
|
|
193
|
-
|
|
222
|
+
return oPromise;
|
|
223
|
+
};
|
|
194
224
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
_this._oSideEffectsType.oData.actions[entityType.fullyQualifiedName] = _this._retrieveODataActionsSideEffects(entityType); // only bound actions are analyzed since unbound ones don't get SideEffects
|
|
200
|
-
});
|
|
201
|
-
this._bInitialized = true;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Removes all SideEffects related to a control.
|
|
206
|
-
*
|
|
207
|
-
* @private
|
|
208
|
-
* @ui5-restricted
|
|
209
|
-
* @param {string} sControlId Control Id
|
|
210
|
-
*/
|
|
225
|
+
_proto.requestSideEffectsForODataAction = function requestSideEffectsForODataAction(sideEffects, oContext) {
|
|
226
|
+
var _sideEffects$triggerA,
|
|
227
|
+
_this3 = this,
|
|
228
|
+
_sideEffects$pathExpr;
|
|
211
229
|
|
|
212
|
-
|
|
213
|
-
key: "removeControlSideEffects",
|
|
214
|
-
value: function removeControlSideEffects(sControlId) {
|
|
215
|
-
var _this2 = this;
|
|
230
|
+
var aPromises;
|
|
216
231
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
}
|
|
232
|
+
if ((_sideEffects$triggerA = sideEffects.triggerActions) !== null && _sideEffects$triggerA !== void 0 && _sideEffects$triggerA.length) {
|
|
233
|
+
aPromises = sideEffects.triggerActions.map(function (sTriggerActionName) {
|
|
234
|
+
return _this3.executeAction(sTriggerActionName, oContext);
|
|
221
235
|
});
|
|
236
|
+
} else {
|
|
237
|
+
aPromises = [];
|
|
222
238
|
}
|
|
223
|
-
/**
|
|
224
|
-
* Request SideEffects on a specific context.
|
|
225
|
-
*
|
|
226
|
-
* @function
|
|
227
|
-
* @name requestSideEffects
|
|
228
|
-
* @param {Array} aPathExpressions Targets of SideEffects to be executed
|
|
229
|
-
* @param {object} oContext Context where SideEffects need to be executed
|
|
230
|
-
* @param {string} sGroupId The group ID to be used for the request
|
|
231
|
-
* @returns {Promise} Promise on SideEffects request
|
|
232
|
-
*/
|
|
233
|
-
|
|
234
|
-
}, {
|
|
235
|
-
key: "requestSideEffects",
|
|
236
|
-
value: function requestSideEffects(aPathExpressions, oContext, sGroupId) {
|
|
237
|
-
this._logRequest(aPathExpressions, oContext);
|
|
238
|
-
|
|
239
|
-
var oPromise;
|
|
240
|
-
/**
|
|
241
|
-
* Context.requestSideEffects either returns a promise or throws a new error. This return is caught if an error is thrown
|
|
242
|
-
* to avoid breaking the promise chain.
|
|
243
|
-
*/
|
|
244
239
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
} catch (e) {
|
|
248
|
-
oPromise = Promise.reject(e);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
return oPromise;
|
|
240
|
+
if ((_sideEffects$pathExpr = sideEffects.pathExpressions) !== null && _sideEffects$pathExpr !== void 0 && _sideEffects$pathExpr.length) {
|
|
241
|
+
aPromises.push(this.requestSideEffects(sideEffects.pathExpressions, oContext));
|
|
252
242
|
}
|
|
253
|
-
/**
|
|
254
|
-
* Request SideEffects for a navigation property on a specific context.
|
|
255
|
-
*
|
|
256
|
-
* @function
|
|
257
|
-
* @name requestSideEffectsForNavigationProperty
|
|
258
|
-
* @param {string} sNavigationProperty Navigation property
|
|
259
|
-
* @param {object} oContext Context where SideEffects need to be executed
|
|
260
|
-
* @returns {object} SideEffects request on SAPUI5 context
|
|
261
|
-
*/
|
|
262
|
-
|
|
263
|
-
}, {
|
|
264
|
-
key: "requestSideEffectsForNavigationProperty",
|
|
265
|
-
value: function requestSideEffectsForNavigationProperty(sNavigationProperty, oContext) {
|
|
266
|
-
var _this3 = this;
|
|
267
|
-
|
|
268
|
-
var sBaseEntityType = this.getEntityTypeFromContext(oContext);
|
|
269
243
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
244
|
+
return aPromises.length ? Promise.all(aPromises) : Promise.resolve();
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Request SideEffects for a navigation property on a specific context.
|
|
248
|
+
*
|
|
249
|
+
* @function
|
|
250
|
+
* @name requestSideEffectsForNavigationProperty
|
|
251
|
+
* @param {string} sNavigationProperty Navigation property
|
|
252
|
+
* @param {object} oContext Context where SideEffects need to be executed
|
|
253
|
+
* @returns {object} SideEffects request on SAPUI5 context
|
|
254
|
+
*/
|
|
255
|
+
;
|
|
256
|
+
|
|
257
|
+
_proto.requestSideEffectsForNavigationProperty = function requestSideEffectsForNavigationProperty(sNavigationProperty, oContext) {
|
|
258
|
+
var _this4 = this;
|
|
259
|
+
|
|
260
|
+
var sBaseEntityType = this.getEntityTypeFromContext(oContext);
|
|
261
|
+
|
|
262
|
+
if (sBaseEntityType) {
|
|
263
|
+
var sNavigationPath = sNavigationProperty + "/";
|
|
264
|
+
var aSideEffects = this.getODataEntitySideEffects(sBaseEntityType);
|
|
265
|
+
var aTargets = [];
|
|
266
|
+
Object.keys(aSideEffects).filter( // Keep relevant SideEffects
|
|
267
|
+
function (sAnnotationName) {
|
|
268
|
+
var oSideEffects = aSideEffects[sAnnotationName];
|
|
269
|
+
return (oSideEffects.SourceProperties || []).some(function (oPropertyPath) {
|
|
270
|
+
var sPropertyPath = oPropertyPath.value;
|
|
271
|
+
return sPropertyPath.startsWith(sNavigationPath) && sPropertyPath.replace(sNavigationPath, "").indexOf("/") === -1;
|
|
272
|
+
}) || (oSideEffects.SourceEntities || []).some(function (oNavigationPropertyPath) {
|
|
273
|
+
return oNavigationPropertyPath.value === sNavigationProperty;
|
|
274
|
+
});
|
|
275
|
+
}).forEach(function (sAnnotationName) {
|
|
276
|
+
var oSideEffects = aSideEffects[sAnnotationName];
|
|
285
277
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
278
|
+
if (oSideEffects.TriggerAction) {
|
|
279
|
+
_this4.executeAction(oSideEffects.TriggerAction, oContext);
|
|
280
|
+
}
|
|
289
281
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
282
|
+
(oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []).forEach(function (mTarget) {
|
|
283
|
+
return aTargets.push(mTarget);
|
|
284
|
+
});
|
|
285
|
+
}); // Remove duplicate properties
|
|
294
286
|
|
|
295
|
-
|
|
287
|
+
aTargets = this._removeDuplicateTargets(aTargets);
|
|
296
288
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
}
|
|
289
|
+
if (aTargets.length > 0) {
|
|
290
|
+
return this.requestSideEffects(aTargets, oContext).catch(function (oError) {
|
|
291
|
+
return Log.error("SideEffects - Error while processing SideEffects for Navigation Property " + sNavigationProperty, oError);
|
|
292
|
+
});
|
|
302
293
|
}
|
|
303
|
-
|
|
304
|
-
return Promise.resolve();
|
|
305
294
|
}
|
|
306
|
-
/**
|
|
307
|
-
* Gets the SideEffects that come from controls.
|
|
308
|
-
*
|
|
309
|
-
* @private
|
|
310
|
-
* @ui5-restricted
|
|
311
|
-
* @param {string} sEntityTypeName Entity type Name
|
|
312
|
-
* @returns {object} SideEffects dictionary
|
|
313
|
-
*/
|
|
314
295
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
navigationPath: sRelativePath
|
|
368
|
-
|
|
369
|
-
|
|
296
|
+
return Promise.resolve();
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Gets the SideEffects that come from controls.
|
|
300
|
+
*
|
|
301
|
+
* @private
|
|
302
|
+
* @ui5-restricted
|
|
303
|
+
* @param {string} sEntityTypeName Entity type Name
|
|
304
|
+
* @returns {object} SideEffects dictionary
|
|
305
|
+
*/
|
|
306
|
+
;
|
|
307
|
+
|
|
308
|
+
_proto.getControlEntitySideEffects = function getControlEntitySideEffects(sEntityTypeName) {
|
|
309
|
+
return this._oSideEffectsType.control[sEntityTypeName] || {};
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Adds the text properties required for SideEffects
|
|
313
|
+
* If a property has an associated text then this text needs to be added as targetProperties or targetEntities.
|
|
314
|
+
*
|
|
315
|
+
* @private
|
|
316
|
+
* @ui5-restricted
|
|
317
|
+
* @param {object} oSideEffect SideEffects definition
|
|
318
|
+
* @param {object} mEntityType Entity type
|
|
319
|
+
* @returns {object} SideEffects definition with added text properties
|
|
320
|
+
*/
|
|
321
|
+
;
|
|
322
|
+
|
|
323
|
+
_proto._addRequiredTextProperties = function _addRequiredTextProperties(oSideEffect, mEntityType) {
|
|
324
|
+
var aInitialProperties = oSideEffect.TargetProperties || [],
|
|
325
|
+
aEntitiesRequested = (oSideEffect.TargetEntities || []).map(function (navigation) {
|
|
326
|
+
return navigation.$NavigationPropertyPath;
|
|
327
|
+
});
|
|
328
|
+
var aDerivedProperties = [];
|
|
329
|
+
aInitialProperties.forEach(function (sPropertyPath) {
|
|
330
|
+
var bIsStarProperty = sPropertyPath.endsWith("*"),
|
|
331
|
+
// Can be '*' or '.../navProp/*'
|
|
332
|
+
sNavigationPropertyPath = sPropertyPath.substring(0, sPropertyPath.lastIndexOf("/")),
|
|
333
|
+
sRelativePath = sNavigationPropertyPath ? sNavigationPropertyPath + "/" : "",
|
|
334
|
+
mTarget = mEntityType.resolvePath(sNavigationPropertyPath) || mEntityType;
|
|
335
|
+
|
|
336
|
+
if (mTarget) {
|
|
337
|
+
var _targetType;
|
|
338
|
+
|
|
339
|
+
// mTarget can be an entity type, navigationProperty or or a complexType
|
|
340
|
+
var aTargetEntityProperties = mTarget.entityProperties || ((_targetType = mTarget.targetType) === null || _targetType === void 0 ? void 0 : _targetType.properties) || mTarget.targetType.entityProperties;
|
|
341
|
+
|
|
342
|
+
if (aTargetEntityProperties) {
|
|
343
|
+
if (bIsStarProperty) {
|
|
344
|
+
// Add all required properties behind the *
|
|
345
|
+
aEntitiesRequested.push(sNavigationPropertyPath);
|
|
346
|
+
aDerivedProperties = aDerivedProperties.concat(aTargetEntityProperties.map(function (mProperty) {
|
|
347
|
+
return {
|
|
348
|
+
navigationPath: sRelativePath,
|
|
349
|
+
property: mProperty
|
|
350
|
+
};
|
|
351
|
+
}));
|
|
370
352
|
} else {
|
|
371
|
-
|
|
353
|
+
aDerivedProperties.push({
|
|
354
|
+
property: aTargetEntityProperties.find(function (mProperty) {
|
|
355
|
+
return mProperty.name === sPropertyPath.split("/").pop();
|
|
356
|
+
}),
|
|
357
|
+
navigationPath: sRelativePath
|
|
358
|
+
});
|
|
372
359
|
}
|
|
373
360
|
} else {
|
|
374
|
-
Log.info("SideEffects - The property path " + sPropertyPath + " cannot be resolved");
|
|
375
|
-
}
|
|
376
|
-
});
|
|
377
|
-
aDerivedProperties.forEach(function (mPropertyInfo) {
|
|
378
|
-
if (mPropertyInfo.property) {
|
|
379
|
-
var _mPropertyInfo$proper, _mPropertyInfo$proper2, _mPropertyInfo$proper3;
|
|
380
|
-
|
|
381
|
-
var sTargetTextPath = (_mPropertyInfo$proper = mPropertyInfo.property.annotations) === null || _mPropertyInfo$proper === void 0 ? void 0 : (_mPropertyInfo$proper2 = _mPropertyInfo$proper.Common) === null || _mPropertyInfo$proper2 === void 0 ? void 0 : (_mPropertyInfo$proper3 = _mPropertyInfo$proper2.Text) === null || _mPropertyInfo$proper3 === void 0 ? void 0 : _mPropertyInfo$proper3.path,
|
|
382
|
-
sTextPathFromInitialEntity = mPropertyInfo.navigationPath + sTargetTextPath,
|
|
383
|
-
sTargetCollectionPath = sTextPathFromInitialEntity.substring(0, sTextPathFromInitialEntity.lastIndexOf("/"));
|
|
384
|
-
/**
|
|
385
|
-
* The property Text must be added only if the property is
|
|
386
|
-
* - not part of a star property (.i.e '*' or 'navigation/*') or a targeted Entity
|
|
387
|
-
* - not include into the initial targeted properties of SideEffects
|
|
388
|
-
* Indeed in the two listed cases, the property containing text will be/is requested by initial SideEffects configuration.
|
|
389
|
-
*/
|
|
390
|
-
|
|
391
|
-
if (sTargetTextPath && aEntitiesRequested.indexOf(sTargetCollectionPath) === -1 && aInitialProperties.indexOf(sTextPathFromInitialEntity) === -1) {
|
|
392
|
-
var _mEntityType$resolveP;
|
|
393
|
-
|
|
394
|
-
// The Text association is added as TargetEntities if it's contained on a different entitySet and not a complexType
|
|
395
|
-
// Otherwise it's added as targetProperties
|
|
396
|
-
if (sTargetTextPath.lastIndexOf("/") > -1 && ((_mEntityType$resolveP = mEntityType.resolvePath(sTargetCollectionPath)) === null || _mEntityType$resolveP === void 0 ? void 0 : _mEntityType$resolveP._type) === "NavigationProperty") {
|
|
397
|
-
oSideEffect.TargetEntities.push({
|
|
398
|
-
$NavigationPropertyPath: sTargetCollectionPath
|
|
399
|
-
});
|
|
400
|
-
aEntitiesRequested.push(sTargetCollectionPath);
|
|
401
|
-
} else {
|
|
402
|
-
oSideEffect.TargetProperties.push(sTextPathFromInitialEntity);
|
|
403
|
-
}
|
|
404
|
-
}
|
|
361
|
+
Log.info("SideEffects - The entity type associated to property path " + sPropertyPath + " cannot be resolved");
|
|
405
362
|
}
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
* @ui5-restricted
|
|
418
|
-
* @param {object} oSideEffects SideEffects definition
|
|
419
|
-
* @param {object} mEntityType Entity type
|
|
420
|
-
* @param {string} sBindingParameter Name of the binding parameter
|
|
421
|
-
* @returns {object} SideEffects definition
|
|
422
|
-
*/
|
|
423
|
-
|
|
424
|
-
}, {
|
|
425
|
-
key: "_convertSideEffects",
|
|
426
|
-
value: function _convertSideEffects(oSideEffects, mEntityType, sBindingParameter) {
|
|
427
|
-
var oTempSideEffects = this._removeBindingParameter(this._convertTargetsFormat(oSideEffects), sBindingParameter);
|
|
428
|
-
|
|
429
|
-
return this._addRequiredTextProperties(oTempSideEffects, mEntityType);
|
|
430
|
-
}
|
|
431
|
-
/**
|
|
432
|
-
* Converts SideEffects targets (TargetEntities and TargetProperties) to expected format
|
|
433
|
-
* - TargetProperties as array of string
|
|
434
|
-
* - TargetEntities as array of object with property $NavigationPropertyPath.
|
|
435
|
-
*
|
|
436
|
-
* @private
|
|
437
|
-
* @ui5-restricted
|
|
438
|
-
* @param {object} oSideEffects SideEffects definition
|
|
439
|
-
* @returns {object} Converted SideEffects
|
|
440
|
-
*/
|
|
441
|
-
|
|
442
|
-
}, {
|
|
443
|
-
key: "_convertTargetsFormat",
|
|
444
|
-
value: function _convertTargetsFormat(oSideEffects) {
|
|
445
|
-
var TargetProperties = (oSideEffects.TargetProperties || []).reduce(function (aTargetProperties, vTarget) {
|
|
446
|
-
var sTarget = typeof vTarget === "string" && vTarget || vTarget.type === "PropertyPath" && vTarget.value;
|
|
447
|
-
|
|
448
|
-
if (sTarget) {
|
|
449
|
-
aTargetProperties.push(sTarget);
|
|
450
|
-
} else {
|
|
451
|
-
Log.error("SideEffects - Error while processing TargetProperties for SideEffects" + oSideEffects.fullyQualifiedName);
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
return aTargetProperties;
|
|
455
|
-
}, []),
|
|
456
|
-
TargetEntities = (oSideEffects.TargetEntities || []).map(function (mTargetEntity) {
|
|
363
|
+
} else {
|
|
364
|
+
Log.info("SideEffects - The property path " + sPropertyPath + " cannot be resolved");
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
aDerivedProperties.forEach(function (mPropertyInfo) {
|
|
368
|
+
if (mPropertyInfo.property) {
|
|
369
|
+
var _mPropertyInfo$proper, _mPropertyInfo$proper2, _mPropertyInfo$proper3;
|
|
370
|
+
|
|
371
|
+
var sTargetTextPath = (_mPropertyInfo$proper = mPropertyInfo.property.annotations) === null || _mPropertyInfo$proper === void 0 ? void 0 : (_mPropertyInfo$proper2 = _mPropertyInfo$proper.Common) === null || _mPropertyInfo$proper2 === void 0 ? void 0 : (_mPropertyInfo$proper3 = _mPropertyInfo$proper2.Text) === null || _mPropertyInfo$proper3 === void 0 ? void 0 : _mPropertyInfo$proper3.path,
|
|
372
|
+
sTextPathFromInitialEntity = mPropertyInfo.navigationPath + sTargetTextPath,
|
|
373
|
+
sTargetCollectionPath = sTextPathFromInitialEntity.substring(0, sTextPathFromInitialEntity.lastIndexOf("/"));
|
|
457
374
|
/**
|
|
458
|
-
*
|
|
459
|
-
*
|
|
460
|
-
*
|
|
375
|
+
* The property Text must be added only if the property is
|
|
376
|
+
* - not part of a star property (.i.e '*' or 'navigation/*') or a targeted Entity
|
|
377
|
+
* - not include into the initial targeted properties of SideEffects
|
|
378
|
+
* Indeed in the two listed cases, the property containing text will be/is requested by initial SideEffects configuration.
|
|
461
379
|
*/
|
|
462
|
-
return {
|
|
463
|
-
"$NavigationPropertyPath": mTargetEntity.$NavigationPropertyPath || mTargetEntity.value || ""
|
|
464
|
-
};
|
|
465
|
-
});
|
|
466
|
-
return _objectSpread(_objectSpread({}, oSideEffects), {
|
|
467
|
-
TargetProperties: TargetProperties,
|
|
468
|
-
TargetEntities: TargetEntities
|
|
469
|
-
});
|
|
470
|
-
}
|
|
471
|
-
/**
|
|
472
|
-
* Gets SideEffects related to an entity type or action that come from an OData Service
|
|
473
|
-
* Internal routine to get, from converted oData metaModel, SideEffects related to a specific entity type or action
|
|
474
|
-
* and to convert these SideEffects with expected format.
|
|
475
|
-
*
|
|
476
|
-
* @private
|
|
477
|
-
* @ui5-restricted
|
|
478
|
-
* @param {object} oSource Entity type or action
|
|
479
|
-
* @returns {object} Array of SideEffects
|
|
480
|
-
*/
|
|
481
|
-
|
|
482
|
-
}, {
|
|
483
|
-
key: "_getSideEffectsFromSource",
|
|
484
|
-
value: function _getSideEffectsFromSource(oSource) {
|
|
485
|
-
var _this4 = this;
|
|
486
|
-
|
|
487
|
-
var aSideEffects = [];
|
|
488
|
-
var authorizedTypes = ["EntityType", "Action"];
|
|
489
|
-
|
|
490
|
-
if (oSource._type && authorizedTypes.indexOf(oSource._type) > -1) {
|
|
491
|
-
var mEntityType = oSource._type === "EntityType" ? oSource : oSource.sourceEntityType;
|
|
492
|
-
|
|
493
|
-
if (mEntityType) {
|
|
494
|
-
var _oSource$annotations;
|
|
495
|
-
|
|
496
|
-
var mCommonAnnotation = ((_oSource$annotations = oSource.annotations) === null || _oSource$annotations === void 0 ? void 0 : _oSource$annotations.Common) || {};
|
|
497
|
-
var mBindingParameter = (oSource.parameters || []).find(function (mParameter) {
|
|
498
|
-
return mParameter.type === mEntityType.fullyQualifiedName;
|
|
499
|
-
});
|
|
500
|
-
var sBindingParameter = mBindingParameter ? mBindingParameter.fullyQualifiedName.split("/")[1] : "";
|
|
501
|
-
Object.keys(mCommonAnnotation).filter(function (sAnnotationName) {
|
|
502
|
-
return mCommonAnnotation[sAnnotationName].$Type === "com.sap.vocabularies.Common.v1.SideEffectsType";
|
|
503
|
-
}).forEach(function (sAnnotationName) {
|
|
504
|
-
aSideEffects.push(_this4._convertSideEffects(mCommonAnnotation[sAnnotationName], mEntityType, sBindingParameter));
|
|
505
|
-
});
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
380
|
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
/**
|
|
512
|
-
* Logs SideEffects request.
|
|
513
|
-
*
|
|
514
|
-
* @private
|
|
515
|
-
* @ui5-restricted
|
|
516
|
-
* @param {Array} aPathExpressions SideEffects targets
|
|
517
|
-
* @param {object} oContext Context
|
|
518
|
-
*/
|
|
381
|
+
if (sTargetTextPath && aEntitiesRequested.indexOf(sTargetCollectionPath) === -1 && aInitialProperties.indexOf(sTextPathFromInitialEntity) === -1) {
|
|
382
|
+
var _mEntityType$resolveP;
|
|
519
383
|
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
}, "");
|
|
526
|
-
Log.debug("SideEffects - Request:\n\tContext path : " + oContext.getPath() + "\n\tProperty paths :" + sTargetPaths);
|
|
527
|
-
}
|
|
528
|
-
/**
|
|
529
|
-
* Removes name of binding parameter on SideEffects targets.
|
|
530
|
-
*
|
|
531
|
-
* @private
|
|
532
|
-
* @ui5-restricted
|
|
533
|
-
* @param {object} oSideEffects SideEffects definition
|
|
534
|
-
* @param {string} sBindingParameterName Name of binding parameter
|
|
535
|
-
* @returns {object} SideEffects definition
|
|
536
|
-
*/
|
|
537
|
-
|
|
538
|
-
}, {
|
|
539
|
-
key: "_removeBindingParameter",
|
|
540
|
-
value: function _removeBindingParameter(oSideEffects, sBindingParameterName) {
|
|
541
|
-
if (sBindingParameterName) {
|
|
542
|
-
var aTargets = ["TargetProperties", "TargetEntities"];
|
|
543
|
-
aTargets.forEach(function (sTarget) {
|
|
544
|
-
var mTarget = oSideEffects[sTarget];
|
|
545
|
-
|
|
546
|
-
if (mTarget) {
|
|
547
|
-
mTarget = mTarget.map(function (mProperty) {
|
|
548
|
-
var bNavigationPropertyPath = mProperty.$NavigationPropertyPath !== undefined; // Need to test with undefined since mProperty.$NavigationPropertyPath could be "" (empty string)
|
|
549
|
-
|
|
550
|
-
var sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(new RegExp("^" + sBindingParameterName + "/?"), "");
|
|
551
|
-
return bNavigationPropertyPath ? {
|
|
552
|
-
$NavigationPropertyPath: sValue
|
|
553
|
-
} : sValue;
|
|
384
|
+
// The Text association is added as TargetEntities if it's contained on a different entitySet and not a complexType
|
|
385
|
+
// Otherwise it's added as targetProperties
|
|
386
|
+
if (sTargetTextPath.lastIndexOf("/") > -1 && ((_mEntityType$resolveP = mEntityType.resolvePath(sTargetCollectionPath)) === null || _mEntityType$resolveP === void 0 ? void 0 : _mEntityType$resolveP._type) === "NavigationProperty") {
|
|
387
|
+
oSideEffect.TargetEntities.push({
|
|
388
|
+
$NavigationPropertyPath: sTargetCollectionPath
|
|
554
389
|
});
|
|
390
|
+
aEntitiesRequested.push(sTargetCollectionPath);
|
|
391
|
+
} else {
|
|
392
|
+
oSideEffect.TargetProperties.push(sTextPathFromInitialEntity);
|
|
555
393
|
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
return oSideEffect;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Converts SideEffects to expected format
|
|
401
|
+
* - Converts SideEffects targets to expected format
|
|
402
|
+
* - Removes binding parameter from SideEffects targets properties
|
|
403
|
+
* - Adds the text properties
|
|
404
|
+
* - Replaces TargetProperties having reference to Source Properties for a SideEffects.
|
|
405
|
+
*
|
|
406
|
+
* @private
|
|
407
|
+
* @ui5-restricted
|
|
408
|
+
* @param {object} oSideEffects SideEffects definition
|
|
409
|
+
* @param {object} mEntityType Entity type
|
|
410
|
+
* @param {string} sBindingParameter Name of the binding parameter
|
|
411
|
+
* @returns {object} SideEffects definition
|
|
412
|
+
*/
|
|
413
|
+
;
|
|
414
|
+
|
|
415
|
+
_proto._convertSideEffects = function _convertSideEffects(oSideEffects, mEntityType, sBindingParameter) {
|
|
416
|
+
var oTempSideEffects = this._removeBindingParameter(this._convertTargetsFormat(oSideEffects), sBindingParameter);
|
|
417
|
+
|
|
418
|
+
return this._addRequiredTextProperties(oTempSideEffects, mEntityType);
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Converts SideEffects targets (TargetEntities and TargetProperties) to expected format
|
|
422
|
+
* - TargetProperties as array of string
|
|
423
|
+
* - TargetEntities as array of object with property $NavigationPropertyPath.
|
|
424
|
+
*
|
|
425
|
+
* @private
|
|
426
|
+
* @ui5-restricted
|
|
427
|
+
* @param {object} oSideEffects SideEffects definition
|
|
428
|
+
* @returns {object} Converted SideEffects
|
|
429
|
+
*/
|
|
430
|
+
;
|
|
431
|
+
|
|
432
|
+
_proto._convertTargetsFormat = function _convertTargetsFormat(oSideEffects) {
|
|
433
|
+
var TargetProperties = (oSideEffects.TargetProperties || []).reduce(function (aTargetProperties, vTarget) {
|
|
434
|
+
var sTarget = typeof vTarget === "string" && vTarget || vTarget.type === "PropertyPath" && vTarget.value;
|
|
435
|
+
|
|
436
|
+
if (sTarget) {
|
|
437
|
+
aTargetProperties.push(sTarget);
|
|
438
|
+
} else {
|
|
439
|
+
Log.error("SideEffects - Error while processing TargetProperties for SideEffects" + oSideEffects.fullyQualifiedName);
|
|
440
|
+
}
|
|
556
441
|
|
|
557
|
-
|
|
442
|
+
return aTargetProperties;
|
|
443
|
+
}, []),
|
|
444
|
+
TargetEntities = (oSideEffects.TargetEntities || []).map(function (mTargetEntity) {
|
|
445
|
+
/**
|
|
446
|
+
* SideEffects that comes from SAP FE get TargetEntities with $NavigationPropertyPath whereas
|
|
447
|
+
* ones coming from the converted OData model gets a NavigationPropertyPath format
|
|
448
|
+
*
|
|
449
|
+
*/
|
|
450
|
+
return {
|
|
451
|
+
"$NavigationPropertyPath": mTargetEntity.$NavigationPropertyPath || mTargetEntity.value || ""
|
|
452
|
+
};
|
|
453
|
+
});
|
|
454
|
+
return _objectSpread(_objectSpread({}, oSideEffects), {
|
|
455
|
+
TargetProperties: TargetProperties,
|
|
456
|
+
TargetEntities: TargetEntities
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Gets SideEffects related to an entity type or action that come from an OData Service
|
|
461
|
+
* Internal routine to get, from converted oData metaModel, SideEffects related to a specific entity type or action
|
|
462
|
+
* and to convert these SideEffects with expected format.
|
|
463
|
+
*
|
|
464
|
+
* @private
|
|
465
|
+
* @ui5-restricted
|
|
466
|
+
* @param {object} oSource Entity type or action
|
|
467
|
+
* @returns {object} Array of SideEffects
|
|
468
|
+
*/
|
|
469
|
+
;
|
|
470
|
+
|
|
471
|
+
_proto._getSideEffectsFromSource = function _getSideEffectsFromSource(oSource) {
|
|
472
|
+
var _this5 = this;
|
|
473
|
+
|
|
474
|
+
var aSideEffects = [];
|
|
475
|
+
var authorizedTypes = ["EntityType", "Action"];
|
|
476
|
+
|
|
477
|
+
if (oSource._type && authorizedTypes.indexOf(oSource._type) > -1) {
|
|
478
|
+
var mEntityType = oSource._type === "EntityType" ? oSource : oSource.sourceEntityType;
|
|
479
|
+
|
|
480
|
+
if (mEntityType) {
|
|
481
|
+
var _oSource$annotations;
|
|
482
|
+
|
|
483
|
+
var mCommonAnnotation = ((_oSource$annotations = oSource.annotations) === null || _oSource$annotations === void 0 ? void 0 : _oSource$annotations.Common) || {};
|
|
484
|
+
var mBindingParameter = (oSource.parameters || []).find(function (mParameter) {
|
|
485
|
+
return mParameter.type === mEntityType.fullyQualifiedName;
|
|
486
|
+
});
|
|
487
|
+
var sBindingParameter = mBindingParameter ? mBindingParameter.fullyQualifiedName.split("/")[1] : "";
|
|
488
|
+
Object.keys(mCommonAnnotation).filter(function (sAnnotationName) {
|
|
489
|
+
return mCommonAnnotation[sAnnotationName].$Type === "com.sap.vocabularies.Common.v1.SideEffectsType";
|
|
490
|
+
}).forEach(function (sAnnotationName) {
|
|
491
|
+
aSideEffects.push(_this5._convertSideEffects(mCommonAnnotation[sAnnotationName], mEntityType, sBindingParameter));
|
|
558
492
|
});
|
|
559
493
|
}
|
|
560
|
-
|
|
561
|
-
return oSideEffects;
|
|
562
494
|
}
|
|
563
|
-
/**
|
|
564
|
-
* Remove duplicates in SideEffects targets.
|
|
565
|
-
*
|
|
566
|
-
* @private
|
|
567
|
-
* @ui5-restricted
|
|
568
|
-
* @param {Array} aTargets SideEffects targets
|
|
569
|
-
* @returns {Array} SideEffects targets without duplicates
|
|
570
|
-
*/
|
|
571
495
|
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
496
|
+
return aSideEffects;
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Logs SideEffects request.
|
|
500
|
+
*
|
|
501
|
+
* @private
|
|
502
|
+
* @ui5-restricted
|
|
503
|
+
* @param {Array} aPathExpressions SideEffects targets
|
|
504
|
+
* @param {object} oContext Context
|
|
505
|
+
*/
|
|
506
|
+
;
|
|
507
|
+
|
|
508
|
+
_proto._logRequest = function _logRequest(aPathExpressions, oContext) {
|
|
509
|
+
var sTargetPaths = aPathExpressions.reduce(function (sPaths, mTarget) {
|
|
510
|
+
return sPaths + "\n\t\t" + (mTarget.$NavigationPropertyPath || mTarget || "");
|
|
511
|
+
}, "");
|
|
512
|
+
Log.debug("SideEffects - Request:\n\tContext path : " + oContext.getPath() + "\n\tProperty paths :" + sTargetPaths);
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Removes name of binding parameter on SideEffects targets.
|
|
516
|
+
*
|
|
517
|
+
* @private
|
|
518
|
+
* @ui5-restricted
|
|
519
|
+
* @param {object} oSideEffects SideEffects definition
|
|
520
|
+
* @param {string} sBindingParameterName Name of binding parameter
|
|
521
|
+
* @returns {object} SideEffects definition
|
|
522
|
+
*/
|
|
523
|
+
;
|
|
524
|
+
|
|
525
|
+
_proto._removeBindingParameter = function _removeBindingParameter(oSideEffects, sBindingParameterName) {
|
|
526
|
+
if (sBindingParameterName) {
|
|
527
|
+
var aTargets = ["TargetProperties", "TargetEntities"];
|
|
528
|
+
aTargets.forEach(function (sTarget) {
|
|
529
|
+
var mTarget = oSideEffects[sTarget];
|
|
594
530
|
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
var _this5 = this;
|
|
531
|
+
if (mTarget) {
|
|
532
|
+
mTarget = mTarget.map(function (mProperty) {
|
|
533
|
+
var bNavigationPropertyPath = mProperty.$NavigationPropertyPath !== undefined; // Need to test with undefined since mProperty.$NavigationPropertyPath could be "" (empty string)
|
|
599
534
|
|
|
600
|
-
|
|
601
|
-
|
|
535
|
+
var sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(new RegExp("^" + sBindingParameterName + "/?"), "");
|
|
536
|
+
return bNavigationPropertyPath ? {
|
|
537
|
+
$NavigationPropertyPath: sValue
|
|
538
|
+
} : sValue;
|
|
539
|
+
});
|
|
540
|
+
}
|
|
602
541
|
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
var triggerActions = [];
|
|
607
|
-
var pathExpressions = [];
|
|
608
|
-
var aTargets = [];
|
|
542
|
+
oSideEffects[sTarget] = mTarget;
|
|
543
|
+
});
|
|
544
|
+
}
|
|
609
545
|
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
546
|
+
return oSideEffects;
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Remove duplicates in SideEffects targets.
|
|
550
|
+
*
|
|
551
|
+
* @private
|
|
552
|
+
* @ui5-restricted
|
|
553
|
+
* @param {Array} aTargets SideEffects targets
|
|
554
|
+
* @returns {Array} SideEffects targets without duplicates
|
|
555
|
+
*/
|
|
556
|
+
;
|
|
557
|
+
|
|
558
|
+
_proto._removeDuplicateTargets = function _removeDuplicateTargets(aTargets) {
|
|
559
|
+
return aTargets.filter(function (mTarget, iIndex, aTargets) {
|
|
560
|
+
return aTargets.findIndex(function (mSearchTarget) {
|
|
561
|
+
return mSearchTarget === mTarget || // PropertyPath
|
|
562
|
+
mTarget.$NavigationPropertyPath && mSearchTarget.$NavigationPropertyPath === mTarget.$NavigationPropertyPath // NavigationPropertyPath
|
|
563
|
+
;
|
|
564
|
+
}) === iIndex;
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Gets SideEffects action type that come from an OData Service
|
|
569
|
+
* Internal routine to get, from converted oData metaModel, SideEffects on actions
|
|
570
|
+
* related to a specific entity type and to convert these SideEffects with
|
|
571
|
+
* expected format.
|
|
572
|
+
*
|
|
573
|
+
* @private
|
|
574
|
+
* @ui5-restricted
|
|
575
|
+
* @param {object} mEntityType Entity type
|
|
576
|
+
* @returns {object} Entity type SideEffects dictionary
|
|
577
|
+
*/
|
|
578
|
+
;
|
|
579
|
+
|
|
580
|
+
_proto._retrieveODataActionsSideEffects = function _retrieveODataActionsSideEffects(mEntityType) {
|
|
581
|
+
var _this6 = this;
|
|
582
|
+
|
|
583
|
+
var oSideEffects = {};
|
|
584
|
+
var aActions = mEntityType.actions;
|
|
585
|
+
|
|
586
|
+
if (aActions) {
|
|
587
|
+
Object.keys(aActions).forEach(function (sActionName) {
|
|
588
|
+
var oAction = mEntityType.actions[sActionName];
|
|
589
|
+
var triggerActions = [];
|
|
590
|
+
var pathExpressions = [];
|
|
591
|
+
var aTargets = [];
|
|
613
592
|
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
});
|
|
593
|
+
_this6._getSideEffectsFromSource(oAction).forEach(function (oSideEffect) {
|
|
594
|
+
var sTriggerAction = oSideEffect.TriggerAction;
|
|
595
|
+
aTargets = aTargets.concat(oSideEffect.TargetEntities || []).concat(oSideEffect.TargetProperties || []);
|
|
618
596
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
triggerActions: triggerActions
|
|
623
|
-
};
|
|
597
|
+
if (sTriggerAction && triggerActions.indexOf(sTriggerAction) === -1) {
|
|
598
|
+
triggerActions.push(sTriggerAction);
|
|
599
|
+
}
|
|
624
600
|
});
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
return oSideEffects;
|
|
628
|
-
}
|
|
629
|
-
/**
|
|
630
|
-
* Gets SideEffects entity type that come from an OData Service
|
|
631
|
-
* Internal routine to get, from converted oData metaModel, SideEffects
|
|
632
|
-
* related to a specific entity type and to convert these SideEffects with
|
|
633
|
-
* expected format.
|
|
634
|
-
*
|
|
635
|
-
* @private
|
|
636
|
-
* @ui5-restricted
|
|
637
|
-
* @param {object} mEntityType Entity type
|
|
638
|
-
* @returns {object} Entity type SideEffects dictionary
|
|
639
|
-
*/
|
|
640
|
-
|
|
641
|
-
}, {
|
|
642
|
-
key: "_retrieveODataEntitySideEffects",
|
|
643
|
-
value: function _retrieveODataEntitySideEffects(mEntityType) {
|
|
644
|
-
var oEntitySideEffects = {};
|
|
645
601
|
|
|
646
|
-
|
|
647
|
-
|
|
602
|
+
pathExpressions = _this6._removeDuplicateTargets(aTargets);
|
|
603
|
+
oSideEffects[sActionName] = {
|
|
604
|
+
pathExpressions: pathExpressions,
|
|
605
|
+
triggerActions: triggerActions
|
|
606
|
+
};
|
|
648
607
|
});
|
|
649
|
-
|
|
650
|
-
return oEntitySideEffects;
|
|
651
|
-
}
|
|
652
|
-
}, {
|
|
653
|
-
key: "getInterface",
|
|
654
|
-
value: function getInterface() {
|
|
655
|
-
return this;
|
|
656
608
|
}
|
|
657
|
-
|
|
609
|
+
|
|
610
|
+
return oSideEffects;
|
|
611
|
+
}
|
|
612
|
+
/**
|
|
613
|
+
* Gets SideEffects entity type that come from an OData Service
|
|
614
|
+
* Internal routine to get, from converted oData metaModel, SideEffects
|
|
615
|
+
* related to a specific entity type and to convert these SideEffects with
|
|
616
|
+
* expected format.
|
|
617
|
+
*
|
|
618
|
+
* @private
|
|
619
|
+
* @ui5-restricted
|
|
620
|
+
* @param {object} mEntityType Entity type
|
|
621
|
+
* @returns {object} Entity type SideEffects dictionary
|
|
622
|
+
*/
|
|
623
|
+
;
|
|
624
|
+
|
|
625
|
+
_proto._retrieveODataEntitySideEffects = function _retrieveODataEntitySideEffects(mEntityType) {
|
|
626
|
+
var oEntitySideEffects = {};
|
|
627
|
+
|
|
628
|
+
this._getSideEffectsFromSource(mEntityType).forEach(function (oSideEffects) {
|
|
629
|
+
oEntitySideEffects[oSideEffects.fullyQualifiedName] = oSideEffects;
|
|
630
|
+
});
|
|
631
|
+
|
|
632
|
+
return oEntitySideEffects;
|
|
633
|
+
};
|
|
634
|
+
|
|
635
|
+
_proto.getInterface = function getInterface() {
|
|
636
|
+
return this;
|
|
637
|
+
};
|
|
658
638
|
|
|
659
639
|
return SideEffectsService;
|
|
660
640
|
}(Service);
|
|
@@ -664,25 +644,20 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
664
644
|
var SideEffectsServiceFactory = /*#__PURE__*/function (_ServiceFactory) {
|
|
665
645
|
_inherits(SideEffectsServiceFactory, _ServiceFactory);
|
|
666
646
|
|
|
667
|
-
var _super2 = _createSuper(SideEffectsServiceFactory);
|
|
668
|
-
|
|
669
647
|
function SideEffectsServiceFactory() {
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
return _super2.apply(this, arguments);
|
|
648
|
+
return _ServiceFactory.apply(this, arguments) || this;
|
|
673
649
|
}
|
|
674
650
|
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
}]);
|
|
651
|
+
var _proto2 = SideEffectsServiceFactory.prototype;
|
|
652
|
+
|
|
653
|
+
_proto2.createInstance = function createInstance(oServiceContext) {
|
|
654
|
+
var SideEffectsServiceService = new SideEffectsService(oServiceContext);
|
|
655
|
+
return SideEffectsServiceService.initPromise;
|
|
656
|
+
};
|
|
682
657
|
|
|
683
658
|
return SideEffectsServiceFactory;
|
|
684
659
|
}(ServiceFactory);
|
|
685
660
|
|
|
686
661
|
return SideEffectsServiceFactory;
|
|
687
662
|
}, false);
|
|
688
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwibmFtZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlIiwiX29TaWRlRWZmZWN0c1R5cGUiLCJvRGF0YSIsImVudGl0aWVzIiwiYWN0aW9ucyIsImNvbnRyb2wiLCJfYkluaXRpYWxpemVkIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNFbnRpdHlUeXBlIiwib1NpZGVFZmZlY3QiLCJzb3VyY2VDb250cm9sSWQiLCJvQ29udHJvbFNpZGVFZmZlY3QiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzIiwic1RyaWdnZXJBY3Rpb24iLCJvQ29udGV4dCIsInNHcm91cElkIiwib1RyaWdnZXJBY3Rpb24iLCJnZXRNb2RlbCIsImJpbmRDb250ZXh0IiwiZXhlY3V0ZSIsImdldEJpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwiZ2V0Q29udGV4dCIsIm9Db21wb25lbnQiLCJzY29wZU9iamVjdCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJjb252ZXJ0VHlwZXMiLCJfb0NhcGFiaWxpdGllcyIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImdldE9iamVjdCIsInNFbnRpdHlUeXBlTmFtZSIsInNBY3Rpb25OYW1lIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwidW5kZWZpbmVkIiwib0NhcGFiaWxpdGllcyIsIm9Db252ZXJ0ZWRNZXRhTW9kZWwiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJlbnRpdHlUeXBlcyIsImZvckVhY2giLCJlbnRpdHlUeXBlIiwiX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIl9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzIiwic0NvbnRyb2xJZCIsIk9iamVjdCIsImtleXMiLCJhUGF0aEV4cHJlc3Npb25zIiwiX2xvZ1JlcXVlc3QiLCJvUHJvbWlzZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImUiLCJyZWplY3QiLCJzTmF2aWdhdGlvblByb3BlcnR5Iiwic0Jhc2VFbnRpdHlUeXBlIiwic05hdmlnYXRpb25QYXRoIiwiYVNpZGVFZmZlY3RzIiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsImFUYXJnZXRzIiwiZmlsdGVyIiwic0Fubm90YXRpb25OYW1lIiwib1NpZGVFZmZlY3RzIiwiU291cmNlUHJvcGVydGllcyIsInNvbWUiLCJvUHJvcGVydHlQYXRoIiwic1Byb3BlcnR5UGF0aCIsInZhbHVlIiwic3RhcnRzV2l0aCIsInJlcGxhY2UiLCJpbmRleE9mIiwiU291cmNlRW50aXRpZXMiLCJvTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwibVRhcmdldCIsInB1c2giLCJfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyIsImxlbmd0aCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJtRW50aXR5VHlwZSIsImFJbml0aWFsUHJvcGVydGllcyIsImFFbnRpdGllc1JlcXVlc3RlZCIsIm1hcCIsIm5hdmlnYXRpb24iLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImFEZXJpdmVkUHJvcGVydGllcyIsImJJc1N0YXJQcm9wZXJ0eSIsImVuZHNXaXRoIiwic05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInNSZWxhdGl2ZVBhdGgiLCJyZXNvbHZlUGF0aCIsImFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzIiwiZW50aXR5UHJvcGVydGllcyIsInRhcmdldFR5cGUiLCJwcm9wZXJ0aWVzIiwibVByb3BlcnR5IiwibmF2aWdhdGlvblBhdGgiLCJwcm9wZXJ0eSIsImZpbmQiLCJuYW1lIiwic3BsaXQiLCJwb3AiLCJpbmZvIiwibVByb3BlcnR5SW5mbyIsInNUYXJnZXRUZXh0UGF0aCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiVGV4dCIsInBhdGgiLCJzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSIsInNUYXJnZXRDb2xsZWN0aW9uUGF0aCIsIl90eXBlIiwic0JpbmRpbmdQYXJhbWV0ZXIiLCJvVGVtcFNpZGVFZmZlY3RzIiwiX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIiLCJfY29udmVydFRhcmdldHNGb3JtYXQiLCJfYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyIsInJlZHVjZSIsImFUYXJnZXRQcm9wZXJ0aWVzIiwidlRhcmdldCIsInNUYXJnZXQiLCJ0eXBlIiwibVRhcmdldEVudGl0eSIsIm9Tb3VyY2UiLCJhdXRob3JpemVkVHlwZXMiLCJzb3VyY2VFbnRpdHlUeXBlIiwibUNvbW1vbkFubm90YXRpb24iLCJtQmluZGluZ1BhcmFtZXRlciIsInBhcmFtZXRlcnMiLCJtUGFyYW1ldGVyIiwiJFR5cGUiLCJfY29udmVydFNpZGVFZmZlY3RzIiwic1RhcmdldFBhdGhzIiwic1BhdGhzIiwiZGVidWciLCJzQmluZGluZ1BhcmFtZXRlck5hbWUiLCJiTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInNWYWx1ZSIsIlJlZ0V4cCIsImlJbmRleCIsImZpbmRJbmRleCIsIm1TZWFyY2hUYXJnZXQiLCJhQWN0aW9ucyIsIm9BY3Rpb24iLCJ0cmlnZ2VyQWN0aW9ucyIsInBhdGhFeHByZXNzaW9ucyIsIl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UiLCJvRW50aXR5U2lkZUVmZmVjdHMiLCJTZXJ2aWNlIiwiU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeSIsIm9TZXJ2aWNlQ29udGV4dCIsIlNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UiLCJTZXJ2aWNlRmFjdG9yeSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BMEVhQSxrQjs7Ozs7Ozs7Ozs7Ozs7O2FBS1o7QUFDQSxzQkFBTztBQUNOLGFBQUtDLGlCQUFMLEdBQXlCO0FBQ3hCQyxVQUFBQSxLQUFLLEVBQUU7QUFDTkMsWUFBQUEsUUFBUSxFQUFFLEVBREo7QUFFTkMsWUFBQUEsT0FBTyxFQUFFO0FBRkgsV0FEaUI7QUFLeEJDLFVBQUFBLE9BQU8sRUFBRTtBQUxlLFNBQXpCO0FBT0EsYUFBS0MsYUFBTCxHQUFxQixLQUFyQjtBQUNBLGFBQUtDLFdBQUwsR0FBbUJDLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixJQUFoQixDQUFuQjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLCtCQUE2QkMsV0FBN0IsRUFBa0RDLFdBQWxELEVBQXlIO0FBQ3hILFlBQUlBLFdBQVcsQ0FBQ0MsZUFBaEIsRUFBaUM7QUFDaEMsY0FBTUMsa0JBQTBDLG1DQUM1Q0YsV0FENEM7QUFFL0NHLFlBQUFBLGtCQUFrQixFQUFFSixXQUFXLEdBQUcseUJBQWQsR0FBMENDLFdBQVcsQ0FBQ0M7QUFGM0IsWUFBaEQ7O0FBSUEsY0FBTUcseUJBQXlCLEdBQUcsS0FBS2QsaUJBQUwsQ0FBdUJJLE9BQXZCLENBQStCSyxXQUEvQixLQUErQyxFQUFqRjtBQUNBSyxVQUFBQSx5QkFBeUIsQ0FBQ0Ysa0JBQWtCLENBQUNELGVBQXBCLENBQXpCLEdBQWdFQyxrQkFBaEU7QUFDQSxlQUFLWixpQkFBTCxDQUF1QkksT0FBdkIsQ0FBK0JLLFdBQS9CLElBQThDSyx5QkFBOUM7QUFDQTtBQUNEO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MsdUJBQXFCQyxjQUFyQixFQUE2Q0MsUUFBN0MsRUFBZ0VDLFFBQWhFLEVBQW1GO0FBQ2xGLFlBQU1DLGNBQW1CLEdBQUdGLFFBQVEsQ0FBQ0csUUFBVCxHQUFvQkMsV0FBcEIsQ0FBZ0NMLGNBQWMsR0FBRyxPQUFqRCxFQUEwREMsUUFBMUQsQ0FBNUI7QUFDQUUsUUFBQUEsY0FBYyxDQUFDRyxPQUFmLENBQXVCSixRQUFRLElBQUtELFFBQUQsQ0FBa0JNLFVBQWxCLEdBQStCQyxnQkFBL0IsRUFBbkM7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MsaUNBQWdEO0FBQy9DLFlBQU1QLFFBQVEsR0FBRyxLQUFLUSxVQUFMLEVBQWpCO0FBQ0EsWUFBTUMsVUFBVSxHQUFHVCxRQUFRLENBQUNVLFdBQTVCO0FBQ0EsWUFBTUMsVUFBMEIsR0FBR0YsVUFBVSxDQUFDTixRQUFYLEdBQXNCUyxZQUF0QixFQUFuQztBQUNBLGVBQU9DLFlBQVksQ0FBQ0YsVUFBRCxFQUFhLEtBQUtHLGNBQWxCLENBQW5CO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0Msa0NBQWdDZCxRQUFoQyxFQUF1RTtBQUN0RSxZQUFNVyxVQUFVLEdBQUdYLFFBQVEsQ0FBQ0csUUFBVCxHQUFvQlMsWUFBcEIsRUFBbkI7QUFBQSxZQUNDRyxTQUFTLEdBQUlKLFVBQUQsQ0FBb0JLLFdBQXBCLENBQWdDaEIsUUFBUSxDQUFDaUIsT0FBVCxFQUFoQyxDQURiO0FBQUEsWUFFQ3hCLFdBQVcsR0FBR2tCLFVBQVUsQ0FBQ08sU0FBWCxDQUFxQkgsU0FBckIsRUFBZ0MsT0FBaEMsQ0FGZjtBQUdBLGVBQU90QixXQUFQO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MsbUNBQWlDMEIsZUFBakMsRUFBZ0c7QUFDL0YsZUFBTyxLQUFLbkMsaUJBQUwsQ0FBdUJDLEtBQXZCLENBQTZCQyxRQUE3QixDQUFzQ2lDLGVBQXRDLEtBQTBELEVBQWpFO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQyxtQ0FBaUNDLFdBQWpDLEVBQXNEcEIsUUFBdEQsRUFBNkc7QUFDNUcsWUFBSUEsUUFBSixFQUFjO0FBQ2IsY0FBTVAsV0FBVyxHQUFHLEtBQUs0Qix3QkFBTCxDQUE4QnJCLFFBQTlCLENBQXBCOztBQUNBLGNBQUlQLFdBQUosRUFBaUI7QUFBQTs7QUFDaEIsNENBQU8sS0FBS1QsaUJBQUwsQ0FBdUJDLEtBQXZCLENBQTZCRSxPQUE3QixDQUFxQ00sV0FBckMsQ0FBUCwwREFBTyxzQkFBb0QyQixXQUFwRCxDQUFQO0FBQ0E7QUFDRDs7QUFDRCxlQUFPRSxTQUFQO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLCtCQUE2QkMsYUFBN0IsRUFBNEU7QUFBQTs7QUFDM0UsYUFBS1QsY0FBTCxHQUFzQlMsYUFBdEI7O0FBQ0EsWUFBSSxDQUFDLEtBQUtsQyxhQUFWLEVBQXlCO0FBQ3hCLGNBQU1tQyxtQkFBbUIsR0FBRyxLQUFLQyxxQkFBTCxFQUE1QjtBQUNBRCxVQUFBQSxtQkFBbUIsQ0FBQ0UsV0FBcEIsQ0FBZ0NDLE9BQWhDLENBQXdDLFVBQUFDLFVBQVUsRUFBSTtBQUNyRCxZQUFBLEtBQUksQ0FBQzVDLGlCQUFMLENBQXVCQyxLQUF2QixDQUE2QkMsUUFBN0IsQ0FBc0MwQyxVQUFVLENBQUMvQixrQkFBakQsSUFBdUUsS0FBSSxDQUFDZ0MsK0JBQUwsQ0FBcUNELFVBQXJDLENBQXZFO0FBQ0EsWUFBQSxLQUFJLENBQUM1QyxpQkFBTCxDQUF1QkMsS0FBdkIsQ0FBNkJFLE9BQTdCLENBQXFDeUMsVUFBVSxDQUFDL0Isa0JBQWhELElBQXNFLEtBQUksQ0FBQ2lDLGdDQUFMLENBQXNDRixVQUF0QyxDQUF0RSxDQUZxRCxDQUVvRTtBQUN6SCxXQUhEO0FBSUEsZUFBS3ZDLGFBQUwsR0FBcUIsSUFBckI7QUFDQTtBQUNEO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQyxrQ0FBZ0MwQyxVQUFoQyxFQUEwRDtBQUFBOztBQUN6REMsUUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS2pELGlCQUFMLENBQXVCSSxPQUFuQyxFQUE0Q3VDLE9BQTVDLENBQW9ELFVBQUFsQyxXQUFXLEVBQUk7QUFDbEUsY0FBSSxNQUFJLENBQUNULGlCQUFMLENBQXVCSSxPQUF2QixDQUErQkssV0FBL0IsRUFBNENzQyxVQUE1QyxDQUFKLEVBQTZEO0FBQzVELG1CQUFPLE1BQUksQ0FBQy9DLGlCQUFMLENBQXVCSSxPQUF2QixDQUErQkssV0FBL0IsRUFBNENzQyxVQUE1QyxDQUFQO0FBQ0E7QUFDRCxTQUpEO0FBS0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLDRCQUEwQkcsZ0JBQTFCLEVBQWlFbEMsUUFBakUsRUFBb0ZDLFFBQXBGLEVBQXFIO0FBQ3BILGFBQUtrQyxXQUFMLENBQWlCRCxnQkFBakIsRUFBbUNsQyxRQUFuQzs7QUFDQSxZQUFJb0MsUUFBSjtBQUNBO0FBQ0Y7QUFDQTtBQUNBOztBQUNFLFlBQUk7QUFDSEEsVUFBQUEsUUFBUSxHQUFJcEMsUUFBRCxDQUFrQnFDLGtCQUFsQixDQUFxQ0gsZ0JBQXJDLEVBQXVEakMsUUFBdkQsQ0FBWDtBQUNBLFNBRkQsQ0FFRSxPQUFPcUMsQ0FBUCxFQUFVO0FBQ1hGLFVBQUFBLFFBQVEsR0FBRzdDLE9BQU8sQ0FBQ2dELE1BQVIsQ0FBZUQsQ0FBZixDQUFYO0FBQ0E7O0FBQ0QsZUFBT0YsUUFBUDtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MsaURBQStDSSxtQkFBL0MsRUFBNEV4QyxRQUE1RSxFQUE2RztBQUFBOztBQUM1RyxZQUFNeUMsZUFBZSxHQUFHLEtBQUtwQix3QkFBTCxDQUE4QnJCLFFBQTlCLENBQXhCOztBQUNBLFlBQUl5QyxlQUFKLEVBQXFCO0FBQ3BCLGNBQU1DLGVBQWUsR0FBR0YsbUJBQW1CLEdBQUcsR0FBOUM7QUFDQSxjQUFNRyxZQUFZLEdBQUcsS0FBS0MseUJBQUwsQ0FBK0JILGVBQS9CLENBQXJCO0FBQ0EsY0FBSUksUUFBNkIsR0FBRyxFQUFwQztBQUNBYixVQUFBQSxNQUFNLENBQUNDLElBQVAsQ0FBWVUsWUFBWixFQUNFRyxNQURGLEVBRUU7QUFDQSxvQkFBQUMsZUFBZSxFQUFJO0FBQ2xCLGdCQUFNQyxZQUFrQyxHQUFHTCxZQUFZLENBQUNJLGVBQUQsQ0FBdkQ7QUFDQSxtQkFDQyxDQUFDQyxZQUFZLENBQUNDLGdCQUFiLElBQWlDLEVBQWxDLEVBQXNDQyxJQUF0QyxDQUEyQyxVQUFBQyxhQUFhLEVBQUk7QUFDM0Qsa0JBQU1DLGFBQWEsR0FBR0QsYUFBYSxDQUFDRSxLQUFwQztBQUNBLHFCQUNDRCxhQUFhLENBQUNFLFVBQWQsQ0FBeUJaLGVBQXpCLEtBQ0FVLGFBQWEsQ0FBQ0csT0FBZCxDQUFzQmIsZUFBdEIsRUFBdUMsRUFBdkMsRUFBMkNjLE9BQTNDLENBQW1ELEdBQW5ELE1BQTRELENBQUMsQ0FGOUQ7QUFJQSxhQU5ELEtBT0EsQ0FBQ1IsWUFBWSxDQUFDUyxjQUFiLElBQStCLEVBQWhDLEVBQW9DUCxJQUFwQyxDQUNDLFVBQUFRLHVCQUF1QjtBQUFBLHFCQUFJQSx1QkFBdUIsQ0FBQ0wsS0FBeEIsS0FBa0NiLG1CQUF0QztBQUFBLGFBRHhCLENBUkQ7QUFZQSxXQWpCSCxFQW1CRWIsT0FuQkYsQ0FtQlUsVUFBQW9CLGVBQWUsRUFBSTtBQUMzQixnQkFBTUMsWUFBa0MsR0FBR0wsWUFBWSxDQUFDSSxlQUFELENBQXZEOztBQUNBLGdCQUFJQyxZQUFZLENBQUNXLGFBQWpCLEVBQWdDO0FBQy9CLGNBQUEsTUFBSSxDQUFDQyxhQUFMLENBQW1CWixZQUFZLENBQUNXLGFBQWhDLEVBQXlEM0QsUUFBekQ7QUFDQTs7QUFDRCxhQUFFZ0QsWUFBWSxDQUFDYSxjQUFkLElBQTBDLEVBQTNDLEVBQ0VDLE1BREYsQ0FDVWQsWUFBWSxDQUFDZSxnQkFBZCxJQUE0QyxFQURyRCxFQUVFcEMsT0FGRixDQUVVLFVBQUFxQyxPQUFPO0FBQUEscUJBQUluQixRQUFRLENBQUNvQixJQUFULENBQWNELE9BQWQsQ0FBSjtBQUFBLGFBRmpCO0FBR0EsV0EzQkYsRUFKb0IsQ0FnQ3BCOztBQUNBbkIsVUFBQUEsUUFBUSxHQUFHLEtBQUtxQix1QkFBTCxDQUE2QnJCLFFBQTdCLENBQVg7O0FBQ0EsY0FBSUEsUUFBUSxDQUFDc0IsTUFBVCxHQUFrQixDQUF0QixFQUF5QjtBQUN4QixtQkFBTyxLQUFLOUIsa0JBQUwsQ0FBd0JRLFFBQXhCLEVBQWtDN0MsUUFBbEMsRUFBNENvRSxLQUE1QyxDQUFrRCxVQUFBQyxNQUFNO0FBQUEscUJBQzlEQyxHQUFHLENBQUNDLEtBQUosQ0FBVSw4RUFBOEUvQixtQkFBeEYsRUFBNkc2QixNQUE3RyxDQUQ4RDtBQUFBLGFBQXhELENBQVA7QUFHQTtBQUNEOztBQUNELGVBQU85RSxPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLHFDQUFtQzJCLGVBQW5DLEVBQW9HO0FBQ25HLGVBQU8sS0FBS25DLGlCQUFMLENBQXVCSSxPQUF2QixDQUErQitCLGVBQS9CLEtBQW1ELEVBQTFEO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLG9DQUFtQ3pCLFdBQW5DLEVBQXFFOEUsV0FBckUsRUFBbUg7QUFDbEgsWUFBTUMsa0JBQTRCLEdBQUcvRSxXQUFXLENBQUNxRSxnQkFBWixJQUFnQyxFQUFyRTtBQUFBLFlBQ0NXLGtCQUE0QixHQUFHLENBQUNoRixXQUFXLENBQUNtRSxjQUFaLElBQThCLEVBQS9CLEVBQW1DYyxHQUFuQyxDQUF1QyxVQUFBQyxVQUFVO0FBQUEsaUJBQUlBLFVBQVUsQ0FBQ0MsdUJBQWY7QUFBQSxTQUFqRCxDQURoQztBQUVBLFlBQUlDLGtCQUEyQyxHQUFHLEVBQWxEO0FBRUFMLFFBQUFBLGtCQUFrQixDQUFDOUMsT0FBbkIsQ0FBMkIsVUFBQXlCLGFBQWEsRUFBSTtBQUMzQyxjQUFNMkIsZUFBZSxHQUFHM0IsYUFBYSxDQUFDNEIsUUFBZCxDQUF1QixHQUF2QixDQUF4QjtBQUFBLGNBQXFEO0FBQ3BEQyxVQUFBQSx1QkFBK0IsR0FBRzdCLGFBQWEsQ0FBQzhCLFNBQWQsQ0FBd0IsQ0FBeEIsRUFBMkI5QixhQUFhLENBQUMrQixXQUFkLENBQTBCLEdBQTFCLENBQTNCLENBRG5DO0FBQUEsY0FFQ0MsYUFBYSxHQUFHSCx1QkFBdUIsR0FBR0EsdUJBQXVCLEdBQUcsR0FBN0IsR0FBbUMsRUFGM0U7QUFBQSxjQUdDakIsT0FBWSxHQUFHUSxXQUFXLENBQUNhLFdBQVosQ0FBd0JKLHVCQUF4QixLQUFvRFQsV0FIcEU7O0FBS0EsY0FBSVIsT0FBSixFQUFhO0FBQUE7O0FBQ1o7QUFDQSxnQkFBTXNCLHVCQUFtQyxHQUN2Q3RCLE9BQUQsQ0FBd0J1QixnQkFBeEIsb0JBQ0V2QixPQUFELENBQXNCd0IsVUFEdkIsZ0RBQ0EsWUFBbURDLFVBRG5ELEtBRUN6QixPQUFELENBQWdDd0IsVUFBaEMsQ0FBMkNELGdCQUg1Qzs7QUFJQSxnQkFBSUQsdUJBQUosRUFBNkI7QUFDNUIsa0JBQUlQLGVBQUosRUFBcUI7QUFDcEI7QUFDQUwsZ0JBQUFBLGtCQUFrQixDQUFDVCxJQUFuQixDQUF3QmdCLHVCQUF4QjtBQUNBSCxnQkFBQUEsa0JBQWtCLEdBQUdBLGtCQUFrQixDQUFDaEIsTUFBbkIsQ0FDcEJ3Qix1QkFBdUIsQ0FBQ1gsR0FBeEIsQ0FBNEIsVUFBQWUsU0FBUyxFQUFJO0FBQ3hDLHlCQUFPO0FBQ05DLG9CQUFBQSxjQUFjLEVBQUVQLGFBRFY7QUFFTlEsb0JBQUFBLFFBQVEsRUFBRUY7QUFGSixtQkFBUDtBQUlBLGlCQUxELENBRG9CLENBQXJCO0FBUUEsZUFYRCxNQVdPO0FBQ05aLGdCQUFBQSxrQkFBa0IsQ0FBQ2IsSUFBbkIsQ0FBd0I7QUFDdkIyQixrQkFBQUEsUUFBUSxFQUFFTix1QkFBdUIsQ0FBQ08sSUFBeEIsQ0FDVCxVQUFBSCxTQUFTO0FBQUEsMkJBQUlBLFNBQVMsQ0FBQ0ksSUFBVixLQUFtQjFDLGFBQWEsQ0FBQzJDLEtBQWQsQ0FBb0IsR0FBcEIsRUFBeUJDLEdBQXpCLEVBQXZCO0FBQUEsbUJBREEsQ0FEYTtBQUl2Qkwsa0JBQUFBLGNBQWMsRUFBRVA7QUFKTyxpQkFBeEI7QUFNQTtBQUNELGFBcEJELE1Bb0JPO0FBQ05kLGNBQUFBLEdBQUcsQ0FBQzJCLElBQUosQ0FBUywrREFBK0Q3QyxhQUEvRCxHQUErRSxxQkFBeEY7QUFDQTtBQUNELFdBN0JELE1BNkJPO0FBQ05rQixZQUFBQSxHQUFHLENBQUMyQixJQUFKLENBQVMscUNBQXFDN0MsYUFBckMsR0FBcUQscUJBQTlEO0FBQ0E7QUFDRCxTQXRDRDtBQXdDQTBCLFFBQUFBLGtCQUFrQixDQUFDbkQsT0FBbkIsQ0FBMkIsVUFBQXVFLGFBQWEsRUFBSTtBQUMzQyxjQUFJQSxhQUFhLENBQUNOLFFBQWxCLEVBQTRCO0FBQUE7O0FBQzNCLGdCQUFNTyxlQUFlLDRCQUFJRCxhQUFhLENBQUNOLFFBQWQsQ0FBdUJRLFdBQTNCLG9GQUFJLHNCQUFvQ0MsTUFBeEMscUZBQUksdUJBQTRDQyxJQUFoRCwyREFBRyx1QkFBMkRDLElBQW5GO0FBQUEsZ0JBQ0NDLDBCQUEwQixHQUFHTixhQUFhLENBQUNQLGNBQWQsR0FBK0JRLGVBRDdEO0FBQUEsZ0JBRUNNLHFCQUFxQixHQUFHRCwwQkFBMEIsQ0FBQ3RCLFNBQTNCLENBQXFDLENBQXJDLEVBQXdDc0IsMEJBQTBCLENBQUNyQixXQUEzQixDQUF1QyxHQUF2QyxDQUF4QyxDQUZ6QjtBQUdBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFSSxnQkFDQ2dCLGVBQWUsSUFDZnpCLGtCQUFrQixDQUFDbEIsT0FBbkIsQ0FBMkJpRCxxQkFBM0IsTUFBc0QsQ0FBQyxDQUR2RCxJQUVBaEMsa0JBQWtCLENBQUNqQixPQUFuQixDQUEyQmdELDBCQUEzQixNQUEyRCxDQUFDLENBSDdELEVBSUU7QUFBQTs7QUFDRDtBQUNBO0FBQ0Esa0JBQ0NMLGVBQWUsQ0FBQ2hCLFdBQWhCLENBQTRCLEdBQTVCLElBQW1DLENBQUMsQ0FBcEMsSUFDQSwwQkFBQVgsV0FBVyxDQUFDYSxXQUFaLENBQXdCb0IscUJBQXhCLGlGQUFnREMsS0FBaEQsTUFBMEQsb0JBRjNELEVBR0U7QUFDRGhILGdCQUFBQSxXQUFXLENBQUNtRSxjQUFaLENBQTJCSSxJQUEzQixDQUFnQztBQUFFWSxrQkFBQUEsdUJBQXVCLEVBQUU0QjtBQUEzQixpQkFBaEM7QUFDQS9CLGdCQUFBQSxrQkFBa0IsQ0FBQ1QsSUFBbkIsQ0FBd0J3QyxxQkFBeEI7QUFDQSxlQU5ELE1BTU87QUFDTi9HLGdCQUFBQSxXQUFXLENBQUNxRSxnQkFBWixDQUE2QkUsSUFBN0IsQ0FBa0N1QywwQkFBbEM7QUFDQTtBQUNEO0FBQ0Q7QUFDRCxTQTlCRDtBQWdDQSxlQUFPOUcsV0FBUDtBQUNBO0FBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLDZCQUNDc0QsWUFERCxFQUVDd0IsV0FGRCxFQUdDbUMsaUJBSEQsRUFJd0I7QUFDdkIsWUFBTUMsZ0JBQWdCLEdBQUcsS0FBS0MsdUJBQUwsQ0FBNkIsS0FBS0MscUJBQUwsQ0FBMkI5RCxZQUEzQixDQUE3QixFQUF1RTJELGlCQUF2RSxDQUF6Qjs7QUFDQSxlQUFPLEtBQUtJLDBCQUFMLENBQWdDSCxnQkFBaEMsRUFBa0RwQyxXQUFsRCxDQUFQO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLCtCQUE4QnhCLFlBQTlCLEVBQXNIO0FBQ3JILFlBQU1lLGdCQUEwQixHQUFHLENBQUVmLFlBQVksQ0FBQ2UsZ0JBQWQsSUFBNEMsRUFBN0MsRUFBaURpRCxNQUFqRCxDQUF3RCxVQUFTQyxpQkFBVCxFQUE0QkMsT0FBNUIsRUFBcUM7QUFDOUgsY0FBTUMsT0FBTyxHQUFJLE9BQU9ELE9BQVAsS0FBbUIsUUFBbkIsSUFBK0JBLE9BQWhDLElBQTZDQSxPQUFPLENBQUNFLElBQVIsS0FBaUIsY0FBakIsSUFBbUNGLE9BQU8sQ0FBQzdELEtBQXhHOztBQUNBLGNBQUk4RCxPQUFKLEVBQWE7QUFDWkYsWUFBQUEsaUJBQWlCLENBQUNoRCxJQUFsQixDQUF1QmtELE9BQXZCO0FBQ0EsV0FGRCxNQUVPO0FBQ043QyxZQUFBQSxHQUFHLENBQUNDLEtBQUosQ0FBVSwwRUFBMEV2QixZQUFZLENBQUNuRCxrQkFBakc7QUFDQTs7QUFDRCxpQkFBT29ILGlCQUFQO0FBQ0EsU0FSaUMsRUFRL0IsRUFSK0IsQ0FBbkM7QUFBQSxZQVNDcEQsY0FBNkMsR0FBRyxDQUFFYixZQUFZLENBQUNhLGNBQWQsSUFBMEMsRUFBM0MsRUFBK0NjLEdBQS9DLENBQW1ELFVBQUEwQyxhQUFhLEVBQUk7QUFDbkg7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNJLGlCQUFPO0FBQUUsdUNBQTJCQSxhQUFhLENBQUN4Qyx1QkFBZCxJQUF5Q3dDLGFBQWEsQ0FBQ2hFLEtBQXZELElBQWdFO0FBQTdGLFdBQVA7QUFDQSxTQVArQyxDQVRqRDtBQWlCQSwrQ0FBWUwsWUFBWixHQUE2QjtBQUFFZSxVQUFBQSxnQkFBZ0IsRUFBaEJBLGdCQUFGO0FBQW9CRixVQUFBQSxjQUFjLEVBQWRBO0FBQXBCLFNBQTdCO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLG1DQUFrQ3lELE9BQWxDLEVBQXdFO0FBQUE7O0FBQ3ZFLFlBQU0zRSxZQUFvQyxHQUFHLEVBQTdDO0FBQ0EsWUFBTTRFLGVBQWUsR0FBRyxDQUFDLFlBQUQsRUFBZSxRQUFmLENBQXhCOztBQUNBLFlBQUlELE9BQU8sQ0FBQ1osS0FBUixJQUFpQmEsZUFBZSxDQUFDL0QsT0FBaEIsQ0FBd0I4RCxPQUFPLENBQUNaLEtBQWhDLElBQXlDLENBQUMsQ0FBL0QsRUFBa0U7QUFDakUsY0FBTWxDLFdBQW1DLEdBQUc4QyxPQUFPLENBQUNaLEtBQVIsS0FBa0IsWUFBbEIsR0FBaUNZLE9BQWpDLEdBQTJDQSxPQUFPLENBQUNFLGdCQUEvRjs7QUFDQSxjQUFJaEQsV0FBSixFQUFpQjtBQUFBOztBQUNoQixnQkFBTWlELGlCQUFzQixHQUFHLHlCQUFBSCxPQUFPLENBQUNsQixXQUFSLDhFQUFxQkMsTUFBckIsS0FBK0IsRUFBOUQ7QUFDQSxnQkFBTXFCLGlCQUFpQixHQUFHLENBQUVKLE9BQUQsQ0FBb0JLLFVBQXBCLElBQWtDLEVBQW5DLEVBQXVDOUIsSUFBdkMsQ0FDekIsVUFBQStCLFVBQVU7QUFBQSxxQkFBSUEsVUFBVSxDQUFDUixJQUFYLEtBQW9CNUMsV0FBVyxDQUFDM0Usa0JBQXBDO0FBQUEsYUFEZSxDQUExQjtBQUdBLGdCQUFNOEcsaUJBQWlCLEdBQUdlLGlCQUFpQixHQUFHQSxpQkFBaUIsQ0FBQzdILGtCQUFsQixDQUFxQ2tHLEtBQXJDLENBQTJDLEdBQTNDLEVBQWdELENBQWhELENBQUgsR0FBd0QsRUFBbkc7QUFDQS9ELFlBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZd0YsaUJBQVosRUFDRTNFLE1BREYsQ0FDUyxVQUFBQyxlQUFlO0FBQUEscUJBQUkwRSxpQkFBaUIsQ0FBQzFFLGVBQUQsQ0FBakIsQ0FBbUM4RSxLQUFuQyxxREFBSjtBQUFBLGFBRHhCLEVBRUVsRyxPQUZGLENBRVUsVUFBQW9CLGVBQWUsRUFBSTtBQUMzQkosY0FBQUEsWUFBWSxDQUFDc0IsSUFBYixDQUFrQixNQUFJLENBQUM2RCxtQkFBTCxDQUF5QkwsaUJBQWlCLENBQUMxRSxlQUFELENBQTFDLEVBQTZEeUIsV0FBN0QsRUFBMEVtQyxpQkFBMUUsQ0FBbEI7QUFDQSxhQUpGO0FBS0E7QUFDRDs7QUFDRCxlQUFPaEUsWUFBUDtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLHFCQUFvQlQsZ0JBQXBCLEVBQTJEbEMsUUFBM0QsRUFBOEU7QUFDN0UsWUFBTStILFlBQVksR0FBRzdGLGdCQUFnQixDQUFDOEUsTUFBakIsQ0FBd0IsVUFBU2dCLE1BQVQsRUFBaUJoRSxPQUFqQixFQUEwQjtBQUN0RSxpQkFBT2dFLE1BQU0sR0FBRyxRQUFULElBQXNCaEUsT0FBRCxDQUF5Q2EsdUJBQXpDLElBQW9FYixPQUFwRSxJQUErRSxFQUFwRyxDQUFQO0FBQ0EsU0FGb0IsRUFFbEIsRUFGa0IsQ0FBckI7QUFHQU0sUUFBQUEsR0FBRyxDQUFDMkQsS0FBSixDQUFVLDhDQUE4Q2pJLFFBQVEsQ0FBQ2lCLE9BQVQsRUFBOUMsR0FBbUUsc0JBQW5FLEdBQTRGOEcsWUFBdEc7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLGlDQUFnQy9FLFlBQWhDLEVBQW1Fa0YscUJBQW5FLEVBQXdIO0FBQ3ZILFlBQUlBLHFCQUFKLEVBQTJCO0FBQzFCLGNBQU1yRixRQUFRLEdBQUcsQ0FBQyxrQkFBRCxFQUFxQixnQkFBckIsQ0FBakI7QUFDQUEsVUFBQUEsUUFBUSxDQUFDbEIsT0FBVCxDQUFpQixVQUFBd0YsT0FBTyxFQUFJO0FBQzNCLGdCQUFJbkQsT0FBTyxHQUFJaEIsWUFBRCxDQUFzQm1FLE9BQXRCLENBQWQ7O0FBQ0EsZ0JBQUluRCxPQUFKLEVBQWE7QUFDWkEsY0FBQUEsT0FBTyxHQUFHQSxPQUFPLENBQUNXLEdBQVIsQ0FBWSxVQUFDZSxTQUFELEVBQW9CO0FBQ3pDLG9CQUFNeUMsdUJBQXVCLEdBQUd6QyxTQUFTLENBQUNiLHVCQUFWLEtBQXNDdkQsU0FBdEUsQ0FEeUMsQ0FDd0M7O0FBQ2pGLG9CQUFNOEcsTUFBTSxHQUFHLENBQUNELHVCQUF1QixHQUFHekMsU0FBUyxDQUFDYix1QkFBYixHQUF1Q2EsU0FBL0QsRUFBMEVuQyxPQUExRSxDQUNkLElBQUk4RSxNQUFKLENBQVcsTUFBTUgscUJBQU4sR0FBOEIsSUFBekMsQ0FEYyxFQUVkLEVBRmMsQ0FBZjtBQUlBLHVCQUFPQyx1QkFBdUIsR0FBRztBQUFFdEQsa0JBQUFBLHVCQUF1QixFQUFFdUQ7QUFBM0IsaUJBQUgsR0FBeUNBLE1BQXZFO0FBQ0EsZUFQUyxDQUFWO0FBUUE7O0FBQ0FwRixZQUFBQSxZQUFELENBQXNCbUUsT0FBdEIsSUFBaUNuRCxPQUFqQztBQUNBLFdBYkQ7QUFjQTs7QUFDRCxlQUFPaEIsWUFBUDtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLGlDQUFnQ0gsUUFBaEMsRUFBb0Y7QUFDbkYsZUFBT0EsUUFBUSxDQUFDQyxNQUFULENBQ04sVUFBQ2tCLE9BQUQsRUFBZXNFLE1BQWYsRUFBdUJ6RixRQUF2QjtBQUFBLGlCQUNDQSxRQUFRLENBQUMwRixTQUFULENBQW1CLFVBQUNDLGFBQUQsRUFBd0I7QUFDMUMsbUJBQ0NBLGFBQWEsS0FBS3hFLE9BQWxCLElBQTZCO0FBQzVCQSxZQUFBQSxPQUFPLENBQUNhLHVCQUFSLElBQW1DMkQsYUFBYSxDQUFDM0QsdUJBQWQsS0FBMENiLE9BQU8sQ0FBQ2EsdUJBRnZGLENBRWdIO0FBRmhIO0FBSUEsV0FMRCxNQUtPeUQsTUFOUjtBQUFBLFNBRE0sQ0FBUDtBQVNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLDBDQUF5QzlELFdBQXpDLEVBQXlHO0FBQUE7O0FBQ3hHLFlBQU14QixZQUFtRCxHQUFHLEVBQTVEO0FBQ0EsWUFBTXlGLFFBQVEsR0FBR2pFLFdBQVcsQ0FBQ3JGLE9BQTdCOztBQUNBLFlBQUlzSixRQUFKLEVBQWM7QUFDYnpHLFVBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZd0csUUFBWixFQUFzQjlHLE9BQXRCLENBQThCLFVBQUFQLFdBQVcsRUFBSTtBQUM1QyxnQkFBTXNILE9BQU8sR0FBR2xFLFdBQVcsQ0FBQ3JGLE9BQVosQ0FBb0JpQyxXQUFwQixDQUFoQjtBQUNBLGdCQUFNdUgsY0FBd0IsR0FBRyxFQUFqQztBQUNBLGdCQUFJQyxlQUFvQyxHQUFHLEVBQTNDO0FBQ0EsZ0JBQUkvRixRQUE2QixHQUFHLEVBQXBDOztBQUVBLFlBQUEsTUFBSSxDQUFDZ0cseUJBQUwsQ0FBK0JILE9BQS9CLEVBQXdDL0csT0FBeEMsQ0FBZ0QsVUFBQWpDLFdBQVcsRUFBSTtBQUM5RCxrQkFBTUssY0FBYyxHQUFHTCxXQUFXLENBQUNpRSxhQUFuQztBQUNBZCxjQUFBQSxRQUFRLEdBQUdBLFFBQVEsQ0FBQ2lCLE1BQVQsQ0FBZ0JwRSxXQUFXLENBQUNtRSxjQUFaLElBQThCLEVBQTlDLEVBQWtEQyxNQUFsRCxDQUEwRHBFLFdBQVcsQ0FBQ3FFLGdCQUFiLElBQTJDLEVBQXBHLENBQVg7O0FBQ0Esa0JBQUloRSxjQUFjLElBQUk0SSxjQUFjLENBQUNuRixPQUFmLENBQXVCekQsY0FBdkIsTUFBcUQsQ0FBQyxDQUE1RSxFQUErRTtBQUM5RTRJLGdCQUFBQSxjQUFjLENBQUMxRSxJQUFmLENBQW9CbEUsY0FBcEI7QUFDQTtBQUNELGFBTkQ7O0FBT0E2SSxZQUFBQSxlQUFlLEdBQUcsTUFBSSxDQUFDMUUsdUJBQUwsQ0FBNkJyQixRQUE3QixDQUFsQjtBQUNBRyxZQUFBQSxZQUFZLENBQUM1QixXQUFELENBQVosR0FBNEI7QUFBRXdILGNBQUFBLGVBQWUsRUFBZkEsZUFBRjtBQUFtQkQsY0FBQUEsY0FBYyxFQUFkQTtBQUFuQixhQUE1QjtBQUNBLFdBZkQ7QUFnQkE7O0FBQ0QsZUFBTzNGLFlBQVA7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQyx5Q0FBd0N3QixXQUF4QyxFQUF1RztBQUN0RyxZQUFNc0Usa0JBQXdELEdBQUcsRUFBakU7O0FBQ0EsYUFBS0QseUJBQUwsQ0FBK0JyRSxXQUEvQixFQUE0QzdDLE9BQTVDLENBQW9ELFVBQUFxQixZQUFZLEVBQUk7QUFDbkU4RixVQUFBQSxrQkFBa0IsQ0FBQzlGLFlBQVksQ0FBQ25ELGtCQUFkLENBQWxCLEdBQXNEbUQsWUFBdEQ7QUFDQSxTQUZEOztBQUdBLGVBQU84RixrQkFBUDtBQUNBOzs7YUFFRCx3QkFBb0I7QUFDbkIsZUFBTyxJQUFQO0FBQ0E7Ozs7SUExaEJzQ0MsTzs7OztNQTZoQmxDQyx5Qjs7Ozs7Ozs7Ozs7OzthQUNMLHdCQUFlQyxlQUFmLEVBQW1GO0FBQ2xGLFlBQU1DLHlCQUF5QixHQUFHLElBQUluSyxrQkFBSixDQUF1QmtLLGVBQXZCLENBQWxDO0FBQ0EsZUFBT0MseUJBQXlCLENBQUM1SixXQUFqQztBQUNBOzs7O0lBSnNDNkosYzs7U0FPekJILHlCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTZXJ2aWNlIGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VcIjtcbmltcG9ydCB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2VcIjtcbmltcG9ydCB7IENvbXBsZXhUeXBlLCBDb252ZXJ0ZXJPdXRwdXQsIEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBFbnZpcm9ubWVudENhcGFiaWxpdGllcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblR5cGVzLCBRdWFsaWZpZWROYW1lIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL0NvbW1vblwiO1xuaW1wb3J0IHsgQWN0aW9uLCBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuXG50eXBlIFNpZGVFZmZlY3RzU2V0dGluZ3MgPSB7fTtcblxudHlwZSBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGUgPSB7XG5cdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdCRQcm9wZXJ0eVBhdGg/OiBzdHJpbmc7XG59O1xudHlwZSBTaWRlRWZmZWN0c1RhcmdldCA9IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSB8IHN0cmluZztcblxudHlwZSBTaWRlRWZmZWN0c1RhcmdldFR5cGUgPSB7XG5cdFRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRUYXJnZXRFbnRpdGllczogU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlW107XG59O1xuXG50eXBlIEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRUYXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0VGFyZ2V0RW50aXRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhbXTtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG59O1xuXG50eXBlIEJhc2VTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xufSAmIFNpZGVFZmZlY3RzVGFyZ2V0VHlwZTtcblxudHlwZSBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXTtcblx0dHJpZ2dlckFjdGlvbnM/OiBRdWFsaWZpZWROYW1lW107XG59O1xuXG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNUeXBlID0gUGFydGlhbDxCYXNlU2lkZUVmZmVjdHNUeXBlPiAmIHtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG5cdFNvdXJjZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRzb3VyY2VDb250cm9sSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gQmFzZVNpZGVFZmZlY3RzVHlwZSAmIHtcblx0U291cmNlUHJvcGVydGllcz86IFByb3BlcnR5UGF0aFtdO1xuXHRTb3VyY2VFbnRpdGllcz86IE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhbXTtcblx0VHJpZ2dlckFjdGlvbj86IFF1YWxpZmllZE5hbWU7XG59O1xuXG5leHBvcnQgdHlwZSBTaWRlRWZmZWN0c1R5cGUgPSBDb250cm9sU2lkZUVmZmVjdHNUeXBlIHwgT0RhdGFTaWRlRWZmZWN0c1R5cGU7XG5cbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+O1xuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c0FjdGlvbkRpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+O1xuZXhwb3J0IHR5cGUgQ29udHJvbFNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+O1xuXG50eXBlIFNpZGVFZmZlY3RzT3JpZ2luUmVnaXN0cnkgPSB7XG5cdG9EYXRhOiB7XG5cdFx0ZW50aXRpZXM6IHtcblx0XHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPjtcblx0XHR9O1xuXHRcdGFjdGlvbnM6IHtcblx0XHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT47XG5cdFx0fTtcblx0fTtcblx0Y29udHJvbDoge1xuXHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+O1xuXHR9O1xufTtcblxudHlwZSBFeHRyYWN0b3JQcm9wZXJ0eUluZm8gPSB7XG5cdHByb3BlcnR5OiBQcm9wZXJ0eTtcblx0bmF2aWdhdGlvblBhdGg/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgU2lkZUVmZmVjdHNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGluaXRQcm9taXNlITogUHJvbWlzZTxhbnk+O1xuXHRfb1NpZGVFZmZlY3RzVHlwZSE6IFNpZGVFZmZlY3RzT3JpZ2luUmVnaXN0cnk7XG5cdF9vQ2FwYWJpbGl0aWVzITogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQ7XG5cdF9iSW5pdGlhbGl6ZWQhOiBib29sZWFuO1xuXHQvLyAhOiBtZWFucyB0aGF0IHdlIGtub3cgaXQgd2lsbCBiZSBhc3NpZ25lZCBiZWZvcmUgdXNhZ2Vcblx0aW5pdCgpIHtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRcdFx0b0RhdGE6IHtcblx0XHRcdFx0ZW50aXRpZXM6IHt9LFxuXHRcdFx0XHRhY3Rpb25zOiB7fVxuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2w6IHt9XG5cdFx0fTtcblx0XHR0aGlzLl9iSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmluaXRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBTaWRlRWZmZWN0cyBjb250cm9sXG5cdCAqIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gaXMgYWRkZWQgYnkgYSBjb250cm9sIHRvIGtlZXAgZGF0YSB1cCB0byBkYXRlXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGdldCBsaW1pdGVkIHNjb3BlIGNvbXBhcmVkIHdpdGggU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgc2VydmljZTpcblx0ICogLSBPbmx5IG9uZSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGNhbiBiZSBkZWZpbmVkIGZvciB0aGUgY29tYmluYXRpb24gZW50aXR5IHR5cGUgLSBjb250cm9sIElkXG5cdCAqIC0gT25seSBTaWRlRWZmZWN0cyBzb3VyY2UgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZCBhbmQgdXNlZCB0byB0cmlnZ2VyIFNpZGVFZmZlY3RzXG5cdCAqXG5cdCAqIEVuc3VyZSB0aGUgc291cmNlQ29udHJvbElkIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgU0FQVUk1IGNvbnRyb2wgSUQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGU6IHN0cmluZywgb1NpZGVFZmZlY3Q6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHRpZiAob1NpZGVFZmZlY3Quc291cmNlQ29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbFNpZGVFZmZlY3Q6IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFx0XHRcdC4uLm9TaWRlRWZmZWN0LFxuXHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IHNFbnRpdHlUeXBlICsgXCIvU2lkZUVmZmVjdHNGb3JDb250cm9sL1wiICsgb1NpZGVFZmZlY3Quc291cmNlQ29udHJvbElkXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgbUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyA9IHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV0gfHwge307XG5cdFx0XHRtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzW29Db250cm9sU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWRdID0gb0NvbnRyb2xTaWRlRWZmZWN0O1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXSA9IG1FbnRpdHlDb250cm9sU2lkZUVmZmVjdHM7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIFNpZGVFZmZlY3RzIGFjdGlvbi5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVHJpZ2dlckFjdGlvbiBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNHcm91cElkIFRoZSBncm91cCBJRCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIGV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb246IHN0cmluZywgb0NvbnRleHQ6IENvbnRleHQsIHNHcm91cElkPzogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb1RyaWdnZXJBY3Rpb246IGFueSA9IG9Db250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoc1RyaWdnZXJBY3Rpb24gKyBcIiguLi4pXCIsIG9Db250ZXh0KTtcblx0XHRvVHJpZ2dlckFjdGlvbi5leGVjdXRlKHNHcm91cElkIHx8IChvQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgY29udmVydGVkIE9EYXRhIG1ldGFNb2RlbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IENvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWxcblx0ICovXG5cdHB1YmxpYyBnZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTogQ29udmVydGVyT3V0cHV0IHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdCBhcyBhbnk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvQ29tcG9uZW50LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0cmV0dXJuIGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsLCB0aGlzLl9vQ2FwYWJpbGl0aWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBlbnRpdHkgdHlwZSBvZiBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZCB9IEVudGl0eSBUeXBlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdHNFbnRpdHlUeXBlID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoKVtcIiRUeXBlXCJdO1xuXHRcdHJldHVybiBzRW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzRW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuZW50aXRpZXNbc0VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQpOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQge1xuXHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRpZiAoc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuYWN0aW9uc1tzRW50aXR5VHlwZV0/LltzQWN0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb0NhcGFiaWxpdGllcyBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXNcblx0ICovXG5cdHB1YmxpYyBpbml0aWFsaXplU2lkZUVmZmVjdHMob0NhcGFiaWxpdGllcz86IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKTogdm9pZCB7XG5cdFx0dGhpcy5fb0NhcGFiaWxpdGllcyA9IG9DYXBhYmlsaXRpZXM7XG5cdFx0aWYgKCF0aGlzLl9iSW5pdGlhbGl6ZWQpIHtcblx0XHRcdGNvbnN0IG9Db252ZXJ0ZWRNZXRhTW9kZWwgPSB0aGlzLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpO1xuXHRcdFx0b0NvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlUeXBlcy5mb3JFYWNoKGVudGl0eVR5cGUgPT4ge1xuXHRcdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlKTtcblx0XHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5hY3Rpb25zW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7IC8vIG9ubHkgYm91bmQgYWN0aW9ucyBhcmUgYW5hbHl6ZWQgc2luY2UgdW5ib3VuZCBvbmVzIGRvbid0IGdldCBTaWRlRWZmZWN0c1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9iSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgY29udHJvbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQ29udHJvbElkIENvbnRyb2wgSWRcblx0ICovXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoc0NvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sKS5mb3JFYWNoKHNFbnRpdHlUeXBlID0+IHtcblx0XHRcdGlmICh0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFQYXRoRXhwcmVzc2lvbnMgVGFyZ2V0cyBvZiBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzR3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0cyhhUGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdLCBvQ29udGV4dDogQ29udGV4dCwgc0dyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuXHRcdHRoaXMuX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9ucywgb0NvbnRleHQpO1xuXHRcdGxldCBvUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRcdC8qKlxuXHRcdCAqIENvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzIGVpdGhlciByZXR1cm5zIGEgcHJvbWlzZSBvciB0aHJvd3MgYSBuZXcgZXJyb3IuIFRoaXMgcmV0dXJuIGlzIGNhdWdodCBpZiBhbiBlcnJvciBpcyB0aHJvd25cblx0XHQgKiB0byBhdm9pZCBicmVha2luZyB0aGUgcHJvbWlzZSBjaGFpbi5cblx0XHQgKi9cblx0XHR0cnkge1xuXHRcdFx0b1Byb21pc2UgPSAob0NvbnRleHQgYXMgYW55KS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVBhdGhFeHByZXNzaW9ucywgc0dyb3VwSWQpIGFzIFByb21pc2U8YW55Pjtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVqZWN0KGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBmb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc05hdmlnYXRpb25Qcm9wZXJ0eSBOYXZpZ2F0aW9uIHByb3BlcnR5XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShzTmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBzQmFzZUVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0aWYgKHNCYXNlRW50aXR5VHlwZSkge1xuXHRcdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gc05hdmlnYXRpb25Qcm9wZXJ0eSArIFwiL1wiO1xuXHRcdFx0Y29uc3QgYVNpZGVFZmZlY3RzID0gdGhpcy5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNCYXNlRW50aXR5VHlwZSk7XG5cdFx0XHRsZXQgYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblx0XHRcdE9iamVjdC5rZXlzKGFTaWRlRWZmZWN0cylcblx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHQvLyBLZWVwIHJlbGV2YW50IFNpZGVFZmZlY3RzXG5cdFx0XHRcdFx0c0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyB8fCBbXSkuc29tZShvUHJvcGVydHlQYXRoID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gb1Byb3BlcnR5UGF0aC52YWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5UGF0aC5zdGFydHNXaXRoKHNOYXZpZ2F0aW9uUGF0aCkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdHNQcm9wZXJ0eVBhdGgucmVwbGFjZShzTmF2aWdhdGlvblBhdGgsIFwiXCIpLmluZGV4T2YoXCIvXCIpID09PSAtMVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pIHx8XG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlRW50aXRpZXMgfHwgW10pLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT4gb05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgudmFsdWUgPT09IHNOYXZpZ2F0aW9uUHJvcGVydHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdFx0LmZvckVhY2goc0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gYVNpZGVFZmZlY3RzW3NBbm5vdGF0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKG9TaWRlRWZmZWN0cy5UcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmV4ZWN1dGVBY3Rpb24ob1NpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24gYXMgc3RyaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSlcblx0XHRcdFx0XHRcdC5jb25jYXQoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSlcblx0XHRcdFx0XHRcdC5mb3JFYWNoKG1UYXJnZXQgPT4gYVRhcmdldHMucHVzaChtVGFyZ2V0KSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzXG5cdFx0XHRhVGFyZ2V0cyA9IHRoaXMuX3JlbW92ZUR1cGxpY2F0ZVRhcmdldHMoYVRhcmdldHMpO1xuXHRcdFx0aWYgKGFUYXJnZXRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRzLCBvQ29udGV4dCkuY2F0Y2gob0Vycm9yID0+XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiU2lkZUVmZmVjdHMgLSBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIFNpZGVFZmZlY3RzIGZvciBOYXZpZ2F0aW9uIFByb3BlcnR5IFwiICsgc05hdmlnYXRpb25Qcm9wZXJ0eSwgb0Vycm9yKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gY29udHJvbHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGVOYW1lIEVudGl0eSB0eXBlIE5hbWVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHVibGljIGdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyhzRW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlTmFtZV0gfHwge307XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyB0aGUgdGV4dCBwcm9wZXJ0aWVzIHJlcXVpcmVkIGZvciBTaWRlRWZmZWN0c1xuXHQgKiBJZiBhIHByb3BlcnR5IGhhcyBhbiBhc3NvY2lhdGVkIHRleHQgdGhlbiB0aGlzIHRleHQgbmVlZHMgdG8gYmUgYWRkZWQgYXMgdGFyZ2V0UHJvcGVydGllcyBvciB0YXJnZXRFbnRpdGllcy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIHdpdGggYWRkZWQgdGV4dCBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRwcml2YXRlIF9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzKG9TaWRlRWZmZWN0OiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBtRW50aXR5VHlwZTogRW50aXR5VHlwZSk6IEJhc2VTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IGFJbml0aWFsUHJvcGVydGllczogc3RyaW5nW10gPSBvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzIHx8IFtdLFxuXHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkOiBzdHJpbmdbXSA9IChvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyB8fCBbXSkubWFwKG5hdmlnYXRpb24gPT4gbmF2aWdhdGlvbi4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0bGV0IGFEZXJpdmVkUHJvcGVydGllczogRXh0cmFjdG9yUHJvcGVydHlJbmZvW10gPSBbXTtcblxuXHRcdGFJbml0aWFsUHJvcGVydGllcy5mb3JFYWNoKHNQcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0Y29uc3QgYklzU3RhclByb3BlcnR5ID0gc1Byb3BlcnR5UGF0aC5lbmRzV2l0aChcIipcIiksIC8vIENhbiBiZSAnKicgb3IgJy4uLi9uYXZQcm9wLyonXG5cdFx0XHRcdHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBzUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSksXG5cdFx0XHRcdHNSZWxhdGl2ZVBhdGggPSBzTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoICsgXCIvXCIgOiBcIlwiLFxuXHRcdFx0XHRtVGFyZ2V0OiBhbnkgPSBtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgfHwgbUVudGl0eVR5cGU7XG5cblx0XHRcdGlmIChtVGFyZ2V0KSB7XG5cdFx0XHRcdC8vIG1UYXJnZXQgY2FuIGJlIGFuIGVudGl0eSB0eXBlLCBuYXZpZ2F0aW9uUHJvcGVydHkgb3Igb3IgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRjb25zdCBhVGFyZ2V0RW50aXR5UHJvcGVydGllczogUHJvcGVydHlbXSA9XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgRW50aXR5VHlwZSkuZW50aXR5UHJvcGVydGllcyB8fFxuXHRcdFx0XHRcdCgobVRhcmdldCBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZSBhcyBDb21wbGV4VHlwZSk/LnByb3BlcnRpZXMgfHxcblx0XHRcdFx0XHQobVRhcmdldCBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpLnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcztcblx0XHRcdFx0aWYgKGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdFx0aWYgKGJJc1N0YXJQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0Ly8gQWRkIGFsbCByZXF1aXJlZCBwcm9wZXJ0aWVzIGJlaGluZCB0aGUgKlxuXHRcdFx0XHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkLnB1c2goc05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdFx0YURlcml2ZWRQcm9wZXJ0aWVzID0gYURlcml2ZWRQcm9wZXJ0aWVzLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0YVRhcmdldEVudGl0eVByb3BlcnRpZXMubWFwKG1Qcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoOiBzUmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IG1Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhRGVyaXZlZFByb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5OiBhVGFyZ2V0RW50aXR5UHJvcGVydGllcy5maW5kKFxuXHRcdFx0XHRcdFx0XHRcdG1Qcm9wZXJ0eSA9PiBtUHJvcGVydHkubmFtZSA9PT0gc1Byb3BlcnR5UGF0aC5zcGxpdChcIi9cIikucG9wKClcblx0XHRcdFx0XHRcdFx0KSBhcyBQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0bmF2aWdhdGlvblBhdGg6IHNSZWxhdGl2ZVBhdGhcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRMb2cuaW5mbyhcIlNpZGVFZmZlY3RzIC0gVGhlIGVudGl0eSB0eXBlIGFzc29jaWF0ZWQgdG8gcHJvcGVydHkgcGF0aCBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBjYW5ub3QgYmUgcmVzb2x2ZWRcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiU2lkZUVmZmVjdHMgLSBUaGUgcHJvcGVydHkgcGF0aCBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBjYW5ub3QgYmUgcmVzb2x2ZWRcIik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRhRGVyaXZlZFByb3BlcnRpZXMuZm9yRWFjaChtUHJvcGVydHlJbmZvID0+IHtcblx0XHRcdGlmIChtUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXRUZXh0UGF0aCA9IChtUHJvcGVydHlJbmZvLnByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlRleHQgYXMgYW55KT8ucGF0aCxcblx0XHRcdFx0XHRzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSA9IG1Qcm9wZXJ0eUluZm8ubmF2aWdhdGlvblBhdGggKyBzVGFyZ2V0VGV4dFBhdGgsXG5cdFx0XHRcdFx0c1RhcmdldENvbGxlY3Rpb25QYXRoID0gc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkuc3Vic3RyaW5nKDAsIHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5Lmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgcHJvcGVydHkgVGV4dCBtdXN0IGJlIGFkZGVkIG9ubHkgaWYgdGhlIHByb3BlcnR5IGlzXG5cdFx0XHRcdCAqIC0gbm90IHBhcnQgb2YgYSBzdGFyIHByb3BlcnR5ICguaS5lICcqJyBvciAnbmF2aWdhdGlvbi8qJykgb3IgYSB0YXJnZXRlZCBFbnRpdHlcblx0XHRcdFx0ICogLSBub3QgaW5jbHVkZSBpbnRvIHRoZSBpbml0aWFsIHRhcmdldGVkIHByb3BlcnRpZXMgb2YgU2lkZUVmZmVjdHNcblx0XHRcdFx0ICogIEluZGVlZCBpbiB0aGUgdHdvIGxpc3RlZCBjYXNlcywgdGhlIHByb3BlcnR5IGNvbnRhaW5pbmcgdGV4dCB3aWxsIGJlL2lzIHJlcXVlc3RlZCBieSBpbml0aWFsIFNpZGVFZmZlY3RzIGNvbmZpZ3VyYXRpb24uXG5cdFx0XHRcdCAqL1xuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzVGFyZ2V0VGV4dFBhdGggJiZcblx0XHRcdFx0XHRhRW50aXRpZXNSZXF1ZXN0ZWQuaW5kZXhPZihzVGFyZ2V0Q29sbGVjdGlvblBhdGgpID09PSAtMSAmJlxuXHRcdFx0XHRcdGFJbml0aWFsUHJvcGVydGllcy5pbmRleE9mKHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5KSA9PT0gLTFcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gVGhlIFRleHQgYXNzb2NpYXRpb24gaXMgYWRkZWQgYXMgVGFyZ2V0RW50aXRpZXMgaWYgaXQncyBjb250YWluZWQgb24gYSBkaWZmZXJlbnQgZW50aXR5U2V0IGFuZCBub3QgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBpdCdzIGFkZGVkIGFzIHRhcmdldFByb3BlcnRpZXNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRzVGFyZ2V0VGV4dFBhdGgubGFzdEluZGV4T2YoXCIvXCIpID4gLTEgJiZcblx0XHRcdFx0XHRcdG1FbnRpdHlUeXBlLnJlc29sdmVQYXRoKHNUYXJnZXRDb2xsZWN0aW9uUGF0aCk/Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcy5wdXNoKHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNUYXJnZXRDb2xsZWN0aW9uUGF0aCB9KTtcblx0XHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5wdXNoKHNUYXJnZXRDb2xsZWN0aW9uUGF0aCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMucHVzaChzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3Q7XG5cdH1cblx0LyoqXG5cdCAqIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBSZW1vdmVzIGJpbmRpbmcgcGFyYW1ldGVyIGZyb20gU2lkZUVmZmVjdHMgdGFyZ2V0cyBwcm9wZXJ0aWVzXG5cdCAqICAtIEFkZHMgdGhlIHRleHQgcHJvcGVydGllc1xuXHQgKiAgLSBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG1FbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQmluZGluZ1BhcmFtZXRlciBOYW1lIG9mIHRoZSBiaW5kaW5nIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9jb252ZXJ0U2lkZUVmZmVjdHMoXG5cdFx0b1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHwgQmFzZUFubm90YXRpb25TaWRlRWZmZWN0c1R5cGUsXG5cdFx0bUVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c0JpbmRpbmdQYXJhbWV0ZXI/OiBzdHJpbmdcblx0KTogT0RhdGFTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IG9UZW1wU2lkZUVmZmVjdHMgPSB0aGlzLl9yZW1vdmVCaW5kaW5nUGFyYW1ldGVyKHRoaXMuX2NvbnZlcnRUYXJnZXRzRm9ybWF0KG9TaWRlRWZmZWN0cyksIHNCaW5kaW5nUGFyYW1ldGVyKTtcblx0XHRyZXR1cm4gdGhpcy5fYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyhvVGVtcFNpZGVFZmZlY3RzLCBtRW50aXR5VHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgU2lkZUVmZmVjdHMgdGFyZ2V0cyAoVGFyZ2V0RW50aXRpZXMgYW5kIFRhcmdldFByb3BlcnRpZXMpIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBUYXJnZXRQcm9wZXJ0aWVzIGFzIGFycmF5IG9mIHN0cmluZ1xuXHQgKiAgLSBUYXJnZXRFbnRpdGllcyBhcyBhcnJheSBvZiBvYmplY3Qgd2l0aCBwcm9wZXJ0eSAkTmF2aWdhdGlvblByb3BlcnR5UGF0aC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBDb252ZXJ0ZWQgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2NvbnZlcnRUYXJnZXRzRm9ybWF0KG9TaWRlRWZmZWN0czogQmFzZVNpZGVFZmZlY3RzVHlwZSB8IEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlKTogQmFzZVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgVGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSAoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSkucmVkdWNlKGZ1bmN0aW9uKGFUYXJnZXRQcm9wZXJ0aWVzLCB2VGFyZ2V0KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXQgPSAodHlwZW9mIHZUYXJnZXQgPT09IFwic3RyaW5nXCIgJiYgdlRhcmdldCkgfHwgKHZUYXJnZXQudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIiAmJiB2VGFyZ2V0LnZhbHVlKTtcblx0XHRcdFx0aWYgKHNUYXJnZXQpIHtcblx0XHRcdFx0XHRhVGFyZ2V0UHJvcGVydGllcy5wdXNoKHNUYXJnZXQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIlNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBUYXJnZXRQcm9wZXJ0aWVzIGZvciBTaWRlRWZmZWN0c1wiICsgb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGFUYXJnZXRQcm9wZXJ0aWVzO1xuXHRcdFx0fSwgW10pLFxuXHRcdFx0VGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKS5tYXAobVRhcmdldEVudGl0eSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiAgU2lkZUVmZmVjdHMgdGhhdCBjb21lcyBmcm9tIFNBUCBGRSBnZXQgVGFyZ2V0RW50aXRpZXMgd2l0aCAkTmF2aWdhdGlvblByb3BlcnR5UGF0aCB3aGVyZWFzXG5cdFx0XHRcdCAqICBvbmVzIGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZWQgT0RhdGEgbW9kZWwgZ2V0cyBhIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggZm9ybWF0XG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRyZXR1cm4geyBcIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCI6IG1UYXJnZXRFbnRpdHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldEVudGl0eS52YWx1ZSB8fCBcIlwiIH07XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4geyAuLi5vU2lkZUVmZmVjdHMsIC4uLnsgVGFyZ2V0UHJvcGVydGllcywgVGFyZ2V0RW50aXRpZXMgfSB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhbiBlbnRpdHkgdHlwZSBvciBhY3Rpb24gdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGggZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Tb3VyY2UgRW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEFycmF5IG9mIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2Uob1NvdXJjZTogYW55KTogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSB7XG5cdFx0Y29uc3QgYVNpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdID0gW107XG5cdFx0Y29uc3QgYXV0aG9yaXplZFR5cGVzID0gW1wiRW50aXR5VHlwZVwiLCBcIkFjdGlvblwiXTtcblx0XHRpZiAob1NvdXJjZS5fdHlwZSAmJiBhdXRob3JpemVkVHlwZXMuaW5kZXhPZihvU291cmNlLl90eXBlKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBtRW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCA9IG9Tb3VyY2UuX3R5cGUgPT09IFwiRW50aXR5VHlwZVwiID8gb1NvdXJjZSA6IG9Tb3VyY2Uuc291cmNlRW50aXR5VHlwZTtcblx0XHRcdGlmIChtRW50aXR5VHlwZSkge1xuXHRcdFx0XHRjb25zdCBtQ29tbW9uQW5ub3RhdGlvbjogYW55ID0gb1NvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uIHx8IHt9O1xuXHRcdFx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlciA9ICgob1NvdXJjZSBhcyBBY3Rpb24pLnBhcmFtZXRlcnMgfHwgW10pLmZpbmQoXG5cdFx0XHRcdFx0bVBhcmFtZXRlciA9PiBtUGFyYW1ldGVyLnR5cGUgPT09IG1FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBzQmluZGluZ1BhcmFtZXRlciA9IG1CaW5kaW5nUGFyYW1ldGVyID8gbUJpbmRpbmdQYXJhbWV0ZXIuZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KFwiL1wiKVsxXSA6IFwiXCI7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db21tb25Bbm5vdGF0aW9uKVxuXHRcdFx0XHRcdC5maWx0ZXIoc0Fubm90YXRpb25OYW1lID0+IG1Db21tb25Bbm5vdGF0aW9uW3NBbm5vdGF0aW9uTmFtZV0uJFR5cGUgPT09IENvbW1vbkFubm90YXRpb25UeXBlcy5TaWRlRWZmZWN0c1R5cGUpXG5cdFx0XHRcdFx0LmZvckVhY2goc0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGFTaWRlRWZmZWN0cy5wdXNoKHRoaXMuX2NvbnZlcnRTaWRlRWZmZWN0cyhtQ29tbW9uQW5ub3RhdGlvbltzQW5ub3RhdGlvbk5hbWVdLCBtRW50aXR5VHlwZSwgc0JpbmRpbmdQYXJhbWV0ZXIpKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIFNpZGVFZmZlY3RzIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhUGF0aEV4cHJlc3Npb25zIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICovXG5cdHByaXZhdGUgX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBzVGFyZ2V0UGF0aHMgPSBhUGF0aEV4cHJlc3Npb25zLnJlZHVjZShmdW5jdGlvbihzUGF0aHMsIG1UYXJnZXQpIHtcblx0XHRcdHJldHVybiBzUGF0aHMgKyBcIlxcblxcdFxcdFwiICsgKChtVGFyZ2V0IGFzIFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldCB8fCBcIlwiKTtcblx0XHR9LCBcIlwiKTtcblx0XHRMb2cuZGVidWcoXCJTaWRlRWZmZWN0cyAtIFJlcXVlc3Q6XFxuXFx0Q29udGV4dCBwYXRoIDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkgKyBcIlxcblxcdFByb3BlcnR5IHBhdGhzIDpcIiArIHNUYXJnZXRQYXRocyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBuYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyIG9uIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNCaW5kaW5nUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIob1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBzQmluZGluZ1BhcmFtZXRlck5hbWU/OiBzdHJpbmcpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRpZiAoc0JpbmRpbmdQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRjb25zdCBhVGFyZ2V0cyA9IFtcIlRhcmdldFByb3BlcnRpZXNcIiwgXCJUYXJnZXRFbnRpdGllc1wiXTtcblx0XHRcdGFUYXJnZXRzLmZvckVhY2goc1RhcmdldCA9PiB7XG5cdFx0XHRcdGxldCBtVGFyZ2V0ID0gKG9TaWRlRWZmZWN0cyBhcyBhbnkpW3NUYXJnZXRdO1xuXHRcdFx0XHRpZiAobVRhcmdldCkge1xuXHRcdFx0XHRcdG1UYXJnZXQgPSBtVGFyZ2V0Lm1hcCgobVByb3BlcnR5OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoICE9PSB1bmRlZmluZWQ7IC8vIE5lZWQgdG8gdGVzdCB3aXRoIHVuZGVmaW5lZCBzaW5jZSAgbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGNvdWxkIGJlIFwiXCIgKGVtcHR5IHN0cmluZylcblx0XHRcdFx0XHRcdGNvbnN0IHNWYWx1ZSA9IChiTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IG1Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA6IG1Qcm9wZXJ0eSkucmVwbGFjZShcblx0XHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcIl5cIiArIHNCaW5kaW5nUGFyYW1ldGVyTmFtZSArIFwiLz9cIiksXG5cdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzVmFsdWUgfSA6IHNWYWx1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQob1NpZGVFZmZlY3RzIGFzIGFueSlbc1RhcmdldF0gPSBtVGFyZ2V0O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGR1cGxpY2F0ZXMgaW4gU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFUYXJnZXRzIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHJldHVybnMge0FycmF5fSBTaWRlRWZmZWN0cyB0YXJnZXRzIHdpdGhvdXQgZHVwbGljYXRlc1xuXHQgKi9cblx0cHJpdmF0ZSBfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSk6IFNpZGVFZmZlY3RzVGFyZ2V0W10ge1xuXHRcdHJldHVybiBhVGFyZ2V0cy5maWx0ZXIoXG5cdFx0XHQobVRhcmdldDogYW55LCBpSW5kZXgsIGFUYXJnZXRzKSA9PlxuXHRcdFx0XHRhVGFyZ2V0cy5maW5kSW5kZXgoKG1TZWFyY2hUYXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRtU2VhcmNoVGFyZ2V0ID09PSBtVGFyZ2V0IHx8IC8vIFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0KG1UYXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggJiYgbVNlYXJjaFRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gbVRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgLy8gTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pID09PSBpSW5kZXhcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgYWN0aW9uIHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyBvbiBhY3Rpb25zXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIF9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0Y29uc3QgYUFjdGlvbnMgPSBtRW50aXR5VHlwZS5hY3Rpb25zO1xuXHRcdGlmIChhQWN0aW9ucykge1xuXHRcdFx0T2JqZWN0LmtleXMoYUFjdGlvbnMpLmZvckVhY2goc0FjdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRjb25zdCBvQWN0aW9uID0gbUVudGl0eVR5cGUuYWN0aW9uc1tzQWN0aW9uTmFtZV07XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJBY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRsZXQgcGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdID0gW107XG5cdFx0XHRcdGxldCBhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXG5cdFx0XHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShvQWN0aW9uKS5mb3JFYWNoKG9TaWRlRWZmZWN0ID0+IHtcblx0XHRcdFx0XHRjb25zdCBzVHJpZ2dlckFjdGlvbiA9IG9TaWRlRWZmZWN0LlRyaWdnZXJBY3Rpb247XG5cdFx0XHRcdFx0YVRhcmdldHMgPSBhVGFyZ2V0cy5jb25jYXQob1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMgfHwgW10pLmNvbmNhdCgob1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pO1xuXHRcdFx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbiAmJiB0cmlnZ2VyQWN0aW9ucy5pbmRleE9mKHNUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZykgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9ucy5wdXNoKHNUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cGF0aEV4cHJlc3Npb25zID0gdGhpcy5fcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0cyk7XG5cdFx0XHRcdG9TaWRlRWZmZWN0c1tzQWN0aW9uTmFtZV0gPSB7IHBhdGhFeHByZXNzaW9ucywgdHJpZ2dlckFjdGlvbnMgfTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgZW50aXR5IHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0c1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSBfcmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBvRW50aXR5U2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShtRW50aXR5VHlwZSkuZm9yRWFjaChvU2lkZUVmZmVjdHMgPT4ge1xuXHRcdFx0b0VudGl0eVNpZGVFZmZlY3RzW29TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gb1NpZGVFZmZlY3RzO1xuXHRcdH0pO1xuXHRcdHJldHVybiBvRW50aXR5U2lkZUVmZmVjdHM7XG5cdH1cblxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRjcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQ6IFNlcnZpY2VDb250ZXh0PFNpZGVFZmZlY3RzU2V0dGluZ3M+KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlID0gbmV3IFNpZGVFZmZlY3RzU2VydmljZShvU2VydmljZUNvbnRleHQpO1xuXHRcdHJldHVybiBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzU2VydmljZUZhY3Rvcnk7XG4iXX0=
|
|
663
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwibmFtZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlIiwiaW5pdCIsIl9vU2lkZUVmZmVjdHNUeXBlIiwib0RhdGEiLCJlbnRpdGllcyIsImFjdGlvbnMiLCJjb250cm9sIiwiX2JJbml0aWFsaXplZCIsImluaXRQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhZGRDb250cm9sU2lkZUVmZmVjdHMiLCJzRW50aXR5VHlwZSIsIm9TaWRlRWZmZWN0Iiwic291cmNlQ29udHJvbElkIiwib0NvbnRyb2xTaWRlRWZmZWN0IiwiZnVsbHlRdWFsaWZpZWROYW1lIiwibUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyIsImV4ZWN1dGVBY3Rpb24iLCJzVHJpZ2dlckFjdGlvbiIsIm9Db250ZXh0Iiwic0dyb3VwSWQiLCJvVHJpZ2dlckFjdGlvbiIsImdldE1vZGVsIiwiYmluZENvbnRleHQiLCJleGVjdXRlIiwiZ2V0QmluZGluZyIsImdldFVwZGF0ZUdyb3VwSWQiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImNvbnZlcnRUeXBlcyIsIl9vQ2FwYWJpbGl0aWVzIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0Iiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsInNFbnRpdHlUeXBlTmFtZSIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJzQWN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImluaXRpYWxpemVTaWRlRWZmZWN0cyIsIm9DYXBhYmlsaXRpZXMiLCJvQ29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmb3JFYWNoIiwiZW50aXR5VHlwZSIsIl9yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJfcmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyIsInJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyIsInNDb250cm9sSWQiLCJPYmplY3QiLCJrZXlzIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiYVBhdGhFeHByZXNzaW9ucyIsIl9sb2dSZXF1ZXN0Iiwib1Byb21pc2UiLCJlIiwicmVqZWN0IiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJzaWRlRWZmZWN0cyIsImFQcm9taXNlcyIsInRyaWdnZXJBY3Rpb25zIiwibGVuZ3RoIiwibWFwIiwic1RyaWdnZXJBY3Rpb25OYW1lIiwicGF0aEV4cHJlc3Npb25zIiwicHVzaCIsImFsbCIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsInNOYXZpZ2F0aW9uUHJvcGVydHkiLCJzQmFzZUVudGl0eVR5cGUiLCJzTmF2aWdhdGlvblBhdGgiLCJhU2lkZUVmZmVjdHMiLCJhVGFyZ2V0cyIsImZpbHRlciIsInNBbm5vdGF0aW9uTmFtZSIsIm9TaWRlRWZmZWN0cyIsIlNvdXJjZVByb3BlcnRpZXMiLCJzb21lIiwib1Byb3BlcnR5UGF0aCIsInNQcm9wZXJ0eVBhdGgiLCJ2YWx1ZSIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwiaW5kZXhPZiIsIlNvdXJjZUVudGl0aWVzIiwib05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJUcmlnZ2VyQWN0aW9uIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwibVRhcmdldCIsIl9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyIsIl9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzIiwibUVudGl0eVR5cGUiLCJhSW5pdGlhbFByb3BlcnRpZXMiLCJhRW50aXRpZXNSZXF1ZXN0ZWQiLCJuYXZpZ2F0aW9uIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJhRGVyaXZlZFByb3BlcnRpZXMiLCJiSXNTdGFyUHJvcGVydHkiLCJlbmRzV2l0aCIsInNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJzUmVsYXRpdmVQYXRoIiwicmVzb2x2ZVBhdGgiLCJhVGFyZ2V0RW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnRpZXMiLCJ0YXJnZXRUeXBlIiwicHJvcGVydGllcyIsIm1Qcm9wZXJ0eSIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydHkiLCJmaW5kIiwibmFtZSIsInNwbGl0IiwicG9wIiwiaW5mbyIsIm1Qcm9wZXJ0eUluZm8iLCJzVGFyZ2V0VGV4dFBhdGgiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJwYXRoIiwic1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkiLCJzVGFyZ2V0Q29sbGVjdGlvblBhdGgiLCJfdHlwZSIsIl9jb252ZXJ0U2lkZUVmZmVjdHMiLCJzQmluZGluZ1BhcmFtZXRlciIsIm9UZW1wU2lkZUVmZmVjdHMiLCJfcmVtb3ZlQmluZGluZ1BhcmFtZXRlciIsIl9jb252ZXJ0VGFyZ2V0c0Zvcm1hdCIsInJlZHVjZSIsImFUYXJnZXRQcm9wZXJ0aWVzIiwidlRhcmdldCIsInNUYXJnZXQiLCJ0eXBlIiwibVRhcmdldEVudGl0eSIsIl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UiLCJvU291cmNlIiwiYXV0aG9yaXplZFR5cGVzIiwic291cmNlRW50aXR5VHlwZSIsIm1Db21tb25Bbm5vdGF0aW9uIiwibUJpbmRpbmdQYXJhbWV0ZXIiLCJwYXJhbWV0ZXJzIiwibVBhcmFtZXRlciIsIiRUeXBlIiwic1RhcmdldFBhdGhzIiwic1BhdGhzIiwiZGVidWciLCJzQmluZGluZ1BhcmFtZXRlck5hbWUiLCJiTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInNWYWx1ZSIsIlJlZ0V4cCIsImlJbmRleCIsImZpbmRJbmRleCIsIm1TZWFyY2hUYXJnZXQiLCJhQWN0aW9ucyIsIm9BY3Rpb24iLCJvRW50aXR5U2lkZUVmZmVjdHMiLCJnZXRJbnRlcmZhY2UiLCJTZXJ2aWNlIiwiU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeSIsImNyZWF0ZUluc3RhbmNlIiwib1NlcnZpY2VDb250ZXh0IiwiU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZSIsIlNlcnZpY2VGYWN0b3J5Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztNQTBFYUEsa0I7Ozs7Ozs7Ozs7QUFLWjtXQUNBQyxJLEdBQUEsZ0JBQU87QUFDTixXQUFLQyxpQkFBTCxHQUF5QjtBQUN4QkMsUUFBQUEsS0FBSyxFQUFFO0FBQ05DLFVBQUFBLFFBQVEsRUFBRSxFQURKO0FBRU5DLFVBQUFBLE9BQU8sRUFBRTtBQUZILFNBRGlCO0FBS3hCQyxRQUFBQSxPQUFPLEVBQUU7QUFMZSxPQUF6QjtBQU9BLFdBQUtDLGFBQUwsR0FBcUIsS0FBckI7QUFDQSxXQUFLQyxXQUFMLEdBQW1CQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsSUFBaEIsQ0FBbkI7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNRQyxxQixHQUFQLCtCQUE2QkMsV0FBN0IsRUFBa0RDLFdBQWxELEVBQXlIO0FBQ3hILFVBQUlBLFdBQVcsQ0FBQ0MsZUFBaEIsRUFBaUM7QUFDaEMsWUFBTUMsa0JBQTBDLG1DQUM1Q0YsV0FENEM7QUFFL0NHLFVBQUFBLGtCQUFrQixFQUFFSixXQUFXLEdBQUcseUJBQWQsR0FBMENDLFdBQVcsQ0FBQ0M7QUFGM0IsVUFBaEQ7O0FBSUEsWUFBTUcseUJBQXlCLEdBQUcsS0FBS2YsaUJBQUwsQ0FBdUJJLE9BQXZCLENBQStCTSxXQUEvQixLQUErQyxFQUFqRjtBQUNBSyxRQUFBQSx5QkFBeUIsQ0FBQ0Ysa0JBQWtCLENBQUNELGVBQXBCLENBQXpCLEdBQWdFQyxrQkFBaEU7QUFDQSxhQUFLYixp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SUFBUDtBQUNBLEs7OztJQTdpQnNDQyxPOzs7O01BZ2pCbENDLHlCOzs7Ozs7Ozs7WUFDTEMsYyxHQUFBLHdCQUFlQyxlQUFmLEVBQW1GO0FBQ2xGLFVBQU1DLHlCQUF5QixHQUFHLElBQUlqTCxrQkFBSixDQUF1QmdMLGVBQXZCLENBQWxDO0FBQ0EsYUFBT0MseUJBQXlCLENBQUN6SyxXQUFqQztBQUNBLEs7OztJQUpzQzBLLGM7O1NBT3pCSix5QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNlcnZpY2VGYWN0b3J5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb21wbGV4VHlwZSwgQ29udmVydGVyT3V0cHV0LCBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UeXBlcywgUXVhbGlmaWVkTmFtZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9Db21tb25cIjtcbmltcG9ydCB7IEFjdGlvbiwgTmF2aWdhdGlvblByb3BlcnR5UGF0aCwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcblxudHlwZSBTaWRlRWZmZWN0c1NldHRpbmdzID0ge307XG5cbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlID0ge1xuXHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHQkUHJvcGVydHlQYXRoPzogc3RyaW5nO1xufTtcbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXQgPSBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGUgfCBzdHJpbmc7XG5cbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHRUYXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0VGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdO1xufTtcblxudHlwZSBCYXNlQW5ub3RhdGlvblNpZGVFZmZlY3RzVHlwZSA9IHtcblx0VGFyZ2V0UHJvcGVydGllczogc3RyaW5nW107XG5cdFRhcmdldEVudGl0aWVzOiBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoW107XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xufTtcblxudHlwZSBCYXNlU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcbn0gJiBTaWRlRWZmZWN0c1RhcmdldFR5cGU7XG5cbmV4cG9ydCB0eXBlIEFjdGlvblNpZGVFZmZlY3RzVHlwZSA9IHtcblx0cGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdO1xuXHR0cmlnZ2VyQWN0aW9ucz86IFF1YWxpZmllZE5hbWVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSBQYXJ0aWFsPEJhc2VTaWRlRWZmZWN0c1R5cGU+ICYge1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcblx0U291cmNlUHJvcGVydGllczogc3RyaW5nW107XG5cdHNvdXJjZUNvbnRyb2xJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBCYXNlU2lkZUVmZmVjdHNUeXBlICYge1xuXHRTb3VyY2VQcm9wZXJ0aWVzPzogUHJvcGVydHlQYXRoW107XG5cdFNvdXJjZUVudGl0aWVzPzogTmF2aWdhdGlvblByb3BlcnR5UGF0aFtdO1xuXHRUcmlnZ2VyQWN0aW9uPzogUXVhbGlmaWVkTmFtZTtcbn07XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVHlwZSA9IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgfCBPRGF0YVNpZGVFZmZlY3RzVHlwZTtcblxuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT47XG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzQWN0aW9uRGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT47XG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT47XG5cbnR5cGUgU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeSA9IHtcblx0b0RhdGE6IHtcblx0XHRlbnRpdGllczoge1xuXHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+O1xuXHRcdH07XG5cdFx0YWN0aW9uczoge1xuXHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPjtcblx0XHR9O1xuXHR9O1xuXHRjb250cm9sOiB7XG5cdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT47XG5cdH07XG59O1xuXG50eXBlIEV4dHJhY3RvclByb3BlcnR5SW5mbyA9IHtcblx0cHJvcGVydHk6IFByb3BlcnR5O1xuXHRuYXZpZ2F0aW9uUGF0aD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPFNpZGVFZmZlY3RzU2V0dGluZ3M+IHtcblx0aW5pdFByb21pc2UhOiBQcm9taXNlPGFueT47XG5cdF9vU2lkZUVmZmVjdHNUeXBlITogU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeTtcblx0X29DYXBhYmlsaXRpZXMhOiBFbnZpcm9ubWVudENhcGFiaWxpdGllcyB8IHVuZGVmaW5lZDtcblx0X2JJbml0aWFsaXplZCE6IGJvb2xlYW47XG5cdC8vICE6IG1lYW5zIHRoYXQgd2Uga25vdyBpdCB3aWxsIGJlIGFzc2lnbmVkIGJlZm9yZSB1c2FnZVxuXHRpbml0KCkge1xuXHRcdHRoaXMuX29TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFx0XHRvRGF0YToge1xuXHRcdFx0XHRlbnRpdGllczoge30sXG5cdFx0XHRcdGFjdGlvbnM6IHt9XG5cdFx0XHR9LFxuXHRcdFx0Y29udHJvbDoge31cblx0XHR9O1xuXHRcdHRoaXMuX2JJbml0aWFsaXplZCA9IGZhbHNlO1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIFNpZGVFZmZlY3RzIGNvbnRyb2xcblx0ICogU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiBpcyBhZGRlZCBieSBhIGNvbnRyb2wgdG8ga2VlcCBkYXRhIHVwIHRvIGRhdGVcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgZ2V0IGxpbWl0ZWQgc2NvcGUgY29tcGFyZWQgd2l0aCBTaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlOlxuXHQgKiAtIE9ubHkgb25lIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gY2FuIGJlIGRlZmluZWQgZm9yIHRoZSBjb21iaW5hdGlvbiBlbnRpdHkgdHlwZSAtIGNvbnRyb2wgSWRcblx0ICogLSBPbmx5IFNpZGVFZmZlY3RzIHNvdXJjZSBwcm9wZXJ0aWVzIGFyZSByZWNvZ25pemVkIGFuZCB1c2VkIHRvIHRyaWdnZXIgU2lkZUVmZmVjdHNcblx0ICpcblx0ICogRW5zdXJlIHRoZSBzb3VyY2VDb250cm9sSWQgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBTQVBVSTUgY29udHJvbCBJRC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRW50aXR5VHlwZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3QgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHVibGljIGFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZTogc3RyaW5nLCBvU2lkZUVmZmVjdDogT21pdDxDb250cm9sU2lkZUVmZmVjdHNUeXBlLCBcImZ1bGx5UXVhbGlmaWVkTmFtZVwiPik6IHZvaWQge1xuXHRcdGlmIChvU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWQpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdDogQ29udHJvbFNpZGVFZmZlY3RzVHlwZSA9IHtcblx0XHRcdFx0Li4ub1NpZGVFZmZlY3QsXG5cdFx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogc0VudGl0eVR5cGUgKyBcIi9TaWRlRWZmZWN0c0ZvckNvbnRyb2wvXCIgKyBvU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWRcblx0XHRcdH07XG5cdFx0XHRjb25zdCBtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzID0gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXSB8fCB7fTtcblx0XHRcdG1FbnRpdHlDb250cm9sU2lkZUVmZmVjdHNbb0NvbnRyb2xTaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZF0gPSBvQ29udHJvbFNpZGVFZmZlY3Q7XG5cdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdID0gbUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cztcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgU2lkZUVmZmVjdHMgYWN0aW9uLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUcmlnZ2VyQWN0aW9uIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0dyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRob3V0IGRhdGEgb3Igd2l0aCBhIHJldHVybiB2YWx1ZSBjb250ZXh0IHdoZW4gdGhlIGFjdGlvbiBjYWxsIHN1Y2NlZWRlZFxuXHQgKi9cblx0cHVibGljIGV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb246IHN0cmluZywgb0NvbnRleHQ6IENvbnRleHQsIHNHcm91cElkPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvVHJpZ2dlckFjdGlvbjogYW55ID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzVHJpZ2dlckFjdGlvbiArIFwiKC4uLilcIiwgb0NvbnRleHQpO1xuXHRcdHJldHVybiBvVHJpZ2dlckFjdGlvbi5leGVjdXRlKHNHcm91cElkIHx8IChvQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgY29udmVydGVkIE9EYXRhIG1ldGFNb2RlbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IENvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWxcblx0ICovXG5cdHB1YmxpYyBnZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTogQ29udmVydGVyT3V0cHV0IHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdCBhcyBhbnk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvQ29tcG9uZW50LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0cmV0dXJuIGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsLCB0aGlzLl9vQ2FwYWJpbGl0aWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBlbnRpdHkgdHlwZSBvZiBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZCB9IEVudGl0eSBUeXBlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdHNFbnRpdHlUeXBlID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoKVtcIiRUeXBlXCJdO1xuXHRcdHJldHVybiBzRW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzRW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuZW50aXRpZXNbc0VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQpOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQge1xuXHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRpZiAoc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuYWN0aW9uc1tzRW50aXR5VHlwZV0/LltzQWN0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb0NhcGFiaWxpdGllcyBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXNcblx0ICovXG5cdHB1YmxpYyBpbml0aWFsaXplU2lkZUVmZmVjdHMob0NhcGFiaWxpdGllcz86IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKTogdm9pZCB7XG5cdFx0dGhpcy5fb0NhcGFiaWxpdGllcyA9IG9DYXBhYmlsaXRpZXM7XG5cdFx0aWYgKCF0aGlzLl9iSW5pdGlhbGl6ZWQpIHtcblx0XHRcdGNvbnN0IG9Db252ZXJ0ZWRNZXRhTW9kZWwgPSB0aGlzLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpO1xuXHRcdFx0b0NvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlUeXBlcy5mb3JFYWNoKGVudGl0eVR5cGUgPT4ge1xuXHRcdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlKTtcblx0XHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5hY3Rpb25zW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7IC8vIG9ubHkgYm91bmQgYWN0aW9ucyBhcmUgYW5hbHl6ZWQgc2luY2UgdW5ib3VuZCBvbmVzIGRvbid0IGdldCBTaWRlRWZmZWN0c1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9iSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgY29udHJvbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQ29udHJvbElkIENvbnRyb2wgSWRcblx0ICovXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoc0NvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sKS5mb3JFYWNoKHNFbnRpdHlUeXBlID0+IHtcblx0XHRcdGlmICh0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFQYXRoRXhwcmVzc2lvbnMgVGFyZ2V0cyBvZiBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzR3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0cyhhUGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdLCBvQ29udGV4dDogQ29udGV4dCwgc0dyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuXHRcdHRoaXMuX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9ucywgb0NvbnRleHQpO1xuXHRcdGxldCBvUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRcdC8qKlxuXHRcdCAqIENvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzIGVpdGhlciByZXR1cm5zIGEgcHJvbWlzZSBvciB0aHJvd3MgYSBuZXcgZXJyb3IuIFRoaXMgcmV0dXJuIGlzIGNhdWdodCBpZiBhbiBlcnJvciBpcyB0aHJvd25cblx0XHQgKiB0byBhdm9pZCBicmVha2luZyB0aGUgcHJvbWlzZSBjaGFpbi5cblx0XHQgKi9cblx0XHR0cnkge1xuXHRcdFx0b1Byb21pc2UgPSAob0NvbnRleHQgYXMgYW55KS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVBhdGhFeHByZXNzaW9ucywgc0dyb3VwSWQpIGFzIFByb21pc2U8YW55Pjtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVqZWN0KGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24oc2lkZUVmZmVjdHM6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSwgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGxldCBhUHJvbWlzZXM6IFByb21pc2U8YW55PltdO1xuXG5cdFx0aWYgKHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb25zPy5sZW5ndGgpIHtcblx0XHRcdGFQcm9taXNlcyA9IHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb25zLm1hcCgoc1RyaWdnZXJBY3Rpb25OYW1lOiBTdHJpbmcpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbk5hbWUgYXMgc3RyaW5nLCBvQ29udGV4dCk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YVByb21pc2VzID0gW107XG5cdFx0fVxuXG5cdFx0aWYgKHNpZGVFZmZlY3RzLnBhdGhFeHByZXNzaW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRhUHJvbWlzZXMucHVzaCh0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cy5wYXRoRXhwcmVzc2lvbnMsIG9Db250ZXh0KSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFQcm9taXNlcy5sZW5ndGggPyBQcm9taXNlLmFsbChhUHJvbWlzZXMpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBmb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc05hdmlnYXRpb25Qcm9wZXJ0eSBOYXZpZ2F0aW9uIHByb3BlcnR5XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShzTmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBzQmFzZUVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0aWYgKHNCYXNlRW50aXR5VHlwZSkge1xuXHRcdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gc05hdmlnYXRpb25Qcm9wZXJ0eSArIFwiL1wiO1xuXHRcdFx0Y29uc3QgYVNpZGVFZmZlY3RzID0gdGhpcy5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNCYXNlRW50aXR5VHlwZSk7XG5cdFx0XHRsZXQgYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblx0XHRcdE9iamVjdC5rZXlzKGFTaWRlRWZmZWN0cylcblx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHQvLyBLZWVwIHJlbGV2YW50IFNpZGVFZmZlY3RzXG5cdFx0XHRcdFx0c0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyB8fCBbXSkuc29tZShvUHJvcGVydHlQYXRoID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzUHJvcGVydHlQYXRoID0gb1Byb3BlcnR5UGF0aC52YWx1ZTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5UGF0aC5zdGFydHNXaXRoKHNOYXZpZ2F0aW9uUGF0aCkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdHNQcm9wZXJ0eVBhdGgucmVwbGFjZShzTmF2aWdhdGlvblBhdGgsIFwiXCIpLmluZGV4T2YoXCIvXCIpID09PSAtMVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pIHx8XG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlRW50aXRpZXMgfHwgW10pLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT4gb05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgudmFsdWUgPT09IHNOYXZpZ2F0aW9uUHJvcGVydHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdFx0LmZvckVhY2goc0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gYVNpZGVFZmZlY3RzW3NBbm5vdGF0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKG9TaWRlRWZmZWN0cy5UcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmV4ZWN1dGVBY3Rpb24ob1NpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24gYXMgc3RyaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSlcblx0XHRcdFx0XHRcdC5jb25jYXQoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSlcblx0XHRcdFx0XHRcdC5mb3JFYWNoKG1UYXJnZXQgPT4gYVRhcmdldHMucHVzaChtVGFyZ2V0KSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZSBwcm9wZXJ0aWVzXG5cdFx0XHRhVGFyZ2V0cyA9IHRoaXMuX3JlbW92ZUR1cGxpY2F0ZVRhcmdldHMoYVRhcmdldHMpO1xuXHRcdFx0aWYgKGFUYXJnZXRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRzLCBvQ29udGV4dCkuY2F0Y2gob0Vycm9yID0+XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiU2lkZUVmZmVjdHMgLSBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIFNpZGVFZmZlY3RzIGZvciBOYXZpZ2F0aW9uIFByb3BlcnR5IFwiICsgc05hdmlnYXRpb25Qcm9wZXJ0eSwgb0Vycm9yKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gY29udHJvbHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGVOYW1lIEVudGl0eSB0eXBlIE5hbWVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHVibGljIGdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyhzRW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlTmFtZV0gfHwge307XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyB0aGUgdGV4dCBwcm9wZXJ0aWVzIHJlcXVpcmVkIGZvciBTaWRlRWZmZWN0c1xuXHQgKiBJZiBhIHByb3BlcnR5IGhhcyBhbiBhc3NvY2lhdGVkIHRleHQgdGhlbiB0aGlzIHRleHQgbmVlZHMgdG8gYmUgYWRkZWQgYXMgdGFyZ2V0UHJvcGVydGllcyBvciB0YXJnZXRFbnRpdGllcy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIHdpdGggYWRkZWQgdGV4dCBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRwcml2YXRlIF9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzKG9TaWRlRWZmZWN0OiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBtRW50aXR5VHlwZTogRW50aXR5VHlwZSk6IEJhc2VTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IGFJbml0aWFsUHJvcGVydGllczogc3RyaW5nW10gPSBvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzIHx8IFtdLFxuXHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkOiBzdHJpbmdbXSA9IChvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyB8fCBbXSkubWFwKG5hdmlnYXRpb24gPT4gbmF2aWdhdGlvbi4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0bGV0IGFEZXJpdmVkUHJvcGVydGllczogRXh0cmFjdG9yUHJvcGVydHlJbmZvW10gPSBbXTtcblxuXHRcdGFJbml0aWFsUHJvcGVydGllcy5mb3JFYWNoKHNQcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0Y29uc3QgYklzU3RhclByb3BlcnR5ID0gc1Byb3BlcnR5UGF0aC5lbmRzV2l0aChcIipcIiksIC8vIENhbiBiZSAnKicgb3IgJy4uLi9uYXZQcm9wLyonXG5cdFx0XHRcdHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBzUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSksXG5cdFx0XHRcdHNSZWxhdGl2ZVBhdGggPSBzTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoICsgXCIvXCIgOiBcIlwiLFxuXHRcdFx0XHRtVGFyZ2V0OiBhbnkgPSBtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgfHwgbUVudGl0eVR5cGU7XG5cblx0XHRcdGlmIChtVGFyZ2V0KSB7XG5cdFx0XHRcdC8vIG1UYXJnZXQgY2FuIGJlIGFuIGVudGl0eSB0eXBlLCBuYXZpZ2F0aW9uUHJvcGVydHkgb3Igb3IgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRjb25zdCBhVGFyZ2V0RW50aXR5UHJvcGVydGllczogUHJvcGVydHlbXSA9XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgRW50aXR5VHlwZSkuZW50aXR5UHJvcGVydGllcyB8fFxuXHRcdFx0XHRcdCgobVRhcmdldCBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZSBhcyBDb21wbGV4VHlwZSk/LnByb3BlcnRpZXMgfHxcblx0XHRcdFx0XHQobVRhcmdldCBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpLnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcztcblx0XHRcdFx0aWYgKGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdFx0aWYgKGJJc1N0YXJQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0Ly8gQWRkIGFsbCByZXF1aXJlZCBwcm9wZXJ0aWVzIGJlaGluZCB0aGUgKlxuXHRcdFx0XHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkLnB1c2goc05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdFx0YURlcml2ZWRQcm9wZXJ0aWVzID0gYURlcml2ZWRQcm9wZXJ0aWVzLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0YVRhcmdldEVudGl0eVByb3BlcnRpZXMubWFwKG1Qcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoOiBzUmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IG1Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhRGVyaXZlZFByb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5OiBhVGFyZ2V0RW50aXR5UHJvcGVydGllcy5maW5kKFxuXHRcdFx0XHRcdFx0XHRcdG1Qcm9wZXJ0eSA9PiBtUHJvcGVydHkubmFtZSA9PT0gc1Byb3BlcnR5UGF0aC5zcGxpdChcIi9cIikucG9wKClcblx0XHRcdFx0XHRcdFx0KSBhcyBQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0bmF2aWdhdGlvblBhdGg6IHNSZWxhdGl2ZVBhdGhcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRMb2cuaW5mbyhcIlNpZGVFZmZlY3RzIC0gVGhlIGVudGl0eSB0eXBlIGFzc29jaWF0ZWQgdG8gcHJvcGVydHkgcGF0aCBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBjYW5ub3QgYmUgcmVzb2x2ZWRcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdExvZy5pbmZvKFwiU2lkZUVmZmVjdHMgLSBUaGUgcHJvcGVydHkgcGF0aCBcIiArIHNQcm9wZXJ0eVBhdGggKyBcIiBjYW5ub3QgYmUgcmVzb2x2ZWRcIik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRhRGVyaXZlZFByb3BlcnRpZXMuZm9yRWFjaChtUHJvcGVydHlJbmZvID0+IHtcblx0XHRcdGlmIChtUHJvcGVydHlJbmZvLnByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXRUZXh0UGF0aCA9IChtUHJvcGVydHlJbmZvLnByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlRleHQgYXMgYW55KT8ucGF0aCxcblx0XHRcdFx0XHRzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSA9IG1Qcm9wZXJ0eUluZm8ubmF2aWdhdGlvblBhdGggKyBzVGFyZ2V0VGV4dFBhdGgsXG5cdFx0XHRcdFx0c1RhcmdldENvbGxlY3Rpb25QYXRoID0gc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkuc3Vic3RyaW5nKDAsIHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5Lmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBUaGUgcHJvcGVydHkgVGV4dCBtdXN0IGJlIGFkZGVkIG9ubHkgaWYgdGhlIHByb3BlcnR5IGlzXG5cdFx0XHRcdCAqIC0gbm90IHBhcnQgb2YgYSBzdGFyIHByb3BlcnR5ICguaS5lICcqJyBvciAnbmF2aWdhdGlvbi8qJykgb3IgYSB0YXJnZXRlZCBFbnRpdHlcblx0XHRcdFx0ICogLSBub3QgaW5jbHVkZSBpbnRvIHRoZSBpbml0aWFsIHRhcmdldGVkIHByb3BlcnRpZXMgb2YgU2lkZUVmZmVjdHNcblx0XHRcdFx0ICogIEluZGVlZCBpbiB0aGUgdHdvIGxpc3RlZCBjYXNlcywgdGhlIHByb3BlcnR5IGNvbnRhaW5pbmcgdGV4dCB3aWxsIGJlL2lzIHJlcXVlc3RlZCBieSBpbml0aWFsIFNpZGVFZmZlY3RzIGNvbmZpZ3VyYXRpb24uXG5cdFx0XHRcdCAqL1xuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzVGFyZ2V0VGV4dFBhdGggJiZcblx0XHRcdFx0XHRhRW50aXRpZXNSZXF1ZXN0ZWQuaW5kZXhPZihzVGFyZ2V0Q29sbGVjdGlvblBhdGgpID09PSAtMSAmJlxuXHRcdFx0XHRcdGFJbml0aWFsUHJvcGVydGllcy5pbmRleE9mKHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5KSA9PT0gLTFcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gVGhlIFRleHQgYXNzb2NpYXRpb24gaXMgYWRkZWQgYXMgVGFyZ2V0RW50aXRpZXMgaWYgaXQncyBjb250YWluZWQgb24gYSBkaWZmZXJlbnQgZW50aXR5U2V0IGFuZCBub3QgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBpdCdzIGFkZGVkIGFzIHRhcmdldFByb3BlcnRpZXNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRzVGFyZ2V0VGV4dFBhdGgubGFzdEluZGV4T2YoXCIvXCIpID4gLTEgJiZcblx0XHRcdFx0XHRcdG1FbnRpdHlUeXBlLnJlc29sdmVQYXRoKHNUYXJnZXRDb2xsZWN0aW9uUGF0aCk/Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcy5wdXNoKHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNUYXJnZXRDb2xsZWN0aW9uUGF0aCB9KTtcblx0XHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5wdXNoKHNUYXJnZXRDb2xsZWN0aW9uUGF0aCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMucHVzaChzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3Q7XG5cdH1cblx0LyoqXG5cdCAqIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBSZW1vdmVzIGJpbmRpbmcgcGFyYW1ldGVyIGZyb20gU2lkZUVmZmVjdHMgdGFyZ2V0cyBwcm9wZXJ0aWVzXG5cdCAqICAtIEFkZHMgdGhlIHRleHQgcHJvcGVydGllc1xuXHQgKiAgLSBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG1FbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQmluZGluZ1BhcmFtZXRlciBOYW1lIG9mIHRoZSBiaW5kaW5nIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9jb252ZXJ0U2lkZUVmZmVjdHMoXG5cdFx0b1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHwgQmFzZUFubm90YXRpb25TaWRlRWZmZWN0c1R5cGUsXG5cdFx0bUVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c0JpbmRpbmdQYXJhbWV0ZXI/OiBzdHJpbmdcblx0KTogT0RhdGFTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IG9UZW1wU2lkZUVmZmVjdHMgPSB0aGlzLl9yZW1vdmVCaW5kaW5nUGFyYW1ldGVyKHRoaXMuX2NvbnZlcnRUYXJnZXRzRm9ybWF0KG9TaWRlRWZmZWN0cyksIHNCaW5kaW5nUGFyYW1ldGVyKTtcblx0XHRyZXR1cm4gdGhpcy5fYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyhvVGVtcFNpZGVFZmZlY3RzLCBtRW50aXR5VHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgU2lkZUVmZmVjdHMgdGFyZ2V0cyAoVGFyZ2V0RW50aXRpZXMgYW5kIFRhcmdldFByb3BlcnRpZXMpIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBUYXJnZXRQcm9wZXJ0aWVzIGFzIGFycmF5IG9mIHN0cmluZ1xuXHQgKiAgLSBUYXJnZXRFbnRpdGllcyBhcyBhcnJheSBvZiBvYmplY3Qgd2l0aCBwcm9wZXJ0eSAkTmF2aWdhdGlvblByb3BlcnR5UGF0aC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBDb252ZXJ0ZWQgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2NvbnZlcnRUYXJnZXRzRm9ybWF0KG9TaWRlRWZmZWN0czogQmFzZVNpZGVFZmZlY3RzVHlwZSB8IEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlKTogQmFzZVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgVGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSAoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSkucmVkdWNlKGZ1bmN0aW9uKGFUYXJnZXRQcm9wZXJ0aWVzLCB2VGFyZ2V0KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXQgPSAodHlwZW9mIHZUYXJnZXQgPT09IFwic3RyaW5nXCIgJiYgdlRhcmdldCkgfHwgKHZUYXJnZXQudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIiAmJiB2VGFyZ2V0LnZhbHVlKTtcblx0XHRcdFx0aWYgKHNUYXJnZXQpIHtcblx0XHRcdFx0XHRhVGFyZ2V0UHJvcGVydGllcy5wdXNoKHNUYXJnZXQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIlNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBUYXJnZXRQcm9wZXJ0aWVzIGZvciBTaWRlRWZmZWN0c1wiICsgb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGFUYXJnZXRQcm9wZXJ0aWVzO1xuXHRcdFx0fSwgW10pLFxuXHRcdFx0VGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKS5tYXAobVRhcmdldEVudGl0eSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiAgU2lkZUVmZmVjdHMgdGhhdCBjb21lcyBmcm9tIFNBUCBGRSBnZXQgVGFyZ2V0RW50aXRpZXMgd2l0aCAkTmF2aWdhdGlvblByb3BlcnR5UGF0aCB3aGVyZWFzXG5cdFx0XHRcdCAqICBvbmVzIGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZWQgT0RhdGEgbW9kZWwgZ2V0cyBhIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggZm9ybWF0XG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRyZXR1cm4geyBcIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCI6IG1UYXJnZXRFbnRpdHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldEVudGl0eS52YWx1ZSB8fCBcIlwiIH07XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4geyAuLi5vU2lkZUVmZmVjdHMsIC4uLnsgVGFyZ2V0UHJvcGVydGllcywgVGFyZ2V0RW50aXRpZXMgfSB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhbiBlbnRpdHkgdHlwZSBvciBhY3Rpb24gdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGggZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Tb3VyY2UgRW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEFycmF5IG9mIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2Uob1NvdXJjZTogYW55KTogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSB7XG5cdFx0Y29uc3QgYVNpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdID0gW107XG5cdFx0Y29uc3QgYXV0aG9yaXplZFR5cGVzID0gW1wiRW50aXR5VHlwZVwiLCBcIkFjdGlvblwiXTtcblx0XHRpZiAob1NvdXJjZS5fdHlwZSAmJiBhdXRob3JpemVkVHlwZXMuaW5kZXhPZihvU291cmNlLl90eXBlKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBtRW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCA9IG9Tb3VyY2UuX3R5cGUgPT09IFwiRW50aXR5VHlwZVwiID8gb1NvdXJjZSA6IG9Tb3VyY2Uuc291cmNlRW50aXR5VHlwZTtcblx0XHRcdGlmIChtRW50aXR5VHlwZSkge1xuXHRcdFx0XHRjb25zdCBtQ29tbW9uQW5ub3RhdGlvbjogYW55ID0gb1NvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uIHx8IHt9O1xuXHRcdFx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlciA9ICgob1NvdXJjZSBhcyBBY3Rpb24pLnBhcmFtZXRlcnMgfHwgW10pLmZpbmQoXG5cdFx0XHRcdFx0bVBhcmFtZXRlciA9PiBtUGFyYW1ldGVyLnR5cGUgPT09IG1FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBzQmluZGluZ1BhcmFtZXRlciA9IG1CaW5kaW5nUGFyYW1ldGVyID8gbUJpbmRpbmdQYXJhbWV0ZXIuZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KFwiL1wiKVsxXSA6IFwiXCI7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db21tb25Bbm5vdGF0aW9uKVxuXHRcdFx0XHRcdC5maWx0ZXIoc0Fubm90YXRpb25OYW1lID0+IG1Db21tb25Bbm5vdGF0aW9uW3NBbm5vdGF0aW9uTmFtZV0uJFR5cGUgPT09IENvbW1vbkFubm90YXRpb25UeXBlcy5TaWRlRWZmZWN0c1R5cGUpXG5cdFx0XHRcdFx0LmZvckVhY2goc0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGFTaWRlRWZmZWN0cy5wdXNoKHRoaXMuX2NvbnZlcnRTaWRlRWZmZWN0cyhtQ29tbW9uQW5ub3RhdGlvbltzQW5ub3RhdGlvbk5hbWVdLCBtRW50aXR5VHlwZSwgc0JpbmRpbmdQYXJhbWV0ZXIpKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIFNpZGVFZmZlY3RzIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhUGF0aEV4cHJlc3Npb25zIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICovXG5cdHByaXZhdGUgX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBzVGFyZ2V0UGF0aHMgPSBhUGF0aEV4cHJlc3Npb25zLnJlZHVjZShmdW5jdGlvbihzUGF0aHMsIG1UYXJnZXQpIHtcblx0XHRcdHJldHVybiBzUGF0aHMgKyBcIlxcblxcdFxcdFwiICsgKChtVGFyZ2V0IGFzIFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldCB8fCBcIlwiKTtcblx0XHR9LCBcIlwiKTtcblx0XHRMb2cuZGVidWcoXCJTaWRlRWZmZWN0cyAtIFJlcXVlc3Q6XFxuXFx0Q29udGV4dCBwYXRoIDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkgKyBcIlxcblxcdFByb3BlcnR5IHBhdGhzIDpcIiArIHNUYXJnZXRQYXRocyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBuYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyIG9uIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNCaW5kaW5nUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIob1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBzQmluZGluZ1BhcmFtZXRlck5hbWU/OiBzdHJpbmcpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRpZiAoc0JpbmRpbmdQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRjb25zdCBhVGFyZ2V0cyA9IFtcIlRhcmdldFByb3BlcnRpZXNcIiwgXCJUYXJnZXRFbnRpdGllc1wiXTtcblx0XHRcdGFUYXJnZXRzLmZvckVhY2goc1RhcmdldCA9PiB7XG5cdFx0XHRcdGxldCBtVGFyZ2V0ID0gKG9TaWRlRWZmZWN0cyBhcyBhbnkpW3NUYXJnZXRdO1xuXHRcdFx0XHRpZiAobVRhcmdldCkge1xuXHRcdFx0XHRcdG1UYXJnZXQgPSBtVGFyZ2V0Lm1hcCgobVByb3BlcnR5OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoICE9PSB1bmRlZmluZWQ7IC8vIE5lZWQgdG8gdGVzdCB3aXRoIHVuZGVmaW5lZCBzaW5jZSAgbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGNvdWxkIGJlIFwiXCIgKGVtcHR5IHN0cmluZylcblx0XHRcdFx0XHRcdGNvbnN0IHNWYWx1ZSA9IChiTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IG1Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA6IG1Qcm9wZXJ0eSkucmVwbGFjZShcblx0XHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcIl5cIiArIHNCaW5kaW5nUGFyYW1ldGVyTmFtZSArIFwiLz9cIiksXG5cdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzVmFsdWUgfSA6IHNWYWx1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQob1NpZGVFZmZlY3RzIGFzIGFueSlbc1RhcmdldF0gPSBtVGFyZ2V0O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGR1cGxpY2F0ZXMgaW4gU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFUYXJnZXRzIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHJldHVybnMge0FycmF5fSBTaWRlRWZmZWN0cyB0YXJnZXRzIHdpdGhvdXQgZHVwbGljYXRlc1xuXHQgKi9cblx0cHJpdmF0ZSBfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSk6IFNpZGVFZmZlY3RzVGFyZ2V0W10ge1xuXHRcdHJldHVybiBhVGFyZ2V0cy5maWx0ZXIoXG5cdFx0XHQobVRhcmdldDogYW55LCBpSW5kZXgsIGFUYXJnZXRzKSA9PlxuXHRcdFx0XHRhVGFyZ2V0cy5maW5kSW5kZXgoKG1TZWFyY2hUYXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRtU2VhcmNoVGFyZ2V0ID09PSBtVGFyZ2V0IHx8IC8vIFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0KG1UYXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggJiYgbVNlYXJjaFRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gbVRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgLy8gTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pID09PSBpSW5kZXhcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgYWN0aW9uIHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyBvbiBhY3Rpb25zXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIF9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0Y29uc3QgYUFjdGlvbnMgPSBtRW50aXR5VHlwZS5hY3Rpb25zO1xuXHRcdGlmIChhQWN0aW9ucykge1xuXHRcdFx0T2JqZWN0LmtleXMoYUFjdGlvbnMpLmZvckVhY2goc0FjdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRjb25zdCBvQWN0aW9uID0gbUVudGl0eVR5cGUuYWN0aW9uc1tzQWN0aW9uTmFtZV07XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJBY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRsZXQgcGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdID0gW107XG5cdFx0XHRcdGxldCBhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXG5cdFx0XHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShvQWN0aW9uKS5mb3JFYWNoKG9TaWRlRWZmZWN0ID0+IHtcblx0XHRcdFx0XHRjb25zdCBzVHJpZ2dlckFjdGlvbiA9IG9TaWRlRWZmZWN0LlRyaWdnZXJBY3Rpb247XG5cdFx0XHRcdFx0YVRhcmdldHMgPSBhVGFyZ2V0cy5jb25jYXQob1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMgfHwgW10pLmNvbmNhdCgob1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pO1xuXHRcdFx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbiAmJiB0cmlnZ2VyQWN0aW9ucy5pbmRleE9mKHNUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZykgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9ucy5wdXNoKHNUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cGF0aEV4cHJlc3Npb25zID0gdGhpcy5fcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0cyk7XG5cdFx0XHRcdG9TaWRlRWZmZWN0c1tzQWN0aW9uTmFtZV0gPSB7IHBhdGhFeHByZXNzaW9ucywgdHJpZ2dlckFjdGlvbnMgfTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgZW50aXR5IHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0c1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSBfcmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBvRW50aXR5U2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShtRW50aXR5VHlwZSkuZm9yRWFjaChvU2lkZUVmZmVjdHMgPT4ge1xuXHRcdFx0b0VudGl0eVNpZGVFZmZlY3RzW29TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gb1NpZGVFZmZlY3RzO1xuXHRcdH0pO1xuXHRcdHJldHVybiBvRW50aXR5U2lkZUVmZmVjdHM7XG5cdH1cblxuXHRnZXRJbnRlcmZhY2UoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRjcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQ6IFNlcnZpY2VDb250ZXh0PFNpZGVFZmZlY3RzU2V0dGluZ3M+KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlID0gbmV3IFNpZGVFZmZlY3RzU2VydmljZShvU2VydmljZUNvbnRleHQpO1xuXHRcdHJldHVybiBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzU2VydmljZUZhY3Rvcnk7XG4iXX0=
|