@sapui5/sap.fe.macros 1.139.0 → 1.140.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.
Files changed (152) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/Field.js +65 -55
  4. package/src/sap/fe/macros/Field.ts +83 -57
  5. package/src/sap/fe/macros/FooterContent.js +5 -2
  6. package/src/sap/fe/macros/FooterContent.tsx +4 -1
  7. package/src/sap/fe/macros/MessageButton.js +1 -2
  8. package/src/sap/fe/macros/MessageButton.tsx +0 -1
  9. package/src/sap/fe/macros/MultiValueField.js +1 -3
  10. package/src/sap/fe/macros/MultiValueField.tsx +0 -2
  11. package/src/sap/fe/macros/Share.js +14 -2
  12. package/src/sap/fe/macros/Share.tsx +13 -0
  13. package/src/sap/fe/macros/Status.js +226 -0
  14. package/src/sap/fe/macros/Status.tsx +192 -0
  15. package/src/sap/fe/macros/ValueHelp.js +4 -28
  16. package/src/sap/fe/macros/ValueHelp.tsx +2 -42
  17. package/src/sap/fe/macros/ai/EasyFilterBar.js +105 -96
  18. package/src/sap/fe/macros/ai/EasyFilterBar.tsx +122 -103
  19. package/src/sap/fe/macros/ai/SummarizationButton.js +2 -2
  20. package/src/sap/fe/macros/ai/SummarizationButton.tsx +1 -1
  21. package/src/sap/fe/macros/chart/ChartHelper.js +1 -2
  22. package/src/sap/fe/macros/chart/ChartHelper.ts +0 -1
  23. package/src/sap/fe/macros/chart/ChartRuntime.js +1 -2
  24. package/src/sap/fe/macros/chart/ChartRuntime.ts +0 -1
  25. package/src/sap/fe/macros/chart/MdcChartTemplate.js +2 -4
  26. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +1 -4
  27. package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.js +3 -1
  28. package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.ts +2 -0
  29. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.js +2 -2
  30. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.tsx +2 -2
  31. package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +43 -4
  32. package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +48 -1
  33. package/src/sap/fe/macros/designtime/Designtime.helper.js +28 -1
  34. package/src/sap/fe/macros/designtime/Designtime.helper.ts +27 -0
  35. package/src/sap/fe/macros/field/FieldBaseDelegate.js +13 -7
  36. package/src/sap/fe/macros/field/FieldBaseDelegate.ts +12 -8
  37. package/src/sap/fe/macros/field/FieldRuntime.js +1 -2
  38. package/src/sap/fe/macros/field/FieldRuntime.ts +0 -1
  39. package/src/sap/fe/macros/filter/FilterUtils.js +3 -5
  40. package/src/sap/fe/macros/filter/FilterUtils.ts +2 -4
  41. package/src/sap/fe/macros/form/Form.js +1 -4
  42. package/src/sap/fe/macros/form/Form.tsx +0 -3
  43. package/src/sap/fe/macros/form/FormContainer.block.js +1 -2
  44. package/src/sap/fe/macros/form/FormContainer.block.ts +0 -1
  45. package/src/sap/fe/macros/form/FormDelegate.js +20 -1
  46. package/src/sap/fe/macros/form/FormDelegate.ts +25 -0
  47. package/src/sap/fe/macros/form/FormHelper.js +1 -2
  48. package/src/sap/fe/macros/form/FormHelper.ts +0 -1
  49. package/src/sap/fe/macros/fpm/CustomFragment.block.js +1 -2
  50. package/src/sap/fe/macros/fpm/CustomFragment.block.ts +0 -1
  51. package/src/sap/fe/macros/internal/ActionCommand.block.js +1 -2
  52. package/src/sap/fe/macros/internal/ActionCommand.block.ts +0 -1
  53. package/src/sap/fe/macros/internal/FilterField.block.js +7 -1
  54. package/src/sap/fe/macros/internal/FilterField.block.ts +8 -0
  55. package/src/sap/fe/macros/internal/field/DisplayStyle.js +3 -3
  56. package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +2 -2
  57. package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +1 -1
  58. package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +1 -0
  59. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.js +46 -8
  60. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.ts +60 -6
  61. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.js +38 -2
  62. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.ts +37 -2
  63. package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +1 -1
  64. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +10 -3
  65. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +13 -2
  66. package/src/sap/fe/macros/library.js +1 -1
  67. package/src/sap/fe/macros/messagebundle.properties +5 -3
  68. package/src/sap/fe/macros/messagebundle_ar.properties +7 -1
  69. package/src/sap/fe/macros/messagebundle_bg.properties +7 -1
  70. package/src/sap/fe/macros/messagebundle_ca.properties +10 -4
  71. package/src/sap/fe/macros/messagebundle_cnr.properties +7 -1
  72. package/src/sap/fe/macros/messagebundle_cs.properties +6 -0
  73. package/src/sap/fe/macros/messagebundle_cy.properties +8 -2
  74. package/src/sap/fe/macros/messagebundle_da.properties +7 -1
  75. package/src/sap/fe/macros/messagebundle_de.properties +13 -7
  76. package/src/sap/fe/macros/messagebundle_el.properties +6 -0
  77. package/src/sap/fe/macros/messagebundle_en.properties +10 -4
  78. package/src/sap/fe/macros/messagebundle_en_GB.properties +8 -2
  79. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +10 -4
  80. package/src/sap/fe/macros/messagebundle_es.properties +8 -2
  81. package/src/sap/fe/macros/messagebundle_es_MX.properties +10 -4
  82. package/src/sap/fe/macros/messagebundle_et.properties +8 -2
  83. package/src/sap/fe/macros/messagebundle_fi.properties +6 -0
  84. package/src/sap/fe/macros/messagebundle_fr.properties +8 -2
  85. package/src/sap/fe/macros/messagebundle_fr_CA.properties +7 -1
  86. package/src/sap/fe/macros/messagebundle_hi.properties +7 -1
  87. package/src/sap/fe/macros/messagebundle_hr.properties +7 -1
  88. package/src/sap/fe/macros/messagebundle_hu.properties +6 -0
  89. package/src/sap/fe/macros/messagebundle_id.properties +10 -4
  90. package/src/sap/fe/macros/messagebundle_it.properties +6 -0
  91. package/src/sap/fe/macros/messagebundle_iw.properties +7 -1
  92. package/src/sap/fe/macros/messagebundle_ja.properties +8 -2
  93. package/src/sap/fe/macros/messagebundle_kk.properties +10 -4
  94. package/src/sap/fe/macros/messagebundle_ko.properties +6 -0
  95. package/src/sap/fe/macros/messagebundle_lt.properties +7 -1
  96. package/src/sap/fe/macros/messagebundle_lv.properties +7 -1
  97. package/src/sap/fe/macros/messagebundle_mk.properties +7 -1
  98. package/src/sap/fe/macros/messagebundle_ms.properties +6 -0
  99. package/src/sap/fe/macros/messagebundle_nl.properties +6 -0
  100. package/src/sap/fe/macros/messagebundle_no.properties +6 -0
  101. package/src/sap/fe/macros/messagebundle_pl.properties +7 -1
  102. package/src/sap/fe/macros/messagebundle_pt.properties +6 -0
  103. package/src/sap/fe/macros/messagebundle_pt_PT.properties +6 -0
  104. package/src/sap/fe/macros/messagebundle_ro.properties +7 -1
  105. package/src/sap/fe/macros/messagebundle_ru.properties +9 -3
  106. package/src/sap/fe/macros/messagebundle_sh.properties +7 -1
  107. package/src/sap/fe/macros/messagebundle_sk.properties +6 -0
  108. package/src/sap/fe/macros/messagebundle_sl.properties +6 -0
  109. package/src/sap/fe/macros/messagebundle_sr.properties +7 -1
  110. package/src/sap/fe/macros/messagebundle_sv.properties +6 -0
  111. package/src/sap/fe/macros/messagebundle_th.properties +7 -1
  112. package/src/sap/fe/macros/messagebundle_tr.properties +6 -0
  113. package/src/sap/fe/macros/messagebundle_uk.properties +9 -3
  114. package/src/sap/fe/macros/messagebundle_vi.properties +8 -2
  115. package/src/sap/fe/macros/messagebundle_zh_CN.properties +6 -0
  116. package/src/sap/fe/macros/messagebundle_zh_TW.properties +7 -1
  117. package/src/sap/fe/macros/messages/MessageButton.js +39 -18
  118. package/src/sap/fe/macros/messages/MessageButton.ts +40 -17
  119. package/src/sap/fe/macros/messages/MessagePopover.js +2 -2
  120. package/src/sap/fe/macros/messages/MessagePopover.ts +4 -4
  121. package/src/sap/fe/macros/microchart/MicroChartContainer.js +1 -2
  122. package/src/sap/fe/macros/microchart/MicroChartContainer.ts +1 -2
  123. package/src/sap/fe/macros/microchart/MicroChartHelper.js +1 -2
  124. package/src/sap/fe/macros/microchart/MicroChartHelper.tsx +0 -1
  125. package/src/sap/fe/macros/share/ShareAPI.js +4 -29
  126. package/src/sap/fe/macros/share/ShareAPI.ts +1 -32
  127. package/src/sap/fe/macros/situations/SituationsPopover.js +3 -1
  128. package/src/sap/fe/macros/situations/SituationsPopover.ts +2 -0
  129. package/src/sap/fe/macros/table/MdcTableTemplate.js +3 -1
  130. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +6 -2
  131. package/src/sap/fe/macros/table/TableHelper.js +1 -2
  132. package/src/sap/fe/macros/table/TableHelper.ts +0 -1
  133. package/src/sap/fe/macros/table/TableRuntime.js +24 -5
  134. package/src/sap/fe/macros/table/TableRuntime.ts +31 -3
  135. package/src/sap/fe/macros/table/Utils.js +6 -2
  136. package/src/sap/fe/macros/table/Utils.ts +5 -1
  137. package/src/sap/fe/macros/table/delegates/ALPTableDelegate.js +1 -2
  138. package/src/sap/fe/macros/table/delegates/ALPTableDelegate.ts +0 -1
  139. package/src/sap/fe/macros/table/delegates/TableDelegate.js +1 -2
  140. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +0 -1
  141. package/src/sap/fe/macros/table/delegates/TreeTableDelegate.js +1 -2
  142. package/src/sap/fe/macros/table/delegates/TreeTableDelegate.ts +0 -1
  143. package/src/sap/fe/macros/table/mixin/TableHierarchy.js +5 -1
  144. package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +7 -0
  145. package/src/sap/fe/macros/table/mixin/TableSharing.js +3 -2
  146. package/src/sap/fe/macros/table/mixin/TableSharing.ts +9 -1
  147. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +10 -1
  148. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +17 -0
  149. package/src/sap/fe/macros/visualfilters/VisualFilter.js +1 -2
  150. package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +0 -1
  151. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +2 -3
  152. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.ts +1 -2
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2025 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/StandardRecommendationHelper", "sap/ui/core/Lib", "sap/ui/model/Filter", "sap/ui/model/FilterType", "sap/ui/model/Sorter", "sap/ui/model/json/JSONModel"], function (Log, StandardRecommendationHelper, Library, Filter, FilterType, Sorter, JSONModel) {
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/StandardRecommendationHelper", "sap/ui/core/Lib", "sap/ui/model/Filter", "sap/ui/model/FilterType", "sap/ui/model/Sorter", "sap/ui/model/json/JSONModel"], function (Log, MetaModelConverter, ModelHelper, StandardRecommendationHelper, Library, Filter, FilterType, Sorter, JSONModel) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -22,7 +22,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/StandardRecommendationHelper
22
22
  * @param valueHelpBindingInfo The binding info object to be used to bind the list to the model
23
23
  * @param payload Payload of the value help
24
24
  * @param sorters Sorters of the value help list binding
25
- * @param field Field for which the value help is requested
25
+ * @param table Table for which the value help is requested
26
26
  * @returns Additional value contexts
27
27
  */
28
28
  requestForAdditionalValueContextData: async function (additionalValues, valueHelpListBinding, valueHelpBindingInfo, payload, sorters, table) {
@@ -93,7 +93,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/StandardRecommendationHelper
93
93
  */
94
94
  getAdditionalValueContextBindings: function (reverseRecommendationValues, searchTerm, payload, valueHelpListModel, valueHelpBindingInfo, sorter) {
95
95
  const additionalValueContextBindings = [];
96
- const valueHelpFilters = [...this.getValueHelpBindingFilters(valueHelpBindingInfo)];
96
+ const valueHelpFilters = [...this.getValueHelpBindingFilters(valueHelpBindingInfo, payload, valueHelpListModel.getMetaModel())];
97
97
  const recommendationValueFilters = this.getAdditionalValueFilters(reverseRecommendationValues, [...valueHelpFilters]);
98
98
  if (reverseRecommendationValues.length > 0) {
99
99
  // binding represent recommendation list binding.
@@ -108,19 +108,57 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/StandardRecommendationHelper
108
108
  /**
109
109
  * This function is responsible to fetch the valuehelp binding filters.
110
110
  * @param valueHelpBindingInfo The binding info object to be used to bind the list to the model
111
+ * @param payload Payload of the value help to check if it's a dropdown scenario
112
+ * @param metaModel The OData meta model to resolve entity set from path
111
113
  * @returns Filters of valuehelp binding
112
114
  */
113
- getValueHelpBindingFilters: function (valueHelpBindingInfo) {
115
+ getValueHelpBindingFilters: function (valueHelpBindingInfo, payload, metaModel) {
116
+ const filters = [];
114
117
  // get all existing filters from the binding info
115
118
  // this + additional value filters will be used later on to fetch additional values from the backend
116
119
  if (valueHelpBindingInfo.filters) {
117
120
  if (Array.isArray(valueHelpBindingInfo.filters)) {
118
- return valueHelpBindingInfo.filters;
121
+ filters.push(...valueHelpBindingInfo.filters);
119
122
  } else {
120
- return [valueHelpBindingInfo.filters];
123
+ filters.push(valueHelpBindingInfo.filters);
124
+ }
125
+ }
126
+ // Add draft filter for OData draft-enabled entities
127
+ // Check if the entity is draft-enabled and apply IsActiveEntity = true filter
128
+ this.addDraftFilter(valueHelpBindingInfo, filters, payload, metaModel);
129
+ return filters;
130
+ },
131
+ /**
132
+ * This function adds a draft filter for OData draft-enabled entities.
133
+ * @param valueHelpBindingInfo The binding info object to be used to bind the list to the model
134
+ * @param filters The existing filters array to add the draft filter to
135
+ * @param payload Payload of the value help to check if it's a dropdown scenario
136
+ * @param metaModel The OData meta model to resolve entity set from path
137
+ */
138
+ addDraftFilter: function (valueHelpBindingInfo, filters, payload, metaModel) {
139
+ if (valueHelpBindingInfo.path && metaModel) {
140
+ // Get the EntitySet from the path using MetaModel
141
+ const metaContext = metaModel.getMetaContext(valueHelpBindingInfo.path);
142
+ const objectPath = MetaModelConverter.getInvolvedDataModelObjects(metaContext);
143
+
144
+ // Check if the entity is draft-enabled using ModelHelper
145
+ // This covers DraftRoot, DraftNode, and containment scenarios
146
+ const isDraftSupported = ModelHelper.isObjectPathDraftSupported(objectPath);
147
+
148
+ // Check if it's a dropdown scenario (ValueListWithFixedValues)
149
+ const isValueListWithFixedValues = payload?.isValueListWithFixedValues ?? false;
150
+
151
+ // Only add draft filter if entity is draft-enabled and it's a dropdown scenario
152
+ if (isDraftSupported && isValueListWithFixedValues) {
153
+ // Add IsActiveEntity filter for draft-enabled entities
154
+ // This filter ensures only active (non-draft) entities are shown in value help dropdowns
155
+ filters.push(new Filter({
156
+ path: "IsActiveEntity",
157
+ operator: "EQ",
158
+ value1: true
159
+ }));
121
160
  }
122
161
  }
123
- return [];
124
162
  },
125
163
  /**
126
164
  * This function resumes the suspended list binding and then resets changes on it.
@@ -495,4 +533,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/StandardRecommendationHelper
495
533
  _exports.additionalValueHelper = additionalValueHelper;
496
534
  return _exports;
497
535
  }, false);
498
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBZGRpdGlvbmFsVmFsdWVHcm91cEtleSIsIl9leHBvcnRzIiwiYWRkaXRpb25hbFZhbHVlSGVscGVyIiwicmVxdWVzdEZvckFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIiwiYWRkaXRpb25hbFZhbHVlcyIsInZhbHVlSGVscExpc3RCaW5kaW5nIiwidmFsdWVIZWxwQmluZGluZ0luZm8iLCJwYXlsb2FkIiwic29ydGVycyIsInRhYmxlIiwiYWxsTGlzdEJpbmRpbmciLCJhZGRpdGlvbmFsVmFsdWVDb250ZXh0UHJvbWlzZSIsInJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcyIsImZpbHRlciIsInZhbHVlIiwiZ3JvdXBLZXkiLCJyZWNvbW1lbmRhdGlvbiIsInJldmVyc2UiLCJwYXJhbWV0ZXJzIiwiJHNlbGVjdCIsInF1YWxpZmllcnMiLCJ2YWx1ZUhlbHBRdWFsaWZpZXIiLCJ2aFByb3BlcnRpZXMiLCJzZWFyY2hUZXJtIiwiJHNlYXJjaCIsImlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzIiwiJGNvdW50IiwibGlzdFNvcnRlcnMiLCJmb3JFYWNoIiwic29ydGVyIiwicHVzaCIsIlNvcnRlciIsIm5hbWUiLCJkZXNjZW5kaW5nIiwidmFsdWVIZWxwTGlzdE1vZGVsIiwiZ2V0TW9kZWwiLCJhZGRpdGlvbmFsVmFsdWVMaXN0QmluZGluZ3MiLCJnZXRBZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3MiLCJsZW5ndGgiLCJyZXF1ZXN0Q29udGV4dHMiLCJzdWJtaXRCYXRjaCIsImFkZGl0aW9uYWxWYWx1ZXNDb250ZXh0IiwiUHJvbWlzZSIsImFsbCIsImNvdW50IiwiZ2V0Q291bnQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNldFByb3BlcnR5IiwicmVjb21tZW5kYXRpb25Db250ZXh0cyIsImFsbENvbnRleHRzIiwicmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSIsIm1hcCIsImNvbnRleHQiLCJnZXRPYmplY3QiLCJvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSIsImFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5ncyIsInZhbHVlSGVscEZpbHRlcnMiLCJnZXRWYWx1ZUhlbHBCaW5kaW5nRmlsdGVycyIsInJlY29tbWVuZGF0aW9uVmFsdWVGaWx0ZXJzIiwiZ2V0QWRkaXRpb25hbFZhbHVlRmlsdGVycyIsImJpbmRMaXN0IiwicGF0aCIsInVuZGVmaW5lZCIsImZpbHRlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJyZXN1bWVWYWx1ZUxpc3RCaW5kaW5nQW5kUmVzZXRDaGFuZ2VzIiwiaXNTdXNwZW5kZWQiLCJyZXN1bWVBc3luYyIsInJlc2V0Q2hhbmdlcyIsImVycm9yIiwic29ydEFuZEZpbHRlckxpc3RCaW5kaW5nIiwiRmlsdGVyIiwiTk9ORSIsIkZpbHRlclR5cGUiLCJBcHBsaWNhdGlvbiIsIm1vZGlmaWVkU29ydGVycyIsImdldFNvcnRlckZ1bmN0aW9uIiwic29ydCIsInJldmVyc2VBZGRpdGlvbmFsVmFsdWVzIiwiYWRkaXRpb25hbFZhbHVlIiwidmFsdWVzIiwicHJvcGVydHlQYXRoIiwidmFsdWUxIiwib3BlcmF0b3IiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFByb3BlcnR5IiwiZ2V0VGV4dCIsInJlY2VudFZhbHVlIiwiY3JlYXRlVHJhbnNpZW50Q29udGV4dHNGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsInJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwiY3JlYXRlR3JvdXBlZFRyYW5zaWVudENvbnRleHRzIiwib3RoZXIiLCJhZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsImNvbnRleHREYXRhIiwiY3JlYXRlIiwiY3JlYXRlZCIsImNhbmNlbGVkIiwiTG9nIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMiLCJkYXRhIiwiYmluZGluZ0NvbnRleHQiLCJiaW5kaW5nUGF0aCIsInJlbGV2YW50UmVjb21tZW5kYXRpb25zIiwiT2JqZWN0Iiwia2V5cyIsImdldFJlY29tbWVuZGF0aW9uUHJvcGVydHlQYXRoIiwidmVyc2lvbiIsImdldEFkZGl0aW9uYWxWYWx1ZUZyb21Qcm9wZXJ0eVBhdGgiLCJ2YWx1ZURhdGEiLCJfY2hlY2tGb3JLZXlzSW5SZWNvbW1lbmRhdGlvbnMiLCJrZXlQcm9wZXJ0aWVzIiwia2V5IiwiZ2V0QWRkaXRpb25hbFZhbHVlRnJvbUtleXMiLCJyZWNvbW1lbmRhdGlvbkRhdGEiLCJyZXN1bHQiLCJyZWNEYXRhIiwiYWxsS2V5c01hdGNoIiwiX2dldFJlY29tbWVuZGF0aW9uIiwib2xkRGF0YSIsImFzc2lnbiIsImluY2x1ZGVzIiwicHJvcGVydHlQYXRocyIsInNwbGl0IiwibmF2UHJvcFBhdGgiLCJzcGxpY2UiLCJqb2luIiwic3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlciIsImdldFN0YW5kYXJkUmVjb21tZW5kYXRpb25zIiwiZ2V0UmVsZXZhbnRPdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSIsInZhbHVlSGVscEtleXMiLCJjaGVja1ZhbHVlc01hdGNoIiwiZ2V0UmVsZXZhbnRSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSIsImJpbmRpbmdJbmZvIiwicmVjZW50VmFsdWVzTW9kZWwiLCJKU09OTW9kZWwiLCJyZWNlbnRWYWx1ZXNMaXN0IiwiZ2V0QWxsQ3VycmVudENvbnRleHRzIiwicmVjZW50VmFsdWVDb250ZXh0RGF0YSIsImZpbHRlclJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwiY29udGV4dERhdGFUb0JlTWF0Y2hlZCIsImNvbnRleHREYXRhTGlzdCIsIm9iaiIsIm1hdGNoIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhIiwicmVjb21tZW5kYXRpb25WYWx1ZXMiLCJhcmd1bWVudHMiLCJ2YWx1ZUxpc3RQcm9wZXJ0eSIsInJlbGV2YW50UmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSIsImZvdW5kT2JqZWN0IiwiZmluZCIsInVwZGF0ZUZpbmlzaGVkIiwiZXZlbnQiLCJzb3VyY2UiLCJnZXRTb3VyY2UiLCJ0YWJsZUJpbmRpbmdDb250ZXh0IiwiYWN0dWFsIiwidG90YWwiLCJyZWFzb24iLCJnZXRQYXJhbWV0ZXJzIiwicGFnaW5hdGlvbkRhdGEiLCJhZGRpdGlvbmFsRGF0YSIsImdldEJpbmRpbmciXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkFkZGl0aW9uYWxWYWx1ZUhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHtcblx0SW5Db21wbGV0ZW5lc3NJbmZvVHlwZSxcblx0SW50ZXJuYWxQcm9wZXJ0eUFkZGl0aW9uYWxWYWx1ZSxcblx0S2V5UHJvcGVydGllc0RhdGFUeXBlLFxuXHRSZWNvbW1lbmRhdGlvbkRhdGFGb3JOYXZQcm9wZXJ0eVR5cGUsXG5cdFJlY29tbWVuZGF0aW9uVmFsdWVUeXBlXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1JlY29tbWVuZGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IFJlY29tbWVuZGF0aW9uSW5mbywgU3RhbmRhcmRSZWNvbW1lbmRhdGlvbkRhdGFUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlclwiO1xuaW1wb3J0IHsgc3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgRmllbGREYXRhVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9WYWx1ZUhlbHBIaXN0b3J5U2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIHsgU29ydGVyVHlwZSwgVmFsdWVIZWxwUGF5bG9hZCB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL3ZhbHVlaGVscC9WYWx1ZUxpc3RIZWxwZXJcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvbS9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBFdmVudFByb3ZpZGVyIGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFByb3ZpZGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIE1UYWJsZSBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvY29udGVudC9NVGFibGVcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgRmlsdGVyVHlwZSBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclR5cGVcIjtcbmltcG9ydCBTb3J0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9Tb3J0ZXJcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgVjRDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0RXJyb3JUeXBlIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcblxuZW51bSBBZGRpdGlvbmFsVmFsdWVHcm91cEtleSB7XG5cdHJlY29tbWVuZGF0aW9uID0gXCJyZWNvbW1lbmRhdGlvblwiLFxuXHRyZWNlbnRWYWx1ZSA9IFwicmVjZW50VmFsdWVcIixcblx0b3RoZXIgPSBcIm90aGVyXCJcbn1cbmV4cG9ydCB0eXBlIEFkZGl0aW9uYWxWYWx1ZVR5cGUgPSB7XG5cdHByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHR2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKVtdO1xuXHRncm91cEtleTogQWRkaXRpb25hbFZhbHVlR3JvdXBLZXk7IC8vIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZ3JvdXBcbn07XG5leHBvcnQgdHlwZSBCaW5kaW5nSW5mb1BhcmFtZXRlcnMgPSB7XG5cdCRzZWxlY3Q6IHN0cmluZ1tdO1xuXHQkZXhwYW5kPzogc3RyaW5nW107XG5cdCRzZWFyY2g6IHN0cmluZztcblx0JGNvdW50OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQWRkaXRpb25WYWx1ZURlZmluaXRpb24gPVxuXHR8IEluQ29tcGxldGVuZXNzSW5mb1R5cGVcblx0fCBSZWNvbW1lbmRhdGlvbkRhdGFGb3JOYXZQcm9wZXJ0eVR5cGVbXVxuXHR8IEludGVybmFsUHJvcGVydHlBZGRpdGlvbmFsVmFsdWVcblx0fCBvYmplY3Q7XG5jb25zdCBhZGRpdGlvbmFsVmFsdWVIZWxwZXIgPSB7XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSBjb250ZXh0IGJhc2VkIG9uIGFkZGl0aW9uYWwgdmFsdWUgZmlsdGVycyBhbmQgY3VzdG9tIHNvcnRlciBhbmQgcmVxdWVzdCBjb250ZXh0cyBmcm9tIGl0LlxuXHQgKiBAcGFyYW0gYWRkaXRpb25hbFZhbHVlcyBBcnJheSBvZiBhZGRpdGlvbmFsIHZhbHVlc1xuXHQgKiBAcGFyYW0gdmFsdWVIZWxwTGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBCaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgb2YgdGhlIHZhbHVlIGhlbHBcblx0ICogQHBhcmFtIHNvcnRlcnMgU29ydGVycyBvZiB0aGUgdmFsdWUgaGVscCBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGZpZWxkXHRGaWVsZCBmb3Igd2hpY2ggdGhlIHZhbHVlIGhlbHAgaXMgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIEFkZGl0aW9uYWwgdmFsdWUgY29udGV4dHNcblx0ICovXG5cdHJlcXVlc3RGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YTogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGFkZGl0aW9uYWxWYWx1ZXM6IEFkZGl0aW9uYWxWYWx1ZVR5cGVbXSxcblx0XHR2YWx1ZUhlbHBMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHR2YWx1ZUhlbHBCaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0cGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCxcblx0XHRzb3J0ZXJzOiBTb3J0ZXJUeXBlW10sXG5cdFx0dGFibGU6IFRhYmxlXG5cdCk6IFByb21pc2U8e1xuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXTtcblx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdO1xuXHR9PiB7XG5cdFx0bGV0IGFsbExpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZUNvbnRleHRQcm9taXNlOiBQcm9taXNlPFY0Q29udGV4dFtdPltdID0gW107XG5cdFx0Ly8gcmV2ZXJzZSB0aGUgYXJyYXkgc28gdGhhdCB3aGlsZSBjcmVhdGluZyB0cmFuc2llbnQgY29udGV4dCBmaXJzdCBhZGRpdGlvbmFsIHZhbHVlIGlzIGdyb3VwZWQgZmlyc3Rcblx0XHRjb25zdCByZXZlcnNlUmVjb21tZW5kYXRpb25WYWx1ZXMgPSBbXG5cdFx0XHQuLi5hZGRpdGlvbmFsVmFsdWVzLmZpbHRlcigodmFsdWUpID0+IHZhbHVlLmdyb3VwS2V5ID09PSBBZGRpdGlvbmFsVmFsdWVHcm91cEtleS5yZWNvbW1lbmRhdGlvbilcblx0XHRdLnJldmVyc2UoKTtcblxuXHRcdC8vIGxvZ2ljIHRvIGFkZCAkc2VsZWN0IGZvciBtdWx0aS1sZXZlbCBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgZmlsbGluZyAkc2VsZWN0IGlzIHN1ZmZpY2llbnQgZm9yIHRoZSBtb2RlbCB0byBjcmVhdGUgdGhlIGV4cGFuZCBjYWxsc1xuXHRcdCh2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXJhbWV0ZXJzIGFzIEJpbmRpbmdJbmZvUGFyYW1ldGVycykuJHNlbGVjdCA9XG5cdFx0XHRwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdLnZoUHJvcGVydGllcyA/PyBbXTtcblxuXHRcdC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBpbnB1dCBpbiB0aGUgZmllbGRcblx0XHQvLyBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRvIHNob3cgdGhlIFwib3RoZXJzXCIgc2VjdGlvbiBvciBub3Rcblx0XHQvLyBhbmQgYWxzbyB0byBkZXRlcm1pbmUgaWYgdHlwZUFoZWFkIHNob3VsZCBvcGVuIG9yIG5vdFxuXHRcdGNvbnN0IHNlYXJjaFRlcm0gPSAodmFsdWVIZWxwQmluZGluZ0luZm8ucGFyYW1ldGVycyBhcyBCaW5kaW5nSW5mb1BhcmFtZXRlcnMpLiRzZWFyY2g7XG5cdFx0KHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgYXMgQmluZGluZ0luZm9QYXJhbWV0ZXJzKS4kc2VhcmNoID0gc2VhcmNoVGVybTtcblx0XHRpZiAocGF5bG9hZC5pc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcykge1xuXHRcdFx0KHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgYXMgQmluZGluZ0luZm9QYXJhbWV0ZXJzKS4kY291bnQgPSB0cnVlO1xuXHRcdH1cblx0XHRjb25zdCBsaXN0U29ydGVyczogU29ydGVyW10gPSBbXTtcblx0XHRzb3J0ZXJzLmZvckVhY2goKHNvcnRlcjogU29ydGVyVHlwZSkgPT4gbGlzdFNvcnRlcnMucHVzaChuZXcgU29ydGVyKHNvcnRlci5uYW1lID8/IFwiXCIsIHNvcnRlci5kZXNjZW5kaW5nKSkpO1xuXHRcdGNvbnN0IHZhbHVlSGVscExpc3RNb2RlbDogT0RhdGFNb2RlbCA9IHZhbHVlSGVscExpc3RCaW5kaW5nLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHQvLyBnZXQgdGhlIGxpc3QgYmluZGluZyBmb3IgcmVjb21tZW5kYXRpb24gdmFsdWVzIGFuZCBvdGhlcnMgdmFsdWVzXG5cdFx0Y29uc3QgYWRkaXRpb25hbFZhbHVlTGlzdEJpbmRpbmdzOiBPRGF0YUxpc3RCaW5kaW5nW10gPSB0aGlzLmdldEFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5ncyhcblx0XHRcdHJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcyxcblx0XHRcdHNlYXJjaFRlcm0sXG5cdFx0XHRwYXlsb2FkLFxuXHRcdFx0dmFsdWVIZWxwTGlzdE1vZGVsLFxuXHRcdFx0dmFsdWVIZWxwQmluZGluZ0luZm8sXG5cdFx0XHRsaXN0U29ydGVyc1xuXHRcdCk7XG5cdFx0aWYgKGFkZGl0aW9uYWxWYWx1ZUxpc3RCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAoYWRkaXRpb25hbFZhbHVlTGlzdEJpbmRpbmdzLmxlbmd0aCA9PT0gMikge1xuXHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVDb250ZXh0UHJvbWlzZS5wdXNoKGFkZGl0aW9uYWxWYWx1ZUxpc3RCaW5kaW5nc1swXS5yZXF1ZXN0Q29udGV4dHMoMCwgMTAsIFwiYWRkaXRpb25hbFZhbHVlXCIpKTtcblx0XHRcdFx0YWxsTGlzdEJpbmRpbmcgPSBhZGRpdGlvbmFsVmFsdWVMaXN0QmluZGluZ3NbMV07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhbGxMaXN0QmluZGluZyA9IGFkZGl0aW9uYWxWYWx1ZUxpc3RCaW5kaW5nc1swXTtcblx0XHRcdH1cblx0XHRcdC8vIGluIGNhc2Ugb2YgZHJvcGRvd24sIHdlIGZldGNoIGZpcnN0IDEwMCByZWNvcmRzIG9uIGZpcnN0IGxvYWQgYW5kIHRoZW4gbWFrZSBzdWJzZXF1ZW50IHJlcXVlc3RzIHVwb24gdXNlcidzIHNjcm9sbC5cblx0XHRcdGFkZGl0aW9uYWxWYWx1ZUNvbnRleHRQcm9taXNlLnB1c2goXG5cdFx0XHRcdGFsbExpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCBwYXlsb2FkLmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzID8gMTAwIDogMTAsIFwiYWRkaXRpb25hbFZhbHVlXCIpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRhd2FpdCB2YWx1ZUhlbHBMaXN0TW9kZWwuc3VibWl0QmF0Y2goXCJhZGRpdGlvbmFsVmFsdWVcIik7XG5cdFx0Y29uc3QgYWRkaXRpb25hbFZhbHVlc0NvbnRleHQgPSBhd2FpdCBQcm9taXNlLmFsbChhZGRpdGlvbmFsVmFsdWVDb250ZXh0UHJvbWlzZSk7XG5cdFx0Ly8gd2Ugc3RvcmUgdGhpcyBsaXN0IGJpbmRpbmdzIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gbWFrZSBzdWJzZXF1ZW50IHJlcXVlc3RzIG9uIHVzZXIncyBzY3JvbGxcblx0XHRjb25zdCBjb3VudCA9IGFsbExpc3RCaW5kaW5nPy5nZXRDb3VudCgpO1xuXHRcdGlmIChjb3VudCAmJiBjb3VudCA+IDEwMCkge1xuXHRcdFx0dGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uc2V0UHJvcGVydHkoXCJhbGxMaXN0QmluZGluZ1wiLCBhbGxMaXN0QmluZGluZyk7XG5cdFx0fVxuXHRcdGxldCByZWNvbW1lbmRhdGlvbkNvbnRleHRzOiBWNENvbnRleHRbXSA9IFtdLFxuXHRcdFx0YWxsQ29udGV4dHM6IFY0Q29udGV4dFtdID0gW107XG5cdFx0aWYgKHJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvbkNvbnRleHRzID0gYWRkaXRpb25hbFZhbHVlc0NvbnRleHRbMF07XG5cdFx0XHRpZiAoc2VhcmNoVGVybSB8fCBwYXlsb2FkLmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzKSB7XG5cdFx0XHRcdGFsbENvbnRleHRzID0gYWRkaXRpb25hbFZhbHVlc0NvbnRleHRbMV07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzZWFyY2hUZXJtIHx8IHBheWxvYWQuaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdGFsbENvbnRleHRzID0gYWRkaXRpb25hbFZhbHVlc0NvbnRleHRbMF07XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSA9IHJlY29tbWVuZGF0aW9uQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldE9iamVjdCgpIGFzIEZpZWxkRGF0YVR5cGUpO1xuXHRcdGNvbnN0IG90aGVyc1ZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10gPSBhbGxDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZ2V0T2JqZWN0KCkgYXMgRmllbGREYXRhVHlwZSk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhXG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZXRyaWV2ZSBhbGwgcmVsZXZhbnQgbGlzdCBiaW5kaW5ncyAocmVjb21tZW5kYXRpb24gYW5kIG90aGVycykgdGhhdCBpcyBuZWVkZWQgdG8gbWFrZSBhIGJhY2tlbmQgY2FsbC5cblx0ICogQHBhcmFtIHJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcyBSZXZlcnNlZCByZWNvbW1lbmRhdGlvbiB2YWx1ZXNcblx0ICogQHBhcmFtIHNlYXJjaFRlcm0gU2VhcmNoIHRlcm0gZW50ZXJlZCBieSB0aGUgdXNlclxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIG9mIHRoZSB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBMaXN0TW9kZWwgTW9kZWwgb2YgdGhlIHZhbHVlIGhlbHBcblx0ICogQHBhcmFtIHZhbHVlSGVscEJpbmRpbmdJbmZvIEJpbmRpbmcgaW5mbyBvZiB0aGUgdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gc29ydGVyIEN1c3RvbSBzb3J0ZXIgd2hpY2ggbmVlZHMgdG8gYmUgYXBwbGllZCB0byB0aGUgbGlzdCBiaW5kaW5nXG5cdCAqIEByZXR1cm5zIEFsbCB0aGUgbGlzdCBiaW5kaW5nIHdoaWNoIHdvdWxkIGJlIHVzZWQgdG8gdHJpZ2dlciBjYWxscyB0byB0aGUgYmFja2VuZC5cblx0ICovXG5cdGdldEFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5nczogZnVuY3Rpb24gKFxuXHRcdHJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlczogQWRkaXRpb25hbFZhbHVlVHlwZVtdLFxuXHRcdHNlYXJjaFRlcm06IHN0cmluZyxcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdHZhbHVlSGVscExpc3RNb2RlbDogT0RhdGFNb2RlbCxcblx0XHR2YWx1ZUhlbHBCaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0c29ydGVyOiBTb3J0ZXJbXVxuXHQpOiBPRGF0YUxpc3RCaW5kaW5nW10ge1xuXHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5nczogT0RhdGFMaXN0QmluZGluZ1tdID0gW107XG5cdFx0Y29uc3QgdmFsdWVIZWxwRmlsdGVyczogRmlsdGVyW10gPSBbLi4udGhpcy5nZXRWYWx1ZUhlbHBCaW5kaW5nRmlsdGVycyh2YWx1ZUhlbHBCaW5kaW5nSW5mbyldO1xuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uVmFsdWVGaWx0ZXJzID0gdGhpcy5nZXRBZGRpdGlvbmFsVmFsdWVGaWx0ZXJzKHJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcywgWy4uLnZhbHVlSGVscEZpbHRlcnNdKTtcblxuXHRcdGlmIChyZXZlcnNlUmVjb21tZW5kYXRpb25WYWx1ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly8gYmluZGluZyByZXByZXNlbnQgcmVjb21tZW5kYXRpb24gbGlzdCBiaW5kaW5nLlxuXHRcdFx0YWRkaXRpb25hbFZhbHVlQ29udGV4dEJpbmRpbmdzLnB1c2goXG5cdFx0XHRcdHZhbHVlSGVscExpc3RNb2RlbC5iaW5kTGlzdChcblx0XHRcdFx0XHR2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXRoLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZUZpbHRlcnMsXG5cdFx0XHRcdFx0dmFsdWVIZWxwQmluZGluZ0luZm8ucGFyYW1ldGVyc1xuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpZiAoc2VhcmNoVGVybSB8fCBwYXlsb2FkLmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzKSB7XG5cdFx0XHQvLyBiaW5kaW5nIHJlcHJlc2VudCBhbGwgZGF0YSBsaXN0IGJpbmRpbmdzLlxuXHRcdFx0YWRkaXRpb25hbFZhbHVlQ29udGV4dEJpbmRpbmdzLnB1c2goXG5cdFx0XHRcdHZhbHVlSGVscExpc3RNb2RlbC5iaW5kTGlzdCh2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXRoLCB1bmRlZmluZWQsIHNvcnRlciwgdmFsdWVIZWxwRmlsdGVycywgdmFsdWVIZWxwQmluZGluZ0luZm8ucGFyYW1ldGVycylcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5ncztcblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgdG8gZmV0Y2ggdGhlIHZhbHVlaGVscCBiaW5kaW5nIGZpbHRlcnMuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBCaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEByZXR1cm5zIEZpbHRlcnMgb2YgdmFsdWVoZWxwIGJpbmRpbmdcblx0ICovXG5cdGdldFZhbHVlSGVscEJpbmRpbmdGaWx0ZXJzOiBmdW5jdGlvbiAodmFsdWVIZWxwQmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvKTogRmlsdGVyW10ge1xuXHRcdC8vIGdldCBhbGwgZXhpc3RpbmcgZmlsdGVycyBmcm9tIHRoZSBiaW5kaW5nIGluZm9cblx0XHQvLyB0aGlzICsgYWRkaXRpb25hbCB2YWx1ZSBmaWx0ZXJzIHdpbGwgYmUgdXNlZCBsYXRlciBvbiB0byBmZXRjaCBhZGRpdGlvbmFsIHZhbHVlcyBmcm9tIHRoZSBiYWNrZW5kXG5cdFx0aWYgKHZhbHVlSGVscEJpbmRpbmdJbmZvLmZpbHRlcnMpIHtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlSGVscEJpbmRpbmdJbmZvLmZpbHRlcnMpKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZUhlbHBCaW5kaW5nSW5mby5maWx0ZXJzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIFt2YWx1ZUhlbHBCaW5kaW5nSW5mby5maWx0ZXJzXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXN1bWVzIHRoZSBzdXNwZW5kZWQgbGlzdCBiaW5kaW5nIGFuZCB0aGVuIHJlc2V0cyBjaGFuZ2VzIG9uIGl0LlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwTGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqL1xuXHRyZXN1bWVWYWx1ZUxpc3RCaW5kaW5nQW5kUmVzZXRDaGFuZ2VzOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodmFsdWVIZWxwTGlzdEJpbmRpbmcuaXNTdXNwZW5kZWQoKSkge1xuXHRcdFx0YXdhaXQgdmFsdWVIZWxwTGlzdEJpbmRpbmcucmVzdW1lQXN5bmMoKTtcblx0XHR9XG5cdFx0Ly8gZ2V0IHJpZCBvZiBleGlzdGluZyB0cmFuc2llbnQgY29udGV4dHMuXG5cblx0XHQvLyBkZXN0cm95aW5nIGNhdXNlcyBpc3N1ZXMgc29tZXRpbWVzLCBjb250ZXh0cyBhcmUgbm90IGFsd2F5cyBhdmFpbGFibGUgdG8gZGVzdHJveSBidXQgYXBwZWFyIGFmdGVyd2FyZHMgbWFnaWNhbGx5XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHZhbHVlSGVscExpc3RCaW5kaW5nLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvL1dlIGRvIG5vdCBkbyBhbnl0aGluZyBoZXJlIGFzIHdlIGtub3cgdGhlIG1vZGVsIHdpbGwgYWx3YXlzIHRocm93IGFuIGVycm9yIGFuZCB0aGlzIHdpbGwgZmlsbCB1cCB0aGUgY29uc29sZSB3aXRoIGVycm9ycy5cblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNvcnRpbmcgYW5kIGZpbHRlcmluZyB0aGUgbGlzdCBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwTGlzdEJpbmRpbmcgTGlzdCBCaW5kaW5nXG5cdCAqIEBwYXJhbSBzb3J0ZXJzIFNvcnRlcnMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nXG5cdCAqL1xuXHRzb3J0QW5kRmlsdGVyTGlzdEJpbmRpbmc6IGZ1bmN0aW9uICh2YWx1ZUhlbHBMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgc29ydGVyczogU29ydGVyVHlwZVtdKTogdm9pZCB7XG5cdFx0Ly8gSW4gb3JkZXIgdG8gbm90IHNob3cgdGhlIGxpc3QgYXQgYWxsLCB3ZSBwYXNzIGFuIGVtcHR5IGZpbHRlciB3aGljaCB3b3VsZCByZW5kZXIgYW4gZW1wdHkgbGlzdFxuXHRcdHZhbHVlSGVscExpc3RCaW5kaW5nLmZpbHRlcihGaWx0ZXIuTk9ORSwgRmlsdGVyVHlwZS5BcHBsaWNhdGlvbik7XG5cblx0XHRpZiAoc29ydGVycy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IG1vZGlmaWVkU29ydGVyczogU29ydGVyW10gPSBbXTtcblx0XHRcdHNvcnRlcnMuZm9yRWFjaCgoc29ydGVyOiBTb3J0ZXJUeXBlKSA9PlxuXHRcdFx0XHRtb2RpZmllZFNvcnRlcnMucHVzaChuZXcgU29ydGVyKHNvcnRlci5uYW1lID8/IFwiXCIsIHNvcnRlci5kZXNjZW5kaW5nLCB0aGlzLmdldFNvcnRlckZ1bmN0aW9uKSlcblx0XHRcdCk7XG5cdFx0XHR2YWx1ZUhlbHBMaXN0QmluZGluZy5zb3J0KG1vZGlmaWVkU29ydGVycyk7XG5cdFx0fSBlbHNlIHZhbHVlSGVscExpc3RCaW5kaW5nLnNvcnQobmV3IFNvcnRlcihcIlwiLCBmYWxzZSwgdGhpcy5nZXRTb3J0ZXJGdW5jdGlvbikpO1xuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbnMgY3JlYXRlcyB0aGUgZmlsdGVycyBmb3IgYWRkaXRpb25hbCB2YWx1ZXMuXG5cdCAqIEBwYXJhbSByZXZlcnNlQWRkaXRpb25hbFZhbHVlcyBBcnJheSBvZiBhZGRpdGlvbmFsIHZhbHVlcyBpbiByZXZlcnNlIG9yZGVyXG5cdCAqIEBwYXJhbSBmaWx0ZXJzIEV4aXN0aW5nIHZhbHVlaGVscCBiaW5kaW5nIGZpbHRlcnNcblx0ICogQHJldHVybnMgQWRkaXRpb25hbCB2YWx1ZSBmaWx0ZXJzXG5cdCAqL1xuXHRnZXRBZGRpdGlvbmFsVmFsdWVGaWx0ZXJzOiBmdW5jdGlvbiAocmV2ZXJzZUFkZGl0aW9uYWxWYWx1ZXM6IEFkZGl0aW9uYWxWYWx1ZVR5cGVbXSwgZmlsdGVyczogRmlsdGVyW10pOiBGaWx0ZXJbXSB7XG5cdFx0cmV2ZXJzZUFkZGl0aW9uYWxWYWx1ZXMuZm9yRWFjaCgoYWRkaXRpb25hbFZhbHVlKSA9PiB7XG5cdFx0XHRpZiAoYWRkaXRpb25hbFZhbHVlLnZhbHVlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlcyA9IGFkZGl0aW9uYWxWYWx1ZS52YWx1ZXM7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IGFkZGl0aW9uYWxWYWx1ZS5wcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdC8vIGFkZCBhZGRpdGlvbmFsIHZhbHVlIGZpbHRlcnMgdG8gZXhpc3RpbmcgZmlsdGVycyBmcm9tIHRoZSBiaW5kaW5nIGluZm9cblx0XHRcdFx0dmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0Ly8gdXBkYXRlIHRoZSB2YWx1ZSBoZWxwIGJpbmRpbmcgaW5mbyB0byBnZXQgYWRkaXRpb25hbCB2YWx1ZXMgZnJvbSB0aGUgYmFja2VuZFxuXHRcdFx0XHRcdGZpbHRlcnMucHVzaChcblx0XHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRcdHZhbHVlMTogdmFsdWUsXG5cdFx0XHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCJcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGZpbHRlcnM7XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FsbGJhY2sgdG8gdGhlIGN1c3RvbSBzb3J0ZXIuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIEZpZWxkXG5cdCAqIEByZXR1cm5zIEdyb3VwIGtleSB0aGF0IGNhbiBiZSB1c2VkIGZvciBzb3J0aW5nXG5cdCAqL1xuXHRnZXRTb3J0ZXJGdW5jdGlvbjogZnVuY3Rpb24gKGNvbnRleHQ6IFY0Q29udGV4dCk6IHN0cmluZyB7XG5cdFx0Ly9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuXHRcdGNvbnN0IHJlc291cmNlQnVuZGxlID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5tYWNyb3NcIikhO1xuXHRcdC8vZ2V0IHRoZSBjbGllbnQgc2lkZSBhbm5vdGF0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlIGdyb3VwIGtleVxuXHRcdGNvbnN0IGdyb3VwS2V5ID0gY29udGV4dC5nZXRQcm9wZXJ0eShcIkAkZmUuYWRkaXRpb25hbFZhbHVlR3JvdXBLZXlcIikgYXMgQWRkaXRpb25hbFZhbHVlR3JvdXBLZXk7XG5cdFx0aWYgKGdyb3VwS2V5ID09PSBBZGRpdGlvbmFsVmFsdWVHcm91cEtleS5yZWNvbW1lbmRhdGlvbikge1xuXHRcdFx0cmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX0FERElUSU9OQUxWQUxVRUhFTFBFUl9SRUNPTU1FTkRBVElPTlNcIik7XG5cdFx0fSBlbHNlIGlmIChncm91cEtleSA9PT0gQWRkaXRpb25hbFZhbHVlR3JvdXBLZXkucmVjZW50VmFsdWUpIHtcblx0XHRcdHJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9BRERJVElPTkFMVkFMVUVIRUxQRVJfUkVDRU5UVkFMVUVcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiTV9BRERJVElPTkFMVkFMVUVIRUxQRVJfT1RIRVJTXCIpO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBjcmVhdGUgdHJhbnNpZW50IGNvbnRleHRzIG9mIHRoZSB2YWx1ZSBoZWxwIGxpc3QgYmluZGluZyBmb3IgdGhlIGdpdmVuIGRpZmZlcmVudCB0eXBlcyBhZGRpdGlvbmFsIHZhbHVlIGNvbnRleHQgZGF0YS5cblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEgUmVjb21tZW5kYXRpb24gdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gcmVjZW50VmFsdWVzQ29udGV4dERhdGEgUmVjZW50IHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhIE90aGVyIHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIHZhbHVlSGVscExpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKi9cblx0Y3JlYXRlVHJhbnNpZW50Q29udGV4dHNGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YTogZnVuY3Rpb24gKFxuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0dmFsdWVIZWxwTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5jcmVhdGVHcm91cGVkVHJhbnNpZW50Q29udGV4dHMob3RoZXJzVmFsdWVzQ29udGV4dERhdGEsIHZhbHVlSGVscExpc3RCaW5kaW5nLCBBZGRpdGlvbmFsVmFsdWVHcm91cEtleS5vdGhlcik7XG5cdFx0dGhpcy5jcmVhdGVHcm91cGVkVHJhbnNpZW50Q29udGV4dHMocmVjZW50VmFsdWVzQ29udGV4dERhdGEsIHZhbHVlSGVscExpc3RCaW5kaW5nLCBBZGRpdGlvbmFsVmFsdWVHcm91cEtleS5yZWNlbnRWYWx1ZSk7XG5cdFx0dGhpcy5jcmVhdGVHcm91cGVkVHJhbnNpZW50Q29udGV4dHMocmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSwgdmFsdWVIZWxwTGlzdEJpbmRpbmcsIEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LnJlY29tbWVuZGF0aW9uKTtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBjcmVhdGUgdHJhbnNpZW50IGNvbnRleHQgZm9yIHRoZSBnaXZlbiBhZGRpdGlvbmFsIHZhbHVlIGNvbnRleHQgZGF0YS4gSXQgYWxzbyBhZGRzIGEga2V5IGZvciBlYWNoIGNvbnRleHQgd2hpY2ggaXMgdXNlZCB0byBncm91cCB0aGUgbmV3bHkgY3JlYXRlZCB0cmFuc2llbnQgY29udGV4dHMgYWNjb3JkaW5nbHkuXG5cdCAqIEBwYXJhbSBhZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSBBZGRpdGlvbmFsIHZhbHVlIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwTGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBncm91cEtleSBLZXkgd2hpY2ggaW5kaWNhdGVzIHRoZSBncm91cCBvZiB0aGUgYWRkaXRpb25hbCB2YWx1ZSBjb250ZXh0IGRhdGFcblx0ICovXG5cdGNyZWF0ZUdyb3VwZWRUcmFuc2llbnRDb250ZXh0czogZnVuY3Rpb24gKFxuXHRcdGFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0dmFsdWVIZWxwTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0Z3JvdXBLZXk6IEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5XG5cdCk6IHZvaWQge1xuXHRcdC8vIHJldmVyc2Ugb2YgdGhlIGNvbnRleHQgZGF0YSBpcyByZXF1aXJlZCBzbyB0aGF0IHRoZSBjb250ZXh0IHdoaWNoIG5lZWRzIHRvIGJlIHNob3duIGJlbG93IGluIHRoZSBsaXN0IGdldHMgY3JlYXRlZCBmaXJzdFxuXHRcdFsuLi5hZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YV0ucmV2ZXJzZSgpLmZvckVhY2goYXN5bmMgKGNvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlKSA9PiB7XG5cdFx0XHQvLyBncm91cEtleSBpcyBhZGRlZCBpbiBvcmRlciB0byBwcm9wZXJseSBncm91cCB0aGUgdHJhbnNpZW50IGNvbnRleHRzIGFtb25nc3QgYWxsIDMgZ3JvdXBzXG5cdFx0XHRjb250ZXh0RGF0YVtcIkAkZmUuYWRkaXRpb25hbFZhbHVlR3JvdXBLZXlcIl0gPSBncm91cEtleTtcblx0XHRcdGNvbnN0IGNvbnRleHQgPSB2YWx1ZUhlbHBMaXN0QmluZGluZy5jcmVhdGUoY29udGV4dERhdGEpO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgY29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHQvLyBGb3IgdHJhbnNpZW50IGNvbnRleHRzIHRoZSBjYW5jZWxlZCBpcyBzZXQgdG8gdHJ1ZSBhbmQgZm9yIG90aGVyIGNhc2VzIGl0IHdpbGwgYmUgZmFsc2UuIEF0bGVhc3QgaW4gcmVjb21tZW5kYXRpb25zXG5cdFx0XHRcdC8vIHVzZSBjYXNlIHdlIGRvIG5vdCBmYWNlIHRoZSBzY2VuYXJpbyB3aGVyZSBjYW5jZWxlZCBpcyBzZXQgdG8gZmFsc2UuIEZvciBub3cgd2UgYXJlIGp1c3QgbG9nZ2luZyB0aGUgZXJyb3IuXG5cdFx0XHRcdGlmICghKGVycm9yIGFzIENvbnRleHRFcnJvclR5cGUpLmNhbmNlbGVkKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKChlcnJvciBhcyBDb250ZXh0RXJyb3JUeXBlKS5uYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbnMgcmV0dXJucyB0aGUgcmVsZXZhbnQgcmVjb21tZW5kYXRpb25zIGZvciB0aGUgdmFsdWVsaXN0LlxuXHQgKiBAcGFyYW0gZGF0YSBPYmplY3QgY29udGFpbmluZyByZWNvbW1lbmRhdGlvbiBtb2RlbCBkYXRhXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dCBCaW5kaW5nIGNvbnRleHQgb2YgdGhlIEZpZWxkXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggUHJvcGVydHkgUGF0aCBvZiB0aGUgRmllbGRcblx0ICogQHBhcmFtIGJpbmRpbmdQYXRoXG5cdCAqIEByZXR1cm5zIFJlbGV2YW50IHJlY29tbWVuZGF0aW9ucyBmb3IgdGhlIHZhbHVlbGlzdFxuXHQgKi9cblx0Z2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnM6IGZ1bmN0aW9uIChcblx0XHRkYXRhOiBJbkNvbXBsZXRlbmVzc0luZm9UeXBlIHwgb2JqZWN0LFxuXHRcdGJpbmRpbmdDb250ZXh0OiBWNENvbnRleHQsXG5cdFx0cHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdFx0YmluZGluZ1BhdGg/OiBzdHJpbmdcblx0KTogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHZhbHVlczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiA9IFtdO1xuXHRcdGxldCByZWxldmFudFJlY29tbWVuZGF0aW9uczogSW50ZXJuYWxQcm9wZXJ0eUFkZGl0aW9uYWxWYWx1ZSB8IHVuZGVmaW5lZDtcblx0XHRpZiAoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly9nZXQgdGhlIHJpZ2h0IHByb3BlcnR5IHBhdGggYnkgZWxpbWluYXRpbmcgdGhlIHN0YXJ0aW5nIC8gYW5kIGFsc28gbWFpbiBlbnRpdHlzZXQgbmFtZVxuXHRcdFx0cHJvcGVydHlQYXRoID0gdGhpcy5nZXRSZWNvbW1lbmRhdGlvblByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpO1xuXHRcdFx0aWYgKChkYXRhIGFzIFJlY29tbWVuZGF0aW9uSW5mbykudmVyc2lvbiA9PT0gMi4wICYmIGJpbmRpbmdQYXRoKSB7XG5cdFx0XHRcdHByb3BlcnR5UGF0aCA9IGJpbmRpbmdQYXRoO1xuXHRcdFx0fVxuXHRcdFx0Ly9nZXQgdGhlIHJlY29tbWVuZGF0aW9ucyBiYXNlZCBvbiBwcm9wZXJ0eSBwYXRoIGFuZCBiaW5kaW5nIGNvbnRleHQgcGFzc2VkXG5cdFx0XHRyZWxldmFudFJlY29tbWVuZGF0aW9ucyA9IHRoaXMuZ2V0QWRkaXRpb25hbFZhbHVlRnJvbVByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgsIGJpbmRpbmdDb250ZXh0LCBkYXRhKSBhc1xuXHRcdFx0XHR8IEludGVybmFsUHJvcGVydHlBZGRpdGlvbmFsVmFsdWVcblx0XHRcdFx0fCB1bmRlZmluZWQ7XG5cdFx0XHQvL2lmIHdlIGdldCByZWNvbW1lbmRhdGlvbnMgdGhlbiBwdXNoIHRoZSB2YWx1ZXNcblx0XHRcdGlmIChyZWxldmFudFJlY29tbWVuZGF0aW9ucyAmJiBPYmplY3Qua2V5cyhyZWxldmFudFJlY29tbWVuZGF0aW9ucykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZWxldmFudFJlY29tbWVuZGF0aW9ucy5hZGRpdGlvbmFsVmFsdWVzLmZvckVhY2goKHZhbHVlRGF0YTogUmVjb21tZW5kYXRpb25WYWx1ZVR5cGUpID0+IHtcblx0XHRcdFx0XHR2YWx1ZXMucHVzaCh2YWx1ZURhdGEudmFsdWUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vaWYgcmVjb21tZW5kYXRpb25zIGFyZSBub3QgZm91bmQgdGhlbiByZXR1cm4gbnVsbFxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0X2NoZWNrRm9yS2V5c0luUmVjb21tZW5kYXRpb25zOiBmdW5jdGlvbiAoa2V5UHJvcGVydGllczogS2V5UHJvcGVydGllc0RhdGFUeXBlLCBjb250ZXh0RGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IGJvb2xlYW4ge1xuXHRcdGZvciAoY29uc3Qga2V5IGluIGtleVByb3BlcnRpZXMpIHtcblx0XHRcdGlmIChrZXlQcm9wZXJ0aWVzW2tleV0gIT09IGNvbnRleHREYXRhW2tleV0pIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgdG8gZmV0Y2ggdGhlIGV4YWN0IG9iamVjdCBmcm9tIGFuIGFycmF5IG9mIG9iamVjdHMgdGhhdCBjb250YWlucyByZWxldmFudCByZWNvbW1lbmRhdGlvbkRhdGEgYmFzZWQgb24ga2V5cy5cblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uRGF0YSBBcnJheSBjb250YWluaW5nIGFkZGl0aW9uYWwgdmFsdWVzXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dCBCaW5kaW5nIGNvbnRleHQgb2YgdGhlIEZpZWxkXG5cdCAqIEByZXR1cm5zIFJlbGV2YW50IG9iamVjdCBmcm9tIGFuIGFycmF5IG9mIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBhZGRpdGlvbmFsIHZhbHVlXG5cdCAqL1xuXHRnZXRBZGRpdGlvbmFsVmFsdWVGcm9tS2V5czogZnVuY3Rpb24gKFxuXHRcdHJlY29tbWVuZGF0aW9uRGF0YTogQWRkaXRpb25WYWx1ZURlZmluaXRpb24sXG5cdFx0YmluZGluZ0NvbnRleHQ/OiBWNENvbnRleHQgfCBDb250ZXh0XG5cdCk6IEFkZGl0aW9uVmFsdWVEZWZpbml0aW9uIHtcblx0XHRjb25zdCBjb250ZXh0RGF0YSA9IGJpbmRpbmdDb250ZXh0Py5nZXRPYmplY3QoKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXHRcdGxldCByZXN1bHQ6IEFkZGl0aW9uVmFsdWVEZWZpbml0aW9uID0ge307XG5cdFx0Ly9sb29wIHRocm91Z2ggdGhlIHJlY29tbWVuZGF0aW9uRGF0YSBhbmQgY2hlY2sgaWYgdGhlIGtleVByb3BlcnRpZXMgbWF0Y2ggd2l0aCB0aGUgYmluZGluZyBjb250ZXh0IGRhdGFcblx0XHRpZiAoYmluZGluZ0NvbnRleHQgJiYgY29udGV4dERhdGEpIHtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHJlY29tbWVuZGF0aW9uRGF0YSkpIHtcblx0XHRcdFx0KHJlY29tbWVuZGF0aW9uRGF0YSBhcyBSZWNvbW1lbmRhdGlvbkRhdGFGb3JOYXZQcm9wZXJ0eVR5cGVbXSkuZm9yRWFjaCgocmVjRGF0YSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGtleVByb3BlcnRpZXMgPSByZWNEYXRhLmtleVByb3BlcnRpZXMgYXMgS2V5UHJvcGVydGllc0RhdGFUeXBlO1xuXHRcdFx0XHRcdGNvbnN0IGFsbEtleXNNYXRjaCA9IHRoaXMuX2NoZWNrRm9yS2V5c0luUmVjb21tZW5kYXRpb25zKGtleVByb3BlcnRpZXMsIGNvbnRleHREYXRhKTtcblx0XHRcdFx0XHQvL2lmIGV2ZXJ5IGtleSB2YWx1ZSBtYXRjaGVzIHdpdGggdGhlIGJpbmRpbmcgY29udGV4dCBkYXRhIHRoZW4gYXNzaWduIGl0IHRvIHJlc3VsdCB3aGljaCB3aWxsIGJlIHJldHVybmVkXG5cdFx0XHRcdFx0aWYgKGFsbEtleXNNYXRjaCkge1xuXHRcdFx0XHRcdFx0cmVzdWx0ID0gcmVjRGF0YSBhcyBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdF9nZXRSZWNvbW1lbmRhdGlvbjogZnVuY3Rpb24gKFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdGJpbmRpbmdDb250ZXh0OiBDb250ZXh0LFxuXHRcdHJlY29tbWVuZGF0aW9uRGF0YTogQWRkaXRpb25WYWx1ZURlZmluaXRpb25cblx0KTogQWRkaXRpb25WYWx1ZURlZmluaXRpb24ge1xuXHRcdC8vY3JlYXRlIGEgY29weSBvZiB0aGUgcmVjb21tZW5kYXRpb25EYXRhIHRvIHN0b3JlIGl0cyBwcmV2aW91cyB2YWx1ZSBhcyBpdCB3aWxsIGNoYW5nZSBiZWNhdXNlIG9mIHRoZSByZWN1cnNpdmUgYXBwcm9hY2hcblx0XHRsZXQgb2xkRGF0YSA9IE9iamVjdC5hc3NpZ24ocmVjb21tZW5kYXRpb25EYXRhLCB7fSk7XG5cdFx0Ly9jaGVjayBpZiBwcm9wZXJ0eSBwYXRoIGV4aXN0cyBvbiB0aGUgcmVjb21tZW5kYXRpb25EYXRhIG9iamVjdCBhbmQgaWYgc28gdGhlbiByZXR1cm4gdGhlIG9iamVjdCBwb2ludGluZyB0byB0aGUgcHJvcGVydHkgcGF0aFxuXHRcdGlmIChPYmplY3Qua2V5cyhyZWNvbW1lbmRhdGlvbkRhdGEpLmluY2x1ZGVzKHByb3BlcnR5UGF0aCkpIHtcblx0XHRcdHJldHVybiAocmVjb21tZW5kYXRpb25EYXRhIGFzIEluQ29tcGxldGVuZXNzSW5mb1R5cGUpW3Byb3BlcnR5UGF0aF0gYXMgQWRkaXRpb25WYWx1ZURlZmluaXRpb247XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vaWYgcHJvcGVydHkgcGF0aCBpcyBub3QgcHJlc2VudCB0aGVuIGNoZWNrIGlmIGl0IGlzIDE6biBtYXBwaW5nIGFuZCB3ZSBuZWVkIHRvIGRvIGEgcmVjdXJzaXZlIGFwcHJvYWNoIHRvIGxhbmQgb24gdGhlIGV4YWN0IG9iamVjdCBjb250YWluaW5nIHRoZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnNcblx0XHRcdC8vY29udGludWUgdGhlIHdoaWxlIGxvb3AgdGlsbCB0aGUgcHJvcGVydHkgcGF0aCBpcyBmb3VuZCBpbiB0aGUgcHJldmlvdXMgcmVjb21tZW5kYXRpb25EYXRhXG5cdFx0XHR3aGlsZSAoT2JqZWN0LmtleXMob2xkRGF0YSkubGVuZ3RoID4gMCAmJiAhT2JqZWN0LmtleXMob2xkRGF0YSkuaW5jbHVkZXMocHJvcGVydHlQYXRoKSkge1xuXHRcdFx0XHQvLyBhcyBpdCBtaWdodCBiZSAxOm4gbWFwcGluZyBzbyBmaXJzdCBzZXBlcmF0ZSB0aGUgbmF2cHJvcCBuYW1lIGFuZCBhY3R1YWwgcHJvcCBuYW1lIHRvIG1ha2Ugc3VyZSB3ZSBmaW5kIHRoZSBuYXZwcm9wIGZpcnN0IGFuZCB0aGVuIGZyb20gaXRzIHBvaW50aW5nIG9iamVjdCB3ZSBmaW5kIHRoZSBwcm9wZXJ0eSBwYXRoXG5cdFx0XHRcdC8vZWc6IF9JdGVtL01hdGVyaWFsIHdpbGwgYmUgZmlyc3QgZGl2aWRlZCBpbnRvIF9JdGVtIGFuZCB3ZSBzZWFyY2ggZm9yIGl0IGFuZCB0aGVuIGZyb20gaXRzIHJlbGV2YW50IG9iamVjdCB3ZSBzZWFyY2ggZm9yIE1hdGVyaWFsXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aHMgPSBwcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRpZiAocHJvcGVydHlQYXRocy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0Ly9nZXR0aW5nIHRoZSBuYXZwcm9wIHBhdGhcblx0XHRcdFx0XHRjb25zdCBuYXZQcm9wUGF0aCA9IHByb3BlcnR5UGF0aHNbMF07XG5cdFx0XHRcdFx0Ly9yZW1vdmluZyB0aGUgbmF2cHJvcCBwYXRoIGZyb20gcHJvcGVydHlwYXRocyBzbyB0aGF0IHdlIG9ubHkgY2hlY2sgZm9yIGFjdHVhbCBwcm9wZXJ0eSBwYXRoXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRocy5zcGxpY2UoMCwgMSk7XG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoID0gcHJvcGVydHlQYXRocy5qb2luKFwiL1wiKTtcblx0XHRcdFx0XHQvL3VzaW5nIGdldEFkZGl0aW9uYWxWYWx1ZUZyb21Qcm9wZXJ0eVBhdGggYW5kIHBhc3NpbmcgbmF2UHJvcFBhdGggd2UgZ2V0IHRoZSBleGFjdCBhcnJheSBvZiBvYmplY3RzIHBvaW50aW5nIHRvIHRoZSBuYXZQcm9wXG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25EYXRhID0gdGhpcy5nZXRBZGRpdGlvbmFsVmFsdWVGcm9tUHJvcGVydHlQYXRoKFxuXHRcdFx0XHRcdFx0bmF2UHJvcFBhdGgsXG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dCxcblx0XHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uRGF0YVxuXHRcdFx0XHRcdCkgYXMgUmVjb21tZW5kYXRpb25EYXRhRm9yTmF2UHJvcGVydHlUeXBlW107XG5cdFx0XHRcdFx0Ly9ubyBwYXNzIHRoZSBhcnJheSBvZiBvYmplY3RzIG9mIG5hdlByb3AgdG8gZ2V0QWRkaXRpb25hbFZhbHVlRnJvbUtleXMgYW5kIGdldCB0aGUgZXhhY3Qgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHJlY29tbWVuZGF0aW9uRGF0YSBiYXNlZCBvbiBrZXlzXG5cdFx0XHRcdFx0cmVjb21tZW5kYXRpb25EYXRhID0gdGhpcy5nZXRBZGRpdGlvbmFsVmFsdWVGcm9tS2V5cyhyZWNvbW1lbmRhdGlvbkRhdGEsIGJpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0XHRpZiAoT2JqZWN0LmtleXMocmVjb21tZW5kYXRpb25EYXRhKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHQvL3NldCB0aGUgcmVjb21tZW5kYXRpb25EYXRhIHRvIG9sZERhdGEgYmVmb3JlIGFzc2lnbmluZyB0aGUgbmV3IHZhbHVlIHRvIGl0XG5cdFx0XHRcdFx0XHRvbGREYXRhID0gT2JqZWN0LmFzc2lnbihyZWNvbW1lbmRhdGlvbkRhdGEsIHt9KTtcblx0XHRcdFx0XHRcdC8vaGVyZSB3ZSBjaGVjayBmb3IgdGhlIGFjdHVhbCBwcm9wZXJ0eSBwYXRoIGZyb20gdGhlIG9iamVjdCB3ZSBmb3VuZCBmcm9tIGdldEFkZGl0aW9uYWxWYWx1ZUZyb21LZXlzXG5cdFx0XHRcdFx0XHQvL2VnOiBNYXRlcmlhbCBjYW4gYmUgZm91bmQgaW4gdGhlIG9iamVjdCB3aGljaCBpcyBwYXJ0IG9mIGFycmF5IG9mIG9iamVjdHMgb2YgX0l0ZW1cblx0XHRcdFx0XHRcdHJlY29tbWVuZGF0aW9uRGF0YSA9IHRoaXMuZ2V0QWRkaXRpb25hbFZhbHVlRnJvbVByb3BlcnR5UGF0aChcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0cmVjb21tZW5kYXRpb25EYXRhXG5cdFx0XHRcdFx0XHQpIGFzIEFkZGl0aW9uVmFsdWVEZWZpbml0aW9uO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge307XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB7fTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uRGF0YTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgdGhlIGFkZGl0aW9uYWwgdmFsdWUgYmFzZWQgb24gcHJvcGVydHkgcGF0aCBhbmQgYmluZGluZyBjb250ZXh0IHBhc3NlZC5cblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBQcm9wZXJ0eSBwYXRoIG9mIHRoZSBmaWVsZFxuXHQgKiBAcGFyYW0gYmluZGluZ0NvbnRleHQgQmluZGluZyBjb250ZXh0IG9mIHRoZSBmaWVsZFxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25EYXRhIE9iamVjdCBjb250YWluaW5nIGFkZGl0aW9uYWwgdmFsdWVcblx0ICogQHJldHVybnMgQWRkaXRpb25hbCB2YWx1ZSBiYXNlZCBvbiBwcm9wZXJ0eSBwYXRoIGFuZCBiaW5kaW5nIGNvbnRleHQgcGFzc2VkXG5cdCAqL1xuXHRnZXRBZGRpdGlvbmFsVmFsdWVGcm9tUHJvcGVydHlQYXRoOiBmdW5jdGlvbiAoXG5cdFx0cHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdFx0YmluZGluZ0NvbnRleHQ6IFY0Q29udGV4dCB8IENvbnRleHQsXG5cdFx0cmVjb21tZW5kYXRpb25EYXRhPzogQWRkaXRpb25WYWx1ZURlZmluaXRpb24gfCBSZWNvbW1lbmRhdGlvbkluZm9cblx0KTogQWRkaXRpb25WYWx1ZURlZmluaXRpb24gfCBTdGFuZGFyZFJlY29tbWVuZGF0aW9uRGF0YVR5cGUgfCB1bmRlZmluZWQge1xuXHRcdGlmICgocmVjb21tZW5kYXRpb25EYXRhIGFzIFJlY29tbWVuZGF0aW9uSW5mbykudmVyc2lvbiA9PT0gMikge1xuXHRcdFx0cmV0dXJuIHN0YW5kYXJkUmVjb21tZW5kYXRpb25IZWxwZXIuZ2V0U3RhbmRhcmRSZWNvbW1lbmRhdGlvbnMoXG5cdFx0XHRcdGJpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdHJlY29tbWVuZGF0aW9uRGF0YSBhcyBSZWNvbW1lbmRhdGlvbkluZm9cblx0XHRcdCk7XG5cdFx0fVxuXHRcdGlmIChyZWNvbW1lbmRhdGlvbkRhdGEpIHtcblx0XHRcdHJldHVybiB0aGlzLl9nZXRSZWNvbW1lbmRhdGlvbihwcm9wZXJ0eVBhdGgsIGJpbmRpbmdDb250ZXh0LCByZWNvbW1lbmRhdGlvbkRhdGEpO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBvZiB0aGUgZmllbGQgYnkgcmVtb3ZpbmcgdGhlIGxlYWRpbmcgJy8nIGFuZCBtYWluIGVudGl0eSBzZXQgbmFtZS5cblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBQcm9wZXJ0eSBQYXRoIG9mIHRoZSBGaWVsZFxuXHQgKiBAcmV0dXJucyBQcm9wZXJ0eSBwYXRoIG9mIHRoZSBmaWVsZCBieSByZW1vdmluZyB0aGUgbGVhZGluZyAnLycgYW5kIG1haW4gZW50aXR5IHNldCBuYW1lLlxuXHQgKi9cblx0Z2V0UmVjb21tZW5kYXRpb25Qcm9wZXJ0eVBhdGg6IGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Ly9GaXJzdCB3ZSBzcGxpdCB0aGUgcHJvcGVydHkgcGF0aCBiYXNlZCBvbiAvXG5cdFx0Y29uc3QgcHJvcGVydHlQYXRocyA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0Ly9Ob3cgcmVtb3ZlIHRoZSBmaXJzdCB0d28gZWxlbWVudHMgb2YgdGhlIGFycmF5LiBBcyBmaXJzdCBlbGVtZW50IHdpbGwgYWx3YXlzIGJlICcnIGFuZCBzZWNvbmQgZWxlbWVudCB3aWxsIGJlIG1haW4gZW50aXR5IHNldCBuYW1lXG5cdFx0cHJvcGVydHlQYXRocy5zcGxpY2UoMCwgMik7XG5cdFx0Ly9Ob3cgam9pbiB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIHRvIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBwYXRoIGFuZCByZXR1cm4gaXRcblx0XHRyZXR1cm4gcHJvcGVydHlQYXRocy5qb2luKFwiL1wiKTtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBmaWx0ZXIgT3RoZXJzIHZhbHVlcyBjb250ZXh0IGRhdGEgYW5kIHJlbW92ZSB2YWx1ZXMgd2hpY2ggYXJlIGFsc28gcHJlc2VudCBpbiBSZWNlbnRseSBVc2VkIGFuZCBSZWNvbW1lbmRhdGlvbiBncm91cC5cblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEgUmVjb21tZW5kYXRpb24gdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gcmVjZW50VmFsdWVzQ29udGV4dERhdGEgUmVjZW50IHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhIE90aGVycyB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBLZXlzIFZhbHVlTGlzdFByb3BlcnR5IG9mIHRoZSBwYXlsb2FkXG5cdCAqIEByZXR1cm5zIE90aGVycyB2YWx1ZXMgY29udGV4dCBkYXRhLlxuXHQgKi9cblx0Z2V0UmVsZXZhbnRPdGhlcnNWYWx1ZXNDb250ZXh0RGF0YTogZnVuY3Rpb24gKFxuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0dmFsdWVIZWxwS2V5czogc3RyaW5nW11cblx0KTogRmllbGREYXRhVHlwZVtdIHtcblx0XHRyZXR1cm4gb3RoZXJzVmFsdWVzQ29udGV4dERhdGEuZmlsdGVyKFxuXHRcdFx0KGNvbnRleHREYXRhKSA9PlxuXHRcdFx0XHQhdGhpcy5jaGVja1ZhbHVlc01hdGNoKGNvbnRleHREYXRhLCByZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLCB2YWx1ZUhlbHBLZXlzKSAmJlxuXHRcdFx0XHQhdGhpcy5jaGVja1ZhbHVlc01hdGNoKGNvbnRleHREYXRhLCByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSwgdmFsdWVIZWxwS2V5cylcblx0XHQpO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgcmVjZW50IHZhbHVlcyBtYXRjaGVzIGVpdGhlciB3aXRoIHRoZSBzZWFyY2ggdGVybSBvciB3aXRoIHRoZSBvdGhlcnMgdmFsdWVzLlxuXHQgKiBAcGFyYW0gb3RoZXJzVmFsdWVzQ29udGV4dERhdGEgT3RoZXJzIHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIHJlY2VudFZhbHVlc0NvbnRleHREYXRhIFJlY2VudCB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBLZXlzIFZhbHVlTGlzdFByb3BlcnR5IG9mIHRoZSBwYXlsb2FkXG5cdCAqIEBwYXJhbSBzZWFyY2hUZXJtIFNlYXJjaCB0ZXJtIGVudGVyZWQgYnkgdGhlIHVzZXJcblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIEJpbmRpbmcgaW5mbyBvYmplY3Qgb2YgdGhlIHZhbHVlIGhlbHBcblx0ICogQHJldHVybnMgUmVjZW50IHZhbHVlcyBjb250ZXh0IGRhdGEgd2hpY2ggbmVlZHMgdG8gYmUgc2hvdyBpbiB0aGUgUmVjZW50bHkgVXNlZCBncm91cCBpbiB0aGUgdHlwZSBhaGVhZCBzdWdnZXN0aW9uIGxpc3QuXG5cdCAqL1xuXHRnZXRSZWxldmFudFJlY2VudFZhbHVlc0NvbnRleHREYXRhOiBmdW5jdGlvbiAoXG5cdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdHZhbHVlSGVscEtleXM6IHN0cmluZ1tdLFxuXHRcdHNlYXJjaFRlcm06IHN0cmluZyxcblx0XHRiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm9cblx0KTogRmllbGREYXRhVHlwZVtdIHtcblx0XHQvLyBmaWx0ZXIgb3V0IHJlY2VudCB2YWx1ZSBiYXNlZCBvbiBleGlzdGluZyB2YWx1ZSBoZWxwIGZpbHRlcnNcblx0XHRjb25zdCByZWNlbnRWYWx1ZXNNb2RlbCA9IG5ldyBKU09OTW9kZWwoeyByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSB9KTtcblx0XHRjb25zdCByZWNlbnRWYWx1ZXNMaXN0ID0gcmVjZW50VmFsdWVzTW9kZWwuYmluZExpc3QoXG5cdFx0XHRcIi9yZWNlbnRWYWx1ZXNDb250ZXh0RGF0YVwiLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0dGhpcy5nZXRWYWx1ZUhlbHBCaW5kaW5nRmlsdGVycyhiaW5kaW5nSW5mbylcblx0XHQpO1xuXHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhID0gcmVjZW50VmFsdWVzTGlzdC5nZXRBbGxDdXJyZW50Q29udGV4dHMoKS5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZ2V0T2JqZWN0KCkgYXMgRmllbGREYXRhVHlwZSk7XG5cblx0XHQvLyBjb25zaWRlciBvbmx5IHRob3NlIHJlY2VudCB2YWx1ZXMgd2hpY2ggZWl0aGVyIG1hdGNoZXMgd2l0aCB0aGUgc2VhcmNoIHRlcm0gb3Igd2l0aCB0aGUgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBiYWNrZW5kIGZvciB0aGUgT3RoZXJzIGdyb3VwLlxuXHRcdC8vIEJvdGggdGhlIGZpbHRlcnMgbmVlZHMgdG8gYmUgYXBwbGllZCBzbyB0aGF0IHNvIHRoYXQgb3JkZXIgb2YgdGhlIHJlY2VudCB2YWx1ZXMgZG9lcyBub3QgY2hhbmdlLCB3aGljaCBpcyBpbXBvcnRhbnQgZm9yIHRoZSBvcmRlciBpbiB3aGljaFxuXHRcdC8vIHRoZSBkYXRhIHdvdWxkIGJlIHNob3duIGluIHRoZSB0eXBlIGFoZWFkIHN1Z2dlc3Rpb24gbGlzdC5cblx0XHRyZXR1cm4gcmVjZW50VmFsdWVzQ29udGV4dERhdGEuZmlsdGVyKChyZWNlbnRWYWx1ZUNvbnRleHREYXRhKSA9PlxuXHRcdFx0dGhpcy5maWx0ZXJSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YShyZWNlbnRWYWx1ZUNvbnRleHREYXRhLCBzZWFyY2hUZXJtLCB2YWx1ZUhlbHBLZXlzLCBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSlcblx0XHQpO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHJlY2VudCB2YWx1ZSBjb250ZXh0IGRhdGEgbWF0Y2hlcyB3aXRoIHRoZSBnaXZlbiBzZWFyY2ggdGVybSBvciB0aGUgb3RoZXJzIHZhbHVlcy5cblx0ICogQHBhcmFtIHJlY2VudFZhbHVlQ29udGV4dERhdGEgUmVjZW50IHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIHNlYXJjaFRlcm0gU2VhcmNoIHRlcm0gZW50ZXJlZCBieSB0aGUgdXNlclxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwS2V5cyBWYWx1ZUxpc3RQcm9wZXJ0eSBvZiB0aGUgcGF5bG9hZFxuXHQgKiBAcGFyYW0gb3RoZXJzVmFsdWVzQ29udGV4dERhdGEgT3RoZXJzIHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVjZW50IHZhbHVlIGNvbnRleHQgc2F0aXNmaWVzIHRoZSBmaWx0ZXIgY29uZGl0aW9uLlxuXHQgKi9cblx0ZmlsdGVyUmVjZW50VmFsdWVzQ29udGV4dERhdGE6IGZ1bmN0aW9uIChcblx0XHRyZWNlbnRWYWx1ZUNvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlLFxuXHRcdHNlYXJjaFRlcm06IHN0cmluZyxcblx0XHR2YWx1ZUhlbHBLZXlzOiBzdHJpbmdbXSxcblx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGZvciAoY29uc3Qga2V5IGluIHJlY2VudFZhbHVlQ29udGV4dERhdGEpIHtcblx0XHRcdGlmICh0eXBlb2YgcmVjZW50VmFsdWVDb250ZXh0RGF0YVtrZXldID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR0aGlzLmZpbHRlclJlY2VudFZhbHVlc0NvbnRleHREYXRhKFxuXHRcdFx0XHRcdFx0cmVjZW50VmFsdWVDb250ZXh0RGF0YVtrZXldIGFzIEZpZWxkRGF0YVR5cGUsXG5cdFx0XHRcdFx0XHRzZWFyY2hUZXJtLFxuXHRcdFx0XHRcdFx0dmFsdWVIZWxwS2V5cyxcblx0XHRcdFx0XHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgcmVjZW50VmFsdWVDb250ZXh0RGF0YVtrZXldID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQoIXNlYXJjaFRlcm0gJiYgb3RoZXJzVmFsdWVzQ29udGV4dERhdGEubGVuZ3RoID09PSAwKSB8fCAvLyBDYXNlIHdoZXJlIGZvY3VzIGlzIGp1c3Qgc2V0IHRvIHRoZSB2YWx1ZSBoZWxwIGZpZWxkXG5cdFx0XHRcdFx0KHJlY2VudFZhbHVlQ29udGV4dERhdGFba2V5XSBhcyBzdHJpbmcpLmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8XG5cdFx0XHRcdFx0KHZhbHVlSGVscEtleXMuaW5jbHVkZXMoa2V5KSAmJiB0aGlzLmNoZWNrVmFsdWVzTWF0Y2gocmVjZW50VmFsdWVDb250ZXh0RGF0YSwgb3RoZXJzVmFsdWVzQ29udGV4dERhdGEsIHZhbHVlSGVscEtleXMpKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHZhbHVlcyBvZiBzcGVjaWZpZWQga2V5cyBpbiBjb250ZXh0RGF0YVRvQmVNYXRjaGVkIG1hdGNoIHdpdGggYW55IG9iamVjdCBpbiBjb250ZXh0RGF0YUxpc3QuXG5cdCAqIEBwYXJhbSBjb250ZXh0RGF0YVRvQmVNYXRjaGVkIFRoZSBjb250ZXh0IGRhdGEgb2JqZWN0IHRvIGNvbXBhcmVcblx0ICogQHBhcmFtIGNvbnRleHREYXRhTGlzdCBUaGUgYXJyYXkgb2YgY29udGV4dCBkYXRhIG9iamVjdHMgdG8gY29tcGFyZSBhZ2FpbnN0XG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBLZXlzIFRoZSBrZXlzIHRvIGNvbXBhcmUgZnJvbSBjb250ZXh0RGF0YVRvQmVNYXRjaGVkIHdpdGggY29udGV4dERhdGFMaXN0IG9iamVjdHNcblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIGFueSBvYmplY3QgaW4gY29udGV4dERhdGFMaXN0IG1hdGNoZXMgdGhlIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIGtleXMgaW4gY29udGV4dERhdGFUb0JlTWF0Y2hlZCwgb3RoZXJ3aXNlIGZhbHNlLlxuXHQgKi9cblx0Y2hlY2tWYWx1ZXNNYXRjaDogZnVuY3Rpb24gKGNvbnRleHREYXRhVG9CZU1hdGNoZWQ6IEZpZWxkRGF0YVR5cGUsIGNvbnRleHREYXRhTGlzdDogRmllbGREYXRhVHlwZVtdLCB2YWx1ZUhlbHBLZXlzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuXHRcdGZvciAoY29uc3Qgb2JqIG9mIGNvbnRleHREYXRhTGlzdCkge1xuXHRcdFx0bGV0IG1hdGNoID0gdHJ1ZTtcblx0XHRcdGZvciAoY29uc3Qga2V5IG9mIHZhbHVlSGVscEtleXMpIHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIHZhbHVlIG9mIHRoZSBrZXkgaW4gcmVjZW50VmFsdWVzQ29udGV4dERhdGFcblx0XHRcdFx0Ly8gbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIGtleSBpbiB0aGUgY3VycmVudCBvYmplY3QgZnJvbSBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YVxuXHRcdFx0XHRpZiAoY29udGV4dERhdGFUb0JlTWF0Y2hlZFtrZXldICE9PSBvYmpba2V5XSkge1xuXHRcdFx0XHRcdG1hdGNoID0gZmFsc2U7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChtYXRjaCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gcmVhcnJhbmdlIHRoZSBnaXZlbiBhZGRpdGlvbmFsIHZhbHVlIGNvbnRleHQgZGF0YSBhcyBwZXIgdGhlIGNocm9ub2xvZ2ljYWwgb3JkZXIgb2YgdGhlIGdpdmVuIGFkZGl0aW9uYWwgdmFsdWVzLlxuXHQgKiBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IHRoZSByZWNvbW1lbmRhdGlvbiBkYXRhIGZldGNoZWQgZnJvbSBiYWNrZW5kIGFyZSBzaG93biBpbiB0aGUgc2FtZSBvcmRlciBvZiByZWNvbW1lbmRhdGlvbiB2YWx1ZXMgZmV0Y2hlZCBmcm9tIHJlY29tbWVuZGF0aW9uIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhIFJlY29tbWVuZGF0aW9uIHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uVmFsdWVzIFJlY29tbWVuZGF0aW9uIHZhbHVlc1xuXHQgKiBAcGFyYW0gdmFsdWVMaXN0UHJvcGVydHkgVmFsdWUgbGlzdCBwcm9wZXJ0eSBvZiB0aGUgdmFsdWUgaGVscFxuXHQgKiBAcmV0dXJucyBSZWNvbW1lbmRhdGlvbiB2YWx1ZXMgY29udGV4dCBkYXRhIGluIHRoZSBjb3JyZWN0IG9yZGVyLlxuXHQgKi9cblx0Z2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhOiBmdW5jdGlvbiAoXG5cdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbilbXSA9IFtdLFxuXHRcdHZhbHVlTGlzdFByb3BlcnR5OiBzdHJpbmdcblx0KTogRmllbGREYXRhVHlwZVtdIHtcblx0XHRjb25zdCByZWxldmFudFJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSA9IFtdO1xuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG5cdFx0XHRjb25zdCBmb3VuZE9iamVjdCA9IHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEuZmluZCgoY29udGV4dERhdGEpID0+IGNvbnRleHREYXRhW3ZhbHVlTGlzdFByb3BlcnR5XSA9PT0gdmFsdWUpO1xuXHRcdFx0aWYgKGZvdW5kT2JqZWN0KSB7XG5cdFx0XHRcdHJlbGV2YW50UmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YS5wdXNoKGZvdW5kT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiByZWxldmFudFJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGE7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gbWFrZSBiYXRjaCBjYWxscyB0byBzdXBwb3J0IHBhZ2luYXRpb24uXG5cdCAqIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgdGhlIGFkZGl0aW9uYWwgZGF0YSBmZXRjaGVkIGZyb20gdGhlIGJhY2tlbmQgaXMgZGlzcGxheWVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLlxuXHQgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgb2JqZWN0IHRoYXQgY29uc2lzdHMgb2YgYW4gSUQsIHNvdXJjZSwgYW5kIGEgcGFyYW1ldGVyIG1hcC5cblx0ICovXG5cdHVwZGF0ZUZpbmlzaGVkOiBhc3luYyBmdW5jdGlvbiBuYW1lKGV2ZW50OiBVSTVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZSgpIGFzIHsgc291cmNlPzogRXZlbnRQcm92aWRlciB9IGFzIE1UYWJsZTtcblx0XHRjb25zdCB0YWJsZUJpbmRpbmdDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkIHwgbnVsbCA9IHNvdXJjZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpLFxuXHRcdFx0YWxsTGlzdEJpbmRpbmcgPSB0YWJsZUJpbmRpbmdDb250ZXh0Py5nZXRQcm9wZXJ0eShcImFsbExpc3RCaW5kaW5nXCIpIGFzIE9EYXRhTGlzdEJpbmRpbmcgfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgeyBhY3R1YWwsIHRvdGFsLCByZWFzb24gfSA9IGV2ZW50LmdldFBhcmFtZXRlcnMoKSBhcyB7IGFjdHVhbDogbnVtYmVyOyB0b3RhbDogbnVtYmVyOyByZWFzb246IHN0cmluZyB9O1xuXHRcdC8vIGFzIHVzZXIgc2Nyb2xscyBkb3duIGFuZCBvbmNlIHdlIHJlYWNoIGVuZCBvZiB0aGUgbGlzdCwgd2UgZmV0Y2ggdGhlIG5leHQgc2V0IG9mIGRhdGEgZnJvbSB0aGUgYmFja2VuZFxuXHRcdGlmIChhbGxMaXN0QmluZGluZyAmJiByZWFzb24gPT09IFwiR3Jvd2luZ1wiICYmIGFjdHVhbCA9PT0gdG90YWwpIHtcblx0XHRcdGNvbnN0IHBhZ2luYXRpb25EYXRhID0gYXdhaXQgYWxsTGlzdEJpbmRpbmcucmVxdWVzdENvbnRleHRzKHRvdGFsLCAxMDApLFxuXHRcdFx0XHRhZGRpdGlvbmFsRGF0YSA9IHBhZ2luYXRpb25EYXRhLm1hcCgoZGF0YTogVjRDb250ZXh0KSA9PiBkYXRhLmdldE9iamVjdCgpIGFzIEZpZWxkRGF0YVR5cGUpO1xuXHRcdFx0YWRkaXRpb25hbERhdGEuZm9yRWFjaChhc3luYyAoY29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGUpID0+IHtcblx0XHRcdFx0Y29uc3QgY29udGV4dCA9IChzb3VyY2UuZ2V0QmluZGluZyhcIml0ZW1zXCIpIGFzIE9EYXRhTGlzdEJpbmRpbmcpLmNyZWF0ZShjb250ZXh0RGF0YSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCBjb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRpZiAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcigoZXJyb3IgYXMgQ29udGV4dEVycm9yVHlwZSkubmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn07XG5leHBvcnQgeyBBZGRpdGlvbmFsVmFsdWVHcm91cEtleSwgUmVjb21tZW5kYXRpb25WYWx1ZVR5cGUsIGFkZGl0aW9uYWxWYWx1ZUhlbHBlciB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7TUE0QktBLHVCQUF1QiwwQkFBdkJBLHVCQUF1QjtJQUF2QkEsdUJBQXVCO0lBQXZCQSx1QkFBdUI7SUFBdkJBLHVCQUF1QjtJQUFBLE9BQXZCQSx1QkFBdUI7RUFBQSxFQUF2QkEsdUJBQXVCO0VBQUFDLFFBQUEsQ0FBQUQsdUJBQUEsR0FBQUEsdUJBQUE7RUFzQjVCLE1BQU1FLHFCQUFxQixHQUFHO0lBQzdCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLG9DQUFvQyxFQUFFLGVBQUFBLENBQ3JDQyxnQkFBdUMsRUFDdkNDLG9CQUFzQyxFQUN0Q0Msb0JBQWdELEVBQ2hEQyxPQUF5QixFQUN6QkMsT0FBcUIsRUFDckJDLEtBQVksRUFJVjtNQUNGLElBQUlDLGNBQTRDO01BQ2hELE1BQU1DLDZCQUFxRCxHQUFHLEVBQUU7TUFDaEU7TUFDQSxNQUFNQywyQkFBMkIsR0FBRyxDQUNuQyxHQUFHUixnQkFBZ0IsQ0FBQ1MsTUFBTSxDQUFFQyxLQUFLLElBQUtBLEtBQUssQ0FBQ0MsUUFBUSxLQUFLZix1QkFBdUIsQ0FBQ2dCLGNBQWMsQ0FBQyxDQUNoRyxDQUFDQyxPQUFPLENBQUMsQ0FBQzs7TUFFWDtNQUNDWCxvQkFBb0IsQ0FBQ1ksVUFBVSxDQUEyQkMs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
536
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBZGRpdGlvbmFsVmFsdWVHcm91cEtleSIsIl9leHBvcnRzIiwiYWRkaXRpb25hbFZhbHVlSGVscGVyIiwicmVxdWVzdEZvckFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIiwiYWRkaXRpb25hbFZhbHVlcyIsInZhbHVlSGVscExpc3RCaW5kaW5nIiwidmFsdWVIZWxwQmluZGluZ0luZm8iLCJwYXlsb2FkIiwic29ydGVycyIsInRhYmxlIiwiYWxsTGlzdEJpbmRpbmciLCJhZGRpdGlvbmFsVmFsdWVDb250ZXh0UHJvbWlzZSIsInJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcyIsImZpbHRlciIsInZhbHVlIiwiZ3JvdXBLZXkiLCJyZWNvbW1lbmRhdGlvbiIsInJldmVyc2UiLCJwYXJhbWV0ZXJzIiwiJHNlbGVjdCIsInF1YWxpZmllcnMiLCJ2YWx1ZUhlbHBRdWFsaWZpZXIiLCJ2aFByb3BlcnRpZXMiLCJzZWFyY2hUZXJtIiwiJHNlYXJjaCIsImlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzIiwiJGNvdW50IiwibGlzdFNvcnRlcnMiLCJmb3JFYWNoIiwic29ydGVyIiwicHVzaCIsIlNvcnRlciIsIm5hbWUiLCJkZXNjZW5kaW5nIiwidmFsdWVIZWxwTGlzdE1vZGVsIiwiZ2V0TW9kZWwiLCJhZGRpdGlvbmFsVmFsdWVMaXN0QmluZGluZ3MiLCJnZXRBZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3MiLCJsZW5ndGgiLCJyZXF1ZXN0Q29udGV4dHMiLCJzdWJtaXRCYXRjaCIsImFkZGl0aW9uYWxWYWx1ZXNDb250ZXh0IiwiUHJvbWlzZSIsImFsbCIsImNvdW50IiwiZ2V0Q291bnQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNldFByb3BlcnR5IiwicmVjb21tZW5kYXRpb25Db250ZXh0cyIsImFsbENvbnRleHRzIiwicmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSIsIm1hcCIsImNvbnRleHQiLCJnZXRPYmplY3QiLCJvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSIsImFkZGl0aW9uYWxWYWx1ZUNvbnRleHRCaW5kaW5ncyIsInZhbHVlSGVscEZpbHRlcnMiLCJnZXRWYWx1ZUhlbHBCaW5kaW5nRmlsdGVycyIsImdldE1ldGFNb2RlbCIsInJlY29tbWVuZGF0aW9uVmFsdWVGaWx0ZXJzIiwiZ2V0QWRkaXRpb25hbFZhbHVlRmlsdGVycyIsImJpbmRMaXN0IiwicGF0aCIsInVuZGVmaW5lZCIsIm1ldGFNb2RlbCIsImZpbHRlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJhZGREcmFmdEZpbHRlciIsIm1ldGFDb250ZXh0IiwiZ2V0TWV0YUNvbnRleHQiLCJvYmplY3RQYXRoIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwiaXNEcmFmdFN1cHBvcnRlZCIsIk1vZGVsSGVscGVyIiwiaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQiLCJGaWx0ZXIiLCJvcGVyYXRvciIsInZhbHVlMSIsInJlc3VtZVZhbHVlTGlzdEJpbmRpbmdBbmRSZXNldENoYW5nZXMiLCJpc1N1c3BlbmRlZCIsInJlc3VtZUFzeW5jIiwicmVzZXRDaGFuZ2VzIiwiZXJyb3IiLCJzb3J0QW5kRmlsdGVyTGlzdEJpbmRpbmciLCJOT05FIiwiRmlsdGVyVHlwZSIsIkFwcGxpY2F0aW9uIiwibW9kaWZpZWRTb3J0ZXJzIiwiZ2V0U29ydGVyRnVuY3Rpb24iLCJzb3J0IiwicmV2ZXJzZUFkZGl0aW9uYWxWYWx1ZXMiLCJhZGRpdGlvbmFsVmFsdWUiLCJ2YWx1ZXMiLCJwcm9wZXJ0eVBhdGgiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImdldFByb3BlcnR5IiwiZ2V0VGV4dCIsInJlY2VudFZhbHVlIiwiY3JlYXRlVHJhbnNpZW50Q29udGV4dHNGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsInJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwiY3JlYXRlR3JvdXBlZFRyYW5zaWVudENvbnRleHRzIiwib3RoZXIiLCJhZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsImNvbnRleHREYXRhIiwiY3JlYXRlIiwiY3JlYXRlZCIsImNhbmNlbGVkIiwiTG9nIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMiLCJkYXRhIiwiYmluZGluZ0NvbnRleHQiLCJiaW5kaW5nUGF0aCIsInJlbGV2YW50UmVjb21tZW5kYXRpb25zIiwiT2JqZWN0Iiwia2V5cyIsImdldFJlY29tbWVuZGF0aW9uUHJvcGVydHlQYXRoIiwidmVyc2lvbiIsImdldEFkZGl0aW9uYWxWYWx1ZUZyb21Qcm9wZXJ0eVBhdGgiLCJ2YWx1ZURhdGEiLCJfY2hlY2tGb3JLZXlzSW5SZWNvbW1lbmRhdGlvbnMiLCJrZXlQcm9wZXJ0aWVzIiwia2V5IiwiZ2V0QWRkaXRpb25hbFZhbHVlRnJvbUtleXMiLCJyZWNvbW1lbmRhdGlvbkRhdGEiLCJyZXN1bHQiLCJyZWNEYXRhIiwiYWxsS2V5c01hdGNoIiwiX2dldFJlY29tbWVuZGF0aW9uIiwib2xkRGF0YSIsImFzc2lnbiIsImluY2x1ZGVzIiwicHJvcGVydHlQYXRocyIsInNwbGl0IiwibmF2UHJvcFBhdGgiLCJzcGxpY2UiLCJqb2luIiwic3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlciIsImdldFN0YW5kYXJkUmVjb21tZW5kYXRpb25zIiwiZ2V0UmVsZXZhbnRPdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSIsInZhbHVlSGVscEtleXMiLCJjaGVja1ZhbHVlc01hdGNoIiwiZ2V0UmVsZXZhbnRSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSIsImJpbmRpbmdJbmZvIiwicmVjZW50VmFsdWVzTW9kZWwiLCJKU09OTW9kZWwiLCJyZWNlbnRWYWx1ZXNMaXN0IiwiZ2V0QWxsQ3VycmVudENvbnRleHRzIiwicmVjZW50VmFsdWVDb250ZXh0RGF0YSIsImZpbHRlclJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwiY29udGV4dERhdGFUb0JlTWF0Y2hlZCIsImNvbnRleHREYXRhTGlzdCIsIm9iaiIsIm1hdGNoIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhIiwicmVjb21tZW5kYXRpb25WYWx1ZXMiLCJhcmd1bWVudHMiLCJ2YWx1ZUxpc3RQcm9wZXJ0eSIsInJlbGV2YW50UmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSIsImZvdW5kT2JqZWN0IiwiZmluZCIsInVwZGF0ZUZpbmlzaGVkIiwiZXZlbnQiLCJzb3VyY2UiLCJnZXRTb3VyY2UiLCJ0YWJsZUJpbmRpbmdDb250ZXh0IiwiYWN0dWFsIiwidG90YWwiLCJyZWFzb24iLCJnZXRQYXJhbWV0ZXJzIiwicGFnaW5hdGlvbkRhdGEiLCJhZGRpdGlvbmFsRGF0YSIsImdldEJpbmRpbmciXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkFkZGl0aW9uYWxWYWx1ZUhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUge1xuXHRJbkNvbXBsZXRlbmVzc0luZm9UeXBlLFxuXHRJbnRlcm5hbFByb3BlcnR5QWRkaXRpb25hbFZhbHVlLFxuXHRLZXlQcm9wZXJ0aWVzRGF0YVR5cGUsXG5cdFJlY29tbWVuZGF0aW9uRGF0YUZvck5hdlByb3BlcnR5VHlwZSxcblx0UmVjb21tZW5kYXRpb25WYWx1ZVR5cGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVjb21tZW5kYXRpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgUmVjb21tZW5kYXRpb25JbmZvLCBTdGFuZGFyZFJlY29tbWVuZGF0aW9uRGF0YVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFuZGFyZFJlY29tbWVuZGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgeyBzdGFuZGFyZFJlY29tbWVuZGF0aW9uSGVscGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZERhdGFUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1ZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgeyBTb3J0ZXJUeXBlLCBWYWx1ZUhlbHBQYXlsb2FkIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC9tL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIEV2ZW50UHJvdmlkZXIgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50UHJvdmlkZXJcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgTVRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9jb250ZW50L01UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJUeXBlIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyVHlwZVwiO1xuaW1wb3J0IFNvcnRlciBmcm9tIFwic2FwL3VpL21vZGVsL1NvcnRlclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHRFcnJvclR5cGUgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuXG5lbnVtIEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5IHtcblx0cmVjb21tZW5kYXRpb24gPSBcInJlY29tbWVuZGF0aW9uXCIsXG5cdHJlY2VudFZhbHVlID0gXCJyZWNlbnRWYWx1ZVwiLFxuXHRvdGhlciA9IFwib3RoZXJcIlxufVxuZXhwb3J0IHR5cGUgQWRkaXRpb25hbFZhbHVlVHlwZSA9IHtcblx0cHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdHZhbHVlczogKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pW107XG5cdGdyb3VwS2V5OiBBZGRpdGlvbmFsVmFsdWVHcm91cEtleTsgLy8gdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBncm91cFxufTtcbmV4cG9ydCB0eXBlIEJpbmRpbmdJbmZvUGFyYW1ldGVycyA9IHtcblx0JHNlbGVjdDogc3RyaW5nW107XG5cdCRleHBhbmQ/OiBzdHJpbmdbXTtcblx0JHNlYXJjaDogc3RyaW5nO1xuXHQkY291bnQ6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbiA9XG5cdHwgSW5Db21wbGV0ZW5lc3NJbmZvVHlwZVxuXHR8IFJlY29tbWVuZGF0aW9uRGF0YUZvck5hdlByb3BlcnR5VHlwZVtdXG5cdHwgSW50ZXJuYWxQcm9wZXJ0eUFkZGl0aW9uYWxWYWx1ZVxuXHR8IG9iamVjdDtcbmNvbnN0IGFkZGl0aW9uYWxWYWx1ZUhlbHBlciA9IHtcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIGNvbnRleHQgYmFzZWQgb24gYWRkaXRpb25hbCB2YWx1ZSBmaWx0ZXJzIGFuZCBjdXN0b20gc29ydGVyIGFuZCByZXF1ZXN0IGNvbnRleHRzIGZyb20gaXQuXG5cdCAqIEBwYXJhbSBhZGRpdGlvbmFsVmFsdWVzIEFycmF5IG9mIGFkZGl0aW9uYWwgdmFsdWVzXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBMaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIHZhbHVlSGVscEJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBvZiB0aGUgdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gc29ydGVycyBTb3J0ZXJzIG9mIHRoZSB2YWx1ZSBoZWxwIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gdGFibGUgVGFibGUgZm9yIHdoaWNoIHRoZSB2YWx1ZSBoZWxwIGlzIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBBZGRpdGlvbmFsIHZhbHVlIGNvbnRleHRzXG5cdCAqL1xuXHRyZXF1ZXN0Rm9yQWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGE6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRhZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW10sXG5cdFx0dmFsdWVIZWxwTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0dmFsdWVIZWxwQmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0c29ydGVyczogU29ydGVyVHlwZVtdLFxuXHRcdHRhYmxlOiBUYWJsZVxuXHQpOiBQcm9taXNlPHtcblx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW107XG5cdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXTtcblx0fT4ge1xuXHRcdGxldCBhbGxMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBhZGRpdGlvbmFsVmFsdWVDb250ZXh0UHJvbWlzZTogUHJvbWlzZTxWNENvbnRleHRbXT5bXSA9IFtdO1xuXHRcdC8vIHJldmVyc2UgdGhlIGFycmF5IHNvIHRoYXQgd2hpbGUgY3JlYXRpbmcgdHJhbnNpZW50IGNvbnRleHQgZmlyc3QgYWRkaXRpb25hbCB2YWx1ZSBpcyBncm91cGVkIGZpcnN0XG5cdFx0Y29uc3QgcmV2ZXJzZVJlY29tbWVuZGF0aW9uVmFsdWVzID0gW1xuXHRcdFx0Li4uYWRkaXRpb25hbFZhbHVlcy5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZS5ncm91cEtleSA9PT0gQWRkaXRpb25hbFZhbHVlR3JvdXBLZXkucmVjb21tZW5kYXRpb24pXG5cdFx0XS5yZXZlcnNlKCk7XG5cblx0XHQvLyBsb2dpYyB0byBhZGQgJHNlbGVjdCBmb3IgbXVsdGktbGV2ZWwgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIGZpbGxpbmcgJHNlbGVjdCBpcyBzdWZmaWNpZW50IGZvciB0aGUgbW9kZWwgdG8gY3JlYXRlIHRoZSBleHBhbmQgY2FsbHNcblx0XHQodmFsdWVIZWxwQmluZGluZ0luZm8ucGFyYW1ldGVycyBhcyBCaW5kaW5nSW5mb1BhcmFtZXRlcnMpLiRzZWxlY3QgPVxuXHRcdFx0cGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXS52aFByb3BlcnRpZXMgPz8gW107XG5cblx0XHQvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnkgaW5wdXQgaW4gdGhlIGZpZWxkXG5cdFx0Ly8gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGRldGVybWluZSB0byBzaG93IHRoZSBcIm90aGVyc1wiIHNlY3Rpb24gb3Igbm90XG5cdFx0Ly8gYW5kIGFsc28gdG8gZGV0ZXJtaW5lIGlmIHR5cGVBaGVhZCBzaG91bGQgb3BlbiBvciBub3Rcblx0XHRjb25zdCBzZWFyY2hUZXJtID0gKHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgYXMgQmluZGluZ0luZm9QYXJhbWV0ZXJzKS4kc2VhcmNoO1xuXHRcdCh2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXJhbWV0ZXJzIGFzIEJpbmRpbmdJbmZvUGFyYW1ldGVycykuJHNlYXJjaCA9IHNlYXJjaFRlcm07XG5cdFx0aWYgKHBheWxvYWQuaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdCh2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXJhbWV0ZXJzIGFzIEJpbmRpbmdJbmZvUGFyYW1ldGVycykuJGNvdW50ID0gdHJ1ZTtcblx0XHR9XG5cdFx0Y29uc3QgbGlzdFNvcnRlcnM6IFNvcnRlcltdID0gW107XG5cdFx0c29ydGVycy5mb3JFYWNoKChzb3J0ZXI6IFNvcnRlclR5cGUpID0+IGxpc3RTb3J0ZXJzLnB1c2gobmV3IFNvcnRlcihzb3J0ZXIubmFtZSA/PyBcIlwiLCBzb3J0ZXIuZGVzY2VuZGluZykpKTtcblx0XHRjb25zdCB2YWx1ZUhlbHBMaXN0TW9kZWw6IE9EYXRhTW9kZWwgPSB2YWx1ZUhlbHBMaXN0QmluZGluZy5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0Ly8gZ2V0IHRoZSBsaXN0IGJpbmRpbmcgZm9yIHJlY29tbWVuZGF0aW9uIHZhbHVlcyBhbmQgb3RoZXJzIHZhbHVlc1xuXHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZUxpc3RCaW5kaW5nczogT0RhdGFMaXN0QmluZGluZ1tdID0gdGhpcy5nZXRBZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3MoXG5cdFx0XHRyZXZlcnNlUmVjb21tZW5kYXRpb25WYWx1ZXMsXG5cdFx0XHRzZWFyY2hUZXJtLFxuXHRcdFx0cGF5bG9hZCxcblx0XHRcdHZhbHVlSGVscExpc3RNb2RlbCxcblx0XHRcdHZhbHVlSGVscEJpbmRpbmdJbmZvLFxuXHRcdFx0bGlzdFNvcnRlcnNcblx0XHQpO1xuXHRcdGlmIChhZGRpdGlvbmFsVmFsdWVMaXN0QmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKGFkZGl0aW9uYWxWYWx1ZUxpc3RCaW5kaW5ncy5sZW5ndGggPT09IDIpIHtcblx0XHRcdFx0YWRkaXRpb25hbFZhbHVlQ29udGV4dFByb21pc2UucHVzaChhZGRpdGlvbmFsVmFsdWVMaXN0QmluZGluZ3NbMF0ucmVxdWVzdENvbnRleHRzKDAsIDEwLCBcImFkZGl0aW9uYWxWYWx1ZVwiKSk7XG5cdFx0XHRcdGFsbExpc3RCaW5kaW5nID0gYWRkaXRpb25hbFZhbHVlTGlzdEJpbmRpbmdzWzFdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YWxsTGlzdEJpbmRpbmcgPSBhZGRpdGlvbmFsVmFsdWVMaXN0QmluZGluZ3NbMF07XG5cdFx0XHR9XG5cdFx0XHQvLyBpbiBjYXNlIG9mIGRyb3Bkb3duLCB3ZSBmZXRjaCBmaXJzdCAxMDAgcmVjb3JkcyBvbiBmaXJzdCBsb2FkIGFuZCB0aGVuIG1ha2Ugc3Vic2VxdWVudCByZXF1ZXN0cyB1cG9uIHVzZXIncyBzY3JvbGwuXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVDb250ZXh0UHJvbWlzZS5wdXNoKFxuXHRcdFx0XHRhbGxMaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgcGF5bG9hZC5pc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcyA/IDEwMCA6IDEwLCBcImFkZGl0aW9uYWxWYWx1ZVwiKVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0YXdhaXQgdmFsdWVIZWxwTGlzdE1vZGVsLnN1Ym1pdEJhdGNoKFwiYWRkaXRpb25hbFZhbHVlXCIpO1xuXHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZXNDb250ZXh0ID0gYXdhaXQgUHJvbWlzZS5hbGwoYWRkaXRpb25hbFZhbHVlQ29udGV4dFByb21pc2UpO1xuXHRcdC8vIHdlIHN0b3JlIHRoaXMgbGlzdCBiaW5kaW5ncyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIG1ha2Ugc3Vic2VxdWVudCByZXF1ZXN0cyBvbiB1c2VyJ3Mgc2Nyb2xsXG5cdFx0Y29uc3QgY291bnQgPSBhbGxMaXN0QmluZGluZz8uZ2V0Q291bnQoKTtcblx0XHRpZiAoY291bnQgJiYgY291bnQgPiAxMDApIHtcblx0XHRcdHRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LnNldFByb3BlcnR5KFwiYWxsTGlzdEJpbmRpbmdcIiwgYWxsTGlzdEJpbmRpbmcpO1xuXHRcdH1cblx0XHRsZXQgcmVjb21tZW5kYXRpb25Db250ZXh0czogVjRDb250ZXh0W10gPSBbXSxcblx0XHRcdGFsbENvbnRleHRzOiBWNENvbnRleHRbXSA9IFtdO1xuXHRcdGlmIChyZXZlcnNlUmVjb21tZW5kYXRpb25WYWx1ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0cmVjb21tZW5kYXRpb25Db250ZXh0cyA9IGFkZGl0aW9uYWxWYWx1ZXNDb250ZXh0WzBdO1xuXHRcdFx0aWYgKHNlYXJjaFRlcm0gfHwgcGF5bG9hZC5pc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcykge1xuXHRcdFx0XHRhbGxDb250ZXh0cyA9IGFkZGl0aW9uYWxWYWx1ZXNDb250ZXh0WzFdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoc2VhcmNoVGVybSB8fCBwYXlsb2FkLmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzKSB7XG5cdFx0XHRhbGxDb250ZXh0cyA9IGFkZGl0aW9uYWxWYWx1ZXNDb250ZXh0WzBdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEgPSByZWNvbW1lbmRhdGlvbkNvbnRleHRzLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRPYmplY3QoKSBhcyBGaWVsZERhdGFUeXBlKTtcblx0XHRjb25zdCBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdID0gYWxsQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldE9iamVjdCgpIGFzIEZpZWxkRGF0YVR5cGUpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YVxuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gcmV0cmlldmUgYWxsIHJlbGV2YW50IGxpc3QgYmluZGluZ3MgKHJlY29tbWVuZGF0aW9uIGFuZCBvdGhlcnMpIHRoYXQgaXMgbmVlZGVkIHRvIG1ha2UgYSBiYWNrZW5kIGNhbGwuXG5cdCAqIEBwYXJhbSByZXZlcnNlUmVjb21tZW5kYXRpb25WYWx1ZXMgUmV2ZXJzZWQgcmVjb21tZW5kYXRpb24gdmFsdWVzXG5cdCAqIEBwYXJhbSBzZWFyY2hUZXJtIFNlYXJjaCB0ZXJtIGVudGVyZWQgYnkgdGhlIHVzZXJcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBvZiB0aGUgdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwTGlzdE1vZGVsIE1vZGVsIG9mIHRoZSB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBCaW5kaW5nSW5mbyBCaW5kaW5nIGluZm8gb2YgdGhlIHZhbHVlIGhlbHBcblx0ICogQHBhcmFtIHNvcnRlciBDdXN0b20gc29ydGVyIHdoaWNoIG5lZWRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcmV0dXJucyBBbGwgdGhlIGxpc3QgYmluZGluZyB3aGljaCB3b3VsZCBiZSB1c2VkIHRvIHRyaWdnZXIgY2FsbHMgdG8gdGhlIGJhY2tlbmQuXG5cdCAqL1xuXHRnZXRBZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3M6IGZ1bmN0aW9uIChcblx0XHRyZXZlcnNlUmVjb21tZW5kYXRpb25WYWx1ZXM6IEFkZGl0aW9uYWxWYWx1ZVR5cGVbXSxcblx0XHRzZWFyY2hUZXJtOiBzdHJpbmcsXG5cdFx0cGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCxcblx0XHR2YWx1ZUhlbHBMaXN0TW9kZWw6IE9EYXRhTW9kZWwsXG5cdFx0dmFsdWVIZWxwQmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdHNvcnRlcjogU29ydGVyW11cblx0KTogT0RhdGFMaXN0QmluZGluZ1tdIHtcblx0XHRjb25zdCBhZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3M6IE9EYXRhTGlzdEJpbmRpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IHZhbHVlSGVscEZpbHRlcnM6IEZpbHRlcltdID0gW1xuXHRcdFx0Li4udGhpcy5nZXRWYWx1ZUhlbHBCaW5kaW5nRmlsdGVycyh2YWx1ZUhlbHBCaW5kaW5nSW5mbywgcGF5bG9hZCwgdmFsdWVIZWxwTGlzdE1vZGVsLmdldE1ldGFNb2RlbCgpKVxuXHRcdF07XG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25WYWx1ZUZpbHRlcnMgPSB0aGlzLmdldEFkZGl0aW9uYWxWYWx1ZUZpbHRlcnMocmV2ZXJzZVJlY29tbWVuZGF0aW9uVmFsdWVzLCBbLi4udmFsdWVIZWxwRmlsdGVyc10pO1xuXG5cdFx0aWYgKHJldmVyc2VSZWNvbW1lbmRhdGlvblZhbHVlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBiaW5kaW5nIHJlcHJlc2VudCByZWNvbW1lbmRhdGlvbiBsaXN0IGJpbmRpbmcuXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3MucHVzaChcblx0XHRcdFx0dmFsdWVIZWxwTGlzdE1vZGVsLmJpbmRMaXN0KFxuXHRcdFx0XHRcdHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhdGgsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvblZhbHVlRmlsdGVycyxcblx0XHRcdFx0XHR2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXJhbWV0ZXJzXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGlmIChzZWFyY2hUZXJtIHx8IHBheWxvYWQuaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdC8vIGJpbmRpbmcgcmVwcmVzZW50IGFsbCBkYXRhIGxpc3QgYmluZGluZ3MuXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVDb250ZXh0QmluZGluZ3MucHVzaChcblx0XHRcdFx0dmFsdWVIZWxwTGlzdE1vZGVsLmJpbmRMaXN0KHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhdGgsIHVuZGVmaW5lZCwgc29ydGVyLCB2YWx1ZUhlbHBGaWx0ZXJzLCB2YWx1ZUhlbHBCaW5kaW5nSW5mby5wYXJhbWV0ZXJzKVxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWRkaXRpb25hbFZhbHVlQ29udGV4dEJpbmRpbmdzO1xuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSB0byBmZXRjaCB0aGUgdmFsdWVoZWxwIGJpbmRpbmcgZmlsdGVycy5cblx0ICogQHBhcmFtIHZhbHVlSGVscEJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBvZiB0aGUgdmFsdWUgaGVscCB0byBjaGVjayBpZiBpdCdzIGEgZHJvcGRvd24gc2NlbmFyaW9cblx0ICogQHBhcmFtIG1ldGFNb2RlbCBUaGUgT0RhdGEgbWV0YSBtb2RlbCB0byByZXNvbHZlIGVudGl0eSBzZXQgZnJvbSBwYXRoXG5cdCAqIEByZXR1cm5zIEZpbHRlcnMgb2YgdmFsdWVoZWxwIGJpbmRpbmdcblx0ICovXG5cdGdldFZhbHVlSGVscEJpbmRpbmdGaWx0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0dmFsdWVIZWxwQmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdHBheWxvYWQ/OiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdG1ldGFNb2RlbD86IE9EYXRhTWV0YU1vZGVsXG5cdCk6IEZpbHRlcltdIHtcblx0XHRjb25zdCBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuXHRcdC8vIGdldCBhbGwgZXhpc3RpbmcgZmlsdGVycyBmcm9tIHRoZSBiaW5kaW5nIGluZm9cblx0XHQvLyB0aGlzICsgYWRkaXRpb25hbCB2YWx1ZSBmaWx0ZXJzIHdpbGwgYmUgdXNlZCBsYXRlciBvbiB0byBmZXRjaCBhZGRpdGlvbmFsIHZhbHVlcyBmcm9tIHRoZSBiYWNrZW5kXG5cdFx0aWYgKHZhbHVlSGVscEJpbmRpbmdJbmZvLmZpbHRlcnMpIHtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlSGVscEJpbmRpbmdJbmZvLmZpbHRlcnMpKSB7XG5cdFx0XHRcdGZpbHRlcnMucHVzaCguLi52YWx1ZUhlbHBCaW5kaW5nSW5mby5maWx0ZXJzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZpbHRlcnMucHVzaCh2YWx1ZUhlbHBCaW5kaW5nSW5mby5maWx0ZXJzKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gQWRkIGRyYWZ0IGZpbHRlciBmb3IgT0RhdGEgZHJhZnQtZW5hYmxlZCBlbnRpdGllc1xuXHRcdC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgZHJhZnQtZW5hYmxlZCBhbmQgYXBwbHkgSXNBY3RpdmVFbnRpdHkgPSB0cnVlIGZpbHRlclxuXHRcdHRoaXMuYWRkRHJhZnRGaWx0ZXIodmFsdWVIZWxwQmluZGluZ0luZm8sIGZpbHRlcnMsIHBheWxvYWQsIG1ldGFNb2RlbCk7XG5cdFx0cmV0dXJuIGZpbHRlcnM7XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBkcmFmdCBmaWx0ZXIgZm9yIE9EYXRhIGRyYWZ0LWVuYWJsZWQgZW50aXRpZXMuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBCaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBleGlzdGluZyBmaWx0ZXJzIGFycmF5IHRvIGFkZCB0aGUgZHJhZnQgZmlsdGVyIHRvXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgb2YgdGhlIHZhbHVlIGhlbHAgdG8gY2hlY2sgaWYgaXQncyBhIGRyb3Bkb3duIHNjZW5hcmlvXG5cdCAqIEBwYXJhbSBtZXRhTW9kZWwgVGhlIE9EYXRhIG1ldGEgbW9kZWwgdG8gcmVzb2x2ZSBlbnRpdHkgc2V0IGZyb20gcGF0aFxuXHQgKi9cblx0YWRkRHJhZnRGaWx0ZXI6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHBCaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0ZmlsdGVyczogRmlsdGVyW10sXG5cdFx0cGF5bG9hZD86IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0bWV0YU1vZGVsPzogT0RhdGFNZXRhTW9kZWxcblx0KTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlSGVscEJpbmRpbmdJbmZvLnBhdGggJiYgbWV0YU1vZGVsKSB7XG5cdFx0XHQvLyBHZXQgdGhlIEVudGl0eVNldCBmcm9tIHRoZSBwYXRoIHVzaW5nIE1ldGFNb2RlbFxuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQodmFsdWVIZWxwQmluZGluZ0luZm8ucGF0aCk7XG5cdFx0XHRjb25zdCBvYmplY3RQYXRoID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cblx0XHRcdC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgZHJhZnQtZW5hYmxlZCB1c2luZyBNb2RlbEhlbHBlclxuXHRcdFx0Ly8gVGhpcyBjb3ZlcnMgRHJhZnRSb290LCBEcmFmdE5vZGUsIGFuZCBjb250YWlubWVudCBzY2VuYXJpb3Ncblx0XHRcdGNvbnN0IGlzRHJhZnRTdXBwb3J0ZWQgPSBNb2RlbEhlbHBlci5pc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZChvYmplY3RQYXRoKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgaXQncyBhIGRyb3Bkb3duIHNjZW5hcmlvIChWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpXG5cdFx0XHRjb25zdCBpc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcyA9IHBheWxvYWQ/LmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzID8/IGZhbHNlO1xuXG5cdFx0XHQvLyBPbmx5IGFkZCBkcmFmdCBmaWx0ZXIgaWYgZW50aXR5IGlzIGRyYWZ0LWVuYWJsZWQgYW5kIGl0J3MgYSBkcm9wZG93biBzY2VuYXJpb1xuXHRcdFx0aWYgKGlzRHJhZnRTdXBwb3J0ZWQgJiYgaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdFx0Ly8gQWRkIElzQWN0aXZlRW50aXR5IGZpbHRlciBmb3IgZHJhZnQtZW5hYmxlZCBlbnRpdGllc1xuXHRcdFx0XHQvLyBUaGlzIGZpbHRlciBlbnN1cmVzIG9ubHkgYWN0aXZlIChub24tZHJhZnQpIGVudGl0aWVzIGFyZSBzaG93biBpbiB2YWx1ZSBoZWxwIGRyb3Bkb3duc1xuXHRcdFx0XHRmaWx0ZXJzLnB1c2goXG5cdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBcIklzQWN0aXZlRW50aXR5XCIsXG5cdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0dmFsdWUxOiB0cnVlXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHJlc3VtZXMgdGhlIHN1c3BlbmRlZCBsaXN0IGJpbmRpbmcgYW5kIHRoZW4gcmVzZXRzIGNoYW5nZXMgb24gaXQuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBMaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICovXG5cdHJlc3VtZVZhbHVlTGlzdEJpbmRpbmdBbmRSZXNldENoYW5nZXM6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHBMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh2YWx1ZUhlbHBMaXN0QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRhd2FpdCB2YWx1ZUhlbHBMaXN0QmluZGluZy5yZXN1bWVBc3luYygpO1xuXHRcdH1cblx0XHQvLyBnZXQgcmlkIG9mIGV4aXN0aW5nIHRyYW5zaWVudCBjb250ZXh0cy5cblxuXHRcdC8vIGRlc3Ryb3lpbmcgY2F1c2VzIGlzc3VlcyBzb21ldGltZXMsIGNvbnRleHRzIGFyZSBub3QgYWx3YXlzIGF2YWlsYWJsZSB0byBkZXN0cm95IGJ1dCBhcHBlYXIgYWZ0ZXJ3YXJkcyBtYWdpY2FsbHlcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdmFsdWVIZWxwTGlzdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vV2UgZG8gbm90IGRvIGFueXRoaW5nIGhlcmUgYXMgd2Uga25vdyB0aGUgbW9kZWwgd2lsbCBhbHdheXMgdGhyb3cgYW4gZXJyb3IgYW5kIHRoaXMgd2lsbCBmaWxsIHVwIHRoZSBjb25zb2xlIHdpdGggZXJyb3JzLlxuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igc29ydGluZyBhbmQgZmlsdGVyaW5nIHRoZSBsaXN0IGJpbmRpbmcuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBMaXN0QmluZGluZyBMaXN0IEJpbmRpbmdcblx0ICogQHBhcmFtIHNvcnRlcnMgU29ydGVycyBvZiB0aGUgdmFsdWUgaGVscCBsaXN0IGJpbmRpbmdcblx0ICovXG5cdHNvcnRBbmRGaWx0ZXJMaXN0QmluZGluZzogZnVuY3Rpb24gKHZhbHVlSGVscExpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBzb3J0ZXJzOiBTb3J0ZXJUeXBlW10pOiB2b2lkIHtcblx0XHQvLyBJbiBvcmRlciB0byBub3Qgc2hvdyB0aGUgbGlzdCBhdCBhbGwsIHdlIHBhc3MgYW4gZW1wdHkgZmlsdGVyIHdoaWNoIHdvdWxkIHJlbmRlciBhbiBlbXB0eSBsaXN0XG5cdFx0dmFsdWVIZWxwTGlzdEJpbmRpbmcuZmlsdGVyKEZpbHRlci5OT05FLCBGaWx0ZXJUeXBlLkFwcGxpY2F0aW9uKTtcblxuXHRcdGlmIChzb3J0ZXJzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgbW9kaWZpZWRTb3J0ZXJzOiBTb3J0ZXJbXSA9IFtdO1xuXHRcdFx0c29ydGVycy5mb3JFYWNoKChzb3J0ZXI6IFNvcnRlclR5cGUpID0+XG5cdFx0XHRcdG1vZGlmaWVkU29ydGVycy5wdXNoKG5ldyBTb3J0ZXIoc29ydGVyLm5hbWUgPz8gXCJcIiwgc29ydGVyLmRlc2NlbmRpbmcsIHRoaXMuZ2V0U29ydGVyRnVuY3Rpb24pKVxuXHRcdFx0KTtcblx0XHRcdHZhbHVlSGVscExpc3RCaW5kaW5nLnNvcnQobW9kaWZpZWRTb3J0ZXJzKTtcblx0XHR9IGVsc2UgdmFsdWVIZWxwTGlzdEJpbmRpbmcuc29ydChuZXcgU29ydGVyKFwiXCIsIGZhbHNlLCB0aGlzLmdldFNvcnRlckZ1bmN0aW9uKSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9ucyBjcmVhdGVzIHRoZSBmaWx0ZXJzIGZvciBhZGRpdGlvbmFsIHZhbHVlcy5cblx0ICogQHBhcmFtIHJldmVyc2VBZGRpdGlvbmFsVmFsdWVzIEFycmF5IG9mIGFkZGl0aW9uYWwgdmFsdWVzIGluIHJldmVyc2Ugb3JkZXJcblx0ICogQHBhcmFtIGZpbHRlcnMgRXhpc3RpbmcgdmFsdWVoZWxwIGJpbmRpbmcgZmlsdGVyc1xuXHQgKiBAcmV0dXJucyBBZGRpdGlvbmFsIHZhbHVlIGZpbHRlcnNcblx0ICovXG5cdGdldEFkZGl0aW9uYWxWYWx1ZUZpbHRlcnM6IGZ1bmN0aW9uIChyZXZlcnNlQWRkaXRpb25hbFZhbHVlczogQWRkaXRpb25hbFZhbHVlVHlwZVtdLCBmaWx0ZXJzOiBGaWx0ZXJbXSk6IEZpbHRlcltdIHtcblx0XHRyZXZlcnNlQWRkaXRpb25hbFZhbHVlcy5mb3JFYWNoKChhZGRpdGlvbmFsVmFsdWUpID0+IHtcblx0XHRcdGlmIChhZGRpdGlvbmFsVmFsdWUudmFsdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29uc3QgdmFsdWVzID0gYWRkaXRpb25hbFZhbHVlLnZhbHVlcztcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gYWRkaXRpb25hbFZhbHVlLnByb3BlcnR5UGF0aDtcblx0XHRcdFx0Ly8gYWRkIGFkZGl0aW9uYWwgdmFsdWUgZmlsdGVycyB0byBleGlzdGluZyBmaWx0ZXJzIGZyb20gdGhlIGJpbmRpbmcgaW5mb1xuXHRcdFx0XHR2YWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcblx0XHRcdFx0XHQvLyB1cGRhdGUgdGhlIHZhbHVlIGhlbHAgYmluZGluZyBpbmZvIHRvIGdldCBhZGRpdGlvbmFsIHZhbHVlcyBmcm9tIHRoZSBiYWNrZW5kXG5cdFx0XHRcdFx0ZmlsdGVycy5wdXNoKFxuXHRcdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRcdHBhdGg6IHByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdFx0dmFsdWUxOiB2YWx1ZSxcblx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIlxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gZmlsdGVycztcblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgYSBjYWxsYmFjayB0byB0aGUgY3VzdG9tIHNvcnRlci5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiB0aGUgRmllbGRcblx0ICogQHJldHVybnMgR3JvdXAga2V5IHRoYXQgY2FuIGJlIHVzZWQgZm9yIHNvcnRpbmdcblx0ICovXG5cdGdldFNvcnRlckZ1bmN0aW9uOiBmdW5jdGlvbiAoY29udGV4dDogVjRDb250ZXh0KTogc3RyaW5nIHtcblx0XHQvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG5cdFx0Y29uc3QgcmVzb3VyY2VCdW5kbGUgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLm1hY3Jvc1wiKSE7XG5cdFx0Ly9nZXQgdGhlIGNsaWVudCBzaWRlIGFubm90YXRpb24gdG8gZmlndXJlIG91dCB0aGUgZ3JvdXAga2V5XG5cdFx0Y29uc3QgZ3JvdXBLZXkgPSBjb250ZXh0LmdldFByb3BlcnR5KFwiQCRmZS5hZGRpdGlvbmFsVmFsdWVHcm91cEtleVwiKSBhcyBBZGRpdGlvbmFsVmFsdWVHcm91cEtleTtcblx0XHRpZiAoZ3JvdXBLZXkgPT09IEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LnJlY29tbWVuZGF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIk1fQURESVRJT05BTFZBTFVFSEVMUEVSX1JFQ09NTUVOREFUSU9OU1wiKTtcblx0XHR9IGVsc2UgaWYgKGdyb3VwS2V5ID09PSBBZGRpdGlvbmFsVmFsdWVHcm91cEtleS5yZWNlbnRWYWx1ZSkge1xuXHRcdFx0cmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX0FERElUSU9OQUxWQUxVRUhFTFBFUl9SRUNFTlRWQUxVRVwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJNX0FERElUSU9OQUxWQUxVRUhFTFBFUl9PVEhFUlNcIik7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNyZWF0ZSB0cmFuc2llbnQgY29udGV4dHMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nIGZvciB0aGUgZ2l2ZW4gZGlmZmVyZW50IHR5cGVzIGFkZGl0aW9uYWwgdmFsdWUgY29udGV4dCBkYXRhLlxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSBSZWNvbW1lbmRhdGlvbiB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSBSZWNlbnQgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gb3RoZXJzVmFsdWVzQ29udGV4dERhdGEgT3RoZXIgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwTGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqL1xuXHRjcmVhdGVUcmFuc2llbnRDb250ZXh0c0ZvckFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhOiBmdW5jdGlvbiAoXG5cdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHR2YWx1ZUhlbHBMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZ1xuXHQpOiB2b2lkIHtcblx0XHR0aGlzLmNyZWF0ZUdyb3VwZWRUcmFuc2llbnRDb250ZXh0cyhvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSwgdmFsdWVIZWxwTGlzdEJpbmRpbmcsIEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5Lm90aGVyKTtcblx0XHR0aGlzLmNyZWF0ZUdyb3VwZWRUcmFuc2llbnRDb250ZXh0cyhyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSwgdmFsdWVIZWxwTGlzdEJpbmRpbmcsIEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LnJlY2VudFZhbHVlKTtcblx0XHR0aGlzLmNyZWF0ZUdyb3VwZWRUcmFuc2llbnRDb250ZXh0cyhyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLCB2YWx1ZUhlbHBMaXN0QmluZGluZywgQWRkaXRpb25hbFZhbHVlR3JvdXBLZXkucmVjb21tZW5kYXRpb24pO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNyZWF0ZSB0cmFuc2llbnQgY29udGV4dCBmb3IgdGhlIGdpdmVuIGFkZGl0aW9uYWwgdmFsdWUgY29udGV4dCBkYXRhLiBJdCBhbHNvIGFkZHMgYSBrZXkgZm9yIGVhY2ggY29udGV4dCB3aGljaCBpcyB1c2VkIHRvIGdyb3VwIHRoZSBuZXdseSBjcmVhdGVkIHRyYW5zaWVudCBjb250ZXh0cyBhY2NvcmRpbmdseS5cblx0ICogQHBhcmFtIGFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIEFkZGl0aW9uYWwgdmFsdWUgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBMaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGdyb3VwS2V5IEtleSB3aGljaCBpbmRpY2F0ZXMgdGhlIGdyb3VwIG9mIHRoZSBhZGRpdGlvbmFsIHZhbHVlIGNvbnRleHQgZGF0YVxuXHQgKi9cblx0Y3JlYXRlR3JvdXBlZFRyYW5zaWVudENvbnRleHRzOiBmdW5jdGlvbiAoXG5cdFx0YWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHR2YWx1ZUhlbHBMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRncm91cEtleTogQWRkaXRpb25hbFZhbHVlR3JvdXBLZXlcblx0KTogdm9pZCB7XG5cdFx0Ly8gcmV2ZXJzZSBvZiB0aGUgY29udGV4dCBkYXRhIGlzIHJlcXVpcmVkIHNvIHRoYXQgdGhlIGNvbnRleHQgd2hpY2ggbmVlZHMgdG8gYmUgc2hvd24gYmVsb3cgaW4gdGhlIGxpc3QgZ2V0cyBjcmVhdGVkIGZpcnN0XG5cdFx0Wy4uLmFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhXS5yZXZlcnNlKCkuZm9yRWFjaChhc3luYyAoY29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGUpID0+IHtcblx0XHRcdC8vIGdyb3VwS2V5IGlzIGFkZGVkIGluIG9yZGVyIHRvIHByb3Blcmx5IGdyb3VwIHRoZSB0cmFuc2llbnQgY29udGV4dHMgYW1vbmdzdCBhbGwgMyBncm91cHNcblx0XHRcdGNvbnRleHREYXRhW1wiQCRmZS5hZGRpdGlvbmFsVmFsdWVHcm91cEtleVwiXSA9IGdyb3VwS2V5O1xuXHRcdFx0Y29uc3QgY29udGV4dCA9IHZhbHVlSGVscExpc3RCaW5kaW5nLmNyZWF0ZShjb250ZXh0RGF0YSk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBjb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdC8vIEZvciB0cmFuc2llbnQgY29udGV4dHMgdGhlIGNhbmNlbGVkIGlzIHNldCB0byB0cnVlIGFuZCBmb3Igb3RoZXIgY2FzZXMgaXQgd2lsbCBiZSBmYWxzZS4gQXRsZWFzdCBpbiByZWNvbW1lbmRhdGlvbnNcblx0XHRcdFx0Ly8gdXNlIGNhc2Ugd2UgZG8gbm90IGZhY2UgdGhlIHNjZW5hcmlvIHdoZXJlIGNhbmNlbGVkIGlzIHNldCB0byBmYWxzZS4gRm9yIG5vdyB3ZSBhcmUganVzdCBsb2dnaW5nIHRoZSBlcnJvci5cblx0XHRcdFx0aWYgKCEoZXJyb3IgYXMgQ29udGV4dEVycm9yVHlwZSkuY2FuY2VsZWQpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoKGVycm9yIGFzIENvbnRleHRFcnJvclR5cGUpLm5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnMgZm9yIHRoZSB2YWx1ZWxpc3QuXG5cdCAqIEBwYXJhbSBkYXRhIE9iamVjdCBjb250YWluaW5nIHJlY29tbWVuZGF0aW9uIG1vZGVsIGRhdGFcblx0ICogQHBhcmFtIGJpbmRpbmdDb250ZXh0IEJpbmRpbmcgY29udGV4dCBvZiB0aGUgRmllbGRcblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBQcm9wZXJ0eSBQYXRoIG9mIHRoZSBGaWVsZFxuXHQgKiBAcGFyYW0gYmluZGluZ1BhdGhcblx0ICogQHJldHVybnMgUmVsZXZhbnQgcmVjb21tZW5kYXRpb25zIGZvciB0aGUgdmFsdWVsaXN0XG5cdCAqL1xuXHRnZXRSZWxldmFudFJlY29tbWVuZGF0aW9uczogZnVuY3Rpb24gKFxuXHRcdGRhdGE6IEluQ29tcGxldGVuZXNzSW5mb1R5cGUgfCBvYmplY3QsXG5cdFx0YmluZGluZ0NvbnRleHQ6IFY0Q29udGV4dCxcblx0XHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0XHRiaW5kaW5nUGF0aD86IHN0cmluZ1xuXHQpOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgdmFsdWVzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW107XG5cdFx0bGV0IHJlbGV2YW50UmVjb21tZW5kYXRpb25zOiBJbnRlcm5hbFByb3BlcnR5QWRkaXRpb25hbFZhbHVlIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL2dldCB0aGUgcmlnaHQgcHJvcGVydHkgcGF0aCBieSBlbGltaW5hdGluZyB0aGUgc3RhcnRpbmcgLyBhbmQgYWxzbyBtYWluIGVudGl0eXNldCBuYW1lXG5cdFx0XHRwcm9wZXJ0eVBhdGggPSB0aGlzLmdldFJlY29tbWVuZGF0aW9uUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aCk7XG5cdFx0XHRpZiAoKGRhdGEgYXMgUmVjb21tZW5kYXRpb25JbmZvKS52ZXJzaW9uID09PSAyLjAgJiYgYmluZGluZ1BhdGgpIHtcblx0XHRcdFx0cHJvcGVydHlQYXRoID0gYmluZGluZ1BhdGg7XG5cdFx0XHR9XG5cdFx0XHQvL2dldCB0aGUgcmVjb21tZW5kYXRpb25zIGJhc2VkIG9uIHByb3BlcnR5IHBhdGggYW5kIGJpbmRpbmcgY29udGV4dCBwYXNzZWRcblx0XHRcdHJlbGV2YW50UmVjb21tZW5kYXRpb25zID0gdGhpcy5nZXRBZGRpdGlvbmFsVmFsdWVGcm9tUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aCwgYmluZGluZ0NvbnRleHQsIGRhdGEpIGFzXG5cdFx0XHRcdHwgSW50ZXJuYWxQcm9wZXJ0eUFkZGl0aW9uYWxWYWx1ZVxuXHRcdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRcdC8vaWYgd2UgZ2V0IHJlY29tbWVuZGF0aW9ucyB0aGVuIHB1c2ggdGhlIHZhbHVlc1xuXHRcdFx0aWYgKHJlbGV2YW50UmVjb21tZW5kYXRpb25zICYmIE9iamVjdC5rZXlzKHJlbGV2YW50UmVjb21tZW5kYXRpb25zKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJlbGV2YW50UmVjb21tZW5kYXRpb25zLmFkZGl0aW9uYWxWYWx1ZXMuZm9yRWFjaCgodmFsdWVEYXRhOiBSZWNvbW1lbmRhdGlvblZhbHVlVHlwZSkgPT4ge1xuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKHZhbHVlRGF0YS52YWx1ZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9pZiByZWNvbW1lbmRhdGlvbnMgYXJlIG5vdCBmb3VuZCB0aGVuIHJldHVybiBudWxsXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRfY2hlY2tGb3JLZXlzSW5SZWNvbW1lbmRhdGlvbnM6IGZ1bmN0aW9uIChrZXlQcm9wZXJ0aWVzOiBLZXlQcm9wZXJ0aWVzRGF0YVR5cGUsIGNvbnRleHREYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4ga2V5UHJvcGVydGllcykge1xuXHRcdFx0aWYgKGtleVByb3BlcnRpZXNba2V5XSAhPT0gY29udGV4dERhdGFba2V5XSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSB0byBmZXRjaCB0aGUgZXhhY3Qgb2JqZWN0IGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IGNvbnRhaW5zIHJlbGV2YW50IHJlY29tbWVuZGF0aW9uRGF0YSBiYXNlZCBvbiBrZXlzLlxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25EYXRhIEFycmF5IGNvbnRhaW5pbmcgYWRkaXRpb25hbCB2YWx1ZXNcblx0ICogQHBhcmFtIGJpbmRpbmdDb250ZXh0IEJpbmRpbmcgY29udGV4dCBvZiB0aGUgRmllbGRcblx0ICogQHJldHVybnMgUmVsZXZhbnQgb2JqZWN0IGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGFkZGl0aW9uYWwgdmFsdWVcblx0ICovXG5cdGdldEFkZGl0aW9uYWxWYWx1ZUZyb21LZXlzOiBmdW5jdGlvbiAoXG5cdFx0cmVjb21tZW5kYXRpb25EYXRhOiBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbixcblx0XHRiaW5kaW5nQ29udGV4dD86IFY0Q29udGV4dCB8IENvbnRleHRcblx0KTogQWRkaXRpb25WYWx1ZURlZmluaXRpb24ge1xuXHRcdGNvbnN0IGNvbnRleHREYXRhID0gYmluZGluZ0NvbnRleHQ/LmdldE9iamVjdCgpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cdFx0bGV0IHJlc3VsdDogQWRkaXRpb25WYWx1ZURlZmluaXRpb24gPSB7fTtcblx0XHQvL2xvb3AgdGhyb3VnaCB0aGUgcmVjb21tZW5kYXRpb25EYXRhIGFuZCBjaGVjayBpZiB0aGUga2V5UHJvcGVydGllcyBtYXRjaCB3aXRoIHRoZSBiaW5kaW5nIGNvbnRleHQgZGF0YVxuXHRcdGlmIChiaW5kaW5nQ29udGV4dCAmJiBjb250ZXh0RGF0YSkge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkocmVjb21tZW5kYXRpb25EYXRhKSkge1xuXHRcdFx0XHQocmVjb21tZW5kYXRpb25EYXRhIGFzIFJlY29tbWVuZGF0aW9uRGF0YUZvck5hdlByb3BlcnR5VHlwZVtdKS5mb3JFYWNoKChyZWNEYXRhKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qga2V5UHJvcGVydGllcyA9IHJlY0RhdGEua2V5UHJvcGVydGllcyBhcyBLZXlQcm9wZXJ0aWVzRGF0YVR5cGU7XG5cdFx0XHRcdFx0Y29uc3QgYWxsS2V5c01hdGNoID0gdGhpcy5fY2hlY2tGb3JLZXlzSW5SZWNvbW1lbmRhdGlvbnMoa2V5UHJvcGVydGllcywgY29udGV4dERhdGEpO1xuXHRcdFx0XHRcdC8vaWYgZXZlcnkga2V5IHZhbHVlIG1hdGNoZXMgd2l0aCB0aGUgYmluZGluZyBjb250ZXh0IGRhdGEgdGhlbiBhc3NpZ24gaXQgdG8gcmVzdWx0IHdoaWNoIHdpbGwgYmUgcmV0dXJuZWRcblx0XHRcdFx0XHRpZiAoYWxsS2V5c01hdGNoKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHQgPSByZWNEYXRhIGFzIEFkZGl0aW9uVmFsdWVEZWZpbml0aW9uO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0X2dldFJlY29tbWVuZGF0aW9uOiBmdW5jdGlvbiAoXG5cdFx0cHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdFx0YmluZGluZ0NvbnRleHQ6IENvbnRleHQsXG5cdFx0cmVjb21tZW5kYXRpb25EYXRhOiBBZGRpdGlvblZhbHVlRGVmaW5pdGlvblxuXHQpOiBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbiB7XG5cdFx0Ly9jcmVhdGUgYSBjb3B5IG9mIHRoZSByZWNvbW1lbmRhdGlvbkRhdGEgdG8gc3RvcmUgaXRzIHByZXZpb3VzIHZhbHVlIGFzIGl0IHdpbGwgY2hhbmdlIGJlY2F1c2Ugb2YgdGhlIHJlY3Vyc2l2ZSBhcHByb2FjaFxuXHRcdGxldCBvbGREYXRhID0gT2JqZWN0LmFzc2lnbihyZWNvbW1lbmRhdGlvbkRhdGEsIHt9KTtcblx0XHQvL2NoZWNrIGlmIHByb3BlcnR5IHBhdGggZXhpc3RzIG9uIHRoZSByZWNvbW1lbmRhdGlvbkRhdGEgb2JqZWN0IGFuZCBpZiBzbyB0aGVuIHJldHVybiB0aGUgb2JqZWN0IHBvaW50aW5nIHRvIHRoZSBwcm9wZXJ0eSBwYXRoXG5cdFx0aWYgKE9iamVjdC5rZXlzKHJlY29tbWVuZGF0aW9uRGF0YSkuaW5jbHVkZXMocHJvcGVydHlQYXRoKSkge1xuXHRcdFx0cmV0dXJuIChyZWNvbW1lbmRhdGlvbkRhdGEgYXMgSW5Db21wbGV0ZW5lc3NJbmZvVHlwZSlbcHJvcGVydHlQYXRoXSBhcyBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly9pZiBwcm9wZXJ0eSBwYXRoIGlzIG5vdCBwcmVzZW50IHRoZW4gY2hlY2sgaWYgaXQgaXMgMTpuIG1hcHBpbmcgYW5kIHdlIG5lZWQgdG8gZG8gYSByZWN1cnNpdmUgYXBwcm9hY2ggdG8gbGFuZCBvbiB0aGUgZXhhY3Qgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlbGV2YW50IHJlY29tbWVuZGF0aW9uc1xuXHRcdFx0Ly9jb250aW51ZSB0aGUgd2hpbGUgbG9vcCB0aWxsIHRoZSBwcm9wZXJ0eSBwYXRoIGlzIGZvdW5kIGluIHRoZSBwcmV2aW91cyByZWNvbW1lbmRhdGlvbkRhdGFcblx0XHRcdHdoaWxlIChPYmplY3Qua2V5cyhvbGREYXRhKS5sZW5ndGggPiAwICYmICFPYmplY3Qua2V5cyhvbGREYXRhKS5pbmNsdWRlcyhwcm9wZXJ0eVBhdGgpKSB7XG5cdFx0XHRcdC8vIGFzIGl0IG1pZ2h0IGJlIDE6biBtYXBwaW5nIHNvIGZpcnN0IHNlcGVyYXRlIHRoZSBuYXZwcm9wIG5hbWUgYW5kIGFjdHVhbCBwcm9wIG5hbWUgdG8gbWFrZSBzdXJlIHdlIGZpbmQgdGhlIG5hdnByb3AgZmlyc3QgYW5kIHRoZW4gZnJvbSBpdHMgcG9pbnRpbmcgb2JqZWN0IHdlIGZpbmQgdGhlIHByb3BlcnR5IHBhdGhcblx0XHRcdFx0Ly9lZzogX0l0ZW0vTWF0ZXJpYWwgd2lsbCBiZSBmaXJzdCBkaXZpZGVkIGludG8gX0l0ZW0gYW5kIHdlIHNlYXJjaCBmb3IgaXQgYW5kIHRoZW4gZnJvbSBpdHMgcmVsZXZhbnQgb2JqZWN0IHdlIHNlYXJjaCBmb3IgTWF0ZXJpYWxcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlQYXRocyA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRcdGlmIChwcm9wZXJ0eVBhdGhzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHQvL2dldHRpbmcgdGhlIG5hdnByb3AgcGF0aFxuXHRcdFx0XHRcdGNvbnN0IG5hdlByb3BQYXRoID0gcHJvcGVydHlQYXRoc1swXTtcblx0XHRcdFx0XHQvL3JlbW92aW5nIHRoZSBuYXZwcm9wIHBhdGggZnJvbSBwcm9wZXJ0eXBhdGhzIHNvIHRoYXQgd2Ugb25seSBjaGVjayBmb3IgYWN0dWFsIHByb3BlcnR5IHBhdGhcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGhzLnNwbGljZSgwLCAxKTtcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eVBhdGhzLmpvaW4oXCIvXCIpO1xuXHRcdFx0XHRcdC8vdXNpbmcgZ2V0QWRkaXRpb25hbFZhbHVlRnJvbVByb3BlcnR5UGF0aCBhbmQgcGFzc2luZyBuYXZQcm9wUGF0aCB3ZSBnZXQgdGhlIGV4YWN0IGFycmF5IG9mIG9iamVjdHMgcG9pbnRpbmcgdG8gdGhlIG5hdlByb3Bcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbkRhdGEgPSB0aGlzLmdldEFkZGl0aW9uYWxWYWx1ZUZyb21Qcm9wZXJ0eVBhdGgoXG5cdFx0XHRcdFx0XHRuYXZQcm9wUGF0aCxcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdFx0cmVjb21tZW5kYXRpb25EYXRhXG5cdFx0XHRcdFx0KSBhcyBSZWNvbW1lbmRhdGlvbkRhdGFGb3JOYXZQcm9wZXJ0eVR5cGVbXTtcblx0XHRcdFx0XHQvL25vIHBhc3MgdGhlIGFycmF5IG9mIG9iamVjdHMgb2YgbmF2UHJvcCB0byBnZXRBZGRpdGlvbmFsVmFsdWVGcm9tS2V5cyBhbmQgZ2V0IHRoZSBleGFjdCBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgcmVjb21tZW5kYXRpb25EYXRhIGJhc2VkIG9uIGtleXNcblx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbkRhdGEgPSB0aGlzLmdldEFkZGl0aW9uYWxWYWx1ZUZyb21LZXlzKHJlY29tbWVuZGF0aW9uRGF0YSwgYmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRcdGlmIChPYmplY3Qua2V5cyhyZWNvbW1lbmRhdGlvbkRhdGEpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdC8vc2V0IHRoZSByZWNvbW1lbmRhdGlvbkRhdGEgdG8gb2xkRGF0YSBiZWZvcmUgYXNzaWduaW5nIHRoZSBuZXcgdmFsdWUgdG8gaXRcblx0XHRcdFx0XHRcdG9sZERhdGEgPSBPYmplY3QuYXNzaWduKHJlY29tbWVuZGF0aW9uRGF0YSwge30pO1xuXHRcdFx0XHRcdFx0Ly9oZXJlIHdlIGNoZWNrIGZvciB0aGUgYWN0dWFsIHByb3BlcnR5IHBhdGggZnJvbSB0aGUgb2JqZWN0IHdlIGZvdW5kIGZyb20gZ2V0QWRkaXRpb25hbFZhbHVlRnJvbUtleXNcblx0XHRcdFx0XHRcdC8vZWc6IE1hdGVyaWFsIGNhbiBiZSBmb3VuZCBpbiB0aGUgb2JqZWN0IHdoaWNoIGlzIHBhcnQgb2YgYXJyYXkgb2Ygb2JqZWN0cyBvZiBfSXRlbVxuXHRcdFx0XHRcdFx0cmVjb21tZW5kYXRpb25EYXRhID0gdGhpcy5nZXRBZGRpdGlvbmFsVmFsdWVGcm9tUHJvcGVydHlQYXRoKFxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRyZWNvbW1lbmRhdGlvbkRhdGFcblx0XHRcdFx0XHRcdCkgYXMgQWRkaXRpb25WYWx1ZURlZmluaXRpb247XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiB7fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25EYXRhO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUgYWRkaXRpb25hbCB2YWx1ZSBiYXNlZCBvbiBwcm9wZXJ0eSBwYXRoIGFuZCBiaW5kaW5nIGNvbnRleHQgcGFzc2VkLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIFByb3BlcnR5IHBhdGggb2YgdGhlIGZpZWxkXG5cdCAqIEBwYXJhbSBiaW5kaW5nQ29udGV4dCBCaW5kaW5nIGNvbnRleHQgb2YgdGhlIGZpZWxkXG5cdCAqIEBwYXJhbSByZWNvbW1lbmRhdGlvbkRhdGEgT2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCB2YWx1ZVxuXHQgKiBAcmV0dXJucyBBZGRpdGlvbmFsIHZhbHVlIGJhc2VkIG9uIHByb3BlcnR5IHBhdGggYW5kIGJpbmRpbmcgY29udGV4dCBwYXNzZWRcblx0ICovXG5cdGdldEFkZGl0aW9uYWxWYWx1ZUZyb21Qcm9wZXJ0eVBhdGg6IGZ1bmN0aW9uIChcblx0XHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0XHRiaW5kaW5nQ29udGV4dDogVjRDb250ZXh0IHwgQ29udGV4dCxcblx0XHRyZWNvbW1lbmRhdGlvbkRhdGE/OiBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbiB8IFJlY29tbWVuZGF0aW9uSW5mb1xuXHQpOiBBZGRpdGlvblZhbHVlRGVmaW5pdGlvbiB8IFN0YW5kYXJkUmVjb21tZW5kYXRpb25EYXRhVHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKChyZWNvbW1lbmRhdGlvbkRhdGEgYXMgUmVjb21tZW5kYXRpb25JbmZvKS52ZXJzaW9uID09PSAyKSB7XG5cdFx0XHRyZXR1cm4gc3RhbmRhcmRSZWNvbW1lbmRhdGlvbkhlbHBlci5nZXRTdGFuZGFyZFJlY29tbWVuZGF0aW9ucyhcblx0XHRcdFx0YmluZGluZ0NvbnRleHQsXG5cdFx0XHRcdHByb3BlcnR5UGF0aCxcblx0XHRcdFx0cmVjb21tZW5kYXRpb25EYXRhIGFzIFJlY29tbWVuZGF0aW9uSW5mb1xuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHJlY29tbWVuZGF0aW9uRGF0YSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2dldFJlY29tbWVuZGF0aW9uKHByb3BlcnR5UGF0aCwgYmluZGluZ0NvbnRleHQsIHJlY29tbWVuZGF0aW9uRGF0YSk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIG9mIHRoZSBmaWVsZCBieSByZW1vdmluZyB0aGUgbGVhZGluZyAnLycgYW5kIG1haW4gZW50aXR5IHNldCBuYW1lLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIFByb3BlcnR5IFBhdGggb2YgdGhlIEZpZWxkXG5cdCAqIEByZXR1cm5zIFByb3BlcnR5IHBhdGggb2YgdGhlIGZpZWxkIGJ5IHJlbW92aW5nIHRoZSBsZWFkaW5nICcvJyBhbmQgbWFpbiBlbnRpdHkgc2V0IG5hbWUuXG5cdCAqL1xuXHRnZXRSZWNvbW1lbmRhdGlvblByb3BlcnR5UGF0aDogZnVuY3Rpb24gKHByb3BlcnR5UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHQvL0ZpcnN0IHdlIHNwbGl0IHRoZSBwcm9wZXJ0eSBwYXRoIGJhc2VkIG9uIC9cblx0XHRjb25zdCBwcm9wZXJ0eVBhdGhzID0gcHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHQvL05vdyByZW1vdmUgdGhlIGZpcnN0IHR3byBlbGVtZW50cyBvZiB0aGUgYXJyYXkuIEFzIGZpcnN0IGVsZW1lbnQgd2lsbCBhbHdheXMgYmUgJycgYW5kIHNlY29uZCBlbGVtZW50IHdpbGwgYmUgbWFpbiBlbnRpdHkgc2V0IG5hbWVcblx0XHRwcm9wZXJ0eVBhdGhzLnNwbGljZSgwLCAyKTtcblx0XHQvL05vdyBqb2luIHRoZSByZW1haW5pbmcgZWxlbWVudHMgdG8gY3JlYXRlIGEgbmV3IHByb3BlcnR5IHBhdGggYW5kIHJldHVybiBpdFxuXHRcdHJldHVybiBwcm9wZXJ0eVBhdGhzLmpvaW4oXCIvXCIpO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGZpbHRlciBPdGhlcnMgdmFsdWVzIGNvbnRleHQgZGF0YSBhbmQgcmVtb3ZlIHZhbHVlcyB3aGljaCBhcmUgYWxzbyBwcmVzZW50IGluIFJlY2VudGx5IFVzZWQgYW5kIFJlY29tbWVuZGF0aW9uIGdyb3VwLlxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSBSZWNvbW1lbmRhdGlvbiB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdCAqIEBwYXJhbSByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSBSZWNlbnQgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gb3RoZXJzVmFsdWVzQ29udGV4dERhdGEgT3RoZXJzIHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIHZhbHVlSGVscEtleXMgVmFsdWVMaXN0UHJvcGVydHkgb2YgdGhlIHBheWxvYWRcblx0ICogQHJldHVybnMgT3RoZXJzIHZhbHVlcyBjb250ZXh0IGRhdGEuXG5cdCAqL1xuXHRnZXRSZWxldmFudE90aGVyc1ZhbHVlc0NvbnRleHREYXRhOiBmdW5jdGlvbiAoXG5cdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSxcblx0XHR2YWx1ZUhlbHBLZXlzOiBzdHJpbmdbXVxuXHQpOiBGaWVsZERhdGFUeXBlW10ge1xuXHRcdHJldHVybiBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YS5maWx0ZXIoXG5cdFx0XHQoY29udGV4dERhdGEpID0+XG5cdFx0XHRcdCF0aGlzLmNoZWNrVmFsdWVzTWF0Y2goY29udGV4dERhdGEsIHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsIHZhbHVlSGVscEtleXMpICYmXG5cdFx0XHRcdCF0aGlzLmNoZWNrVmFsdWVzTWF0Y2goY29udGV4dERhdGEsIHJlY2VudFZhbHVlc0NvbnRleHREYXRhLCB2YWx1ZUhlbHBLZXlzKVxuXHRcdCk7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gY2hlY2sgd2hldGhlciByZWNlbnQgdmFsdWVzIG1hdGNoZXMgZWl0aGVyIHdpdGggdGhlIHNlYXJjaCB0ZXJtIG9yIHdpdGggdGhlIG90aGVycyB2YWx1ZXMuXG5cdCAqIEBwYXJhbSBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSBPdGhlcnMgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gcmVjZW50VmFsdWVzQ29udGV4dERhdGEgUmVjZW50IHZhbHVlcyBjb250ZXh0IGRhdGFcblx0ICogQHBhcmFtIHZhbHVlSGVscEtleXMgVmFsdWVMaXN0UHJvcGVydHkgb2YgdGhlIHBheWxvYWRcblx0ICogQHBhcmFtIHNlYXJjaFRlcm0gU2VhcmNoIHRlcm0gZW50ZXJlZCBieSB0aGUgdXNlclxuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gQmluZGluZyBpbmZvIG9iamVjdCBvZiB0aGUgdmFsdWUgaGVscFxuXHQgKiBAcmV0dXJucyBSZWNlbnQgdmFsdWVzIGNvbnRleHQgZGF0YSB3aGljaCBuZWVkcyB0byBiZSBzaG93IGluIHRoZSBSZWNlbnRseSBVc2VkIGdyb3VwIGluIHRoZSB0eXBlIGFoZWFkIHN1Z2dlc3Rpb24gbGlzdC5cblx0ICovXG5cdGdldFJlbGV2YW50UmVjZW50VmFsdWVzQ29udGV4dERhdGE6IGZ1bmN0aW9uIChcblx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdLFxuXHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0dmFsdWVIZWxwS2V5czogc3RyaW5nW10sXG5cdFx0c2VhcmNoVGVybTogc3RyaW5nLFxuXHRcdGJpbmRpbmdJbmZvOiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mb1xuXHQpOiBGaWVsZERhdGFUeXBlW10ge1xuXHRcdC8vIGZpbHRlciBvdXQgcmVjZW50IHZhbHVlIGJhc2VkIG9uIGV4aXN0aW5nIHZhbHVlIGhlbHAgZmlsdGVyc1xuXHRcdGNvbnN0IHJlY2VudFZhbHVlc01vZGVsID0gbmV3IEpTT05Nb2RlbCh7IHJlY2VudFZhbHVlc0NvbnRleHREYXRhIH0pO1xuXHRcdGNvbnN0IHJlY2VudFZhbHVlc0xpc3QgPSByZWNlbnRWYWx1ZXNNb2RlbC5iaW5kTGlzdChcblx0XHRcdFwiL3JlY2VudFZhbHVlc0NvbnRleHREYXRhXCIsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR0aGlzLmdldFZhbHVlSGVscEJpbmRpbmdGaWx0ZXJzKGJpbmRpbmdJbmZvKVxuXHRcdCk7XG5cdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEgPSByZWNlbnRWYWx1ZXNMaXN0LmdldEFsbEN1cnJlbnRDb250ZXh0cygpLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRPYmplY3QoKSBhcyBGaWVsZERhdGFUeXBlKTtcblxuXHRcdC8vIGNvbnNpZGVyIG9ubHkgdGhvc2UgcmVjZW50IHZhbHVlcyB3aGljaCBlaXRoZXIgbWF0Y2hlcyB3aXRoIHRoZSBzZWFyY2ggdGVybSBvciB3aXRoIHRoZSByZXNwb25zZSByZWNlaXZlZCBmcm9tIGJhY2tlbmQgZm9yIHRoZSBPdGhlcnMgZ3JvdXAuXG5cdFx0Ly8gQm90aCB0aGUgZmlsdGVycyBuZWVkcyB0byBiZSBhcHBsaWVkIHNvIHRoYXQgc28gdGhhdCBvcmRlciBvZiB0aGUgcmVjZW50IHZhbHVlcyBkb2VzIG5vdCBjaGFuZ2UsIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgdGhlIG9yZGVyIGluIHdoaWNoXG5cdFx0Ly8gdGhlIGRhdGEgd291bGQgYmUgc2hvd24gaW4gdGhlIHR5cGUgYWhlYWQgc3VnZ2VzdGlvbiBsaXN0LlxuXHRcdHJldHVybiByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YS5maWx0ZXIoKHJlY2VudFZhbHVlQ29udGV4dERhdGEpID0+XG5cdFx0XHR0aGlzLmZpbHRlclJlY2VudFZhbHVlc0NvbnRleHREYXRhKHJlY2VudFZhbHVlQ29udGV4dERhdGEsIHNlYXJjaFRlcm0sIHZhbHVlSGVscEtleXMsIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhKVxuXHRcdCk7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gY2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gcmVjZW50IHZhbHVlIGNvbnRleHQgZGF0YSBtYXRjaGVzIHdpdGggdGhlIGdpdmVuIHNlYXJjaCB0ZXJtIG9yIHRoZSBvdGhlcnMgdmFsdWVzLlxuXHQgKiBAcGFyYW0gcmVjZW50VmFsdWVDb250ZXh0RGF0YSBSZWNlbnQgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gc2VhcmNoVGVybSBTZWFyY2ggdGVybSBlbnRlcmVkIGJ5IHRoZSB1c2VyXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHBLZXlzIFZhbHVlTGlzdFByb3BlcnR5IG9mIHRoZSBwYXlsb2FkXG5cdCAqIEBwYXJhbSBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSBPdGhlcnMgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBnaXZlbiByZWNlbnQgdmFsdWUgY29udGV4dCBzYXRpc2ZpZXMgdGhlIGZpbHRlciBjb25kaXRpb24uXG5cdCAqL1xuXHRmaWx0ZXJSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YTogZnVuY3Rpb24gKFxuXHRcdHJlY2VudFZhbHVlQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGUsXG5cdFx0c2VhcmNoVGVybTogc3RyaW5nLFxuXHRcdHZhbHVlSGVscEtleXM6IHN0cmluZ1tdLFxuXHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW11cblx0KTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gcmVjZW50VmFsdWVDb250ZXh0RGF0YSkge1xuXHRcdFx0aWYgKHR5cGVvZiByZWNlbnRWYWx1ZUNvbnRleHREYXRhW2tleV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRoaXMuZmlsdGVyUmVjZW50VmFsdWVzQ29udGV4dERhdGEoXG5cdFx0XHRcdFx0XHRyZWNlbnRWYWx1ZUNvbnRleHREYXRhW2tleV0gYXMgRmllbGREYXRhVHlwZSxcblx0XHRcdFx0XHRcdHNlYXJjaFRlcm0sXG5cdFx0XHRcdFx0XHR2YWx1ZUhlbHBLZXlzLFxuXHRcdFx0XHRcdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGFcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiByZWNlbnRWYWx1ZUNvbnRleHREYXRhW2tleV0gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCghc2VhcmNoVGVybSAmJiBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YS5sZW5ndGggPT09IDApIHx8IC8vIENhc2Ugd2hlcmUgZm9jdXMgaXMganVzdCBzZXQgdG8gdGhlIHZhbHVlIGhlbHAgZmllbGRcblx0XHRcdFx0XHQocmVjZW50VmFsdWVDb250ZXh0RGF0YVtrZXldIGFzIHN0cmluZykuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHxcblx0XHRcdFx0XHQodmFsdWVIZWxwS2V5cy5pbmNsdWRlcyhrZXkpICYmIHRoaXMuY2hlY2tWYWx1ZXNNYXRjaChyZWNlbnRWYWx1ZUNvbnRleHREYXRhLCBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSwgdmFsdWVIZWxwS2V5cykpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgdmFsdWVzIG9mIHNwZWNpZmllZCBrZXlzIGluIGNvbnRleHREYXRhVG9CZU1hdGNoZWQgbWF0Y2ggd2l0aCBhbnkgb2JqZWN0IGluIGNvbnRleHREYXRhTGlzdC5cblx0ICogQHBhcmFtIGNvbnRleHREYXRhVG9CZU1hdGNoZWQgVGhlIGNvbnRleHQgZGF0YSBvYmplY3QgdG8gY29tcGFyZVxuXHQgKiBAcGFyYW0gY29udGV4dERhdGFMaXN0IFRoZSBhcnJheSBvZiBjb250ZXh0IGRhdGEgb2JqZWN0cyB0byBjb21wYXJlIGFnYWluc3Rcblx0ICogQHBhcmFtIHZhbHVlSGVscEtleXMgVGhlIGtleXMgdG8gY29tcGFyZSBmcm9tIGNvbnRleHREYXRhVG9CZU1hdGNoZWQgd2l0aCBjb250ZXh0RGF0YUxpc3Qgb2JqZWN0c1xuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRydWUgaWYgYW55IG9iamVjdCBpbiBjb250ZXh0RGF0YUxpc3QgbWF0Y2hlcyB0aGUgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQga2V5cyBpbiBjb250ZXh0RGF0YVRvQmVNYXRjaGVkLCBvdGhlcndpc2UgZmFsc2UuXG5cdCAqL1xuXHRjaGVja1ZhbHVlc01hdGNoOiBmdW5jdGlvbiAoY29udGV4dERhdGFUb0JlTWF0Y2hlZDogRmllbGREYXRhVHlwZSwgY29udGV4dERhdGFMaXN0OiBGaWVsZERhdGFUeXBlW10sIHZhbHVlSGVscEtleXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCBvYmogb2YgY29udGV4dERhdGFMaXN0KSB7XG5cdFx0XHRsZXQgbWF0Y2ggPSB0cnVlO1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgb2YgdmFsdWVIZWxwS2V5cykge1xuXHRcdFx0XHQvLyBDaGVjayBpZiB0aGUgdmFsdWUgb2YgdGhlIGtleSBpbiByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YVxuXHRcdFx0XHQvLyBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUga2V5IGluIHRoZSBjdXJyZW50IG9iamVjdCBmcm9tIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhXG5cdFx0XHRcdGlmIChjb250ZXh0RGF0YVRvQmVNYXRjaGVkW2tleV0gIT09IG9ialtrZXldKSB7XG5cdFx0XHRcdFx0bWF0Y2ggPSBmYWxzZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG1hdGNoKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZWFycmFuZ2UgdGhlIGdpdmVuIGFkZGl0aW9uYWwgdmFsdWUgY29udGV4dCBkYXRhIGFzIHBlciB0aGUgY2hyb25vbG9naWNhbCBvcmRlciBvZiB0aGUgZ2l2ZW4gYWRkaXRpb25hbCB2YWx1ZXMuXG5cdCAqIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgdGhlIHJlY29tbWVuZGF0aW9uIGRhdGEgZmV0Y2hlZCBmcm9tIGJhY2tlbmQgYXJlIHNob3duIGluIHRoZSBzYW1lIG9yZGVyIG9mIHJlY29tbWVuZGF0aW9uIHZhbHVlcyBmZXRjaGVkIGZyb20gcmVjb21tZW5kYXRpb24gc2VydmljZS5cblx0ICogQHBhcmFtIHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEgUmVjb21tZW5kYXRpb24gdmFsdWVzIGNvbnRleHQgZGF0YVxuXHQgKiBAcGFyYW0gcmVjb21tZW5kYXRpb25WYWx1ZXMgUmVjb21tZW5kYXRpb24gdmFsdWVzXG5cdCAqIEBwYXJhbSB2YWx1ZUxpc3RQcm9wZXJ0eSBWYWx1ZSBsaXN0IHByb3BlcnR5IG9mIHRoZSB2YWx1ZSBoZWxwXG5cdCAqIEByZXR1cm5zIFJlY29tbWVuZGF0aW9uIHZhbHVlcyBjb250ZXh0IGRhdGEgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG5cdCAqL1xuXHRnZXRSZWxldmFudFJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGE6IGZ1bmN0aW9uIChcblx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW10sXG5cdFx0cmVjb21tZW5kYXRpb25WYWx1ZXM6IChzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKVtdID0gW10sXG5cdFx0dmFsdWVMaXN0UHJvcGVydHk6IHN0cmluZ1xuXHQpOiBGaWVsZERhdGFUeXBlW10ge1xuXHRcdGNvbnN0IHJlbGV2YW50UmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdID0gW107XG5cdFx0cmVjb21tZW5kYXRpb25WYWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcblx0XHRcdGNvbnN0IGZvdW5kT2JqZWN0ID0gcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YS5maW5kKChjb250ZXh0RGF0YSkgPT4gY29udGV4dERhdGFbdmFsdWVMaXN0UHJvcGVydHldID09PSB2YWx1ZSk7XG5cdFx0XHRpZiAoZm91bmRPYmplY3QpIHtcblx0XHRcdFx0cmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLnB1c2goZm91bmRPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHJlbGV2YW50UmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YTtcblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBtYWtlIGJhdGNoIGNhbGxzIHRvIHN1cHBvcnQgcGFnaW5hdGlvbi5cblx0ICogVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB0aGUgYWRkaXRpb25hbCBkYXRhIGZldGNoZWQgZnJvbSB0aGUgYmFja2VuZCBpcyBkaXNwbGF5ZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG5cdCAqIEBwYXJhbSBldmVudCBBbiBldmVudCBvYmplY3QgdGhhdCBjb25zaXN0cyBvZiBhbiBJRCwgc291cmNlLCBhbmQgYSBwYXJhbWV0ZXIgbWFwLlxuXHQgKi9cblx0dXBkYXRlRmluaXNoZWQ6IGFzeW5jIGZ1bmN0aW9uIG5hbWUoZXZlbnQ6IFVJNUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc291cmNlID0gZXZlbnQuZ2V0U291cmNlKCkgYXMgeyBzb3VyY2U/OiBFdmVudFByb3ZpZGVyIH0gYXMgTVRhYmxlO1xuXHRcdGNvbnN0IHRhYmxlQmluZGluZ0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgfCBudWxsID0gc291cmNlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIiksXG5cdFx0XHRhbGxMaXN0QmluZGluZyA9IHRhYmxlQmluZGluZ0NvbnRleHQ/LmdldFByb3BlcnR5KFwiYWxsTGlzdEJpbmRpbmdcIikgYXMgT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCB7IGFjdHVhbCwgdG90YWwsIHJlYXNvbiB9ID0gZXZlbnQuZ2V0UGFyYW1ldGVycygpIGFzIHsgYWN0dWFsOiBudW1iZXI7IHRvdGFsOiBudW1iZXI7IHJlYXNvbjogc3RyaW5nIH07XG5cdFx0Ly8gYXMgdXNlciBzY3JvbGxzIGRvd24gYW5kIG9uY2Ugd2UgcmVhY2ggZW5kIG9mIHRoZSBsaXN0LCB3ZSBmZXRjaCB0aGUgbmV4dCBzZXQgb2YgZGF0YSBmcm9tIHRoZSBiYWNrZW5kXG5cdFx0aWYgKGFsbExpc3RCaW5kaW5nICYmIHJlYXNvbiA9PT0gXCJHcm93aW5nXCIgJiYgYWN0dWFsID09PSB0b3RhbCkge1xuXHRcdFx0Y29uc3QgcGFnaW5hdGlvbkRhdGEgPSBhd2FpdCBhbGxMaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHModG90YWwsIDEwMCksXG5cdFx0XHRcdGFkZGl0aW9uYWxEYXRhID0gcGFnaW5hdGlvbkRhdGEubWFwKChkYXRhOiBWNENvbnRleHQpID0+IGRhdGEuZ2V0T2JqZWN0KCkgYXMgRmllbGREYXRhVHlwZSk7XG5cdFx0XHRhZGRpdGlvbmFsRGF0YS5mb3JFYWNoKGFzeW5jIChjb250ZXh0RGF0YTogRmllbGREYXRhVHlwZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0ID0gKHNvdXJjZS5nZXRCaW5kaW5nKFwiaXRlbXNcIikgYXMgT0RhdGFMaXN0QmluZGluZykuY3JlYXRlKGNvbnRleHREYXRhLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IGNvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdGlmIChlcnJvcikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKChlcnJvciBhcyBDb250ZXh0RXJyb3JUeXBlKS5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufTtcbmV4cG9ydCB7IEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LCBSZWNvbW1lbmRhdGlvblZhbHVlVHlwZSwgYWRkaXRpb25hbFZhbHVlSGVscGVyIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztNQStCS0EsdUJBQXVCLDBCQUF2QkEsdUJBQXVCO0lBQXZCQSx1QkFBdUI7SUFBdkJBLHVCQUF1QjtJQUF2QkEsdUJBQXVCO0lBQUEsT0FBdkJBLHVCQUF1QjtFQUFBLEVBQXZCQSx1QkFBdUI7RUFBQUMsUUFBQSxDQUFBRCx1QkFBQSxHQUFBQSx1QkFBQTtFQXNCNUIsTUFBTUUscUJBQXFCLEdBQUc7SUFDN0I7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0Msb0NBQW9DLEVBQUUsZUFBQUEsQ0FDckNDLGdCQUF1QyxFQUN2Q0Msb0JBQXNDLEVBQ3RDQyxvQkFBZ0QsRUFDaERDLE9BQXlCLEVBQ3pCQyxPQUFxQixFQUNyQkMsS0FBWSxFQUlWO01BQ0YsSUFBSUMsY0FBNEM7TUFDaEQsTUFBTUMsNkJBQXFELEdBQUcsRUFBRTtNQUNoRTtNQUNBLE1BQU1DLDJCQUEyQixHQUFHLENBQ25DLEdBQUdSLGdCQUFnQixDQUFDUyxNQUFNLENBQUVDLEtBQUssSUFBS0EsS0FBSyxDQUFDQyxRQUFRLEtBQUtmLHVCQUF1QixDQUFDZ0IsY0FBYyxDQUFDLENB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
@@ -1,4 +1,6 @@
1
1
  import Log from "sap/base/Log";
2
+ import * as MetaModelConverter from "sap/fe/core/converters/MetaModelConverter";
3
+ import ModelHelper from "sap/fe/core/helpers/ModelHelper";
2
4
  import type {
3
5
  InCompletenessInfoType,
4
6
  InternalPropertyAdditionalValue,
@@ -24,6 +26,7 @@ import JSONModel from "sap/ui/model/json/JSONModel";
24
26
  import type V4Context from "sap/ui/model/odata/v4/Context";
25
27
  import type { ContextErrorType } from "sap/ui/model/odata/v4/Context";
26
28
  import type ODataListBinding from "sap/ui/model/odata/v4/ODataListBinding";
29
+ import type ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
27
30
  import type ODataModel from "sap/ui/model/odata/v4/ODataModel";
28
31
 
29
32
  enum AdditionalValueGroupKey {
@@ -56,7 +59,7 @@ const additionalValueHelper = {
56
59
  * @param valueHelpBindingInfo The binding info object to be used to bind the list to the model
57
60
  * @param payload Payload of the value help
58
61
  * @param sorters Sorters of the value help list binding
59
- * @param field Field for which the value help is requested
62
+ * @param table Table for which the value help is requested
60
63
  * @returns Additional value contexts
61
64
  */
62
65
  requestForAdditionalValueContextData: async function (
@@ -158,7 +161,9 @@ const additionalValueHelper = {
158
161
  sorter: Sorter[]
159
162
  ): ODataListBinding[] {
160
163
  const additionalValueContextBindings: ODataListBinding[] = [];
161
- const valueHelpFilters: Filter[] = [...this.getValueHelpBindingFilters(valueHelpBindingInfo)];
164
+ const valueHelpFilters: Filter[] = [
165
+ ...this.getValueHelpBindingFilters(valueHelpBindingInfo, payload, valueHelpListModel.getMetaModel())
166
+ ];
162
167
  const recommendationValueFilters = this.getAdditionalValueFilters(reverseRecommendationValues, [...valueHelpFilters]);
163
168
 
164
169
  if (reverseRecommendationValues.length > 0) {
@@ -185,19 +190,68 @@ const additionalValueHelper = {
185
190
  /**
186
191
  * This function is responsible to fetch the valuehelp binding filters.
187
192
  * @param valueHelpBindingInfo The binding info object to be used to bind the list to the model
193
+ * @param payload Payload of the value help to check if it's a dropdown scenario
194
+ * @param metaModel The OData meta model to resolve entity set from path
188
195
  * @returns Filters of valuehelp binding
189
196
  */
190
- getValueHelpBindingFilters: function (valueHelpBindingInfo: BaseAggregationBindingInfo): Filter[] {
197
+ getValueHelpBindingFilters: function (
198
+ valueHelpBindingInfo: BaseAggregationBindingInfo,
199
+ payload?: ValueHelpPayload,
200
+ metaModel?: ODataMetaModel
201
+ ): Filter[] {
202
+ const filters: Filter[] = [];
191
203
  // get all existing filters from the binding info
192
204
  // this + additional value filters will be used later on to fetch additional values from the backend
193
205
  if (valueHelpBindingInfo.filters) {
194
206
  if (Array.isArray(valueHelpBindingInfo.filters)) {
195
- return valueHelpBindingInfo.filters;
207
+ filters.push(...valueHelpBindingInfo.filters);
196
208
  } else {
197
- return [valueHelpBindingInfo.filters];
209
+ filters.push(valueHelpBindingInfo.filters);
210
+ }
211
+ }
212
+ // Add draft filter for OData draft-enabled entities
213
+ // Check if the entity is draft-enabled and apply IsActiveEntity = true filter
214
+ this.addDraftFilter(valueHelpBindingInfo, filters, payload, metaModel);
215
+ return filters;
216
+ },
217
+ /**
218
+ * This function adds a draft filter for OData draft-enabled entities.
219
+ * @param valueHelpBindingInfo The binding info object to be used to bind the list to the model
220
+ * @param filters The existing filters array to add the draft filter to
221
+ * @param payload Payload of the value help to check if it's a dropdown scenario
222
+ * @param metaModel The OData meta model to resolve entity set from path
223
+ */
224
+ addDraftFilter: function (
225
+ valueHelpBindingInfo: BaseAggregationBindingInfo,
226
+ filters: Filter[],
227
+ payload?: ValueHelpPayload,
228
+ metaModel?: ODataMetaModel
229
+ ): void {
230
+ if (valueHelpBindingInfo.path && metaModel) {
231
+ // Get the EntitySet from the path using MetaModel
232
+ const metaContext = metaModel.getMetaContext(valueHelpBindingInfo.path);
233
+ const objectPath = MetaModelConverter.getInvolvedDataModelObjects(metaContext);
234
+
235
+ // Check if the entity is draft-enabled using ModelHelper
236
+ // This covers DraftRoot, DraftNode, and containment scenarios
237
+ const isDraftSupported = ModelHelper.isObjectPathDraftSupported(objectPath);
238
+
239
+ // Check if it's a dropdown scenario (ValueListWithFixedValues)
240
+ const isValueListWithFixedValues = payload?.isValueListWithFixedValues ?? false;
241
+
242
+ // Only add draft filter if entity is draft-enabled and it's a dropdown scenario
243
+ if (isDraftSupported && isValueListWithFixedValues) {
244
+ // Add IsActiveEntity filter for draft-enabled entities
245
+ // This filter ensures only active (non-draft) entities are shown in value help dropdowns
246
+ filters.push(
247
+ new Filter({
248
+ path: "IsActiveEntity",
249
+ operator: "EQ",
250
+ value1: true
251
+ })
252
+ );
198
253
  }
199
254
  }
200
- return [];
201
255
  },
202
256
  /**
203
257
  * This function resumes the suspended list binding and then resets changes on it.