@sapui5/sap.fe.base 1.131.0 → 1.133.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.
@@ -1,12 +1,14 @@
1
+ import deepClone from "sap/base/util/deepClone";
1
2
  import type { ExtensionOverrideExecution } from "sap/fe/base/ClassSupport";
2
3
  import type Controller from "sap/ui/core/mvc/Controller";
3
4
  import type XMLView from "sap/ui/core/mvc/XMLView";
4
-
5
5
  /**
6
6
  * This type is to be extended with all controller extensions and methods that are hookable.
7
7
  */
8
8
  type HookableControllerExtensions = {
9
9
  editFlow: {
10
+ inlineEditEnd: true;
11
+ inlineEditStart: true;
10
12
  onAfterSave: true;
11
13
  onBeforeSave: true;
12
14
  };
@@ -26,7 +28,7 @@ type HandlerConfiguration<CExtName extends keyof HookableControllerExtensions> =
26
28
  method: keyof HookableControllerExtensions[CExtName];
27
29
  };
28
30
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
- type HandlerRegistration = HandlerConfiguration<any> & { targetMethod: string };
31
+ type HandlerRegistration = HandlerConfiguration<any> & { targetMethod: string; handlerFunction?: Function };
30
32
 
31
33
  type FunctionMap = {
32
34
  [key: string]: Function;
@@ -121,6 +123,8 @@ function isAlreadyRegistered(existingRegistrations: HandlerRegistration[], newRe
121
123
  );
122
124
  }
123
125
 
126
+ export const hooks = Symbol("hooks");
127
+
124
128
  /**
125
129
  * Registers a method as controller extension hook handler.
126
130
  *
@@ -133,10 +137,15 @@ export function controllerExtensionHandler<CExtName extends keyof HookableContro
133
137
  name: CExtName,
134
138
  method: keyof HookableControllerExtensions[CExtName]
135
139
  ): MethodDecorator {
136
- return function (target: { constructor: Function }, propertyKey: string) {
140
+ return function (target: { constructor: Function & { [hooks]?: HandlerRegistration[] } }, propertyKey: string) {
137
141
  const newRegistration = { name, method: String(method), targetMethod: propertyKey };
138
142
  const index = registeredInstances.indexOf(target.constructor);
139
-
143
+ if (!target.constructor[hooks]) {
144
+ Object.defineProperty(target.constructor, hooks, {
145
+ value: []
146
+ });
147
+ }
148
+ target.constructor[hooks]?.push(newRegistration);
140
149
  // We need to check if this exact handler is already registered as handlers are registered statically (on the constructor)
141
150
  if (index !== -1 && !isAlreadyRegistered(registeredHandlers[index], newRegistration)) {
142
151
  registeredHandlers[index].push(newRegistration);
@@ -153,23 +162,52 @@ export function controllerExtensionHandler<CExtName extends keyof HookableContro
153
162
  * @param target.constructor
154
163
  * @param controller PageController instance to get the controller extensions instances from
155
164
  */
156
- export function initControllerExtensionHookHandlers(target: { constructor: Function }, controller: Controller): void {
157
- const index = registeredInstances.indexOf(target.constructor);
158
- if (index !== -1) {
159
- const indexableController = controller as unknown as DeepFunctionMap;
165
+ export function initControllerExtensionHookHandlers(
166
+ target: { constructor: Function & { [hooks]?: HandlerRegistration[] } } & { [hooks]?: HandlerRegistration[] },
167
+ controller: Controller
168
+ ): void {
169
+ if (target.constructor[hooks]) {
170
+ let registeredHooks = target.constructor[hooks];
171
+ target[hooks] = deepClone(registeredHooks);
172
+ registeredHooks = target[hooks]!;
160
173
  const indexableTarget = target as unknown as FunctionMap;
161
-
162
- for (const registeredHandler of registeredHandlers[index]) {
163
- const handlerFunction = indexableTarget[registeredHandler.targetMethod].bind(target);
164
-
165
- indexableController[registeredHandler.name][`attach${String(registeredHandler.method)}`](handlerFunction);
174
+ const indexableController = controller as unknown as DeepFunctionMap;
175
+ for (const registeredHook of registeredHooks) {
176
+ registeredHook.handlerFunction = indexableTarget[registeredHook.targetMethod].bind(target);
177
+ indexableController[registeredHook.name][`attach${String(registeredHook.method)}`](registeredHook.handlerFunction);
166
178
  controller.getView()?.attachBeforeExit(() => {
167
- indexableController[registeredHandler.name][`detach${String(registeredHandler.method)}`](handlerFunction);
179
+ indexableController[registeredHook.name][`detach${String(registeredHook.method)}`](registeredHook.handlerFunction);
168
180
  });
169
181
  }
170
182
  }
171
183
  }
172
184
 
185
+ export function removeControllerExtensionHookHandlers(
186
+ target: { constructor: Function & { [hooks]?: HandlerRegistration[] } } & { [hooks]?: HandlerRegistration[] },
187
+ controller: Controller
188
+ ): void {
189
+ if (target[hooks]) {
190
+ const registeredHooks = target[hooks];
191
+ const indexableController = controller as unknown as DeepFunctionMap;
192
+ for (const registeredHook of registeredHooks) {
193
+ indexableController[registeredHook.name]?.[`detach${String(registeredHook.method)}`]?.(registeredHook.handlerFunction);
194
+ }
195
+ }
196
+ }
197
+
198
+ export function propagateHookFromMixin(
199
+ target: Function & { [hooks]?: HandlerRegistration[] },
200
+ source: Function & { [hooks]?: HandlerRegistration[] }
201
+ ): void {
202
+ if (source[hooks]) {
203
+ if (target[hooks]) {
204
+ target[hooks]!.splice(0, 0, ...source[hooks]);
205
+ } else {
206
+ Object.defineProperty(target, hooks, Object.getOwnPropertyDescriptor(source, hooks) || Object.create([]));
207
+ }
208
+ }
209
+ }
210
+
173
211
  export function xmlViewPreprocessor(source: object, _caller?: unknown, _settings?: object): void {
174
212
  const sourceView = source as XMLView;
175
213
  const controller = sourceView.getController() as Controller | undefined;
@@ -10,7 +10,6 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/base/ManagedObject", "sap/ui/
10
10
  var property = ClassSupport.property;
11
11
  var defineUI5Class = ClassSupport.defineUI5Class;
12
12
  function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }
13
- function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
14
13
  function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); }
15
14
  function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
16
15
  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
@@ -18,17 +17,17 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/base/ManagedObject", "sap/ui/
18
17
  let ViewLoader = (_dec = defineUI5Class("sap.fe.base.jsx-runtime.MDXViewLoader"), _dec2 = property({
19
18
  type: "string"
20
19
  }), _dec(_class = (_class2 = /*#__PURE__*/function (_View) {
21
- _inheritsLoose(ViewLoader, _View);
22
20
  function ViewLoader(mSettings) {
23
21
  var _this;
24
22
  delete mSettings.cache;
25
23
  _this = _View.call(this, mSettings) || this;
26
- _initializerDefineProperty(_this, "viewName", _descriptor, _assertThisInitialized(_this));
24
+ _initializerDefineProperty(_this, "viewName", _descriptor, _this);
27
25
  _this.sViewName = _this.viewName;
28
- _this._oContainingView = _assertThisInitialized(_this);
26
+ _this._oContainingView = _this;
29
27
  return _this;
30
28
  }
31
29
  _exports = ViewLoader;
30
+ _inheritsLoose(ViewLoader, _View);
32
31
  var _proto = ViewLoader.prototype;
33
32
  _proto.loadDependency = async function loadDependency(name) {
34
33
  return new Promise(resolve => {
@@ -38,11 +37,10 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/base/ManagedObject", "sap/ui/
38
37
  });
39
38
  };
40
39
  _proto.initViewSettings = async function initViewSettings(mSettings) {
41
- var _getMetadata, _ref;
42
40
  const viewConfig = this.getViewData();
43
41
  const viewContent = viewConfig.viewContent || (await this.loadDependency(viewConfig._jsxViewName));
44
42
  delete mSettings.cache;
45
- if (viewContent !== null && viewContent !== void 0 && (_getMetadata = (_ref = viewContent).getMetadata) !== null && _getMetadata !== void 0 && _getMetadata.call(_ref).isA("sap.ui.core.mvc.Controller")) {
43
+ if (viewContent?.getMetadata?.().isA("sap.ui.core.mvc.Controller")) {
46
44
  mSettings.controller = new viewContent(viewConfig);
47
45
  } else {
48
46
  this.viewContentFn = viewContent;
@@ -57,19 +55,17 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/base/ManagedObject", "sap/ui/
57
55
  // @ts-ignore
58
56
  ;
59
57
  _proto.createContent = function createContent(oController) {
60
- var _mPreprocessors;
61
- ViewLoader.preprocessorData = this === null || this === void 0 ? void 0 : (_mPreprocessors = this.mPreprocessors) === null || _mPreprocessors === void 0 ? void 0 : _mPreprocessors.xml;
58
+ ViewLoader.preprocessorData = this?.mPreprocessors?.xml;
62
59
  ViewLoader.controller = oController;
63
60
  const owner = Component.getOwnerComponentFor(this) ?? {
64
61
  runAsOwner: fn => fn()
65
62
  };
66
63
  return owner.runAsOwner(() => {
67
64
  return ManagedObject.runWithPreprocessors(() => {
68
- var _this$viewContentFn;
69
65
  if (oController && oController.render) {
70
66
  return oController.render();
71
67
  }
72
- return (_this$viewContentFn = this.viewContentFn) === null || _this$viewContentFn === void 0 ? void 0 : _this$viewContentFn.call(this);
68
+ return this.viewContentFn?.();
73
69
  }, {
74
70
  id: sId => {
75
71
  return this.createId(sId);
@@ -81,13 +77,13 @@ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/base/ManagedObject", "sap/ui/
81
77
  });
82
78
  };
83
79
  return ViewLoader;
84
- }(View), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "viewName", [_dec2], {
80
+ }(View), _descriptor = _applyDecoratedDescriptor(_class2.prototype, "viewName", [_dec2], {
85
81
  configurable: true,
86
82
  enumerable: true,
87
83
  writable: true,
88
84
  initializer: null
89
- })), _class2)) || _class);
85
+ }), _class2)) || _class);
90
86
  _exports = ViewLoader;
91
87
  return _exports;
92
88
  }, false);
93
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWaWV3TG9hZGVyIiwiX2RlYyIsImRlZmluZVVJNUNsYXNzIiwiX2RlYzIiLCJwcm9wZXJ0eSIsInR5cGUiLCJfY2xhc3MiLCJfY2xhc3MyIiwiX1ZpZXciLCJfaW5oZXJpdHNMb29zZSIsIm1TZXR0aW5ncyIsIl90aGlzIiwiY2FjaGUiLCJjYWxsIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJfZGVzY3JpcHRvciIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJzVmlld05hbWUiLCJ2aWV3TmFtZSIsIl9vQ29udGFpbmluZ1ZpZXciLCJfZXhwb3J0cyIsIl9wcm90byIsInByb3RvdHlwZSIsImxvYWREZXBlbmRlbmN5IiwibmFtZSIsIlByb21pc2UiLCJyZXNvbHZlIiwic2FwIiwidWkiLCJyZXF1aXJlIiwiTURYQ29udGVudCIsImluaXRWaWV3U2V0dGluZ3MiLCJfZ2V0TWV0YWRhdGEiLCJfcmVmIiwidmlld0NvbmZpZyIsImdldFZpZXdEYXRhIiwidmlld0NvbnRlbnQiLCJfanN4Vmlld05hbWUiLCJnZXRNZXRhZGF0YSIsImlzQSIsImNvbnRyb2xsZXIiLCJ2aWV3Q29udGVudEZuIiwiZ2V0Q29udHJvbGxlck5hbWUiLCJ2aWV3RGF0YSIsImNvbnRyb2xsZXJOYW1lIiwiY3JlYXRlQ29udGVudCIsIm9Db250cm9sbGVyIiwiX21QcmVwcm9jZXNzb3JzIiwicHJlcHJvY2Vzc29yRGF0YSIsIm1QcmVwcm9jZXNzb3JzIiwieG1sIiwib3duZXIiLCJDb21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudEZvciIsInJ1bkFzT3duZXIiLCJmbiIsIk1hbmFnZWRPYmplY3QiLCJydW5XaXRoUHJlcHJvY2Vzc29ycyIsIl90aGlzJHZpZXdDb250ZW50Rm4iLCJyZW5kZXIiLCJpZCIsInNJZCIsImNyZWF0ZUlkIiwic2V0dGluZ3MiLCJWaWV3IiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImluaXRpYWxpemVyIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJWaWV3TG9hZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE5vbkFic3RyYWN0Q2xhc3MgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgcHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IFhNTFByZXByb2Nlc3NvckNvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgJENvbnRyb2xTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sbGVyIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlclwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSB7IE1hbmFnZWRPYmplY3RFeCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi8uLi90eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxudHlwZSBKU1hWaWV3Q29udHJvbGxlciA9IENvbnRyb2xsZXIgJiB7IHJlbmRlcj86ICgpID0+IENvbnRyb2wgfTtcbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5iYXNlLmpzeC1ydW50aW1lLk1EWFZpZXdMb2FkZXJcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXdMb2FkZXIgZXh0ZW5kcyBWaWV3IHtcblx0c3RhdGljIHByZXByb2Nlc3NvckRhdGE/OiBYTUxQcmVwcm9jZXNzb3JDb250ZXh0O1xuXG5cdHN0YXRpYyBjb250cm9sbGVyOiBDb250cm9sbGVyO1xuXG5cdEBwcm9wZXJ0eSh7IHR5cGU6IFwic3RyaW5nXCIgfSlcblx0dmlld05hbWUhOiBzdHJpbmc7XG5cblx0cHJpdmF0ZSB2aWV3Q29udGVudD86IENvbnRyb2w7XG5cblx0cHJpdmF0ZSB2aWV3Q29udGVudEZuPzogRnVuY3Rpb247XG5cblx0cHVibGljIHNWaWV3TmFtZTogc3RyaW5nO1xuXG5cdHB1YmxpYyBfb0NvbnRhaW5pbmdWaWV3OiB0aGlzO1xuXG5cdGNvbnN0cnVjdG9yKG1TZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcblx0XHRkZWxldGUgbVNldHRpbmdzLmNhY2hlO1xuXHRcdHN1cGVyKG1TZXR0aW5ncyk7XG5cdFx0dGhpcy5zVmlld05hbWUgPSB0aGlzLnZpZXdOYW1lO1xuXHRcdHRoaXMuX29Db250YWluaW5nVmlldyA9IHRoaXM7XG5cdH1cblxuXHRhc3luYyBsb2FkRGVwZW5kZW5jeShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdHNhcC51aS5yZXF1aXJlKFtuYW1lXSwgKE1EWENvbnRlbnQ6IEZ1bmN0aW9uKTogdm9pZCA9PiB7XG5cdFx0XHRcdHJlc29sdmUoTURYQ29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIGluaXRWaWV3U2V0dGluZ3MobVNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHZpZXdDb25maWcgPSB0aGlzLmdldFZpZXdEYXRhKCkgYXMgeyB2aWV3Q29udGVudD86IENvbnRyb2w7IF9qc3hWaWV3TmFtZTogc3RyaW5nIH0gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRjb25zdCB2aWV3Q29udGVudCA9IHZpZXdDb25maWcudmlld0NvbnRlbnQgfHwgKChhd2FpdCB0aGlzLmxvYWREZXBlbmRlbmN5KHZpZXdDb25maWcuX2pzeFZpZXdOYW1lKSkgYXMgQ29udHJvbCB8IEZ1bmN0aW9uKTtcblx0XHRkZWxldGUgbVNldHRpbmdzLmNhY2hlO1xuXHRcdGlmICgodmlld0NvbnRlbnQgYXMgQ29udHJvbCk/LmdldE1ldGFkYXRhPy4oKS5pc0EoXCJzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlclwiKSkge1xuXHRcdFx0bVNldHRpbmdzLmNvbnRyb2xsZXIgPSBuZXcgKHZpZXdDb250ZW50IGFzIE5vbkFic3RyYWN0Q2xhc3M8Q29udHJvbD4pKHZpZXdDb25maWcgYXMgJENvbnRyb2xTZXR0aW5ncyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudmlld0NvbnRlbnRGbiA9IHZpZXdDb250ZW50IGFzIEZ1bmN0aW9uO1xuXHRcdH1cblx0fVxuXG5cdGdldENvbnRyb2xsZXJOYW1lKCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgdmlld0RhdGEgPSB0aGlzLmdldFZpZXdEYXRhKCkgYXMgeyBjb250cm9sbGVyTmFtZTogc3RyaW5nIH07XG5cdFx0cmV0dXJuIHZpZXdEYXRhLmNvbnRyb2xsZXJOYW1lO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHQvLyBAdHMtaWdub3JlXG5cdGNyZWF0ZUNvbnRlbnQob0NvbnRyb2xsZXI6IEpTWFZpZXdDb250cm9sbGVyKTogQ29udHJvbCB7XG5cdFx0Vmlld0xvYWRlci5wcmVwcm9jZXNzb3JEYXRhID0gKHRoaXMgYXMgeyBtUHJlcHJvY2Vzc29ycz86IHsgeG1sPzogWE1MUHJlcHJvY2Vzc29yQ29udGV4dCB9IH0pPy5tUHJlcHJvY2Vzc29ycz8ueG1sO1xuXHRcdFZpZXdMb2FkZXIuY29udHJvbGxlciA9IG9Db250cm9sbGVyO1xuXG5cdFx0Y29uc3Qgb3duZXIgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcykhID8/IHsgcnVuQXNPd25lcjogKGZuOiBGdW5jdGlvbikgPT4gZm4oKSB9O1xuXHRcdHJldHVybiBvd25lci5ydW5Bc093bmVyKCgpID0+IHtcblx0XHRcdHJldHVybiAoTWFuYWdlZE9iamVjdCBhcyBNYW5hZ2VkT2JqZWN0RXgpLnJ1bldpdGhQcmVwcm9jZXNzb3JzKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKG9Db250cm9sbGVyICYmIG9Db250cm9sbGVyLnJlbmRlcikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnJlbmRlcigpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy52aWV3Q29udGVudEZuPy4oKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlkOiAoc0lkOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUlkKHNJZCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRzZXR0aW5nczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0dGhpcy5jb250cm9sbGVyID0gb0NvbnRyb2xsZXI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdH0pO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O01BYXFCQSxVQUFVLElBQUFDLElBQUEsR0FEOUJDLGNBQWMsQ0FBQyx1Q0FBdUMsQ0FBQyxFQUFBQyxLQUFBLEdBTXREQyxRQUFRLENBQUM7SUFBRUMsSUFBSSxFQUFFO0VBQVMsQ0FBQyxDQUFDLEVBQUFKLElBQUEsQ0FBQUssTUFBQSxJQUFBQyxPQUFBLDBCQUFBQyxLQUFBO0lBQUFDLGNBQUEsQ0FBQVQsVUFBQSxFQUFBUSxLQUFBO0lBVzdCLFNBQUFSLFdBQVlVLFNBQWtDLEVBQUU7TUFBQSxJQUFBQyxLQUFBO01BQy9DLE9BQU9ELFNBQVMsQ0FBQ0UsS0FBSztNQUN0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
89
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWaWV3TG9hZGVyIiwiX2RlYyIsImRlZmluZVVJNUNsYXNzIiwiX2RlYzIiLCJwcm9wZXJ0eSIsInR5cGUiLCJfY2xhc3MiLCJfY2xhc3MyIiwiX1ZpZXciLCJtU2V0dGluZ3MiLCJfdGhpcyIsImNhY2hlIiwiY2FsbCIsIl9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IiwiX2Rlc2NyaXB0b3IiLCJzVmlld05hbWUiLCJ2aWV3TmFtZSIsIl9vQ29udGFpbmluZ1ZpZXciLCJfZXhwb3J0cyIsIl9pbmhlcml0c0xvb3NlIiwiX3Byb3RvIiwicHJvdG90eXBlIiwibG9hZERlcGVuZGVuY3kiLCJuYW1lIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzYXAiLCJ1aSIsInJlcXVpcmUiLCJNRFhDb250ZW50IiwiaW5pdFZpZXdTZXR0aW5ncyIsInZpZXdDb25maWciLCJnZXRWaWV3RGF0YSIsInZpZXdDb250ZW50IiwiX2pzeFZpZXdOYW1lIiwiZ2V0TWV0YWRhdGEiLCJpc0EiLCJjb250cm9sbGVyIiwidmlld0NvbnRlbnRGbiIsImdldENvbnRyb2xsZXJOYW1lIiwidmlld0RhdGEiLCJjb250cm9sbGVyTmFtZSIsImNyZWF0ZUNvbnRlbnQiLCJvQ29udHJvbGxlciIsInByZXByb2Nlc3NvckRhdGEiLCJtUHJlcHJvY2Vzc29ycyIsInhtbCIsIm93bmVyIiwiQ29tcG9uZW50IiwiZ2V0T3duZXJDb21wb25lbnRGb3IiLCJydW5Bc093bmVyIiwiZm4iLCJNYW5hZ2VkT2JqZWN0IiwicnVuV2l0aFByZXByb2Nlc3NvcnMiLCJyZW5kZXIiLCJpZCIsInNJZCIsImNyZWF0ZUlkIiwic2V0dGluZ3MiLCJWaWV3IiwiX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImluaXRpYWxpemVyIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJWaWV3TG9hZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE5vbkFic3RyYWN0Q2xhc3MgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgcHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IFhNTFByZXByb2Nlc3NvckNvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgJENvbnRyb2xTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sbGVyIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlclwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSB7IE1hbmFnZWRPYmplY3RFeCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi8uLi90eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxudHlwZSBKU1hWaWV3Q29udHJvbGxlciA9IENvbnRyb2xsZXIgJiB7IHJlbmRlcj86ICgpID0+IENvbnRyb2wgfTtcbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5iYXNlLmpzeC1ydW50aW1lLk1EWFZpZXdMb2FkZXJcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXdMb2FkZXIgZXh0ZW5kcyBWaWV3IHtcblx0c3RhdGljIHByZXByb2Nlc3NvckRhdGE/OiBYTUxQcmVwcm9jZXNzb3JDb250ZXh0O1xuXG5cdHN0YXRpYyBjb250cm9sbGVyOiBDb250cm9sbGVyO1xuXG5cdEBwcm9wZXJ0eSh7IHR5cGU6IFwic3RyaW5nXCIgfSlcblx0dmlld05hbWUhOiBzdHJpbmc7XG5cblx0cHJpdmF0ZSB2aWV3Q29udGVudD86IENvbnRyb2w7XG5cblx0cHJpdmF0ZSB2aWV3Q29udGVudEZuPzogRnVuY3Rpb247XG5cblx0cHVibGljIHNWaWV3TmFtZTogc3RyaW5nO1xuXG5cdHB1YmxpYyBfb0NvbnRhaW5pbmdWaWV3OiB0aGlzO1xuXG5cdGNvbnN0cnVjdG9yKG1TZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcblx0XHRkZWxldGUgbVNldHRpbmdzLmNhY2hlO1xuXHRcdHN1cGVyKG1TZXR0aW5ncyk7XG5cdFx0dGhpcy5zVmlld05hbWUgPSB0aGlzLnZpZXdOYW1lO1xuXHRcdHRoaXMuX29Db250YWluaW5nVmlldyA9IHRoaXM7XG5cdH1cblxuXHRhc3luYyBsb2FkRGVwZW5kZW5jeShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdHNhcC51aS5yZXF1aXJlKFtuYW1lXSwgKE1EWENvbnRlbnQ6IEZ1bmN0aW9uKTogdm9pZCA9PiB7XG5cdFx0XHRcdHJlc29sdmUoTURYQ29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIGluaXRWaWV3U2V0dGluZ3MobVNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHZpZXdDb25maWcgPSB0aGlzLmdldFZpZXdEYXRhKCkgYXMgeyB2aWV3Q29udGVudD86IENvbnRyb2w7IF9qc3hWaWV3TmFtZTogc3RyaW5nIH0gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRjb25zdCB2aWV3Q29udGVudCA9IHZpZXdDb25maWcudmlld0NvbnRlbnQgfHwgKChhd2FpdCB0aGlzLmxvYWREZXBlbmRlbmN5KHZpZXdDb25maWcuX2pzeFZpZXdOYW1lKSkgYXMgQ29udHJvbCB8IEZ1bmN0aW9uKTtcblx0XHRkZWxldGUgbVNldHRpbmdzLmNhY2hlO1xuXHRcdGlmICgodmlld0NvbnRlbnQgYXMgQ29udHJvbCk/LmdldE1ldGFkYXRhPy4oKS5pc0EoXCJzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlclwiKSkge1xuXHRcdFx0bVNldHRpbmdzLmNvbnRyb2xsZXIgPSBuZXcgKHZpZXdDb250ZW50IGFzIE5vbkFic3RyYWN0Q2xhc3M8Q29udHJvbD4pKHZpZXdDb25maWcgYXMgJENvbnRyb2xTZXR0aW5ncyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudmlld0NvbnRlbnRGbiA9IHZpZXdDb250ZW50IGFzIEZ1bmN0aW9uO1xuXHRcdH1cblx0fVxuXG5cdGdldENvbnRyb2xsZXJOYW1lKCk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgdmlld0RhdGEgPSB0aGlzLmdldFZpZXdEYXRhKCkgYXMgeyBjb250cm9sbGVyTmFtZTogc3RyaW5nIH07XG5cdFx0cmV0dXJuIHZpZXdEYXRhLmNvbnRyb2xsZXJOYW1lO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuXHQvLyBAdHMtaWdub3JlXG5cdGNyZWF0ZUNvbnRlbnQob0NvbnRyb2xsZXI6IEpTWFZpZXdDb250cm9sbGVyKTogQ29udHJvbCB7XG5cdFx0Vmlld0xvYWRlci5wcmVwcm9jZXNzb3JEYXRhID0gKHRoaXMgYXMgeyBtUHJlcHJvY2Vzc29ycz86IHsgeG1sPzogWE1MUHJlcHJvY2Vzc29yQ29udGV4dCB9IH0pPy5tUHJlcHJvY2Vzc29ycz8ueG1sO1xuXHRcdFZpZXdMb2FkZXIuY29udHJvbGxlciA9IG9Db250cm9sbGVyO1xuXG5cdFx0Y29uc3Qgb3duZXIgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3IodGhpcykhID8/IHsgcnVuQXNPd25lcjogKGZuOiBGdW5jdGlvbikgPT4gZm4oKSB9O1xuXHRcdHJldHVybiBvd25lci5ydW5Bc093bmVyKCgpID0+IHtcblx0XHRcdHJldHVybiAoTWFuYWdlZE9iamVjdCBhcyBNYW5hZ2VkT2JqZWN0RXgpLnJ1bldpdGhQcmVwcm9jZXNzb3JzKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKG9Db250cm9sbGVyICYmIG9Db250cm9sbGVyLnJlbmRlcikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLnJlbmRlcigpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy52aWV3Q29udGVudEZuPy4oKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlkOiAoc0lkOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUlkKHNJZCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRzZXR0aW5nczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0dGhpcy5jb250cm9sbGVyID0gb0NvbnRyb2xsZXI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdH0pO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7TUFhcUJBLFVBQVUsSUFBQUMsSUFBQSxHQUQ5QkMsY0FBYyxDQUFDLHVDQUF1QyxDQUFDLEVBQUFDLEtBQUEsR0FNdERDLFFBQVEsQ0FBQztJQUFFQyxJQUFJLEVBQUU7RUFBUyxDQUFDLENBQUMsRUFBQUosSUFBQSxDQUFBSyxNQUFBLElBQUFDLE9BQUEsMEJBQUFDLEtBQUE7SUFXN0IsU0FBQVIsV0FBWVMsU0FBa0MsRUFBRTtNQUFBLElBQUFDLEtBQUE7TUFDL0MsT0FBT0QsU0FBUyxDQUFDRSxLQUFLO01BQ3RCRCxLQUFBLEdBQUFGLEtBQUEsQ0FBQUksSUFBQSxPQUFNSCxTQUFTLENBQUM7TUFBQ0ksMEJBQUEsQ0FBQUgsS0FBQSxjQUFBSSxXQUFBLEVBQUFKLEtBQUE7TUFDakJBLEtBQUEsQ0FBS0ssU0FBUyxHQUFHTCxLQUFBLENBQUtNLFFBQVE7TUFDOUJOLEtBQUEsQ0FBS08sZ0JBQWdCLEdBQUFQLEtBQU87TUFBQyxPQUFBQSxLQUFBO0lBQzlCO0lBQUNRLFFBQUEsR0FBQWxCLFVBQUE7SUFBQW1CLGNBQUEsQ0FBQW5CLFVBQUEsRUFBQVEsS0FBQTtJQUFBLElBQUFZLE1BQUEsR0FBQXBCLFVBQUEsQ0FBQXFCLFNBQUE7SUFBQUQsTUFBQSxDQUVLRSxjQUFjLEdBQXBCLGVBQU1BLGNBQWNBLENBQUNDLElBQVksRUFBb0I7TUFDcEQsT0FBTyxJQUFJQyxPQUFPLENBQUVDLE9BQU8sSUFBSztRQUMvQkMsR0FBRyxDQUFDQyxFQUFFLENBQUNDLE9BQU8sQ0FBQyxDQUFDTCxJQUFJLENBQUMsRUFBR00sVUFBb0IsSUFBVztVQUN0REosT0FBTyxDQUFDSSxVQUFVLENBQUM7UUFDcEIsQ0FBQyxDQUFDO01BQ0gsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUFBVCxNQUFBLENBRUtVLGdCQUFnQixHQUF0QixlQUFNQSxnQkFBZ0JBLENBQUNyQixTQUFrQyxFQUFpQjtNQUN6RSxNQUFNc0IsVUFBVSxHQUFHLElBQUksQ0FBQ0MsV0FBVyxDQUFDLENBQThFO01BQ2xILE1BQU1DLFdBQVcsR0FBR0YsVUFBVSxDQUFDRSxXQUFXLEtBQU0sTUFBTSxJQUFJLENBQUNYLGNBQWMsQ0FBQ1MsVUFBVSxDQUFDRyxZQUFZLENBQUMsQ0FBd0I7TUFDMUgsT0FBT3pCLFNBQVMsQ0FBQ0UsS0FBSztNQUN0QixJQUFLc0IsV0FBVyxFQUFjRSxXQUFXLEdBQUcsQ0FBQyxDQUFDQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsRUFBRTtRQUNoRjNCLFNBQVMsQ0FBQzRCLFVBQVUsR0FBRyxJQUFLSixXQUFXLENBQStCRixVQUE4QixDQUFDO01BQ3RHLENBQUMsTUFBTTtRQUNOLElBQUksQ0FBQ08sYUFBYSxHQUFHTCxXQUF1QjtNQUM3QztJQUNELENBQUM7SUFBQWIsTUFBQSxDQUVEbUIsaUJBQWlCLEdBQWpCLFNBQUFBLGlCQUFpQkEsQ0FBQSxFQUFXO01BQzNCLE1BQU1DLFFBQVEsR0FBRyxJQUFJLENBQUNSLFdBQVcsQ0FBQyxDQUErQjtNQUNqRSxPQUFPUSxRQUFRLENBQUNDLGNBQWM7SUFDL0I7O0lBRUE7SUFDQTtJQUFBO0lBQUFyQixNQUFBLENBQ0FzQixhQUFhLEdBQWIsU0FBQUEsYUFBYUEsQ0FBQ0MsV0FBOEIsRUFBVztNQUN0RDNDLFVBQVUsQ0FBQzRDLGdCQUFnQixHQUFJLElBQUksRUFBNERDLGNBQWMsRUFBRUMsR0FBRztNQUNsSDlDLFVBQVUsQ0FBQ3FDLFVBQVUsR0FBR00sV0FBVztNQUVuQyxNQUFNSSxLQUFLLEdBQUdDLFNBQVMsQ0FBQ0Msb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUs7UUFBRUMsVUFBVSxFQUFHQyxFQUFZLElBQUtBLEVBQUUsQ0FBQztNQUFFLENBQUM7TUFDN0YsT0FBT0osS0FBSyxDQUFDRyxVQUFVLENBQUMsTUFBTTtRQUM3QixPQUFRRSxhQUFhLENBQXFCQyxvQkFBb0IsQ0FDN0QsTUFBTTtVQUNMLElBQUlWLFdBQVcsSUFBSUEsV0FBVyxDQUFDVyxNQUFNLEVBQUU7WUFDdEMsT0FBT1gsV0FBVyxDQUFDVyxNQUFNLENBQUMsQ0FBQztVQUM1QjtVQUNBLE9BQU8sSUFBSSxDQUFDaEIsYUFBYSxHQUFHLENBQUM7UUFDOUIsQ0FBQyxFQUNEO1VBQ0NpQixFQUFFLEVBQUdDLEdBQVcsSUFBSztZQUNwQixPQUFPLElBQUksQ0FBQ0MsUUFBUSxDQUFDRCxHQUFHLENBQUM7VUFDMUIsQ0FBQztVQUNERSxRQUFRLEVBQUUsU0FBQUEsQ0FBQSxFQUFZO1lBQ3JCLElBQUksQ0FBQ3JCLFVBQVUsR0FBR00sV0FBVztVQUM5QjtRQUNELENBQ0QsQ0FBQztNQUNGLENBQUMsQ0FBQztJQUNILENBQUM7SUFBQSxPQUFBM0MsVUFBQTtFQUFBLEVBeEVzQzJELElBQUksR0FBQTdDLFdBQUEsR0FBQThDLHlCQUFBLENBQUFyRCxPQUFBLENBQUFjLFNBQUEsZUFBQWxCLEtBQUE7SUFBQTBELFlBQUE7SUFBQUMsVUFBQTtJQUFBQyxRQUFBO0lBQUFDLFdBQUE7RUFBQSxJQUFBekQsT0FBQSxNQUFBRCxNQUFBO0VBQUFZLFFBQUEsR0FBQWxCLFVBQUE7RUFBQSxPQUFBa0IsUUFBQTtBQUFBIiwiaWdub3JlTGlzdCI6W119
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/ui/base/DataType", "sap/ui/base/ManagedObject", "sap/ui/core/mvc/EventHandlerResolver"], function (Log, BindingToolkit, Text, DataType, ManagedObject, EventHandlerResolver) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/ui/base/BindingParser", "sap/ui/base/DataType", "sap/ui/base/ManagedObject", "sap/ui/core/mvc/EventHandlerResolver"], function (Log, BindingToolkit, Text, BindingParser, DataType, ManagedObject, EventHandlerResolver) {
6
6
  "use strict";
7
7
 
8
8
  var bindingParser = ManagedObject.bindingParser;
@@ -36,11 +36,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
36
36
  }
37
37
  };
38
38
  const isChildAnElement = function (children) {
39
- var _isA, _ref;
40
- return children === null || children === void 0 ? void 0 : (_isA = (_ref = children).isA) === null || _isA === void 0 ? void 0 : _isA.call(_ref, "sap.ui.core.Element");
39
+ return children?.isA?.("sap.ui.core.Element");
41
40
  };
42
41
  const isAControl = function (children) {
43
- return !!(children !== null && children !== void 0 && children.getMetadata);
42
+ return !!children?.getMetadata;
44
43
  };
45
44
  function processAggregations(metadata, mSettings) {
46
45
  const metadataAggregations = metadata.getAllAggregations();
@@ -53,9 +52,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
53
52
  if (aggregationChildren[aggregationName] !== undefined) {
54
53
  if (mSettings.hasOwnProperty(aggregationName)) {
55
54
  if (typeof mSettings[aggregationName] === "string") {
56
- mSettings[aggregationName] = {
57
- path: mSettings[aggregationName]
58
- };
55
+ const resultingParse = BindingParser.complexParser(mSettings[aggregationName]);
56
+ if (resultingParse) {
57
+ mSettings[aggregationName] = {
58
+ path: resultingParse.path,
59
+ model: resultingParse.model
60
+ };
61
+ } else {
62
+ mSettings[aggregationName] = {
63
+ path: mSettings[aggregationName]
64
+ };
65
+ }
59
66
  }
60
67
  if (typeof aggregationChildren[aggregationName] === "function") {
61
68
  mSettings[aggregationName].factory = aggregationChildren[aggregationName];
@@ -69,6 +76,78 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
69
76
  });
70
77
  }
71
78
 
79
+ /**
80
+ * Processes a binding toolkit expression property for function processProperties
81
+ *
82
+ * If the property is a constant, it compiles it as a constant. If the property is an aggregation,
83
+ * it compiles the expression as an object. Otherwise, it compiles the expression normally.
84
+ * @param settings The settings of the control
85
+ * @param settingsKey The key of the setting being processed
86
+ * @param bindingToolkitExpression The binding toolkit expression to process
87
+ * @param allProperties All properties of the control
88
+ */
89
+ function processBindingToolkitExpression(settings, settingsKey, bindingToolkitExpression, allProperties) {
90
+ if (isConstant(bindingToolkitExpression)) {
91
+ settings[settingsKey] = compileConstant(bindingToolkitExpression, false, true, true);
92
+ } else if (!Object.hasOwnProperty.call(allProperties, settingsKey)) {
93
+ // Aggregation case - we need to compile the expression but as an object
94
+ if (isPathInModelExpression(bindingToolkitExpression)) {
95
+ settings[settingsKey] = {
96
+ path: bindingToolkitExpression.path,
97
+ model: bindingToolkitExpression.modelName
98
+ };
99
+ }
100
+ } else {
101
+ settings[settingsKey] = compileExpression(bindingToolkitExpression);
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Processes a string property for function processProperties
107
+ *
108
+ * If the property is not a binding expression and does not match the expected format,
109
+ * it parses the value to provide the expected format. If the property is an event handler,
110
+ * it logs an error.
111
+ * @param settings The settings of the control
112
+ * @param settingsKey The key of the setting being processed
113
+ * @param value The string value to process
114
+ * @param allEvents All events of the control
115
+ * @param allProperties All properties of the control
116
+ * @param metadata Metadata of the control
117
+ */
118
+ function processStringProperty(settings, settingsKey, value, allEvents, allProperties, metadata) {
119
+ if (!value.startsWith("{")) {
120
+ if (Object.hasOwnProperty.call(allEvents, settingsKey)) {
121
+ Log.error(`Event handlers cannot be set as string in JSX, ${settingsKey} in ${metadata.getName()}`);
122
+ }
123
+ const propertyType = allProperties[settingsKey]?.getType?.();
124
+ if (propertyType && propertyType instanceof DataType && ["boolean", "int", "float"].includes(propertyType.getName())) {
125
+ settings[settingsKey] = propertyType.parseValue(value);
126
+ }
127
+ } else {
128
+ settings[settingsKey] = value;
129
+ }
130
+ }
131
+
132
+ /**
133
+ * Processes an object property for function processProperties.
134
+ *
135
+ * If the property is a promise, it adds it to the late properties map. If the property is a binding info holder,
136
+ * it sets the binding info to the settings.
137
+ * @param settings The settings of the control
138
+ * @param settingsKey The key of the setting being processed
139
+ * @param value The object value to process
140
+ * @param lateProperties A map of the control's late properties
141
+ */
142
+ function processObjectProperty(settings, settingsKey, value, lateProperties) {
143
+ if (value.then) {
144
+ lateProperties[settingsKey] = value;
145
+ delete settings[settingsKey];
146
+ } else if (value.__bindingInfo) {
147
+ settings[settingsKey] = value.__bindingInfo;
148
+ }
149
+ }
150
+
72
151
  /**
73
152
  * Processes the properties.
74
153
  *
@@ -87,35 +166,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
87
166
  for (settingsKey in settings) {
88
167
  const value = settings[settingsKey];
89
168
  if (isBindingToolkitExpression(value)) {
90
- const bindingToolkitExpression = value;
91
- if (isConstant(bindingToolkitExpression)) {
92
- settings[settingsKey] = compileConstant(bindingToolkitExpression, false, true, true);
93
- } else if (!Object.hasOwnProperty.call(allProperties, settingsKey)) {
94
- // Aggregation case - we need to compile the expression but as an object
95
- if (isPathInModelExpression(bindingToolkitExpression)) {
96
- settings[settingsKey] = {
97
- path: bindingToolkitExpression.path,
98
- model: bindingToolkitExpression.modelName
99
- };
100
- }
101
- } else {
102
- settings[settingsKey] = compileExpression(bindingToolkitExpression);
103
- }
104
- } else if (value !== null && typeof value === "object" && value.then) {
105
- lateProperties[settingsKey] = value;
106
- delete settings[settingsKey];
107
- } else if (typeof value === "string" && !value.startsWith("{")) {
108
- var _allProperties$settin, _allProperties$settin2, _allProperties$settin3;
109
- const propertyType = (_allProperties$settin = allProperties[settingsKey]) === null || _allProperties$settin === void 0 ? void 0 : (_allProperties$settin2 = (_allProperties$settin3 = _allProperties$settin).getType) === null || _allProperties$settin2 === void 0 ? void 0 : _allProperties$settin2.call(_allProperties$settin3);
110
- if (propertyType && propertyType instanceof DataType && ["boolean", "int", "float"].includes(propertyType.getName())) {
111
- settings[settingsKey] = propertyType.parseValue(value);
112
- }
113
- } else if (typeof value === "object" && value.__bindingInfo) {
114
- settings[settingsKey] = value.__bindingInfo;
169
+ processBindingToolkitExpression(settings, settingsKey, value, allProperties);
170
+ } else if (value !== null && typeof value === "object") {
171
+ processObjectProperty(settings, settingsKey, value, lateProperties);
172
+ } else if (typeof value === "string") {
173
+ processStringProperty(settings, settingsKey, value, allEvents, allProperties, metadata);
115
174
  } else if (value === undefined) {
116
- if (Object.hasOwnProperty.call(allEvents, settingsKey)) {
117
- delete settings[settingsKey];
118
- }
175
+ delete settings[settingsKey];
119
176
  }
120
177
  }
121
178
  return lateProperties;
@@ -142,12 +199,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
142
199
  }
143
200
  const jsxControl = function (ControlType, settings, key, jsxContext) {
144
201
  let targetControl;
145
- if (ControlType !== null && ControlType !== void 0 && ControlType.isFragment) {
202
+ if (ControlType?.isFragment) {
146
203
  targetControl = settings.children;
147
- } else if (ControlType !== null && ControlType !== void 0 && ControlType.isRuntime) {
148
- var _runtimeBuildingBlock;
204
+ } else if (ControlType?.isRuntime) {
149
205
  const runtimeBuildingBlock = new ControlType(settings);
150
- targetControl = (_runtimeBuildingBlock = runtimeBuildingBlock.getContent) === null || _runtimeBuildingBlock === void 0 ? void 0 : _runtimeBuildingBlock.call(runtimeBuildingBlock, jsxContext.view, jsxContext.appComponent);
206
+ targetControl = runtimeBuildingBlock.getContent?.(jsxContext.view, jsxContext.appComponent);
151
207
  } else if (isAControl(ControlType)) {
152
208
  const metadata = ControlType.getMetadata();
153
209
  if (key !== undefined) {
@@ -192,10 +248,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
192
248
  if (bindingInfo) {
193
249
  targetControlInstance.bindElement({
194
250
  model: bindingInfo.model ?? undefined,
195
- path: bindingInfo.path
251
+ path: bindingInfo.path,
252
+ parameters: bindingInfo.parameters ?? undefined
196
253
  });
254
+ } else {
255
+ targetControlInstance.bindElement(bindingDef);
197
256
  }
198
- targetControlInstance.bindElement(bindingDef);
199
257
  } else {
200
258
  // We consider it's an object
201
259
  Object.keys(bindingDef).forEach(bindingDefKey => {
@@ -226,4 +284,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/BindingToolkit", "sap/m/Text", "sap/
226
284
  };
227
285
  return jsxControl;
228
286
  }, false);
229
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGTF9ERUxFR0FURSIsIkNPUkVfUkVRVUlSRSIsIkRUX0RFU0lHTlRJTUUiLCJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidW5kZWZpbmVkIiwiaXNDaGlsZEFuRWxlbWVudCIsInB1c2giLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJPYmplY3QiLCJrZXlzIiwiY2hpbGRLZXkiLCJjaGlsZHJlbiIsIl9pc0EiLCJfcmVmIiwiaXNBIiwiY2FsbCIsImlzQUNvbnRyb2wiLCJnZXRNZXRhZGF0YSIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YSIsIm1TZXR0aW5ncyIsIm1ldGFkYXRhQWdncmVnYXRpb25zIiwiZ2V0QWxsQWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSIsImdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInBhdGgiLCJmYWN0b3J5IiwidGVtcGxhdGUiLCJwcm9jZXNzUHJvcGVydGllcyIsInNldHRpbmdzIiwic2V0dGluZ3NLZXkiLCJsYXRlUHJvcGVydGllcyIsImFsbEV2ZW50cyIsImdldEFsbEV2ZW50cyIsImFsbFByb3BlcnRpZXMiLCJnZXRBbGxQcm9wZXJ0aWVzIiwidmFsdWUiLCJpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImlzQ29uc3RhbnQiLCJjb21waWxlQ29uc3RhbnQiLCJpc1BhdGhJbk1vZGVsRXhwcmVzc2lvbiIsIm1vZGVsIiwibW9kZWxOYW1lIiwiY29tcGlsZUV4cHJlc3Npb24iLCJ0aGVuIiwic3RhcnRzV2l0aCIsIl9hbGxQcm9wZXJ0aWVzJHNldHRpbiIsIl9hbGxQcm9wZXJ0aWVzJHNldHRpbjIiLCJfYWxsUHJvcGVydGllcyRzZXR0aW4zIiwicHJvcGVydHlUeXBlIiwiZ2V0VHlwZSIsIkRhdGFUeXBlIiwiaW5jbHVkZXMiLCJnZXROYW1lIiwicGFyc2VWYWx1ZSIsIl9fYmluZGluZ0luZm8iLCJwcm9jZXNzQ29tbWFuZCIsImNvbW1hbmRQcm9wZXJ0eSIsImNvbW1hbmQiLCJldmVudE5hbWUiLCJzcGxpdCIsImV2ZW50IiwibmFtZSIsIkV2ZW50SGFuZGxlclJlc29sdmVyIiwicmVzb2x2ZUV2ZW50SGFuZGxlciIsImpzeENvbnRyb2wiLCJDb250cm9sVHlwZSIsImtleSIsImpzeENvbnRleHQiLCJ0YXJnZXRDb250cm9sIiwiaXNGcmFnbWVudCIsImlzUnVudGltZSIsIl9ydW50aW1lQnVpbGRpbmdCbG9jayIsInJ1bnRpbWVCdWlsZGluZ0Jsb2NrIiwiZ2V0Q29udGVudCIsInZpZXciLCJhcHBDb21wb25lbnQiLCJjbGFzc0RlZiIsImNsYXNzIiwicmVmRGVmIiwicmVmIiwiYmluZGluZ0RlZiIsImJpbmRpbmciLCJmbERlbGVnYXRlIiwiZHREZXNpZ250aW1lIiwidGFyZ2V0Q29udHJvbEluc3RhbmNlIiwiYWRkU3R5bGVDbGFzcyIsInNldEN1cnJlbnQiLCJjdXN0b21TZXR0aW5ncyIsImRhdGEiLCJkZWxlZ2F0ZSIsImRlc2lnbnRpbWUiLCJsZW5ndGgiLCJiaW5kaW5nSW5mbyIsImJpbmRpbmdQYXJzZXIiLCJiaW5kRWxlbWVudCIsImJpbmRpbmdEZWZLZXkiLCJsYXRlUHJvcGVydGllc0tleSIsInNldFByb3BlcnR5IiwiY2F0Y2giLCJlcnJvciIsIkxvZyIsImNvbnRyb2xUeXBlRm4iLCJUZXh0IiwidGV4dCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsianN4LWNvbnRyb2wudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0Y29tcGlsZUNvbnN0YW50LFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0aXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sXG5cdGlzQ29uc3RhbnQsXG5cdGlzUGF0aEluTW9kZWxFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nSW5mb0hvbGRlciwgTm9uQWJzdHJhY3RDbGFzcyB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgQ29udHJvbFByb3BlcnRpZXMsIEpTWENvbnRleHQsIE5vbkNvbnRyb2xQcm9wZXJ0aWVzLCBSZWYgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvanN4LXJ1bnRpbWUvanN4XCI7XG5pbXBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlXCI7XG5pbXBvcnQgdHlwZSBSdW50aW1lQnVpbGRpbmdCbG9jayBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9SdW50aW1lQnVpbGRpbmdCbG9ja1wiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBEYXRhVHlwZSBmcm9tIFwic2FwL3VpL2Jhc2UvRGF0YVR5cGVcIjtcbmltcG9ydCB7IGJpbmRpbmdQYXJzZXIgfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0TWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgJENvbnRyb2xTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgRWxlbWVudCwgZGVmYXVsdCBhcyBVSTVFbGVtZW50IH0gZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBFdmVudEhhbmRsZXJSZXNvbHZlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0V2ZW50SGFuZGxlclJlc29sdmVyXCI7XG5cbmNvbnN0IEZMX0RFTEVHQVRFID0gXCJmbDpkZWxlZ2F0ZVwiO1xuY29uc3QgQ09SRV9SRVFVSVJFID0gXCJjb3JlOnJlcXVpcmVcIjtcbmNvbnN0IERUX0RFU0lHTlRJTUUgPSBcImR0OmRlc2lnbnRpbWVcIjtcbmNvbnN0IGFkZENoaWxkQWdncmVnYXRpb24gPSBmdW5jdGlvbiAoXG5cdGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChzdHJpbmcgfCBVSTVFbGVtZW50KVtdPixcblx0YWdncmVnYXRpb25OYW1lOiBzdHJpbmcsXG5cdGNoaWxkPzogc3RyaW5nIHwgVUk1RWxlbWVudCB8IFVJNUVsZW1lbnRbXVxuKTogdm9pZCB7XG5cdGlmIChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoIWFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9IFtdO1xuXHR9XG5cdGlmIChpc0NoaWxkQW5FbGVtZW50KGNoaWxkKSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5wdXNoKGNoaWxkKTtcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuXHRcdGNoaWxkLmZvckVhY2goKHN1YkNoaWxkKSA9PiB7XG5cdFx0XHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGFnZ3JlZ2F0aW9uTmFtZSwgc3ViQ2hpbGQpO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0YWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdID0gY2hpbGQ7XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMoY2hpbGQpLmZvckVhY2goKGNoaWxkS2V5KSA9PiB7XG5cdFx0XHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGNoaWxkS2V5LCBjaGlsZFtjaGlsZEtleV0pO1xuXHRcdH0pO1xuXHR9XG59O1xuY29uc3QgaXNDaGlsZEFuRWxlbWVudCA9IGZ1bmN0aW9uIChjaGlsZHJlbj86IHVua25vd24pOiBjaGlsZHJlbiBpcyBFbGVtZW50IHtcblx0cmV0dXJuIChjaGlsZHJlbiBhcyBFbGVtZW50KT8uaXNBPy4oXCJzYXAudWkuY29yZS5FbGVtZW50XCIpO1xufTtcbmNvbnN0IGlzQUNvbnRyb2wgPSBmdW5jdGlvbiAoY2hpbGRyZW4/OiB0eXBlb2YgQ29udHJvbCB8IEZ1bmN0aW9uKTogY2hpbGRyZW4gaXMgTm9uQWJzdHJhY3RDbGFzczxDb250cm9sPiB7XG5cdHJldHVybiAhIShjaGlsZHJlbiBhcyB0eXBlb2YgQ29udHJvbCk/LmdldE1ldGFkYXRhO1xufTtcblxuZnVuY3Rpb24gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG5cdGNvbnN0IG1ldGFkYXRhQWdncmVnYXRpb25zID0gbWV0YWRhdGEuZ2V0QWxsQWdncmVnYXRpb25zKCk7XG5cdGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUgPSBtZXRhZGF0YS5nZXREZWZhdWx0QWdncmVnYXRpb25OYW1lKCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChzdHJpbmcgfCBVSTVFbGVtZW50KVtdPiA9IHt9O1xuXHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUsIG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBzdHJpbmcgfCBVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdKTtcblx0ZGVsZXRlIG1TZXR0aW5ncy5jaGlsZHJlbjtcblx0Ly8gZmluZCBvdXQgd2hpY2ggYWdncmVnYXRpb24gYXJlIGJvdW5kIChib3RoIGluIGNoaWxkcmVuIGFuZCBkaXJlY3RseSB1bmRlciBpdClcblx0T2JqZWN0LmtleXMobWV0YWRhdGFBZ2dyZWdhdGlvbnMpLmZvckVhY2goKGFnZ3JlZ2F0aW9uTmFtZSkgPT4ge1xuXHRcdGlmIChhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKG1TZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSA9IHtcblx0XHRcdFx0XHRcdHBhdGg6IG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZW9mIGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdIGFzIHsgZmFjdG9yeTogRnVuY3Rpb24gfSkuZmFjdG9yeSA9IGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bXG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbk5hbWVcblx0XHRcdFx0XHRdIGFzIHVua25vd24gYXMgRnVuY3Rpb247XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdIGFzIHsgdGVtcGxhdGU6IHN0cmluZyB8IFVJNUVsZW1lbnQgfSkudGVtcGxhdGUgPSBhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV1bMF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdID0gYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBwcm9wZXJ0aWVzLlxuICpcbiAqIElmIHRoZSBwcm9wZXJ0eSBpcyBhIGJpbmRpbmdUb29sa2l0IGV4cHJlc3Npb24gd2UgbmVlZCB0byBjb21waWxlIGl0LlxuICogRWxzZSBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IGFzIHN0cmluZyAoY29tcGlsZWQgYmluZGluZyBleHByZXNzaW9uIHJldHVybnMgc3RyaW5nIGJ5IGRlZmF1bHQgZXZlbiBpZiBpdCdzIGEgYm9vbGVhbiwgaW50LCBldGMuKSBhbmQgaXQgZG9lc24ndCBtYXRjaCB3aXRoIGV4cGVjdGVkXG4gKiBmb3JtYXQgdGhlIHZhbHVlIGlzIHBhcnNlZCB0byBwcm92aWRlIGV4cGVjdGVkIGZvcm1hdC5cbiAqIEBwYXJhbSBtZXRhZGF0YSBNZXRhZGF0YSBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIHNldHRpbmdzIFNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKiBAcmV0dXJucyBBIG1hcCBvZiBsYXRlIHByb3BlcnRpZXMgdGhhdCBuZWVkIHRvIGJlIGF3YWl0ZWQgYWZ0ZXIgdGhlIGNvbnRyb2wgaXMgY3JlYXRlZFxuICovXG5mdW5jdGlvbiBwcm9jZXNzUHJvcGVydGllcyhtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PiB7XG5cdGxldCBzZXR0aW5nc0tleToga2V5b2YgdHlwZW9mIHNldHRpbmdzO1xuXHRjb25zdCBsYXRlUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4gPSB7fTtcblx0Y29uc3QgYWxsRXZlbnRzID0gbWV0YWRhdGEuZ2V0QWxsRXZlbnRzKCk7XG5cdGNvbnN0IGFsbFByb3BlcnRpZXMgPSBtZXRhZGF0YS5nZXRBbGxQcm9wZXJ0aWVzKCk7XG5cdGZvciAoc2V0dGluZ3NLZXkgaW4gc2V0dGluZ3MpIHtcblx0XHRjb25zdCB2YWx1ZSA9IHNldHRpbmdzW3NldHRpbmdzS2V5XTtcblx0XHRpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24odmFsdWUpKSB7XG5cdFx0XHRjb25zdCBiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjx1bmtub3duPiA9IHZhbHVlO1xuXHRcdFx0aWYgKGlzQ29uc3RhbnQoYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKSkge1xuXHRcdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBjb21waWxlQ29uc3RhbnQoYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKCFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChhbGxQcm9wZXJ0aWVzLCBzZXR0aW5nc0tleSkpIHtcblx0XHRcdFx0Ly8gQWdncmVnYXRpb24gY2FzZSAtIHdlIG5lZWQgdG8gY29tcGlsZSB0aGUgZXhwcmVzc2lvbiBidXQgYXMgYW4gb2JqZWN0XG5cdFx0XHRcdGlmIChpc1BhdGhJbk1vZGVsRXhwcmVzc2lvbihiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pKSB7XG5cdFx0XHRcdFx0c2V0dGluZ3Nbc2V0dGluZ3NLZXldID0geyBwYXRoOiBiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ucGF0aCwgbW9kZWw6IGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbi5tb2RlbE5hbWUgfTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0dGluZ3Nbc2V0dGluZ3NLZXldID0gY29tcGlsZUV4cHJlc3Npb24oYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAodmFsdWUgYXMgUHJvbWlzZTx1bmtub3duPikudGhlbikge1xuXHRcdFx0bGF0ZVByb3BlcnRpZXNbc2V0dGluZ3NLZXldID0gdmFsdWUgYXMgUHJvbWlzZTx1bmtub3duPjtcblx0XHRcdGRlbGV0ZSBzZXR0aW5nc1tzZXR0aW5nc0tleV07XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCJ7XCIpKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVR5cGUgPSAoYWxsUHJvcGVydGllc1tzZXR0aW5nc0tleV0gYXMgeyBnZXRUeXBlPzogRnVuY3Rpb24gfSk/LmdldFR5cGU/LigpO1xuXHRcdFx0aWYgKHByb3BlcnR5VHlwZSAmJiBwcm9wZXJ0eVR5cGUgaW5zdGFuY2VvZiBEYXRhVHlwZSAmJiBbXCJib29sZWFuXCIsIFwiaW50XCIsIFwiZmxvYXRcIl0uaW5jbHVkZXMocHJvcGVydHlUeXBlLmdldE5hbWUoKSkpIHtcblx0XHRcdFx0c2V0dGluZ3Nbc2V0dGluZ3NLZXldID0gcHJvcGVydHlUeXBlLnBhcnNlVmFsdWUodmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICh2YWx1ZSBhcyBCaW5kaW5nSW5mb0hvbGRlcjx1bmtub3duPikuX19iaW5kaW5nSW5mbykge1xuXHRcdFx0c2V0dGluZ3Nbc2V0dGluZ3NLZXldID0gKHZhbHVlIGFzIEJpbmRpbmdJbmZvSG9sZGVyPHVua25vd24+KS5fX2JpbmRpbmdJbmZvO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFsbEV2ZW50cywgc2V0dGluZ3NLZXkpKSB7XG5cdFx0XHRcdGRlbGV0ZSBzZXR0aW5nc1tzZXR0aW5nc0tleV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBsYXRlUHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGNvbW1hbmQuXG4gKlxuICogUmVzb2x2ZXMgdGhlIGNvbW1hbmQgc2V0IG9uIHRoZSBjb250cm9sIHZpYSB0aGUgaW50cmluc2ljIGNsYXNzIGF0dHJpYnV0ZSBcImpzeDpjb21tYW5kXCIuXG4gKiBJZiBubyBjb21tYW5kIGhhcyBiZWVuIHNldCBvciB0aGUgdGFyZ2V0ZWQgZXZlbnQgZG9lc24ndCBleGlzdCwgbm8gY29uZmlndXJhdGlvbiBpcyBzZXQuXG4gKiBAcGFyYW0gbWV0YWRhdGEgTWV0YWRhdGEgb2YgdGhlIGNvbnRyb2xcbiAqIEBwYXJhbSBzZXR0aW5ncyBTZXR0aW5ncyBvZiB0aGUgY29udHJvbFxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29tbWFuZChtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcblx0Y29uc3QgY29tbWFuZFByb3BlcnR5ID0gc2V0dGluZ3NbXCJqc3g6Y29tbWFuZFwiXTtcblx0aWYgKGNvbW1hbmRQcm9wZXJ0eSkge1xuXHRcdGNvbnN0IFtjb21tYW5kLCBldmVudE5hbWVdID0gKGNvbW1hbmRQcm9wZXJ0eSBhcyBzdHJpbmcpLnNwbGl0KFwifFwiKTtcblx0XHRjb25zdCBldmVudCA9IG1ldGFkYXRhLmdldEFsbEV2ZW50cygpW2V2ZW50TmFtZV07XG5cdFx0aWYgKGV2ZW50ICYmIGNvbW1hbmQuc3RhcnRzV2l0aChcImNtZDpcIikpIHtcblx0XHRcdHNldHRpbmdzW2V2ZW50Lm5hbWVdID0gRXZlbnRIYW5kbGVyUmVzb2x2ZXIucmVzb2x2ZUV2ZW50SGFuZGxlcihjb21tYW5kKTtcblx0XHR9XG5cdH1cblx0ZGVsZXRlIHNldHRpbmdzW1wianN4OmNvbW1hbmRcIl07XG59XG5cbmNvbnN0IGpzeENvbnRyb2wgPSBmdW5jdGlvbiA8VCBleHRlbmRzIEVsZW1lbnQ+KFxuXHRDb250cm9sVHlwZTogTm9uQWJzdHJhY3RDbGFzczxDb250cm9sPiB8IEZ1bmN0aW9uLFxuXHRzZXR0aW5nczogTm9uQ29udHJvbFByb3BlcnRpZXM8VD4gJiB7XG5cdFx0a2V5OiBzdHJpbmc7XG5cdFx0Y2hpbGRyZW4/OiBFbGVtZW50IHwgQ29udHJvbFByb3BlcnRpZXM8VD47XG5cdFx0cmVmPzogUmVmPFQ+O1xuXHRcdGJpbmRpbmc/OiBzdHJpbmc7XG5cdFx0Y2xhc3M/OiBzdHJpbmc7XG5cdFx0W0ZMX0RFTEVHQVRFXT86IHN0cmluZztcblx0XHRbRFRfREVTSUdOVElNRV0/OiBzdHJpbmc7XG5cdFx0W0NPUkVfUkVRVUlSRV0/OiBzdHJpbmc7XG5cdH0sXG5cdGtleTogc3RyaW5nLFxuXHRqc3hDb250ZXh0OiBKU1hDb250ZXh0XG4pOiBDb250cm9sIHwgQ29udHJvbFtdIHwgdW5kZWZpbmVkIHtcblx0bGV0IHRhcmdldENvbnRyb2w6IENvbnRyb2wgfCBDb250cm9sW10gfCB1bmRlZmluZWQ7XG5cblx0aWYgKChDb250cm9sVHlwZSBhcyB7IGlzRnJhZ21lbnQ/OiBib29sZWFuIH0pPy5pc0ZyYWdtZW50KSB7XG5cdFx0dGFyZ2V0Q29udHJvbCA9IHNldHRpbmdzLmNoaWxkcmVuIGFzIENvbnRyb2wgfCBDb250cm9sW107XG5cdH0gZWxzZSBpZiAoKENvbnRyb2xUeXBlIGFzIHR5cGVvZiBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UpPy5pc1J1bnRpbWUpIHtcblx0XHRjb25zdCBydW50aW1lQnVpbGRpbmdCbG9jayA9IG5ldyAoQ29udHJvbFR5cGUgYXMgdHlwZW9mIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrKShzZXR0aW5ncyBhcyB1bmtub3duIGFzICRDb250cm9sU2V0dGluZ3MpO1xuXHRcdHRhcmdldENvbnRyb2wgPSBydW50aW1lQnVpbGRpbmdCbG9jay5nZXRDb250ZW50Py4oanN4Q29udGV4dC52aWV3ISwganN4Q29udGV4dC5hcHBDb21wb25lbnQhKTtcblx0fSBlbHNlIGlmIChpc0FDb250cm9sKENvbnRyb2xUeXBlKSkge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gQ29udHJvbFR5cGUuZ2V0TWV0YWRhdGEoKTtcblx0XHRpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHNldHRpbmdzW1wia2V5XCJdID0ga2V5O1xuXHRcdH1cblx0XHRjb25zdCBsYXRlUHJvcGVydGllcyA9IHByb2Nlc3NQcm9wZXJ0aWVzKG1ldGFkYXRhLCBzZXR0aW5ncyk7XG5cdFx0cHJvY2Vzc0NvbW1hbmQobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRwcm9jZXNzQWdncmVnYXRpb25zKG1ldGFkYXRhLCBzZXR0aW5ncyk7XG5cdFx0Y29uc3QgY2xhc3NEZWYgPSBzZXR0aW5ncy5jbGFzcztcblx0XHRjb25zdCByZWZEZWYgPSBzZXR0aW5ncy5yZWY7XG5cdFx0Y29uc3QgYmluZGluZ0RlZiA9IHNldHRpbmdzLmJpbmRpbmc7XG5cdFx0Y29uc3QgZmxEZWxlZ2F0ZSA9IHNldHRpbmdzW0ZMX0RFTEVHQVRFXTtcblx0XHRjb25zdCBkdERlc2lnbnRpbWUgPSBzZXR0aW5nc1tEVF9ERVNJR05USU1FXTtcblx0XHRkZWxldGUgc2V0dGluZ3MucmVmO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncy5jbGFzcztcblx0XHRkZWxldGUgc2V0dGluZ3MuYmluZGluZztcblx0XHRkZWxldGUgc2V0dGluZ3NbRkxfREVMRUdBVEVdO1xuXHRcdGRlbGV0ZSBzZXR0aW5nc1tEVF9ERVNJR05USU1FXTtcblx0XHRkZWxldGUgc2V0dGluZ3NbQ09SRV9SRVFVSVJFXTsgLy8gQ29yZSByZXF1aXJlIGlzIG5vdCB1c2VmdWwgaW4gY29udHJvbCBtb2RlXG5cdFx0Y29uc3QgdGFyZ2V0Q29udHJvbEluc3RhbmNlID0gbmV3IENvbnRyb2xUeXBlKHNldHRpbmdzIGFzICRDb250cm9sU2V0dGluZ3MpO1xuXHRcdGlmIChjbGFzc0RlZikge1xuXHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmFkZFN0eWxlQ2xhc3MoY2xhc3NEZWYpO1xuXHRcdH1cblx0XHRpZiAocmVmRGVmKSB7XG5cdFx0XHRyZWZEZWYuc2V0Q3VycmVudCh0YXJnZXRDb250cm9sSW5zdGFuY2UgYXMgdW5rbm93biBhcyBUKTtcblx0XHR9XG5cdFx0Y29uc3QgY3VzdG9tU2V0dGluZ3MgPSB0YXJnZXRDb250cm9sSW5zdGFuY2UuZGF0YShcInNhcC11aS1jdXN0b20tc2V0dGluZ3NcIikgPz8ge307XG5cdFx0aWYgKGZsRGVsZWdhdGUpIHtcblx0XHRcdGN1c3RvbVNldHRpbmdzW1wic2FwLnVpLmZsXCJdID8/PSB7fTtcblx0XHRcdGN1c3RvbVNldHRpbmdzW1wic2FwLnVpLmZsXCJdLmRlbGVnYXRlID0gZmxEZWxlZ2F0ZTtcblx0XHR9XG5cdFx0aWYgKGR0RGVzaWdudGltZSkge1xuXHRcdFx0Y3VzdG9tU2V0dGluZ3NbXCJzYXAudWkuZHRcIl0gPz89IHt9O1xuXHRcdFx0Y3VzdG9tU2V0dGluZ3NbXCJzYXAudWkuZHRcIl0uZGVzaWdudGltZSA9IGR0RGVzaWdudGltZTtcblx0XHR9XG5cdFx0aWYgKE9iamVjdC5rZXlzKGN1c3RvbVNldHRpbmdzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuZGF0YShcInNhcC11aS1jdXN0b20tc2V0dGluZ3NcIiwgY3VzdG9tU2V0dGluZ3MpO1xuXHRcdH1cblxuXHRcdGlmIChiaW5kaW5nRGVmKSB7XG5cdFx0XHRpZiAodHlwZW9mIGJpbmRpbmdEZWYgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Y29uc3QgYmluZGluZ0luZm8gPSBiaW5kaW5nUGFyc2VyKGJpbmRpbmdEZWYpO1xuXHRcdFx0XHRpZiAoYmluZGluZ0luZm8pIHtcblx0XHRcdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYmluZEVsZW1lbnQoeyBtb2RlbDogYmluZGluZ0luZm8ubW9kZWwgPz8gdW5kZWZpbmVkLCBwYXRoOiBiaW5kaW5nSW5mby5wYXRoIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhcmdldENvbnRyb2xJbnN0YW5jZS5iaW5kRWxlbWVudChiaW5kaW5nRGVmKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIGNvbnNpZGVyIGl0J3MgYW4gb2JqZWN0XG5cdFx0XHRcdE9iamVjdC5rZXlzKGJpbmRpbmdEZWYpLmZvckVhY2goKGJpbmRpbmdEZWZLZXkpID0+IHtcblx0XHRcdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYmluZEVsZW1lbnQoeyBtb2RlbDogYmluZGluZ0RlZktleSwgcGF0aDogYmluZGluZ0RlZltiaW5kaW5nRGVmS2V5XSB9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgbGF0ZVByb3BlcnRpZXNLZXkgaW4gbGF0ZVByb3BlcnRpZXMpIHtcblx0XHRcdGxhdGVQcm9wZXJ0aWVzW2xhdGVQcm9wZXJ0aWVzS2V5XVxuXHRcdFx0XHQudGhlbigodmFsdWUpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0Q29udHJvbEluc3RhbmNlLnNldFByb3BlcnR5KGxhdGVQcm9wZXJ0aWVzS2V5LCB2YWx1ZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoYENvdWxkbid0IHNldCBwcm9wZXJ0eSAke2xhdGVQcm9wZXJ0aWVzS2V5fSBvbiAke0NvbnRyb2xUeXBlLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpfWAsIGVycm9yLCBcImpzeENvbnRyb2xcIik7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHR0YXJnZXRDb250cm9sID0gdGFyZ2V0Q29udHJvbEluc3RhbmNlO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBDb250cm9sVHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0Y29uc3QgY29udHJvbFR5cGVGbiA9IENvbnRyb2xUeXBlO1xuXHRcdHRhcmdldENvbnRyb2wgPSBjb250cm9sVHlwZUZuKHNldHRpbmdzIGFzICRDb250cm9sU2V0dGluZ3MpO1xuXHR9IGVsc2Uge1xuXHRcdHRhcmdldENvbnRyb2wgPSBuZXcgVGV4dCh7IHRleHQ6IFwiTWlzc2luZyBjb21wb25lbnQgXCIgKyAoQ29udHJvbFR5cGUgYXMgc3RyaW5nKSB9KTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXRDb250cm9sO1xufTtcblxuZXhwb3J0IGRlZmF1bHQganN4Q29udHJvbDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztFQXNCQSxNQUFNQSxXQUFXLEdBQUcsYUFBYTtFQUNqQyxNQUFNQyxZQUFZLEdBQUcsY0FBYztFQUNuQyxNQUFNQyxhQUFhLEdBQUcsZUFBZTtFQUNyQyxNQUFNQyxtQkFBbUIsR0FBRyxTQUFBQSxDQUMzQkMsbUJBQTRELEVBQzVEQyxlQUF1QixFQUN2QkMsS0FBMEMsRUFDbkM7SUFDUCxJQUFJQSxLQUFLLEtBQUssSUFBSSxJQUFJQSxLQUFLLEtBQUtDLFNBQVMsSUFBSSxPQUFPRCxLQUFLLEtBQUssUUFBUSxFQUFFO01BQ3ZFO0lBQ0Q7SUFDQSxJQUFJLENBQUNGLG1CQUFtQixDQUFDQyxlQUFlLENBQUMsRUFBRTtNQUMxQ0QsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7SUFDMUM7SUFDQSxJQUFJRyxnQkFBZ0IsQ0FBQ0YsS0FBSyxDQUFDLEVBQUU7TUFDNUJGLG1CQUFtQixDQUFDQyxlQUFlLENBQUMsQ0FBQ0ksSUFBSSxDQUFDSCxLQUFLLENBQUM7SUFDakQsQ0FBQyxNQUFNLElBQUlJLEtBQUssQ0FBQ0MsT0FBTyxDQUFDTCxLQUFLLENBQUMsRUFBRTtNQUNoQ0EsS0FBSyxDQUFDTSxPQUFPLENBQUVDLFFBQVEsSUFBSztRQUMzQlYsbUJBQW1CLENBQUNDLG1CQUFtQixFQUFFQyxlQUFlLEVBQUVRLFFBQVEs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
287
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGTF9ERUxFR0FURSIsIkNPUkVfUkVRVUlSRSIsIkRUX0RFU0lHTlRJTUUiLCJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidW5kZWZpbmVkIiwiaXNDaGlsZEFuRWxlbWVudCIsInB1c2giLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJPYmplY3QiLCJrZXlzIiwiY2hpbGRLZXkiLCJjaGlsZHJlbiIsImlzQSIsImlzQUNvbnRyb2wiLCJnZXRNZXRhZGF0YSIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YSIsIm1TZXR0aW5ncyIsIm1ldGFkYXRhQWdncmVnYXRpb25zIiwiZ2V0QWxsQWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSIsImdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInJlc3VsdGluZ1BhcnNlIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJwYXRoIiwibW9kZWwiLCJmYWN0b3J5IiwidGVtcGxhdGUiLCJwcm9jZXNzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIiwic2V0dGluZ3MiLCJzZXR0aW5nc0tleSIsImJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiIsImFsbFByb3BlcnRpZXMiLCJpc0NvbnN0YW50IiwiY29tcGlsZUNvbnN0YW50IiwiY2FsbCIsImlzUGF0aEluTW9kZWxFeHByZXNzaW9uIiwibW9kZWxOYW1lIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwcm9jZXNzU3RyaW5nUHJvcGVydHkiLCJ2YWx1ZSIsImFsbEV2ZW50cyIsInN0YXJ0c1dpdGgiLCJMb2ciLCJlcnJvciIsImdldE5hbWUiLCJwcm9wZXJ0eVR5cGUiLCJnZXRUeXBlIiwiRGF0YVR5cGUiLCJpbmNsdWRlcyIsInBhcnNlVmFsdWUiLCJwcm9jZXNzT2JqZWN0UHJvcGVydHkiLCJsYXRlUHJvcGVydGllcyIsInRoZW4iLCJfX2JpbmRpbmdJbmZvIiwicHJvY2Vzc1Byb3BlcnRpZXMiLCJnZXRBbGxFdmVudHMiLCJnZXRBbGxQcm9wZXJ0aWVzIiwiaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24iLCJwcm9jZXNzQ29tbWFuZCIsImNvbW1hbmRQcm9wZXJ0eSIsImNvbW1hbmQiLCJldmVudE5hbWUiLCJzcGxpdCIsImV2ZW50IiwibmFtZSIsIkV2ZW50SGFuZGxlclJlc29sdmVyIiwicmVzb2x2ZUV2ZW50SGFuZGxlciIsImpzeENvbnRyb2wiLCJDb250cm9sVHlwZSIsImtleSIsImpzeENvbnRleHQiLCJ0YXJnZXRDb250cm9sIiwiaXNGcmFnbWVudCIsImlzUnVudGltZSIsInJ1bnRpbWVCdWlsZGluZ0Jsb2NrIiwiZ2V0Q29udGVudCIsInZpZXciLCJhcHBDb21wb25lbnQiLCJjbGFzc0RlZiIsImNsYXNzIiwicmVmRGVmIiwicmVmIiwiYmluZGluZ0RlZiIsImJpbmRpbmciLCJmbERlbGVnYXRlIiwiZHREZXNpZ250aW1lIiwidGFyZ2V0Q29udHJvbEluc3RhbmNlIiwiYWRkU3R5bGVDbGFzcyIsInNldEN1cnJlbnQiLCJjdXN0b21TZXR0aW5ncyIsImRhdGEiLCJkZWxlZ2F0ZSIsImRlc2lnbnRpbWUiLCJsZW5ndGgiLCJiaW5kaW5nSW5mbyIsImJpbmRpbmdQYXJzZXIiLCJiaW5kRWxlbWVudCIsInBhcmFtZXRlcnMiLCJiaW5kaW5nRGVmS2V5IiwibGF0ZVByb3BlcnRpZXNLZXkiLCJzZXRQcm9wZXJ0eSIsImNhdGNoIiwiY29udHJvbFR5cGVGbiIsIlRleHQiLCJ0ZXh0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJqc3gtY29udHJvbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQge1xuXHRjb21waWxlQ29uc3RhbnQsXG5cdGNvbXBpbGVFeHByZXNzaW9uLFxuXHRpc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbixcblx0aXNDb25zdGFudCxcblx0aXNQYXRoSW5Nb2RlbEV4cHJlc3Npb25cbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdJbmZvSG9sZGVyLCBOb25BYnN0cmFjdENsYXNzIH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sUHJvcGVydGllcywgSlNYQ29udGV4dCwgTm9uQ29udHJvbFByb3BlcnRpZXMsIFJlZiB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9CdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2VcIjtcbmltcG9ydCB0eXBlIFJ1bnRpbWVCdWlsZGluZ0Jsb2NrIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL1J1bnRpbWVCdWlsZGluZ0Jsb2NrXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IEJpbmRpbmdQYXJzZXIgZnJvbSBcInNhcC91aS9iYXNlL0JpbmRpbmdQYXJzZXJcIjtcbmltcG9ydCBEYXRhVHlwZSBmcm9tIFwic2FwL3VpL2Jhc2UvRGF0YVR5cGVcIjtcbmltcG9ydCB7IGJpbmRpbmdQYXJzZXIgfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0TWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgJENvbnRyb2xTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgRWxlbWVudCwgZGVmYXVsdCBhcyBVSTVFbGVtZW50IH0gZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBFdmVudEhhbmRsZXJSZXNvbHZlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0V2ZW50SGFuZGxlclJlc29sdmVyXCI7XG5cbmNvbnN0IEZMX0RFTEVHQVRFID0gXCJmbDpkZWxlZ2F0ZVwiO1xuY29uc3QgQ09SRV9SRVFVSVJFID0gXCJjb3JlOnJlcXVpcmVcIjtcbmNvbnN0IERUX0RFU0lHTlRJTUUgPSBcImR0OmRlc2lnbnRpbWVcIjtcbmNvbnN0IGFkZENoaWxkQWdncmVnYXRpb24gPSBmdW5jdGlvbiAoXG5cdGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChzdHJpbmcgfCBVSTVFbGVtZW50KVtdPixcblx0YWdncmVnYXRpb25OYW1lOiBzdHJpbmcsXG5cdGNoaWxkPzogc3RyaW5nIHwgVUk1RWxlbWVudCB8IFVJNUVsZW1lbnRbXVxuKTogdm9pZCB7XG5cdGlmIChjaGlsZCA9PT0gbnVsbCB8fCBjaGlsZCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoIWFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9IFtdO1xuXHR9XG5cdGlmIChpc0NoaWxkQW5FbGVtZW50KGNoaWxkKSkge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXS5wdXNoKGNoaWxkKTtcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuXHRcdGNoaWxkLmZvckVhY2goKHN1YkNoaWxkKSA9PiB7XG5cdFx0XHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGFnZ3JlZ2F0aW9uTmFtZSwgc3ViQ2hpbGQpO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0YWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdID0gY2hpbGQ7XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMoY2hpbGQpLmZvckVhY2goKGNoaWxkS2V5KSA9PiB7XG5cdFx0XHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGNoaWxkS2V5LCBjaGlsZFtjaGlsZEtleV0pO1xuXHRcdH0pO1xuXHR9XG59O1xuY29uc3QgaXNDaGlsZEFuRWxlbWVudCA9IGZ1bmN0aW9uIChjaGlsZHJlbj86IHVua25vd24pOiBjaGlsZHJlbiBpcyBFbGVtZW50IHtcblx0cmV0dXJuIChjaGlsZHJlbiBhcyBFbGVtZW50KT8uaXNBPy4oXCJzYXAudWkuY29yZS5FbGVtZW50XCIpO1xufTtcbmNvbnN0IGlzQUNvbnRyb2wgPSBmdW5jdGlvbiAoY2hpbGRyZW4/OiB0eXBlb2YgQ29udHJvbCB8IEZ1bmN0aW9uKTogY2hpbGRyZW4gaXMgTm9uQWJzdHJhY3RDbGFzczxDb250cm9sPiB7XG5cdHJldHVybiAhIShjaGlsZHJlbiBhcyB0eXBlb2YgQ29udHJvbCk/LmdldE1ldGFkYXRhO1xufTtcblxuZnVuY3Rpb24gcHJvY2Vzc0FnZ3JlZ2F0aW9ucyhtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG5cdGNvbnN0IG1ldGFkYXRhQWdncmVnYXRpb25zID0gbWV0YWRhdGEuZ2V0QWxsQWdncmVnYXRpb25zKCk7XG5cdGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUgPSBtZXRhZGF0YS5nZXREZWZhdWx0QWdncmVnYXRpb25OYW1lKCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uQ2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIChzdHJpbmcgfCBVSTVFbGVtZW50KVtdPiA9IHt9O1xuXHRhZGRDaGlsZEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uQ2hpbGRyZW4sIGRlZmF1bHRBZ2dyZWdhdGlvbk5hbWUsIG1TZXR0aW5ncy5jaGlsZHJlbiBhcyBzdHJpbmcgfCBVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdKTtcblx0ZGVsZXRlIG1TZXR0aW5ncy5jaGlsZHJlbjtcblx0Ly8gZmluZCBvdXQgd2hpY2ggYWdncmVnYXRpb24gYXJlIGJvdW5kIChib3RoIGluIGNoaWxkcmVuIGFuZCBkaXJlY3RseSB1bmRlciBpdClcblx0T2JqZWN0LmtleXMobWV0YWRhdGFBZ2dyZWdhdGlvbnMpLmZvckVhY2goKGFnZ3JlZ2F0aW9uTmFtZSkgPT4ge1xuXHRcdGlmIChhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKG1TZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShhZ2dyZWdhdGlvbk5hbWUpKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRjb25zdCByZXN1bHRpbmdQYXJzZSA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSk7XG5cdFx0XHRcdFx0aWYgKHJlc3VsdGluZ1BhcnNlKSB7XG5cdFx0XHRcdFx0XHRtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSA9IHtcblx0XHRcdFx0XHRcdFx0cGF0aDogcmVzdWx0aW5nUGFyc2UucGF0aCxcblx0XHRcdFx0XHRcdFx0bW9kZWw6IHJlc3VsdGluZ1BhcnNlLm1vZGVsXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSA9IHtcblx0XHRcdFx0XHRcdFx0cGF0aDogbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV1cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlb2YgYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHQobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gYXMgeyBmYWN0b3J5OiBGdW5jdGlvbiB9KS5mYWN0b3J5ID0gYWdncmVnYXRpb25DaGlsZHJlbltcblx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uTmFtZVxuXHRcdFx0XHRcdF0gYXMgdW5rbm93biBhcyBGdW5jdGlvbjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQobVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gYXMgeyB0ZW1wbGF0ZTogc3RyaW5nIHwgVUk1RWxlbWVudCB9KS50ZW1wbGF0ZSA9IGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXVswXTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV0gPSBhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBiaW5kaW5nIHRvb2xraXQgZXhwcmVzc2lvbiBwcm9wZXJ0eSBmb3IgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXNcbiAqXG4gKiBJZiB0aGUgcHJvcGVydHkgaXMgYSBjb25zdGFudCwgaXQgY29tcGlsZXMgaXQgYXMgYSBjb25zdGFudC4gSWYgdGhlIHByb3BlcnR5IGlzIGFuIGFnZ3JlZ2F0aW9uLFxuICogaXQgY29tcGlsZXMgdGhlIGV4cHJlc3Npb24gYXMgYW4gb2JqZWN0LiBPdGhlcndpc2UsIGl0IGNvbXBpbGVzIHRoZSBleHByZXNzaW9uIG5vcm1hbGx5LlxuICogQHBhcmFtIHNldHRpbmdzIFRoZSBzZXR0aW5ncyBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIHNldHRpbmdzS2V5IFRoZSBrZXkgb2YgdGhlIHNldHRpbmcgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIFRoZSBiaW5kaW5nIHRvb2xraXQgZXhwcmVzc2lvbiB0byBwcm9jZXNzXG4gKiBAcGFyYW0gYWxsUHJvcGVydGllcyBBbGwgcHJvcGVydGllcyBvZiB0aGUgY29udHJvbFxuICovXG5mdW5jdGlvbiBwcm9jZXNzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKFxuXHRzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdHNldHRpbmdzS2V5OiBrZXlvZiB0eXBlb2Ygc2V0dGluZ3MsXG5cdGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPHVua25vd24+LFxuXHRhbGxQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogdm9pZCB7XG5cdGlmIChpc0NvbnN0YW50KGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbikpIHtcblx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBjb21waWxlQ29uc3RhbnQoYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG5cdH0gZWxzZSBpZiAoIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFsbFByb3BlcnRpZXMsIHNldHRpbmdzS2V5KSkge1xuXHRcdC8vIEFnZ3JlZ2F0aW9uIGNhc2UgLSB3ZSBuZWVkIHRvIGNvbXBpbGUgdGhlIGV4cHJlc3Npb24gYnV0IGFzIGFuIG9iamVjdFxuXHRcdGlmIChpc1BhdGhJbk1vZGVsRXhwcmVzc2lvbihiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pKSB7XG5cdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSB7IHBhdGg6IGJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbi5wYXRoLCBtb2RlbDogYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLm1vZGVsTmFtZSB9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBjb21waWxlRXhwcmVzc2lvbihiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pO1xuXHR9XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIGEgc3RyaW5nIHByb3BlcnR5IGZvciBmdW5jdGlvbiBwcm9jZXNzUHJvcGVydGllc1xuICpcbiAqIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgYSBiaW5kaW5nIGV4cHJlc3Npb24gYW5kIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBmb3JtYXQsXG4gKiBpdCBwYXJzZXMgdGhlIHZhbHVlIHRvIHByb3ZpZGUgdGhlIGV4cGVjdGVkIGZvcm1hdC4gSWYgdGhlIHByb3BlcnR5IGlzIGFuIGV2ZW50IGhhbmRsZXIsXG4gKiBpdCBsb2dzIGFuIGVycm9yLlxuICogQHBhcmFtIHNldHRpbmdzIFRoZSBzZXR0aW5ncyBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIHNldHRpbmdzS2V5IFRoZSBrZXkgb2YgdGhlIHNldHRpbmcgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB2YWx1ZSB0byBwcm9jZXNzXG4gKiBAcGFyYW0gYWxsRXZlbnRzIEFsbCBldmVudHMgb2YgdGhlIGNvbnRyb2xcbiAqIEBwYXJhbSBhbGxQcm9wZXJ0aWVzIEFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBjb250cm9sXG4gKiBAcGFyYW0gbWV0YWRhdGEgTWV0YWRhdGEgb2YgdGhlIGNvbnRyb2xcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1N0cmluZ1Byb3BlcnR5KFxuXHRzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdHNldHRpbmdzS2V5OiBrZXlvZiB0eXBlb2Ygc2V0dGluZ3MsXG5cdHZhbHVlOiBzdHJpbmcsXG5cdGFsbEV2ZW50czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdGFsbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhXG4pOiB2b2lkIHtcblx0aWYgKCF2YWx1ZS5zdGFydHNXaXRoKFwie1wiKSkge1xuXHRcdGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChhbGxFdmVudHMsIHNldHRpbmdzS2V5KSkge1xuXHRcdFx0TG9nLmVycm9yKGBFdmVudCBoYW5kbGVycyBjYW5ub3QgYmUgc2V0IGFzIHN0cmluZyBpbiBKU1gsICR7c2V0dGluZ3NLZXl9IGluICR7bWV0YWRhdGEuZ2V0TmFtZSgpfWApO1xuXHRcdH1cblx0XHRjb25zdCBwcm9wZXJ0eVR5cGUgPSAoYWxsUHJvcGVydGllc1tzZXR0aW5nc0tleV0gYXMgeyBnZXRUeXBlPzogRnVuY3Rpb24gfSk/LmdldFR5cGU/LigpO1xuXHRcdGlmIChwcm9wZXJ0eVR5cGUgJiYgcHJvcGVydHlUeXBlIGluc3RhbmNlb2YgRGF0YVR5cGUgJiYgW1wiYm9vbGVhblwiLCBcImludFwiLCBcImZsb2F0XCJdLmluY2x1ZGVzKHByb3BlcnR5VHlwZS5nZXROYW1lKCkpKSB7XG5cdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBwcm9wZXJ0eVR5cGUucGFyc2VWYWx1ZSh2YWx1ZSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHNldHRpbmdzW3NldHRpbmdzS2V5XSA9IHZhbHVlO1xuXHR9XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFuIG9iamVjdCBwcm9wZXJ0eSBmb3IgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMuXG4gKlxuICogSWYgdGhlIHByb3BlcnR5IGlzIGEgcHJvbWlzZSwgaXQgYWRkcyBpdCB0byB0aGUgbGF0ZSBwcm9wZXJ0aWVzIG1hcC4gSWYgdGhlIHByb3BlcnR5IGlzIGEgYmluZGluZyBpbmZvIGhvbGRlcixcbiAqIGl0IHNldHMgdGhlIGJpbmRpbmcgaW5mbyB0byB0aGUgc2V0dGluZ3MuXG4gKiBAcGFyYW0gc2V0dGluZ3MgVGhlIHNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKiBAcGFyYW0gc2V0dGluZ3NLZXkgVGhlIGtleSBvZiB0aGUgc2V0dGluZyBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgb2JqZWN0IHZhbHVlIHRvIHByb2Nlc3NcbiAqIEBwYXJhbSBsYXRlUHJvcGVydGllcyBBIG1hcCBvZiB0aGUgY29udHJvbCdzIGxhdGUgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBwcm9jZXNzT2JqZWN0UHJvcGVydHkoXG5cdHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0c2V0dGluZ3NLZXk6IGtleW9mIHR5cGVvZiBzZXR0aW5ncyxcblx0dmFsdWU6IHVua25vd24sXG5cdGxhdGVQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PlxuKTogdm9pZCB7XG5cdGlmICgodmFsdWUgYXMgUHJvbWlzZTx1bmtub3duPikudGhlbikge1xuXHRcdGxhdGVQcm9wZXJ0aWVzW3NldHRpbmdzS2V5XSA9IHZhbHVlIGFzIFByb21pc2U8dW5rbm93bj47XG5cdFx0ZGVsZXRlIHNldHRpbmdzW3NldHRpbmdzS2V5XTtcblx0fSBlbHNlIGlmICgodmFsdWUgYXMgQmluZGluZ0luZm9Ib2xkZXI8dW5rbm93bj4pLl9fYmluZGluZ0luZm8pIHtcblx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSAodmFsdWUgYXMgQmluZGluZ0luZm9Ib2xkZXI8dW5rbm93bj4pLl9fYmluZGluZ0luZm87XG5cdH1cbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIHByb3BlcnRpZXMuXG4gKlxuICogSWYgdGhlIHByb3BlcnR5IGlzIGEgYmluZGluZ1Rvb2xraXQgZXhwcmVzc2lvbiB3ZSBuZWVkIHRvIGNvbXBpbGUgaXQuXG4gKiBFbHNlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgYXMgc3RyaW5nIChjb21waWxlZCBiaW5kaW5nIGV4cHJlc3Npb24gcmV0dXJucyBzdHJpbmcgYnkgZGVmYXVsdCBldmVuIGlmIGl0J3MgYSBib29sZWFuLCBpbnQsIGV0Yy4pIGFuZCBpdCBkb2Vzbid0IG1hdGNoIHdpdGggZXhwZWN0ZWRcbiAqIGZvcm1hdCB0aGUgdmFsdWUgaXMgcGFyc2VkIHRvIHByb3ZpZGUgZXhwZWN0ZWQgZm9ybWF0LlxuICogQHBhcmFtIG1ldGFkYXRhIE1ldGFkYXRhIG9mIHRoZSBjb250cm9sXG4gKiBAcGFyYW0gc2V0dGluZ3MgU2V0dGluZ3Mgb2YgdGhlIGNvbnRyb2xcbiAqIEByZXR1cm5zIEEgbWFwIG9mIGxhdGUgcHJvcGVydGllcyB0aGF0IG5lZWQgdG8gYmUgYXdhaXRlZCBhZnRlciB0aGUgY29udHJvbCBpcyBjcmVhdGVkXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0aWVzKG1ldGFkYXRhOiBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEsIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+IHtcblx0bGV0IHNldHRpbmdzS2V5OiBrZXlvZiB0eXBlb2Ygc2V0dGluZ3M7XG5cdGNvbnN0IGxhdGVQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PiA9IHt9O1xuXHRjb25zdCBhbGxFdmVudHMgPSBtZXRhZGF0YS5nZXRBbGxFdmVudHMoKTtcblx0Y29uc3QgYWxsUHJvcGVydGllcyA9IG1ldGFkYXRhLmdldEFsbFByb3BlcnRpZXMoKTtcblxuXHRmb3IgKHNldHRpbmdzS2V5IGluIHNldHRpbmdzKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBzZXR0aW5nc1tzZXR0aW5nc0tleV07XG5cdFx0aWYgKGlzQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKHZhbHVlKSkge1xuXHRcdFx0cHJvY2Vzc0JpbmRpbmdUb29sa2l0RXhwcmVzc2lvbihzZXR0aW5ncywgc2V0dGluZ3NLZXksIHZhbHVlLCBhbGxQcm9wZXJ0aWVzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0cHJvY2Vzc09iamVjdFByb3BlcnR5KHNldHRpbmdzLCBzZXR0aW5nc0tleSwgdmFsdWUsIGxhdGVQcm9wZXJ0aWVzKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cHJvY2Vzc1N0cmluZ1Byb3BlcnR5KHNldHRpbmdzLCBzZXR0aW5nc0tleSwgdmFsdWUsIGFsbEV2ZW50cywgYWxsUHJvcGVydGllcywgbWV0YWRhdGEpO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZGVsZXRlIHNldHRpbmdzW3NldHRpbmdzS2V5XTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGxhdGVQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgY29tbWFuZC5cbiAqXG4gKiBSZXNvbHZlcyB0aGUgY29tbWFuZCBzZXQgb24gdGhlIGNvbnRyb2wgdmlhIHRoZSBpbnRyaW5zaWMgY2xhc3MgYXR0cmlidXRlIFwianN4OmNvbW1hbmRcIi5cbiAqIElmIG5vIGNvbW1hbmQgaGFzIGJlZW4gc2V0IG9yIHRoZSB0YXJnZXRlZCBldmVudCBkb2Vzbid0IGV4aXN0LCBubyBjb25maWd1cmF0aW9uIGlzIHNldC5cbiAqIEBwYXJhbSBtZXRhZGF0YSBNZXRhZGF0YSBvZiB0aGUgY29udHJvbFxuICogQHBhcmFtIHNldHRpbmdzIFNldHRpbmdzIG9mIHRoZSBjb250cm9sXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDb21tYW5kKG1ldGFkYXRhOiBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEsIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuXHRjb25zdCBjb21tYW5kUHJvcGVydHkgPSBzZXR0aW5nc1tcImpzeDpjb21tYW5kXCJdO1xuXHRpZiAoY29tbWFuZFByb3BlcnR5KSB7XG5cdFx0Y29uc3QgW2NvbW1hbmQsIGV2ZW50TmFtZV0gPSAoY29tbWFuZFByb3BlcnR5IGFzIHN0cmluZykuc3BsaXQoXCJ8XCIpO1xuXHRcdGNvbnN0IGV2ZW50ID0gbWV0YWRhdGEuZ2V0QWxsRXZlbnRzKClbZXZlbnROYW1lXTtcblx0XHRpZiAoZXZlbnQgJiYgY29tbWFuZC5zdGFydHNXaXRoKFwiY21kOlwiKSkge1xuXHRcdFx0c2V0dGluZ3NbZXZlbnQubmFtZV0gPSBFdmVudEhhbmRsZXJSZXNvbHZlci5yZXNvbHZlRXZlbnRIYW5kbGVyKGNvbW1hbmQpO1xuXHRcdH1cblx0fVxuXHRkZWxldGUgc2V0dGluZ3NbXCJqc3g6Y29tbWFuZFwiXTtcbn1cblxuY29uc3QganN4Q29udHJvbCA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgRWxlbWVudD4oXG5cdENvbnRyb2xUeXBlOiBOb25BYnN0cmFjdENsYXNzPENvbnRyb2w+IHwgRnVuY3Rpb24sXG5cdHNldHRpbmdzOiBOb25Db250cm9sUHJvcGVydGllczxUPiAmIHtcblx0XHRrZXk6IHN0cmluZztcblx0XHRjaGlsZHJlbj86IEVsZW1lbnQgfCBDb250cm9sUHJvcGVydGllczxUPjtcblx0XHRyZWY/OiBSZWY8VD47XG5cdFx0YmluZGluZz86IHN0cmluZztcblx0XHRjbGFzcz86IHN0cmluZztcblx0XHRbRkxfREVMRUdBVEVdPzogc3RyaW5nO1xuXHRcdFtEVF9ERVNJR05USU1FXT86IHN0cmluZztcblx0XHRbQ09SRV9SRVFVSVJFXT86IHN0cmluZztcblx0fSxcblx0a2V5OiBzdHJpbmcsXG5cdGpzeENvbnRleHQ6IEpTWENvbnRleHRcbik6IENvbnRyb2wgfCBDb250cm9sW10gfCB1bmRlZmluZWQge1xuXHRsZXQgdGFyZ2V0Q29udHJvbDogQ29udHJvbCB8IENvbnRyb2xbXSB8IHVuZGVmaW5lZDtcblxuXHRpZiAoKENvbnRyb2xUeXBlIGFzIHsgaXNGcmFnbWVudD86IGJvb2xlYW4gfSk/LmlzRnJhZ21lbnQpIHtcblx0XHR0YXJnZXRDb250cm9sID0gc2V0dGluZ3MuY2hpbGRyZW4gYXMgQ29udHJvbCB8IENvbnRyb2xbXTtcblx0fSBlbHNlIGlmICgoQ29udHJvbFR5cGUgYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tUZW1wbGF0aW5nQmFzZSk/LmlzUnVudGltZSkge1xuXHRcdGNvbnN0IHJ1bnRpbWVCdWlsZGluZ0Jsb2NrID0gbmV3IChDb250cm9sVHlwZSBhcyB0eXBlb2YgUnVudGltZUJ1aWxkaW5nQmxvY2spKHNldHRpbmdzIGFzIHVua25vd24gYXMgJENvbnRyb2xTZXR0aW5ncyk7XG5cdFx0dGFyZ2V0Q29udHJvbCA9IHJ1bnRpbWVCdWlsZGluZ0Jsb2NrLmdldENvbnRlbnQ/Lihqc3hDb250ZXh0LnZpZXchLCBqc3hDb250ZXh0LmFwcENvbXBvbmVudCEpO1xuXHR9IGVsc2UgaWYgKGlzQUNvbnRyb2woQ29udHJvbFR5cGUpKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBDb250cm9sVHlwZS5nZXRNZXRhZGF0YSgpO1xuXHRcdGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c2V0dGluZ3NbXCJrZXlcIl0gPSBrZXk7XG5cdFx0fVxuXHRcdGNvbnN0IGxhdGVQcm9wZXJ0aWVzID0gcHJvY2Vzc1Byb3BlcnRpZXMobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRwcm9jZXNzQ29tbWFuZChtZXRhZGF0YSwgc2V0dGluZ3MpO1xuXHRcdHByb2Nlc3NBZ2dyZWdhdGlvbnMobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRjb25zdCBjbGFzc0RlZiA9IHNldHRpbmdzLmNsYXNzO1xuXHRcdGNvbnN0IHJlZkRlZiA9IHNldHRpbmdzLnJlZjtcblx0XHRjb25zdCBiaW5kaW5nRGVmID0gc2V0dGluZ3MuYmluZGluZztcblx0XHRjb25zdCBmbERlbGVnYXRlID0gc2V0dGluZ3NbRkxfREVMRUdBVEVdO1xuXHRcdGNvbnN0IGR0RGVzaWdudGltZSA9IHNldHRpbmdzW0RUX0RFU0lHTlRJTUVdO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncy5yZWY7XG5cdFx0ZGVsZXRlIHNldHRpbmdzLmNsYXNzO1xuXHRcdGRlbGV0ZSBzZXR0aW5ncy5iaW5kaW5nO1xuXHRcdGRlbGV0ZSBzZXR0aW5nc1tGTF9ERUxFR0FURV07XG5cdFx0ZGVsZXRlIHNldHRpbmdzW0RUX0RFU0lHTlRJTUVdO1xuXHRcdGRlbGV0ZSBzZXR0aW5nc1tDT1JFX1JFUVVJUkVdOyAvLyBDb3JlIHJlcXVpcmUgaXMgbm90IHVzZWZ1bCBpbiBjb250cm9sIG1vZGVcblx0XHRjb25zdCB0YXJnZXRDb250cm9sSW5zdGFuY2UgPSBuZXcgQ29udHJvbFR5cGUoc2V0dGluZ3MgYXMgJENvbnRyb2xTZXR0aW5ncyk7XG5cdFx0aWYgKGNsYXNzRGVmKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYWRkU3R5bGVDbGFzcyhjbGFzc0RlZik7XG5cdFx0fVxuXHRcdGlmIChyZWZEZWYpIHtcblx0XHRcdHJlZkRlZi5zZXRDdXJyZW50KHRhcmdldENvbnRyb2xJbnN0YW5jZSBhcyB1bmtub3duIGFzIFQpO1xuXHRcdH1cblx0XHRjb25zdCBjdXN0b21TZXR0aW5ncyA9IHRhcmdldENvbnRyb2xJbnN0YW5jZS5kYXRhKFwic2FwLXVpLWN1c3RvbS1zZXR0aW5nc1wiKSA/PyB7fTtcblx0XHRpZiAoZmxEZWxlZ2F0ZSkge1xuXHRcdFx0Y3VzdG9tU2V0dGluZ3NbXCJzYXAudWkuZmxcIl0gPz89IHt9O1xuXHRcdFx0Y3VzdG9tU2V0dGluZ3NbXCJzYXAudWkuZmxcIl0uZGVsZWdhdGUgPSBmbERlbGVnYXRlO1xuXHRcdH1cblx0XHRpZiAoZHREZXNpZ250aW1lKSB7XG5cdFx0XHRjdXN0b21TZXR0aW5nc1tcInNhcC51aS5kdFwiXSA/Pz0ge307XG5cdFx0XHRjdXN0b21TZXR0aW5nc1tcInNhcC51aS5kdFwiXS5kZXNpZ250aW1lID0gZHREZXNpZ250aW1lO1xuXHRcdH1cblx0XHRpZiAoT2JqZWN0LmtleXMoY3VzdG9tU2V0dGluZ3MpLmxlbmd0aCA+IDApIHtcblx0XHRcdHRhcmdldENvbnRyb2xJbnN0YW5jZS5kYXRhKFwic2FwLXVpLWN1c3RvbS1zZXR0aW5nc1wiLCBjdXN0b21TZXR0aW5ncyk7XG5cdFx0fVxuXG5cdFx0aWYgKGJpbmRpbmdEZWYpIHtcblx0XHRcdGlmICh0eXBlb2YgYmluZGluZ0RlZiA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nSW5mbyA9IGJpbmRpbmdQYXJzZXIoYmluZGluZ0RlZik7XG5cdFx0XHRcdGlmIChiaW5kaW5nSW5mbykge1xuXHRcdFx0XHRcdHRhcmdldENvbnRyb2xJbnN0YW5jZS5iaW5kRWxlbWVudCh7XG5cdFx0XHRcdFx0XHRtb2RlbDogYmluZGluZ0luZm8ubW9kZWwgPz8gdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0cGF0aDogYmluZGluZ0luZm8ucGF0aCxcblx0XHRcdFx0XHRcdHBhcmFtZXRlcnM6IGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgPz8gdW5kZWZpbmVkXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmJpbmRFbGVtZW50KGJpbmRpbmdEZWYpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBXZSBjb25zaWRlciBpdCdzIGFuIG9iamVjdFxuXHRcdFx0XHRPYmplY3Qua2V5cyhiaW5kaW5nRGVmKS5mb3JFYWNoKChiaW5kaW5nRGVmS2V5KSA9PiB7XG5cdFx0XHRcdFx0dGFyZ2V0Q29udHJvbEluc3RhbmNlLmJpbmRFbGVtZW50KHsgbW9kZWw6IGJpbmRpbmdEZWZLZXksIHBhdGg6IGJpbmRpbmdEZWZbYmluZGluZ0RlZktleV0gfSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGxhdGVQcm9wZXJ0aWVzS2V5IGluIGxhdGVQcm9wZXJ0aWVzKSB7XG5cdFx0XHRsYXRlUHJvcGVydGllc1tsYXRlUHJvcGVydGllc0tleV1cblx0XHRcdFx0LnRoZW4oKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRhcmdldENvbnRyb2xJbnN0YW5jZS5zZXRQcm9wZXJ0eShsYXRlUHJvcGVydGllc0tleSwgdmFsdWUpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKGVycm9yKSA9PiB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBDb3VsZG4ndCBzZXQgcHJvcGVydHkgJHtsYXRlUHJvcGVydGllc0tleX0gb24gJHtDb250cm9sVHlwZS5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKX1gLCBlcnJvciwgXCJqc3hDb250cm9sXCIpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0dGFyZ2V0Q29udHJvbCA9IHRhcmdldENvbnRyb2xJbnN0YW5jZTtcblx0fSBlbHNlIGlmICh0eXBlb2YgQ29udHJvbFR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdGNvbnN0IGNvbnRyb2xUeXBlRm4gPSBDb250cm9sVHlwZTtcblx0XHR0YXJnZXRDb250cm9sID0gY29udHJvbFR5cGVGbihzZXR0aW5ncyBhcyAkQ29udHJvbFNldHRpbmdzKTtcblx0fSBlbHNlIHtcblx0XHR0YXJnZXRDb250cm9sID0gbmV3IFRleHQoeyB0ZXh0OiBcIk1pc3NpbmcgY29tcG9uZW50IFwiICsgKENvbnRyb2xUeXBlIGFzIHN0cmluZykgfSk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0Q29udHJvbDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGpzeENvbnRyb2w7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7RUF1QkEsTUFBTUEsV0FBVyxHQUFHLGFBQWE7RUFDakMsTUFBTUMsWUFBWSxHQUFHLGNBQWM7RUFDbkMsTUFBTUMsYUFBYSxHQUFHLGVBQWU7RUFDckMsTUFBTUMsbUJBQW1CLEdBQUcsU0FBQUEsQ0FDM0JDLG1CQUE0RCxFQUM1REMsZUFBdUIsRUFDdkJDLEtBQTBDLEVBQ25DO0lBQ1AsSUFBSUEsS0FBSyxLQUFLLElBQUksSUFBSUEsS0FBSyxLQUFLQyxTQUFTLElBQUksT0FBT0QsS0FBSyxLQUFL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