@sapui5/sap.fe.macros 1.124.1 → 1.124.2

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.macros",
3
- "version": "1.124.1",
3
+ "version": "1.124.2",
4
4
  "description": "SAPUI5 Library sap.fe.macros",
5
5
  "keywords": [
6
6
  "sapui5",
@@ -6,7 +6,7 @@
6
6
  SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.124.1</version>
9
+ <version>1.124.2</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.macros</documentation>
12
12
 
@@ -75,7 +75,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/BuildingBlockBase", "
75
75
  const metaModel = (_owner$preprocessorCo = owner.preprocessorContext) === null || _owner$preprocessorCo === void 0 ? void 0 : _owner$preprocessorCo.models.metaModel;
76
76
  const filterBar = UI5Element.getElementById(this.filterBar);
77
77
  const fields = FilterUtils.getConvertedFilterFields(filterBar, undefined, undefined, metaModel);
78
- return fields.map(field => {
78
+ return fields.filter(field => field.availability !== "Hidden") // Exclude hidden filter fields. It is not possible to set a value for hidden filters, and users would not understand anyway as they cannot see these values.
79
+ .map(field => {
79
80
  var _propertyObject$targe;
80
81
  const propertyObject = this.getDataModelObjectPath(field.annotationPath);
81
82
  let codeList;
@@ -139,65 +140,62 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/BuildingBlockBase", "
139
140
  const magicQuery = (_this$searchInput$cur = this.searchInput.current) === null || _this$searchInput$cur === void 0 ? void 0 : _this$searchInput$cur.getValue();
140
141
  (_this$searchInput$cur2 = this.searchInput.current) === null || _this$searchInput$cur2 === void 0 ? void 0 : _this$searchInput$cur2.setValueStateText("");
141
142
  (_this$searchInput$cur3 = this.searchInput.current) === null || _this$searchInput$cur3 === void 0 ? void 0 : _this$searchInput$cur3.setValueState("None");
143
+ const filterBar = UI5Element.getElementById(this.filterBar);
144
+ const filterBarAPI = filterBar.getParent();
142
145
  if (!magicQuery) {
146
+ // Empty input: clear the filters and refresh the list
147
+ await filterBarAPI._clearFilterValuesWithOptions(filterBar);
148
+ await filterBarAPI.triggerSearch();
143
149
  return;
144
150
  }
145
151
  const uiModel = this.getModel("ui");
146
152
  BusyLocker.lock(uiModel);
147
- const filterBar = UI5Element.getElementById(this.filterBar);
148
153
  // Call AI service to get the filter criteria
149
154
  const easyfilter = await this.easyfilter;
150
155
  if (!easyfilter) {
151
156
  return;
152
157
  }
153
158
  const easyFilterMetadata = {
154
- version: "1.0",
159
+ version: 1,
155
160
  entitySet: this.contextPath ?? this.getOwnerContextPath() ?? "",
156
161
  fields: this.filterBarMetadata
157
162
  };
158
163
  const easyFilterResult = await easyfilter.easyFilter(magicQuery, easyFilterMetadata);
159
- if (!easyFilterResult.success) {
160
- var _this$searchInput$cur4, _this$searchInput$cur5;
161
- (_this$searchInput$cur4 = this.searchInput.current) === null || _this$searchInput$cur4 === void 0 ? void 0 : _this$searchInput$cur4.setValueState("Warning");
162
- (_this$searchInput$cur5 = this.searchInput.current) === null || _this$searchInput$cur5 === void 0 ? void 0 : _this$searchInput$cur5.setValueStateText(easyFilterResult.message);
163
- Log.error("Error while generating filter criteria: ", easyFilterResult.message);
164
- return;
165
- }
166
- if (easyFilterResult.data.version === 1) {
167
- if (easyFilterResult.data.unclear) {
168
- var _this$searchInput$cur6, _this$searchInput$cur7;
169
- (_this$searchInput$cur6 = this.searchInput.current) === null || _this$searchInput$cur6 === void 0 ? void 0 : _this$searchInput$cur6.setValueState("Warning");
170
- (_this$searchInput$cur7 = this.searchInput.current) === null || _this$searchInput$cur7 === void 0 ? void 0 : _this$searchInput$cur7.setValueStateText("Unclear input: " + easyFilterResult.data.unclear); // TODO: Does this make sense?
171
- }
172
-
173
- if (easyFilterResult.data.filter) {
174
- const filterValues = easyFilterResult.data.filter.map(filterValue => ({
175
- propertyPath: filterValue.name,
176
- operator: filterValue.operator,
177
- values: filterValue.values
178
- }));
179
-
180
- // We need to show a message to the user that the filter criteria has been generated
164
+ if (easyFilterResult.success) {
165
+ if (easyFilterResult.data.version === 1) {
166
+ if (easyFilterResult.data.unclear) {
167
+ var _this$searchInput$cur4, _this$searchInput$cur5;
168
+ (_this$searchInput$cur4 = this.searchInput.current) === null || _this$searchInput$cur4 === void 0 ? void 0 : _this$searchInput$cur4.setValueState("Warning");
169
+ (_this$searchInput$cur5 = this.searchInput.current) === null || _this$searchInput$cur5 === void 0 ? void 0 : _this$searchInput$cur5.setValueStateText("Unclear input: " + easyFilterResult.data.unclear); // TODO: Does this make sense?
170
+ }
181
171
 
182
- Log.debug("Filter criteria generated: ", JSON.stringify(filterValues, null, 2));
172
+ if (easyFilterResult.data.filter) {
173
+ // We need to show a message to the user that the filter criteria has been generated
174
+ Log.debug("Filter criteria generated: ", JSON.stringify(easyFilterResult.data.filter, null, 2));
183
175
 
184
- // Validate and apply the filter criteria
185
- const filterBarAPI = filterBar.getParent();
186
- const tokens = [];
187
- for (const filterValue of filterValues) {
188
- tokens.push({
189
- key: filterValue.propertyPath,
190
- text: `${filterValue.operator} ${filterValue.values}`
191
- });
176
+ // Validate and apply the filter criteria
192
177
  await filterBarAPI._clearFilterValuesWithOptions(filterBar);
193
- await filterBarAPI.setFilterValues(filterValue.propertyPath, filterValue.operator, filterValue.values);
178
+ const tokens = [];
179
+ for (const filterValue of easyFilterResult.data.filter) {
180
+ tokens.push({
181
+ key: filterValue.name,
182
+ text: `${filterValue.operator} ${filterValue.values}`
183
+ });
184
+ await FilterUtils.addFilterValues(filterBarAPI.content, filterValue.name, filterValue.operator, filterValue.values);
185
+ }
186
+ await filterBarAPI.triggerSearch();
187
+ this.stateModel.setProperty("/tokens", tokens);
188
+ this.stateModel.setProperty("/showResult", true);
194
189
  }
195
- await filterBarAPI.triggerSearch();
196
- this.stateModel.setProperty("/tokens", tokens);
197
- this.stateModel.setProperty("/showResult", true);
190
+ } else if (easyFilterResult.data.version === 2) {
191
+ // Create the sap.ui.model.Filter from the filter and apply it directly to the list binding
198
192
  }
199
- } else if (easyFilterResult.data.version === 2) {
200
- // Create the sap.ui.model.Filter from the filter and apply it directly to the list binding
193
+ } else {
194
+ var _this$searchInput$cur6, _this$searchInput$cur7;
195
+ // error
196
+ (_this$searchInput$cur6 = this.searchInput.current) === null || _this$searchInput$cur6 === void 0 ? void 0 : _this$searchInput$cur6.setValueState("Warning");
197
+ (_this$searchInput$cur7 = this.searchInput.current) === null || _this$searchInput$cur7 === void 0 ? void 0 : _this$searchInput$cur7.setValueStateText(easyFilterResult.message);
198
+ Log.error("Error while generating filter criteria: ", easyFilterResult.message);
201
199
  }
202
200
  BusyLocker.unlock(uiModel);
203
201
  };
@@ -214,7 +212,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/BuildingBlockBase", "
214
212
  var _this$searchInput$cur8;
215
213
  const vBox = _jsxs(VBox, {
216
214
  children: [_jsx(MessageStrip, {
217
- text: "The Prompt-based filtering will create completely new filter criteria. Generated content may not always be accurate. Consider verifying it. ",
215
+ text: "Prompt-based filtering creates completely new filter criteria. Generated content may not always be accurate. Consider verifying it.",
218
216
  showIcon: true,
219
217
  showCloseButton: true,
220
218
  class: "sapUiSmallMarginBottom"
@@ -301,4 +299,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/BuildingBlockBase", "
301
299
  _exports = EasyFilterBar;
302
300
  return _exports;
303
301
  }, false);
304
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFYXN5RmlsdGVyQmFyIiwiZGVmaW5lVUk1Q2xhc3MiLCJhc3NvY2lhdGlvbiIsInR5cGUiLCJwcm9wZXJ0eSIsImRlZmluZVJlZmVyZW5jZSIsInByb3BlcnRpZXMiLCJvdGhlcnMiLCJmZXNyU3RlcE5hbWUiLCJlYXN5ZmlsdGVyIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJwcmVwYXJlRmVhdHVyZSIsInRoZW4iLCJvbk1ldGFkYXRhQXZhaWxhYmxlIiwiX2ZldGNoZWRDb2RlTGlzdCIsInN0YXRlTW9kZWwiLCJKU09OTW9kZWwiLCJzaG93UmVzdWx0Iiwic2V0TW9kZWwiLCJmaWx0ZXJCYXJNZXRhZGF0YSIsInByZXBhcmVGaWx0ZXJCYXJNZXRhZGF0YSIsImNvbnRlbnQiLCJjcmVhdGVDb250ZW50Iiwib3duZXIiLCJfZ2V0T3duZXIiLCJtZXRhTW9kZWwiLCJwcmVwcm9jZXNzb3JDb250ZXh0IiwibW9kZWxzIiwiZmlsdGVyQmFyIiwiVUk1RWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiZmllbGRzIiwiRmlsdGVyVXRpbHMiLCJnZXRDb252ZXJ0ZWRGaWx0ZXJGaWVsZHMiLCJ1bmRlZmluZWQiLCJtYXAiLCJmaWVsZCIsInByb3BlcnR5T2JqZWN0IiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImFubm90YXRpb25QYXRoIiwiY29kZUxpc3QiLCJ0YXJnZXRPYmplY3QiLCJoYXNDb2RlTGlzdCIsImhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyIsImtleSIsImdldENvZGVMaXN0Rm9yUHJvcGVydHkiLCJuYW1lIiwibGFiZWwiLCJkYXRhVHlwZSIsInJlcXVpcmVkIiwiZmlsdGVyYWJsZSIsInNvcnRhYmxlIiwiaXNQYXJhbWV0ZXIiLCJwcm9wZXJ0eVBhdGgiLCJvZGF0YU1vZGVsIiwiZ2V0TW9kZWwiLCJ2YWx1ZUxpc3QiLCJnZXRNZXRhTW9kZWwiLCJyZXF1ZXN0VmFsdWVMaXN0SW5mbyIsImRlZmF1bHRWYWx1ZUxpc3QiLCJzZWxlY3QiLCJQYXJhbWV0ZXJzIiwicGFyYW0iLCJWYWx1ZUxpc3RQcm9wZXJ0eSIsImpvaW4iLCJsaXN0QmluZGluZyIsIiRtb2RlbCIsImJpbmRMaXN0IiwiQ29sbGVjdGlvblBhdGgiLCIkc2VsZWN0IiwiZGF0YSIsInJlcXVlc3RDb250ZXh0cyIsInZhbHVlUHJvcGVydHkiLCJkZXNjcmlwdGlvblByb3BlcnR5IiwicGFyYW1ldGVyIiwiTG9jYWxEYXRhUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiZmlsdGVyR3JvdXBWYWx1ZXMiLCJkYXR1bSIsImRhdGFvYmoiLCJnZXRPYmplY3QiLCJwdXNoIiwidmFsdWUiLCJkZXNjcmlwdGlvbiIsImNvZGVMaXN0UHJvcGVydHkiLCJmaW5kIiwib25Hb1ByZXNzIiwibWFnaWNRdWVyeSIsInNlYXJjaElucHV0IiwiY3VycmVudCIsImdldFZhbHVlIiwic2V0VmFsdWVTdGF0ZVRleHQiLCJzZXRWYWx1ZVN0YXRlIiwidWlNb2RlbCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZWFzeUZpbHRlck1ldGFkYXRhIiwidmVyc2lvbiIsImVudGl0eVNldCIsImNvbnRleHRQYXRoIiwiZ2V0T3duZXJDb250ZXh0UGF0aCIsImVhc3lGaWx0ZXJSZXN1bHQiLCJlYXN5RmlsdGVyIiwic3VjY2VzcyIsIm1lc3NhZ2UiLCJMb2ciLCJlcnJvciIsInVuY2xlYXIiLCJmaWx0ZXIiLCJmaWx0ZXJWYWx1ZXMiLCJmaWx0ZXJWYWx1ZSIsIm9wZXJhdG9yIiwidmFsdWVzIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwiZmlsdGVyQmFyQVBJIiwiZ2V0UGFyZW50IiwidG9rZW5zIiwidGV4dCIsIl9jbGVhckZpbHRlclZhbHVlc1dpdGhPcHRpb25zIiwic2V0RmlsdGVyVmFsdWVzIiwidHJpZ2dlclNlYXJjaCIsInNldFByb3BlcnR5IiwidW5sb2NrIiwib25Ub2tlbkRlbGV0ZSIsIl9lIiwib25RdWVyeUNoYW5nZWQiLCJmaXJlRmlsdGVyc0NoYW5nZWQiLCJjb25kaXRpb25zQmFzZWQiLCJ2Qm94IiwiZSIsIkJ1dHRvblR5cGUiLCJFbXBoYXNpemVkIiwiZXZlbnQiLCJGRVNSSGVscGVyIiwic2V0U2VtYW50aWNTdGVwbmFtZSIsImdldFNvdXJjZSIsImlkeCIsImN0eCIsIm9iamVjdCIsImFkZEV2ZW50RGVsZWdhdGUiLCJvbmtleXVwIiwib25mb2N1c2luIiwiZ2V0VmFsdWVTdGF0ZSIsInJlcXVpcmVkRmllbGRzIiwicmVxdWlyZWRGaWVsZHNUZXh0IiwibGVuZ3RoIiwiQnVpbGRpbmdCbG9ja0Jhc2UiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkVhc3lGaWx0ZXJCYXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEJ1aWxkaW5nQmxvY2tCYXNlIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrQmFzZVwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB0eXBlIHsgUHJpbWl0aXZlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBhc3NvY2lhdGlvbiwgZGVmaW5lUmVmZXJlbmNlLCBkZWZpbmVVSTVDbGFzcywgcHJvcGVydHksIHR5cGUgUHJvcGVydGllc09mIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gXCJzYXAvZmUvY29yZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB7IGhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgRmlsdGVyVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXJBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyQmFyL0ZpbHRlckJhckFQSVwiO1xuaW1wb3J0IHR5cGUgeyBCdXR0b24kUHJlc3NFdmVudCB9IGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IEZsZXhCb3ggZnJvbSBcInNhcC9tL0ZsZXhCb3hcIjtcbmltcG9ydCBJbnB1dCBmcm9tIFwic2FwL20vSW5wdXRcIjtcbmltcG9ydCB0eXBlIHsgSW5wdXRCYXNlJENoYW5nZUV2ZW50IH0gZnJvbSBcInNhcC9tL0lucHV0QmFzZVwiO1xuaW1wb3J0IExhYmVsIGZyb20gXCJzYXAvbS9MYWJlbFwiO1xuaW1wb3J0IE1lc3NhZ2VTdHJpcCBmcm9tIFwic2FwL20vTWVzc2FnZVN0cmlwXCI7XG5pbXBvcnQgVG9rZW4gZnJvbSBcInNhcC9tL1Rva2VuXCI7XG5pbXBvcnQgVG9rZW5pemVyIGZyb20gXCJzYXAvbS9Ub2tlbml6ZXJcIjtcbmltcG9ydCBWQm94IGZyb20gXCJzYXAvbS9WQm94XCI7XG5pbXBvcnQgeyBCdXR0b25UeXBlIH0gZnJvbSBcInNhcC9tL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgeyAkQ29udHJvbFNldHRpbmdzIH0gZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXIgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyQmFyXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IEZFU1JIZWxwZXIgZnJvbSBcInNhcC91aS9wZXJmb3JtYW5jZS90cmFjZS9GRVNSSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBFYXN5RmlsdGVyIGZyb20gXCJ1eC9lbmcvZmlvcmlhaS9yZXVzZS9lYXN5ZmlsdGVyL0Vhc3lGaWx0ZXJcIjtcbmltcG9ydCB0eXBlIHsgRWFzeUZpbHRlclByb3BlcnR5TWV0YWRhdGEgfSBmcm9tIFwidXgvZW5nL2Zpb3JpYWkvcmV1c2UvZWFzeWZpbHRlci9FYXN5RmlsdGVyXCI7XG5cbi8qKlxuICogRGVsaXZlcnkgZm9yIGJldGEgcmVsZWFzZSBmb3IgdGhlIGVhc3kgZmlsdGVyIGZlYXR1cmUuXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5tYWNyb3MuRWFzeUZpbHRlckJhclwiKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWFzeUZpbHRlckJhciBleHRlbmRzIEJ1aWxkaW5nQmxvY2tCYXNlIHtcblx0ZmVzclN0ZXBOYW1lID0gXCJmZTQ6YWk6c2VhcmNoXCI7XG5cblx0QGFzc29jaWF0aW9uKHsgdHlwZTogXCJzYXAuZmUubWFjcm9zLmZpbHRlckJhci5GaWx0ZXJCYXJBUElcIiB9KVxuXHRmaWx0ZXJCYXIhOiBzdHJpbmc7XG5cblx0QHByb3BlcnR5KHsgdHlwZTogXCJzdHJpbmdcIiB9KVxuXHRjb250ZXh0UGF0aD86IHN0cmluZztcblxuXHRAZGVmaW5lUmVmZXJlbmNlKClcblx0c2VhcmNoSW5wdXQhOiBSZWY8SW5wdXQ+O1xuXG5cdGVhc3lmaWx0ZXI6IFByb21pc2U8dHlwZW9mIEVhc3lGaWx0ZXI+IHwgdW5kZWZpbmVkO1xuXG5cdF9mZXRjaGVkQ29kZUxpc3QhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuXHRwcml2YXRlIGZpbHRlckJhck1ldGFkYXRhITogRWFzeUZpbHRlclByb3BlcnR5TWV0YWRhdGFbXTtcblxuXHRwcml2YXRlIHN0YXRlTW9kZWwhOiBKU09OTW9kZWw7XG5cblx0Y29uc3RydWN0b3IocHJvcGVydGllczogJENvbnRyb2xTZXR0aW5ncyAmIFByb3BlcnRpZXNPZjxFYXN5RmlsdGVyQmFyPiwgb3RoZXJzPzogJENvbnRyb2xTZXR0aW5ncykge1xuXHRcdHN1cGVyKHByb3BlcnRpZXMsIG90aGVycyk7XG5cdFx0dGhpcy5lYXN5ZmlsdGVyID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0Py5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpXG5cdFx0XHQucHJlcGFyZUZlYXR1cmUoXCJNYWdpY0ZpbHRlcmluZ1wiKVxuXHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4gaW1wb3J0KFwidXgvZW5nL2Zpb3JpYWkvcmV1c2UvZWFzeWZpbHRlci9FYXN5RmlsdGVyXCIpKTtcblx0fVxuXG5cdG9uTWV0YWRhdGFBdmFpbGFibGUoKTogdm9pZCB7XG5cdFx0dGhpcy5fZmV0Y2hlZENvZGVMaXN0ID8/PSB7fTtcblx0XHR0aGlzLnN0YXRlTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHsgc2hvd1Jlc3VsdDogZmFsc2UgfSk7XG5cdFx0dGhpcy5zZXRNb2RlbCh0aGlzLnN0YXRlTW9kZWwsIFwic3RhdGVcIik7XG5cdFx0dGhpcy5maWx0ZXJCYXJNZXRhZGF0YSA9IHRoaXMucHJlcGFyZUZpbHRlckJhck1ldGFkYXRhKCk7XG5cdFx0dGhpcy5jb250ZW50ID0gdGhpcy5jcmVhdGVDb250ZW50KCk7XG5cdH1cblxuXHRwcmVwYXJlRmlsdGVyQmFyTWV0YWRhdGEoKTogRWFzeUZpbHRlclByb3BlcnR5TWV0YWRhdGFbXSB7XG5cdFx0Y29uc3Qgb3duZXIgPSB0aGlzLl9nZXRPd25lcigpITtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBvd25lci5wcmVwcm9jZXNzb3JDb250ZXh0Py5tb2RlbHMubWV0YU1vZGVsIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGNvbnN0IGZpbHRlckJhciA9IFVJNUVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5maWx0ZXJCYXIpIGFzIEZpbHRlckJhcjtcblx0XHRjb25zdCBmaWVsZHMgPSBGaWx0ZXJVdGlscy5nZXRDb252ZXJ0ZWRGaWx0ZXJGaWVsZHMoZmlsdGVyQmFyLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbWV0YU1vZGVsKTtcblxuXHRcdHJldHVybiBmaWVsZHMubWFwKChmaWVsZCk6IEVhc3lGaWx0ZXJQcm9wZXJ0eU1ldGFkYXRhID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5T2JqZWN0ID0gdGhpcy5nZXREYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5PihmaWVsZC5hbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRsZXQgY29kZUxpc3Q7XG5cdFx0XHRpZiAocHJvcGVydHlPYmplY3Q/LnRhcmdldE9iamVjdCkge1xuXHRcdFx0XHRjb25zdCBoYXNDb2RlTGlzdCA9IGhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyhwcm9wZXJ0eU9iamVjdD8udGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0aWYgKGhhc0NvZGVMaXN0KSB7XG5cdFx0XHRcdFx0Y29kZUxpc3QgPSB0aGlzLl9mZXRjaGVkQ29kZUxpc3RbZmllbGQua2V5XTtcblx0XHRcdFx0XHRpZiAoIWNvZGVMaXN0KSB7XG5cdFx0XHRcdFx0XHRjb2RlTGlzdCA9IGFzeW5jICgpOiBQcm9taXNlPHVua25vd24+ID0+IHRoaXMuZ2V0Q29kZUxpc3RGb3JQcm9wZXJ0eShmaWVsZC5rZXksIGZpZWxkLmFubm90YXRpb25QYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG5hbWU6IGZpZWxkLmtleSxcblx0XHRcdFx0bGFiZWw6IGZpZWxkLmxhYmVsLFxuXHRcdFx0XHRkYXRhVHlwZTogcHJvcGVydHlPYmplY3Q/LnRhcmdldE9iamVjdD8udHlwZSxcblx0XHRcdFx0cmVxdWlyZWQ6ICEhZmllbGQucmVxdWlyZWQsXG5cdFx0XHRcdGZpbHRlcmFibGU6IHRydWUsXG5cdFx0XHRcdHNvcnRhYmxlOiAhZmllbGQuaXNQYXJhbWV0ZXIsXG5cdFx0XHRcdGNvZGVMaXN0OiBjb2RlTGlzdFxuXHRcdFx0fSBhcyBFYXN5RmlsdGVyUHJvcGVydHlNZXRhZGF0YTtcblx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIGdldENvZGVMaXN0Rm9yUHJvcGVydHkoa2V5OiBzdHJpbmcsIHByb3BlcnR5UGF0aDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0Ly8gRmV0Y2ggYW5kIGNhY2hlIHRoZSBjb2RlTGlzdCBmb3IgdmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzXG5cdFx0Y29uc3Qgb2RhdGFNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdGNvbnN0IHZhbHVlTGlzdCA9IGF3YWl0IG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkucmVxdWVzdFZhbHVlTGlzdEluZm8ocHJvcGVydHlQYXRoKTtcblx0XHRjb25zdCBkZWZhdWx0VmFsdWVMaXN0ID0gdmFsdWVMaXN0W1wiXCJdO1xuXHRcdGNvbnN0IHNlbGVjdCA9IGRlZmF1bHRWYWx1ZUxpc3QuUGFyYW1ldGVycy5tYXAoKHBhcmFtOiB7IFZhbHVlTGlzdFByb3BlcnR5OiBzdHJpbmcgfSkgPT4gcGFyYW0uVmFsdWVMaXN0UHJvcGVydHkpLmpvaW4oXCIsXCIpO1xuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gZGVmYXVsdFZhbHVlTGlzdC4kbW9kZWwuYmluZExpc3QoXCIvXCIgKyBkZWZhdWx0VmFsdWVMaXN0LkNvbGxlY3Rpb25QYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHQkc2VsZWN0OiBzZWxlY3Rcblx0XHR9KTtcblx0XHRjb25zdCBkYXRhID0gYXdhaXQgbGlzdEJpbmRpbmcucmVxdWVzdENvbnRleHRzKCk7XG5cdFx0bGV0IHZhbHVlUHJvcGVydHk6IHN0cmluZztcblx0XHRsZXQgZGVzY3JpcHRpb25Qcm9wZXJ0eTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIGRlZmF1bHRWYWx1ZUxpc3QuUGFyYW1ldGVycykge1xuXHRcdFx0aWYgKHBhcmFtZXRlci5Mb2NhbERhdGFQcm9wZXJ0eT8uJFByb3BlcnR5UGF0aCA9PT0ga2V5KSB7XG5cdFx0XHRcdHZhbHVlUHJvcGVydHkgPSBwYXJhbWV0ZXIuVmFsdWVMaXN0UHJvcGVydHk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZXNjcmlwdGlvblByb3BlcnR5ID0gcGFyYW1ldGVyLlZhbHVlTGlzdFByb3BlcnR5O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGZpbHRlckdyb3VwVmFsdWVzID0gW107XG5cdFx0Zm9yIChjb25zdCBkYXR1bSBvZiBkYXRhKSB7XG5cdFx0XHRjb25zdCBkYXRhb2JqID0gZGF0dW0uZ2V0T2JqZWN0KCk7XG5cdFx0XHRmaWx0ZXJHcm91cFZhbHVlcy5wdXNoKHtcblx0XHRcdFx0dmFsdWU6IGRhdGFvYmpbdmFsdWVQcm9wZXJ0eSFdLFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogZGVzY3JpcHRpb25Qcm9wZXJ0eSA/IGRhdGFvYmpbZGVzY3JpcHRpb25Qcm9wZXJ0eV0gOiB1bmRlZmluZWRcblx0XHRcdH0pO1xuXHRcdH1cblx0XHR0aGlzLl9mZXRjaGVkQ29kZUxpc3Rba2V5XSA9IGZpbHRlckdyb3VwVmFsdWVzO1xuXHRcdGNvbnN0IGNvZGVMaXN0UHJvcGVydHkgPSB0aGlzLmZpbHRlckJhck1ldGFkYXRhLmZpbmQoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09PSBrZXkpO1xuXHRcdGlmIChjb2RlTGlzdFByb3BlcnR5KSB7XG5cdFx0XHRjb2RlTGlzdFByb3BlcnR5LmNvZGVMaXN0ID0gZmlsdGVyR3JvdXBWYWx1ZXM7XG5cdFx0fVxuXHRcdHJldHVybiBmaWx0ZXJHcm91cFZhbHVlcztcblx0fVxuXG5cdGFzeW5jIG9uR29QcmVzcygpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBtYWdpY1F1ZXJ5ID0gdGhpcy5zZWFyY2hJbnB1dC5jdXJyZW50Py5nZXRWYWx1ZSgpO1xuXG5cdFx0dGhpcy5zZWFyY2hJbnB1dC5jdXJyZW50Py5zZXRWYWx1ZVN0YXRlVGV4dChcIlwiKTtcblx0XHR0aGlzLnNlYXJjaElucHV0LmN1cnJlbnQ/LnNldFZhbHVlU3RhdGUoXCJOb25lXCIpO1xuXHRcdGlmICghbWFnaWNRdWVyeSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB1aU1vZGVsID0gdGhpcy5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbDtcblx0XHRCdXN5TG9ja2VyLmxvY2sodWlNb2RlbCk7XG5cdFx0Y29uc3QgZmlsdGVyQmFyID0gVUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmZpbHRlckJhcikgYXMgRmlsdGVyQmFyO1xuXHRcdC8vIENhbGwgQUkgc2VydmljZSB0byBnZXQgdGhlIGZpbHRlciBjcml0ZXJpYVxuXHRcdGNvbnN0IGVhc3lmaWx0ZXIgPSBhd2FpdCB0aGlzLmVhc3lmaWx0ZXI7XG5cdFx0aWYgKCFlYXN5ZmlsdGVyKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgZWFzeUZpbHRlck1ldGFkYXRhID0ge1xuXHRcdFx0dmVyc2lvbjogXCIxLjBcIixcblx0XHRcdGVudGl0eVNldDogdGhpcy5jb250ZXh0UGF0aCA/PyB0aGlzLmdldE93bmVyQ29udGV4dFBhdGgoKSA/PyBcIlwiLFxuXHRcdFx0ZmllbGRzOiB0aGlzLmZpbHRlckJhck1ldGFkYXRhXG5cdFx0fTtcblxuXHRcdGNvbnN0IGVhc3lGaWx0ZXJSZXN1bHQgPSBhd2FpdCBlYXN5ZmlsdGVyLmVhc3lGaWx0ZXIobWFnaWNRdWVyeSwgZWFzeUZpbHRlck1ldGFkYXRhKTtcblx0XHRpZiAoIWVhc3lGaWx0ZXJSZXN1bHQuc3VjY2Vzcykge1xuXHRcdFx0dGhpcy5zZWFyY2hJbnB1dC5jdXJyZW50Py5zZXRWYWx1ZVN0YXRlKFwiV2FybmluZ1wiKTtcblx0XHRcdHRoaXMuc2VhcmNoSW5wdXQuY3VycmVudD8uc2V0VmFsdWVTdGF0ZVRleHQoZWFzeUZpbHRlclJlc3VsdC5tZXNzYWdlKTtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGdlbmVyYXRpbmcgZmlsdGVyIGNyaXRlcmlhOiBcIiwgZWFzeUZpbHRlclJlc3VsdC5tZXNzYWdlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZWFzeUZpbHRlclJlc3VsdC5kYXRhLnZlcnNpb24gPT09IDEpIHtcblx0XHRcdGlmIChlYXN5RmlsdGVyUmVzdWx0LmRhdGEudW5jbGVhcikge1xuXHRcdFx0XHR0aGlzLnNlYXJjaElucHV0LmN1cnJlbnQ/LnNldFZhbHVlU3RhdGUoXCJXYXJuaW5nXCIpO1xuXHRcdFx0XHR0aGlzLnNlYXJjaElucHV0LmN1cnJlbnQ/LnNldFZhbHVlU3RhdGVUZXh0KFwiVW5jbGVhciBpbnB1dDogXCIgKyBlYXN5RmlsdGVyUmVzdWx0LmRhdGEudW5jbGVhcik7IC8vIFRPRE86IERvZXMgdGhpcyBtYWtlIHNlbnNlP1xuXHRcdFx0fVxuXHRcdFx0aWYgKGVhc3lGaWx0ZXJSZXN1bHQuZGF0YS5maWx0ZXIpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyVmFsdWVzID0gZWFzeUZpbHRlclJlc3VsdC5kYXRhLmZpbHRlci5tYXAoKGZpbHRlclZhbHVlKSA9PiAoe1xuXHRcdFx0XHRcdHByb3BlcnR5UGF0aDogZmlsdGVyVmFsdWUubmFtZSxcblx0XHRcdFx0XHRvcGVyYXRvcjogZmlsdGVyVmFsdWUub3BlcmF0b3IgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRcdHZhbHVlczogZmlsdGVyVmFsdWUudmFsdWVzIGFzIFByaW1pdGl2ZVR5cGUgfCBQcmltaXRpdmVUeXBlW11cblx0XHRcdFx0fSkpO1xuXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gc2hvdyBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgdGhhdCB0aGUgZmlsdGVyIGNyaXRlcmlhIGhhcyBiZWVuIGdlbmVyYXRlZFxuXG5cdFx0XHRcdExvZy5kZWJ1ZyhcIkZpbHRlciBjcml0ZXJpYSBnZW5lcmF0ZWQ6IFwiLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJWYWx1ZXMsIG51bGwsIDIpKTtcblxuXHRcdFx0XHQvLyBWYWxpZGF0ZSBhbmQgYXBwbHkgdGhlIGZpbHRlciBjcml0ZXJpYVxuXHRcdFx0XHRjb25zdCBmaWx0ZXJCYXJBUEkgPSBmaWx0ZXJCYXIuZ2V0UGFyZW50KCkgYXMgRmlsdGVyQmFyQVBJO1xuXHRcdFx0XHRjb25zdCB0b2tlbnMgPSBbXTtcblx0XHRcdFx0Zm9yIChjb25zdCBmaWx0ZXJWYWx1ZSBvZiBmaWx0ZXJWYWx1ZXMpIHtcblx0XHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0XHRrZXk6IGZpbHRlclZhbHVlLnByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdHRleHQ6IGAke2ZpbHRlclZhbHVlLm9wZXJhdG9yfSAke2ZpbHRlclZhbHVlLnZhbHVlc31gXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXdhaXQgZmlsdGVyQmFyQVBJLl9jbGVhckZpbHRlclZhbHVlc1dpdGhPcHRpb25zKGZpbHRlckJhcik7XG5cdFx0XHRcdFx0YXdhaXQgZmlsdGVyQmFyQVBJLnNldEZpbHRlclZhbHVlcyhcblx0XHRcdFx0XHRcdGZpbHRlclZhbHVlLnByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdGZpbHRlclZhbHVlLm9wZXJhdG9yLFxuXHRcdFx0XHRcdFx0ZmlsdGVyVmFsdWUudmFsdWVzIGFzIHVua25vd24gYXMgc3RyaW5nW11cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGF3YWl0IGZpbHRlckJhckFQSS50cmlnZ2VyU2VhcmNoKCk7XG5cdFx0XHRcdHRoaXMuc3RhdGVNb2RlbC5zZXRQcm9wZXJ0eShcIi90b2tlbnNcIiwgdG9rZW5zKTtcblx0XHRcdFx0dGhpcy5zdGF0ZU1vZGVsLnNldFByb3BlcnR5KFwiL3Nob3dSZXN1bHRcIiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChlYXN5RmlsdGVyUmVzdWx0LmRhdGEudmVyc2lvbiA9PT0gMikge1xuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBzYXAudWkubW9kZWwuRmlsdGVyIGZyb20gdGhlIGZpbHRlciBhbmQgYXBwbHkgaXQgZGlyZWN0bHkgdG8gdGhlIGxpc3QgYmluZGluZ1xuXHRcdH1cblx0XHRCdXN5TG9ja2VyLnVubG9jayh1aU1vZGVsKTtcblx0fVxuXG5cdG9uVG9rZW5EZWxldGUoX2U6IFVJNUV2ZW50PHsgdG9rZW5zOiBUb2tlbltdIH0sIFRva2VuaXplcj4pOiB2b2lkIHtcblx0XHR0aGlzLnN0YXRlTW9kZWwuc2V0UHJvcGVydHkoXCIvc2hvd1Jlc3VsdFwiLCBmYWxzZSk7XG5cdH1cblxuXHRvblF1ZXJ5Q2hhbmdlZChfZTogSW5wdXRCYXNlJENoYW5nZUV2ZW50KTogdm9pZCB7XG5cdFx0Y29uc3QgZmlsdGVyQmFyID0gVUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmZpbHRlckJhcikgYXMgRmlsdGVyQmFyO1xuXHRcdGZpbHRlckJhci5maXJlRmlsdGVyc0NoYW5nZWQoeyBjb25kaXRpb25zQmFzZWQ6IHRydWUgfSk7XG5cdH1cblxuXHRjcmVhdGVDb250ZW50KCk6IFZCb3gge1xuXHRcdGNvbnN0IHZCb3ggPSAoXG5cdFx0XHQ8VkJveD5cblx0XHRcdFx0PE1lc3NhZ2VTdHJpcFxuXHRcdFx0XHRcdHRleHQ9XCJUaGUgUHJvbXB0LWJhc2VkIGZpbHRlcmluZyB3aWxsIGNyZWF0ZSBjb21wbGV0ZWx5IG5ldyBmaWx0ZXIgY3JpdGVyaWEuIEdlbmVyYXRlZCBjb250ZW50IG1heSBub3QgYWx3YXlzIGJlIGFjY3VyYXRlLiBDb25zaWRlciB2ZXJpZnlpbmcgaXQuIFwiXG5cdFx0XHRcdFx0c2hvd0ljb249e3RydWV9XG5cdFx0XHRcdFx0c2hvd0Nsb3NlQnV0dG9uPXt0cnVlfVxuXHRcdFx0XHRcdGNsYXNzPXtcInNhcFVpU21hbGxNYXJnaW5Cb3R0b21cIn1cblx0XHRcdFx0Lz5cblx0XHRcdFx0PEZsZXhCb3ggcmVuZGVyVHlwZT1cIkJhcmVcIj5cblx0XHRcdFx0XHQ8SW5wdXRcblx0XHRcdFx0XHRcdHJlZj17dGhpcy5zZWFyY2hJbnB1dH1cblx0XHRcdFx0XHRcdHdpZHRoPVwiMTAwJVwiXG5cdFx0XHRcdFx0XHRzaG93Q2xlYXJJY29uPXt0cnVlfVxuXHRcdFx0XHRcdFx0Y2hhbmdlPXsoZSk6IHZvaWQgPT4gdGhpcy5vblF1ZXJ5Q2hhbmdlZChlKX1cblx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBxdWVyeSBpbiBuYXR1cmFsIGxhbmd1YWdlIHRvIGZpbHRlciB0aGUgbGlzdFwiXG5cdFx0XHRcdFx0XHRjbGFzcz17XCJzYXBVaVNtYWxsTWFyZ2luRW5kXCJ9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHQ8QnV0dG9uXG5cdFx0XHRcdFx0XHRpY29uPXtcInNhcC1pY29uOi8vYWlcIn1cblx0XHRcdFx0XHRcdHRleHQ9e1wiR29cIn1cblx0XHRcdFx0XHRcdHR5cGU9e0J1dHRvblR5cGUuRW1waGFzaXplZH1cblx0XHRcdFx0XHRcdHByZXNzPXsoZXZlbnQ6IEJ1dHRvbiRQcmVzc0V2ZW50KTogdm9pZCA9PiB7XG5cdFx0XHRcdFx0XHRcdEZFU1JIZWxwZXIuc2V0U2VtYW50aWNTdGVwbmFtZShldmVudC5nZXRTb3VyY2UoKSwgXCJwcmVzc1wiLCB0aGlzLmZlc3JTdGVwTmFtZSk7XG5cdFx0XHRcdFx0XHRcdHRoaXMub25Hb1ByZXNzKCk7XG5cdFx0XHRcdFx0XHR9fVxuXHRcdFx0XHRcdC8+XG5cdFx0XHRcdDwvRmxleEJveD5cblx0XHRcdFx0PEZsZXhCb3ggcmVuZGVyVHlwZT1cIkJhcmVcIiB2aXNpYmxlPXtmYWxzZX0+XG5cdFx0XHRcdFx0PExhYmVsIHRleHQ9XCJTaG93aW5nIHJlc3VsdHMgZm9yOiBcIiBjbGFzcz17XCJzYXBVaVNtYWxsTWFyZ2luVG9wXCJ9IC8+XG5cdFx0XHRcdFx0PFRva2VuaXplclxuXHRcdFx0XHRcdFx0dG9rZW5zPXtcIntzdGF0ZT4vdG9rZW5zfVwifVxuXHRcdFx0XHRcdFx0dG9rZW5EZWxldGU9eyhlKTogdm9pZCA9PiB0aGlzLm9uVG9rZW5EZWxldGUoZSBhcyBVSTVFdmVudDx7IHRva2VuczogVG9rZW5bXSB9LCBUb2tlbml6ZXI+KX1cblx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHR7e1xuXHRcdFx0XHRcdFx0XHR0b2tlbnM6IChpZHg6IG51bWJlciwgY3R4OiBDb250ZXh0KTogVG9rZW4gPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9iamVjdCA9IGN0eC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gPFRva2VuIGtleT17b2JqZWN0LmtleX0gdGV4dD17b2JqZWN0LnRleHR9IC8+O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9fVxuXHRcdFx0XHRcdDwvVG9rZW5pemVyPlxuXHRcdFx0XHQ8L0ZsZXhCb3g+XG5cdFx0XHQ8L1ZCb3g+XG5cdFx0KTtcblx0XHR0aGlzLnNlYXJjaElucHV0LmN1cnJlbnQ/LmFkZEV2ZW50RGVsZWdhdGUoe1xuXHRcdFx0b25rZXl1cDogKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcblx0XHRcdFx0aWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHtcblx0XHRcdFx0XHR0aGlzLm9uR29QcmVzcygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0b25mb2N1c2luOiAoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLnNlYXJjaElucHV0LmN1cnJlbnQ/LmdldFZhbHVlU3RhdGUoKSA9PT0gXCJOb25lXCIgJiYgdGhpcy5maWx0ZXJCYXJNZXRhZGF0YS5maW5kKChmaWVsZCkgPT4gZmllbGQucmVxdWlyZWQpKSB7XG5cdFx0XHRcdFx0dGhpcy5zZWFyY2hJbnB1dC5jdXJyZW50Py5zZXRWYWx1ZVN0YXRlKFwiSW5mb3JtYXRpb25cIik7XG5cdFx0XHRcdFx0Y29uc3QgcmVxdWlyZWRGaWVsZHMgPSB0aGlzLmZpbHRlckJhck1ldGFkYXRhLmZpbHRlcigoZmllbGQpID0+IGZpZWxkLnJlcXVpcmVkKTtcblx0XHRcdFx0XHRjb25zdCByZXF1aXJlZEZpZWxkc1RleHQgPSByZXF1aXJlZEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5sYWJlbCkuam9pbihcIiwgXCIpO1xuXHRcdFx0XHRcdGlmIChyZXF1aXJlZEZpZWxkcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2VhcmNoSW5wdXQuY3VycmVudD8uc2V0VmFsdWVTdGF0ZVRleHQoYCR7cmVxdWlyZWRGaWVsZHNUZXh0fSBpcyBhIG1hbmRhdG9yeSBmaWx0ZXIuYCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXMuc2VhcmNoSW5wdXQuY3VycmVudD8uc2V0VmFsdWVTdGF0ZVRleHQoYCR7cmVxdWlyZWRGaWVsZHNUZXh0fSBhcmUgbWFuZGF0b3J5IGZpbHRlcnMuYCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHZCb3g7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFzQ3FCQSxhQUFhO0VBTGxDO0FBQ0E7QUFDQTtBQUNBO0VBSEEsT0FJQ0MsY0FBYyxDQUFDLDZCQUE2QixDQUFDLFVBSTVDQyxXQUFXLENBQUM7SUFBRUMsSUFBSSxFQUFFO0VBQXVDLENBQUMsQ0FBQyxVQUc3REMsUUFBUSxDQUFDO0lBQUVELElBQUksRUFBRTtFQUFTLENBQUMsQ0FBQyxVQUc1QkUsZUFBZSxFQUFFO0lBQUE7SUFXbEIsdUJB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
302
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFYXN5RmlsdGVyQmFyIiwiZGVmaW5lVUk1Q2xhc3MiLCJhc3NvY2lhdGlvbiIsInR5cGUiLCJwcm9wZXJ0eSIsImRlZmluZVJlZmVyZW5jZSIsInByb3BlcnRpZXMiLCJvdGhlcnMiLCJmZXNyU3RlcE5hbWUiLCJlYXN5ZmlsdGVyIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJwcmVwYXJlRmVhdHVyZSIsInRoZW4iLCJvbk1ldGFkYXRhQXZhaWxhYmxlIiwiX2ZldGNoZWRDb2RlTGlzdCIsInN0YXRlTW9kZWwiLCJKU09OTW9kZWwiLCJzaG93UmVzdWx0Iiwic2V0TW9kZWwiLCJmaWx0ZXJCYXJNZXRhZGF0YSIsInByZXBhcmVGaWx0ZXJCYXJNZXRhZGF0YSIsImNvbnRlbnQiLCJjcmVhdGVDb250ZW50Iiwib3duZXIiLCJfZ2V0T3duZXIiLCJtZXRhTW9kZWwiLCJwcmVwcm9jZXNzb3JDb250ZXh0IiwibW9kZWxzIiwiZmlsdGVyQmFyIiwiVUk1RWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiZmllbGRzIiwiRmlsdGVyVXRpbHMiLCJnZXRDb252ZXJ0ZWRGaWx0ZXJGaWVsZHMiLCJ1bmRlZmluZWQiLCJmaWx0ZXIiLCJmaWVsZCIsImF2YWlsYWJpbGl0eSIsIm1hcCIsInByb3BlcnR5T2JqZWN0IiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsImFubm90YXRpb25QYXRoIiwiY29kZUxpc3QiLCJ0YXJnZXRPYmplY3QiLCJoYXNDb2RlTGlzdCIsImhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyIsImtleSIsImdldENvZGVMaXN0Rm9yUHJvcGVydHkiLCJuYW1lIiwibGFiZWwiLCJkYXRhVHlwZSIsInJlcXVpcmVkIiwiZmlsdGVyYWJsZSIsInNvcnRhYmxlIiwiaXNQYXJhbWV0ZXIiLCJwcm9wZXJ0eVBhdGgiLCJvZGF0YU1vZGVsIiwiZ2V0TW9kZWwiLCJ2YWx1ZUxpc3QiLCJnZXRNZXRhTW9kZWwiLCJyZXF1ZXN0VmFsdWVMaXN0SW5mbyIsImRlZmF1bHRWYWx1ZUxpc3QiLCJzZWxlY3QiLCJQYXJhbWV0ZXJzIiwicGFyYW0iLCJWYWx1ZUxpc3RQcm9wZXJ0eSIsImpvaW4iLCJsaXN0QmluZGluZyIsIiRtb2RlbCIsImJpbmRMaXN0IiwiQ29sbGVjdGlvblBhdGgiLCIkc2VsZWN0IiwiZGF0YSIsInJlcXVlc3RDb250ZXh0cyIsInZhbHVlUHJvcGVydHkiLCJkZXNjcmlwdGlvblByb3BlcnR5IiwicGFyYW1ldGVyIiwiTG9jYWxEYXRhUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiZmlsdGVyR3JvdXBWYWx1ZXMiLCJkYXR1bSIsImRhdGFvYmoiLCJnZXRPYmplY3QiLCJwdXNoIiwidmFsdWUiLCJkZXNjcmlwdGlvbiIsImNvZGVMaXN0UHJvcGVydHkiLCJmaW5kIiwib25Hb1ByZXNzIiwibWFnaWNRdWVyeSIsInNlYXJjaElucHV0IiwiY3VycmVudCIsImdldFZhbHVlIiwic2V0VmFsdWVTdGF0ZVRleHQiLCJzZXRWYWx1ZVN0YXRlIiwiZmlsdGVyQmFyQVBJIiwiZ2V0UGFyZW50IiwiX2NsZWFyRmlsdGVyVmFsdWVzV2l0aE9wdGlvbnMiLCJ0cmlnZ2VyU2VhcmNoIiwidWlNb2RlbCIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZWFzeUZpbHRlck1ldGFkYXRhIiwidmVyc2lvbiIsImVudGl0eVNldCIsImNvbnRleHRQYXRoIiwiZ2V0T3duZXJDb250ZXh0UGF0aCIsImVhc3lGaWx0ZXJSZXN1bHQiLCJlYXN5RmlsdGVyIiwic3VjY2VzcyIsInVuY2xlYXIiLCJMb2ciLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0b2tlbnMiLCJmaWx0ZXJWYWx1ZSIsInRleHQiLCJvcGVyYXRvciIsInZhbHVlcyIsImFkZEZpbHRlclZhbHVlcyIsInNldFByb3BlcnR5IiwibWVzc2FnZSIsImVycm9yIiwidW5sb2NrIiwib25Ub2tlbkRlbGV0ZSIsIl9lIiwib25RdWVyeUNoYW5nZWQiLCJmaXJlRmlsdGVyc0NoYW5nZWQiLCJjb25kaXRpb25zQmFzZWQiLCJ2Qm94IiwiZSIsIkJ1dHRvblR5cGUiLCJFbXBoYXNpemVkIiwiZXZlbnQiLCJGRVNSSGVscGVyIiwic2V0U2VtYW50aWNTdGVwbmFtZSIsImdldFNvdXJjZSIsImlkeCIsImN0eCIsIm9iamVjdCIsImFkZEV2ZW50RGVsZWdhdGUiLCJvbmtleXVwIiwib25mb2N1c2luIiwiZ2V0VmFsdWVTdGF0ZSIsInJlcXVpcmVkRmllbGRzIiwicmVxdWlyZWRGaWVsZHNUZXh0IiwibGVuZ3RoIiwiQnVpbGRpbmdCbG9ja0Jhc2UiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkVhc3lGaWx0ZXJCYXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IEJ1aWxkaW5nQmxvY2tCYXNlIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrQmFzZVwiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IGFzc29jaWF0aW9uLCBkZWZpbmVSZWZlcmVuY2UsIGRlZmluZVVJNUNsYXNzLCBwcm9wZXJ0eSwgdHlwZSBQcm9wZXJ0aWVzT2YgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSBcInNhcC9mZS9jb3JlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHsgaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCBGaWx0ZXJVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhckFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXJCYXIvRmlsdGVyQmFyQVBJXCI7XG5pbXBvcnQgdHlwZSB7IEJ1dHRvbiRQcmVzc0V2ZW50IH0gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRmxleEJveCBmcm9tIFwic2FwL20vRmxleEJveFwiO1xuaW1wb3J0IElucHV0IGZyb20gXCJzYXAvbS9JbnB1dFwiO1xuaW1wb3J0IHR5cGUgeyBJbnB1dEJhc2UkQ2hhbmdlRXZlbnQgfSBmcm9tIFwic2FwL20vSW5wdXRCYXNlXCI7XG5pbXBvcnQgTGFiZWwgZnJvbSBcInNhcC9tL0xhYmVsXCI7XG5pbXBvcnQgTWVzc2FnZVN0cmlwIGZyb20gXCJzYXAvbS9NZXNzYWdlU3RyaXBcIjtcbmltcG9ydCBUb2tlbiBmcm9tIFwic2FwL20vVG9rZW5cIjtcbmltcG9ydCBUb2tlbml6ZXIgZnJvbSBcInNhcC9tL1Rva2VuaXplclwiO1xuaW1wb3J0IFZCb3ggZnJvbSBcInNhcC9tL1ZCb3hcIjtcbmltcG9ydCB7IEJ1dHRvblR5cGUgfSBmcm9tIFwic2FwL20vbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSB7ICRDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhciBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJCYXJcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgRkVTUkhlbHBlciBmcm9tIFwic2FwL3VpL3BlcmZvcm1hbmNlL3RyYWNlL0ZFU1JIZWxwZXJcIjtcbmltcG9ydCB0eXBlIEVhc3lGaWx0ZXIgZnJvbSBcInV4L2VuZy9maW9yaWFpL3JldXNlL2Vhc3lmaWx0ZXIvRWFzeUZpbHRlclwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eU1ldGFkYXRhIGFzIEVhc3lGaWx0ZXJQcm9wZXJ0eU1ldGFkYXRhIH0gZnJvbSBcInV4L2VuZy9maW9yaWFpL3JldXNlL2Vhc3lmaWx0ZXIvRWFzeUZpbHRlclwiO1xuXG4vKipcbiAqIERlbGl2ZXJ5IGZvciBiZXRhIHJlbGVhc2UgZm9yIHRoZSBlYXN5IGZpbHRlciBmZWF0dXJlLlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUubWFjcm9zLkVhc3lGaWx0ZXJCYXJcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVhc3lGaWx0ZXJCYXIgZXh0ZW5kcyBCdWlsZGluZ0Jsb2NrQmFzZSB7XG5cdGZlc3JTdGVwTmFtZSA9IFwiZmU0OmFpOnNlYXJjaFwiO1xuXG5cdEBhc3NvY2lhdGlvbih7IHR5cGU6IFwic2FwLmZlLm1hY3Jvcy5maWx0ZXJCYXIuRmlsdGVyQmFyQVBJXCIgfSlcblx0ZmlsdGVyQmFyITogc3RyaW5nO1xuXG5cdEBwcm9wZXJ0eSh7IHR5cGU6IFwic3RyaW5nXCIgfSlcblx0Y29udGV4dFBhdGg/OiBzdHJpbmc7XG5cblx0QGRlZmluZVJlZmVyZW5jZSgpXG5cdHNlYXJjaElucHV0ITogUmVmPElucHV0PjtcblxuXHRlYXN5ZmlsdGVyOiBQcm9taXNlPHR5cGVvZiBFYXN5RmlsdGVyPiB8IHVuZGVmaW5lZDtcblxuXHRfZmV0Y2hlZENvZGVMaXN0ITogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cblx0cHJpdmF0ZSBmaWx0ZXJCYXJNZXRhZGF0YSE6IEVhc3lGaWx0ZXJQcm9wZXJ0eU1ldGFkYXRhW107XG5cblx0cHJpdmF0ZSBzdGF0ZU1vZGVsITogSlNPTk1vZGVsO1xuXG5cdGNvbnN0cnVjdG9yKHByb3BlcnRpZXM6ICRDb250cm9sU2V0dGluZ3MgJiBQcm9wZXJ0aWVzT2Y8RWFzeUZpbHRlckJhcj4sIG90aGVycz86ICRDb250cm9sU2V0dGluZ3MpIHtcblx0XHRzdXBlcihwcm9wZXJ0aWVzLCBvdGhlcnMpO1xuXHRcdHRoaXMuZWFzeWZpbHRlciA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdD8uZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKVxuXHRcdFx0LnByZXBhcmVGZWF0dXJlKFwiTWFnaWNGaWx0ZXJpbmdcIilcblx0XHRcdC50aGVuKGFzeW5jICgpID0+IGltcG9ydChcInV4L2VuZy9maW9yaWFpL3JldXNlL2Vhc3lmaWx0ZXIvRWFzeUZpbHRlclwiKSk7XG5cdH1cblxuXHRvbk1ldGFkYXRhQXZhaWxhYmxlKCk6IHZvaWQge1xuXHRcdHRoaXMuX2ZldGNoZWRDb2RlTGlzdCA/Pz0ge307XG5cdFx0dGhpcy5zdGF0ZU1vZGVsID0gbmV3IEpTT05Nb2RlbCh7IHNob3dSZXN1bHQ6IGZhbHNlIH0pO1xuXHRcdHRoaXMuc2V0TW9kZWwodGhpcy5zdGF0ZU1vZGVsLCBcInN0YXRlXCIpO1xuXHRcdHRoaXMuZmlsdGVyQmFyTWV0YWRhdGEgPSB0aGlzLnByZXBhcmVGaWx0ZXJCYXJNZXRhZGF0YSgpO1xuXHRcdHRoaXMuY29udGVudCA9IHRoaXMuY3JlYXRlQ29udGVudCgpO1xuXHR9XG5cblx0cHJlcGFyZUZpbHRlckJhck1ldGFkYXRhKCk6IEVhc3lGaWx0ZXJQcm9wZXJ0eU1ldGFkYXRhW10ge1xuXHRcdGNvbnN0IG93bmVyID0gdGhpcy5fZ2V0T3duZXIoKSE7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gb3duZXIucHJlcHJvY2Vzc29yQ29udGV4dD8ubW9kZWxzLm1ldGFNb2RlbCBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCBmaWx0ZXJCYXIgPSBVSTVFbGVtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmlsdGVyQmFyKSBhcyBGaWx0ZXJCYXI7XG5cdFx0Y29uc3QgZmllbGRzID0gRmlsdGVyVXRpbHMuZ2V0Q29udmVydGVkRmlsdGVyRmllbGRzKGZpbHRlckJhciwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG1ldGFNb2RlbCk7XG5cblx0XHRyZXR1cm4gZmllbGRzXG5cdFx0XHQuZmlsdGVyKChmaWVsZCkgPT4gZmllbGQuYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKSAvLyBFeGNsdWRlIGhpZGRlbiBmaWx0ZXIgZmllbGRzLiBJdCBpcyBub3QgcG9zc2libGUgdG8gc2V0IGEgdmFsdWUgZm9yIGhpZGRlbiBmaWx0ZXJzLCBhbmQgdXNlcnMgd291bGQgbm90IHVuZGVyc3RhbmQgYW55d2F5IGFzIHRoZXkgY2Fubm90IHNlZSB0aGVzZSB2YWx1ZXMuXG5cdFx0XHQubWFwKChmaWVsZCk6IEVhc3lGaWx0ZXJQcm9wZXJ0eU1ldGFkYXRhID0+IHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlPYmplY3QgPSB0aGlzLmdldERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+KGZpZWxkLmFubm90YXRpb25QYXRoKTtcblx0XHRcdFx0bGV0IGNvZGVMaXN0O1xuXHRcdFx0XHRpZiAocHJvcGVydHlPYmplY3Q/LnRhcmdldE9iamVjdCkge1xuXHRcdFx0XHRcdGNvbnN0IGhhc0NvZGVMaXN0ID0gaGFzVmFsdWVIZWxwV2l0aEZpeGVkVmFsdWVzKHByb3BlcnR5T2JqZWN0Py50YXJnZXRPYmplY3QpO1xuXHRcdFx0XHRcdGlmIChoYXNDb2RlTGlzdCkge1xuXHRcdFx0XHRcdFx0Y29kZUxpc3QgPSB0aGlzLl9mZXRjaGVkQ29kZUxpc3RbZmllbGQua2V5XTtcblx0XHRcdFx0XHRcdGlmICghY29kZUxpc3QpIHtcblx0XHRcdFx0XHRcdFx0Y29kZUxpc3QgPSBhc3luYyAoKTogUHJvbWlzZTx1bmtub3duPiA9PiB0aGlzLmdldENvZGVMaXN0Rm9yUHJvcGVydHkoZmllbGQua2V5LCBmaWVsZC5hbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0bmFtZTogZmllbGQua2V5LFxuXHRcdFx0XHRcdGxhYmVsOiBmaWVsZC5sYWJlbCxcblx0XHRcdFx0XHRkYXRhVHlwZTogcHJvcGVydHlPYmplY3Q/LnRhcmdldE9iamVjdD8udHlwZSxcblx0XHRcdFx0XHRyZXF1aXJlZDogISFmaWVsZC5yZXF1aXJlZCxcblx0XHRcdFx0XHRmaWx0ZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiAhZmllbGQuaXNQYXJhbWV0ZXIsXG5cdFx0XHRcdFx0Y29kZUxpc3Q6IGNvZGVMaXN0XG5cdFx0XHRcdH0gYXMgRWFzeUZpbHRlclByb3BlcnR5TWV0YWRhdGE7XG5cdFx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIGdldENvZGVMaXN0Rm9yUHJvcGVydHkoa2V5OiBzdHJpbmcsIHByb3BlcnR5UGF0aDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0Ly8gRmV0Y2ggYW5kIGNhY2hlIHRoZSBjb2RlTGlzdCBmb3IgdmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzXG5cdFx0Y29uc3Qgb2RhdGFNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdGNvbnN0IHZhbHVlTGlzdCA9IGF3YWl0IG9kYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkucmVxdWVzdFZhbHVlTGlzdEluZm8ocHJvcGVydHlQYXRoKTtcblx0XHRjb25zdCBkZWZhdWx0VmFsdWVMaXN0ID0gdmFsdWVMaXN0W1wiXCJdO1xuXHRcdGNvbnN0IHNlbGVjdCA9IGRlZmF1bHRWYWx1ZUxpc3QuUGFyYW1ldGVycy5tYXAoKHBhcmFtOiB7IFZhbHVlTGlzdFByb3BlcnR5OiBzdHJpbmcgfSkgPT4gcGFyYW0uVmFsdWVMaXN0UHJvcGVydHkpLmpvaW4oXCIsXCIpO1xuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gZGVmYXVsdFZhbHVlTGlzdC4kbW9kZWwuYmluZExpc3QoXCIvXCIgKyBkZWZhdWx0VmFsdWVMaXN0LkNvbGxlY3Rpb25QYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7XG5cdFx0XHQkc2VsZWN0OiBzZWxlY3Rcblx0XHR9KTtcblx0XHRjb25zdCBkYXRhID0gYXdhaXQgbGlzdEJpbmRpbmcucmVxdWVzdENvbnRleHRzKCk7XG5cdFx0bGV0IHZhbHVlUHJvcGVydHk6IHN0cmluZztcblx0XHRsZXQgZGVzY3JpcHRpb25Qcm9wZXJ0eTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIGRlZmF1bHRWYWx1ZUxpc3QuUGFyYW1ldGVycykge1xuXHRcdFx0aWYgKHBhcmFtZXRlci5Mb2NhbERhdGFQcm9wZXJ0eT8uJFByb3BlcnR5UGF0aCA9PT0ga2V5KSB7XG5cdFx0XHRcdHZhbHVlUHJvcGVydHkgPSBwYXJhbWV0ZXIuVmFsdWVMaXN0UHJvcGVydHk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZXNjcmlwdGlvblByb3BlcnR5ID0gcGFyYW1ldGVyLlZhbHVlTGlzdFByb3BlcnR5O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGZpbHRlckdyb3VwVmFsdWVzID0gW107XG5cdFx0Zm9yIChjb25zdCBkYXR1bSBvZiBkYXRhKSB7XG5cdFx0XHRjb25zdCBkYXRhb2JqID0gZGF0dW0uZ2V0T2JqZWN0KCk7XG5cdFx0XHRmaWx0ZXJHcm91cFZhbHVlcy5wdXNoKHtcblx0XHRcdFx0dmFsdWU6IGRhdGFvYmpbdmFsdWVQcm9wZXJ0eSFdLFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogZGVzY3JpcHRpb25Qcm9wZXJ0eSA/IGRhdGFvYmpbZGVzY3JpcHRpb25Qcm9wZXJ0eV0gOiB1bmRlZmluZWRcblx0XHRcdH0pO1xuXHRcdH1cblx0XHR0aGlzLl9mZXRjaGVkQ29kZUxpc3Rba2V5XSA9IGZpbHRlckdyb3VwVmFsdWVzO1xuXHRcdGNvbnN0IGNvZGVMaXN0UHJvcGVydHkgPSB0aGlzLmZpbHRlckJhck1ldGFkYXRhLmZpbmQoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09PSBrZXkpO1xuXHRcdGlmIChjb2RlTGlzdFByb3BlcnR5KSB7XG5cdFx0XHRjb2RlTGlzdFByb3BlcnR5LmNvZGVMaXN0ID0gZmlsdGVyR3JvdXBWYWx1ZXM7XG5cdFx0fVxuXHRcdHJldHVybiBmaWx0ZXJHcm91cFZhbHVlcztcblx0fVxuXG5cdGFzeW5jIG9uR29QcmVzcygpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBtYWdpY1F1ZXJ5ID0gdGhpcy5zZWFyY2hJbnB1dC5jdXJyZW50Py5nZXRWYWx1ZSgpO1xuXG5cdFx0dGhpcy5zZWFyY2hJbnB1dC5jdXJyZW50Py5zZXRWYWx1ZVN0YXRlVGV4dChcIlwiKTtcblx0XHR0aGlzLnNlYXJjaElucHV0LmN1cnJlbnQ/LnNldFZhbHVlU3RhdGUoXCJOb25lXCIpO1xuXG5cdFx0Y29uc3QgZmlsdGVyQmFyID0gVUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmZpbHRlckJhcikgYXMgRmlsdGVyQmFyO1xuXHRcdGNvbnN0IGZpbHRlckJhckFQSSA9IGZpbHRlckJhci5nZXRQYXJlbnQoKSBhcyBGaWx0ZXJCYXJBUEk7XG5cblx0XHRpZiAoIW1hZ2ljUXVlcnkpIHtcblx0XHRcdC8vIEVtcHR5IGlucHV0OiBjbGVhciB0aGUgZmlsdGVycyBhbmQgcmVmcmVzaCB0aGUgbGlzdFxuXHRcdFx0YXdhaXQgZmlsdGVyQmFyQVBJLl9jbGVhckZpbHRlclZhbHVlc1dpdGhPcHRpb25zKGZpbHRlckJhcik7XG5cdFx0XHRhd2FpdCBmaWx0ZXJCYXJBUEkudHJpZ2dlclNlYXJjaCgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHVpTW9kZWwgPSB0aGlzLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh1aU1vZGVsKTtcblx0XHQvLyBDYWxsIEFJIHNlcnZpY2UgdG8gZ2V0IHRoZSBmaWx0ZXIgY3JpdGVyaWFcblx0XHRjb25zdCBlYXN5ZmlsdGVyID0gYXdhaXQgdGhpcy5lYXN5ZmlsdGVyO1xuXHRcdGlmICghZWFzeWZpbHRlcikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGVhc3lGaWx0ZXJNZXRhZGF0YSA9IHtcblx0XHRcdHZlcnNpb246IDEsXG5cdFx0XHRlbnRpdHlTZXQ6IHRoaXMuY29udGV4dFBhdGggPz8gdGhpcy5nZXRPd25lckNvbnRleHRQYXRoKCkgPz8gXCJcIixcblx0XHRcdGZpZWxkczogdGhpcy5maWx0ZXJCYXJNZXRhZGF0YVxuXHRcdH07XG5cblx0XHRjb25zdCBlYXN5RmlsdGVyUmVzdWx0ID0gYXdhaXQgZWFzeWZpbHRlci5lYXN5RmlsdGVyKG1hZ2ljUXVlcnksIGVhc3lGaWx0ZXJNZXRhZGF0YSk7XG5cblx0XHRpZiAoZWFzeUZpbHRlclJlc3VsdC5zdWNjZXNzKSB7XG5cdFx0XHRpZiAoZWFzeUZpbHRlclJlc3VsdC5kYXRhLnZlcnNpb24gPT09IDEpIHtcblx0XHRcdFx0aWYgKGVhc3lGaWx0ZXJSZXN1bHQuZGF0YS51bmNsZWFyKSB7XG5cdFx0XHRcdFx0dGhpcy5zZWFyY2hJbnB1dC5jdXJyZW50Py5zZXRWYWx1ZVN0YXRlKFwiV2FybmluZ1wiKTtcblx0XHRcdFx0XHR0aGlzLnNlYXJjaElucHV0LmN1cnJlbnQ/LnNldFZhbHVlU3RhdGVUZXh0KFwiVW5jbGVhciBpbnB1dDogXCIgKyBlYXN5RmlsdGVyUmVzdWx0LmRhdGEudW5jbGVhcik7IC8vIFRPRE86IERvZXMgdGhpcyBtYWtlIHNlbnNlP1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChlYXN5RmlsdGVyUmVzdWx0LmRhdGEuZmlsdGVyKSB7XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBzaG93IGEgbWVzc2FnZSB0byB0aGUgdXNlciB0aGF0IHRoZSBmaWx0ZXIgY3JpdGVyaWEgaGFzIGJlZW4gZ2VuZXJhdGVkXG5cdFx0XHRcdFx0TG9nLmRlYnVnKFwiRmlsdGVyIGNyaXRlcmlhIGdlbmVyYXRlZDogXCIsIEpTT04uc3RyaW5naWZ5KGVhc3lGaWx0ZXJSZXN1bHQuZGF0YS5maWx0ZXIsIG51bGwsIDIpKTtcblxuXHRcdFx0XHRcdC8vIFZhbGlkYXRlIGFuZCBhcHBseSB0aGUgZmlsdGVyIGNyaXRlcmlhXG5cdFx0XHRcdFx0YXdhaXQgZmlsdGVyQmFyQVBJLl9jbGVhckZpbHRlclZhbHVlc1dpdGhPcHRpb25zKGZpbHRlckJhcik7XG5cblx0XHRcdFx0XHRjb25zdCB0b2tlbnMgPSBbXTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGZpbHRlclZhbHVlIG9mIGVhc3lGaWx0ZXJSZXN1bHQuZGF0YS5maWx0ZXIpIHtcblx0XHRcdFx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0a2V5OiBmaWx0ZXJWYWx1ZS5uYW1lLFxuXHRcdFx0XHRcdFx0XHR0ZXh0OiBgJHtmaWx0ZXJWYWx1ZS5vcGVyYXRvcn0gJHtmaWx0ZXJWYWx1ZS52YWx1ZXN9YFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRhd2FpdCBGaWx0ZXJVdGlscy5hZGRGaWx0ZXJWYWx1ZXMoZmlsdGVyQmFyQVBJLmNvbnRlbnQsIGZpbHRlclZhbHVlLm5hbWUsIGZpbHRlclZhbHVlLm9wZXJhdG9yLCBmaWx0ZXJWYWx1ZS52YWx1ZXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCBmaWx0ZXJCYXJBUEkudHJpZ2dlclNlYXJjaCgpO1xuXHRcdFx0XHRcdHRoaXMuc3RhdGVNb2RlbC5zZXRQcm9wZXJ0eShcIi90b2tlbnNcIiwgdG9rZW5zKTtcblx0XHRcdFx0XHR0aGlzLnN0YXRlTW9kZWwuc2V0UHJvcGVydHkoXCIvc2hvd1Jlc3VsdFwiLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChlYXN5RmlsdGVyUmVzdWx0LmRhdGEudmVyc2lvbiA9PT0gMikge1xuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIHNhcC51aS5tb2RlbC5GaWx0ZXIgZnJvbSB0aGUgZmlsdGVyIGFuZCBhcHBseSBpdCBkaXJlY3RseSB0byB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGVycm9yXG5cdFx0XHR0aGlzLnNlYXJjaElucHV0LmN1cnJlbnQ/LnNldFZhbHVlU3RhdGUoXCJXYXJuaW5nXCIpO1xuXHRcdFx0dGhpcy5zZWFyY2hJbnB1dC5jdXJyZW50Py5zZXRWYWx1ZVN0YXRlVGV4dChlYXN5RmlsdGVyUmVzdWx0Lm1lc3NhZ2UpO1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZ2VuZXJhdGluZyBmaWx0ZXIgY3JpdGVyaWE6IFwiLCBlYXN5RmlsdGVyUmVzdWx0Lm1lc3NhZ2UpO1xuXHRcdH1cblxuXHRcdEJ1c3lMb2NrZXIudW5sb2NrKHVpTW9kZWwpO1xuXHR9XG5cblx0b25Ub2tlbkRlbGV0ZShfZTogVUk1RXZlbnQ8eyB0b2tlbnM6IFRva2VuW10gfSwgVG9rZW5pemVyPik6IHZvaWQge1xuXHRcdHRoaXMuc3RhdGVNb2RlbC5zZXRQcm9wZXJ0eShcIi9zaG93UmVzdWx0XCIsIGZhbHNlKTtcblx0fVxuXG5cdG9uUXVlcnlDaGFuZ2VkKF9lOiBJbnB1dEJhc2UkQ2hhbmdlRXZlbnQpOiB2b2lkIHtcblx0XHRjb25zdCBmaWx0ZXJCYXIgPSBVSTVFbGVtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmlsdGVyQmFyKSBhcyBGaWx0ZXJCYXI7XG5cdFx0ZmlsdGVyQmFyLmZpcmVGaWx0ZXJzQ2hhbmdlZCh7IGNvbmRpdGlvbnNCYXNlZDogdHJ1ZSB9KTtcblx0fVxuXG5cdGNyZWF0ZUNvbnRlbnQoKTogVkJveCB7XG5cdFx0Y29uc3QgdkJveCA9IChcblx0XHRcdDxWQm94PlxuXHRcdFx0XHQ8TWVzc2FnZVN0cmlwXG5cdFx0XHRcdFx0dGV4dD1cIlByb21wdC1iYXNlZCBmaWx0ZXJpbmcgY3JlYXRlcyBjb21wbGV0ZWx5IG5ldyBmaWx0ZXIgY3JpdGVyaWEuIEdlbmVyYXRlZCBjb250ZW50IG1heSBub3QgYWx3YXlzIGJlIGFjY3VyYXRlLiBDb25zaWRlciB2ZXJpZnlpbmcgaXQuXCJcblx0XHRcdFx0XHRzaG93SWNvbj17dHJ1ZX1cblx0XHRcdFx0XHRzaG93Q2xvc2VCdXR0b249e3RydWV9XG5cdFx0XHRcdFx0Y2xhc3M9e1wic2FwVWlTbWFsbE1hcmdpbkJvdHRvbVwifVxuXHRcdFx0XHQvPlxuXHRcdFx0XHQ8RmxleEJveCByZW5kZXJUeXBlPVwiQmFyZVwiPlxuXHRcdFx0XHRcdDxJbnB1dFxuXHRcdFx0XHRcdFx0cmVmPXt0aGlzLnNlYXJjaElucHV0fVxuXHRcdFx0XHRcdFx0d2lkdGg9XCIxMDAlXCJcblx0XHRcdFx0XHRcdHNob3dDbGVhckljb249e3RydWV9XG5cdFx0XHRcdFx0XHRjaGFuZ2U9eyhlKTogdm9pZCA9PiB0aGlzLm9uUXVlcnlDaGFuZ2VkKGUpfVxuXHRcdFx0XHRcdFx0cGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIHF1ZXJ5IGluIG5hdHVyYWwgbGFuZ3VhZ2UgdG8gZmlsdGVyIHRoZSBsaXN0XCJcblx0XHRcdFx0XHRcdGNsYXNzPXtcInNhcFVpU21hbGxNYXJnaW5FbmRcIn1cblx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDxCdXR0b25cblx0XHRcdFx0XHRcdGljb249e1wic2FwLWljb246Ly9haVwifVxuXHRcdFx0XHRcdFx0dGV4dD17XCJHb1wifVxuXHRcdFx0XHRcdFx0dHlwZT17QnV0dG9uVHlwZS5FbXBoYXNpemVkfVxuXHRcdFx0XHRcdFx0cHJlc3M9eyhldmVudDogQnV0dG9uJFByZXNzRXZlbnQpOiB2b2lkID0+IHtcblx0XHRcdFx0XHRcdFx0RkVTUkhlbHBlci5zZXRTZW1hbnRpY1N0ZXBuYW1lKGV2ZW50LmdldFNvdXJjZSgpLCBcInByZXNzXCIsIHRoaXMuZmVzclN0ZXBOYW1lKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5vbkdvUHJlc3MoKTtcblx0XHRcdFx0XHRcdH19XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9GbGV4Qm94PlxuXHRcdFx0XHQ8RmxleEJveCByZW5kZXJUeXBlPVwiQmFyZVwiIHZpc2libGU9e2ZhbHNlfT5cblx0XHRcdFx0XHQ8TGFiZWwgdGV4dD1cIlNob3dpbmcgcmVzdWx0cyBmb3I6IFwiIGNsYXNzPXtcInNhcFVpU21hbGxNYXJnaW5Ub3BcIn0gLz5cblx0XHRcdFx0XHQ8VG9rZW5pemVyXG5cdFx0XHRcdFx0XHR0b2tlbnM9e1wie3N0YXRlPi90b2tlbnN9XCJ9XG5cdFx0XHRcdFx0XHR0b2tlbkRlbGV0ZT17KGUpOiB2b2lkID0+IHRoaXMub25Ub2tlbkRlbGV0ZShlIGFzIFVJNUV2ZW50PHsgdG9rZW5zOiBUb2tlbltdIH0sIFRva2VuaXplcj4pfVxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdHt7XG5cdFx0XHRcdFx0XHRcdHRva2VuczogKGlkeDogbnVtYmVyLCBjdHg6IENvbnRleHQpOiBUb2tlbiA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb2JqZWN0ID0gY3R4LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiA8VG9rZW4ga2V5PXtvYmplY3Qua2V5fSB0ZXh0PXtvYmplY3QudGV4dH0gLz47XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH19XG5cdFx0XHRcdFx0PC9Ub2tlbml6ZXI+XG5cdFx0XHRcdDwvRmxleEJveD5cblx0XHRcdDwvVkJveD5cblx0XHQpO1xuXHRcdHRoaXMuc2VhcmNoSW5wdXQuY3VycmVudD8uYWRkRXZlbnREZWxlZ2F0ZSh7XG5cdFx0XHRvbmtleXVwOiAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuXHRcdFx0XHRpZiAoZS5rZXkgPT09IFwiRW50ZXJcIikge1xuXHRcdFx0XHRcdHRoaXMub25Hb1ByZXNzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRvbmZvY3VzaW46ICgpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuc2VhcmNoSW5wdXQuY3VycmVudD8uZ2V0VmFsdWVTdGF0ZSgpID09PSBcIk5vbmVcIiAmJiB0aGlzLmZpbHRlckJhck1ldGFkYXRhLmZpbmQoKGZpZWxkKSA9PiBmaWVsZC5yZXF1aXJlZCkpIHtcblx0XHRcdFx0XHR0aGlzLnNlYXJjaElucHV0LmN1cnJlbnQ/LnNldFZhbHVlU3RhdGUoXCJJbmZvcm1hdGlvblwiKTtcblx0XHRcdFx0XHRjb25zdCByZXF1aXJlZEZpZWxkcyA9IHRoaXMuZmlsdGVyQmFyTWV0YWRhdGEuZmlsdGVyKChmaWVsZCkgPT4gZmllbGQucmVxdWlyZWQpO1xuXHRcdFx0XHRcdGNvbnN0IHJlcXVpcmVkRmllbGRzVGV4dCA9IHJlcXVpcmVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLmxhYmVsKS5qb2luKFwiLCBcIik7XG5cdFx0XHRcdFx0aWYgKHJlcXVpcmVkRmllbGRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZWFyY2hJbnB1dC5jdXJyZW50Py5zZXRWYWx1ZVN0YXRlVGV4dChgJHtyZXF1aXJlZEZpZWxkc1RleHR9IGlzIGEgbWFuZGF0b3J5IGZpbHRlci5gKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5zZWFyY2hJbnB1dC5jdXJyZW50Py5zZXRWYWx1ZVN0YXRlVGV4dChgJHtyZXF1aXJlZEZpZWxkc1RleHR9IGFyZSBtYW5kYXRvcnkgZmlsdGVycy5gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gdkJveDtcblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQXFDcUJBLGFBQWE7RUFMbEM7QUFDQTtBQUNBO0FBQ0E7RUFIQSxPQUlDQyxjQUFjLENBQUMsNkJBQTZCLENBQUMsVUFJNUNDLFdB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
@@ -2,7 +2,6 @@ import type { Property } from "@sap-ux/vocabularies-types";
2
2
  import Log from "sap/base/Log";
3
3
  import BuildingBlockBase from "sap/fe/core/buildingBlocks/BuildingBlockBase";
4
4
  import BusyLocker from "sap/fe/core/controllerextensions/BusyLocker";
5
- import type { PrimitiveType } from "sap/fe/core/helpers/BindingToolkit";
6
5
  import { association, defineReference, defineUI5Class, property, type PropertiesOf } from "sap/fe/core/helpers/ClassSupport";
7
6
  import type { Ref } from "sap/fe/core/jsx-runtime/jsx";
8
7
  import { hasValueHelpWithFixedValues } from "sap/fe/core/templating/PropertyHelper";
@@ -29,7 +28,7 @@ import type ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
29
28
  import type ODataModel from "sap/ui/model/odata/v4/ODataModel";
30
29
  import FESRHelper from "sap/ui/performance/trace/FESRHelper";
31
30
  import type EasyFilter from "ux/eng/fioriai/reuse/easyfilter/EasyFilter";
32
- import type { EasyFilterPropertyMetadata } from "ux/eng/fioriai/reuse/easyfilter/EasyFilter";
31
+ import type { PropertyMetadata as EasyFilterPropertyMetadata } from "ux/eng/fioriai/reuse/easyfilter/EasyFilter";
33
32
 
34
33
  /**
35
34
  * Delivery for beta release for the easy filter feature.
@@ -78,28 +77,30 @@ export default class EasyFilterBar extends BuildingBlockBase {
78
77
  const filterBar = UI5Element.getElementById(this.filterBar) as FilterBar;
79
78
  const fields = FilterUtils.getConvertedFilterFields(filterBar, undefined, undefined, metaModel);
80
79
 
81
- return fields.map((field): EasyFilterPropertyMetadata => {
82
- const propertyObject = this.getDataModelObjectPath<Property>(field.annotationPath);
83
- let codeList;
84
- if (propertyObject?.targetObject) {
85
- const hasCodeList = hasValueHelpWithFixedValues(propertyObject?.targetObject);
86
- if (hasCodeList) {
87
- codeList = this._fetchedCodeList[field.key];
88
- if (!codeList) {
89
- codeList = async (): Promise<unknown> => this.getCodeListForProperty(field.key, field.annotationPath);
80
+ return fields
81
+ .filter((field) => field.availability !== "Hidden") // Exclude hidden filter fields. It is not possible to set a value for hidden filters, and users would not understand anyway as they cannot see these values.
82
+ .map((field): EasyFilterPropertyMetadata => {
83
+ const propertyObject = this.getDataModelObjectPath<Property>(field.annotationPath);
84
+ let codeList;
85
+ if (propertyObject?.targetObject) {
86
+ const hasCodeList = hasValueHelpWithFixedValues(propertyObject?.targetObject);
87
+ if (hasCodeList) {
88
+ codeList = this._fetchedCodeList[field.key];
89
+ if (!codeList) {
90
+ codeList = async (): Promise<unknown> => this.getCodeListForProperty(field.key, field.annotationPath);
91
+ }
90
92
  }
91
93
  }
92
- }
93
- return {
94
- name: field.key,
95
- label: field.label,
96
- dataType: propertyObject?.targetObject?.type,
97
- required: !!field.required,
98
- filterable: true,
99
- sortable: !field.isParameter,
100
- codeList: codeList
101
- } as EasyFilterPropertyMetadata;
102
- });
94
+ return {
95
+ name: field.key,
96
+ label: field.label,
97
+ dataType: propertyObject?.targetObject?.type,
98
+ required: !!field.required,
99
+ filterable: true,
100
+ sortable: !field.isParameter,
101
+ codeList: codeList
102
+ } as EasyFilterPropertyMetadata;
103
+ });
103
104
  }
104
105
 
105
106
  async getCodeListForProperty(key: string, propertyPath: string): Promise<unknown> {
@@ -143,12 +144,19 @@ export default class EasyFilterBar extends BuildingBlockBase {
143
144
 
144
145
  this.searchInput.current?.setValueStateText("");
145
146
  this.searchInput.current?.setValueState("None");
147
+
148
+ const filterBar = UI5Element.getElementById(this.filterBar) as FilterBar;
149
+ const filterBarAPI = filterBar.getParent() as FilterBarAPI;
150
+
146
151
  if (!magicQuery) {
152
+ // Empty input: clear the filters and refresh the list
153
+ await filterBarAPI._clearFilterValuesWithOptions(filterBar);
154
+ await filterBarAPI.triggerSearch();
147
155
  return;
148
156
  }
157
+
149
158
  const uiModel = this.getModel("ui") as JSONModel;
150
159
  BusyLocker.lock(uiModel);
151
- const filterBar = UI5Element.getElementById(this.filterBar) as FilterBar;
152
160
  // Call AI service to get the filter criteria
153
161
  const easyfilter = await this.easyfilter;
154
162
  if (!easyfilter) {
@@ -156,57 +164,48 @@ export default class EasyFilterBar extends BuildingBlockBase {
156
164
  }
157
165
 
158
166
  const easyFilterMetadata = {
159
- version: "1.0",
167
+ version: 1,
160
168
  entitySet: this.contextPath ?? this.getOwnerContextPath() ?? "",
161
169
  fields: this.filterBarMetadata
162
170
  };
163
171
 
164
172
  const easyFilterResult = await easyfilter.easyFilter(magicQuery, easyFilterMetadata);
165
- if (!easyFilterResult.success) {
166
- this.searchInput.current?.setValueState("Warning");
167
- this.searchInput.current?.setValueStateText(easyFilterResult.message);
168
- Log.error("Error while generating filter criteria: ", easyFilterResult.message);
169
- return;
170
- }
171
-
172
- if (easyFilterResult.data.version === 1) {
173
- if (easyFilterResult.data.unclear) {
174
- this.searchInput.current?.setValueState("Warning");
175
- this.searchInput.current?.setValueStateText("Unclear input: " + easyFilterResult.data.unclear); // TODO: Does this make sense?
176
- }
177
- if (easyFilterResult.data.filter) {
178
- const filterValues = easyFilterResult.data.filter.map((filterValue) => ({
179
- propertyPath: filterValue.name,
180
- operator: filterValue.operator as string | undefined,
181
- values: filterValue.values as PrimitiveType | PrimitiveType[]
182
- }));
183
173
 
184
- // We need to show a message to the user that the filter criteria has been generated
185
-
186
- Log.debug("Filter criteria generated: ", JSON.stringify(filterValues, null, 2));
174
+ if (easyFilterResult.success) {
175
+ if (easyFilterResult.data.version === 1) {
176
+ if (easyFilterResult.data.unclear) {
177
+ this.searchInput.current?.setValueState("Warning");
178
+ this.searchInput.current?.setValueStateText("Unclear input: " + easyFilterResult.data.unclear); // TODO: Does this make sense?
179
+ }
180
+ if (easyFilterResult.data.filter) {
181
+ // We need to show a message to the user that the filter criteria has been generated
182
+ Log.debug("Filter criteria generated: ", JSON.stringify(easyFilterResult.data.filter, null, 2));
187
183
 
188
- // Validate and apply the filter criteria
189
- const filterBarAPI = filterBar.getParent() as FilterBarAPI;
190
- const tokens = [];
191
- for (const filterValue of filterValues) {
192
- tokens.push({
193
- key: filterValue.propertyPath,
194
- text: `${filterValue.operator} ${filterValue.values}`
195
- });
184
+ // Validate and apply the filter criteria
196
185
  await filterBarAPI._clearFilterValuesWithOptions(filterBar);
197
- await filterBarAPI.setFilterValues(
198
- filterValue.propertyPath,
199
- filterValue.operator,
200
- filterValue.values as unknown as string[]
201
- );
186
+
187
+ const tokens = [];
188
+ for (const filterValue of easyFilterResult.data.filter) {
189
+ tokens.push({
190
+ key: filterValue.name,
191
+ text: `${filterValue.operator} ${filterValue.values}`
192
+ });
193
+ await FilterUtils.addFilterValues(filterBarAPI.content, filterValue.name, filterValue.operator, filterValue.values);
194
+ }
195
+ await filterBarAPI.triggerSearch();
196
+ this.stateModel.setProperty("/tokens", tokens);
197
+ this.stateModel.setProperty("/showResult", true);
202
198
  }
203
- await filterBarAPI.triggerSearch();
204
- this.stateModel.setProperty("/tokens", tokens);
205
- this.stateModel.setProperty("/showResult", true);
199
+ } else if (easyFilterResult.data.version === 2) {
200
+ // Create the sap.ui.model.Filter from the filter and apply it directly to the list binding
206
201
  }
207
- } else if (easyFilterResult.data.version === 2) {
208
- // Create the sap.ui.model.Filter from the filter and apply it directly to the list binding
202
+ } else {
203
+ // error
204
+ this.searchInput.current?.setValueState("Warning");
205
+ this.searchInput.current?.setValueStateText(easyFilterResult.message);
206
+ Log.error("Error while generating filter criteria: ", easyFilterResult.message);
209
207
  }
208
+
210
209
  BusyLocker.unlock(uiModel);
211
210
  }
212
211
 
@@ -223,7 +222,7 @@ export default class EasyFilterBar extends BuildingBlockBase {
223
222
  const vBox = (
224
223
  <VBox>
225
224
  <MessageStrip
226
- text="The Prompt-based filtering will create completely new filter criteria. Generated content may not always be accurate. Consider verifying it. "
225
+ text="Prompt-based filtering creates completely new filter criteria. Generated content may not always be accurate. Consider verifying it."
227
226
  showIcon={true}
228
227
  showCloseButton={true}
229
228
  class={"sapUiSmallMarginBottom"}