@sapui5/sap.fe.macros 1.120.18 → 1.120.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.macros",
3
- "version": "1.120.18",
3
+ "version": "1.120.19",
4
4
  "description": "SAPUI5 Library sap.fe.macros",
5
5
  "keywords": [
6
6
  "sapui5",
@@ -6,7 +6,7 @@
6
6
  SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.120.18</version>
9
+ <version>1.120.19</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.macros</documentation>
12
12
 
@@ -161,7 +161,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
161
161
  // was successful?
162
162
  FieldAPI.handleChange(oEvent, oController);
163
163
  });
164
- oFEController.editFlow.syncTask(pValueResolved);
164
+
165
+ // For the EditFlow synchronization, we need to wait for the corresponding PATCH request to be sent, otherwise there could be e.g. action invoked in parallel with the PATCH request.
166
+ // This is done with a 0-timeout, to allow for the 'patchSent' event to be sent by the binding (then the internal edit flow synchronization kicks in with EditFlow.handlePatchSent).
167
+ const valueResolvedAndPatchSent = pValueResolved.then(async () => {
168
+ return new Promise(resolve => {
169
+ setTimeout(resolve, 0);
170
+ });
171
+ }).catch(() => {});
172
+ oFEController === null || oFEController === void 0 ? void 0 : oFEController.editFlow.syncTask(valueResolvedAndPatchSent);
165
173
 
166
174
  // if the context is transient, it means the request would fail anyway as the record does not exist in reality
167
175
  // TODO: should the request be made in future if the context is transient?
@@ -816,4 +824,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
816
824
  */
817
825
  return FieldRuntime;
818
826
  }, true);
819
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRDb2xsYWJvcmF0aW9uQmluZGluZyIsImZpZWxkIiwiYmluZGluZyIsImdldEJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZyIsImlzQSIsIm9WaWV3IiwiQ29tbW9uVXRpbHMiLCJnZXRUYXJnZXRWaWV3IiwiRmllbGRSdW50aW1lIiwidXBsb2FkUHJvbWlzZXMiLCJ1bmRlZmluZWQiLCJjcmVhdGluZ0luYWN0aXZlUm93Iiwib25EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGgiLCJvU291cmNlIiwib0NvbnRyb2xsZXIiLCJzTmF2UGF0aCIsIl9yb3V0aW5nIiwib0JpbmRpbmdDb250ZXh0Iiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZm5OYXZpZ2F0ZSIsIm9Db250ZXh0IiwibmF2aWdhdGVUb1RhcmdldCIsImdldFZpZXdEYXRhIiwiY29udmVydGVyVHlwZSIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiZ2V0Q29udHJvbGxlciIsIk5hdmlnYXRpb25UeXBlIiwiRm9yd2FyZE5hdmlnYXRpb24iLCJMb2ciLCJlcnJvciIsImlzRHJhZnRJbmRpY2F0b3JWaXNpYmxlIiwic1Byb3BlcnR5UGF0aCIsInNTZW1hbnRpY0tleUhhc0RyYWZ0SW5kaWNhdG9yIiwiSGFzRHJhZnRFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImhpZGVEcmFmdEluZm8iLCJvblZhbGlkYXRlRmllbGRHcm91cCIsIm9FdmVudCIsIm9GRUNvbnRyb2xsZXIiLCJfZ2V0RXh0ZW5zaW9uQ29udHJvbGxlciIsIl9zaWRlRWZmZWN0cyIsImhhbmRsZUZpZWxkR3JvdXBDaGFuZ2UiLCJfZmV0Y2hSZWNvbW1lbmRhdGlvbnMiLCJjb250cm9sbGVyIiwidmlldyIsImZpZWxkQmluZGluZ0NvbnRleHQiLCJyZWNvbW1lbmRhdGlvbnNDb250ZXh0IiwiZmllbGRCaW5kaW5nIiwiZmVDb250cm9sbGVyIiwidmFsdWVIZWxwSWQiLCJnZXRWYWx1ZUhlbHAiLCJpbmNsdWRlcyIsInRhYmxlSWQiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwidGFibGUiLCJieUlkIiwiY29udGV4dElkZW50aWZpZXIiLCJnZXRQYXJlbnQiLCJnZXRJZGVudGlmaWVyQ29sdW1uIiwicmVjb21tZW5kYXRpb25zIiwiZmV0Y2hBbmRBcHBseVJlY29tbWVuZGF0aW9uc09uRmllbGRDaGFuZ2UiLCJjb250ZXh0IiwiaGFuZGxlQ2hhbmdlIiwib1NvdXJjZUZpZWxkIiwiZ2V0U291cmNlIiwiYklzVHJhbnNpZW50IiwiaXNUcmFuc2llbnQiLCJwVmFsdWVSZXNvbHZlZCIsImdldFBhcmFtZXRlciIsIlByb21pc2UiLCJyZXNvbHZlIiwiYlZhbGlkIiwiZmllbGRWYWxpZGl0eSIsImdldEZpZWxkU3RhdGVPbkNoYW5nZSIsInN0YXRlIiwidGhlbiIsIm1QYXJhbWV0ZXJzIiwidmFsaWQiLCJGaWVsZEFQSSIsImhhbmRsZUZpZWxkQ2hhbmdlIiwiY2F0Y2giLCJkZWJ1ZyIsImVkaXRGbG93Iiwic3luY1Rhc2siLCJwcmVwYXJlRGVmZXJyZWRTaWRlRWZmZWN0c0ZvckZpZWxkIiwiYkNvbGxhYm9yYXRpb25FbmFibGVkIiwiQ29sbGFib3JhdGlvbkFjdGl2aXR5U3luYyIsImlzQ29ubmVjdGVkIiwiZGF0YSIsImdldEJpbmRpbmdJbmZvIiwicGFydHMiLCJmaWx0ZXIiLCJwYXJ0IiwicGF0aCIsIm1hcCIsImdldFBhdGgiLCJyZXRhaW5Bc3luY01lc3NhZ2VzIiwidXBkYXRlQ29sbGFib3JhdGlvbiIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiYXR0YWNoRXZlbnRPbmNlIiwic2VuZCIsImFjdGlvbiIsIkFjdGl2aXR5IiwiQ2hhbmdlIiwiY29udGVudCIsInJlbGVhc2VBc3luY01lc3NhZ2VzIiwiaGFuZGxlTGl2ZUNoYW5nZSIsImV2ZW50IiwiX3NlbmRDb2xsYWJvcmF0aW9uTWVzc2FnZUZvckZpbGVVcGxvYWRlciIsImZpbGVVcGxvYWRlciIsImJpbmRpbmdQYXRoIiwiZ2V0UHJvcGVydHkiLCJmdWxsUGF0aCIsImhhbmRsZU9wZW5VcGxvYWRlciIsIkxvY2siLCJoYW5kbGVDbG9zZVVwbG9hZGVyIiwiVW5sb2NrIiwibUZpZWxkU3RhdGUiLCJfaXNCaW5kaW5nU3RhdGVNZXNzYWdlcyIsIm9CaW5kaW5nIiwiZ2V0RGF0YVN0YXRlIiwiZ2V0SW52YWxpZFZhbHVlIiwiZ2V0Q29udGVudCIsIkZpZWxkV3JhcHBlciIsImdldE1ldGFkYXRhIiwiZ2V0TmFtZSIsImdldEVkaXRNb2RlIiwiZ2V0Q29udGVudEVkaXQiLCJiSXNWYWxpZCIsImdldE1heENvbmRpdGlvbnMiLCJvVmFsdWVCaW5kaW5nSW5mbyIsImdldFZhbHVlIiwiZmllbGRWYWx1ZSIsInZhbGlkaXR5IiwiX2ZuRml4SGFzaFF1ZXJ5U3RyaW5nIiwic0N1cnJlbnRIYXNoIiwic3BsaXQiLCJfZm5HZXRMaW5rSW5mb3JtYXRpb24iLCJfb1NvdXJjZSIsIl9vTGluayIsIl9zUHJvcGVydHlQYXRoIiwiX3NWYWx1ZSIsImZuU2V0QWN0aXZlIiwib01vZGVsIiwic1NlbWFudGljT2JqZWN0TmFtZSIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsIm9BcHBDb21wb25lbnQiLCJnZXRBcHBDb21wb25lbnQiLCJvU2hlbGxTZXJ2aWNlSGVscGVyIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInBHZXRMaW5rc1Byb21pc2UiLCJnZXRMaW5rc1dpdGhDYWNoZSIsInNlbWFudGljT2JqZWN0IiwiYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zIiwiZ2V0T2JqZWN0IiwiU2VtYW50aWNPYmplY3ROYW1lIiwiU2VtYW50aWNPYmplY3RGdWxsUGF0aCIsIk1ldGFNb2RlbCIsIkludGVybmFsTW9kZWxDb250ZXh0IiwiU2hlbGxTZXJ2aWNlSGVscGVyIiwiR2V0TGlua3NQcm9taXNlIiwiU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMiLCJfZm5RdWlja1ZpZXdIYXNOZXdDb25kaXRpb24iLCJvU2VtYW50aWNPYmplY3RQYXlsb2FkIiwiX29MaW5rSW5mbyIsImJSZXN1bHRpbmdOZXdDb25kaXRpb25Gb3JDb25kaXRpb25hbFdyYXBwZXIiLCJfZm5RdWlja1ZpZXdTZXROZXdDb25kaXRpb25Gb3JDb25kaXRpb25hbFdyYXBwZXIiLCJfb0ZpbmFsU2VtYW50aWNPYmplY3RzIiwic1RtcFBhdGgiLCJhU2VtYW50aWNPYmplY3RQYXRocyIsIk9iamVjdCIsImtleXMiLCJpUGF0aHNDb3VudCIsIl9mblVwZGF0ZVNlbWFudGljT2JqZWN0c1RhcmdldE1vZGVsIiwic1ZhbHVlIiwib0NvbnRyb2wiLCJiQWN0aXZlIiwic2V0QWN0aXZlIiwic2V0VGl0bGVBY3RpdmUiLCJvQ29uZGl0aW9uYWxXcmFwcGVyIiwic2V0Q29uZGl0aW9uIiwib0xpbmtJbmZvIiwiZ2V0SGFzaCIsInVwZGF0ZVNlbWFudGljVGFyZ2V0cyIsIm9GaW5hbFNlbWFudGljT2JqZWN0cyIsIm9FcnJvciIsIl9jaGVja0NvbnRyb2xIYXNNb2RlbEFuZEJpbmRpbmdDb250ZXh0IiwiX2NvbnRyb2wiLCJfY2hlY2tDdXN0b21EYXRhVmFsdWVCZWZvcmVVcGRhdGluZ1NlbWFudGljT2JqZWN0TW9kZWwiLCJwcm9wZXJ0eVBhdGgiLCJhQ3VzdG9tRGF0YSIsInNTZW1hbnRpY09iamVjdFBhdGhWYWx1ZSIsIm9WYWx1ZUJpbmRpbmciLCJfZm5DdXN0b21EYXRhVmFsdWVJc1N0cmluZyIsInNlbWFudGljT2JqZWN0UGF0aFZhbHVlIiwiY3VzdG9tRGF0YSIsImdldEtleSIsImluZGV4IiwiX29DaGFuZ2VFdmVudCIsIkxpbmtNb2RlbENvbnRleHRDaGFuZ2UiLCJzUHJvcGVydHkiLCJzUGF0aFRvUHJvcGVydHkiLCJjb250cm9sIiwibWRjTGluayIsImdldERlcGVuZGVudHMiLCJsZW5ndGgiLCJnZXRDdXN0b21EYXRhIiwib3BlbkV4dGVybmFsTGluayIsInNvdXJjZSIsIm9wZW5XaW5kb3ciLCJjcmVhdGVQb3BvdmVyV2l0aE5vVGFyZ2V0cyIsIm1kY0xpbmtJZCIsImdldElkIiwiaWxsdXN0cmF0ZWRNZXNzYWdlU2V0dGluZ3MiLCJ0aXRsZSIsImdldFJlc291cmNlTW9kZWwiLCJnZXRUZXh0IiwiZGVzY3JpcHRpb24iLCJlbmFibGVGb3JtYXR0ZWRUZXh0IiwiaWxsdXN0cmF0aW9uU2l6ZSIsImlsbHVzdHJhdGlvblR5cGUiLCJJbGx1c3RyYXRlZE1lc3NhZ2VUeXBlIiwiVGVudCIsImlsbHVzdHJhdGVkTWVzc2FnZSIsIklsbHVzdHJhdGVkTWVzc2FnZSIsInBvcG92ZXJTZXR0aW5ncyIsImhvcml6b250YWxTY3JvbGxpbmciLCJzaG93SGVhZGVyIiwiRGV2aWNlIiwic3lzdGVtIiwicGhvbmUiLCJwbGFjZW1lbnQiLCJtb2JpbGVsaWJyYXJ5IiwiUGxhY2VtZW50VHlwZSIsIkF1dG8iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsIlJlc3BvbnNpdmVQb3BvdmVyIiwib3BlbkxpbmsiLCJzYXBtTGluayIsImhSZWYiLCJnZXRUcmlnZ2VySHJlZiIsImxpbmtJdGVtcyIsInJldHJpZXZlTGlua0l0ZW1zIiwiZ2V0UGF5bG9hZCIsImhhc1F1aWNrVmlld0ZhY2V0cyIsInBvcG92ZXIiLCJhZGREZXBlbmRlbnQiLCJvcGVuQnkiLCJvcGVuIiwiYXBwQ29tcG9uZW50Iiwic2hlbGxTZXJ2aWNlIiwic2hlbGxIYXNoIiwicGFyc2VTaGVsbEhhc2giLCJuYXZBcmdzIiwidGFyZ2V0IiwicGFyYW1zIiwiS2VlcEFsaXZlSGVscGVyIiwic3RvcmVDb250cm9sUmVmcmVzaFN0cmF0ZWd5Rm9ySGFzaCIsImlzU3RpY2t5RWRpdE1vZGUiLCJ0b0V4dGVybmFsIiwibmV3SHJlZiIsImhyZWZGb3JFeHRlcm5hbEFzeW5jIiwicHJlc3NMaW5rIiwiZmluZEVsZW1lbnRzIiwiZWxlbSIsIm9GaWVsZEluZm8iLCJ1cGxvYWRTdHJlYW0iLCJGRUNvbnRyb2xsZXIiLCJmaWxlV3JhcHBlciIsInVwbG9hZFVybCIsImdldFVwbG9hZFVybCIsInNldFVJQnVzeSIsInNldFVwbG9hZFVybCIsInJlbW92ZUFsbEhlYWRlclBhcmFtZXRlcnMiLCJ0b2tlbiIsImdldEh0dHBIZWFkZXJzIiwiaGVhZGVyUGFyYW1ldGVyQ1NSRlRva2VuIiwiRmlsZVVwbG9hZGVyUGFyYW1ldGVyIiwic2V0TmFtZSIsInNldFZhbHVlIiwiYWRkSGVhZGVyUGFyYW1ldGVyIiwiZVRhZyIsImhlYWRlclBhcmFtZXRlckVUYWciLCJoZWFkZXJQYXJhbWV0ZXJBY2NlcHQiLCJ1cGxvYWRQcm9taXNlIiwicmVqZWN0IiwidXBsb2FkIiwiTWVzc2FnZUJveCIsImhhbmRsZVVwbG9hZENvbXBsZXRlIiwicHJvcGVydHlGaWxlTmFtZSIsInN0YXR1cyIsIk51bWJlciIsIl9kaXNwbGF5TWVzc2FnZUZvckZhaWxlZFVwbG9hZCIsIm5ld0VUYWciLCJldGFnIiwic2V0UHJvcGVydHkiLCJhdmF0YXIiLCJyZWZyZXNoQXZhdGFyQ2FjaGVCdXN0aW5nIiwiX2NhbGxTaWRlRWZmZWN0c0ZvclN0cmVhbSIsImlzQ29sbGFib3JhdGlvbkVuYWJsZWQiLCJub3RpZmljYXRpb25EYXRhIiwicHVzaCIsInNFcnJvciIsInNNZXNzYWdlVGV4dCIsIkpTT04iLCJwYXJzZSIsIm1lc3NhZ2UiLCJlIiwicmVtb3ZlU3RyZWFtIiwiZGVsZXRlQnV0dG9uIiwiZ2V0SWNvbkZvck1pbWVUeXBlIiwic01pbWVUeXBlIiwiSWNvblBvb2wiLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0Iiwic1Byb3BlcnR5VmFsdWUiLCJzUHJvcGVydHlGdWxsUGF0aCIsInNEaXNwbGF5Rm9ybWF0Iiwic1RleHRQcm9wZXJ0eSIsInNQcm9wZXJ0eU5hbWUiLCJDb21tb25IZWxwZXIiLCJyZXF1ZXN0VmFsdWVMaXN0SW5mbyIsIm1WYWx1ZUxpc3RJbmZvIiwib1ZhbHVlTGlzdEluZm8iLCJvVmFsdWVMaXN0TW9kZWwiLCIkbW9kZWwiLCJvTWV0YU1vZGVsVmFsdWVMaXN0Iiwib1BhcmFtV2l0aEtleSIsIlBhcmFtZXRlcnMiLCJmaW5kIiwib1BhcmFtZXRlciIsIkxvY2FsRGF0YVByb3BlcnR5IiwiJFByb3BlcnR5UGF0aCIsIlZhbHVlTGlzdFByb3BlcnR5IiwiRXJyb3IiLCJvVGV4dEFubm90YXRpb24iLCJDb2xsZWN0aW9uUGF0aCIsIiRQYXRoIiwib0ZpbHRlciIsIkZpbHRlciIsIm9wZXJhdG9yIiwidmFsdWUxIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkc2VsZWN0IiwicmVxdWVzdENvbnRleHRzIiwiYUNvbnRleHRzIiwic0Rlc2NyaXB0aW9uIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsInNNc2ciLCJoYW5kbGVUeXBlTWlzc21hdGNoIiwicmVzb3VyY2VNb2RlbCIsImRldGFpbHMiLCJnZXRQYXJhbWV0ZXJzIiwibWltZVR5cGUiLCJnZXRNaW1lVHlwZSIsInRvU3RyaW5nIiwicmVwbGFjZUFsbCIsImNvbnRlbnRXaWR0aCIsImhhbmRsZUZpbGVTaXplRXhjZWVkIiwiZ2V0TWF4aW11bUZpbGVTaXplIiwidG9GaXhlZCIsIl9jb250cm9sbGVyIiwic2hvd0NvbGxhYm9yYXRpb25FZGl0VXNlciIsIlJlc291cmNlTW9kZWxIZWxwZXIiLCJhZGRTdHlsZUNsYXNzIiwiZ2V0QmluZGluZ3MiLCJzdGFydHNXaXRoIiwiYWN0aXZpdGllcyIsImVkaXRpbmdBY3Rpdml0eSIsImFjdGl2aXR5Iiwia2V5IiwiZ2V0QWN0aXZpdHlLZXlGcm9tUGF0aCIsImRlc3Ryb3lDb250ZW50IiwiYWRkQ29udGVudCIsIkxhYmVsIiwidGV4dCIsIm5hbWUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkZpZWxkUnVudGltZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbGxhYm9yYXRpb25BY3Rpdml0eVN5bmMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgdHlwZSB7IFVzZXJBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCB7IEFjdGl2aXR5LCBnZXRBY3Rpdml0eUtleUZyb21QYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlV2l0aFVJNSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEtlZXBBbGl2ZUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9LZWVwQWxpdmVIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWxIZWxwZXIsIHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgRmllbGRXcmFwcGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NvbnRyb2xzL0ZpZWxkV3JhcHBlclwiO1xuaW1wb3J0IHR5cGUgRmlsZVdyYXBwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvY29udHJvbHMvRmlsZVdyYXBwZXJcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRBUElUeXBlIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRBUElcIjtcbmltcG9ydCBGaWVsZEFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZEFQSVwiO1xuaW1wb3J0IHR5cGUgQXZhdGFyIGZyb20gXCJzYXAvbS9BdmF0YXJcIjtcbmltcG9ydCB0eXBlIEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSB7ICRJbGx1c3RyYXRlZE1lc3NhZ2VTZXR0aW5ncyB9IGZyb20gXCJzYXAvbS9JbGx1c3RyYXRlZE1lc3NhZ2VcIjtcbmltcG9ydCBJbGx1c3RyYXRlZE1lc3NhZ2UgZnJvbSBcInNhcC9tL0lsbHVzdHJhdGVkTWVzc2FnZVwiO1xuaW1wb3J0IElsbHVzdHJhdGVkTWVzc2FnZVR5cGUgZnJvbSBcInNhcC9tL0lsbHVzdHJhdGVkTWVzc2FnZVR5cGVcIjtcbmltcG9ydCBMYWJlbCBmcm9tIFwic2FwL20vTGFiZWxcIjtcbmltcG9ydCB0eXBlIExpbmsgZnJvbSBcInNhcC9tL0xpbmtcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgdHlwZSB7ICRSZXNwb25zaXZlUG9wb3ZlclNldHRpbmdzIH0gZnJvbSBcInNhcC9tL1Jlc3BvbnNpdmVQb3BvdmVyXCI7XG5pbXBvcnQgUmVzcG9uc2l2ZVBvcG92ZXIgZnJvbSBcInNhcC9tL1Jlc3BvbnNpdmVQb3BvdmVyXCI7XG5pbXBvcnQgbW9iaWxlbGlicmFyeSBmcm9tIFwic2FwL20vbGlicmFyeVwiO1xuaW1wb3J0IERldmljZSBmcm9tIFwic2FwL3VpL0RldmljZVwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IHR5cGUgQ3VzdG9tRGF0YSBmcm9tIFwic2FwL3VpL2NvcmUvQ3VzdG9tRGF0YVwiO1xuaW1wb3J0IHR5cGUgRWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IEljb25Qb29sIGZyb20gXCJzYXAvdWkvY29yZS9JY29uUG9vbFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbGxlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZCRDaGFuZ2VFdmVudCB9IGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgTWRjTGluayB9IGZyb20gXCJzYXAvdWkvbWRjL0xpbmtcIjtcbmltcG9ydCB0eXBlIENvbXBvc2l0ZUJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9Db21wb3NpdGVCaW5kaW5nXCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBGaWxlVXBsb2FkZXIgZnJvbSBcInNhcC91aS91bmlmaWVkL0ZpbGVVcGxvYWRlclwiO1xuaW1wb3J0IHR5cGUgeyBGaWxlVXBsb2FkZXIkVXBsb2FkQ29tcGxldGVFdmVudCB9IGZyb20gXCJzYXAvdWkvdW5pZmllZC9GaWxlVXBsb2FkZXJcIjtcbmltcG9ydCBGaWxlVXBsb2FkZXJQYXJhbWV0ZXIgZnJvbSBcInNhcC91aS91bmlmaWVkL0ZpbGVVcGxvYWRlclBhcmFtZXRlclwiO1xuaW1wb3J0IG9wZW5XaW5kb3cgZnJvbSBcInNhcC91aS91dGlsL29wZW5XaW5kb3dcIjtcbmltcG9ydCB0eXBlIFRhYmxlQVBJIGZyb20gXCIuLi90YWJsZS9UYWJsZUFQSVwiO1xuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgdXNlZCBmb3IgY29sbGFib3JhdGlvbiBub3RpZmljYXRpb25zLlxuICpcbiAqIEBwYXJhbSBmaWVsZFxuICogQHJldHVybnMgVGhlIGJpbmRpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0Q29sbGFib3JhdGlvbkJpbmRpbmcoZmllbGQ6IENvbnRyb2wpOiBPRGF0YUxpc3RCaW5kaW5nIHwgT0RhdGFDb250ZXh0QmluZGluZyB7XG5cdGxldCBiaW5kaW5nID0gKGZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCkuZ2V0QmluZGluZygpO1xuXG5cdGlmICghYmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdGNvbnN0IG9WaWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0VmlldyhmaWVsZCk7XG5cdFx0YmluZGluZyA9IChvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpLmdldEJpbmRpbmcoKTtcblx0fVxuXG5cdHJldHVybiBiaW5kaW5nO1xufVxuLyoqXG4gKiBTdGF0aWMgY2xhc3MgdXNlZCBieSBcInNhcC51aS5tZGMuRmllbGRcIiBkdXJpbmcgcnVudGltZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGludGVybmFsL2V4cGVyaW1lbnRhbCB1c2UhXG4gKi9cbmNvbnN0IEZpZWxkUnVudGltZSA9IHtcblx0dXBsb2FkUHJvbWlzZXM6IHVuZGVmaW5lZCBhcyBhbnksXG5cdGNyZWF0aW5nSW5hY3RpdmVSb3c6IGZhbHNlLFxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VycyBhbiBpbnRlcm5hbCBuYXZpZ2F0aW9uIG9uIHRoZSBsaW5rIHBlcnRhaW5pbmcgdG8gRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1NvdXJjZSBTb3VyY2Ugb2YgdGhlIHByZXNzIGV2ZW50XG5cdCAqIEBwYXJhbSBvQ29udHJvbGxlciBJbnN0YW5jZSBvZiB0aGUgY29udHJvbGxlclxuXHQgKiBAcGFyYW0gc05hdlBhdGggVGhlIG5hdmlnYXRpb24gcGF0aFxuXHQgKi9cblx0b25EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6IGZ1bmN0aW9uIChvU291cmNlOiBDb250cm9sLCBvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsIHNOYXZQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAob0NvbnRyb2xsZXIuX3JvdXRpbmcpIHtcblx0XHRcdGxldCBvQmluZGluZ0NvbnRleHQgPSBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdGNvbnN0IG9WaWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0VmlldyhvU291cmNlKSxcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRmbk5hdmlnYXRlID0gZnVuY3Rpb24gKG9Db250ZXh0PzogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQgPSBvQ29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIuX3JvdXRpbmcubmF2aWdhdGVUb1RhcmdldChvQmluZGluZ0NvbnRleHQsIHNOYXZQYXRoLCB0cnVlKTtcblx0XHRcdFx0fTtcblx0XHRcdC8vIFNob3cgZHJhZnQgbG9zcyBjb25maXJtYXRpb24gZGlhbG9nIGluIGNhc2Ugb2YgT2JqZWN0IHBhZ2Vcblx0XHRcdGlmICgob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmNvbnZlcnRlclR5cGUgPT09IFwiT2JqZWN0UGFnZVwiICYmICFNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob01ldGFNb2RlbCkpIHtcblx0XHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdFx0Zm5OYXZpZ2F0ZSxcblx0XHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdG9WaWV3LmdldENvbnRyb2xsZXIoKSxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkZvcndhcmROYXZpZ2F0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmbk5hdmlnYXRlKCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XCJGaWVsZFJ1bnRpbWU6IE5vIHJvdXRpbmcgbGlzdGVuZXIgY29udHJvbGxlciBleHRlbnNpb24gZm91bmQuIEludGVybmFsIG5hdmlnYXRpb24gYWJvcnRlZC5cIixcblx0XHRcdFx0XCJzYXAuZmUubWFjcm9zLmZpZWxkLkZpZWxkUnVudGltZVwiLFxuXHRcdFx0XHRcIm9uRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoXCJcblx0XHRcdCk7XG5cdFx0fVxuXHR9LFxuXG5cdGlzRHJhZnRJbmRpY2F0b3JWaXNpYmxlOiBmdW5jdGlvbiAoXG5cdFx0c1Byb3BlcnR5UGF0aDogYW55LFxuXHRcdHNTZW1hbnRpY0tleUhhc0RyYWZ0SW5kaWNhdG9yOiBhbnksXG5cdFx0SGFzRHJhZnRFbnRpdHk6IGFueSxcblx0XHRJc0FjdGl2ZUVudGl0eTogYW55LFxuXHRcdGhpZGVEcmFmdEluZm86IGFueVxuXHQpIHtcblx0XHRpZiAoSXNBY3RpdmVFbnRpdHkgIT09IHVuZGVmaW5lZCAmJiBIYXNEcmFmdEVudGl0eSAhPT0gdW5kZWZpbmVkICYmICghSXNBY3RpdmVFbnRpdHkgfHwgSGFzRHJhZnRFbnRpdHkpICYmICFoaWRlRHJhZnRJbmZvKSB7XG5cdFx0XHRyZXR1cm4gc1Byb3BlcnR5UGF0aCA9PT0gc1NlbWFudGljS2V5SGFzRHJhZnRJbmRpY2F0b3I7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEhhbmRsZXIgZm9yIHRoZSB2YWxpZGF0ZUZpZWxkR3JvdXAgZXZlbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBvblZhbGlkYXRlRmllbGRHcm91cFxuXHQgKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGNvbnRyb2xsZXIgb2YgdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgZmllbGRcblx0ICogQHBhcmFtIG9FdmVudCBUaGUgZXZlbnQgb2JqZWN0IHBhc3NlZCBieSB0aGUgdmFsaWRhdGVGaWVsZEdyb3VwIGV2ZW50XG5cdCAqL1xuXHRvblZhbGlkYXRlRmllbGRHcm91cDogZnVuY3Rpb24gKG9Db250cm9sbGVyOiBvYmplY3QsIG9FdmVudDogb2JqZWN0KSB7XG5cdFx0Y29uc3Qgb0ZFQ29udHJvbGxlciA9IEZpZWxkUnVudGltZS5fZ2V0RXh0ZW5zaW9uQ29udHJvbGxlcihvQ29udHJvbGxlcik7XG5cdFx0b0ZFQ29udHJvbGxlci5fc2lkZUVmZmVjdHMuaGFuZGxlRmllbGRHcm91cENoYW5nZShvRXZlbnQpO1xuXHR9LFxuXG5cdF9mZXRjaFJlY29tbWVuZGF0aW9uczogZnVuY3Rpb24gKGZpZWxkOiBGaWVsZCwgY29udHJvbGxlcjogQ29udHJvbGxlcik6IHZvaWQge1xuXHRcdGNvbnN0IHZpZXcgPSBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KGZpZWxkKTtcblx0XHRjb25zdCBmaWVsZEJpbmRpbmdDb250ZXh0ID0gZmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRsZXQgcmVjb21tZW5kYXRpb25zQ29udGV4dDtcblxuXHRcdC8vIGRldGVybWluZSByZWNvbW1lbmRhdGlvbiBjb250ZXh0IHRvIHVzZVxuXHRcdGNvbnN0IGZpZWxkQmluZGluZyA9IChmaWVsZEJpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpPy5nZXRCaW5kaW5nKCk7XG5cblx0XHRpZiAoZmllbGRCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHQvLyBpbnNpZGUgYSB0YWJsZSwgdXNlIHRoZSByb3dcblx0XHRcdHJlY29tbWVuZGF0aW9uc0NvbnRleHQgPSBmaWVsZEJpbmRpbmdDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpbnNpZGUgYSBmb3JtIG5vd1xuXHRcdFx0Ly8gY2FuIGhhdmUgMS0xIG5hdmlnYXRpb24gcHJvcGVydHkvZGlyZWN0IHByb3BlcnR5IC0gdXNlIHZpZXcgY29udGV4dFxuXHRcdFx0cmVjb21tZW5kYXRpb25zQ29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHR9XG5cdFx0Y29uc3QgZmVDb250cm9sbGVyID0gRmllbGRSdW50aW1lLl9nZXRFeHRlbnNpb25Db250cm9sbGVyKGNvbnRyb2xsZXIpO1xuXHRcdGNvbnN0IHZhbHVlSGVscElkID0gZmllbGQuZ2V0VmFsdWVIZWxwKCk7XG5cdFx0aWYgKHZhbHVlSGVscElkICYmIHZhbHVlSGVscElkLmluY2x1ZGVzKFwiOjpUYWJsZVZhbHVlSGVscDo6XCIpKSB7XG5cdFx0XHRjb25zdCB0YWJsZUlkID0gdmFsdWVIZWxwSWQuc3Vic3RyaW5nKDAsIHZhbHVlSGVscElkLmluZGV4T2YoXCI6OlRhYmxlVmFsdWVIZWxwOjpcIikpO1xuXHRcdFx0Y29uc3QgdGFibGUgPSB2aWV3LmJ5SWQodGFibGVJZCk7XG5cdFx0XHRjb25zdCBjb250ZXh0SWRlbnRpZmllciA9ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpPy5nZXRJZGVudGlmaWVyQ29sdW1uKCk7XG5cdFx0XHRmZUNvbnRyb2xsZXIucmVjb21tZW5kYXRpb25zLmZldGNoQW5kQXBwbHlSZWNvbW1lbmRhdGlvbnNPbkZpZWxkQ2hhbmdlKGZpZWxkLCBbXG5cdFx0XHRcdHsgY29udGV4dDogcmVjb21tZW5kYXRpb25zQ29udGV4dCwgY29udGV4dElkZW50aWZpZXIgfVxuXHRcdFx0XSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZlQ29udHJvbGxlci5yZWNvbW1lbmRhdGlvbnMuZmV0Y2hBbmRBcHBseVJlY29tbWVuZGF0aW9uc09uRmllbGRDaGFuZ2UoZmllbGQsIFt7IGNvbnRleHQ6IHJlY29tbWVuZGF0aW9uc0NvbnRleHQgfV0pO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEhhbmRsZXIgZm9yIHRoZSBjaGFuZ2UgZXZlbnQuXG5cdCAqIFN0b3JlIGZpZWxkIGdyb3VwIElEcyBvZiB0aGlzIGZpZWxkIGZvciByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0cyB3aGVuIHJlcXVpcmVkLlxuXHQgKiBXZSBzdG9yZSB0aGVtIGhlcmUgdG8gZW5zdXJlIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBoYW5kbGVDaGFuZ2Vcblx0ICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBjb250cm9sbGVyIG9mIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIGZpZWxkXG5cdCAqIEBwYXJhbSBvRXZlbnQgVGhlIGV2ZW50IG9iamVjdCBwYXNzZWQgYnkgdGhlIGNoYW5nZSBldmVudFxuXHQgKi9cblx0aGFuZGxlQ2hhbmdlOiBmdW5jdGlvbiAob0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyLCBvRXZlbnQ6IEZpZWxkJENoYW5nZUV2ZW50ICYgRXZlbnQ8eyBpc1ZhbGlkOiBib29sZWFuIH0+KTogdm9pZCB7XG5cdFx0Y29uc3Qgb1NvdXJjZUZpZWxkID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIENvbnRyb2wsXG5cdFx0XHRiSXNUcmFuc2llbnQgPSBvU291cmNlRmllbGQgJiYgKG9Tb3VyY2VGaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIGFueSkuaXNUcmFuc2llbnQoKSxcblx0XHRcdHBWYWx1ZVJlc29sdmVkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInByb21pc2VcIikgfHwgUHJvbWlzZS5yZXNvbHZlKCksXG5cdFx0XHRvU291cmNlID0gb0V2ZW50LmdldFNvdXJjZSgpLFxuXHRcdFx0YlZhbGlkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInZhbGlkXCIpLFxuXHRcdFx0ZmllbGRWYWxpZGl0eSA9IHRoaXMuZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlKG9FdmVudCkuc3RhdGVbXCJ2YWxpZGl0eVwiXSxcblx0XHRcdGZpZWxkID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIENvbnRyb2w7XG5cblx0XHQvLyBVc2UgdGhlIEZFIENvbnRyb2xsZXIgaW5zdGVhZCBvZiB0aGUgZXh0ZW5zaW9uQVBJIHRvIGFjY2VzcyBpbnRlcm5hbCBGRSBjb250cm9sbGVyc1xuXHRcdGNvbnN0IG9GRUNvbnRyb2xsZXIgPSBGaWVsZFJ1bnRpbWUuX2dldEV4dGVuc2lvbkNvbnRyb2xsZXIob0NvbnRyb2xsZXIpO1xuXG5cdFx0Ly8gVE9ETzogY3VycmVudGx5IHdlIGhhdmUgdW5kZWZpbmVkIGFuZCB0cnVlLi4uIGFuZCBvdXIgY3JlYXRpb24gcm93IGltcGxlbWVudGF0aW9uIHJlbGllcyBvbiB0aGlzLlxuXHRcdC8vIEkgd291bGQgbW92ZSB0aGlzIGxvZ2ljIHRvIHRoaXMgcGxhY2UgYXMgaXQncyBoYXJkIHRvIHVuZGVyc3RhbmQgZm9yIGZpZWxkIGNvbnN1bWVyXG5cdFx0cFZhbHVlUmVzb2x2ZWRcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Ly8gVGhlIGV2ZW50IGlzIGdvbmUuIEZvciBub3cgd2UnbGwganVzdCByZWNyZWF0ZSBpdCBhZ2FpblxuXHRcdFx0XHQob0V2ZW50IGFzIGFueSkub1NvdXJjZSA9IG9Tb3VyY2U7XG5cdFx0XHRcdChvRXZlbnQgYXMgYW55KS5tUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0XHR2YWxpZDogYlZhbGlkXG5cdFx0XHRcdH07XG5cdFx0XHRcdChGaWVsZEFQSSBhcyBhbnkpLmhhbmRsZUNoYW5nZShvRXZlbnQsIG9Db250cm9sbGVyKTtcblx0XHRcdFx0aWYgKCFiSXNUcmFuc2llbnQpIHtcblx0XHRcdFx0XHQvLyB0cmlnZ2VyIHNpZGUgZWZmZWN0cyB3aXRob3V0IHJlZ2lzdGVyaW5nIGRlZmVycmVkIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHRcdC8vIGRlZmVycmVkIHNpZGUgZWZmZWN0cyBhcmUgYWxyZWFkeSByZWdpc3RlcmVkIGJ5IHByZXBhcmVEZWZlcnJlZFNpZGVFZmZlY3RzRm9yRmllbGQgYmVmb3JlIHBWYWx1ZVJlc29sdmVkIGlzIHJlc29sdmVkLlxuXHRcdFx0XHRcdG9GRUNvbnRyb2xsZXIuX3NpZGVFZmZlY3RzLmhhbmRsZUZpZWxkQ2hhbmdlKG9FdmVudCwgZmllbGRWYWxpZGl0eSwgcFZhbHVlUmVzb2x2ZWQsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFJlY29tbWVuZGF0aW9uc1xuXHRcdFx0XHRGaWVsZFJ1bnRpbWUuX2ZldGNoUmVjb21tZW5kYXRpb25zKGZpZWxkIGFzIEZpZWxkLCBvQ29udHJvbGxlcik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKC8qb0Vycm9yOiBhbnkqLykge1xuXHRcdFx0XHQvLyBUaGUgZXZlbnQgaXMgZ29uZS4gRm9yIG5vdyB3ZSdsbCBqdXN0IHJlY3JlYXRlIGl0IGFnYWluXG5cdFx0XHRcdChvRXZlbnQgYXMgYW55KS5vU291cmNlID0gb1NvdXJjZTtcblx0XHRcdFx0KG9FdmVudCBhcyBhbnkpLm1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRcdHZhbGlkOiBmYWxzZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRMb2cuZGVidWcoXCJQcmVyZXF1aXNpdGVzIG9uIEZpZWxkIGZvciB0aGUgU2lkZUVmZmVjdHMgYW5kIFJlY29tbWVuZGF0aW9ucyBoYXZlIGJlZW4gcmVqZWN0ZWRcIik7XG5cdFx0XHRcdC8vIGFzIHRoZSBVSSBtaWdodCBuZWVkIHRvIHJlYWN0IG9uLiBXZSBjb3VsZCBwcm92aWRlIGEgcGFyYW1ldGVyIHRvIGluZm9ybSBpZiB2YWxpZGF0aW9uXG5cdFx0XHRcdC8vIHdhcyBzdWNjZXNzZnVsP1xuXHRcdFx0XHQoRmllbGRBUEkgYXMgYW55KS5oYW5kbGVDaGFuZ2Uob0V2ZW50LCBvQ29udHJvbGxlcik7XG5cdFx0XHR9KTtcblxuXHRcdG9GRUNvbnRyb2xsZXIuZWRpdEZsb3cuc3luY1Rhc2socFZhbHVlUmVzb2x2ZWQpO1xuXG5cdFx0Ly8gaWYgdGhlIGNvbnRleHQgaXMgdHJhbnNpZW50LCBpdCBtZWFucyB0aGUgcmVxdWVzdCB3b3VsZCBmYWlsIGFueXdheSBhcyB0aGUgcmVjb3JkIGRvZXMgbm90IGV4aXN0IGluIHJlYWxpdHlcblx0XHQvLyBUT0RPOiBzaG91bGQgdGhlIHJlcXVlc3QgYmUgbWFkZSBpbiBmdXR1cmUgaWYgdGhlIGNvbnRleHQgaXMgdHJhbnNpZW50P1xuXHRcdGlmIChiSXNUcmFuc2llbnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRvRkVDb250cm9sbGVyLl9zaWRlRWZmZWN0cy5wcmVwYXJlRGVmZXJyZWRTaWRlRWZmZWN0c0ZvckZpZWxkKG9FdmVudCwgZmllbGRWYWxpZGl0eSwgcFZhbHVlUmVzb2x2ZWQpO1xuXHRcdC8vIENvbGxhYm9yYXRpb24gRHJhZnQgQWN0aXZpdHkgU3luY1xuXHRcdGNvbnN0IGJDb2xsYWJvcmF0aW9uRW5hYmxlZCA9IENvbGxhYm9yYXRpb25BY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQoZmllbGQpO1xuXG5cdFx0aWYgKGJDb2xsYWJvcmF0aW9uRW5hYmxlZCAmJiBmaWVsZFZhbGlkaXR5KSB7XG5cdFx0XHRjb25zdCBiaW5kaW5nID0gZ2V0Q29sbGFib3JhdGlvbkJpbmRpbmcoZmllbGQpO1xuXG5cdFx0XHRjb25zdCBkYXRhID0gW1xuXHRcdFx0XHQuLi4oKGZpZWxkLmdldEJpbmRpbmdJbmZvKFwidmFsdWVcIikgfHwgZmllbGQuZ2V0QmluZGluZ0luZm8oXCJzZWxlY3RlZFwiKSk/LnBhcnRzIHx8IFtdKSxcblx0XHRcdFx0Li4uKGZpZWxkLmdldEJpbmRpbmdJbmZvKFwiYWRkaXRpb25hbFZhbHVlXCIpPy5wYXJ0cyB8fCBbXSlcblx0XHRcdF1cblx0XHRcdFx0LmZpbHRlcigocGFydCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBwYXJ0Py5wYXRoICE9PSB1bmRlZmluZWQgJiYgcGFydC5wYXRoLmluZGV4T2YoXCJAQFwiKSA8IDA7IC8vIFJlbW92ZSBiaW5kaW5nIHBhcnRzIHdpdGggQEAgdGhhdCBtYWtlIG5vIHNlbnNlIGZvciBjb2xsYWJvcmF0aW9uIG1lc3NhZ2VzXG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5tYXAoZnVuY3Rpb24gKHBhcnQ6IHsgcGF0aDogc3RyaW5nIH0pIHtcblx0XHRcdFx0XHRyZXR1cm4gYCR7ZmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpfS8ke3BhcnQucGF0aH1gO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0Ly8gRnJvbSB0aGlzIHBvaW50LCB3ZSB3aWxsIGFsd2F5cyBzZW5kIGEgY29sbGFib3JhdGlvbiBtZXNzYWdlIChVTkxPQ0sgb3IgQ0hBTkdFKSwgc28gd2UgcmV0YWluXG5cdFx0XHQvLyBhIHBvdGVudGlhbCBVTkxPQ0sgdGhhdCB3b3VsZCBiZSBzZW50IGluIGhhbmRsZUZvY3VzT3V0LCB0byBtYWtlIHN1cmUgaXQncyBzZW50IGFmdGVyIHRoZSBDSEFOR0UgbWVzc2FnZVxuXHRcdFx0Q29sbGFib3JhdGlvbkFjdGl2aXR5U3luYy5yZXRhaW5Bc3luY01lc3NhZ2VzKGZpZWxkLCBkYXRhKTtcblxuXHRcdFx0Y29uc3QgdXBkYXRlQ29sbGFib3JhdGlvbiA9ICgpID0+IHtcblx0XHRcdFx0aWYgKGJpbmRpbmcuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdC8vIFRoZSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGJ5IHRoZSB1c2VyIC0tPiB3YWl0IHVudGlsIGl0J3Mgc2VudCB0byB0aGUgc2VydmVyIGJlZm9yZSBzZW5kaW5nIGEgbm90aWZpY2F0aW9uIHRvIG90aGVyIHVzZXJzXG5cdFx0XHRcdFx0YmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLnNlbmQoZmllbGQsIHsgYWN0aW9uOiBBY3Rpdml0eS5DaGFuZ2UsIGNvbnRlbnQ6IGRhdGEgfSk7XG5cdFx0XHRcdFx0XHRDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLnJlbGVhc2VBc3luY01lc3NhZ2VzKGZpZWxkLCBkYXRhKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLnJlbGVhc2VBc3luY01lc3NhZ2VzKGZpZWxkLCBkYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGlmIChvU291cmNlRmllbGQuaXNBKFwic2FwLnVpLm1kYy5GaWVsZFwiKSkge1xuXHRcdFx0XHRwVmFsdWVSZXNvbHZlZFxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdHVwZGF0ZUNvbGxhYm9yYXRpb24oKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdFx0XHR1cGRhdGVDb2xsYWJvcmF0aW9uKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR1cGRhdGVDb2xsYWJvcmF0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGVyIGZvciB0aGUgbGl2ZSBjaGFuZ2UgZXZlbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBoYW5kbGVMaXZlQ2hhbmdlXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgb2JqZWN0IHBhc3NlZCBieSB0aGUgY2hhbmdlIGV2ZW50XG5cdCAqL1xuXHRoYW5kbGVMaXZlQ2hhbmdlOiBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG5cdFx0KEZpZWxkQVBJIGFzIEZpZWxkQVBJVHlwZSkuaGFuZGxlTGl2ZUNoYW5nZShldmVudCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBzZW5kIGNvbGxhYm9yYXRpb24gbWVzc2FnZXMgZnJvbSBhIEZpbGVVcGxvYWRlci5cblx0ICpcblx0ICogQHBhcmFtIGZpbGVVcGxvYWRlclxuXHQgKiBAcGFyYW0gYWN0aW9uXG5cdCAqL1xuXHRfc2VuZENvbGxhYm9yYXRpb25NZXNzYWdlRm9yRmlsZVVwbG9hZGVyKGZpbGVVcGxvYWRlcjogRmlsZVVwbG9hZGVyLCBhY3Rpb246IEFjdGl2aXR5KTogdm9pZCB7XG5cdFx0aWYgKENvbGxhYm9yYXRpb25BY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQoZmlsZVVwbG9hZGVyKSkge1xuXHRcdFx0Y29uc3QgYmluZGluZ1BhdGggPSBmaWxlVXBsb2FkZXIuZ2V0UGFyZW50KCk/LmdldFByb3BlcnR5KFwicHJvcGVydHlQYXRoXCIpO1xuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBgJHtmaWxlVXBsb2FkZXIuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpfS8ke2JpbmRpbmdQYXRofWA7XG5cdFx0XHRDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLnNlbmQoZmlsZVVwbG9hZGVyLCB7IGFjdGlvbiwgY29udGVudDogZnVsbFBhdGggfSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGVyIHdoZW4gYSBGaWxlVXBsb2FkIGRpYWxvZyBpcyBvcGVuZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudFxuXHQgKi9cblx0aGFuZGxlT3BlblVwbG9hZGVyOiBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG5cdFx0Y29uc3QgZmlsZVVwbG9hZGVyID0gZXZlbnQuZ2V0U291cmNlKCkgYXMgRmlsZVVwbG9hZGVyO1xuXHRcdEZpZWxkUnVudGltZS5fc2VuZENvbGxhYm9yYXRpb25NZXNzYWdlRm9yRmlsZVVwbG9hZGVyKGZpbGVVcGxvYWRlciwgQWN0aXZpdHkuTG9jayk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEhhbmRsZXIgd2hlbiBhIEZpbGVVcGxvYWQgZGlhbG9nIGlzIGNsb3NlZC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50XG5cdCAqL1xuXHRoYW5kbGVDbG9zZVVwbG9hZGVyOiBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG5cdFx0Y29uc3QgZmlsZVVwbG9hZGVyID0gZXZlbnQuZ2V0U291cmNlKCkgYXMgRmlsZVVwbG9hZGVyO1xuXHRcdEZpZWxkUnVudGltZS5fc2VuZENvbGxhYm9yYXRpb25NZXNzYWdlRm9yRmlsZVVwbG9hZGVyKGZpbGVVcGxvYWRlciwgQWN0aXZpdHkuVW5sb2NrKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUgZmllbGQgdmFsdWUgYW5kIHZhbGlkaXR5IG9uIGEgY2hhbmdlIGV2ZW50LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZmllbGRWYWxpZGl0eU9uQ2hhbmdlXG5cdCAqIEBwYXJhbSBvRXZlbnQgVGhlIGV2ZW50IG9iamVjdCBwYXNzZWQgYnkgdGhlIGNoYW5nZSBldmVudFxuXHQgKiBAcmV0dXJucyBGaWVsZCB2YWx1ZSBhbmQgdmFsaWRpdHlcblx0ICovXG5cdGdldEZpZWxkU3RhdGVPbkNoYW5nZTogZnVuY3Rpb24gKG9FdmVudDogRmllbGQkQ2hhbmdlRXZlbnQgJiBFdmVudDx7IGlzVmFsaWQ6IGJvb2xlYW4gfT4pOiB7XG5cdFx0ZmllbGQ6IEZpZWxkO1xuXHRcdHN0YXRlOiB7XG5cdFx0XHRmaWVsZFZhbHVlPzogdW5rbm93bjtcblx0XHRcdHZhbGlkaXR5PzogYm9vbGVhbjtcblx0XHR9O1xuXHR9IHtcblx0XHRsZXQgb1NvdXJjZUZpZWxkID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIGFueSxcblx0XHRcdG1GaWVsZFN0YXRlOiB7XG5cdFx0XHRcdGZpZWxkVmFsdWU/OiB1bmtub3duO1xuXHRcdFx0XHR2YWxpZGl0eT86IGJvb2xlYW47XG5cdFx0XHR9ID0ge307XG5cdFx0Y29uc3QgX2lzQmluZGluZ1N0YXRlTWVzc2FnZXMgPSBmdW5jdGlvbiAob0JpbmRpbmc6IGFueSkge1xuXHRcdFx0cmV0dXJuIG9CaW5kaW5nICYmIG9CaW5kaW5nLmdldERhdGFTdGF0ZSgpID8gb0JpbmRpbmcuZ2V0RGF0YVN0YXRlKCkuZ2V0SW52YWxpZFZhbHVlKCkgPT09IHVuZGVmaW5lZCA6IHRydWU7XG5cdFx0fTtcblx0XHRpZiAob1NvdXJjZUZpZWxkLmlzQShcInNhcC5mZS5tYWNyb3MuZmllbGQuRmllbGRBUElcIikpIHtcblx0XHRcdG9Tb3VyY2VGaWVsZCA9IChvU291cmNlRmllbGQgYXMgRW5oYW5jZVdpdGhVSTU8RmllbGRBUEk+KS5nZXRDb250ZW50KCk7XG5cdFx0fVxuXG5cdFx0aWYgKG9Tb3VyY2VGaWVsZC5pc0EoRmllbGRXcmFwcGVyLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpKSAmJiBvU291cmNlRmllbGQuZ2V0RWRpdE1vZGUoKSA9PT0gXCJFZGl0YWJsZVwiKSB7XG5cdFx0XHRvU291cmNlRmllbGQgPSBvU291cmNlRmllbGQuZ2V0Q29udGVudEVkaXQoKVswXTtcblx0XHR9XG5cblx0XHRpZiAob1NvdXJjZUZpZWxkLmlzQShcInNhcC51aS5tZGMuRmllbGRcIikpIHtcblx0XHRcdGxldCBiSXNWYWxpZCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJ2YWxpZFwiKSB8fCBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaXNWYWxpZFwiKTtcblx0XHRcdGlmIChiSXNWYWxpZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmIChvU291cmNlRmllbGQuZ2V0TWF4Q29uZGl0aW9ucygpID09PSAxKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1ZhbHVlQmluZGluZ0luZm8gPSBvU291cmNlRmllbGQuZ2V0QmluZGluZ0luZm8oXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRiSXNWYWxpZCA9IF9pc0JpbmRpbmdTdGF0ZU1lc3NhZ2VzKG9WYWx1ZUJpbmRpbmdJbmZvICYmIG9WYWx1ZUJpbmRpbmdJbmZvLmJpbmRpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvU291cmNlRmllbGQuZ2V0VmFsdWUoKSA9PT0gXCJcIiAmJiAhb1NvdXJjZUZpZWxkLmdldFByb3BlcnR5KFwicmVxdWlyZWRcIikpIHtcblx0XHRcdFx0XHRiSXNWYWxpZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG1GaWVsZFN0YXRlID0ge1xuXHRcdFx0XHRmaWVsZFZhbHVlOiBvU291cmNlRmllbGQuZ2V0VmFsdWUoKSxcblx0XHRcdFx0dmFsaWRpdHk6ICEhYklzVmFsaWRcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIG9Tb3VyY2VGaWVsZCBleHRlbmRzIGZyb20gYSBGaWxlVXBsb2FkZXIgfHwgSW5wdXQgfHwgaXMgYSBDaGVja0JveFxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPVxuXHRcdFx0XHRvU291cmNlRmllbGQuZ2V0QmluZGluZyhcInVwbG9hZFVybFwiKSB8fCBvU291cmNlRmllbGQuZ2V0QmluZGluZyhcInZhbHVlXCIpIHx8IG9Tb3VyY2VGaWVsZC5nZXRCaW5kaW5nKFwic2VsZWN0ZWRcIik7XG5cdFx0XHRtRmllbGRTdGF0ZSA9IHtcblx0XHRcdFx0ZmllbGRWYWx1ZTogb0JpbmRpbmcgJiYgb0JpbmRpbmcuZ2V0VmFsdWUoKSxcblx0XHRcdFx0dmFsaWRpdHk6IF9pc0JpbmRpbmdTdGF0ZU1lc3NhZ2VzKG9CaW5kaW5nKVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdGZpZWxkOiBvU291cmNlRmllbGQsXG5cdFx0XHRzdGF0ZTogbUZpZWxkU3RhdGVcblx0XHR9O1xuXHR9LFxuXHRfZm5GaXhIYXNoUXVlcnlTdHJpbmc6IGZ1bmN0aW9uIChzQ3VycmVudEhhc2g6IGFueSkge1xuXHRcdGlmIChzQ3VycmVudEhhc2ggJiYgc0N1cnJlbnRIYXNoLmluZGV4T2YoXCI/XCIpICE9PSAtMSkge1xuXHRcdFx0Ly8gc0N1cnJlbnRIYXNoIGNhbiBjb250YWluIHF1ZXJ5IHN0cmluZywgY3V0IGl0IG9mZiFcblx0XHRcdHNDdXJyZW50SGFzaCA9IHNDdXJyZW50SGFzaC5zcGxpdChcIj9cIilbMF07XG5cdFx0fVxuXHRcdHJldHVybiBzQ3VycmVudEhhc2g7XG5cdH0sXG5cdF9mbkdldExpbmtJbmZvcm1hdGlvbjogZnVuY3Rpb24gKF9vU291cmNlOiBhbnksIF9vTGluazogYW55LCBfc1Byb3BlcnR5UGF0aDogYW55LCBfc1ZhbHVlOiBhbnksIGZuU2V0QWN0aXZlOiBhbnkpIHtcblx0XHRjb25zdCBvTW9kZWwgPSBfb0xpbmsgJiYgX29MaW5rLmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbCAmJiBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgc1NlbWFudGljT2JqZWN0TmFtZSA9IF9zVmFsdWUgfHwgKF9vU291cmNlICYmIF9vU291cmNlLmdldFZhbHVlKCkpO1xuXHRcdGNvbnN0IG9WaWV3ID0gX29MaW5rICYmIENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcoX29MaW5rKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldyAmJiBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBvVmlldyAmJiBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdGNvbnN0IG9TaGVsbFNlcnZpY2VIZWxwZXIgPSBvQXBwQ29tcG9uZW50ICYmIG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdGNvbnN0IHBHZXRMaW5rc1Byb21pc2UgPSBvU2hlbGxTZXJ2aWNlSGVscGVyICYmIG9TaGVsbFNlcnZpY2VIZWxwZXIuZ2V0TGlua3NXaXRoQ2FjaGUoW1t7IHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3ROYW1lIH1dXSk7XG5cdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zID1cblx0XHRcdG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7X3NQcm9wZXJ0eVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9uc2ApO1xuXHRcdHJldHVybiB7XG5cdFx0XHRTZW1hbnRpY09iamVjdE5hbWU6IHNTZW1hbnRpY09iamVjdE5hbWUsXG5cdFx0XHRTZW1hbnRpY09iamVjdEZ1bGxQYXRoOiBfc1Byb3BlcnR5UGF0aCwgLy9zU2VtYW50aWNPYmplY3RGdWxsUGF0aCxcblx0XHRcdE1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdEludGVybmFsTW9kZWxDb250ZXh0OiBvSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRTaGVsbFNlcnZpY2VIZWxwZXI6IG9TaGVsbFNlcnZpY2VIZWxwZXIsXG5cdFx0XHRHZXRMaW5rc1Byb21pc2U6IHBHZXRMaW5rc1Byb21pc2UsXG5cdFx0XHRTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9uczogYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zLFxuXHRcdFx0Zm5TZXRBY3RpdmU6IGZuU2V0QWN0aXZlXG5cdFx0fTtcblx0fSxcblx0X2ZuUXVpY2tWaWV3SGFzTmV3Q29uZGl0aW9uOiBmdW5jdGlvbiAob1NlbWFudGljT2JqZWN0UGF5bG9hZDogYW55LCBfb0xpbmtJbmZvOiBhbnkpIHtcblx0XHRpZiAob1NlbWFudGljT2JqZWN0UGF5bG9hZCAmJiBvU2VtYW50aWNPYmplY3RQYXlsb2FkLnBhdGggJiYgb1NlbWFudGljT2JqZWN0UGF5bG9hZC5wYXRoID09PSBfb0xpbmtJbmZvLlNlbWFudGljT2JqZWN0RnVsbFBhdGgpIHtcblx0XHRcdC8vIEdvdCB0aGUgcmVzb2x2ZWQgU2VtYW50aWMgT2JqZWN0IVxuXHRcdFx0Y29uc3QgYlJlc3VsdGluZ05ld0NvbmRpdGlvbkZvckNvbmRpdGlvbmFsV3JhcHBlciA9XG5cdFx0XHRcdG9TZW1hbnRpY09iamVjdFBheWxvYWRbIV9vTGlua0luZm8uU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMgPyBcIkhhc1RhcmdldHNOb3RGaWx0ZXJlZFwiIDogXCJIYXNUYXJnZXRzXCJdO1xuXHRcdFx0X29MaW5rSW5mby5mblNldEFjdGl2ZSghIWJSZXN1bHRpbmdOZXdDb25kaXRpb25Gb3JDb25kaXRpb25hbFdyYXBwZXIpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0sXG5cdF9mblF1aWNrVmlld1NldE5ld0NvbmRpdGlvbkZvckNvbmRpdGlvbmFsV3JhcHBlcjogZnVuY3Rpb24gKF9vTGlua0luZm86IGFueSwgX29GaW5hbFNlbWFudGljT2JqZWN0czogYW55KSB7XG5cdFx0aWYgKF9vRmluYWxTZW1hbnRpY09iamVjdHNbX29MaW5rSW5mby5TZW1hbnRpY09iamVjdE5hbWVdKSB7XG5cdFx0XHRsZXQgc1RtcFBhdGgsIG9TZW1hbnRpY09iamVjdFBheWxvYWQ7XG5cdFx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RQYXRocyA9IE9iamVjdC5rZXlzKF9vRmluYWxTZW1hbnRpY09iamVjdHNbX29MaW5rSW5mby5TZW1hbnRpY09iamVjdE5hbWVdKTtcblx0XHRcdGZvciAoY29uc3QgaVBhdGhzQ291bnQgaW4gYVNlbWFudGljT2JqZWN0UGF0aHMpIHtcblx0XHRcdFx0c1RtcFBhdGggPSBhU2VtYW50aWNPYmplY3RQYXRoc1tpUGF0aHNDb3VudF07XG5cdFx0XHRcdG9TZW1hbnRpY09iamVjdFBheWxvYWQgPVxuXHRcdFx0XHRcdF9vRmluYWxTZW1hbnRpY09iamVjdHNbX29MaW5rSW5mby5TZW1hbnRpY09iamVjdE5hbWVdICYmXG5cdFx0XHRcdFx0X29GaW5hbFNlbWFudGljT2JqZWN0c1tfb0xpbmtJbmZvLlNlbWFudGljT2JqZWN0TmFtZV1bc1RtcFBhdGhdO1xuXHRcdFx0XHRpZiAoRmllbGRSdW50aW1lLl9mblF1aWNrVmlld0hhc05ld0NvbmRpdGlvbihvU2VtYW50aWNPYmplY3RQYXlsb2FkLCBfb0xpbmtJbmZvKSkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRfZm5VcGRhdGVTZW1hbnRpY09iamVjdHNUYXJnZXRNb2RlbDogZnVuY3Rpb24gKG9FdmVudDogYW55LCBzVmFsdWU6IGFueSwgb0NvbnRyb2w6IGFueSwgX3NQcm9wZXJ0eVBhdGg6IGFueSkge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSBvRXZlbnQgJiYgb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGxldCBmblNldEFjdGl2ZTtcblx0XHRpZiAob0NvbnRyb2wuaXNBKFwic2FwLm0uT2JqZWN0U3RhdHVzXCIpKSB7XG5cdFx0XHRmblNldEFjdGl2ZSA9IChiQWN0aXZlOiBib29sZWFuKSA9PiBvQ29udHJvbC5zZXRBY3RpdmUoYkFjdGl2ZSk7XG5cdFx0fVxuXHRcdGlmIChvQ29udHJvbC5pc0EoXCJzYXAubS5PYmplY3RJZGVudGlmaWVyXCIpKSB7XG5cdFx0XHRmblNldEFjdGl2ZSA9IChiQWN0aXZlOiBib29sZWFuKSA9PiBvQ29udHJvbC5zZXRUaXRsZUFjdGl2ZShiQWN0aXZlKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0NvbmRpdGlvbmFsV3JhcHBlciA9IG9Db250cm9sICYmIG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdGlmIChvQ29uZGl0aW9uYWxXcmFwcGVyICYmIG9Db25kaXRpb25hbFdyYXBwZXIuaXNBKFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5Db25kaXRpb25hbFdyYXBwZXJcIikpIHtcblx0XHRcdGZuU2V0QWN0aXZlID0gKGJBY3RpdmU6IGJvb2xlYW4pID0+IG9Db25kaXRpb25hbFdyYXBwZXIuc2V0Q29uZGl0aW9uKGJBY3RpdmUpO1xuXHRcdH1cblx0XHRpZiAoZm5TZXRBY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3Qgb0xpbmtJbmZvID0gRmllbGRSdW50aW1lLl9mbkdldExpbmtJbmZvcm1hdGlvbihvU291cmNlLCBvQ29udHJvbCwgX3NQcm9wZXJ0eVBhdGgsIHNWYWx1ZSwgZm5TZXRBY3RpdmUpO1xuXHRcdFx0b0xpbmtJbmZvLmZuU2V0QWN0aXZlID0gZm5TZXRBY3RpdmU7XG5cdFx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSBGaWVsZFJ1bnRpbWUuX2ZuRml4SGFzaFF1ZXJ5U3RyaW5nKENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvQ29udHJvbCkuZ2V0U2hlbGxTZXJ2aWNlcygpLmdldEhhc2goKSk7XG5cdFx0XHRDb21tb25VdGlscy51cGRhdGVTZW1hbnRpY1RhcmdldHMoXG5cdFx0XHRcdFtvTGlua0luZm8uR2V0TGlua3NQcm9taXNlXSxcblx0XHRcdFx0W3sgc2VtYW50aWNPYmplY3Q6IG9MaW5rSW5mby5TZW1hbnRpY09iamVjdE5hbWUsIHBhdGg6IG9MaW5rSW5mby5TZW1hbnRpY09iamVjdEZ1bGxQYXRoIH1dLFxuXHRcdFx0XHRvTGlua0luZm8uSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdHNDdXJyZW50SGFzaFxuXHRcdFx0KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0ZpbmFsU2VtYW50aWNPYmplY3RzOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob0ZpbmFsU2VtYW50aWNPYmplY3RzKSB7XG5cdFx0XHRcdFx0XHRGaWVsZFJ1bnRpbWUuX2ZuUXVpY2tWaWV3U2V0TmV3Q29uZGl0aW9uRm9yQ29uZGl0aW9uYWxXcmFwcGVyKG9MaW5rSW5mbywgb0ZpbmFsU2VtYW50aWNPYmplY3RzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHVwZGF0ZSBTZW1hbnRpYyBUYXJnZXRzIG1vZGVsXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblx0X2NoZWNrQ29udHJvbEhhc01vZGVsQW5kQmluZGluZ0NvbnRleHQoX2NvbnRyb2w6IENvbnRyb2wpIHtcblx0XHRpZiAoIV9jb250cm9sLmdldE1vZGVsKCkgfHwgIV9jb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9LFxuXHRfY2hlY2tDdXN0b21EYXRhVmFsdWVCZWZvcmVVcGRhdGluZ1NlbWFudGljT2JqZWN0TW9kZWwoX2NvbnRyb2w6IENvbnRyb2wsIHByb3BlcnR5UGF0aDogc3RyaW5nLCBhQ3VzdG9tRGF0YTogQ3VzdG9tRGF0YVtdKTogdm9pZCB7XG5cdFx0bGV0IHNTZW1hbnRpY09iamVjdFBhdGhWYWx1ZTogYW55O1xuXHRcdGxldCBvVmFsdWVCaW5kaW5nO1xuXHRcdGNvbnN0IF9mbkN1c3RvbURhdGFWYWx1ZUlzU3RyaW5nID0gZnVuY3Rpb24gKHNlbWFudGljT2JqZWN0UGF0aFZhbHVlOiBhbnkpIHtcblx0XHRcdHJldHVybiAhKHNlbWFudGljT2JqZWN0UGF0aFZhbHVlICE9PSBudWxsICYmIHR5cGVvZiBzZW1hbnRpY09iamVjdFBhdGhWYWx1ZSA9PT0gXCJvYmplY3RcIik7XG5cdFx0fTtcblx0XHQvLyByZW1vdmUgdGVjaG5pY2FsIGN1c3RvbSBkYXRhcyBzZXQgYnkgVUk1XG5cdFx0YUN1c3RvbURhdGEgPSBhQ3VzdG9tRGF0YS5maWx0ZXIoKGN1c3RvbURhdGEpID0+IGN1c3RvbURhdGEuZ2V0S2V5KCkgIT09IFwic2FwLXVpLWN1c3RvbS1zZXR0aW5nc1wiKTtcblx0XHRmb3IgKGNvbnN0IGluZGV4IGluIGFDdXN0b21EYXRhKSB7XG5cdFx0XHRzU2VtYW50aWNPYmplY3RQYXRoVmFsdWUgPSBhQ3VzdG9tRGF0YVtpbmRleF0uZ2V0VmFsdWUoKTtcblx0XHRcdGlmICghc1NlbWFudGljT2JqZWN0UGF0aFZhbHVlICYmIF9mbkN1c3RvbURhdGFWYWx1ZUlzU3RyaW5nKHNTZW1hbnRpY09iamVjdFBhdGhWYWx1ZSkpIHtcblx0XHRcdFx0b1ZhbHVlQmluZGluZyA9IGFDdXN0b21EYXRhW2luZGV4XS5nZXRCaW5kaW5nKFwidmFsdWVcIik7XG5cdFx0XHRcdGlmIChvVmFsdWVCaW5kaW5nKSB7XG5cdFx0XHRcdFx0b1ZhbHVlQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKF9vQ2hhbmdlRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0RmllbGRSdW50aW1lLl9mblVwZGF0ZVNlbWFudGljT2JqZWN0c1RhcmdldE1vZGVsKF9vQ2hhbmdlRXZlbnQsIG51bGwsIF9jb250cm9sLCBwcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKF9mbkN1c3RvbURhdGFWYWx1ZUlzU3RyaW5nKHNTZW1hbnRpY09iamVjdFBhdGhWYWx1ZSkpIHtcblx0XHRcdFx0RmllbGRSdW50aW1lLl9mblVwZGF0ZVNlbWFudGljT2JqZWN0c1RhcmdldE1vZGVsKG51bGwsIHNTZW1hbnRpY09iamVjdFBhdGhWYWx1ZSwgX2NvbnRyb2wsIHByb3BlcnR5UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRMaW5rTW9kZWxDb250ZXh0Q2hhbmdlOiBmdW5jdGlvbiAob0V2ZW50OiBhbnksIHNQcm9wZXJ0eTogYW55LCBzUGF0aFRvUHJvcGVydHk6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRyb2wgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0aWYgKEZpZWxkUnVudGltZS5fY2hlY2tDb250cm9sSGFzTW9kZWxBbmRCaW5kaW5nQ29udGV4dChjb250cm9sKSkge1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aCA9IGAke3NQYXRoVG9Qcm9wZXJ0eX0vJHtzUHJvcGVydHl9YDtcblx0XHRcdGNvbnN0IG1kY0xpbmsgPSBjb250cm9sLmdldERlcGVuZGVudHMoKS5sZW5ndGggPyBjb250cm9sLmdldERlcGVuZGVudHMoKVswXSA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGFDdXN0b21EYXRhID0gbWRjTGluaz8uZ2V0Q3VzdG9tRGF0YSgpO1xuXHRcdFx0aWYgKGFDdXN0b21EYXRhICYmIGFDdXN0b21EYXRhLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0RmllbGRSdW50aW1lLl9jaGVja0N1c3RvbURhdGFWYWx1ZUJlZm9yZVVwZGF0aW5nU2VtYW50aWNPYmplY3RNb2RlbChjb250cm9sLCBzUHJvcGVydHlQYXRoLCBhQ3VzdG9tRGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRvcGVuRXh0ZXJuYWxMaW5rOiBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3Qgc291cmNlID0gZXZlbnQuZ2V0U291cmNlKCkgYXMgYW55O1xuXHRcdGlmIChzb3VyY2UuZGF0YShcInVybFwiKSAmJiBzb3VyY2UuZ2V0UHJvcGVydHkoXCJ0ZXh0XCIpICE9PSBcIlwiKSB7XG5cdFx0XHQvLyBUaGlzIG9wZW5zIHRoZSBsaW5rIGluIHRoZSBzYW1lIHRhYiBhcyB0aGUgbGluay4gSXQgd2FzIGRvbmUgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgdHlwZSBvZiBsaW5rcy5cblx0XHRcdG9wZW5XaW5kb3coc291cmNlLmRhdGEoXCJ1cmxcIiksIFwiX3NlbGZcIik7XG5cdFx0fVxuXHR9LFxuXHRjcmVhdGVQb3BvdmVyV2l0aE5vVGFyZ2V0czogZnVuY3Rpb24gKG1kY0xpbms6IE1kY0xpbmspIHtcblx0XHRjb25zdCBtZGNMaW5rSWQgPSBtZGNMaW5rLmdldElkKCk7XG5cdFx0Y29uc3QgaWxsdXN0cmF0ZWRNZXNzYWdlU2V0dGluZ3M6ICRJbGx1c3RyYXRlZE1lc3NhZ2VTZXR0aW5ncyA9IHtcblx0XHRcdHRpdGxlOiBnZXRSZXNvdXJjZU1vZGVsKG1kY0xpbmsgYXMgdW5rbm93biBhcyBDb250cm9sKS5nZXRUZXh0KFwiTV9JTExVU1RSQVRFRE1FU1NBR0VfVElUTEVcIiksXG5cdFx0XHRkZXNjcmlwdGlvbjogZ2V0UmVzb3VyY2VNb2RlbChtZGNMaW5rIGFzIHVua25vd24gYXMgQ29udHJvbCkuZ2V0VGV4dChcIk1fSUxMVVNUUkFURURNRVNTQUdFX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0ZW5hYmxlRm9ybWF0dGVkVGV4dDogdHJ1ZSxcblx0XHRcdGlsbHVzdHJhdGlvblNpemU6IFwiRG90XCIsIC8vIElsbHVzdHJhdGVkTWVzc2FnZVNpemUuRG90IG5vdCBhdmFpbGFibGUgaW4gXCJAdHlwZXMvb3BlbnVpNVwiOiBcIjEuMTA3LjBcIlxuXHRcdFx0aWxsdXN0cmF0aW9uVHlwZTogSWxsdXN0cmF0ZWRNZXNzYWdlVHlwZS5UZW50XG5cdFx0fTtcblx0XHRjb25zdCBpbGx1c3RyYXRlZE1lc3NhZ2UgPSBuZXcgSWxsdXN0cmF0ZWRNZXNzYWdlKGAke21kY0xpbmtJZH0taWxsdXN0cmF0ZWRtZXNzYWdlYCwgaWxsdXN0cmF0ZWRNZXNzYWdlU2V0dGluZ3MpO1xuXHRcdGNvbnN0IHBvcG92ZXJTZXR0aW5nczogJFJlc3BvbnNpdmVQb3BvdmVyU2V0dGluZ3MgPSB7XG5cdFx0XHRob3Jpem9udGFsU2Nyb2xsaW5nOiBmYWxzZSxcblx0XHRcdHNob3dIZWFkZXI6IERldmljZS5zeXN0ZW0ucGhvbmUsXG5cdFx0XHRwbGFjZW1lbnQ6IG1vYmlsZWxpYnJhcnkuUGxhY2VtZW50VHlwZS5BdXRvLFxuXHRcdFx0Y29udGVudDogW2lsbHVzdHJhdGVkTWVzc2FnZV0sXG5cdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0aWYgKGV2ZW50LmdldFNvdXJjZSgpKSB7XG5cdFx0XHRcdFx0ZXZlbnQuZ2V0U291cmNlKCkuZGVzdHJveSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRyZXR1cm4gbmV3IFJlc3BvbnNpdmVQb3BvdmVyKGAke21kY0xpbmtJZH0tcG9wb3ZlcmAsIHBvcG92ZXJTZXR0aW5ncyk7XG5cdH0sXG5cdG9wZW5MaW5rOiBhc3luYyBmdW5jdGlvbiAobWRjTGluazogTWRjTGluaywgc2FwbUxpbms6IExpbmspIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgaFJlZiA9IGF3YWl0IG1kY0xpbmsuZ2V0VHJpZ2dlckhyZWYoKTtcblx0XHRcdGlmICghaFJlZikge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGxpbmtJdGVtcyA9IGF3YWl0IG1kY0xpbmsucmV0cmlldmVMaW5rSXRlbXMoKTtcblx0XHRcdFx0XHRpZiAobGlua0l0ZW1zPy5sZW5ndGggPT09IDAgJiYgKG1kY0xpbmsgYXMgYW55KS5nZXRQYXlsb2FkKCkuaGFzUXVpY2tWaWV3RmFjZXRzID09PSBcImZhbHNlXCIpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHBvcG92ZXI6IFJlc3BvbnNpdmVQb3BvdmVyID0gRmllbGRSdW50aW1lLmNyZWF0ZVBvcG92ZXJXaXRoTm9UYXJnZXRzKG1kY0xpbmspO1xuXHRcdFx0XHRcdFx0bWRjTGluay5hZGREZXBlbmRlbnQocG9wb3Zlcik7XG5cdFx0XHRcdFx0XHRwb3BvdmVyLm9wZW5CeShzYXBtTGluayBhcyB1bmtub3duIGFzIENvbnRyb2wpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBtZGNMaW5rLm9wZW4oc2FwbUxpbmsgYXMgdW5rbm93biBhcyBDb250cm9sKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBDYW5ub3QgcmV0cmlldmUgdGhlIFF1aWNrVmlldyBQb3BvdmVyIGRpYWxvZzogJHtlcnJvcn1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgdmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcoc2FwbUxpbmspO1xuXHRcdFx0XHRjb25zdCBhcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodmlldyk7XG5cdFx0XHRcdGNvbnN0IHNoZWxsU2VydmljZSA9IGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdFx0XHRcdGNvbnN0IHNoZWxsSGFzaCA9IHNoZWxsU2VydmljZS5wYXJzZVNoZWxsSGFzaChoUmVmKTtcblx0XHRcdFx0Y29uc3QgbmF2QXJncyA9IHtcblx0XHRcdFx0XHR0YXJnZXQ6IHtcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBzaGVsbEhhc2guc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRhY3Rpb246IHNoZWxsSGFzaC5hY3Rpb25cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhcmFtczogc2hlbGxIYXNoLnBhcmFtc1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdEtlZXBBbGl2ZUhlbHBlci5zdG9yZUNvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JIYXNoKHZpZXcsIHNoZWxsSGFzaCk7XG5cblx0XHRcdFx0aWYgKENvbW1vblV0aWxzLmlzU3RpY2t5RWRpdE1vZGUoc2FwbUxpbmsgYXMgdW5rbm93biBhcyBDb250cm9sKSAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdC8vVVJMIHBhcmFtcyBhbmQgeGFwcFN0YXRlIGhhcyBiZWVuIGdlbmVyYXRlZCBlYXJsaWVyIGhlbmNlIHVzaW5nIHRvRXh0ZXJuYWxcblx0XHRcdFx0XHRzaGVsbFNlcnZpY2UudG9FeHRlcm5hbChuYXZBcmdzIGFzIGFueSwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV3SHJlZiA9IGF3YWl0IHNoZWxsU2VydmljZS5ocmVmRm9yRXh0ZXJuYWxBc3luYyhuYXZBcmdzLCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0b3BlbldpbmRvdyhuZXdIcmVmKTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBFcnJvciB3aGlsZSByZXRpcmV2aW5nIGhyZWZGb3JFeHRlcm5hbCA6ICR7ZXJyb3J9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihgRXJyb3IgdHJpZ2dlcmluZyBsaW5rIEhyZWY6ICR7ZXJyb3J9YCk7XG5cdFx0fVxuXHR9LFxuXHRwcmVzc0xpbms6IGFzeW5jIGZ1bmN0aW9uIChvRXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3Qgc2FwbUxpbmsgPSBvU291cmNlLmlzQShcInNhcC5tLk9iamVjdElkZW50aWZpZXJcIilcblx0XHRcdD8gb1NvdXJjZS5maW5kRWxlbWVudHMoZmFsc2UsIChlbGVtOiBFbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0uaXNBKFwic2FwLm0uTGlua1wiKTtcblx0XHRcdCAgfSlbMF1cblx0XHRcdDogb1NvdXJjZTtcblxuXHRcdGlmIChvU291cmNlLmdldERlcGVuZGVudHMoKSAmJiBvU291cmNlLmdldERlcGVuZGVudHMoKS5sZW5ndGggPiAwICYmIHNhcG1MaW5rLmdldFByb3BlcnR5KFwidGV4dFwiKSAhPT0gXCJcIikge1xuXHRcdFx0Y29uc3Qgb0ZpZWxkSW5mbyA9IG9Tb3VyY2UuZ2V0RGVwZW5kZW50cygpWzBdO1xuXHRcdFx0aWYgKG9GaWVsZEluZm8gJiYgb0ZpZWxkSW5mby5pc0EoXCJzYXAudWkubWRjLkxpbmtcIikpIHtcblx0XHRcdFx0YXdhaXQgRmllbGRSdW50aW1lLm9wZW5MaW5rKG9GaWVsZEluZm8sIHNhcG1MaW5rKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNhcG1MaW5rO1xuXHR9LFxuXHR1cGxvYWRTdHJlYW06IGZ1bmN0aW9uIChjb250cm9sbGVyOiBDb250cm9sbGVyLCBldmVudDogRXZlbnQpIHtcblx0XHRjb25zdCBmaWxlVXBsb2FkZXIgPSBldmVudC5nZXRTb3VyY2UoKSBhcyBGaWxlVXBsb2FkZXIsXG5cdFx0XHRGRUNvbnRyb2xsZXIgPSBGaWVsZFJ1bnRpbWUuX2dldEV4dGVuc2lvbkNvbnRyb2xsZXIoY29udHJvbGxlciksXG5cdFx0XHRmaWxlV3JhcHBlciA9IGZpbGVVcGxvYWRlci5nZXRQYXJlbnQoKSBhcyB1bmtub3duIGFzIEZpbGVXcmFwcGVyLFxuXHRcdFx0dXBsb2FkVXJsID0gZmlsZVdyYXBwZXIuZ2V0VXBsb2FkVXJsKCk7XG5cblx0XHRpZiAodXBsb2FkVXJsICE9PSBcIlwiKSB7XG5cdFx0XHRmaWxlV3JhcHBlci5zZXRVSUJ1c3kodHJ1ZSk7XG5cblx0XHRcdC8vIHVzZSB1cGxvYWRVcmwgZnJvbSBGaWxlV3JhcHBlciB3aGljaCByZXR1cm5zIGEgY2Fub25pY2FsIFVSTFxuXHRcdFx0ZmlsZVVwbG9hZGVyLnNldFVwbG9hZFVybCh1cGxvYWRVcmwpO1xuXG5cdFx0XHRmaWxlVXBsb2FkZXIucmVtb3ZlQWxsSGVhZGVyUGFyYW1ldGVycygpO1xuXHRcdFx0Y29uc3QgdG9rZW4gPSAoZmlsZVVwbG9hZGVyLmdldE1vZGVsKCkgYXMgYW55KT8uZ2V0SHR0cEhlYWRlcnMoKVtcIlgtQ1NSRi1Ub2tlblwiXTtcblx0XHRcdGlmICh0b2tlbikge1xuXHRcdFx0XHRjb25zdCBoZWFkZXJQYXJhbWV0ZXJDU1JGVG9rZW4gPSBuZXcgRmlsZVVwbG9hZGVyUGFyYW1ldGVyKCk7XG5cdFx0XHRcdGhlYWRlclBhcmFtZXRlckNTUkZUb2tlbi5zZXROYW1lKFwieC1jc3JmLXRva2VuXCIpO1xuXHRcdFx0XHRoZWFkZXJQYXJhbWV0ZXJDU1JGVG9rZW4uc2V0VmFsdWUodG9rZW4pO1xuXHRcdFx0XHRmaWxlVXBsb2FkZXIuYWRkSGVhZGVyUGFyYW1ldGVyKGhlYWRlclBhcmFtZXRlckNTUkZUb2tlbik7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBlVGFnID0gKGZpbGVVcGxvYWRlci5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQgfCB1bmRlZmluZWQgfCBudWxsKT8uZ2V0UHJvcGVydHkoXCJAb2RhdGEuZXRhZ1wiKTtcblx0XHRcdGlmIChlVGFnKSB7XG5cdFx0XHRcdGNvbnN0IGhlYWRlclBhcmFtZXRlckVUYWcgPSBuZXcgRmlsZVVwbG9hZGVyUGFyYW1ldGVyKCk7XG5cdFx0XHRcdGhlYWRlclBhcmFtZXRlckVUYWcuc2V0TmFtZShcIklmLU1hdGNoXCIpO1xuXHRcdFx0XHQvLyBJZ25vcmUgRVRhZyBpbiBjb2xsYWJvcmF0aW9uIGRyYWZ0XG5cdFx0XHRcdGhlYWRlclBhcmFtZXRlckVUYWcuc2V0VmFsdWUoQ29sbGFib3JhdGlvbkFjdGl2aXR5U3luYy5pc0Nvbm5lY3RlZChmaWxlVXBsb2FkZXIpID8gXCIqXCIgOiBlVGFnKTtcblx0XHRcdFx0ZmlsZVVwbG9hZGVyLmFkZEhlYWRlclBhcmFtZXRlcihoZWFkZXJQYXJhbWV0ZXJFVGFnKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGhlYWRlclBhcmFtZXRlckFjY2VwdCA9IG5ldyBGaWxlVXBsb2FkZXJQYXJhbWV0ZXIoKTtcblx0XHRcdGhlYWRlclBhcmFtZXRlckFjY2VwdC5zZXROYW1lKFwiQWNjZXB0XCIpO1xuXHRcdFx0aGVhZGVyUGFyYW1ldGVyQWNjZXB0LnNldFZhbHVlKFwiYXBwbGljYXRpb24vanNvblwiKTtcblx0XHRcdGZpbGVVcGxvYWRlci5hZGRIZWFkZXJQYXJhbWV0ZXIoaGVhZGVyUGFyYW1ldGVyQWNjZXB0KTtcblxuXHRcdFx0Ly8gc3luY2hyb25pemUgdXBsb2FkIHdpdGggb3RoZXIgcmVxdWVzdHNcblx0XHRcdGNvbnN0IHVwbG9hZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLnVwbG9hZFByb21pc2VzID0gdGhpcy51cGxvYWRQcm9taXNlcyB8fCB7fTtcblx0XHRcdFx0dGhpcy51cGxvYWRQcm9taXNlc1tmaWxlVXBsb2FkZXIuZ2V0SWQoKV0gPSB7XG5cdFx0XHRcdFx0cmVzb2x2ZTogcmVzb2x2ZSxcblx0XHRcdFx0XHRyZWplY3Q6IHJlamVjdFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRmaWxlVXBsb2FkZXIudXBsb2FkKCk7XG5cdFx0XHR9KTtcblx0XHRcdEZFQ29udHJvbGxlci5lZGl0Rmxvdy5zeW5jVGFzayh1cGxvYWRQcm9taXNlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TWVzc2FnZUJveC5lcnJvcihnZXRSZXNvdXJjZU1vZGVsKGNvbnRyb2xsZXIpLmdldFRleHQoXCJNX0ZJRUxEX0ZJTEVVUExPQURFUl9BQk9SVEVEX1RFWFRcIikpO1xuXHRcdH1cblx0fSxcblxuXHRoYW5kbGVVcGxvYWRDb21wbGV0ZTogZnVuY3Rpb24gKFxuXHRcdGV2ZW50OiBGaWxlVXBsb2FkZXIkVXBsb2FkQ29tcGxldGVFdmVudCxcblx0XHRwcm9wZXJ0eUZpbGVOYW1lOiB7IHBhdGg6IHN0cmluZyB9IHwgdW5kZWZpbmVkLFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdGNvbnRyb2xsZXI6IENvbnRyb2xsZXJcblx0KSB7XG5cdFx0Y29uc3Qgc3RhdHVzID0gTnVtYmVyKGV2ZW50LmdldFBhcmFtZXRlcihcInN0YXR1c1wiKSksXG5cdFx0XHRmaWxlVXBsb2FkZXIgPSBldmVudC5nZXRTb3VyY2UoKSBhcyBGaWxlVXBsb2FkZXIsXG5cdFx0XHRmaWxlV3JhcHBlciA9IGZpbGVVcGxvYWRlci5nZXRQYXJlbnQoKSBhcyB1bmtub3duIGFzIEZpbGVXcmFwcGVyO1xuXG5cdFx0ZmlsZVdyYXBwZXIuc2V0VUlCdXN5KGZhbHNlKTtcblxuXHRcdGNvbnN0IGNvbnRleHQgPSBmaWxlVXBsb2FkZXIuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0IHwgdW5kZWZpbmVkIHwgbnVsbDtcblx0XHRpZiAoc3RhdHVzID09PSAwIHx8IHN0YXR1cyA+PSA0MDApIHtcblx0XHRcdHRoaXMuX2Rpc3BsYXlNZXNzYWdlRm9yRmFpbGVkVXBsb2FkKGV2ZW50KTtcblx0XHRcdHRoaXMudXBsb2FkUHJvbWlzZXNbZmlsZVVwbG9hZGVyLmdldElkKCldLnJlamVjdCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBuZXdFVGFnID0gKGV2ZW50LmdldFBhcmFtZXRlcihcImhlYWRlcnNcIikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5ldGFnO1xuXG5cdFx0XHRpZiAobmV3RVRhZykge1xuXHRcdFx0XHQvLyBzZXQgbmV3IGV0YWcgZm9yIGZpbGVuYW1lIHVwZGF0ZSwgYnV0IHdpdGhvdXQgc2VuZGluZyBwYXRjaCByZXF1ZXN0XG5cdFx0XHRcdGNvbnRleHQ/LnNldFByb3BlcnR5KFwiQG9kYXRhLmV0YWdcIiwgbmV3RVRhZywgbnVsbCBhcyBhbnkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzZXQgZmlsZW5hbWUgZm9yIGxpbmsgdGV4dFxuXHRcdFx0aWYgKHByb3BlcnR5RmlsZU5hbWU/LnBhdGgpIHtcblx0XHRcdFx0Y29udGV4dD8uc2V0UHJvcGVydHkocHJvcGVydHlGaWxlTmFtZS5wYXRoLCBmaWxlVXBsb2FkZXIuZ2V0VmFsdWUoKSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGRlbGV0ZSB0aGUgYXZhdGFyIGNhY2hlIHRoYXQgbm90IGdldHMgdXBkYXRlZCBvdGhlcndpc2Vcblx0XHRcdGZpbGVXcmFwcGVyLmF2YXRhcj8ucmVmcmVzaEF2YXRhckNhY2hlQnVzdGluZygpO1xuXG5cdFx0XHR0aGlzLl9jYWxsU2lkZUVmZmVjdHNGb3JTdHJlYW0oZXZlbnQsIGZpbGVXcmFwcGVyLCBjb250cm9sbGVyKTtcblxuXHRcdFx0dGhpcy51cGxvYWRQcm9taXNlc1tmaWxlVXBsb2FkZXIuZ2V0SWQoKV0ucmVzb2x2ZSgpO1xuXHRcdH1cblxuXHRcdGRlbGV0ZSB0aGlzLnVwbG9hZFByb21pc2VzW2ZpbGVVcGxvYWRlci5nZXRJZCgpXTtcblxuXHRcdC8vIENvbGxhYm9yYXRpb24gRHJhZnQgQWN0aXZpdHkgU3luY1xuXHRcdGNvbnN0IGlzQ29sbGFib3JhdGlvbkVuYWJsZWQgPSBDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLmlzQ29ubmVjdGVkKGZpbGVVcGxvYWRlcik7XG5cdFx0aWYgKCFpc0NvbGxhYm9yYXRpb25FbmFibGVkIHx8ICFjb250ZXh0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgbm90aWZpY2F0aW9uRGF0YSA9IFtgJHtjb250ZXh0LmdldFBhdGgoKX0vJHtwcm9wZXJ0eVBhdGh9YF07XG5cdFx0aWYgKHByb3BlcnR5RmlsZU5hbWU/LnBhdGgpIHtcblx0XHRcdG5vdGlmaWNhdGlvbkRhdGEucHVzaChgJHtjb250ZXh0LmdldFBhdGgoKX0vJHtwcm9wZXJ0eUZpbGVOYW1lLnBhdGh9YCk7XG5cdFx0fVxuXG5cdFx0bGV0IGJpbmRpbmcgPSBjb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRpZiAoIWJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0VmlldyhmaWxlVXBsb2FkZXIpO1xuXHRcdFx0YmluZGluZyA9IChvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpLmdldEJpbmRpbmcoKTtcblx0XHR9XG5cdFx0aWYgKGJpbmRpbmcuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0YmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAoKSA9PiB7XG5cdFx0XHRcdENvbGxhYm9yYXRpb25BY3Rpdml0eVN5bmMuc2VuZChmaWxlV3JhcHBlciwgeyBhY3Rpb246IEFjdGl2aXR5LkNoYW5nZSwgY29udGVudDogbm90aWZpY2F0aW9uRGF0YSB9KTtcblx0XHRcdFx0Q29sbGFib3JhdGlvbkFjdGl2aXR5U3luYy5zZW5kKGZpbGVXcmFwcGVyLCB7IGFjdGlvbjogQWN0aXZpdHkuVW5sb2NrLCBjb250ZW50OiBub3RpZmljYXRpb25EYXRhIH0pO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdENvbGxhYm9yYXRpb25BY3Rpdml0eVN5bmMuc2VuZChmaWxlV3JhcHBlciwgeyBhY3Rpb246IEFjdGl2aXR5LkNoYW5nZSwgY29udGVudDogbm90aWZpY2F0aW9uRGF0YSB9KTtcblx0XHRcdENvbGxhYm9yYXRpb25BY3Rpdml0eVN5bmMuc2VuZChmaWxlV3JhcHBlciwgeyBhY3Rpb246IEFjdGl2aXR5LlVubG9jaywgY29udGVudDogbm90aWZpY2F0aW9uRGF0YSB9KTtcblx0XHR9XG5cdH0sXG5cblx0X2Rpc3BsYXlNZXNzYWdlRm9yRmFpbGVkVXBsb2FkOiBmdW5jdGlvbiAob0V2ZW50OiBGaWxlVXBsb2FkZXIkVXBsb2FkQ29tcGxldGVFdmVudCk6IHZvaWQge1xuXHRcdC8vIGhhbmRsaW5nIG9mIGJhY2tlbmQgZXJyb3JzXG5cdFx0Y29uc3Qgc0Vycm9yID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInJlc3BvbnNlUmF3XCIpIHx8IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyZXNwb25zZVwiKTtcblx0XHRsZXQgc01lc3NhZ2VUZXh0LCBvRXJyb3I7XG5cdFx0dHJ5IHtcblx0XHRcdG9FcnJvciA9IHNFcnJvciAmJiBKU09OLnBhcnNlKHNFcnJvcik7XG5cdFx0XHRzTWVzc2FnZVRleHQgPSBvRXJyb3IuZXJyb3IgJiYgb0Vycm9yLmVycm9yLm1lc3NhZ2U7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0c01lc3NhZ2VUZXh0ID0gc0Vycm9yIHx8IGdldFJlc291cmNlTW9kZWwob0V2ZW50LmdldFNvdXJjZSgpIGFzIENvbnRyb2wpLmdldFRleHQoXCJNX0ZJRUxEX0ZJTEVVUExPQURFUl9BQk9SVEVEX1RFWFRcIik7XG5cdFx0fVxuXHRcdE1lc3NhZ2VCb3guZXJyb3Ioc01lc3NhZ2VUZXh0KTtcblx0fSxcblxuXHRyZW1vdmVTdHJlYW06IGZ1bmN0aW9uIChldmVudDogRXZlbnQsIHByb3BlcnR5RmlsZU5hbWU6IHsgcGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQsIHByb3BlcnR5UGF0aDogc3RyaW5nLCBjb250cm9sbGVyOiBDb250cm9sbGVyKSB7XG5cdFx0Y29uc3QgZGVsZXRlQnV0dG9uID0gZXZlbnQuZ2V0U291cmNlKCkgYXMgQnV0dG9uO1xuXHRcdGNvbnN0IGZpbGVXcmFwcGVyID0gZGVsZXRlQnV0dG9uLmdldFBhcmVudCgpIGFzIHVua25vd24gYXMgRmlsZVdyYXBwZXI7XG5cdFx0Y29uc3QgY29udGV4dCA9IGZpbGVXcmFwcGVyLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblxuXHRcdC8vIHN0cmVhbXMgYXJlIHJlbW92ZWQgYnkgYXNzaWduaW5nIHRoZSBudWxsIHZhbHVlXG5cdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgsIG51bGwpO1xuXHRcdC8vIFdoZW4gc2V0dGluZyB0aGUgcHJvcGVydHkgdG8gbnVsbCwgdGhlIHVwbG9hZFVybCAoQEBNT0RFTC5mb3JtYXQpIGlzIHNldCB0byBcIlwiIGJ5IHRoZSBtb2RlbFxuXHRcdC8vXHR3aXRoIHRoYXQgYW5vdGhlciB1cGxvYWQgaXMgbm90IHBvc3NpYmxlIGJlZm9yZSByZWZyZXNoaW5nIHRoZSBwYWdlXG5cdFx0Ly8gKHJlZnJlc2hpbmcgdGhlIHBhZ2Ugd291bGQgcmVjcmVhdGUgdGhlIFVSTClcblx0XHQvL1x0VGhpcyBpcyB0aGUgd29ya2Fyb3VuZDpcblx0XHQvL1x0V2Ugc2V0IHRoZSBwcm9wZXJ0eSB0byB1bmRlZmluZWQgb25seSBvbiB0aGUgZnJvbnRlbmQgd2hpY2ggd2lsbCByZWNyZWF0ZSB0aGUgdXBsb2FkVXJsXG5cdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgsIHVuZGVmaW5lZCwgbnVsbCBhcyBhbnkpO1xuXG5cdFx0dGhpcy5fY2FsbFNpZGVFZmZlY3RzRm9yU3RyZWFtKGV2ZW50LCBmaWxlV3JhcHBlciwgY29udHJvbGxlcik7XG5cblx0XHQvLyBDb2xsYWJvcmF0aW9uIERyYWZ0IEFjdGl2aXR5IFN5bmNcblx0XHRjb25zdCBiQ29sbGFib3JhdGlvbkVuYWJsZWQgPSBDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLmlzQ29ubmVjdGVkKGRlbGV0ZUJ1dHRvbik7XG5cdFx0aWYgKGJDb2xsYWJvcmF0aW9uRW5hYmxlZCkge1xuXHRcdFx0bGV0IGJpbmRpbmcgPSBjb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdGlmICghYmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRjb25zdCBvVmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcoZGVsZXRlQnV0dG9uKTtcblx0XHRcdFx0YmluZGluZyA9IChvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpLmdldEJpbmRpbmcoKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZGF0YSA9IFtgJHtjb250ZXh0LmdldFBhdGgoKX0vJHtwcm9wZXJ0eVBhdGh9YF07XG5cdFx0XHRpZiAocHJvcGVydHlGaWxlTmFtZT8ucGF0aCkge1xuXHRcdFx0XHRkYXRhLnB1c2goYCR7Y29udGV4dC5nZXRQYXRoKCl9LyR7cHJvcGVydHlGaWxlTmFtZS5wYXRofWApO1xuXHRcdFx0fVxuXHRcdFx0Q29sbGFib3JhdGlvbkFjdGl2aXR5U3luYy5zZW5kKGRlbGV0ZUJ1dHRvbiwgeyBhY3Rpb246IEFjdGl2aXR5LkxvY2ssIGNvbnRlbnQ6IGRhdGEgfSk7XG5cblx0XHRcdGJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLnNlbmQoZGVsZXRlQnV0dG9uLCB7IGFjdGlvbjogQWN0aXZpdHkuQ2hhbmdlLCBjb250ZW50OiBkYXRhIH0pO1xuXHRcdFx0XHRDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLnNlbmQoZGVsZXRlQnV0dG9uLCB7IGFjdGlvbjogQWN0aXZpdHkuVW5sb2NrLCBjb250ZW50OiBkYXRhIH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdF9jYWxsU2lkZUVmZmVjdHNGb3JTdHJlYW06IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSwgb0NvbnRyb2w6IGFueSwgb0NvbnRyb2xsZXI6IGFueSkge1xuXHRcdGNvbnN0IG9GRUNvbnRyb2xsZXIgPSBGaWVsZFJ1bnRpbWUuX2dldEV4dGVuc2lvbkNvbnRyb2xsZXIob0NvbnRyb2xsZXIpO1xuXHRcdGlmIChvQ29udHJvbCAmJiBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpLmlzVHJhbnNpZW50KCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRvRXZlbnQub1NvdXJjZSA9IG9Db250cm9sO1xuXHRcdH1cblx0XHRvRkVDb250cm9sbGVyLl9zaWRlRWZmZWN0cy5oYW5kbGVGaWVsZENoYW5nZShvRXZlbnQsIHRoaXMuZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlKG9FdmVudCkuc3RhdGVbXCJ2YWxpZGl0eVwiXSk7XG5cdH0sXG5cblx0Z2V0SWNvbkZvck1pbWVUeXBlOiBmdW5jdGlvbiAoc01pbWVUeXBlOiBhbnkpIHtcblx0XHRyZXR1cm4gSWNvblBvb2wuZ2V0SWNvbkZvck1pbWVUeXBlKHNNaW1lVHlwZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZXRyaWV2ZSB0ZXh0IGZyb20gdmFsdWUgbGlzdCBmb3IgRGF0YUZpZWxkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdFxuXHQgKiBAcGFyYW0gc1Byb3BlcnR5VmFsdWUgVGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBkYXRhZmllbGRcblx0ICogQHBhcmFtIHNQcm9wZXJ0eUZ1bGxQYXRoIFRoZSBwcm9wZXJ0eSBmdWxsIHBhdGgnc1xuXHQgKiBAcGFyYW0gc0Rpc3BsYXlGb3JtYXQgVGhlIGRpc3BsYXkgZm9ybWF0IGZvciB0aGUgZGF0YWZpZWxkXG5cdCAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgdmFsdWUgaW4gY29ycmVzcG9uZGluZyBkaXNwbGF5IGZvcm1hdC5cblx0ICovXG5cdHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Q6IGZ1bmN0aW9uIChzUHJvcGVydHlWYWx1ZTogc3RyaW5nLCBzUHJvcGVydHlGdWxsUGF0aDogc3RyaW5nLCBzRGlzcGxheUZvcm1hdDogc3RyaW5nKSB7XG5cdFx0bGV0IHNUZXh0UHJvcGVydHk6IHN0cmluZztcblx0XHRsZXQgb01ldGFNb2RlbDtcblx0XHRsZXQgc1Byb3BlcnR5TmFtZTogc3RyaW5nO1xuXHRcdGlmIChzUHJvcGVydHlWYWx1ZSkge1xuXHRcdFx0b01ldGFNb2RlbCA9IENvbW1vbkhlbHBlci5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdHNQcm9wZXJ0eU5hbWUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUHJvcGVydHlGdWxsUGF0aH1Ac2FwdWkubmFtZWApO1xuXHRcdFx0cmV0dXJuIG9NZXRhTW9kZWxcblx0XHRcdFx0LnJlcXVlc3RWYWx1ZUxpc3RJbmZvKHNQcm9wZXJ0eUZ1bGxQYXRoLCB0cnVlKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAobVZhbHVlTGlzdEluZm86IGFueSkge1xuXHRcdFx0XHRcdC8vIHRha2UgdGhlIFwiXCIgb25lIGlmIGV4aXN0cywgb3RoZXJ3aXNlIHRha2UgdGhlIGZpcnN0IG9uZSBpbiB0aGUgb2JqZWN0IFRPRE86IHRvIGJlIGRpc2N1c3NlZFxuXHRcdFx0XHRcdGNvbnN0IG9WYWx1ZUxpc3RJbmZvID0gbVZhbHVlTGlzdEluZm9bbVZhbHVlTGlzdEluZm9bXCJcIl0gPyBcIlwiIDogT2JqZWN0LmtleXMobVZhbHVlTGlzdEluZm8pWzBdXTtcblx0XHRcdFx0XHRjb25zdCBvVmFsdWVMaXN0TW9kZWwgPSBvVmFsdWVMaXN0SW5mby4kbW9kZWw7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbFZhbHVlTGlzdCA9IG9WYWx1ZUxpc3RNb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRjb25zdCBvUGFyYW1XaXRoS2V5ID0gb1ZhbHVlTGlzdEluZm8uUGFyYW1ldGVycy5maW5kKGZ1bmN0aW9uIChvUGFyYW1ldGVyOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvUGFyYW1ldGVyLkxvY2FsRGF0YVByb3BlcnR5ICYmIG9QYXJhbWV0ZXIuTG9jYWxEYXRhUHJvcGVydHkuJFByb3BlcnR5UGF0aCA9PT0gc1Byb3BlcnR5TmFtZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAob1BhcmFtV2l0aEtleSAmJiAhb1BhcmFtV2l0aEtleS5WYWx1ZUxpc3RQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBJbmNvbnNpc3RlbnQgdmFsdWUgaGVscCBhbm5vdGF0aW9uIGZvciAke3NQcm9wZXJ0eU5hbWV9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IG9UZXh0QW5ub3RhdGlvbiA9IG9NZXRhTW9kZWxWYWx1ZUxpc3QuZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdFx0YC8ke29WYWx1ZUxpc3RJbmZvLkNvbGxlY3Rpb25QYXRofS8ke29QYXJhbVdpdGhLZXkuVmFsdWVMaXN0UHJvcGVydHl9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0YFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAob1RleHRBbm5vdGF0aW9uICYmIG9UZXh0QW5ub3RhdGlvbi4kUGF0aCkge1xuXHRcdFx0XHRcdFx0c1RleHRQcm9wZXJ0eSA9IG9UZXh0QW5ub3RhdGlvbi4kUGF0aDtcblx0XHRcdFx0XHRcdGNvbnN0IG9GaWx0ZXIgPSBuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogb1BhcmFtV2l0aEtleS5WYWx1ZUxpc3RQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0dmFsdWUxOiBzUHJvcGVydHlWYWx1ZVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvVmFsdWVMaXN0TW9kZWwuYmluZExpc3QoYC8ke29WYWx1ZUxpc3RJbmZvLkNvbGxlY3Rpb25QYXRofWAsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvRmlsdGVyLCB7XG5cdFx0XHRcdFx0XHRcdCRzZWxlY3Q6IHNUZXh0UHJvcGVydHlcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNEaXNwbGF5Rm9ybWF0ID0gXCJWYWx1ZVwiO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNQcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFDb250ZXh0czogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgc0Rlc2NyaXB0aW9uID0gc1RleHRQcm9wZXJ0eSA/IGFDb250ZXh0c1swXT8uZ2V0T2JqZWN0KClbc1RleHRQcm9wZXJ0eV0gOiBcIlwiO1xuXHRcdFx0XHRcdHN3aXRjaCAoc0Rpc3BsYXlGb3JtYXQpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gc0Rlc2NyaXB0aW9uO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikuZ2V0VGV4dChcIkNfRk9STUFUX0ZPUl9URVhUX0FSUkFOR0VNRU5UXCIsIFtcblx0XHRcdFx0XHRcdFx0XHRzRGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5VmFsdWVcblx0XHRcdFx0XHRcdFx0XSk7XG5cdFx0XHRcdFx0XHRjYXNlIFwiVmFsdWVEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKS5nZXRUZXh0KFwiQ19GT1JNQVRfRk9SX1RFWFRfQVJSQU5HRU1FTlRcIiwgW1xuXHRcdFx0XHRcdFx0XHRcdHNQcm9wZXJ0eVZhbHVlLFxuXHRcdFx0XHRcdFx0XHRcdHNEZXNjcmlwdGlvblxuXHRcdFx0XHRcdFx0XHRdKTtcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdHJldHVybiBzUHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBzTXNnID1cblx0XHRcdFx0XHRcdG9FcnJvci5zdGF0dXMgJiYgb0Vycm9yLnN0YXR1cyA9PT0gNDA0XG5cdFx0XHRcdFx0XHRcdD8gYE1ldGFkYXRhIG5vdCBmb3VuZCAoJHtvRXJyb3Iuc3RhdHVzfSkgZm9yIHZhbHVlIGhlbHAgb2YgcHJvcGVydHkgJHtzUHJvcGVydHlGdWxsUGF0aH1gXG5cdFx0XHRcdFx0XHRcdDogb0Vycm9yLm1lc3NhZ2U7XG5cdFx0XHRcdFx0TG9nLmVycm9yKHNNc2cpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHNQcm9wZXJ0eVZhbHVlO1xuXHR9LFxuXG5cdGhhbmRsZVR5cGVNaXNzbWF0Y2g6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9FdmVudC5nZXRTb3VyY2UoKSk7XG5cdFx0TWVzc2FnZUJveC5lcnJvcihyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJNX0ZJRUxEX0ZJTEVVUExPQURFUl9XUk9OR19NSU1FVFlQRVwiKSwge1xuXHRcdFx0ZGV0YWlsczpcblx0XHRcdFx0YDxwPjxzdHJvbmc+JHtyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJNX0ZJRUxEX0ZJTEVVUExPQURFUl9XUk9OR19NSU1FVFlQRV9ERVRBSUxTX1NFTEVDVEVEXCIpfTwvc3Ryb25nPjwvcD4ke1xuXHRcdFx0XHRcdG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkubWltZVR5cGVcblx0XHRcdFx0fTxicj48YnI+YCArXG5cdFx0XHRcdGA8cD48c3Ryb25nPiR7cmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiTV9GSUVMRF9GSUxFVVBMT0FERVJfV1JPTkdfTUlNRVRZUEVfREVUQUlMU19BTExPV0VEXCIpfTwvc3Ryb25nPjwvcD4ke29FdmVudFxuXHRcdFx0XHRcdC5nZXRTb3VyY2UoKVxuXHRcdFx0XHRcdC5nZXRNaW1lVHlwZSgpXG5cdFx0XHRcdFx0LnRvU3RyaW5nKClcblx0XHRcdFx0XHQucmVwbGFjZUFsbChcIixcIiwgXCIsIFwiKX1gLFxuXHRcdFx0Y29udGVudFdpZHRoOiBcIjE1MHB4XCJcblx0XHR9IGFzIGFueSk7XG5cdH0sXG5cblx0aGFuZGxlRmlsZVNpemVFeGNlZWQ6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSAvKmlGaWxlU2l6ZTogYW55Ki8pIHtcblx0XHRNZXNzYWdlQm94LmVycm9yKFxuXHRcdFx0Z2V0UmVzb3VyY2VNb2RlbChvRXZlbnQuZ2V0U291cmNlKCkpLmdldFRleHQoXG5cdFx0XHRcdFwiTV9GSUVMRF9GSUxFVVBMT0FERVJfRklMRV9UT09fQklHXCIsXG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5nZXRNYXhpbXVtRmlsZVNpemUoKS50b0ZpeGVkKDMpXG5cdFx0XHQpLFxuXHRcdFx0e1xuXHRcdFx0XHRjb250ZW50V2lkdGg6IFwiMTUwcHhcIlxuXHRcdFx0fSBhcyBhbnlcblx0XHQpO1xuXHR9LFxuXG5cdF9nZXRFeHRlbnNpb25Db250cm9sbGVyOiBmdW5jdGlvbiAob0NvbnRyb2xsZXI6IGFueSkge1xuXHRcdHJldHVybiBvQ29udHJvbGxlci5pc0EoXCJzYXAuZmUuY29yZS5FeHRlbnNpb25BUElcIikgPyBvQ29udHJvbGxlci5fY29udHJvbGxlciA6IG9Db250cm9sbGVyO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBFdmVudCBoYW5kbGVyIHRvIGNyZWF0ZSBhbmQgc2hvdyB3aG8gaXMgZWRpdGluZyB0aGUgZmllbGQgcG9wb3Zlci5cblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZSBUaGUgYXZhdGFyIHdoaWNoIGlzIG5leHQgdG8gdGhlIGZpZWxkIGxvY2tlZFxuXHQgKiBAcGFyYW0gdmlldyBDdXJyZW50IHZpZXdcblx0ICovXG5cdHNob3dDb2xsYWJvcmF0aW9uRWRpdFVzZXI6IGZ1bmN0aW9uIChzb3VyY2U6IEF2YXRhciwgdmlldzogVmlldykge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBSZXNvdXJjZU1vZGVsSGVscGVyLmdldFJlc291cmNlTW9kZWwodmlldyk7XG5cdFx0bGV0IHBvcG92ZXIgPSBDb3JlLmJ5SWQoYG1hbmFnZUNvbGxhYm9yYXRpb25EcmFmdC0tZWRpdFVzZXJgKSBhcyBSZXNwb25zaXZlUG9wb3ZlcjtcblxuXHRcdGlmICghcG9wb3Zlcikge1xuXHRcdFx0cG9wb3ZlciA9IG5ldyBSZXNwb25zaXZlUG9wb3ZlcihcIm1hbmFnZUNvbGxhYm9yYXRpb25EcmFmdC0tZWRpdFVzZXJcIiwge1xuXHRcdFx0XHRzaG93SGVhZGVyOiBmYWxzZSxcblx0XHRcdFx0cGxhY2VtZW50OiBcIkJvdHRvbVwiXG5cdFx0XHR9KTtcblx0XHRcdHBvcG92ZXIuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHR2aWV3LmFkZERlcGVuZGVudChwb3BvdmVyKTtcblx0XHR9XG5cblx0XHRjb25zdCBiaW5kaW5nUGF0aCA9IChzb3VyY2UuZ2V0QmluZGluZyhcImluaXRpYWxzXCIpIGFzIENvbXBvc2l0ZUJpbmRpbmcpXG5cdFx0XHQ/LmdldEJpbmRpbmdzKClcblx0XHRcdC5maW5kKChiaW5kaW5nKSA9PiBiaW5kaW5nPy5nZXRQYXRoKCk/LnN0YXJ0c1dpdGgoXCIvY29sbGFib3JhdGlvbi9hY3Rpdml0aWVzXCIpKVxuXHRcdFx0LmdldFBhdGgoKTtcblx0XHRjb25zdCBhY3Rpdml0aWVzID0gc291cmNlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldE9iamVjdChiaW5kaW5nUGF0aCk7XG5cblx0XHRsZXQgZWRpdGluZ0FjdGl2aXR5OiBVc2VyQWN0aXZpdHkgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKGFjdGl2aXRpZXMgJiYgYWN0aXZpdGllcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRlZGl0aW5nQWN0aXZpdHkgPSBhY3Rpdml0aWVzLmZpbmQoKGFjdGl2aXR5OiBVc2VyQWN0aXZpdHkpID0+IHtcblx0XHRcdFx0cmV0dXJuIGFjdGl2aXR5LmtleSA9PT0gZ2V0QWN0aXZpdHlLZXlGcm9tUGF0aChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSEuZ2V0UGF0aCgpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRwb3BvdmVyLmRlc3Ryb3lDb250ZW50KCk7XG5cdFx0cG9wb3Zlci5hZGRDb250ZW50KFxuXHRcdFx0bmV3IExhYmVsKHtcblx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT0xMQUJPUkFUSU9OQVZBVEFSX1VTRVJfRURJVF9GSUVMRFwiLCBbYCR7ZWRpdGluZ0FjdGl2aXR5Py5uYW1lfWBdKVxuXHRcdFx0fSlcblx0XHQpO1xuXHRcdHBvcG92ZXIub3BlbkJ5KHNvdXJjZSk7XG5cdH1cbn07XG5cbi8qKlxuICogQGdsb2JhbFxuICovXG5leHBvcnQgZGVmYXVsdCBGaWVsZFJ1bnRpbWU7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7RUFrREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0EsdUJBQXVCLENBQUNDLEtBQWMsRUFBMEM7SUFDeEYsSUFBSUMsT0FBTyxHQUFJRCxLQUFLLENBQUNFLGlCQUFpQixFQUFFLENBQWFDLFVBQVUsRUFBRTtJQUVqRSxJQUFJLENBQUNGLE9BQU8sQ0FBQ0csR0FBRyxDQUFDLHdDQUF3QyxDQUFDLEVBQUU7TUFDM0QsTUFBTUMsS0FBSyxHQUFHQyxXQUFXLENBQUNDLGFBQWEsQ0FBQ1AsS0FBSyxDQUFDO01BQzlDQyxPQUFPLEdBQUlJLEtBQUssQ0FBQ0gsaUJBQWlCLEVBQUUsQ0FBYUMsVUFBVSxFQUFFO0lBQzlEO0lBRUEsT0FBT0YsT0FBTztFQUNmO0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTU8sWUFBWSxHQUFHO0lBQ3BCQyxjQUFjLEVBQUVDLFNBQWdCO0lBQ2hDQyxtQkFBbUIsRUFBRSxLQUFLO0lBRTFCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLDZCQUE2QixFQUFFLFVBQVVDLE9BQWdCLEVBQUVDLFdBQTJCLEVBQUVDLFFBQWdCLEVBQUU7TUFDekcsSUFBSUQsV0FBVyxDQUFDRSxRQUFRLEVBQUU7UUFDekIsSUFBSUMsZUFBZSxHQUFHSixPQUFPLENBQUNYLGlCQUFpQixFQUFhO1FBQzVELE1BQU1HLEtBQUssR0FBR0MsV0FBVyxDQUFDQyxhQUFhLENBQUNNLE9BQU8sQ0FBQztVQUMvQ0ssVUFBVSxHQUFHRCxlQUFlLENBQUNFLFFBQVEsRUFBRSxDQUFDQyxZQUFZLEVBQUU7VUFDdERDLFVBQVUsR0FBRyxVQUFVQyxRQUFjLEVBQUU7WUFDdEMsSUFBSUEsUUFBUSxFQUFFO2NBQ2JMLGVBQWUsR0FBR0ssUUFBUTtZQUMzQjtZQUNBUixXQUFXLENBQUNFLFFBQVEsQ0FBQ08sZ0JBQWdCLENBQUNOLGVBQWUsRUFBRUYsUUFBUSxFQUFFLElBQUksQ0FBQztVQUN2RSxDQUFDO1FBQ0Y7UUFDQSxJQUFLVixLQUFLLENBQUNtQixXQUFXLEVBQUUsQ0FBU0MsYUFBYSxLQUFLLFlBQVksSUFBSSxDQUFDQyxXQUFXLENBQUNDLHdCQUF3QixDQUFDVCxVQUFVLENBQUMsRUFBRTtVQUNySFUsS0FBSyxDQUFDQyx5Q0FBeUMsQ0FDOUNSLFVBQVUsRUFDVlMsUUFBUSxDQUFDQyxTQUFTLEVBQ2xCZCxlQUFlLEVBQ2ZaLEtBQUssQ0FBQzJCLGFBQWEsRUFBRSxFQUNyQixJQUFJLEVBQ0pKLEtBQUssQ0FBQ0ssY0FBYyxDQUFDQyxpQkFBaUIsQ0FDdEM7UUFDRixDQUFDLE1BQU07VUFDTmIsVUFBVSxFQUFFO1FBQ2I7TUFDRCxDQUFDLE1BQU07UUFDTmMsR0FBRyxDQUFDQyxLQUFLLENBQ1IsNEZBQTRGLEVBQzVGLGtDQUFrQyxFQUNsQywrQkFBK0IsQ0FDL0I7TUFDRjtJQUNELENBQUM7SUFFREMsdUJBQXVCLEVBQUUsVUFDeEJDLGFBQWtCLEVBQ2xCQyw2QkFBa0MsRUFDbENDLGNBQW1CLEVBQ25CQyxjQUFtQixFQUNuQkMsYUFBa0IsRUFDakI7TUFDRCxJQUFJRCxjQUFjLEtBQUsvQixTQUFTLElBQUk4QixjQUFjLEtBQUs5QixTQUFTLEtBQUssQ0FBQytCLGNBQWMsSUFBSUQsY0FBYyxDQUFDLElBQUksQ0FBQ0UsYUFBYSxFQUFFO1FBQzFILE9BQU9KLGFBQWEsS0FBS0MsNkJBQTZCO01BQ3ZELENBQUMsTUFBTTtRQUNOLE9BQU8sS0FBSztNQUNiO0lBQ0QsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0ksb0JBQW9CLEVBQUUsVUFBVTdCLFdBQW1CLEVBQUU4QixNQUFjLEVBQUU7TUFDcEUsTUFBTUMsYUFBYSxHQUFHckMsWUFBWSxDQUFDc0MsdUJBQXVCLENBQUNoQyxXQUFXLENBQUM7TUFDdkUrQixhQUFhLENBQUNFLFlBQVksQ0FBQ0Msc0JBQXNCLENBQUNKLE1BQU0sQ0FBQztJQUMxRCxDQUFDO0lBRURLLHFCQUFxQixFQUFFLFVBQVVqRCxLQUFZLEVBQUVrRCxVQUFzQixFQUFRO01BQzVFLE1BQU1DLElBQUksR0FBRzdDLFdBQVcsQ0FBQ0MsYUFBYSxDQUFDUCxLQUFLLENBQUM7TUFDN0MsTUFBTW9ELG1CQUFtQixHQUFHcEQsS0FBSyxDQUFDRSxpQkFBaUIsRUFBRTtNQUNyRCxJQUFJbUQsc0JBQXNCOztNQUUxQjtNQUNBLE1BQU1DLFlBQVksR0FBSUYsbUJBQW1CLGFBQW5CQSxtQkFBbUIsdUJBQW5CQSxtQkFBbUIsQ0FBY2pELFVBQVUsRUFBRTtNQUVuRSxJQUFJbUQsWUFBWSxDQUFDbEQsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLEVBQUU7UUFDL0Q7UUFDQWlELHNCQUFzQixHQUFHRCxtQkFBbUI7TUFDN0MsQ0FBQyxNQUFNO1FBQ047UUFDQTtRQUNBQyxzQkFBc0IsR0FBR0YsSUFBSSxDQUFDakQsaUJBQWlCLEVBQUU7TUFDbEQ7TUFDQSxNQUFNcUQsWUFBWSxHQUFHL0MsWUFBWSxDQUFDc0MsdUJBQXVCLENBQUNJLFVBQVUsQ0FBQztNQUNyRSxNQUFNTSxXQUFXLEdBQUd4RCxLQUFLLENBQUN5RCxZQUFZLEVBQUU7TUFDeEMsSUFBSUQsV0FBVyxJQUFJQSxXQUFXLENBQUNFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1FBQUE7UUFDOUQsTUFBTUMsT0FBTyxHQUFHSCxXQUFXLENBQUNJLFNBQVMsQ0FBQyxDQUFDLEVBQUVKLFdBQVcsQ0FBQ0ssT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbkYsTUFBTUMsS0FBSyxHQUFHWCxJQUFJLENBQUNZLElBQUksQ0FBQ0osT0FBTyxDQUFDO1FBQ2hDLE1BQU1LLGlCQUFpQixHQUFJRixLQUFLLGFBQUxBLEtBQUssMkNBQUxBLEtBQUssQ0FBRUcsU0FBUyxFQUFFLHFEQUFuQixpQkFBa0NDLG1CQUFtQixFQUFFO1FBQ2pGWCxZQUFZLENBQUNZLGVBQWUsQ0FBQ0MseUNBQXlDLENBQUNwRSxLQUFLLEVBQUUsQ0FDN0U7VUFBRXFFLE9BQU8sRUFBRWhCLHNCQUFzQjtVQUFFVztRQUFrQixDQUFDLENBQ3RELENBQUM7TUFDSCxDQUFDLE1BQU07UUFDTlQsWUFBWSxDQUFDWSxlQUFlLENBQUNDLHlDQUF5QyxDQUFDcEUsS0FBSyxFQUFFLENBQUM7VUFBRXFFLE9BQU8sRUFBRWhCO1FBQXVCLENBQUMsQ0FBQyxDQUFDO01BQ3JIO0lBQ0QsQ0FBQztJQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NpQixZQUFZLEVBQUUsVUFBVXhELFdBQTJCLEVBQUU4QixNQUF1RCxFQUFRO01BQ25ILE1BQU0yQixZQUFZLEdBQUczQixNQUFNLENBQUM0QixTQUFTLEVBQWE7UUFDakRDLFlBQVksR0FBR0YsWUFBWSxJQUFLQSxZQUFZLENBQUNyRSxpQkFBaUIsRUFBRSxDQUFTd0UsV0FBVyxFQUFFO1FBQ3RGQyxjQUFjLEdBQUcvQixNQUFNLENBQUNnQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUlDLE9BQU8sQ0FBQ0MsT0FBTyxFQUFFO1FBQ3BFakUsT0FBTyxHQUFHK0IsTUFBTSxDQUFDNEIsU0FBUyxFQUFFO1FBQzVCTyxNQUFNLEdBQUduQyxNQUFNLENBQUNnQyxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQ3JDSSxhQUFhLEdBQUcsSUFBSSxDQUFDQyxxQkFBcUIsQ0FBQ3JDLE1BQU0sQ0FBQyxDQUFDc0MsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUNwRWxGLEtBQUssR0FBRzRDLE1BQU0sQ0FBQzRCLFNBQVMsRUFBYTs7TUFFdEM7TUFDQSxNQUFNM0IsYUFBYSxHQUFHckMsWUFBWSxDQUFDc0MsdUJBQXVCLENBQUNoQyxXQUFXLENBQUM7O01BRXZFO01BQ0E7TUFDQTZELGNBQWMsQ0FDWlEsSUFBSSxDQUFDLFlBQVk7UUFDakI7UUFDQ3ZDLE1BQU0sQ0FBUy9CLE9BQU8sR0FBR0EsT0FBTztRQUNoQytCLE1BQU0sQ0FBU3dDLFdBQVcsR0FBRztVQUM3QkMsS0FBSyxFQUFFTjtRQUNSLENBQUM7UUFDQU8sUUFBUSxDQUFTaEIsWUFBWSxDQUFDMUIsTUFBTSxFQUFFOUIsV0FBVyxDQUFDO1FBQ25ELElBQUksQ0FBQzJELFlBQVksRUFBRTtVQUNsQjtVQUNBO1VBQ0E1QixhQUFhLENBQUNFLFlBQVksQ0FBQ3dDLGlCQUFpQixDQUFDM0MsTUFBTSxFQUFFb0MsYUFBYSxFQUFFTCxjQUFjLEVBQUUsSUFBSSxDQUFDO1FBQzFGO1FBQ0E7UUFDQW5FLFlBQVksQ0FBQ3lDLHFCQUFxQixDQUFDakQsS0FBSyxFQUFXYyxXQUFXLENBQUM7UUFDL0Q7TUFDRCxDQUFDLENBQUMsQ0FDRDBFLEtBQUssQ0FBQyxTQUFVO01BQUEsR0FBaUI7UUFDakM7UUFDQzVDLE1BQU0sQ0FBUy9CLE9BQU8sR0FBR0EsT0FBTztRQUNoQytCLE1BQU0sQ0FBU3dDLFdBQVcsR0FBRztVQUM3QkMsS0FBSyxFQUFFO1FBQ1IsQ0FBQztRQUNEbEQsR0FBRyxDQUFDc0QsS0FBSyxDQUFDLG1GQUFtRixDQUFDO1FBQzlGO1FBQ0E7UUFDQ0gsUUFBUSxDQUFTaEIsWUFBWSxDQUFDMUIsTUFBTSxFQUFFOUIsV0FBVyxDQUFDO01BQ3BELENBQUMsQ0FBQztNQUVIK0IsYUFBYSxDQUFDNkMsUUFBUSxDQUFDQyxRQUFRLENBQUNoQixjQUFjLENBQUM7O01BRS9DO01BQ0E7TUFDQSxJQUFJRixZQUFZLEVBQUU7UUFDakI7TUFDRDtNQUVBNUIsYUFBYSxDQUFDRSxZQUFZLENBQUM2QyxrQ0FBa0MsQ0FBQ2hELE1BQU0sRUFBRW9DLGFBQWEsRUFBRUwsY0FBYyxDQUFDO01BQ3BHO01BQ0EsTUFBTWtCLHFCQUFxQixHQUFHQyx5QkFBeUIsQ0FBQ0MsV0FBVyxDQUFDL0YsS0FBSyxDQUFDO01BRTFFLElBQUk2RixxQkFBcUIsSUFBSWIsYUFBYSxFQUFFO1FBQUE7UUFDM0MsTUFBTS9FLE9BQU8sR0FBR0YsdUJBQXVCLENBQUNDLEtBQUssQ0FBQztRQUU5QyxNQUFNZ0csSUFBSSxHQUFHLENBQ1osSUFBSSxTQUFDaEcsS0FBSyxDQUFDaUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJakcsS0FBSyxDQUFDaUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyx5Q0FBbEUsS0FBcUVDLEtBQUssS0FBSSxFQUFFLENBQUMsRUFDckYsSUFBSSwwQkFBQWxHLEtBQUssQ0FBQ2lHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQywwREFBdkMsc0JBQXlDQyxLQUFLLEtBQUksRUFBRSxDQUFDLENBQ3pELENBQ0NDLE1BQU0sQ0FBRUMsSUFBSSxJQUFLO1VBQ2pCLE9BQU8sQ0FBQUEsSUFBSSxhQUFKQSxJQUFJLHVCQUFKQSxJQUFJLENBQUVDLElBQUksTUFBSzNGLFNBQVMsSUFBSTBGLElBQUksQ0FBQ0MsSUFBSSxDQUFDeEMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUNEeUMsR0FBRyxDQUFDLFVBQVVGLElBQXNCLEVBQUU7VUFBQTtVQUN0QyxPQUFRLDRCQUFFcEcsS0FBSyxDQUFDRSxpQkFBaUIsRUFBRSwwREFBekIsc0JBQTJCcUcsT0FBTyxFQUFHLElBQUdILElBQUksQ0FBQ0MsSUFBSyxFQUFDO1FBQzlELENBQUMsQ0FBQzs7UUFFSDtRQUNBO1FBQ0FQLHlCQUF5QixDQUFDVSxtQkFBbUIsQ0FBQ3hHLEtBQUssRUFBRWdHLElBQUksQ0FBQztRQUUxRCxNQUFNUyxtQkFBbUIsR0FBRyxNQUFNO1VBQ2pDLElBQUl4RyxPQUFPLENBQUN5RyxpQkFBaUIsRUFBRSxFQUFFO1lBQ2hDO1lBQ0F6RyxPQUFPLENBQUMwRyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsWUFBWTtjQUNyRGIseUJBQXlCLENBQUNjLElBQUksQ0FBQzVHLEtBQUssRUFBRTtnQkFBRTZHLE1BQU0sRUFBRUMsUUFBUSxDQUFDQyxNQUFNO2dCQUFFQyxPQUFPLEVBQUVoQjtjQUFLLENBQUMsQ0FBQztjQUNqRkYseUJBQXlCLENBQUNtQixvQkFBb0IsQ0FBQ2pILEtBQUssRUFBRWdHLElBQUksQ0FBQztZQUM1RCxDQUFDLENBQUM7VUFDSCxDQUFDLE1BQU07WUFDTkYseUJBQXlCLENBQUNtQixvQkFBb0IsQ0FBQ2pILEtBQUssRUFBRWdHLElBQUksQ0FBQztVQUM1RDtRQUNELENBQUM7UUFDRCxJQUFJekIsWUFBWSxDQUFDbkUsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7VUFDekN1RSxjQUFjLENBQ1pRLElBQUksQ0FBQyxNQUFNO1lBQ1hzQixtQkFBbUIsRUFBRTtZQUNyQjtVQUNELENBQUMsQ0FBQyxDQUNEakIsS0FBSyxDQUFDLE1BQU07WUFDWmlCLG1CQUFtQixFQUFFO1VBQ3RCLENBQUMsQ0FBQztRQUNKLENBQUMsTUFBTTtVQUNOQSxtQkFBbUIsRUFBRTtRQUN0QjtNQUNEO0lBQ0QsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NTLGdCQUFnQixFQUFFLFVBQVVDLEtBQVksRUFBUTtNQUM5QzdCLFFBQVEsQ0FBa0I0QixnQkFBZ0IsQ0FBQ0MsS0FBSyxDQUFDO0lBQ25ELENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0Msd0NBQXdDLENBQUNDLFlBQTBCLEVBQUVSLE1BQWdCLEVBQVE7TUFDNUYsSUFBSWYseUJBQXlCLENBQUNDLFdBQVcsQ0FBQ3NCLFlBQVksQ0FBQyxFQUFFO1FBQUE7UUFDeEQsTUFBTUMsV0FBVyw0QkFBR0QsWUFBWSxDQUFDcEQsU0FBUyxFQUFFLDBEQUF4QixzQkFBMEJzRCxXQUFXLENBQUMsY0FBYyxDQUFDO1FBQ3pFLE1BQU1DLFFBQVEsR0FBSSw0QkFBRUgsWUFBWSxDQUFDbkgsaUJBQWlCLEVBQUUsMERBQWhDLHNCQUFrQ3FHLE9BQU8sRUFBRyxJQUFHZSxXQUFZLEVBQUM7UUFDaEZ4Qix5QkFBeUIsQ0FBQ2MsSUFBSSxDQUFDUyxZQUFZLEVBQUU7VUFBRVIsTUFBTTtVQUFFRyxPQUFPLEVBQUVRO1FBQVMsQ0FBQyxDQUFDO01BQzVFO0lBQ0QsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQ0Msa0JBQWtCLEVBQUUsVUFBVU4sS0FBWSxFQUFRO01BQ2pELE1BQU1FLFlBQVksR0FBR0YsS0FBSyxDQUFDM0MsU0FBUyxFQUFrQjtNQUN0RGhFLFlBQVksQ0FBQzRHLHdDQUF3QyxDQUFDQyxZQUFZLEVBQUVQLFFBQVEsQ0FBQ1ksSUFBSSxDQUFDO0lBQ25GLENBQUM7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLG1CQUFtQixFQUFFLFVBQVVSLEtBQVksRUFBUTtNQUNsRCxNQUFNRSxZQUFZLEdBQUdGLEtBQUssQ0FBQzNDLFNBQVMsRUFBa0I7TUFDdERoRSxZQUFZLENBQUM0Ryx3Q0FBd0MsQ0FBQ0MsWUFBWSxFQUFFUCxRQUFRLENBQUNjLE1BQU0sQ0FBQztJQUNyRixDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDM0MscUJBQXFCLEVBQUUsVUFBVXJDLE1BQXVELEVBTXRGO01BQ0QsSUFBSTJCLFlBQVksR0FBRzNCLE1BQU0sQ0FBQzRCLFNBQVMsRUFBUztRQUMzQ3FELFdBR0MsR0FBRyxDQUFDLENBQUM7TUFDUCxNQUFNQyx1QkFBdUIsR0FBRyxVQUFVQyxRQUFhLEVBQUU7UUFDeEQsT0FBT0EsUUFBUSxJQUFJQSxRQUFRLENBQUNDLFlBQVksRUFBRSxHQUFHRCxRQUFRLENBQUNDLFlBQVksRUFBRSxDQUFDQyxlQUFlLEVBQUUsS0FBS3ZILFNBQVMsR0FBRyxJQUFJO01BQzVHLENBQUM7TUFDRCxJQUFJNkQsWUFBWSxDQUFDbkUsR0FBRyxDQUFDLDhCQUE4QixDQUFDLEVBQUU7UUFDckRtRSxZQUFZLEdBQUlBLFlBQVksQ0FBOEIyRCxVQUFVLEVBQUU7TUFDdkU7TUFFQSxJQUFJM0QsWUFBWSxDQUFDbkUsR0FBRyxDQUFDK0gsWUFBWSxDQUFDQyxXQUFXLEVBQUUsQ0FBQ0MsT0FBTyxFQUFFLENBQUMsSUFBSTlELFlBQVksQ0FBQytELFdBQVcsRUFBRSxLQUFLLFVBQVUsRUFBRTtRQUN4Ry9ELFlBQVksR0FBR0EsWUFBWSxDQUFDZ0UsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQ2hEO01BRUEsSUFBSWhFLFlBQVksQ0FBQ25FLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO1FBQ3pDLElBQUlvSSxRQUFRLEdBQUc1RixNQUFNLENBQUNnQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUloQyxNQUFNLENBQUNnQyxZQUFZLENBQUMsU0FBUyxDQUFDO1FBQzdFLElBQUk0RCxRQUFRLEtBQUs5SCxTQUFTLEVBQUU7VUFDM0IsSUFBSTZELFlBQVksQ0FBQ2tFLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzFDLE1BQU1DLGlCQUFpQixHQUFHbkUsWUFBWSxDQUFDMEIsY0FBYyxDQUFDLE9BQU8sQ0FBQztZQUM5RHVDLFFBQVEsR0FBR1YsdUJBQXVCLENBQUNZLGlCQUFpQixJQUFJQSxpQkFBaUIsQ0FBQ3pJLE9BQU8sQ0FBQztVQUNuRjtVQUNBLElBQUlzRSxZQUFZLENBQUNvRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQ3BFLFlBQVksQ0FBQ2dELFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM1RWlCLFFBQVEsR0FBRyxJQUFJO1VBQ2hCO1FBQ0Q7UUFDQVgsV0FBVyxHQUFHO1VBQ2JlLFVBQVUsRUFBRXJFLFlBQVksQ0FBQ29FLFFBQVEsRUFBRTtVQUNuQ0UsUUFBUSxFQUFFLENBQUMsQ0FBQ0w7UUFDYixDQUFDO01BQ0YsQ0FBQyxNQUFNO1FBQ047UUFDQSxNQUFNVCxRQUFRLEdBQ2J4RCxZQUFZLENBQUNwRSxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUlvRSxZQUFZLENBQUNwRSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUlvRSxZQUFZLENBQUNwRSxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQ2hIMEgsV0FBVyxHQUFHO1VBQ2JlLFVBQVUsRUFBRWIsUUFBUSxJQUFJQSxRQUFRLENBQUNZLFFBQVEsRUFBRTtVQUMzQ0UsUUFBUSxFQUFFZix1QkFBdUIsQ0FBQ0MsUUFBUTtRQUMzQyxDQUFDO01BQ0Y7TUFDQSxPQUFPO1FBQ04vSCxLQUFLLEVBQUV1RSxZQUFZO1FBQ25CVyxLQUFLLEVBQUUyQztNQUNSLENBQUM7SUFDRixDQUFDO0lBQ0RpQixxQkFBcUIsRUFBRSxVQUFVQyxZQUFpQixFQUFFO01BQ25ELElBQUlBLFlBQVksSUFBSUEsWUFBWSxDQUFDbEYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ3JEO1FBQ0FrRixZQUFZLEdBQUdBLFlBQVksQ0FBQ0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUMxQztNQUNBLE9BQU9ELFlBQVk7SUFDcEIsQ0FBQztJQUNERSxxQkFBcUIsRUFBRSxVQUFVQyxRQUFhLEVBQUVDLE1BQVcsRUFBRUMsY0FBbUIsRUFBRUMsT0FBWSxFQUFFQyxXQUFnQixFQUFFO01BQ2pILE1BQU1DLE1BQU0sR0FBR0osTUFBTSxJQUFJQSxNQUFNLENBQUNoSSxRQUFRLEVBQUU7TUFDMUMsTUFBTUQsVUFBVSxHQUFHcUksTUFBTSxJQUFJQSxNQUFNLENBQUNuSSxZQUFZLEVBQUU7TUFDbEQsTUFBTW9JLG1CQUFtQixHQUFHSCxPQUFPLElBQUtILFFBQVEsSUFBSUEsUUFBUSxDQUFDUCxRQUFRLEVBQUc7TUFDeEUsTUFBTXRJLEtBQUssR0FBRzhJLE1BQU0sSUFBSTdJLFdBQVcsQ0FBQ0MsYUFBYSxDQUFDNEksTUFBTSxDQUFDO01BQ3pELE1BQU1NLHFCQUFxQixHQUFHcEosS0FBSyxJQUFJQSxLQUFLLENBQUNILGlCQUFpQixDQUFDLFVBQVUsQ0FBQztNQUMxRSxNQUFNd0osYUFBYSxHQUFHckosS0FBSyxJQUFJQyxXQUFXLENBQUNxSixlQUFlLENBQUN0SixLQUFLLENBQUM7TUFDakUsTUFBTXVKLG1CQUFtQixHQUFHRixhQUFhLElBQUlBLGFBQWEsQ0FBQ0csZ0JBQWdCLEVBQUU7TUFDN0UsTUFBTUMsZ0JBQWdCLEdBQUdGLG1CQUFtQixJQUFJQSxtQkFBbUIsQ0FBQ0csaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQUVDLGNBQWMsRUFBRVI7TUFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNsSSxNQUFNUyxpQ0FBaUMsR0FDdEMvSSxVQUFVLElBQUlBLFVBQVUsQ0FBQ2dKLFNBQVMsQ0FBRSxHQUFFZCxjQUFlLGtFQUFpRSxDQUFDO01BQ3hILE9BQU87UUFDTmUsa0JBQWtCLEVBQUVYLG1CQUFtQjtRQUN2Q1ksc0JBQXNCLEVBQUVoQixjQUFjO1FBQUU7UUFDeENpQixTQUFTLEVBQUVuSixVQUFVO1FBQ3JCb0osb0JBQW9CLEVBQUViLHFCQUFxQjtRQUMzQ2Msa0JBQWtCLEVBQUVYLG1CQUFtQjtRQUN2Q1ksZUFBZSxFQUFFVixnQkFBZ0I7UUFDakNXLGdDQUFnQyxFQUFFUixpQ0FBaUM7UUFDbkVYLFdBQVcsRUFBRUE7TUFDZCxDQUFDO0lBQ0YsQ0FBQztJQUNEb0IsMkJBQTJCLEVBQUUsVUFBVUMsc0JBQTJCLEVBQUVDLFVBQWUsRUFBRTtNQUNwRixJQUFJRCxzQkFBc0IsSUFBSUEsc0JBQXNCLENBQUN0RSxJQUFJLElBQUlzRSxzQkFBc0IsQ0FBQ3RFLElBQUksS0FBS3VFLFVBQVUsQ0FBQ1Isc0JBQXNCLEVBQUU7UUFDL0g7UUFDQSxNQUFNUywyQ0FBMkMsR0FDaERGLHNCQUFzQixDQUFDLENBQUNDLFVBQVUsQ0FBQ0gsZ0NBQWdDLEdBQUcsdUJBQXVCLEdBQUcsWUFBWSxDQUFDO1FBQzlHRyxVQUFVLENBQUN0QixXQUFXLENBQUMsQ0FBQyxDQUFDdUIsMkNBQTJDLENBQUM7UUFDckUsT0FBTyxJQUFJO01BQ1osQ0FBQyxNQUFNO1FBQ04sT0FBTyxLQUFLO01BQ2I7SUFDRCxDQUFDO0lBQ0RDLGdEQUFnRCxFQUFFLFVBQVVGLFVBQWUsRUFBRUcsc0JBQTJCLEVBQUU7TUFDekcsSUFBSUEsc0JBQXNCLENBQUNILFVBQVUsQ0FBQ1Qsa0JBQWtCLENBQUMsRUFBRTtRQUMxRCxJQUFJYSxRQUFRLEVBQUVMLHNCQUFzQjtRQUNwQyxNQUFNTSxvQkFBb0IsR0FBR0MsTUFBTSxDQUFDQyxJQUFJLENBQUNKLHNCQUFzQixDQUFDSCxVQUFVLENBQUNULGtCQUFrQixDQUFDLENBQUM7UUFDL0YsS0FBSyxNQUFNaUIsV0FBVyxJQUFJSCxvQkFBb0IsRUFBRTtVQUMvQ0QsUUFBUSxHQUFHQyxvQkFBb0IsQ0FBQ0csV0FBVyxDQUFDO1VBQzVDVCxzQkFBc0IsR0FDckJJLHNCQUFzQixDQUFDSCxVQUFVLENBQUNULGtCQUFrQixDQUFDLElBQ3JEWSxzQkFBc0IsQ0FBQ0gsVUFBVSxDQUFDVCxrQkFBa0IsQ0FBQyxDQUFDYSxRQUFRLENBQUM7VUFDaEUsSUFBSXhLLFlBQVksQ0FBQ2tLLDJCQUEyQixDQUFDQyxzQkFBc0IsRUFBRUMsVUFBVSxDQUFDLEVBQUU7WUFDakY7VUFDRDtRQUNEO01BQ0Q7SUFDRCxDQUFDO0lBQ0RTLG1DQUFtQyxFQUFFLFVBQVV6SSxNQUFXLEVBQUUwSSxNQUFXLEVBQUVDLFFBQWEsRUFBRW5DLGNBQW1CLEVBQUU7TUFDNUcsTUFBTXZJLE9BQU8sR0FBRytCLE1BQU0sSUFBSUEsTUFBTSxDQUFDNEIsU0FBUyxFQUFFO01BQzVDLElBQUk4RSxXQUFXO01BQ2YsSUFBSWlDLFFBQVEsQ0FBQ25MLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1FBQ3ZDa0osV0FBVyxHQUFJa0MsT0FBZ0IsSUFBS0QsUUFBUSxDQUFDRSxTQUFTLENBQUNELE9BQU8sQ0FBQztNQUNoRTtNQUNBLElBQUlELFFBQVEsQ0FBQ25MLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFO1FBQzNDa0osV0FBVyxHQUFJa0MsT0FBZ0IsSUFBS0QsUUFBUSxDQUFDRyxjQUFjLENBQUNGLE9BQU8sQ0FBQztNQUNyRTtNQUNBLE1BQU1HLG1CQUFtQixHQUFHSixRQUFRLElBQUlBLFFBQVEsQ0FBQ3RILFNBQVMsRUFBRTtNQUM1RCxJQUFJMEgsbUJBQW1CLElBQUlBLG1CQUFtQixDQUFDdkwsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLEVBQUU7UUFDaEdrSixXQUFXLEdBQUlrQyxPQUFnQixJQUFLRyxtQkFBbUIsQ0FBQ0MsWUFBWSxDQUFDSixPQUFPLENBQUM7TUFDOUU7TUFDQSxJQUFJbEMsV0FBVyxLQUFLNUksU0FBUyxFQUFFO1FBQzlCLE1BQU1tTCxTQUFTLEdBQUdyTCxZQUFZLENBQUN5SSxxQkFBcUIsQ0FBQ3BJLE9BQU8sRUFBRTBLLFFBQVEsRUFBRW5DLGNBQWMsRUFBRWtDLE1BQU0sRUFBRWhDLFdBQVcsQ0FBQztRQUM1R3VDLFNBQVMsQ0FBQ3ZDLFdBQVcsR0FBR0EsV0FBVztRQUNuQyxNQUFNUCxZQUFZLEdBQUd2SSxZQUFZLENBQUNzSSxxQkFBcUIsQ0FBQ3hJLFdBQVcsQ0FBQ3FKLGVBQWUsQ0FBQzRCLFFBQVEsQ0FBQyxDQUFDMUIsZ0JBQWdCLEVBQUUsQ0FBQ2lDLE9BQU8sRUFBRSxDQUFDO1FBQzNIeEwsV0FBVyxDQUFDeUwscUJBQXFCLENBQ2hDLENBQUNGLFNBQVMsQ0FBQ3JCLGVBQWUsQ0FBQyxFQUMzQixDQUFDO1VBQUVSLGNBQWMsRUFBRTZCLFNBQVMsQ0FBQzFCLGtCQUFrQjtVQUFFOUQsSUFBSSxFQUFFd0YsU0FBUyxDQUFDekI7UUFBdUIsQ0FBQyxDQUFDLEVBQzFGeUIsU0FBUyxDQUFDdkIsb0JBQW9CLEVBQzlCdkIsWUFBWSxDQUNaLENBQ0M1RCxJQUFJLENBQUMsVUFBVTZHLHFCQUEwQixFQUFFO1VBQzNDLElBQUlBLHFCQUFxQixFQUFFO1lBQzFCeEwsWUFBWSxDQUFDc0ssZ0RBQWdELENBQUNlLFNBQVMsRUFBRUcscUJBQXFCLENBQUM7VUFDaEc7VUFDQTtRQUNELENBQUMsQ0FBQyxDQUNEeEcsS0FBSyxDQUFDLFVBQVV5RyxNQUFXLEVBQUU7VUFDN0I5SixHQUFHLENBQUNDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRTZKLE1BQU0sQ0FBQztRQUMxRCxDQUFDLENBQUM7TUFDSjtJQUNELENBQUM7SUFDREMsc0NBQXNDLENBQUNDLFFBQWlCLEVBQUU7TUFDekQsSUFBSSxDQUFDQSxRQUFRLENBQUNoTCxRQUFRLEVBQUUsSUFBSSxDQUFDZ0wsUUFBUSxDQUFDak0saUJBQWlCLEVBQUUsRUFBRTtRQUMxRCxPQUFPLEtBQUs7TUFDYixDQUFDLE1BQU07UUFDTixPQUFPLElBQUk7TUFDWjtJQUNELENBQUM7SUFDRGtNLHNEQUFzRCxDQUFDRCxRQUFpQixFQUFFRSxZQUFvQixFQUFFQyxXQUF5QixFQUFRO01BQ2hJLElBQUlDLHdCQUE2QjtNQUNqQyxJQUFJQyxhQUFhO01BQ2pCLE1BQU1DLDBCQUEwQixHQUFHLFVBQVVDLHVCQUE0QixFQUFFO1FBQzFFLE9BQU8sRUFBRUEsdUJBQXVCLEtBQUssSUFBSSxJQUFJLE9BQU9BLHVCQUF1QixLQUFLLFFBQVEsQ0FBQztNQUMxRixDQUFDO01BQ0Q7TUFDQUosV0FBVyxHQUFHQSxXQUFXLENBQUNuRyxNQUFNLENBQUV3RyxVQUFVLElBQUtBLFVBQVUsQ0FBQ0MsTUFBTSxFQUFFLEtBQUssd0JBQXdCLENBQUM7TUFDbEcsS0FBSyxNQUFNQyxLQUFLLElBQUlQLFdBQVcsRUFBRTtRQUNoQ0Msd0JBQXdCLEdBQUdELFdBQVcsQ0FBQ08sS0FBSyxDQUFDLENBQUNsRSxRQUFRLEVBQUU7UUFDeEQsSUFBSSxDQUFDNEQsd0JBQXdCLElBQUlFLDBCQUEwQixDQUFDRix3QkFBd0IsQ0FBQyxFQUFFO1VBQ3RGQyxhQUFhLEdBQUdGLFdBQVcsQ0FBQ08sS0FBSyxDQUFDLENBQUMxTSxVQUFVLENBQUMsT0FBTyxDQUFDO1VBQ3RELElBQUlxTSxhQUFhLEVBQUU7WUFDbEJBLGFBQWEsQ0FBQzdGLGVBQWUsQ0FBQyxRQUFRLEVBQUUsVUFBVW1HLGFBQWtCLEVBQUU7Y0FDckV0TSxZQUFZLENBQUM2SyxtQ0FBbUMsQ0FBQ3lCLGFBQWEsRUFBRSxJQUFJLEVBQUVYLFFBQVEsRUFBRUUsWUFBWSxDQUFDO1lBQzlGLENBQUMsQ0FBQztVQUNIO1FBQ0QsQ0FBQyxNQUFNLElBQUlJLDBCQUEwQixDQUFDRix3QkFBd0IsQ0FBQyxFQUFFO1VBQ2hFL0wsWUFBWSxDQUFDNkssbUNBQW1DLENBQUMsSUFBSSxFQUFFa0Isd0JBQXdCLEVBQUVKLFFBQVEsRUFBRUUsWUFBWSxDQUFDO1FBQ3pHO01BQ0Q7SUFDRCxDQUFDO0lBQ0RVLHNCQUFzQixFQUFFLFVBQVVuSyxNQUFXLEVBQUVvSyxTQUFjLEVBQUVDLGVBQW9CLEVBQVE7TUFDMUYsTUFBTUMsT0FBTyxHQUFHdEssTUFBTSxDQUFDNEIsU0FBUyxFQUFFO01BQ2xDLElBQUloRSxZQUFZLENBQUMwTCxzQ0FBc0MsQ0FBQ2dCLE9BQU8sQ0FBQyxFQUFFO1FBQ2pFLE1BQU01SyxhQUFhLEdBQUksR0FBRTJLLGVBQWdCLElBQUdELFNBQVUsRUFBQztRQUN2RCxNQUFNRyxPQUFPLEdBQUdELE9BQU8sQ0FBQ0UsYUFBYSxFQUFFLENBQUNDLE1BQU0sR0FBR0gsT0FBTyxDQUFDRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRzFNLFNBQVM7UUFDdkYsTUFBTTRMLFdBQVcsR0FBR2EsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUVHLGFBQWEsRUFBRTtRQUM1QyxJQUFJaEIsV0FBVyxJQUFJQSxXQUFXLENBQUNlLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDMUM3TSxZQUFZLENBQUM0TCxzREFBc0QsQ0FBQ2MsT0FBTyxFQUFFNUssYUFBYSxFQUFFZ0ssV0FBVyxDQUFDO1FBQ3pHO01BQ0Q7SUFDRCxDQUFDO0lBQ0RpQixnQkFBZ0IsRUFBRSxVQUFVcEcsS0FBWSxFQUFFO01BQ3pDLE1BQU1xRyxNQUFNLEdBQUdyRyxLQUFLLENBQUMzQyxTQUFTLEVBQVM7TUFDdkMsSUFBSWdKLE1BQU0sQ0FBQ3hILElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSXdILE1BQU0sQ0FBQ2pHLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDNUQ7UUFDQWtHLFVBQVUsQ0FBQ0QsTUFBTSxDQUFDeEgsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQztNQUN4QztJQUNELENBQUM7SUFDRDBILDBCQUEwQixFQUFFLFVBQVVQLE9BQWdCLEVBQUU7TUFDdkQsTUFBTVEsU0FBUyxHQUFHUixPQUFPLENBQUNTLEtBQUssRUFBRTtNQUNqQyxNQUFNQywwQkFBdUQsR0FBRztRQUMvREMsS0FBSyxFQUFFQyxnQkFBZ0IsQ0FBQ1osT0FBTyxDQUF1QixDQUFDYSxPQUFPLENBQUMsNEJBQTRCLENBQUM7UUFDNUZDLFdBQVcsRUFBRUYsZ0JBQWdCLENBQUNaLE9BQU8sQ0FBdUIsQ0FBQ2EsT0FBTyxDQUFDLGtDQUFrQyxDQUFDO1FBQ3hHRSxtQkFBbUIsRUFBRSxJQUFJO1FBQ3pCQyxnQkFBZ0IsRUFBRSxLQUFLO1FBQUU7UUFDekJDLGdCQUFnQixFQUFFQyxzQkFBc0IsQ0FBQ0M7TUFDMUMsQ0FBQztNQUNELE1BQU1DLGtCQUFrQixHQUFHLElBQUlDLGtCQUFrQixDQUFFLEdBQUViLFNBQVUscUJBQW9CLEVBQUVFLDBCQUEwQixDQUFDO01BQ2hILE1BQU1ZLGVBQTJDLEdBQUc7UUFDbkRDLG1CQUFtQixFQUFFLEtBQUs7UUFDMUJDLFVBQVUsRUFBRUMsTUFBTSxDQUFDQyxNQUFNLENBQUNDLEtBQUs7UUFDL0JDLFNBQVMsRUFBRUMsYUFBYSxDQUFDQyxhQUFhLENBQUNDLElBQUk7UUFDM0NsSSxPQUFPLEVBQUUsQ0FBQ3VILGtCQUFrQixDQUFDO1FBQzdCWSxVQUFVLEVBQUUsVUFBVWhJLEtBQUssRUFBRTtVQUM1QixJQUFJQSxLQUFLLENBQUMzQyxTQUFTLEVBQUUsRUFBRTtZQUN0QjJDLEtBQUssQ0FBQzNDLFNBQVMsRUFBRSxDQUFDNEssT0FBTyxFQUFFO1VBQzVCO1FBQ0Q7TUFDRCxDQUFDO01BQ0QsT0FBTyxJQUFJQyxpQkFBaUIsQ0FBRSxHQUFFMUIsU0FBVSxVQUFTLEVBQUVjLGVBQWUsQ0FBQztJQUN0RSxDQUFDO0lBQ0RhLFFBQVEsRUFBRSxnQkFBZ0JuQyxPQUFnQixFQUFFb0MsUUFBYyxFQUFFO01BQzNELElBQUk7UUFDSCxNQUFNQyxJQUFJLEdBQUcsTUFBTXJDLE9BQU8sQ0FBQ3NDLGNBQWMsRUFBRTtRQUMzQyxJQUFJLENBQUNELElBQUksRUFBRTtVQUNWLElBQUk7WUFDSCxNQUFNRSxTQUFTLEdBQUcsTUFBTXZDLE9BQU8sQ0FBQ3dDLGlCQUFpQixFQUFFO1lBQ25ELElBQUksQ0FBQUQsU0FBUyxhQUFUQSxTQUFTLHVCQUFUQSxTQUFTLENBQUVyQyxNQUFNLE1BQUssQ0FBQyxJQUFLRixPQUFPLENBQVN5QyxVQUFVLEVBQUUsQ0FBQ0Msa0JBQWtCLEtBQUssT0FBTyxFQUFFO2NBQzVGLE1BQU1DLE9BQTBCLEdBQUd0UCxZQUFZLENBQUNrTiwwQkFBMEIsQ0FBQ1AsT0FBTyxDQUFDO2NBQ25GQSxPQUFPLENBQUM0QyxZQUFZLENBQUNELE9BQU8sQ0FBQztjQUM3QkEsT0FBTyxDQUFDRSxNQUFNLENBQUNULFFBQVEsQ0FBdUI7WUFDL0MsQ0FBQyxNQUFNO2NBQ04sTUFBTXBDLE9BQU8sQ0FBQzhDLElBQUksQ0FBQ1YsUUFBUSxDQUF1QjtZQUNuRDtVQUNELENBQUMsQ0FBQyxPQUFPbk4sS0FBSyxFQUFFO1lBQ2ZELEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLGlEQUFnREEsS0FBTSxFQUFDLENBQUM7VUFDcEU7UUFDRCxDQUFDLE1BQU07VUFDTixNQUFNZSxJQUFJLEdBQUc3QyxXQUFXLENBQUNDLGFBQWEsQ0FBQ2dQLFFBQVEsQ0FBQztVQUNoRCxNQUFNVyxZQUFZLEdBQUc1UCxXQUFXLENBQUNxSixlQUFlLENBQUN4RyxJQUFJLENBQUM7VUFDdEQsTUFBTWdOLFlBQVksR0FBR0QsWUFBWSxDQUFDckcsZ0JBQWdCLEVBQUU7VUFDcEQsTUFBTXVHLFNBQVMsR0FBR0QsWUFBWSxDQUFDRSxjQUFjLENBQUNiLElBQUksQ0FBQztVQUNuRCxNQUFNYyxPQUFPLEdBQUc7WUFDZkMsTUFBTSxFQUFFO2NBQ1B2RyxjQUFjLEVBQUVvRyxTQUFTLENBQUNwRyxjQUFjO2NBQ3hDbkQsTUFBTSxFQUFFdUosU0FBUyxDQUFDdko7WUFDbkIsQ0FBQztZQUNEMkosTUFBTSxFQUFFSixTQUFTLENBQUNJO1VBQ25CLENBQUM7VUFFREMsZUFBZSxDQUFDQyxrQ0FBa0MsQ0FBQ3ZOLElBQUksRUFBRWlOLFNBQVMsQ0FBQztVQUVuRSxJQUFJOVAsV0FBVyxDQUFDcVEsZ0JBQWdCLENBQUNwQixRQUFRLENBQXVCLEtBQUssSUFBSSxFQUFFO1lBQzFFO1lBQ0FZLFlBQVksQ0FBQ1MsVUFBVSxDQUFDTixPQUFPLEVBQVNKLFlBQVksQ0FBQztVQUN0RCxDQUFDLE1BQU07WUFDTixJQUFJO2NBQ0gsTUFBTVcsT0FBTyxHQUFHLE1BQU1WLFlBQVksQ0FBQ1csb0JBQW9CLENBQUNSLE9BQU8sRUFBRUosWUFBWSxDQUFDO2NBQzlFekMsVUFBVSxDQUFDb0QsT0FBTyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxPQUFPek8sS0FBSyxFQUFFO2NBQ2ZELEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLDRDQUEyQ0EsS0FBTSxFQUFDLENBQUM7WUFDL0Q7VUFDRDtRQUNEO01BQ0QsQ0FBQyxDQUFDLE9BQU9BLEtBQUssRUFBRTtRQUNmRCxHQUFHLENBQUNDLEtBQUssQ0FBRSwrQkFBOEJBLEtBQU0sRUFBQyxDQUFDO01BQ2xEO0lBQ0QsQ0FBQztJQUNEMk8sU0FBUyxFQUFFLGdCQUFnQm5PLE1BQVcsRUFBaUI7TUFDdEQsTUFBTS9CLE9BQU8sR0FBRytCLE1BQU0sQ0FBQzRCLFNBQVMsRUFBRTtNQUNsQyxNQUFNK0ssUUFBUSxHQUFHMU8sT0FBTyxDQUFDVCxHQUFHLENBQUMsd0JBQXdCLENBQUMsR0FDbkRTLE9BQU8sQ0FBQ21RLFlBQVksQ0FBQyxLQUFLLEVBQUdDLElBQWEsSUFBSztRQUMvQyxPQUFPQSxJQUFJLENBQUM3USxHQUFHLENBQUMsWUFBWSxDQUFDO01BQzdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUNMUyxPQUFPO01BRVYsSUFBSUEsT0FBTyxDQUFDdU0sYUFBYSxFQUFFLElBQUl2TSxPQUFPLENBQUN1TSxhQUFhLEVBQUUsQ0FBQ0MsTUFBTSxHQUFHLENBQUMsSUFBSWtDLFFBQVEsQ0FBQ2hJLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDekcsTUFBTTJKLFVBQVUsR0FBR3JRLE9BQU8sQ0FBQ3VNLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3QyxJQUFJOEQsVUFBVSxJQUFJQSxVQUFVLENBQUM5USxHQUFHLENBQUMsaUJBQWlCLENBQUMsRUFBRTtVQUNwRCxNQUFNSSxZQUFZLENBQUM4TyxRQUFRLENBQUM0QixVQUFVLEVBQUUzQixRQUFRLENBQUM7UUFDbEQ7TUFDRDtNQUNBLE9BQU9BLFFBQVE7SUFDaEIsQ0FBQztJQUNENEIsWUFBWSxFQUFFLFVBQVVqTyxVQUFzQixFQUFFaUUsS0FBWSxFQUFFO01BQzdELE1BQU1FLFlBQVksR0FBR0YsS0FBSyxDQUFDM0MsU0FBUyxFQUFrQjtRQUNyRDRNLFlBQVksR0FBRzVRLFlBQVksQ0FBQ3NDLHVCQUF1QixDQUFDSSxVQUFVLENBQUM7UUFDL0RtTyxXQUFXLEdBQUdoSyxZQUFZLENBQUNwRCxTQUFTLEVBQTRCO1FBQ2hFcU4sU0FBUyxHQUFHRCxXQUFXLENBQUNFLFlBQVksRUFBRTtNQUV2QyxJQUFJRCxTQUFTLEtBQUssRUFBRSxFQUFFO1FBQUE7UUFDckJELFdBQVcsQ0FBQ0csU0FBUyxDQUFDLElBQUksQ0FBQzs7UUFFM0I7UUFDQW5LLFlBQVksQ0FBQ29LLFlBQVksQ0FBQ0gsU0FBUyxDQUFDO1FBRXBDakssWUFBWSxDQUFDcUsseUJBQXlCLEVBQUU7UUFDeEMsTUFBTUMsS0FBSyw0QkFBSXRLLFlBQVksQ0FBQ2xHLFFBQVEsRUFBRSwwREFBeEIsc0JBQWtDeVEsY0FBYyxFQUFFLENBQUMsY0FBYyxDQUFDO1FBQ2hGLElBQUlELEtBQUssRUFBRTtVQUNWLE1BQU1FLHdCQUF3QixHQUFHLElBQUlDLHFCQUFxQixFQUFFO1VBQzVERCx3QkFBd0IsQ0FBQ0UsT0FBTyxDQUFDLGNBQWMsQ0FBQztVQUNoREYsd0JBQXdCLENBQUNHLFFBQVEsQ0FBQ0wsS0FBSyxDQUFDO1VBQ3hDdEssWUFBWSxDQUFDNEssa0JBQWtCLENBQUNKLHdCQUF3QixDQUFDO1FBQzFEO1FBQ0EsTUFBTUssSUFBSSw2QkFBSTdLLFlBQVksQ0FBQ25ILGlCQUFpQixFQUFFLDJEQUFqQyx1QkFBa0VxSCxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQ3pHLElBQUkySyxJQUFJLEVBQUU7VUFDVCxNQUFNQyxtQkFBbUIsR0FBRyxJQUFJTCxxQkFBcUIsRUFBRTtVQUN2REssbUJBQW1CLENBQUNKLE9BQU8sQ0FBQyxVQUFVLENBQUM7VUFDdkM7VUFDQUksbUJBQW1CLENBQUNILFFBQVEsQ0FBQ2xNLHlCQUF5QixDQUFDQyxXQUFXLENBQUNzQixZQUFZLENBQUMsR0FBRyxHQUFHLEdBQUc2SyxJQUFJLENBQUM7VUFDOUY3SyxZQUFZLENBQUM0SyxrQkFBa0IsQ0FBQ0UsbUJBQW1CLENBQUM7UUFDckQ7UUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxJQUFJTixxQkFBcUIsRUFBRTtRQUN6RE0scUJBQXFCLENBQUNMLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDdkNLLHFCQUFxQixDQUFDSixRQUFRLENBQUMsa0JBQWtCLENBQUM7UUFDbEQzSyxZQUFZLENBQUM0SyxrQkFBa0IsQ0FBQ0cscUJBQXFCLENBQUM7O1FBRXREO1FBQ0EsTUFBTUMsYUFBYSxHQUFHLElBQUl4TixPQUFPLENBQUMsQ0FBQ0MsT0FBWSxFQUFFd04sTUFBVyxLQUFLO1VBQ2hFLElBQUksQ0FBQzdSLGNBQWMsR0FBRyxJQUFJLENBQUNBLGNBQWMsSUFBSSxDQUFDLENBQUM7VUFDL0MsSUFBSSxDQUFDQSxjQUFjLENBQUM0RyxZQUFZLENBQUN1RyxLQUFLLEVBQUUsQ0FBQyxHQUFHO1lBQzNDOUksT0FBTyxFQUFFQSxPQUFPO1lBQ2hCd04sTUFBTSxFQUFFQTtVQUNULENBQUM7VUFDRGpMLFlBQVksQ0FBQ2tMLE1BQU0sRUFBRTtRQUN0QixDQUFDLENBQUM7UUFDRm5CLFlBQVksQ0FBQzFMLFFBQVEsQ0FBQ0MsUUFBUSxDQUFDME0sYUFBYSxDQUFDO01BQzlDLENBQUMsTUFBTTtRQUNORyxVQUFVLENBQUNwUSxLQUFLLENBQUMyTCxnQkFBZ0IsQ0FBQzdLLFVBQVUsQ0FBQyxDQUFDOEssT0FBTyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7TUFDNUY7SUFDRCxDQUFDO0lBRUR5RSxvQkFBb0IsRUFBRSxVQUNyQnRMLEtBQXVDLEVBQ3ZDdUwsZ0JBQThDLEVBQzlDckcsWUFBb0IsRUFDcEJuSixVQUFzQixFQUNyQjtNQUNELE1BQU15UCxNQUFNLEdBQUdDLE1BQU0sQ0FBQ3pMLEtBQUssQ0FBQ3ZDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRHlDLFlBQVksR0FBR0YsS0FBSyxDQUFDM0MsU0FBUyxFQUFrQjtRQUNoRDZNLFdBQVcsR0FBR2hLLFlBQVksQ0FBQ3BELFNBQVMsRUFBNEI7TUFFakVvTixXQUFXLENBQUNHLFNBQVMsQ0FBQyxLQUFLLENBQUM7TUFFNUIsTUFBTW5OLE9BQU8sR0FBR2dELFlBQVksQ0FBQ25ILGlCQUFpQixFQUFnQztNQUM5RSxJQUFJeVMsTUFBTSxLQUFLLENBQUMsSUFBSUEsTUFBTSxJQUFJLEdBQUcsRUFBRTtRQUNsQyxJQUFJLENBQUNFLDhCQUE4QixDQUFDMUwsS0FBSyxDQUFDO1FBQzFDLElBQUksQ0FBQzFHLGNBQWMsQ0FBQzRHLFlBQVksQ0FBQ3VHLEtBQUssRUFBRSxDQUFDLENBQUMwRSxNQUFNLEVBQUU7TUFDbkQsQ0FBQyxNQUFNO1FBQUE7UUFDTixNQUFNUSxPQUFPLDBCQUFJM0wsS0FBSyxDQUFDdkMsWUFBWSxDQUFDLFNBQVMsQ0FBQyx3REFBOUIsb0JBQTREbU8sSUFBSTtRQUVoRixJQUFJRCxPQUFPLEVBQUU7VUFDWjtVQUNBek8sT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUUyTyxXQUFXLENBQUMsYUFBYSxFQUFFRixPQUFPLEVBQUUsSUFBSSxDQUFRO1FBQzFEOztRQUVBO1FBQ0EsSUFBSUosZ0JBQWdCLGFBQWhCQSxnQkFBZ0IsZUFBaEJBLGdCQUFnQixDQUFFck0sSUFBSSxFQUFFO1VBQzNCaEMsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUUyTyxXQUFXLENBQUNOLGdCQUFnQixDQUFDck0sSUFBSSxFQUFFZ0IsWUFBWSxDQUFDc0IsUUFBUSxFQUFFLENBQUM7UUFDckU7O1FBRUE7UUFDQSx1QkFBQTBJLFdBQVcsQ0FBQzRCLE1BQU0sd0RBQWxCLG9CQUFvQkMseUJBQXlCLEVBQUU7UUFFL0MsSUFBSSxDQUFDQyx5QkFBeUIsQ0FBQ2hNLEtBQUssRUFBRWtLLFdBQVcsRUFBRW5PLFVBQVUsQ0FBQztRQUU5RCxJQUFJLENBQUN6QyxjQUFjLENBQUM0RyxZQUFZLENBQUN1RyxLQUFLLEVBQUUsQ0FBQyxDQUFDOUksT0FBTyxFQUFFO01BQ3BEO01BRUEsT0FBTyxJQUFJLENBQUNyRSxjQUFjLENBQUM0RyxZQUFZLENBQUN1RyxLQUFLLEVBQUUsQ0FBQzs7TUFFaEQ7TUFDQSxNQUFNd0Ysc0JBQXNCLEdBQUd0Tix5QkFBeUIsQ0FBQ0MsV0FBVyxDQUFDc0IsWUFBWSxDQUFDO01BQ2xGLElBQUksQ0FBQytMLHNCQUFzQixJQUFJLENBQUMvTyxPQUFPLEVBQUU7UUFDeEM7TUFDRDtNQUVBLE1BQU1nUCxnQkFBZ0IsR0FBRyxDQUFFLEdBQUVoUCxPQUFPLENBQUNrQyxPQUFPLEVBQUcsSUFBRzhGLFlBQWEsRUFBQyxDQUFDO01BQ2pFLElBQUlxRyxnQkFBZ0IsYUFBaEJBLGdCQUFnQixlQUFoQkEsZ0JBQWdCLENBQUVyTSxJQUFJLEVBQUU7UUFDM0JnTixnQkFBZ0IsQ0FBQ0MsSUFBSSxDQUFFLEdBQUVqUCxPQUFPLENBQUNrQyxPQUFPLEVBQUcsSUFBR21NLGdCQUFnQixDQUFDck0sSUFBSyxFQUFDLENBQUM7TUFDdkU7TUFFQSxJQUFJcEcsT0FBTyxHQUFHb0UsT0FBTyxDQUFDbEUsVUFBVSxFQUFFO01BQ2xDLElBQUksQ0FBQ0YsT0FBTyxDQUFDRyxHQUFHLENBQUMsd0NBQXdDLENBQUMsRUFBRTtRQUMzRCxNQUFNQyxLQUFLLEdBQUdDLFdBQVcsQ0FBQ0MsYUFBYSxDQUFDOEcsWUFBWSxDQUFDO1FBQ3JEcEgsT0FBTyxHQUFJSSxLQUFLLENBQUNILGlCQUFpQixFQUFFLENBQWFDLFVBQVUsRUFBRTtNQUM5RDtNQUNBLElBQUlGLE9BQU8sQ0FBQ3lHLGlCQUFpQixFQUFFLEVBQUU7UUFDaEN6RyxPQUFPLENBQUMwRyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsTUFBTTtVQUMvQ2IseUJBQXlCLENBQUNjLElBQUksQ0FBQ3lLLFdBQVcsRUFBRTtZQUFFeEssTUFBTSxFQUFFQyxRQUFRLENBQUNDLE1BQU07WUFBRUMsT0FBTyxFQUFFcU07VUFBaUIsQ0FBQyxDQUFDO1VBQ25Hdk4seUJBQXlCLENBQUNjLElBQUksQ0FBQ3lLLFdBQVcsRUFBRTtZQUFFeEssTUFBTSxFQUFFQyxRQUFRLENBQUNjLE1BQU07WUFBRVosT0FBTyxFQUFFcU07VUFBaUIsQ0FBQyxDQUFDO1FBQ3BHLENBQUMsQ0FBQztNQUNILENBQUMsTUFBTTtRQUNOdk4seUJBQXlCLENBQUNjLElBQUksQ0FBQ3lLLFdBQVcsRUFBRTtVQUFFeEssTUFBTSxFQUFFQyxRQUFRLENBQUNDLE1BQU07VUFBRUMsT0FBTyxFQUFFcU07UUFBaUIsQ0FBQyxDQUFDO1FBQ25Hdk4seUJBQXlCLENBQUNjLElBQUksQ0FBQ3lLLFdBQVcsRUFBRTtVQUFFeEssTUFBTSxFQUFFQyxRQUFRLENBQUNjLE1BQU07VUFBRVosT0FBTyxFQUFFcU07UUFBaUIsQ0FBQyxDQUFDO01BQ3BHO0lBQ0QsQ0FBQztJQUVEUiw4QkFBOEIsRUFBRSxVQUFValEsTUFBd0MsRUFBUTtNQUN6RjtNQUNBLE1BQU0yUSxNQUFNLEdBQUczUSxNQUFNLENBQUNnQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUloQyxNQUFNLENBQUNnQyxZQUFZLENBQUMsVUFBVSxDQUFDO01BQ3BGLElBQUk0TyxZQUFZLEVBQUV2SCxNQUFNO01BQ3hCLElBQUk7UUFDSEEsTUFBTSxHQUFHc0gsTUFBTSxJQUFJRSxJQUFJLENBQUNDLEtBQUssQ0FBQ0gsTUFBTSxDQUFDO1FBQ3JDQyxZQUFZLEdBQUd2SCxNQUFNLENBQUM3SixLQUFLLElBQUk2SixNQUFNLENBQUM3SixLQUFLLENBQUN1UixPQUFPO01BQ3BELENBQUMsQ0FBQyxPQUFPQyxDQUFDLEVBQUU7UUFDWEosWUFBWSxHQUFHRCxNQUFNLElBQUl4RixnQkFBZ0IsQ0FBQ25MLE1BQU0sQ0FBQzRCLFNBQVMsRUFBRSxDQUFZLENBQUN3SixPQUFPLENBQUMsbUNBQW1DLENBQUM7TUFDdEg7TUFDQXdFLFVBQVUsQ0FBQ3BRLEtBQUssQ0FBQ29SLFlBQVksQ0FBQztJQUMvQixDQUFDO0lBRURLLFlBQVksRUFBRSxVQUFVMU0sS0FBWSxFQUFFdUwsZ0JBQThDLEVBQUVyRyxZQUFvQixFQUFFbkosVUFBc0IsRUFBRTtNQUNuSSxNQUFNNFEsWUFBWSxHQUFHM00sS0FBSyxDQUFDM0MsU0FBUyxFQUFZO01BQ2hELE1BQU02TSxXQUFXLEdBQUd5QyxZQUFZLENBQUM3UCxTQUFTLEVBQTRCO01BQ3RFLE1BQU1JLE9BQU8sR0FBR2dOLFdBQVcsQ0FBQ25SLGlCQUFpQixFQUFhOztNQUUxRDtNQUNBbUUsT0FBTyxDQUFDMk8sV0FBVyxDQUFDM0csWUFBWSxFQUFFLElBQUksQ0FBQztNQUN2QztNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0FoSSxPQUFPLENBQUMyTyxXQUFXLENBQUMzRyxZQUFZLEVBQUUzTCxTQUFTLEVBQUUsSUFBSSxDQUFRO01BRXpELElBQUksQ0FBQ3lTLHlCQUF5QixDQUFDaE0sS0FBSyxFQUFFa0ssV0FBVyxFQUFFbk8sVUFBVSxDQUFDOztNQUU5RDtNQUNBLE1BQU0yQyxxQkFBcUIsR0FBR0MseUJBQXlCLENBQUNDLFdBQVcsQ0FBQytOLFlBQVksQ0FBQztNQUNqRixJQUFJak8scUJBQXFCLEVBQUU7UUFDMUIsSUFBSTVGLE9BQU8sR0FBR29FLE9BQU8sQ0FBQ2xFLFVBQVUsRUFBRTtRQUNsQyxJQUFJLENBQUNGLE9BQU8sQ0FBQ0csR0FBRyxDQUFDLHdDQUF3QyxDQUFDLEVBQUU7VUFDM0QsTUFBTUMsS0FBSyxHQUFHQyxXQUFXLENBQUNDLGFBQWEsQ0FBQ3VULFlBQVksQ0FBQztVQUNyRDdULE9BQU8sR0FBSUksS0FBSyxDQUFDSCxpQkFBaUIsRUFBRSxDQUFhQyxVQUFVLEVBQUU7UUFDOUQ7UUFFQSxNQUFNNkYsSUFBSSxHQUFHLENBQUUsR0FBRTNCLE9BQU8sQ0FBQ2tDLE9BQU8sRUFBRyxJQUFHOEYsWUFBYSxFQUFDLENBQUM7UUFDckQsSUFBSXFHLGdCQUFnQixhQUFoQkEsZ0JBQWdCLGVBQWhCQSxnQkFBZ0IsQ0FBRXJNLElBQUksRUFBRTtVQUMzQkwsSUFBSSxDQUFDc04sSUFBSSxDQUFFLEdBQUVqUCxPQUFPLENBQUNrQyxPQUFPLEVBQUcsSUFBR21NLGdCQUFnQixDQUFDck0sSUFBSyxFQUFDLENBQUM7UUFDM0Q7UUFDQVAseUJBQXlCLENBQUNjLElBQUksQ0FBQ2tOLFlBQVksRUFBRTtVQUFFak4sTUFBTSxFQUFFQyxRQUFRLENBQUNZLElBQUk7VUFBRVYsT0FBTyxFQUFFaEI7UUFBSyxDQUFDLENBQUM7UUFFdEYvRixPQUFPLENBQUMwRyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsWUFBWTtVQUNyRGIseUJBQXlCLENBQUNjLElBQUksQ0FBQ2tOLFlBQVksRUFBRTtZQUFFak4sTUFBTSxFQUFFQyxRQUFRLENBQUNDLE1BQU07WUFBRUMsT0FBTyxFQUFFaEI7VUFBSyxDQUFDLENBQUM7VUFDeEZGLHlCQUF5QixDQUFDYyxJQUFJLENBQUNrTixZQUFZLEVBQUU7WUFBRWpOLE1BQU0sRUFBRUMsUUFBUSxDQUFDYyxNQUFNO1lBQUVaLE9BQU8sRUFBRWhCO1VBQUssQ0FBQyxDQUFDO1FBQ3pGLENBQUMsQ0FBQztNQUNIO0lBQ0QsQ0FBQztJQUVEbU4seUJBQXlCLEVBQUUsVUFBVXZRLE1BQVcsRUFBRTJJLFFBQWEsRUFBRXpLLFdBQWdCLEVBQUU7TUFDbEYsTUFBTStCLGFBQWEsR0FBR3JDLFlBQVksQ0FBQ3NDLHVCQUF1QixDQUFDaEMsV0FBVyxDQUFDO01BQ3ZFLElBQUl5SyxRQUFRLElBQUlBLFFBQVEsQ0FBQ3JMLGlCQUFpQixFQUFFLENBQUN3RSxXQUFXLEVBQUUsRUFBRTtRQUMzRDtNQUNEO01BQ0EsSUFBSTZHLFFBQVEsRUFBRTtRQUNiM0ksTUFBTSxDQUFDL0IsT0FBTyxHQUFHMEssUUFBUTtNQUMxQjtNQUNBMUksYUFBYSxDQUFDRSxZQUFZLENBQUN3QyxpQkFBaUIsQ0FBQzNDLE1BQU0sRUFBRSxJQUFJLENBQUNxQyxxQkFBcUIsQ0FBQ3JDLE1BQU0sQ0FBQyxDQUFDc0MsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNHLENBQUM7SUFFRDZPLGtCQUFrQixFQUFFLFVBQVVDLFNBQWMsRUFBRTtNQUM3QyxPQUFPQyxRQUFRLENBQUNGLGtCQUFrQixDQUFDQyxTQUFTLENBQUM7SUFDOUMsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NFLHlCQUF5QixFQUFFLFVBQVVDLGNBQXNCLEVBQUVDLGlCQUF5QixFQUFFQyxjQUFzQixFQUFFO01BQy9HLElBQUlDLGFBQXFCO01BQ3pCLElBQUlwVCxVQUFVO01BQ2QsSUFBSXFULGFBQXFCO01BQ3pCLElBQUlKLGNBQWMsRUFBRTtRQUNuQmpULFVBQVUsR0FBR3NULFlBQVksQ0FBQ3BULFlBQVksRUFBRTtRQUN4Q21ULGFBQWEsR0FBR3JULFVBQVUsQ0FBQ2dKLFNBQVMsQ0FBRSxHQUFFa0ssaUJBQWtCLGFBQVksQ0FBQztRQUN2RSxPQUFPbFQsVUFBVSxDQUNmdVQsb0JBQW9CLENBQUNMLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUM3Q2pQLElBQUksQ0FBQyxVQUFVdVAsY0FBbUIsRUFBRTtVQUNwQztVQUNBLE1BQU1DLGNBQWMsR0FBR0QsY0FBYyxDQUFDQSxjQUFjLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHeEosTUFBTSxDQUFDQyxJQUFJLENBQUN1SixjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUMvRixNQUFNRSxlQUFlLEdBQUdELGNBQWMsQ0FBQ0UsTUFBTTtVQUM3QyxNQUFNQyxtQkFBbUIsR0FBR0YsZUFBZSxDQUFDeFQsWUFBWSxFQUFFO1VBQzFELE1BQU0yVCxhQUFhLEdBQUdKLGNBQWMsQ0FBQ0ssVUFBVSxDQUFDQyxJQUFJLENBQUMsVUFBVUMsVUFBZSxFQUFFO1lBQy9FLE9BQU9BLFVBQVUsQ0FBQ0MsaUJBQWlCLElBQUlELFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLGFBQWEsS0FBS2IsYUFBYTtVQUNwRyxDQUFDLENBQUM7VUFDRixJQUFJUSxhQUFhLElBQUksQ0FBQ0EsYUFBYSxDQUFDTSxpQkFBaUIsRUFBRTtZQUN0RCxNQUFNLElBQUlDLEtBQUssQ0FBRSwwQ0FBeUNmLGFBQWMsRUFBQyxDQUFDO1VBQzNFO1VBQ0EsTUFBTWdCLGVBQWUsR0FBR1QsbUJBQW1CLENBQUM1SyxTQUFTLENBQ25ELElBQUd5SyxjQUFjLENBQUNhLGNBQWUsSUFBR1QsYUFBYSxDQUFDTSxpQkFBa0Isc0NBQXFDLENBQzFHO1VBRUQsSUFBSUUsZUFBZSxJQUFJQSxlQUFlLENBQUNFLEtBQUssRUFBRTtZQUM3Q25CLGFBQWEsR0FBR2lCLGVBQWUsQ0FBQ0UsS0FBSztZQUNyQyxNQUFNQyxPQUFPLEdBQUcsSUFBSUMsTUFBTSxDQUFDO2NBQzFCdFAsSUFBSSxFQUFFME8sYUFBYSxDQUFDTSxpQkFBaUI7Y0FDckNPLFFBQVEsRUFBRSxJQUFJO2NBQ2RDLE1BQU0sRUFBRTFCO1lBQ1QsQ0FBQyxDQUFDO1lBQ0YsTUFBTTJCLFlBQVksR0FBR2xCLGVBQWUsQ0FBQ21CLFFBQVEsQ0FBRSxJQUFHcEIsY0FBYyxDQUFDYSxjQUFlLEVBQUMsRUFBRTlVLFNBQVMsRUFBRUEsU0FBUyxFQUFFZ1YsT0FBTyxFQUFFO2NBQ2pITSxPQUFPLEVBQUUxQjtZQUNWLENBQUMsQ0FBQztZQUNGLE9BQU93QixZQUFZLENBQUNHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1VBQzFDLENBQUMsTUFBTTtZQUNONUIsY0FBYyxHQUFHLE9BQU87WUFDeEIsT0FBT0YsY0FBYztVQUN0QjtRQUNELENBQUMsQ0FBQyxDQUNEaFAsSUFBSSxDQUFDLFVBQVUrUSxTQUFjLEVBQUU7VUFBQTtVQUMvQixNQUFNQyxZQUFZLEdBQUc3QixhQUFhLGtCQUFHNEIsU0FBUyxDQUFDLENBQUMsQ0FBQyxnREFBWixZQUFjaE0sU0FBUyxFQUFFLENBQUNvSyxhQUFhLENBQUMsR0FBRyxFQUFFO1VBQ2xGLFFBQVFELGNBQWM7WUFDckIsS0FBSyxhQUFhO2NBQ2pCLE9BQU84QixZQUFZO1lBQ3BCLEtBQUssa0JBQWtCO2NBQ3RCLE9BQU9DLElBQUksQ0FBQ0Msd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUNySSxPQUFPLENBQUMsK0JBQStCLEVBQUUsQ0FDNUZtSSxZQUFZLEVBQ1poQyxjQUFjLENBQ2QsQ0FBQztZQUNILEtBQUssa0JBQWtCO2NBQ3RCLE9BQU9pQyxJQUFJLENBQUNDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDckksT0FBTyxDQUFDLCtCQUErQixFQUFFLENBQzVGbUcsY0FBYyxFQUNkZ0MsWUFBWSxDQUNaLENBQUM7WUFDSDtjQUNDLE9BQU9oQyxjQUFjO1VBQUM7UUFFekIsQ0FBQyxDQUFDLENBQ0QzTyxLQUFLLENBQUMsVUFBVXlHLE1BQVcsRUFBRTtVQUM3QixNQUFNcUssSUFBSSxHQUNUckssTUFBTSxDQUFDMEcsTUFBTSxJQUFJMUcsTUFBTSxDQUFDMEcsTUFBTSxLQUFLLEdBQUcsR0FDbEMsdUJBQXNCMUcsTUFBTSxDQUFDMEcsTUFBTyxnQ0FBK0J5QixpQkFBa0IsRUFBQyxHQUN2Rm5JLE1BQU0sQ0FBQzBILE9BQU87VUFDbEJ4UixHQUFHLENBQUNDLEtBQUssQ0FBQ2tVLElBQUksQ0FBQztRQUNoQixDQUFDLENBQUM7TUFDSjtNQUNBLE9BQU9uQyxjQUFjO0lBQ3RCLENBQUM7SUFFRG9DLG1CQUFtQixFQUFFLFVBQVUzVCxNQUFXLEVBQUU7TUFDM0MsTUFBTTRULGFBQWEsR0FBR3pJLGdCQUFnQixDQUFDbkwsTUFBTSxDQUFDNEIsU0FBUyxFQUFFLENBQUM7TUFDMURnTyxVQUFVLENBQUNwUSxLQUFLLENBQUNvVSxhQUFhLENBQUN4SSxPQUFPLENBQUMscUNBQXFDLENBQUMsRUFBRTtRQUM5RXlJLE9BQU8sRUFDTCxjQUFhRCxhQUFhLENBQUN4SSxPQUFPLENBQUMsc0RBQXNELENBQUUsZ0JBQzNGcEwsTUFBTSxDQUFDOFQsYUFBYSxFQUFFLENBQUNDLFFBQ3ZCLFVBQVMsR0FDVCxjQUFhSCxhQUFhLENBQUN4SSxPQUFPLENBQUMscURBQXFELENBQUUsZ0JBQWVwTCxNQUFNLENBQzlHNEIsU0FBUyxFQUFFLENBQ1hvUyxXQUFXLEVBQUUsQ0FDYkMsUUFBUSxFQUFFLENBQ1ZDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFFLEVBQUM7UUFDMUJDLFlBQVksRUFBRTtNQUNmLENBQUMsQ0FBUTtJQUNWLENBQUM7SUFFREMsb0JBQW9CLEVBQUUsVUFBVXBVLE1BQVcsRUFBcUI7TUFDL0Q0UCxVQUFVLENBQUNwUSxLQUFLLENBQ2YyTCxnQkFBZ0IsQ0FBQ25MLE1BQU0sQ0FBQzRCLFNBQVMsRUFBRSxDQUFDLENBQUN3SixPQUFPLENBQzNDLG1DQUFtQyxFQUNuQ3BMLE1BQU0sQ0FBQzRCLFNBQVMsRUFBRSxDQUFDeVMsa0JBQWtCLEVBQUUsQ0FBQ0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUNsRCxFQUNEO1FBQ0NILFlBQVksRUFBRTtNQUNmLENBQUMsQ0FDRDtJQUNGLENBQUM7SUFFRGpVLHVCQUF1QixFQUFFLFVBQVVoQyxXQUFnQixFQUFFO01BQ3BELE9BQU9BLFdBQVcsQ0FBQ1YsR0FBRyxDQUFDLDBCQUEwQixDQUFDLEdBQUdVLFdBQVcsQ0FBQ3FXLFdBQVcsR0FBR3JXLFdBQVc7SUFDM0YsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDc1cseUJBQXlCLEVBQUUsVUFBVTVKLE1BQWMsRUFBRXJLLElBQVUsRUFBRTtNQUFBO01BQ2hFLE1BQU1xVCxhQUFhLEdBQUdhLG1CQUFtQixDQUFDdEosZ0JBQWdCLENBQUM1SyxJQUFJLENBQUM7TUFDaEUsSUFBSTJNLE9BQU8sR0FBR3NHLElBQUksQ0FBQ3JTLElBQUksQ0FBRSxvQ0FBbUMsQ0FBc0I7TUFFbEYsSUFBSSxDQUFDK0wsT0FBTyxFQUFFO1FBQ2JBLE9BQU8sR0FBRyxJQUFJVCxpQkFBaUIsQ0FBQyxvQ0FBb0MsRUFBRTtVQUNyRVYsVUFBVSxFQUFFLEtBQUs7VUFDakJJLFNBQVMsRUFBRTtRQUNaLENBQUMsQ0FBQztRQUNGZSxPQUFPLENBQUN3SCxhQUFhLENBQUMscUJBQXFCLENBQUM7UUFDNUNuVSxJQUFJLENBQUM0TSxZQUFZLENBQUNELE9BQU8sQ0FBQztNQUMzQjtNQUVBLE1BQU14SSxXQUFXLHlCQUFJa0csTUFBTSxDQUFDck4sVUFBVSxDQUFDLFVBQVUsQ0FBQyx1REFBOUIsbUJBQ2pCb1gsV0FBVyxFQUFFLENBQ2R0QyxJQUFJLENBQUVoVixPQUFPO1FBQUE7UUFBQSxPQUFLQSxPQUFPLGFBQVBBLE9BQU8sMkNBQVBBLE9BQU8sQ0FBRXNHLE9BQU8sRUFBRSxxREFBbEIsaUJBQW9CaVIsVUFBVSxDQUFDLDJCQUEyQixDQUFDO01BQUEsRUFBQyxDQUM5RWpSLE9BQU8sRUFBRTtNQUNYLE1BQU1rUixVQUFVLDRCQUFHakssTUFBTSxDQUFDdE4saUJBQWlCLENBQUMsVUFBVSxDQUFDLDBEQUFwQyxzQkFBc0NnSyxTQUFTLENBQUM1QyxXQUFXLENBQUM7TUFFL0UsSUFBSW9RLGVBQXlDO01BQzdDLElBQUlELFVBQVUsSUFBSUEsVUFBVSxDQUFDcEssTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN4Q3FLLGVBQWUsR0FBR0QsVUFBVSxDQUFDeEMsSUFBSSxDQUFFMEMsUUFBc0IsSUFBSztVQUM3RCxPQUFPQSxRQUFRLENBQUNDLEdBQUcsS0FBS0Msc0JBQXNCLENBQUNySyxNQUFNLENBQUN0TixpQkFBaUIsRUFBRSxDQUFFcUcsT0FBTyxFQUFFLENBQUM7UUFDdEYsQ0FBQyxDQUFDO01BQ0g7TUFDQXVKLE9BQU8sQ0FBQ2dJLGNBQWMsRUFBRTtNQUN4QmhJLE9BQU8sQ0FBQ2lJLFVBQVUsQ0FDakIsSUFBSUMsS0FBSyxDQUFDO1FBQ1RDLElBQUksRUFBRXpCLGFBQWEsQ0FBQ3hJLE9BQU8sQ0FBQyx1Q0FBdUMsRUFBRSxDQUFFLHVCQUFFMEosZUFBZSxxREFBZixpQkFBaUJRLElBQUssRUFBQyxDQUFDO01BQ2xHLENBQUMsQ0FBQyxDQUNGO01BQ0RwSSxPQUFPLENBQUNFLE1BQU0sQ0FBQ3hDLE1BQU0sQ0FBQztJQUN2QjtFQUNELENBQUM7O0VBRUQ7QUFDQTtBQUNBO0VBRkEsT0FHZWhOLFlBQVk7QUFBQSJ9
827
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRDb2xsYWJvcmF0aW9uQmluZGluZyIsImZpZWxkIiwiYmluZGluZyIsImdldEJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZyIsImlzQSIsIm9WaWV3IiwiQ29tbW9uVXRpbHMiLCJnZXRUYXJnZXRWaWV3IiwiRmllbGRSdW50aW1lIiwidXBsb2FkUHJvbWlzZXMiLCJ1bmRlZmluZWQiLCJjcmVhdGluZ0luYWN0aXZlUm93Iiwib25EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGgiLCJvU291cmNlIiwib0NvbnRyb2xsZXIiLCJzTmF2UGF0aCIsIl9yb3V0aW5nIiwib0JpbmRpbmdDb250ZXh0Iiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZm5OYXZpZ2F0ZSIsIm9Db250ZXh0IiwibmF2aWdhdGVUb1RhcmdldCIsImdldFZpZXdEYXRhIiwiY29udmVydGVyVHlwZSIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiZ2V0Q29udHJvbGxlciIsIk5hdmlnYXRpb25UeXBlIiwiRm9yd2FyZE5hdmlnYXRpb24iLCJMb2ciLCJlcnJvciIsImlzRHJhZnRJbmRpY2F0b3JWaXNpYmxlIiwic1Byb3BlcnR5UGF0aCIsInNTZW1hbnRpY0tleUhhc0RyYWZ0SW5kaWNhdG9yIiwiSGFzRHJhZnRFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImhpZGVEcmFmdEluZm8iLCJvblZhbGlkYXRlRmllbGRHcm91cCIsIm9FdmVudCIsIm9GRUNvbnRyb2xsZXIiLCJfZ2V0RXh0ZW5zaW9uQ29udHJvbGxlciIsIl9zaWRlRWZmZWN0cyIsImhhbmRsZUZpZWxkR3JvdXBDaGFuZ2UiLCJfZmV0Y2hSZWNvbW1lbmRhdGlvbnMiLCJjb250cm9sbGVyIiwidmlldyIsImZpZWxkQmluZGluZ0NvbnRleHQiLCJyZWNvbW1lbmRhdGlvbnNDb250ZXh0IiwiZmllbGRCaW5kaW5nIiwiZmVDb250cm9sbGVyIiwidmFsdWVIZWxwSWQiLCJnZXRWYWx1ZUhlbHAiLCJpbmNsdWRlcyIsInRhYmxlSWQiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwidGFibGUiLCJieUlkIiwiY29udGV4dElkZW50aWZpZXIiLCJnZXRQYXJlbnQiLCJnZXRJZGVudGlmaWVyQ29sdW1uIiwicmVjb21tZW5kYXRpb25zIiwiZmV0Y2hBbmRBcHBseVJlY29tbWVuZGF0aW9uc09uRmllbGRDaGFuZ2UiLCJjb250ZXh0IiwiaGFuZGxlQ2hhbmdlIiwib1NvdXJjZUZpZWxkIiwiZ2V0U291cmNlIiwiYklzVHJhbnNpZW50IiwiaXNUcmFuc2llbnQiLCJwVmFsdWVSZXNvbHZlZCIsImdldFBhcmFtZXRlciIsIlByb21pc2UiLCJyZXNvbHZlIiwiYlZhbGlkIiwiZmllbGRWYWxpZGl0eSIsImdldEZpZWxkU3RhdGVPbkNoYW5nZSIsInN0YXRlIiwidGhlbiIsIm1QYXJhbWV0ZXJzIiwidmFsaWQiLCJGaWVsZEFQSSIsImhhbmRsZUZpZWxkQ2hhbmdlIiwiY2F0Y2giLCJkZWJ1ZyIsInZhbHVlUmVzb2x2ZWRBbmRQYXRjaFNlbnQiLCJzZXRUaW1lb3V0IiwiZWRpdEZsb3ciLCJzeW5jVGFzayIsInByZXBhcmVEZWZlcnJlZFNpZGVFZmZlY3RzRm9yRmllbGQiLCJiQ29sbGFib3JhdGlvbkVuYWJsZWQiLCJDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jIiwiaXNDb25uZWN0ZWQiLCJkYXRhIiwiZ2V0QmluZGluZ0luZm8iLCJwYXJ0cyIsImZpbHRlciIsInBhcnQiLCJwYXRoIiwibWFwIiwiZ2V0UGF0aCIsInJldGFpbkFzeW5jTWVzc2FnZXMiLCJ1cGRhdGVDb2xsYWJvcmF0aW9uIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJhdHRhY2hFdmVudE9uY2UiLCJzZW5kIiwiYWN0aW9uIiwiQWN0aXZpdHkiLCJDaGFuZ2UiLCJjb250ZW50IiwicmVsZWFzZUFzeW5jTWVzc2FnZXMiLCJoYW5kbGVMaXZlQ2hhbmdlIiwiZXZlbnQiLCJfc2VuZENvbGxhYm9yYXRpb25NZXNzYWdlRm9yRmlsZVVwbG9hZGVyIiwiZmlsZVVwbG9hZGVyIiwiYmluZGluZ1BhdGgiLCJnZXRQcm9wZXJ0eSIsImZ1bGxQYXRoIiwiaGFuZGxlT3BlblVwbG9hZGVyIiwiTG9jayIsImhhbmRsZUNsb3NlVXBsb2FkZXIiLCJVbmxvY2siLCJtRmllbGRTdGF0ZSIsIl9pc0JpbmRpbmdTdGF0ZU1lc3NhZ2VzIiwib0JpbmRpbmciLCJnZXREYXRhU3RhdGUiLCJnZXRJbnZhbGlkVmFsdWUiLCJnZXRDb250ZW50IiwiRmllbGRXcmFwcGVyIiwiZ2V0TWV0YWRhdGEiLCJnZXROYW1lIiwiZ2V0RWRpdE1vZGUiLCJnZXRDb250ZW50RWRpdCIsImJJc1ZhbGlkIiwiZ2V0TWF4Q29uZGl0aW9ucyIsIm9WYWx1ZUJpbmRpbmdJbmZvIiwiZ2V0VmFsdWUiLCJmaWVsZFZhbHVlIiwidmFsaWRpdHkiLCJfZm5GaXhIYXNoUXVlcnlTdHJpbmciLCJzQ3VycmVudEhhc2giLCJzcGxpdCIsIl9mbkdldExpbmtJbmZvcm1hdGlvbiIsIl9vU291cmNlIiwiX29MaW5rIiwiX3NQcm9wZXJ0eVBhdGgiLCJfc1ZhbHVlIiwiZm5TZXRBY3RpdmUiLCJvTW9kZWwiLCJzU2VtYW50aWNPYmplY3ROYW1lIiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwib0FwcENvbXBvbmVudCIsImdldEFwcENvbXBvbmVudCIsIm9TaGVsbFNlcnZpY2VIZWxwZXIiLCJnZXRTaGVsbFNlcnZpY2VzIiwicEdldExpbmtzUHJvbWlzZSIsImdldExpbmtzV2l0aENhY2hlIiwic2VtYW50aWNPYmplY3QiLCJhU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMiLCJnZXRPYmplY3QiLCJTZW1hbnRpY09iamVjdE5hbWUiLCJTZW1hbnRpY09iamVjdEZ1bGxQYXRoIiwiTWV0YU1vZGVsIiwiSW50ZXJuYWxNb2RlbENvbnRleHQiLCJTaGVsbFNlcnZpY2VIZWxwZXIiLCJHZXRMaW5rc1Byb21pc2UiLCJTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucyIsIl9mblF1aWNrVmlld0hhc05ld0NvbmRpdGlvbiIsIm9TZW1hbnRpY09iamVjdFBheWxvYWQiLCJfb0xpbmtJbmZvIiwiYlJlc3VsdGluZ05ld0NvbmRpdGlvbkZvckNvbmRpdGlvbmFsV3JhcHBlciIsIl9mblF1aWNrVmlld1NldE5ld0NvbmRpdGlvbkZvckNvbmRpdGlvbmFsV3JhcHBlciIsIl9vRmluYWxTZW1hbnRpY09iamVjdHMiLCJzVG1wUGF0aCIsImFTZW1hbnRpY09iamVjdFBhdGhzIiwiT2JqZWN0Iiwia2V5cyIsImlQYXRoc0NvdW50IiwiX2ZuVXBkYXRlU2VtYW50aWNPYmplY3RzVGFyZ2V0TW9kZWwiLCJzVmFsdWUiLCJvQ29udHJvbCIsImJBY3RpdmUiLCJzZXRBY3RpdmUiLCJzZXRUaXRsZUFjdGl2ZSIsIm9Db25kaXRpb25hbFdyYXBwZXIiLCJzZXRDb25kaXRpb24iLCJvTGlua0luZm8iLCJnZXRIYXNoIiwidXBkYXRlU2VtYW50aWNUYXJnZXRzIiwib0ZpbmFsU2VtYW50aWNPYmplY3RzIiwib0Vycm9yIiwiX2NoZWNrQ29udHJvbEhhc01vZGVsQW5kQmluZGluZ0NvbnRleHQiLCJfY29udHJvbCIsIl9jaGVja0N1c3RvbURhdGFWYWx1ZUJlZm9yZVVwZGF0aW5nU2VtYW50aWNPYmplY3RNb2RlbCIsInByb3BlcnR5UGF0aCIsImFDdXN0b21EYXRhIiwic1NlbWFudGljT2JqZWN0UGF0aFZhbHVlIiwib1ZhbHVlQmluZGluZyIsIl9mbkN1c3RvbURhdGFWYWx1ZUlzU3RyaW5nIiwic2VtYW50aWNPYmplY3RQYXRoVmFsdWUiLCJjdXN0b21EYXRhIiwiZ2V0S2V5IiwiaW5kZXgiLCJfb0NoYW5nZUV2ZW50IiwiTGlua01vZGVsQ29udGV4dENoYW5nZSIsInNQcm9wZXJ0eSIsInNQYXRoVG9Qcm9wZXJ0eSIsImNvbnRyb2wiLCJtZGNMaW5rIiwiZ2V0RGVwZW5kZW50cyIsImxlbmd0aCIsImdldEN1c3RvbURhdGEiLCJvcGVuRXh0ZXJuYWxMaW5rIiwic291cmNlIiwib3BlbldpbmRvdyIsImNyZWF0ZVBvcG92ZXJXaXRoTm9UYXJnZXRzIiwibWRjTGlua0lkIiwiZ2V0SWQiLCJpbGx1c3RyYXRlZE1lc3NhZ2VTZXR0aW5ncyIsInRpdGxlIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImdldFRleHQiLCJkZXNjcmlwdGlvbiIsImVuYWJsZUZvcm1hdHRlZFRleHQiLCJpbGx1c3RyYXRpb25TaXplIiwiaWxsdXN0cmF0aW9uVHlwZSIsIklsbHVzdHJhdGVkTWVzc2FnZVR5cGUiLCJUZW50IiwiaWxsdXN0cmF0ZWRNZXNzYWdlIiwiSWxsdXN0cmF0ZWRNZXNzYWdlIiwicG9wb3ZlclNldHRpbmdzIiwiaG9yaXpvbnRhbFNjcm9sbGluZyIsInNob3dIZWFkZXIiLCJEZXZpY2UiLCJzeXN0ZW0iLCJwaG9uZSIsInBsYWNlbWVudCIsIm1vYmlsZWxpYnJhcnkiLCJQbGFjZW1lbnRUeXBlIiwiQXV0byIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiUmVzcG9uc2l2ZVBvcG92ZXIiLCJvcGVuTGluayIsInNhcG1MaW5rIiwiaFJlZiIsImdldFRyaWdnZXJIcmVmIiwibGlua0l0ZW1zIiwicmV0cmlldmVMaW5rSXRlbXMiLCJnZXRQYXlsb2FkIiwiaGFzUXVpY2tWaWV3RmFjZXRzIiwicG9wb3ZlciIsImFkZERlcGVuZGVudCIsIm9wZW5CeSIsIm9wZW4iLCJhcHBDb21wb25lbnQiLCJzaGVsbFNlcnZpY2UiLCJzaGVsbEhhc2giLCJwYXJzZVNoZWxsSGFzaCIsIm5hdkFyZ3MiLCJ0YXJnZXQiLCJwYXJhbXMiLCJLZWVwQWxpdmVIZWxwZXIiLCJzdG9yZUNvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JIYXNoIiwiaXNTdGlja3lFZGl0TW9kZSIsInRvRXh0ZXJuYWwiLCJuZXdIcmVmIiwiaHJlZkZvckV4dGVybmFsQXN5bmMiLCJwcmVzc0xpbmsiLCJmaW5kRWxlbWVudHMiLCJlbGVtIiwib0ZpZWxkSW5mbyIsInVwbG9hZFN0cmVhbSIsIkZFQ29udHJvbGxlciIsImZpbGVXcmFwcGVyIiwidXBsb2FkVXJsIiwiZ2V0VXBsb2FkVXJsIiwic2V0VUlCdXN5Iiwic2V0VXBsb2FkVXJsIiwicmVtb3ZlQWxsSGVhZGVyUGFyYW1ldGVycyIsInRva2VuIiwiZ2V0SHR0cEhlYWRlcnMiLCJoZWFkZXJQYXJhbWV0ZXJDU1JGVG9rZW4iLCJGaWxlVXBsb2FkZXJQYXJhbWV0ZXIiLCJzZXROYW1lIiwic2V0VmFsdWUiLCJhZGRIZWFkZXJQYXJhbWV0ZXIiLCJlVGFnIiwiaGVhZGVyUGFyYW1ldGVyRVRhZyIsImhlYWRlclBhcmFtZXRlckFjY2VwdCIsInVwbG9hZFByb21pc2UiLCJyZWplY3QiLCJ1cGxvYWQiLCJNZXNzYWdlQm94IiwiaGFuZGxlVXBsb2FkQ29tcGxldGUiLCJwcm9wZXJ0eUZpbGVOYW1lIiwic3RhdHVzIiwiTnVtYmVyIiwiX2Rpc3BsYXlNZXNzYWdlRm9yRmFpbGVkVXBsb2FkIiwibmV3RVRhZyIsImV0YWciLCJzZXRQcm9wZXJ0eSIsImF2YXRhciIsInJlZnJlc2hBdmF0YXJDYWNoZUJ1c3RpbmciLCJfY2FsbFNpZGVFZmZlY3RzRm9yU3RyZWFtIiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsIm5vdGlmaWNhdGlvbkRhdGEiLCJwdXNoIiwic0Vycm9yIiwic01lc3NhZ2VUZXh0IiwiSlNPTiIsInBhcnNlIiwibWVzc2FnZSIsImUiLCJyZW1vdmVTdHJlYW0iLCJkZWxldGVCdXR0b24iLCJnZXRJY29uRm9yTWltZVR5cGUiLCJzTWltZVR5cGUiLCJJY29uUG9vbCIsInJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QiLCJzUHJvcGVydHlWYWx1ZSIsInNQcm9wZXJ0eUZ1bGxQYXRoIiwic0Rpc3BsYXlGb3JtYXQiLCJzVGV4dFByb3BlcnR5Iiwic1Byb3BlcnR5TmFtZSIsIkNvbW1vbkhlbHBlciIsInJlcXVlc3RWYWx1ZUxpc3RJbmZvIiwibVZhbHVlTGlzdEluZm8iLCJvVmFsdWVMaXN0SW5mbyIsIm9WYWx1ZUxpc3RNb2RlbCIsIiRtb2RlbCIsIm9NZXRhTW9kZWxWYWx1ZUxpc3QiLCJvUGFyYW1XaXRoS2V5IiwiUGFyYW1ldGVycyIsImZpbmQiLCJvUGFyYW1ldGVyIiwiTG9jYWxEYXRhUHJvcGVydHkiLCIkUHJvcGVydHlQYXRoIiwiVmFsdWVMaXN0UHJvcGVydHkiLCJFcnJvciIsIm9UZXh0QW5ub3RhdGlvbiIsIkNvbGxlY3Rpb25QYXRoIiwiJFBhdGgiLCJvRmlsdGVyIiwiRmlsdGVyIiwib3BlcmF0b3IiLCJ2YWx1ZTEiLCJvTGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsIiRzZWxlY3QiLCJyZXF1ZXN0Q29udGV4dHMiLCJhQ29udGV4dHMiLCJzRGVzY3JpcHRpb24iLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwic01zZyIsImhhbmRsZVR5cGVNaXNzbWF0Y2giLCJyZXNvdXJjZU1vZGVsIiwiZGV0YWlscyIsImdldFBhcmFtZXRlcnMiLCJtaW1lVHlwZSIsImdldE1pbWVUeXBlIiwidG9TdHJpbmciLCJyZXBsYWNlQWxsIiwiY29udGVudFdpZHRoIiwiaGFuZGxlRmlsZVNpemVFeGNlZWQiLCJnZXRNYXhpbXVtRmlsZVNpemUiLCJ0b0ZpeGVkIiwiX2NvbnRyb2xsZXIiLCJzaG93Q29sbGFib3JhdGlvbkVkaXRVc2VyIiwiUmVzb3VyY2VNb2RlbEhlbHBlciIsImFkZFN0eWxlQ2xhc3MiLCJnZXRCaW5kaW5ncyIsInN0YXJ0c1dpdGgiLCJhY3Rpdml0aWVzIiwiZWRpdGluZ0FjdGl2aXR5IiwiYWN0aXZpdHkiLCJrZXkiLCJnZXRBY3Rpdml0eUtleUZyb21QYXRoIiwiZGVzdHJveUNvbnRlbnQiLCJhZGRDb250ZW50IiwiTGFiZWwiLCJ0ZXh0IiwibmFtZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRmllbGRSdW50aW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29sbGFib3JhdGlvbkFjdGl2aXR5U3luYyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCB0eXBlIHsgVXNlckFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHsgQWN0aXZpdHksIGdldEFjdGl2aXR5S2V5RnJvbVBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9Db2xsYWJvcmF0aW9uQ29tbW9uXCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VXaXRoVUk1IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgS2VlcEFsaXZlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0tlZXBBbGl2ZUhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbEhlbHBlciwgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IENvbW1vbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db21tb25IZWxwZXJcIjtcbmltcG9ydCBGaWVsZFdyYXBwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvY29udHJvbHMvRmllbGRXcmFwcGVyXCI7XG5pbXBvcnQgdHlwZSBGaWxlV3JhcHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jb250cm9scy9GaWxlV3JhcHBlclwiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZEFQSVR5cGUgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWVsZC9GaWVsZEFQSVwiO1xuaW1wb3J0IEZpZWxkQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkQVBJXCI7XG5pbXBvcnQgdHlwZSBBdmF0YXIgZnJvbSBcInNhcC9tL0F2YXRhclwiO1xuaW1wb3J0IHR5cGUgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCB0eXBlIHsgJElsbHVzdHJhdGVkTWVzc2FnZVNldHRpbmdzIH0gZnJvbSBcInNhcC9tL0lsbHVzdHJhdGVkTWVzc2FnZVwiO1xuaW1wb3J0IElsbHVzdHJhdGVkTWVzc2FnZSBmcm9tIFwic2FwL20vSWxsdXN0cmF0ZWRNZXNzYWdlXCI7XG5pbXBvcnQgSWxsdXN0cmF0ZWRNZXNzYWdlVHlwZSBmcm9tIFwic2FwL20vSWxsdXN0cmF0ZWRNZXNzYWdlVHlwZVwiO1xuaW1wb3J0IExhYmVsIGZyb20gXCJzYXAvbS9MYWJlbFwiO1xuaW1wb3J0IHR5cGUgTGluayBmcm9tIFwic2FwL20vTGlua1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCB0eXBlIHsgJFJlc3BvbnNpdmVQb3BvdmVyU2V0dGluZ3MgfSBmcm9tIFwic2FwL20vUmVzcG9uc2l2ZVBvcG92ZXJcIjtcbmltcG9ydCBSZXNwb25zaXZlUG9wb3ZlciBmcm9tIFwic2FwL20vUmVzcG9uc2l2ZVBvcG92ZXJcIjtcbmltcG9ydCBtb2JpbGVsaWJyYXJ5IGZyb20gXCJzYXAvbS9saWJyYXJ5XCI7XG5pbXBvcnQgRGV2aWNlIGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgdHlwZSBDdXN0b21EYXRhIGZyb20gXCJzYXAvdWkvY29yZS9DdXN0b21EYXRhXCI7XG5pbXBvcnQgdHlwZSBFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgSWNvblBvb2wgZnJvbSBcInNhcC91aS9jb3JlL0ljb25Qb29sXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sbGVyIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIEZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkJENoYW5nZUV2ZW50IH0gZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBNZGNMaW5rIH0gZnJvbSBcInNhcC91aS9tZGMvTGlua1wiO1xuaW1wb3J0IHR5cGUgQ29tcG9zaXRlQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbXBvc2l0ZUJpbmRpbmdcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIEZpbGVVcGxvYWRlciBmcm9tIFwic2FwL3VpL3VuaWZpZWQvRmlsZVVwbG9hZGVyXCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVVcGxvYWRlciRVcGxvYWRDb21wbGV0ZUV2ZW50IH0gZnJvbSBcInNhcC91aS91bmlmaWVkL0ZpbGVVcGxvYWRlclwiO1xuaW1wb3J0IEZpbGVVcGxvYWRlclBhcmFtZXRlciBmcm9tIFwic2FwL3VpL3VuaWZpZWQvRmlsZVVwbG9hZGVyUGFyYW1ldGVyXCI7XG5pbXBvcnQgb3BlbldpbmRvdyBmcm9tIFwic2FwL3VpL3V0aWwvb3BlbldpbmRvd1wiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcIi4uL3RhYmxlL1RhYmxlQVBJXCI7XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyB1c2VkIGZvciBjb2xsYWJvcmF0aW9uIG5vdGlmaWNhdGlvbnMuXG4gKlxuICogQHBhcmFtIGZpZWxkXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZ1xuICovXG5mdW5jdGlvbiBnZXRDb2xsYWJvcmF0aW9uQmluZGluZyhmaWVsZDogQ29udHJvbCk6IE9EYXRhTGlzdEJpbmRpbmcgfCBPRGF0YUNvbnRleHRCaW5kaW5nIHtcblx0bGV0IGJpbmRpbmcgPSAoZmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KS5nZXRCaW5kaW5nKCk7XG5cblx0aWYgKCFiaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KGZpZWxkKTtcblx0XHRiaW5kaW5nID0gKG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCkuZ2V0QmluZGluZygpO1xuXHR9XG5cblx0cmV0dXJuIGJpbmRpbmc7XG59XG4vKipcbiAqIFN0YXRpYyBjbGFzcyB1c2VkIGJ5IFwic2FwLnVpLm1kYy5GaWVsZFwiIGR1cmluZyBydW50aW1lXG4gKlxuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgaW50ZXJuYWwvZXhwZXJpbWVudGFsIHVzZSFcbiAqL1xuY29uc3QgRmllbGRSdW50aW1lID0ge1xuXHR1cGxvYWRQcm9taXNlczogdW5kZWZpbmVkIGFzIGFueSxcblx0Y3JlYXRpbmdJbmFjdGl2ZVJvdzogZmFsc2UsXG5cblx0LyoqXG5cdCAqIFRyaWdnZXJzIGFuIGludGVybmFsIG5hdmlnYXRpb24gb24gdGhlIGxpbmsgcGVydGFpbmluZyB0byBEYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBvU291cmNlIFNvdXJjZSBvZiB0aGUgcHJlc3MgZXZlbnRcblx0ICogQHBhcmFtIG9Db250cm9sbGVyIEluc3RhbmNlIG9mIHRoZSBjb250cm9sbGVyXG5cdCAqIEBwYXJhbSBzTmF2UGF0aCBUaGUgbmF2aWdhdGlvbiBwYXRoXG5cdCAqL1xuXHRvbkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDogZnVuY3Rpb24gKG9Tb3VyY2U6IENvbnRyb2wsIG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlciwgc05hdlBhdGg6IHN0cmluZykge1xuXHRcdGlmIChvQ29udHJvbGxlci5fcm91dGluZykge1xuXHRcdFx0bGV0IG9CaW5kaW5nQ29udGV4dCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0Y29uc3Qgb1ZpZXcgPSBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KG9Tb3VyY2UpLFxuXHRcdFx0XHRvTWV0YU1vZGVsID0gb0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdGZuTmF2aWdhdGUgPSBmdW5jdGlvbiAob0NvbnRleHQ/OiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dCA9IG9Db250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvQ29udHJvbGxlci5fcm91dGluZy5uYXZpZ2F0ZVRvVGFyZ2V0KG9CaW5kaW5nQ29udGV4dCwgc05hdlBhdGgsIHRydWUpO1xuXHRcdFx0XHR9O1xuXHRcdFx0Ly8gU2hvdyBkcmFmdCBsb3NzIGNvbmZpcm1hdGlvbiBkaWFsb2cgaW4gY2FzZSBvZiBPYmplY3QgcGFnZVxuXHRcdFx0aWYgKChvVmlldy5nZXRWaWV3RGF0YSgpIGFzIGFueSkuY29udmVydGVyVHlwZSA9PT0gXCJPYmplY3RQYWdlXCIgJiYgIU1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvTWV0YU1vZGVsKSkge1xuXHRcdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0XHRmbk5hdmlnYXRlLFxuXHRcdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQsXG5cdFx0XHRcdFx0b1ZpZXcuZ2V0Q29udHJvbGxlcigpLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuRm9yd2FyZE5hdmlnYXRpb25cblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZuTmF2aWdhdGUoKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRcIkZpZWxkUnVudGltZTogTm8gcm91dGluZyBsaXN0ZW5lciBjb250cm9sbGVyIGV4dGVuc2lvbiBmb3VuZC4gSW50ZXJuYWwgbmF2aWdhdGlvbiBhYm9ydGVkLlwiLFxuXHRcdFx0XHRcInNhcC5mZS5tYWNyb3MuZmllbGQuRmllbGRSdW50aW1lXCIsXG5cdFx0XHRcdFwib25EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGhcIlxuXHRcdFx0KTtcblx0XHR9XG5cdH0sXG5cblx0aXNEcmFmdEluZGljYXRvclZpc2libGU6IGZ1bmN0aW9uIChcblx0XHRzUHJvcGVydHlQYXRoOiBhbnksXG5cdFx0c1NlbWFudGljS2V5SGFzRHJhZnRJbmRpY2F0b3I6IGFueSxcblx0XHRIYXNEcmFmdEVudGl0eTogYW55LFxuXHRcdElzQWN0aXZlRW50aXR5OiBhbnksXG5cdFx0aGlkZURyYWZ0SW5mbzogYW55XG5cdCkge1xuXHRcdGlmIChJc0FjdGl2ZUVudGl0eSAhPT0gdW5kZWZpbmVkICYmIEhhc0RyYWZ0RW50aXR5ICE9PSB1bmRlZmluZWQgJiYgKCFJc0FjdGl2ZUVudGl0eSB8fCBIYXNEcmFmdEVudGl0eSkgJiYgIWhpZGVEcmFmdEluZm8pIHtcblx0XHRcdHJldHVybiBzUHJvcGVydHlQYXRoID09PSBzU2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogSGFuZGxlciBmb3IgdGhlIHZhbGlkYXRlRmllbGRHcm91cCBldmVudC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIG9uVmFsaWRhdGVGaWVsZEdyb3VwXG5cdCAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgY29udHJvbGxlciBvZiB0aGUgcGFnZSBjb250YWluaW5nIHRoZSBmaWVsZFxuXHQgKiBAcGFyYW0gb0V2ZW50IFRoZSBldmVudCBvYmplY3QgcGFzc2VkIGJ5IHRoZSB2YWxpZGF0ZUZpZWxkR3JvdXAgZXZlbnRcblx0ICovXG5cdG9uVmFsaWRhdGVGaWVsZEdyb3VwOiBmdW5jdGlvbiAob0NvbnRyb2xsZXI6IG9iamVjdCwgb0V2ZW50OiBvYmplY3QpIHtcblx0XHRjb25zdCBvRkVDb250cm9sbGVyID0gRmllbGRSdW50aW1lLl9nZXRFeHRlbnNpb25Db250cm9sbGVyKG9Db250cm9sbGVyKTtcblx0XHRvRkVDb250cm9sbGVyLl9zaWRlRWZmZWN0cy5oYW5kbGVGaWVsZEdyb3VwQ2hhbmdlKG9FdmVudCk7XG5cdH0sXG5cblx0X2ZldGNoUmVjb21tZW5kYXRpb25zOiBmdW5jdGlvbiAoZmllbGQ6IEZpZWxkLCBjb250cm9sbGVyOiBDb250cm9sbGVyKTogdm9pZCB7XG5cdFx0Y29uc3QgdmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcoZmllbGQpO1xuXHRcdGNvbnN0IGZpZWxkQmluZGluZ0NvbnRleHQgPSBmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGxldCByZWNvbW1lbmRhdGlvbnNDb250ZXh0O1xuXG5cdFx0Ly8gZGV0ZXJtaW5lIHJlY29tbWVuZGF0aW9uIGNvbnRleHQgdG8gdXNlXG5cdFx0Y29uc3QgZmllbGRCaW5kaW5nID0gKGZpZWxkQmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk/LmdldEJpbmRpbmcoKTtcblxuXHRcdGlmIChmaWVsZEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdC8vIGluc2lkZSBhIHRhYmxlLCB1c2UgdGhlIHJvd1xuXHRcdFx0cmVjb21tZW5kYXRpb25zQ29udGV4dCA9IGZpZWxkQmluZGluZ0NvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGluc2lkZSBhIGZvcm0gbm93XG5cdFx0XHQvLyBjYW4gaGF2ZSAxLTEgbmF2aWdhdGlvbiBwcm9wZXJ0eS9kaXJlY3QgcHJvcGVydHkgLSB1c2UgdmlldyBjb250ZXh0XG5cdFx0XHRyZWNvbW1lbmRhdGlvbnNDb250ZXh0ID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdH1cblx0XHRjb25zdCBmZUNvbnRyb2xsZXIgPSBGaWVsZFJ1bnRpbWUuX2dldEV4dGVuc2lvbkNvbnRyb2xsZXIoY29udHJvbGxlcik7XG5cdFx0Y29uc3QgdmFsdWVIZWxwSWQgPSBmaWVsZC5nZXRWYWx1ZUhlbHAoKTtcblx0XHRpZiAodmFsdWVIZWxwSWQgJiYgdmFsdWVIZWxwSWQuaW5jbHVkZXMoXCI6OlRhYmxlVmFsdWVIZWxwOjpcIikpIHtcblx0XHRcdGNvbnN0IHRhYmxlSWQgPSB2YWx1ZUhlbHBJZC5zdWJzdHJpbmcoMCwgdmFsdWVIZWxwSWQuaW5kZXhPZihcIjo6VGFibGVWYWx1ZUhlbHA6OlwiKSk7XG5cdFx0XHRjb25zdCB0YWJsZSA9IHZpZXcuYnlJZCh0YWJsZUlkKTtcblx0XHRcdGNvbnN0IGNvbnRleHRJZGVudGlmaWVyID0gKHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSk/LmdldElkZW50aWZpZXJDb2x1bW4oKTtcblx0XHRcdGZlQ29udHJvbGxlci5yZWNvbW1lbmRhdGlvbnMuZmV0Y2hBbmRBcHBseVJlY29tbWVuZGF0aW9uc09uRmllbGRDaGFuZ2UoZmllbGQsIFtcblx0XHRcdFx0eyBjb250ZXh0OiByZWNvbW1lbmRhdGlvbnNDb250ZXh0LCBjb250ZXh0SWRlbnRpZmllciB9XG5cdFx0XHRdKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZmVDb250cm9sbGVyLnJlY29tbWVuZGF0aW9ucy5mZXRjaEFuZEFwcGx5UmVjb21tZW5kYXRpb25zT25GaWVsZENoYW5nZShmaWVsZCwgW3sgY29udGV4dDogcmVjb21tZW5kYXRpb25zQ29udGV4dCB9XSk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogSGFuZGxlciBmb3IgdGhlIGNoYW5nZSBldmVudC5cblx0ICogU3RvcmUgZmllbGQgZ3JvdXAgSURzIG9mIHRoaXMgZmllbGQgZm9yIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzIHdoZW4gcmVxdWlyZWQuXG5cdCAqIFdlIHN0b3JlIHRoZW0gaGVyZSB0byBlbnN1cmUgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUNoYW5nZVxuXHQgKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIGNvbnRyb2xsZXIgb2YgdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgZmllbGRcblx0ICogQHBhcmFtIG9FdmVudCBUaGUgZXZlbnQgb2JqZWN0IHBhc3NlZCBieSB0aGUgY2hhbmdlIGV2ZW50XG5cdCAqL1xuXHRoYW5kbGVDaGFuZ2U6IGZ1bmN0aW9uIChvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsIG9FdmVudDogRmllbGQkQ2hhbmdlRXZlbnQgJiBFdmVudDx7IGlzVmFsaWQ6IGJvb2xlYW4gfT4pOiB2b2lkIHtcblx0XHRjb25zdCBvU291cmNlRmllbGQgPSBvRXZlbnQuZ2V0U291cmNlKCkgYXMgQ29udHJvbCxcblx0XHRcdGJJc1RyYW5zaWVudCA9IG9Tb3VyY2VGaWVsZCAmJiAob1NvdXJjZUZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgYW55KS5pc1RyYW5zaWVudCgpLFxuXHRcdFx0cFZhbHVlUmVzb2x2ZWQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKSB8fCBQcm9taXNlLnJlc29sdmUoKSxcblx0XHRcdG9Tb3VyY2UgPSBvRXZlbnQuZ2V0U291cmNlKCksXG5cdFx0XHRiVmFsaWQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwidmFsaWRcIiksXG5cdFx0XHRmaWVsZFZhbGlkaXR5ID0gdGhpcy5nZXRGaWVsZFN0YXRlT25DaGFuZ2Uob0V2ZW50KS5zdGF0ZVtcInZhbGlkaXR5XCJdLFxuXHRcdFx0ZmllbGQgPSBvRXZlbnQuZ2V0U291cmNlKCkgYXMgQ29udHJvbDtcblxuXHRcdC8vIFVzZSB0aGUgRkUgQ29udHJvbGxlciBpbnN0ZWFkIG9mIHRoZSBleHRlbnNpb25BUEkgdG8gYWNjZXNzIGludGVybmFsIEZFIGNvbnRyb2xsZXJzXG5cdFx0Y29uc3Qgb0ZFQ29udHJvbGxlciA9IEZpZWxkUnVudGltZS5fZ2V0RXh0ZW5zaW9uQ29udHJvbGxlcihvQ29udHJvbGxlcik7XG5cblx0XHQvLyBUT0RPOiBjdXJyZW50bHkgd2UgaGF2ZSB1bmRlZmluZWQgYW5kIHRydWUuLi4gYW5kIG91ciBjcmVhdGlvbiByb3cgaW1wbGVtZW50YXRpb24gcmVsaWVzIG9uIHRoaXMuXG5cdFx0Ly8gSSB3b3VsZCBtb3ZlIHRoaXMgbG9naWMgdG8gdGhpcyBwbGFjZSBhcyBpdCdzIGhhcmQgdG8gdW5kZXJzdGFuZCBmb3IgZmllbGQgY29uc3VtZXJcblx0XHRwVmFsdWVSZXNvbHZlZFxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQvLyBUaGUgZXZlbnQgaXMgZ29uZS4gRm9yIG5vdyB3ZSdsbCBqdXN0IHJlY3JlYXRlIGl0IGFnYWluXG5cdFx0XHRcdChvRXZlbnQgYXMgYW55KS5vU291cmNlID0gb1NvdXJjZTtcblx0XHRcdFx0KG9FdmVudCBhcyBhbnkpLm1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRcdHZhbGlkOiBiVmFsaWRcblx0XHRcdFx0fTtcblx0XHRcdFx0KEZpZWxkQVBJIGFzIGFueSkuaGFuZGxlQ2hhbmdlKG9FdmVudCwgb0NvbnRyb2xsZXIpO1xuXHRcdFx0XHRpZiAoIWJJc1RyYW5zaWVudCkge1xuXHRcdFx0XHRcdC8vIHRyaWdnZXIgc2lkZSBlZmZlY3RzIHdpdGhvdXQgcmVnaXN0ZXJpbmcgZGVmZXJyZWQgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdFx0Ly8gZGVmZXJyZWQgc2lkZSBlZmZlY3RzIGFyZSBhbHJlYWR5IHJlZ2lzdGVyZWQgYnkgcHJlcGFyZURlZmVycmVkU2lkZUVmZmVjdHNGb3JGaWVsZCBiZWZvcmUgcFZhbHVlUmVzb2x2ZWQgaXMgcmVzb2x2ZWQuXG5cdFx0XHRcdFx0b0ZFQ29udHJvbGxlci5fc2lkZUVmZmVjdHMuaGFuZGxlRmllbGRDaGFuZ2Uob0V2ZW50LCBmaWVsZFZhbGlkaXR5LCBwVmFsdWVSZXNvbHZlZCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gUmVjb21tZW5kYXRpb25zXG5cdFx0XHRcdEZpZWxkUnVudGltZS5fZmV0Y2hSZWNvbW1lbmRhdGlvbnMoZmllbGQgYXMgRmllbGQsIG9Db250cm9sbGVyKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoLypvRXJyb3I6IGFueSovKSB7XG5cdFx0XHRcdC8vIFRoZSBldmVudCBpcyBnb25lLiBGb3Igbm93IHdlJ2xsIGp1c3QgcmVjcmVhdGUgaXQgYWdhaW5cblx0XHRcdFx0KG9FdmVudCBhcyBhbnkpLm9Tb3VyY2UgPSBvU291cmNlO1xuXHRcdFx0XHQob0V2ZW50IGFzIGFueSkubVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0dmFsaWQ6IGZhbHNlXG5cdFx0XHRcdH07XG5cdFx0XHRcdExvZy5kZWJ1ZyhcIlByZXJlcXVpc2l0ZXMgb24gRmllbGQgZm9yIHRoZSBTaWRlRWZmZWN0cyBhbmQgUmVjb21tZW5kYXRpb25zIGhhdmUgYmVlbiByZWplY3RlZFwiKTtcblx0XHRcdFx0Ly8gYXMgdGhlIFVJIG1pZ2h0IG5lZWQgdG8gcmVhY3Qgb24uIFdlIGNvdWxkIHByb3ZpZGUgYSBwYXJhbWV0ZXIgdG8gaW5mb3JtIGlmIHZhbGlkYXRpb25cblx0XHRcdFx0Ly8gd2FzIHN1Y2Nlc3NmdWw/XG5cdFx0XHRcdChGaWVsZEFQSSBhcyBhbnkpLmhhbmRsZUNoYW5nZShvRXZlbnQsIG9Db250cm9sbGVyKTtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gRm9yIHRoZSBFZGl0RmxvdyBzeW5jaHJvbml6YXRpb24sIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgUEFUQ0ggcmVxdWVzdCB0byBiZSBzZW50LCBvdGhlcndpc2UgdGhlcmUgY291bGQgYmUgZS5nLiBhY3Rpb24gaW52b2tlZCBpbiBwYXJhbGxlbCB3aXRoIHRoZSBQQVRDSCByZXF1ZXN0LlxuXHRcdC8vIFRoaXMgaXMgZG9uZSB3aXRoIGEgMC10aW1lb3V0LCB0byBhbGxvdyBmb3IgdGhlICdwYXRjaFNlbnQnIGV2ZW50IHRvIGJlIHNlbnQgYnkgdGhlIGJpbmRpbmcgKHRoZW4gdGhlIGludGVybmFsIGVkaXQgZmxvdyBzeW5jaHJvbml6YXRpb24ga2lja3MgaW4gd2l0aCBFZGl0Rmxvdy5oYW5kbGVQYXRjaFNlbnQpLlxuXHRcdGNvbnN0IHZhbHVlUmVzb2x2ZWRBbmRQYXRjaFNlbnQgPSBwVmFsdWVSZXNvbHZlZFxuXHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KHJlc29sdmUsIDApO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKCkgPT4ge30pO1xuXHRcdG9GRUNvbnRyb2xsZXI/LmVkaXRGbG93LnN5bmNUYXNrKHZhbHVlUmVzb2x2ZWRBbmRQYXRjaFNlbnQpO1xuXG5cdFx0Ly8gaWYgdGhlIGNvbnRleHQgaXMgdHJhbnNpZW50LCBpdCBtZWFucyB0aGUgcmVxdWVzdCB3b3VsZCBmYWlsIGFueXdheSBhcyB0aGUgcmVjb3JkIGRvZXMgbm90IGV4aXN0IGluIHJlYWxpdHlcblx0XHQvLyBUT0RPOiBzaG91bGQgdGhlIHJlcXVlc3QgYmUgbWFkZSBpbiBmdXR1cmUgaWYgdGhlIGNvbnRleHQgaXMgdHJhbnNpZW50P1xuXHRcdGlmIChiSXNUcmFuc2llbnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRvRkVDb250cm9sbGVyLl9zaWRlRWZmZWN0cy5wcmVwYXJlRGVmZXJyZWRTaWRlRWZmZWN0c0ZvckZpZWxkKG9FdmVudCwgZmllbGRWYWxpZGl0eSwgcFZhbHVlUmVzb2x2ZWQpO1xuXHRcdC8vIENvbGxhYm9yYXRpb24gRHJhZnQgQWN0aXZpdHkgU3luY1xuXHRcdGNvbnN0IGJDb2xsYWJvcmF0aW9uRW5hYmxlZCA9IENvbGxhYm9yYXRpb25BY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQoZmllbGQpO1xuXG5cdFx0aWYgKGJDb2xsYWJvcmF0aW9uRW5hYmxlZCAmJiBmaWVsZFZhbGlkaXR5KSB7XG5cdFx0XHRjb25zdCBiaW5kaW5nID0gZ2V0Q29sbGFib3JhdGlvbkJpbmRpbmcoZmllbGQpO1xuXG5cdFx0XHRjb25zdCBkYXRhID0gW1xuXHRcdFx0XHQuLi4oKGZpZWxkLmdldEJpbmRpbmdJbmZvKFwidmFsdWVcIikgfHwgZmllbGQuZ2V0QmluZGluZ0luZm8oXCJzZWxlY3RlZFwiKSk/LnBhcnRzIHx8IFtdKSxcblx0XHRcdFx0Li4uKGZpZWxkLmdldEJpbmRpbmdJbmZvKFwiYWRkaXRpb25hbFZhbHVlXCIpPy5wYXJ0cyB8fCBbXSlcblx0XHRcdF1cblx0XHRcdFx0LmZpbHRlcigocGFydCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBwYXJ0Py5wYXRoICE9PSB1bmRlZmluZWQgJiYgcGFydC5wYXRoLmluZGV4T2YoXCJAQFwiKSA8IDA7IC8vIFJlbW92ZSBiaW5kaW5nIHBhcnRzIHdpdGggQEAgdGhhdCBtYWtlIG5vIHNlbnNlIGZvciBjb2xsYWJvcmF0aW9uIG1lc3NhZ2VzXG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5tYXAoZnVuY3Rpb24gKHBhcnQ6IHsgcGF0aDogc3RyaW5nIH0pIHtcblx0XHRcdFx0XHRyZXR1cm4gYCR7ZmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpfS8ke3BhcnQucGF0aH1gO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0Ly8gRnJvbSB0aGlzIHBvaW50LCB3ZSB3aWxsIGFsd2F5cyBzZW5kIGEgY29sbGFib3JhdGlvbiBtZXNzYWdlIChVTkxPQ0sgb3IgQ0hBTkdFKSwgc28gd2UgcmV0YWluXG5cdFx0XHQvLyBhIHBvdGVudGlhbCBVTkxPQ0sgdGhhdCB3b3VsZCBiZSBzZW50IGluIGhhbmRsZUZvY3VzT3V0LCB0byBtYWtlIHN1cmUgaXQncyBzZW50IGFmdGVyIHRoZSBDSEFOR0UgbWVzc2FnZVxuXHRcdFx0Q29sbGFib3JhdGlvbkFjdGl2aXR5U3luYy5yZXRhaW5Bc3luY01lc3NhZ2VzKGZpZWxkLCBkYXRhKTtcblxuXHRcdFx0Y29uc3QgdXBkYXRlQ29sbGFib3JhdGlvbiA9ICgpID0+IHtcblx0XHRcdFx0aWYgKGJpbmRpbmcuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdC8vIFRoZSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGJ5IHRoZSB1c2VyIC0tPiB3YWl0IHVudGlsIGl0J3Mgc2VudCB0byB0aGUgc2VydmVyIGJlZm9yZSBzZW5kaW5nIGEgbm90aWZpY2F0aW9uIHRvIG90aGVyIHVzZXJzXG5cdFx0XHRcdFx0YmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLnNlbmQoZmllbGQsIHsgYWN0aW9uOiBBY3Rpdml0eS5DaGFuZ2UsIGNvbnRlbnQ6IGRhdGEgfSk7XG5cdFx0XHRcdFx0XHRDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLnJlbGVhc2VBc3luY01lc3NhZ2VzKGZpZWxkLCBkYXRhKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLnJlbGVhc2VBc3luY01lc3NhZ2VzKGZpZWxkLCBkYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGlmIChvU291cmNlRmllbGQuaXNBKFwic2FwLnVpLm1kYy5GaWVsZFwiKSkge1xuXHRcdFx0XHRwVmFsdWVSZXNvbHZlZFxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdHVwZGF0ZUNvbGxhYm9yYXRpb24oKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdFx0XHR1cGRhdGVDb2xsYWJvcmF0aW9uKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR1cGRhdGVDb2xsYWJvcmF0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGVyIGZvciB0aGUgbGl2ZSBjaGFuZ2UgZXZlbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBoYW5kbGVMaXZlQ2hhbmdlXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgb2JqZWN0IHBhc3NlZCBieSB0aGUgY2hhbmdlIGV2ZW50XG5cdCAqL1xuXHRoYW5kbGVMaXZlQ2hhbmdlOiBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG5cdFx0KEZpZWxkQVBJIGFzIEZpZWxkQVBJVHlwZSkuaGFuZGxlTGl2ZUNoYW5nZShldmVudCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBzZW5kIGNvbGxhYm9yYXRpb24gbWVzc2FnZXMgZnJvbSBhIEZpbGVVcGxvYWRlci5cblx0ICpcblx0ICogQHBhcmFtIGZpbGVVcGxvYWRlclxuXHQgKiBAcGFyYW0gYWN0aW9uXG5cdCAqL1xuXHRfc2VuZENvbGxhYm9yYXRpb25NZXNzYWdlRm9yRmlsZVVwbG9hZGVyKGZpbGVVcGxvYWRlcjogRmlsZVVwbG9hZGVyLCBhY3Rpb246IEFjdGl2aXR5KTogdm9pZCB7XG5cdFx0aWYgKENvbGxhYm9yYXRpb25BY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQoZmlsZVVwbG9hZGVyKSkge1xuXHRcdFx0Y29uc3QgYmluZGluZ1BhdGggPSBmaWxlVXBsb2FkZXIuZ2V0UGFyZW50KCk/LmdldFByb3BlcnR5KFwicHJvcGVydHlQYXRoXCIpO1xuXHRcdFx0Y29uc3QgZnVsbFBhdGggPSBgJHtmaWxlVXBsb2FkZXIuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpfS8ke2JpbmRpbmdQYXRofWA7XG5cdFx0XHRDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLnNlbmQoZmlsZVVwbG9hZGVyLCB7IGFjdGlvbiwgY29udGVudDogZnVsbFBhdGggfSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGVyIHdoZW4gYSBGaWxlVXBsb2FkIGRpYWxvZyBpcyBvcGVuZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudFxuXHQgKi9cblx0aGFuZGxlT3BlblVwbG9hZGVyOiBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG5cdFx0Y29uc3QgZmlsZVVwbG9hZGVyID0gZXZlbnQuZ2V0U291cmNlKCkgYXMgRmlsZVVwbG9hZGVyO1xuXHRcdEZpZWxkUnVudGltZS5fc2VuZENvbGxhYm9yYXRpb25NZXNzYWdlRm9yRmlsZVVwbG9hZGVyKGZpbGVVcGxvYWRlciwgQWN0aXZpdHkuTG9jayk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEhhbmRsZXIgd2hlbiBhIEZpbGVVcGxvYWQgZGlhbG9nIGlzIGNsb3NlZC5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50XG5cdCAqL1xuXHRoYW5kbGVDbG9zZVVwbG9hZGVyOiBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG5cdFx0Y29uc3QgZmlsZVVwbG9hZGVyID0gZXZlbnQuZ2V0U291cmNlKCkgYXMgRmlsZVVwbG9hZGVyO1xuXHRcdEZpZWxkUnVudGltZS5fc2VuZENvbGxhYm9yYXRpb25NZXNzYWdlRm9yRmlsZVVwbG9hZGVyKGZpbGVVcGxvYWRlciwgQWN0aXZpdHkuVW5sb2NrKTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0cyB0aGUgZmllbGQgdmFsdWUgYW5kIHZhbGlkaXR5IG9uIGEgY2hhbmdlIGV2ZW50LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZmllbGRWYWxpZGl0eU9uQ2hhbmdlXG5cdCAqIEBwYXJhbSBvRXZlbnQgVGhlIGV2ZW50IG9iamVjdCBwYXNzZWQgYnkgdGhlIGNoYW5nZSBldmVudFxuXHQgKiBAcmV0dXJucyBGaWVsZCB2YWx1ZSBhbmQgdmFsaWRpdHlcblx0ICovXG5cdGdldEZpZWxkU3RhdGVPbkNoYW5nZTogZnVuY3Rpb24gKG9FdmVudDogRmllbGQkQ2hhbmdlRXZlbnQgJiBFdmVudDx7IGlzVmFsaWQ6IGJvb2xlYW4gfT4pOiB7XG5cdFx0ZmllbGQ6IEZpZWxkO1xuXHRcdHN0YXRlOiB7XG5cdFx0XHRmaWVsZFZhbHVlPzogdW5rbm93bjtcblx0XHRcdHZhbGlkaXR5PzogYm9vbGVhbjtcblx0XHR9O1xuXHR9IHtcblx0XHRsZXQgb1NvdXJjZUZpZWxkID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIGFueSxcblx0XHRcdG1GaWVsZFN0YXRlOiB7XG5cdFx0XHRcdGZpZWxkVmFsdWU/OiB1bmtub3duO1xuXHRcdFx0XHR2YWxpZGl0eT86IGJvb2xlYW47XG5cdFx0XHR9ID0ge307XG5cdFx0Y29uc3QgX2lzQmluZGluZ1N0YXRlTWVzc2FnZXMgPSBmdW5jdGlvbiAob0JpbmRpbmc6IGFueSkge1xuXHRcdFx0cmV0dXJuIG9CaW5kaW5nICYmIG9CaW5kaW5nLmdldERhdGFTdGF0ZSgpID8gb0JpbmRpbmcuZ2V0RGF0YVN0YXRlKCkuZ2V0SW52YWxpZFZhbHVlKCkgPT09IHVuZGVmaW5lZCA6IHRydWU7XG5cdFx0fTtcblx0XHRpZiAob1NvdXJjZUZpZWxkLmlzQShcInNhcC5mZS5tYWNyb3MuZmllbGQuRmllbGRBUElcIikpIHtcblx0XHRcdG9Tb3VyY2VGaWVsZCA9IChvU291cmNlRmllbGQgYXMgRW5oYW5jZVdpdGhVSTU8RmllbGRBUEk+KS5nZXRDb250ZW50KCk7XG5cdFx0fVxuXG5cdFx0aWYgKG9Tb3VyY2VGaWVsZC5pc0EoRmllbGRXcmFwcGVyLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpKSAmJiBvU291cmNlRmllbGQuZ2V0RWRpdE1vZGUoKSA9PT0gXCJFZGl0YWJsZVwiKSB7XG5cdFx0XHRvU291cmNlRmllbGQgPSBvU291cmNlRmllbGQuZ2V0Q29udGVudEVkaXQoKVswXTtcblx0XHR9XG5cblx0XHRpZiAob1NvdXJjZUZpZWxkLmlzQShcInNhcC51aS5tZGMuRmllbGRcIikpIHtcblx0XHRcdGxldCBiSXNWYWxpZCA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJ2YWxpZFwiKSB8fCBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaXNWYWxpZFwiKTtcblx0XHRcdGlmIChiSXNWYWxpZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmIChvU291cmNlRmllbGQuZ2V0TWF4Q29uZGl0aW9ucygpID09PSAxKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1ZhbHVlQmluZGluZ0luZm8gPSBvU291cmNlRmllbGQuZ2V0QmluZGluZ0luZm8oXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRiSXNWYWxpZCA9IF9pc0JpbmRpbmdTdGF0ZU1lc3NhZ2VzKG9WYWx1ZUJpbmRpbmdJbmZvICYmIG9WYWx1ZUJpbmRpbmdJbmZvLmJpbmRpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvU291cmNlRmllbGQuZ2V0VmFsdWUoKSA9PT0gXCJcIiAmJiAhb1NvdXJjZUZpZWxkLmdldFByb3BlcnR5KFwicmVxdWlyZWRcIikpIHtcblx0XHRcdFx0XHRiSXNWYWxpZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG1GaWVsZFN0YXRlID0ge1xuXHRcdFx0XHRmaWVsZFZhbHVlOiBvU291cmNlRmllbGQuZ2V0VmFsdWUoKSxcblx0XHRcdFx0dmFsaWRpdHk6ICEhYklzVmFsaWRcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIG9Tb3VyY2VGaWVsZCBleHRlbmRzIGZyb20gYSBGaWxlVXBsb2FkZXIgfHwgSW5wdXQgfHwgaXMgYSBDaGVja0JveFxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPVxuXHRcdFx0XHRvU291cmNlRmllbGQuZ2V0QmluZGluZyhcInVwbG9hZFVybFwiKSB8fCBvU291cmNlRmllbGQuZ2V0QmluZGluZyhcInZhbHVlXCIpIHx8IG9Tb3VyY2VGaWVsZC5nZXRCaW5kaW5nKFwic2VsZWN0ZWRcIik7XG5cdFx0XHRtRmllbGRTdGF0ZSA9IHtcblx0XHRcdFx0ZmllbGRWYWx1ZTogb0JpbmRpbmcgJiYgb0JpbmRpbmcuZ2V0VmFsdWUoKSxcblx0XHRcdFx0dmFsaWRpdHk6IF9pc0JpbmRpbmdTdGF0ZU1lc3NhZ2VzKG9CaW5kaW5nKVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdGZpZWxkOiBvU291cmNlRmllbGQsXG5cdFx0XHRzdGF0ZTogbUZpZWxkU3RhdGVcblx0XHR9O1xuXHR9LFxuXHRfZm5GaXhIYXNoUXVlcnlTdHJpbmc6IGZ1bmN0aW9uIChzQ3VycmVudEhhc2g6IGFueSkge1xuXHRcdGlmIChzQ3VycmVudEhhc2ggJiYgc0N1cnJlbnRIYXNoLmluZGV4T2YoXCI/XCIpICE9PSAtMSkge1xuXHRcdFx0Ly8gc0N1cnJlbnRIYXNoIGNhbiBjb250YWluIHF1ZXJ5IHN0cmluZywgY3V0IGl0IG9mZiFcblx0XHRcdHNDdXJyZW50SGFzaCA9IHNDdXJyZW50SGFzaC5zcGxpdChcIj9cIilbMF07XG5cdFx0fVxuXHRcdHJldHVybiBzQ3VycmVudEhhc2g7XG5cdH0sXG5cdF9mbkdldExpbmtJbmZvcm1hdGlvbjogZnVuY3Rpb24gKF9vU291cmNlOiBhbnksIF9vTGluazogYW55LCBfc1Byb3BlcnR5UGF0aDogYW55LCBfc1ZhbHVlOiBhbnksIGZuU2V0QWN0aXZlOiBhbnkpIHtcblx0XHRjb25zdCBvTW9kZWwgPSBfb0xpbmsgJiYgX29MaW5rLmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbCAmJiBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgc1NlbWFudGljT2JqZWN0TmFtZSA9IF9zVmFsdWUgfHwgKF9vU291cmNlICYmIF9vU291cmNlLmdldFZhbHVlKCkpO1xuXHRcdGNvbnN0IG9WaWV3ID0gX29MaW5rICYmIENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcoX29MaW5rKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldyAmJiBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBvVmlldyAmJiBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdGNvbnN0IG9TaGVsbFNlcnZpY2VIZWxwZXIgPSBvQXBwQ29tcG9uZW50ICYmIG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdGNvbnN0IHBHZXRMaW5rc1Byb21pc2UgPSBvU2hlbGxTZXJ2aWNlSGVscGVyICYmIG9TaGVsbFNlcnZpY2VIZWxwZXIuZ2V0TGlua3NXaXRoQ2FjaGUoW1t7IHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3ROYW1lIH1dXSk7XG5cdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zID1cblx0XHRcdG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7X3NQcm9wZXJ0eVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9uc2ApO1xuXHRcdHJldHVybiB7XG5cdFx0XHRTZW1hbnRpY09iamVjdE5hbWU6IHNTZW1hbnRpY09iamVjdE5hbWUsXG5cdFx0XHRTZW1hbnRpY09iamVjdEZ1bGxQYXRoOiBfc1Byb3BlcnR5UGF0aCwgLy9zU2VtYW50aWNPYmplY3RGdWxsUGF0aCxcblx0XHRcdE1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdEludGVybmFsTW9kZWxDb250ZXh0OiBvSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRTaGVsbFNlcnZpY2VIZWxwZXI6IG9TaGVsbFNlcnZpY2VIZWxwZXIsXG5cdFx0XHRHZXRMaW5rc1Byb21pc2U6IHBHZXRMaW5rc1Byb21pc2UsXG5cdFx0XHRTZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9uczogYVNlbWFudGljT2JqZWN0VW5hdmFpbGFibGVBY3Rpb25zLFxuXHRcdFx0Zm5TZXRBY3RpdmU6IGZuU2V0QWN0aXZlXG5cdFx0fTtcblx0fSxcblx0X2ZuUXVpY2tWaWV3SGFzTmV3Q29uZGl0aW9uOiBmdW5jdGlvbiAob1NlbWFudGljT2JqZWN0UGF5bG9hZDogYW55LCBfb0xpbmtJbmZvOiBhbnkpIHtcblx0XHRpZiAob1NlbWFudGljT2JqZWN0UGF5bG9hZCAmJiBvU2VtYW50aWNPYmplY3RQYXlsb2FkLnBhdGggJiYgb1NlbWFudGljT2JqZWN0UGF5bG9hZC5wYXRoID09PSBfb0xpbmtJbmZvLlNlbWFudGljT2JqZWN0RnVsbFBhdGgpIHtcblx0XHRcdC8vIEdvdCB0aGUgcmVzb2x2ZWQgU2VtYW50aWMgT2JqZWN0IVxuXHRcdFx0Y29uc3QgYlJlc3VsdGluZ05ld0NvbmRpdGlvbkZvckNvbmRpdGlvbmFsV3JhcHBlciA9XG5cdFx0XHRcdG9TZW1hbnRpY09iamVjdFBheWxvYWRbIV9vTGlua0luZm8uU2VtYW50aWNPYmplY3RVbmF2YWlsYWJsZUFjdGlvbnMgPyBcIkhhc1RhcmdldHNOb3RGaWx0ZXJlZFwiIDogXCJIYXNUYXJnZXRzXCJdO1xuXHRcdFx0X29MaW5rSW5mby5mblNldEFjdGl2ZSghIWJSZXN1bHRpbmdOZXdDb25kaXRpb25Gb3JDb25kaXRpb25hbFdyYXBwZXIpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0sXG5cdF9mblF1aWNrVmlld1NldE5ld0NvbmRpdGlvbkZvckNvbmRpdGlvbmFsV3JhcHBlcjogZnVuY3Rpb24gKF9vTGlua0luZm86IGFueSwgX29GaW5hbFNlbWFudGljT2JqZWN0czogYW55KSB7XG5cdFx0aWYgKF9vRmluYWxTZW1hbnRpY09iamVjdHNbX29MaW5rSW5mby5TZW1hbnRpY09iamVjdE5hbWVdKSB7XG5cdFx0XHRsZXQgc1RtcFBhdGgsIG9TZW1hbnRpY09iamVjdFBheWxvYWQ7XG5cdFx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RQYXRocyA9IE9iamVjdC5rZXlzKF9vRmluYWxTZW1hbnRpY09iamVjdHNbX29MaW5rSW5mby5TZW1hbnRpY09iamVjdE5hbWVdKTtcblx0XHRcdGZvciAoY29uc3QgaVBhdGhzQ291bnQgaW4gYVNlbWFudGljT2JqZWN0UGF0aHMpIHtcblx0XHRcdFx0c1RtcFBhdGggPSBhU2VtYW50aWNPYmplY3RQYXRoc1tpUGF0aHNDb3VudF07XG5cdFx0XHRcdG9TZW1hbnRpY09iamVjdFBheWxvYWQgPVxuXHRcdFx0XHRcdF9vRmluYWxTZW1hbnRpY09iamVjdHNbX29MaW5rSW5mby5TZW1hbnRpY09iamVjdE5hbWVdICYmXG5cdFx0XHRcdFx0X29GaW5hbFNlbWFudGljT2JqZWN0c1tfb0xpbmtJbmZvLlNlbWFudGljT2JqZWN0TmFtZV1bc1RtcFBhdGhdO1xuXHRcdFx0XHRpZiAoRmllbGRSdW50aW1lLl9mblF1aWNrVmlld0hhc05ld0NvbmRpdGlvbihvU2VtYW50aWNPYmplY3RQYXlsb2FkLCBfb0xpbmtJbmZvKSkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRfZm5VcGRhdGVTZW1hbnRpY09iamVjdHNUYXJnZXRNb2RlbDogZnVuY3Rpb24gKG9FdmVudDogYW55LCBzVmFsdWU6IGFueSwgb0NvbnRyb2w6IGFueSwgX3NQcm9wZXJ0eVBhdGg6IGFueSkge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSBvRXZlbnQgJiYgb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGxldCBmblNldEFjdGl2ZTtcblx0XHRpZiAob0NvbnRyb2wuaXNBKFwic2FwLm0uT2JqZWN0U3RhdHVzXCIpKSB7XG5cdFx0XHRmblNldEFjdGl2ZSA9IChiQWN0aXZlOiBib29sZWFuKSA9PiBvQ29udHJvbC5zZXRBY3RpdmUoYkFjdGl2ZSk7XG5cdFx0fVxuXHRcdGlmIChvQ29udHJvbC5pc0EoXCJzYXAubS5PYmplY3RJZGVudGlmaWVyXCIpKSB7XG5cdFx0XHRmblNldEFjdGl2ZSA9IChiQWN0aXZlOiBib29sZWFuKSA9PiBvQ29udHJvbC5zZXRUaXRsZUFjdGl2ZShiQWN0aXZlKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0NvbmRpdGlvbmFsV3JhcHBlciA9IG9Db250cm9sICYmIG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdGlmIChvQ29uZGl0aW9uYWxXcmFwcGVyICYmIG9Db25kaXRpb25hbFdyYXBwZXIuaXNBKFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5Db25kaXRpb25hbFdyYXBwZXJcIikpIHtcblx0XHRcdGZuU2V0QWN0aXZlID0gKGJBY3RpdmU6IGJvb2xlYW4pID0+IG9Db25kaXRpb25hbFdyYXBwZXIuc2V0Q29uZGl0aW9uKGJBY3RpdmUpO1xuXHRcdH1cblx0XHRpZiAoZm5TZXRBY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3Qgb0xpbmtJbmZvID0gRmllbGRSdW50aW1lLl9mbkdldExpbmtJbmZvcm1hdGlvbihvU291cmNlLCBvQ29udHJvbCwgX3NQcm9wZXJ0eVBhdGgsIHNWYWx1ZSwgZm5TZXRBY3RpdmUpO1xuXHRcdFx0b0xpbmtJbmZvLmZuU2V0QWN0aXZlID0gZm5TZXRBY3RpdmU7XG5cdFx0XHRjb25zdCBzQ3VycmVudEhhc2ggPSBGaWVsZFJ1bnRpbWUuX2ZuRml4SGFzaFF1ZXJ5U3RyaW5nKENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvQ29udHJvbCkuZ2V0U2hlbGxTZXJ2aWNlcygpLmdldEhhc2goKSk7XG5cdFx0XHRDb21tb25VdGlscy51cGRhdGVTZW1hbnRpY1RhcmdldHMoXG5cdFx0XHRcdFtvTGlua0luZm8uR2V0TGlua3NQcm9taXNlXSxcblx0XHRcdFx0W3sgc2VtYW50aWNPYmplY3Q6IG9MaW5rSW5mby5TZW1hbnRpY09iamVjdE5hbWUsIHBhdGg6IG9MaW5rSW5mby5TZW1hbnRpY09iamVjdEZ1bGxQYXRoIH1dLFxuXHRcdFx0XHRvTGlua0luZm8uSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdHNDdXJyZW50SGFzaFxuXHRcdFx0KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0ZpbmFsU2VtYW50aWNPYmplY3RzOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAob0ZpbmFsU2VtYW50aWNPYmplY3RzKSB7XG5cdFx0XHRcdFx0XHRGaWVsZFJ1bnRpbWUuX2ZuUXVpY2tWaWV3U2V0TmV3Q29uZGl0aW9uRm9yQ29uZGl0aW9uYWxXcmFwcGVyKG9MaW5rSW5mbywgb0ZpbmFsU2VtYW50aWNPYmplY3RzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHVwZGF0ZSBTZW1hbnRpYyBUYXJnZXRzIG1vZGVsXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblx0X2NoZWNrQ29udHJvbEhhc01vZGVsQW5kQmluZGluZ0NvbnRleHQoX2NvbnRyb2w6IENvbnRyb2wpIHtcblx0XHRpZiAoIV9jb250cm9sLmdldE1vZGVsKCkgfHwgIV9jb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9LFxuXHRfY2hlY2tDdXN0b21EYXRhVmFsdWVCZWZvcmVVcGRhdGluZ1NlbWFudGljT2JqZWN0TW9kZWwoX2NvbnRyb2w6IENvbnRyb2wsIHByb3BlcnR5UGF0aDogc3RyaW5nLCBhQ3VzdG9tRGF0YTogQ3VzdG9tRGF0YVtdKTogdm9pZCB7XG5cdFx0bGV0IHNTZW1hbnRpY09iamVjdFBhdGhWYWx1ZTogYW55O1xuXHRcdGxldCBvVmFsdWVCaW5kaW5nO1xuXHRcdGNvbnN0IF9mbkN1c3RvbURhdGFWYWx1ZUlzU3RyaW5nID0gZnVuY3Rpb24gKHNlbWFudGljT2JqZWN0UGF0aFZhbHVlOiBhbnkpIHtcblx0XHRcdHJldHVybiAhKHNlbWFudGljT2JqZWN0UGF0aFZhbHVlICE9PSBudWxsICYmIHR5cGVvZiBzZW1hbnRpY09iamVjdFBhdGhWYWx1ZSA9PT0gXCJvYmplY3RcIik7XG5cdFx0fTtcblx0XHQvLyByZW1vdmUgdGVjaG5pY2FsIGN1c3RvbSBkYXRhcyBzZXQgYnkgVUk1XG5cdFx0YUN1c3RvbURhdGEgPSBhQ3VzdG9tRGF0YS5maWx0ZXIoKGN1c3RvbURhdGEpID0+IGN1c3RvbURhdGEuZ2V0S2V5KCkgIT09IFwic2FwLXVpLWN1c3RvbS1zZXR0aW5nc1wiKTtcblx0XHRmb3IgKGNvbnN0IGluZGV4IGluIGFDdXN0b21EYXRhKSB7XG5cdFx0XHRzU2VtYW50aWNPYmplY3RQYXRoVmFsdWUgPSBhQ3VzdG9tRGF0YVtpbmRleF0uZ2V0VmFsdWUoKTtcblx0XHRcdGlmICghc1NlbWFudGljT2JqZWN0UGF0aFZhbHVlICYmIF9mbkN1c3RvbURhdGFWYWx1ZUlzU3RyaW5nKHNTZW1hbnRpY09iamVjdFBhdGhWYWx1ZSkpIHtcblx0XHRcdFx0b1ZhbHVlQmluZGluZyA9IGFDdXN0b21EYXRhW2luZGV4XS5nZXRCaW5kaW5nKFwidmFsdWVcIik7XG5cdFx0XHRcdGlmIChvVmFsdWVCaW5kaW5nKSB7XG5cdFx0XHRcdFx0b1ZhbHVlQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKF9vQ2hhbmdlRXZlbnQ6IGFueSkge1xuXHRcdFx0XHRcdFx0RmllbGRSdW50aW1lLl9mblVwZGF0ZVNlbWFudGljT2JqZWN0c1RhcmdldE1vZGVsKF9vQ2hhbmdlRXZlbnQsIG51bGwsIF9jb250cm9sLCBwcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKF9mbkN1c3RvbURhdGFWYWx1ZUlzU3RyaW5nKHNTZW1hbnRpY09iamVjdFBhdGhWYWx1ZSkpIHtcblx0XHRcdFx0RmllbGRSdW50aW1lLl9mblVwZGF0ZVNlbWFudGljT2JqZWN0c1RhcmdldE1vZGVsKG51bGwsIHNTZW1hbnRpY09iamVjdFBhdGhWYWx1ZSwgX2NvbnRyb2wsIHByb3BlcnR5UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRMaW5rTW9kZWxDb250ZXh0Q2hhbmdlOiBmdW5jdGlvbiAob0V2ZW50OiBhbnksIHNQcm9wZXJ0eTogYW55LCBzUGF0aFRvUHJvcGVydHk6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRyb2wgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0aWYgKEZpZWxkUnVudGltZS5fY2hlY2tDb250cm9sSGFzTW9kZWxBbmRCaW5kaW5nQ29udGV4dChjb250cm9sKSkge1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aCA9IGAke3NQYXRoVG9Qcm9wZXJ0eX0vJHtzUHJvcGVydHl9YDtcblx0XHRcdGNvbnN0IG1kY0xpbmsgPSBjb250cm9sLmdldERlcGVuZGVudHMoKS5sZW5ndGggPyBjb250cm9sLmdldERlcGVuZGVudHMoKVswXSA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGFDdXN0b21EYXRhID0gbWRjTGluaz8uZ2V0Q3VzdG9tRGF0YSgpO1xuXHRcdFx0aWYgKGFDdXN0b21EYXRhICYmIGFDdXN0b21EYXRhLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0RmllbGRSdW50aW1lLl9jaGVja0N1c3RvbURhdGFWYWx1ZUJlZm9yZVVwZGF0aW5nU2VtYW50aWNPYmplY3RNb2RlbChjb250cm9sLCBzUHJvcGVydHlQYXRoLCBhQ3VzdG9tRGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRvcGVuRXh0ZXJuYWxMaW5rOiBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3Qgc291cmNlID0gZXZlbnQuZ2V0U291cmNlKCkgYXMgYW55O1xuXHRcdGlmIChzb3VyY2UuZGF0YShcInVybFwiKSAmJiBzb3VyY2UuZ2V0UHJvcGVydHkoXCJ0ZXh0XCIpICE9PSBcIlwiKSB7XG5cdFx0XHQvLyBUaGlzIG9wZW5zIHRoZSBsaW5rIGluIHRoZSBzYW1lIHRhYiBhcyB0aGUgbGluay4gSXQgd2FzIGRvbmUgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgdHlwZSBvZiBsaW5rcy5cblx0XHRcdG9wZW5XaW5kb3coc291cmNlLmRhdGEoXCJ1cmxcIiksIFwiX3NlbGZcIik7XG5cdFx0fVxuXHR9LFxuXHRjcmVhdGVQb3BvdmVyV2l0aE5vVGFyZ2V0czogZnVuY3Rpb24gKG1kY0xpbms6IE1kY0xpbmspIHtcblx0XHRjb25zdCBtZGNMaW5rSWQgPSBtZGNMaW5rLmdldElkKCk7XG5cdFx0Y29uc3QgaWxsdXN0cmF0ZWRNZXNzYWdlU2V0dGluZ3M6ICRJbGx1c3RyYXRlZE1lc3NhZ2VTZXR0aW5ncyA9IHtcblx0XHRcdHRpdGxlOiBnZXRSZXNvdXJjZU1vZGVsKG1kY0xpbmsgYXMgdW5rbm93biBhcyBDb250cm9sKS5nZXRUZXh0KFwiTV9JTExVU1RSQVRFRE1FU1NBR0VfVElUTEVcIiksXG5cdFx0XHRkZXNjcmlwdGlvbjogZ2V0UmVzb3VyY2VNb2RlbChtZGNMaW5rIGFzIHVua25vd24gYXMgQ29udHJvbCkuZ2V0VGV4dChcIk1fSUxMVVNUUkFURURNRVNTQUdFX0RFU0NSSVBUSU9OXCIpLFxuXHRcdFx0ZW5hYmxlRm9ybWF0dGVkVGV4dDogdHJ1ZSxcblx0XHRcdGlsbHVzdHJhdGlvblNpemU6IFwiRG90XCIsIC8vIElsbHVzdHJhdGVkTWVzc2FnZVNpemUuRG90IG5vdCBhdmFpbGFibGUgaW4gXCJAdHlwZXMvb3BlbnVpNVwiOiBcIjEuMTA3LjBcIlxuXHRcdFx0aWxsdXN0cmF0aW9uVHlwZTogSWxsdXN0cmF0ZWRNZXNzYWdlVHlwZS5UZW50XG5cdFx0fTtcblx0XHRjb25zdCBpbGx1c3RyYXRlZE1lc3NhZ2UgPSBuZXcgSWxsdXN0cmF0ZWRNZXNzYWdlKGAke21kY0xpbmtJZH0taWxsdXN0cmF0ZWRtZXNzYWdlYCwgaWxsdXN0cmF0ZWRNZXNzYWdlU2V0dGluZ3MpO1xuXHRcdGNvbnN0IHBvcG92ZXJTZXR0aW5nczogJFJlc3BvbnNpdmVQb3BvdmVyU2V0dGluZ3MgPSB7XG5cdFx0XHRob3Jpem9udGFsU2Nyb2xsaW5nOiBmYWxzZSxcblx0XHRcdHNob3dIZWFkZXI6IERldmljZS5zeXN0ZW0ucGhvbmUsXG5cdFx0XHRwbGFjZW1lbnQ6IG1vYmlsZWxpYnJhcnkuUGxhY2VtZW50VHlwZS5BdXRvLFxuXHRcdFx0Y29udGVudDogW2lsbHVzdHJhdGVkTWVzc2FnZV0sXG5cdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0aWYgKGV2ZW50LmdldFNvdXJjZSgpKSB7XG5cdFx0XHRcdFx0ZXZlbnQuZ2V0U291cmNlKCkuZGVzdHJveSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRyZXR1cm4gbmV3IFJlc3BvbnNpdmVQb3BvdmVyKGAke21kY0xpbmtJZH0tcG9wb3ZlcmAsIHBvcG92ZXJTZXR0aW5ncyk7XG5cdH0sXG5cdG9wZW5MaW5rOiBhc3luYyBmdW5jdGlvbiAobWRjTGluazogTWRjTGluaywgc2FwbUxpbms6IExpbmspIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgaFJlZiA9IGF3YWl0IG1kY0xpbmsuZ2V0VHJpZ2dlckhyZWYoKTtcblx0XHRcdGlmICghaFJlZikge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGxpbmtJdGVtcyA9IGF3YWl0IG1kY0xpbmsucmV0cmlldmVMaW5rSXRlbXMoKTtcblx0XHRcdFx0XHRpZiAobGlua0l0ZW1zPy5sZW5ndGggPT09IDAgJiYgKG1kY0xpbmsgYXMgYW55KS5nZXRQYXlsb2FkKCkuaGFzUXVpY2tWaWV3RmFjZXRzID09PSBcImZhbHNlXCIpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHBvcG92ZXI6IFJlc3BvbnNpdmVQb3BvdmVyID0gRmllbGRSdW50aW1lLmNyZWF0ZVBvcG92ZXJXaXRoTm9UYXJnZXRzKG1kY0xpbmspO1xuXHRcdFx0XHRcdFx0bWRjTGluay5hZGREZXBlbmRlbnQocG9wb3Zlcik7XG5cdFx0XHRcdFx0XHRwb3BvdmVyLm9wZW5CeShzYXBtTGluayBhcyB1bmtub3duIGFzIENvbnRyb2wpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBtZGNMaW5rLm9wZW4oc2FwbUxpbmsgYXMgdW5rbm93biBhcyBDb250cm9sKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBDYW5ub3QgcmV0cmlldmUgdGhlIFF1aWNrVmlldyBQb3BvdmVyIGRpYWxvZzogJHtlcnJvcn1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgdmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcoc2FwbUxpbmspO1xuXHRcdFx0XHRjb25zdCBhcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodmlldyk7XG5cdFx0XHRcdGNvbnN0IHNoZWxsU2VydmljZSA9IGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdFx0XHRcdGNvbnN0IHNoZWxsSGFzaCA9IHNoZWxsU2VydmljZS5wYXJzZVNoZWxsSGFzaChoUmVmKTtcblx0XHRcdFx0Y29uc3QgbmF2QXJncyA9IHtcblx0XHRcdFx0XHR0YXJnZXQ6IHtcblx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBzaGVsbEhhc2guc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRhY3Rpb246IHNoZWxsSGFzaC5hY3Rpb25cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhcmFtczogc2hlbGxIYXNoLnBhcmFtc1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdEtlZXBBbGl2ZUhlbHBlci5zdG9yZUNvbnRyb2xSZWZyZXNoU3RyYXRlZ3lGb3JIYXNoKHZpZXcsIHNoZWxsSGFzaCk7XG5cblx0XHRcdFx0aWYgKENvbW1vblV0aWxzLmlzU3RpY2t5RWRpdE1vZGUoc2FwbUxpbmsgYXMgdW5rbm93biBhcyBDb250cm9sKSAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdC8vVVJMIHBhcmFtcyBhbmQgeGFwcFN0YXRlIGhhcyBiZWVuIGdlbmVyYXRlZCBlYXJsaWVyIGhlbmNlIHVzaW5nIHRvRXh0ZXJuYWxcblx0XHRcdFx0XHRzaGVsbFNlcnZpY2UudG9FeHRlcm5hbChuYXZBcmdzIGFzIGFueSwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV3SHJlZiA9IGF3YWl0IHNoZWxsU2VydmljZS5ocmVmRm9yRXh0ZXJuYWxBc3luYyhuYXZBcmdzLCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0b3BlbldpbmRvdyhuZXdIcmVmKTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBFcnJvciB3aGlsZSByZXRpcmV2aW5nIGhyZWZGb3JFeHRlcm5hbCA6ICR7ZXJyb3J9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihgRXJyb3IgdHJpZ2dlcmluZyBsaW5rIEhyZWY6ICR7ZXJyb3J9YCk7XG5cdFx0fVxuXHR9LFxuXHRwcmVzc0xpbms6IGFzeW5jIGZ1bmN0aW9uIChvRXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Tb3VyY2UgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3Qgc2FwbUxpbmsgPSBvU291cmNlLmlzQShcInNhcC5tLk9iamVjdElkZW50aWZpZXJcIilcblx0XHRcdD8gb1NvdXJjZS5maW5kRWxlbWVudHMoZmFsc2UsIChlbGVtOiBFbGVtZW50KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0uaXNBKFwic2FwLm0uTGlua1wiKTtcblx0XHRcdCAgfSlbMF1cblx0XHRcdDogb1NvdXJjZTtcblxuXHRcdGlmIChvU291cmNlLmdldERlcGVuZGVudHMoKSAmJiBvU291cmNlLmdldERlcGVuZGVudHMoKS5sZW5ndGggPiAwICYmIHNhcG1MaW5rLmdldFByb3BlcnR5KFwidGV4dFwiKSAhPT0gXCJcIikge1xuXHRcdFx0Y29uc3Qgb0ZpZWxkSW5mbyA9IG9Tb3VyY2UuZ2V0RGVwZW5kZW50cygpWzBdO1xuXHRcdFx0aWYgKG9GaWVsZEluZm8gJiYgb0ZpZWxkSW5mby5pc0EoXCJzYXAudWkubWRjLkxpbmtcIikpIHtcblx0XHRcdFx0YXdhaXQgRmllbGRSdW50aW1lLm9wZW5MaW5rKG9GaWVsZEluZm8sIHNhcG1MaW5rKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNhcG1MaW5rO1xuXHR9LFxuXHR1cGxvYWRTdHJlYW06IGZ1bmN0aW9uIChjb250cm9sbGVyOiBDb250cm9sbGVyLCBldmVudDogRXZlbnQpIHtcblx0XHRjb25zdCBmaWxlVXBsb2FkZXIgPSBldmVudC5nZXRTb3VyY2UoKSBhcyBGaWxlVXBsb2FkZXIsXG5cdFx0XHRGRUNvbnRyb2xsZXIgPSBGaWVsZFJ1bnRpbWUuX2dldEV4dGVuc2lvbkNvbnRyb2xsZXIoY29udHJvbGxlciksXG5cdFx0XHRmaWxlV3JhcHBlciA9IGZpbGVVcGxvYWRlci5nZXRQYXJlbnQoKSBhcyB1bmtub3duIGFzIEZpbGVXcmFwcGVyLFxuXHRcdFx0dXBsb2FkVXJsID0gZmlsZVdyYXBwZXIuZ2V0VXBsb2FkVXJsKCk7XG5cblx0XHRpZiAodXBsb2FkVXJsICE9PSBcIlwiKSB7XG5cdFx0XHRmaWxlV3JhcHBlci5zZXRVSUJ1c3kodHJ1ZSk7XG5cblx0XHRcdC8vIHVzZSB1cGxvYWRVcmwgZnJvbSBGaWxlV3JhcHBlciB3aGljaCByZXR1cm5zIGEgY2Fub25pY2FsIFVSTFxuXHRcdFx0ZmlsZVVwbG9hZGVyLnNldFVwbG9hZFVybCh1cGxvYWRVcmwpO1xuXG5cdFx0XHRmaWxlVXBsb2FkZXIucmVtb3ZlQWxsSGVhZGVyUGFyYW1ldGVycygpO1xuXHRcdFx0Y29uc3QgdG9rZW4gPSAoZmlsZVVwbG9hZGVyLmdldE1vZGVsKCkgYXMgYW55KT8uZ2V0SHR0cEhlYWRlcnMoKVtcIlgtQ1NSRi1Ub2tlblwiXTtcblx0XHRcdGlmICh0b2tlbikge1xuXHRcdFx0XHRjb25zdCBoZWFkZXJQYXJhbWV0ZXJDU1JGVG9rZW4gPSBuZXcgRmlsZVVwbG9hZGVyUGFyYW1ldGVyKCk7XG5cdFx0XHRcdGhlYWRlclBhcmFtZXRlckNTUkZUb2tlbi5zZXROYW1lKFwieC1jc3JmLXRva2VuXCIpO1xuXHRcdFx0XHRoZWFkZXJQYXJhbWV0ZXJDU1JGVG9rZW4uc2V0VmFsdWUodG9rZW4pO1xuXHRcdFx0XHRmaWxlVXBsb2FkZXIuYWRkSGVhZGVyUGFyYW1ldGVyKGhlYWRlclBhcmFtZXRlckNTUkZUb2tlbik7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBlVGFnID0gKGZpbGVVcGxvYWRlci5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQgfCB1bmRlZmluZWQgfCBudWxsKT8uZ2V0UHJvcGVydHkoXCJAb2RhdGEuZXRhZ1wiKTtcblx0XHRcdGlmIChlVGFnKSB7XG5cdFx0XHRcdGNvbnN0IGhlYWRlclBhcmFtZXRlckVUYWcgPSBuZXcgRmlsZVVwbG9hZGVyUGFyYW1ldGVyKCk7XG5cdFx0XHRcdGhlYWRlclBhcmFtZXRlckVUYWcuc2V0TmFtZShcIklmLU1hdGNoXCIpO1xuXHRcdFx0XHQvLyBJZ25vcmUgRVRhZyBpbiBjb2xsYWJvcmF0aW9uIGRyYWZ0XG5cdFx0XHRcdGhlYWRlclBhcmFtZXRlckVUYWcuc2V0VmFsdWUoQ29sbGFib3JhdGlvbkFjdGl2aXR5U3luYy5pc0Nvbm5lY3RlZChmaWxlVXBsb2FkZXIpID8gXCIqXCIgOiBlVGFnKTtcblx0XHRcdFx0ZmlsZVVwbG9hZGVyLmFkZEhlYWRlclBhcmFtZXRlcihoZWFkZXJQYXJhbWV0ZXJFVGFnKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGhlYWRlclBhcmFtZXRlckFjY2VwdCA9IG5ldyBGaWxlVXBsb2FkZXJQYXJhbWV0ZXIoKTtcblx0XHRcdGhlYWRlclBhcmFtZXRlckFjY2VwdC5zZXROYW1lKFwiQWNjZXB0XCIpO1xuXHRcdFx0aGVhZGVyUGFyYW1ldGVyQWNjZXB0LnNldFZhbHVlKFwiYXBwbGljYXRpb24vanNvblwiKTtcblx0XHRcdGZpbGVVcGxvYWRlci5hZGRIZWFkZXJQYXJhbWV0ZXIoaGVhZGVyUGFyYW1ldGVyQWNjZXB0KTtcblxuXHRcdFx0Ly8gc3luY2hyb25pemUgdXBsb2FkIHdpdGggb3RoZXIgcmVxdWVzdHNcblx0XHRcdGNvbnN0IHVwbG9hZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55LCByZWplY3Q6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLnVwbG9hZFByb21pc2VzID0gdGhpcy51cGxvYWRQcm9taXNlcyB8fCB7fTtcblx0XHRcdFx0dGhpcy51cGxvYWRQcm9taXNlc1tmaWxlVXBsb2FkZXIuZ2V0SWQoKV0gPSB7XG5cdFx0XHRcdFx0cmVzb2x2ZTogcmVzb2x2ZSxcblx0XHRcdFx0XHRyZWplY3Q6IHJlamVjdFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRmaWxlVXBsb2FkZXIudXBsb2FkKCk7XG5cdFx0XHR9KTtcblx0XHRcdEZFQ29udHJvbGxlci5lZGl0Rmxvdy5zeW5jVGFzayh1cGxvYWRQcm9taXNlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TWVzc2FnZUJveC5lcnJvcihnZXRSZXNvdXJjZU1vZGVsKGNvbnRyb2xsZXIpLmdldFRleHQoXCJNX0ZJRUxEX0ZJTEVVUExPQURFUl9BQk9SVEVEX1RFWFRcIikpO1xuXHRcdH1cblx0fSxcblxuXHRoYW5kbGVVcGxvYWRDb21wbGV0ZTogZnVuY3Rpb24gKFxuXHRcdGV2ZW50OiBGaWxlVXBsb2FkZXIkVXBsb2FkQ29tcGxldGVFdmVudCxcblx0XHRwcm9wZXJ0eUZpbGVOYW1lOiB7IHBhdGg6IHN0cmluZyB9IHwgdW5kZWZpbmVkLFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdGNvbnRyb2xsZXI6IENvbnRyb2xsZXJcblx0KSB7XG5cdFx0Y29uc3Qgc3RhdHVzID0gTnVtYmVyKGV2ZW50LmdldFBhcmFtZXRlcihcInN0YXR1c1wiKSksXG5cdFx0XHRmaWxlVXBsb2FkZXIgPSBldmVudC5nZXRTb3VyY2UoKSBhcyBGaWxlVXBsb2FkZXIsXG5cdFx0XHRmaWxlV3JhcHBlciA9IGZpbGVVcGxvYWRlci5nZXRQYXJlbnQoKSBhcyB1bmtub3duIGFzIEZpbGVXcmFwcGVyO1xuXG5cdFx0ZmlsZVdyYXBwZXIuc2V0VUlCdXN5KGZhbHNlKTtcblxuXHRcdGNvbnN0IGNvbnRleHQgPSBmaWxlVXBsb2FkZXIuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0IHwgdW5kZWZpbmVkIHwgbnVsbDtcblx0XHRpZiAoc3RhdHVzID09PSAwIHx8IHN0YXR1cyA+PSA0MDApIHtcblx0XHRcdHRoaXMuX2Rpc3BsYXlNZXNzYWdlRm9yRmFpbGVkVXBsb2FkKGV2ZW50KTtcblx0XHRcdHRoaXMudXBsb2FkUHJvbWlzZXNbZmlsZVVwbG9hZGVyLmdldElkKCldLnJlamVjdCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBuZXdFVGFnID0gKGV2ZW50LmdldFBhcmFtZXRlcihcImhlYWRlcnNcIikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5ldGFnO1xuXG5cdFx0XHRpZiAobmV3RVRhZykge1xuXHRcdFx0XHQvLyBzZXQgbmV3IGV0YWcgZm9yIGZpbGVuYW1lIHVwZGF0ZSwgYnV0IHdpdGhvdXQgc2VuZGluZyBwYXRjaCByZXF1ZXN0XG5cdFx0XHRcdGNvbnRleHQ/LnNldFByb3BlcnR5KFwiQG9kYXRhLmV0YWdcIiwgbmV3RVRhZywgbnVsbCBhcyBhbnkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzZXQgZmlsZW5hbWUgZm9yIGxpbmsgdGV4dFxuXHRcdFx0aWYgKHByb3BlcnR5RmlsZU5hbWU/LnBhdGgpIHtcblx0XHRcdFx0Y29udGV4dD8uc2V0UHJvcGVydHkocHJvcGVydHlGaWxlTmFtZS5wYXRoLCBmaWxlVXBsb2FkZXIuZ2V0VmFsdWUoKSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGRlbGV0ZSB0aGUgYXZhdGFyIGNhY2hlIHRoYXQgbm90IGdldHMgdXBkYXRlZCBvdGhlcndpc2Vcblx0XHRcdGZpbGVXcmFwcGVyLmF2YXRhcj8ucmVmcmVzaEF2YXRhckNhY2hlQnVzdGluZygpO1xuXG5cdFx0XHR0aGlzLl9jYWxsU2lkZUVmZmVjdHNGb3JTdHJlYW0oZXZlbnQsIGZpbGVXcmFwcGVyLCBjb250cm9sbGVyKTtcblxuXHRcdFx0dGhpcy51cGxvYWRQcm9taXNlc1tmaWxlVXBsb2FkZXIuZ2V0SWQoKV0ucmVzb2x2ZSgpO1xuXHRcdH1cblxuXHRcdGRlbGV0ZSB0aGlzLnVwbG9hZFByb21pc2VzW2ZpbGVVcGxvYWRlci5nZXRJZCgpXTtcblxuXHRcdC8vIENvbGxhYm9yYXRpb24gRHJhZnQgQWN0aXZpdHkgU3luY1xuXHRcdGNvbnN0IGlzQ29sbGFib3JhdGlvbkVuYWJsZWQgPSBDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLmlzQ29ubmVjdGVkKGZpbGVVcGxvYWRlcik7XG5cdFx0aWYgKCFpc0NvbGxhYm9yYXRpb25FbmFibGVkIHx8ICFjb250ZXh0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgbm90aWZpY2F0aW9uRGF0YSA9IFtgJHtjb250ZXh0LmdldFBhdGgoKX0vJHtwcm9wZXJ0eVBhdGh9YF07XG5cdFx0aWYgKHByb3BlcnR5RmlsZU5hbWU/LnBhdGgpIHtcblx0XHRcdG5vdGlmaWNhdGlvbkRhdGEucHVzaChgJHtjb250ZXh0LmdldFBhdGgoKX0vJHtwcm9wZXJ0eUZpbGVOYW1lLnBhdGh9YCk7XG5cdFx0fVxuXG5cdFx0bGV0IGJpbmRpbmcgPSBjb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRpZiAoIWJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0VmlldyhmaWxlVXBsb2FkZXIpO1xuXHRcdFx0YmluZGluZyA9IChvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpLmdldEJpbmRpbmcoKTtcblx0XHR9XG5cdFx0aWYgKGJpbmRpbmcuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0YmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAoKSA9PiB7XG5cdFx0XHRcdENvbGxhYm9yYXRpb25BY3Rpdml0eVN5bmMuc2VuZChmaWxlV3JhcHBlciwgeyBhY3Rpb246IEFjdGl2aXR5LkNoYW5nZSwgY29udGVudDogbm90aWZpY2F0aW9uRGF0YSB9KTtcblx0XHRcdFx0Q29sbGFib3JhdGlvbkFjdGl2aXR5U3luYy5zZW5kKGZpbGVXcmFwcGVyLCB7IGFjdGlvbjogQWN0aXZpdHkuVW5sb2NrLCBjb250ZW50OiBub3RpZmljYXRpb25EYXRhIH0pO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdENvbGxhYm9yYXRpb25BY3Rpdml0eVN5bmMuc2VuZChmaWxlV3JhcHBlciwgeyBhY3Rpb246IEFjdGl2aXR5LkNoYW5nZSwgY29udGVudDogbm90aWZpY2F0aW9uRGF0YSB9KTtcblx0XHRcdENvbGxhYm9yYXRpb25BY3Rpdml0eVN5bmMuc2VuZChmaWxlV3JhcHBlciwgeyBhY3Rpb246IEFjdGl2aXR5LlVubG9jaywgY29udGVudDogbm90aWZpY2F0aW9uRGF0YSB9KTtcblx0XHR9XG5cdH0sXG5cblx0X2Rpc3BsYXlNZXNzYWdlRm9yRmFpbGVkVXBsb2FkOiBmdW5jdGlvbiAob0V2ZW50OiBGaWxlVXBsb2FkZXIkVXBsb2FkQ29tcGxldGVFdmVudCk6IHZvaWQge1xuXHRcdC8vIGhhbmRsaW5nIG9mIGJhY2tlbmQgZXJyb3JzXG5cdFx0Y29uc3Qgc0Vycm9yID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInJlc3BvbnNlUmF3XCIpIHx8IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJyZXNwb25zZVwiKTtcblx0XHRsZXQgc01lc3NhZ2VUZXh0LCBvRXJyb3I7XG5cdFx0dHJ5IHtcblx0XHRcdG9FcnJvciA9IHNFcnJvciAmJiBKU09OLnBhcnNlKHNFcnJvcik7XG5cdFx0XHRzTWVzc2FnZVRleHQgPSBvRXJyb3IuZXJyb3IgJiYgb0Vycm9yLmVycm9yLm1lc3NhZ2U7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0c01lc3NhZ2VUZXh0ID0gc0Vycm9yIHx8IGdldFJlc291cmNlTW9kZWwob0V2ZW50LmdldFNvdXJjZSgpIGFzIENvbnRyb2wpLmdldFRleHQoXCJNX0ZJRUxEX0ZJTEVVUExPQURFUl9BQk9SVEVEX1RFWFRcIik7XG5cdFx0fVxuXHRcdE1lc3NhZ2VCb3guZXJyb3Ioc01lc3NhZ2VUZXh0KTtcblx0fSxcblxuXHRyZW1vdmVTdHJlYW06IGZ1bmN0aW9uIChldmVudDogRXZlbnQsIHByb3BlcnR5RmlsZU5hbWU6IHsgcGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQsIHByb3BlcnR5UGF0aDogc3RyaW5nLCBjb250cm9sbGVyOiBDb250cm9sbGVyKSB7XG5cdFx0Y29uc3QgZGVsZXRlQnV0dG9uID0gZXZlbnQuZ2V0U291cmNlKCkgYXMgQnV0dG9uO1xuXHRcdGNvbnN0IGZpbGVXcmFwcGVyID0gZGVsZXRlQnV0dG9uLmdldFBhcmVudCgpIGFzIHVua25vd24gYXMgRmlsZVdyYXBwZXI7XG5cdFx0Y29uc3QgY29udGV4dCA9IGZpbGVXcmFwcGVyLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblxuXHRcdC8vIHN0cmVhbXMgYXJlIHJlbW92ZWQgYnkgYXNzaWduaW5nIHRoZSBudWxsIHZhbHVlXG5cdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgsIG51bGwpO1xuXHRcdC8vIFdoZW4gc2V0dGluZyB0aGUgcHJvcGVydHkgdG8gbnVsbCwgdGhlIHVwbG9hZFVybCAoQEBNT0RFTC5mb3JtYXQpIGlzIHNldCB0byBcIlwiIGJ5IHRoZSBtb2RlbFxuXHRcdC8vXHR3aXRoIHRoYXQgYW5vdGhlciB1cGxvYWQgaXMgbm90IHBvc3NpYmxlIGJlZm9yZSByZWZyZXNoaW5nIHRoZSBwYWdlXG5cdFx0Ly8gKHJlZnJlc2hpbmcgdGhlIHBhZ2Ugd291bGQgcmVjcmVhdGUgdGhlIFVSTClcblx0XHQvL1x0VGhpcyBpcyB0aGUgd29ya2Fyb3VuZDpcblx0XHQvL1x0V2Ugc2V0IHRoZSBwcm9wZXJ0eSB0byB1bmRlZmluZWQgb25seSBvbiB0aGUgZnJvbnRlbmQgd2hpY2ggd2lsbCByZWNyZWF0ZSB0aGUgdXBsb2FkVXJsXG5cdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShwcm9wZXJ0eVBhdGgsIHVuZGVmaW5lZCwgbnVsbCBhcyBhbnkpO1xuXG5cdFx0dGhpcy5fY2FsbFNpZGVFZmZlY3RzRm9yU3RyZWFtKGV2ZW50LCBmaWxlV3JhcHBlciwgY29udHJvbGxlcik7XG5cblx0XHQvLyBDb2xsYWJvcmF0aW9uIERyYWZ0IEFjdGl2aXR5IFN5bmNcblx0XHRjb25zdCBiQ29sbGFib3JhdGlvbkVuYWJsZWQgPSBDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLmlzQ29ubmVjdGVkKGRlbGV0ZUJ1dHRvbik7XG5cdFx0aWYgKGJDb2xsYWJvcmF0aW9uRW5hYmxlZCkge1xuXHRcdFx0bGV0IGJpbmRpbmcgPSBjb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdGlmICghYmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRjb25zdCBvVmlldyA9IENvbW1vblV0aWxzLmdldFRhcmdldFZpZXcoZGVsZXRlQnV0dG9uKTtcblx0XHRcdFx0YmluZGluZyA9IChvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpLmdldEJpbmRpbmcoKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZGF0YSA9IFtgJHtjb250ZXh0LmdldFBhdGgoKX0vJHtwcm9wZXJ0eVBhdGh9YF07XG5cdFx0XHRpZiAocHJvcGVydHlGaWxlTmFtZT8ucGF0aCkge1xuXHRcdFx0XHRkYXRhLnB1c2goYCR7Y29udGV4dC5nZXRQYXRoKCl9LyR7cHJvcGVydHlGaWxlTmFtZS5wYXRofWApO1xuXHRcdFx0fVxuXHRcdFx0Q29sbGFib3JhdGlvbkFjdGl2aXR5U3luYy5zZW5kKGRlbGV0ZUJ1dHRvbiwgeyBhY3Rpb246IEFjdGl2aXR5LkxvY2ssIGNvbnRlbnQ6IGRhdGEgfSk7XG5cblx0XHRcdGJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLnNlbmQoZGVsZXRlQnV0dG9uLCB7IGFjdGlvbjogQWN0aXZpdHkuQ2hhbmdlLCBjb250ZW50OiBkYXRhIH0pO1xuXHRcdFx0XHRDb2xsYWJvcmF0aW9uQWN0aXZpdHlTeW5jLnNlbmQoZGVsZXRlQnV0dG9uLCB7IGFjdGlvbjogQWN0aXZpdHkuVW5sb2NrLCBjb250ZW50OiBkYXRhIH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdF9jYWxsU2lkZUVmZmVjdHNGb3JTdHJlYW06IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSwgb0NvbnRyb2w6IGFueSwgb0NvbnRyb2xsZXI6IGFueSkge1xuXHRcdGNvbnN0IG9GRUNvbnRyb2xsZXIgPSBGaWVsZFJ1bnRpbWUuX2dldEV4dGVuc2lvbkNvbnRyb2xsZXIob0NvbnRyb2xsZXIpO1xuXHRcdGlmIChvQ29udHJvbCAmJiBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpLmlzVHJhbnNpZW50KCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRvRXZlbnQub1NvdXJjZSA9IG9Db250cm9sO1xuXHRcdH1cblx0XHRvRkVDb250cm9sbGVyLl9zaWRlRWZmZWN0cy5oYW5kbGVGaWVsZENoYW5nZShvRXZlbnQsIHRoaXMuZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlKG9FdmVudCkuc3RhdGVbXCJ2YWxpZGl0eVwiXSk7XG5cdH0sXG5cblx0Z2V0SWNvbkZvck1pbWVUeXBlOiBmdW5jdGlvbiAoc01pbWVUeXBlOiBhbnkpIHtcblx0XHRyZXR1cm4gSWNvblBvb2wuZ2V0SWNvbkZvck1pbWVUeXBlKHNNaW1lVHlwZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byByZXRyaWV2ZSB0ZXh0IGZyb20gdmFsdWUgbGlzdCBmb3IgRGF0YUZpZWxkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdFxuXHQgKiBAcGFyYW0gc1Byb3BlcnR5VmFsdWUgVGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBkYXRhZmllbGRcblx0ICogQHBhcmFtIHNQcm9wZXJ0eUZ1bGxQYXRoIFRoZSBwcm9wZXJ0eSBmdWxsIHBhdGgnc1xuXHQgKiBAcGFyYW0gc0Rpc3BsYXlGb3JtYXQgVGhlIGRpc3BsYXkgZm9ybWF0IGZvciB0aGUgZGF0YWZpZWxkXG5cdCAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgdmFsdWUgaW4gY29ycmVzcG9uZGluZyBkaXNwbGF5IGZvcm1hdC5cblx0ICovXG5cdHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Q6IGZ1bmN0aW9uIChzUHJvcGVydHlWYWx1ZTogc3RyaW5nLCBzUHJvcGVydHlGdWxsUGF0aDogc3RyaW5nLCBzRGlzcGxheUZvcm1hdDogc3RyaW5nKSB7XG5cdFx0bGV0IHNUZXh0UHJvcGVydHk6IHN0cmluZztcblx0XHRsZXQgb01ldGFNb2RlbDtcblx0XHRsZXQgc1Byb3BlcnR5TmFtZTogc3RyaW5nO1xuXHRcdGlmIChzUHJvcGVydHlWYWx1ZSkge1xuXHRcdFx0b01ldGFNb2RlbCA9IENvbW1vbkhlbHBlci5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdHNQcm9wZXJ0eU5hbWUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUHJvcGVydHlGdWxsUGF0aH1Ac2FwdWkubmFtZWApO1xuXHRcdFx0cmV0dXJuIG9NZXRhTW9kZWxcblx0XHRcdFx0LnJlcXVlc3RWYWx1ZUxpc3RJbmZvKHNQcm9wZXJ0eUZ1bGxQYXRoLCB0cnVlKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAobVZhbHVlTGlzdEluZm86IGFueSkge1xuXHRcdFx0XHRcdC8vIHRha2UgdGhlIFwiXCIgb25lIGlmIGV4aXN0cywgb3RoZXJ3aXNlIHRha2UgdGhlIGZpcnN0IG9uZSBpbiB0aGUgb2JqZWN0IFRPRE86IHRvIGJlIGRpc2N1c3NlZFxuXHRcdFx0XHRcdGNvbnN0IG9WYWx1ZUxpc3RJbmZvID0gbVZhbHVlTGlzdEluZm9bbVZhbHVlTGlzdEluZm9bXCJcIl0gPyBcIlwiIDogT2JqZWN0LmtleXMobVZhbHVlTGlzdEluZm8pWzBdXTtcblx0XHRcdFx0XHRjb25zdCBvVmFsdWVMaXN0TW9kZWwgPSBvVmFsdWVMaXN0SW5mby4kbW9kZWw7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbFZhbHVlTGlzdCA9IG9WYWx1ZUxpc3RNb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRjb25zdCBvUGFyYW1XaXRoS2V5ID0gb1ZhbHVlTGlzdEluZm8uUGFyYW1ldGVycy5maW5kKGZ1bmN0aW9uIChvUGFyYW1ldGVyOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvUGFyYW1ldGVyLkxvY2FsRGF0YVByb3BlcnR5ICYmIG9QYXJhbWV0ZXIuTG9jYWxEYXRhUHJvcGVydHkuJFByb3BlcnR5UGF0aCA9PT0gc1Byb3BlcnR5TmFtZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAob1BhcmFtV2l0aEtleSAmJiAhb1BhcmFtV2l0aEtleS5WYWx1ZUxpc3RQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBJbmNvbnNpc3RlbnQgdmFsdWUgaGVscCBhbm5vdGF0aW9uIGZvciAke3NQcm9wZXJ0eU5hbWV9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IG9UZXh0QW5ub3RhdGlvbiA9IG9NZXRhTW9kZWxWYWx1ZUxpc3QuZ2V0T2JqZWN0KFxuXHRcdFx0XHRcdFx0YC8ke29WYWx1ZUxpc3RJbmZvLkNvbGxlY3Rpb25QYXRofS8ke29QYXJhbVdpdGhLZXkuVmFsdWVMaXN0UHJvcGVydHl9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0YFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAob1RleHRBbm5vdGF0aW9uICYmIG9UZXh0QW5ub3RhdGlvbi4kUGF0aCkge1xuXHRcdFx0XHRcdFx0c1RleHRQcm9wZXJ0eSA9IG9UZXh0QW5ub3RhdGlvbi4kUGF0aDtcblx0XHRcdFx0XHRcdGNvbnN0IG9GaWx0ZXIgPSBuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogb1BhcmFtV2l0aEtleS5WYWx1ZUxpc3RQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIixcblx0XHRcdFx0XHRcdFx0dmFsdWUxOiBzUHJvcGVydHlWYWx1ZVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvVmFsdWVMaXN0TW9kZWwuYmluZExpc3QoYC8ke29WYWx1ZUxpc3RJbmZvLkNvbGxlY3Rpb25QYXRofWAsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvRmlsdGVyLCB7XG5cdFx0XHRcdFx0XHRcdCRzZWxlY3Q6IHNUZXh0UHJvcGVydHlcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9MaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgMik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNEaXNwbGF5Rm9ybWF0ID0gXCJWYWx1ZVwiO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNQcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKGFDb250ZXh0czogYW55KSB7XG5cdFx0XHRcdFx0Y29uc3Qgc0Rlc2NyaXB0aW9uID0gc1RleHRQcm9wZXJ0eSA/IGFDb250ZXh0c1swXT8uZ2V0T2JqZWN0KClbc1RleHRQcm9wZXJ0eV0gOiBcIlwiO1xuXHRcdFx0XHRcdHN3aXRjaCAoc0Rpc3BsYXlGb3JtYXQpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gc0Rlc2NyaXB0aW9uO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikuZ2V0VGV4dChcIkNfRk9STUFUX0ZPUl9URVhUX0FSUkFOR0VNRU5UXCIsIFtcblx0XHRcdFx0XHRcdFx0XHRzRGVzY3JpcHRpb24sXG5cdFx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5VmFsdWVcblx0XHRcdFx0XHRcdFx0XSk7XG5cdFx0XHRcdFx0XHRjYXNlIFwiVmFsdWVEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKS5nZXRUZXh0KFwiQ19GT1JNQVRfRk9SX1RFWFRfQVJSQU5HRU1FTlRcIiwgW1xuXHRcdFx0XHRcdFx0XHRcdHNQcm9wZXJ0eVZhbHVlLFxuXHRcdFx0XHRcdFx0XHRcdHNEZXNjcmlwdGlvblxuXHRcdFx0XHRcdFx0XHRdKTtcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdHJldHVybiBzUHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBzTXNnID1cblx0XHRcdFx0XHRcdG9FcnJvci5zdGF0dXMgJiYgb0Vycm9yLnN0YXR1cyA9PT0gNDA0XG5cdFx0XHRcdFx0XHRcdD8gYE1ldGFkYXRhIG5vdCBmb3VuZCAoJHtvRXJyb3Iuc3RhdHVzfSkgZm9yIHZhbHVlIGhlbHAgb2YgcHJvcGVydHkgJHtzUHJvcGVydHlGdWxsUGF0aH1gXG5cdFx0XHRcdFx0XHRcdDogb0Vycm9yLm1lc3NhZ2U7XG5cdFx0XHRcdFx0TG9nLmVycm9yKHNNc2cpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHNQcm9wZXJ0eVZhbHVlO1xuXHR9LFxuXG5cdGhhbmRsZVR5cGVNaXNzbWF0Y2g6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG9FdmVudC5nZXRTb3VyY2UoKSk7XG5cdFx0TWVzc2FnZUJveC5lcnJvcihyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJNX0ZJRUxEX0ZJTEVVUExPQURFUl9XUk9OR19NSU1FVFlQRVwiKSwge1xuXHRcdFx0ZGV0YWlsczpcblx0XHRcdFx0YDxwPjxzdHJvbmc+JHtyZXNvdXJjZU1vZGVsLmdldFRleHQoXCJNX0ZJRUxEX0ZJTEVVUExPQURFUl9XUk9OR19NSU1FVFlQRV9ERVRBSUxTX1NFTEVDVEVEXCIpfTwvc3Ryb25nPjwvcD4ke1xuXHRcdFx0XHRcdG9FdmVudC5nZXRQYXJhbWV0ZXJzKCkubWltZVR5cGVcblx0XHRcdFx0fTxicj48YnI+YCArXG5cdFx0XHRcdGA8cD48c3Ryb25nPiR7cmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiTV9GSUVMRF9GSUxFVVBMT0FERVJfV1JPTkdfTUlNRVRZUEVfREVUQUlMU19BTExPV0VEXCIpfTwvc3Ryb25nPjwvcD4ke29FdmVudFxuXHRcdFx0XHRcdC5nZXRTb3VyY2UoKVxuXHRcdFx0XHRcdC5nZXRNaW1lVHlwZSgpXG5cdFx0XHRcdFx0LnRvU3RyaW5nKClcblx0XHRcdFx0XHQucmVwbGFjZUFsbChcIixcIiwgXCIsIFwiKX1gLFxuXHRcdFx0Y29udGVudFdpZHRoOiBcIjE1MHB4XCJcblx0XHR9IGFzIGFueSk7XG5cdH0sXG5cblx0aGFuZGxlRmlsZVNpemVFeGNlZWQ6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSAvKmlGaWxlU2l6ZTogYW55Ki8pIHtcblx0XHRNZXNzYWdlQm94LmVycm9yKFxuXHRcdFx0Z2V0UmVzb3VyY2VNb2RlbChvRXZlbnQuZ2V0U291cmNlKCkpLmdldFRleHQoXG5cdFx0XHRcdFwiTV9GSUVMRF9GSUxFVVBMT0FERVJfRklMRV9UT09fQklHXCIsXG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5nZXRNYXhpbXVtRmlsZVNpemUoKS50b0ZpeGVkKDMpXG5cdFx0XHQpLFxuXHRcdFx0e1xuXHRcdFx0XHRjb250ZW50V2lkdGg6IFwiMTUwcHhcIlxuXHRcdFx0fSBhcyBhbnlcblx0XHQpO1xuXHR9LFxuXG5cdF9nZXRFeHRlbnNpb25Db250cm9sbGVyOiBmdW5jdGlvbiAob0NvbnRyb2xsZXI6IGFueSkge1xuXHRcdHJldHVybiBvQ29udHJvbGxlci5pc0EoXCJzYXAuZmUuY29yZS5FeHRlbnNpb25BUElcIikgPyBvQ29udHJvbGxlci5fY29udHJvbGxlciA6IG9Db250cm9sbGVyO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBFdmVudCBoYW5kbGVyIHRvIGNyZWF0ZSBhbmQgc2hvdyB3aG8gaXMgZWRpdGluZyB0aGUgZmllbGQgcG9wb3Zlci5cblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZSBUaGUgYXZhdGFyIHdoaWNoIGlzIG5leHQgdG8gdGhlIGZpZWxkIGxvY2tlZFxuXHQgKiBAcGFyYW0gdmlldyBDdXJyZW50IHZpZXdcblx0ICovXG5cdHNob3dDb2xsYWJvcmF0aW9uRWRpdFVzZXI6IGZ1bmN0aW9uIChzb3VyY2U6IEF2YXRhciwgdmlldzogVmlldykge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBSZXNvdXJjZU1vZGVsSGVscGVyLmdldFJlc291cmNlTW9kZWwodmlldyk7XG5cdFx0bGV0IHBvcG92ZXIgPSBDb3JlLmJ5SWQoYG1hbmFnZUNvbGxhYm9yYXRpb25EcmFmdC0tZWRpdFVzZXJgKSBhcyBSZXNwb25zaXZlUG9wb3ZlcjtcblxuXHRcdGlmICghcG9wb3Zlcikge1xuXHRcdFx0cG9wb3ZlciA9IG5ldyBSZXNwb25zaXZlUG9wb3ZlcihcIm1hbmFnZUNvbGxhYm9yYXRpb25EcmFmdC0tZWRpdFVzZXJcIiwge1xuXHRcdFx0XHRzaG93SGVhZGVyOiBmYWxzZSxcblx0XHRcdFx0cGxhY2VtZW50OiBcIkJvdHRvbVwiXG5cdFx0XHR9KTtcblx0XHRcdHBvcG92ZXIuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHR2aWV3LmFkZERlcGVuZGVudChwb3BvdmVyKTtcblx0XHR9XG5cblx0XHRjb25zdCBiaW5kaW5nUGF0aCA9IChzb3VyY2UuZ2V0QmluZGluZyhcImluaXRpYWxzXCIpIGFzIENvbXBvc2l0ZUJpbmRpbmcpXG5cdFx0XHQ/LmdldEJpbmRpbmdzKClcblx0XHRcdC5maW5kKChiaW5kaW5nKSA9PiBiaW5kaW5nPy5nZXRQYXRoKCk/LnN0YXJ0c1dpdGgoXCIvY29sbGFib3JhdGlvbi9hY3Rpdml0aWVzXCIpKVxuXHRcdFx0LmdldFBhdGgoKTtcblx0XHRjb25zdCBhY3Rpdml0aWVzID0gc291cmNlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldE9iamVjdChiaW5kaW5nUGF0aCk7XG5cblx0XHRsZXQgZWRpdGluZ0FjdGl2aXR5OiBVc2VyQWN0aXZpdHkgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKGFjdGl2aXRpZXMgJiYgYWN0aXZpdGllcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRlZGl0aW5nQWN0aXZpdHkgPSBhY3Rpdml0aWVzLmZpbmQoKGFjdGl2aXR5OiBVc2VyQWN0aXZpdHkpID0+IHtcblx0XHRcdFx0cmV0dXJuIGFjdGl2aXR5LmtleSA9PT0gZ2V0QWN0aXZpdHlLZXlGcm9tUGF0aChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSEuZ2V0UGF0aCgpKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRwb3BvdmVyLmRlc3Ryb3lDb250ZW50KCk7XG5cdFx0cG9wb3Zlci5hZGRDb250ZW50KFxuXHRcdFx0bmV3IExhYmVsKHtcblx0XHRcdFx0dGV4dDogcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19DT0xMQUJPUkFUSU9OQVZBVEFSX1VTRVJfRURJVF9GSUVMRFwiLCBbYCR7ZWRpdGluZ0FjdGl2aXR5Py5uYW1lfWBdKVxuXHRcdFx0fSlcblx0XHQpO1xuXHRcdHBvcG92ZXIub3BlbkJ5KHNvdXJjZSk7XG5cdH1cbn07XG5cbi8qKlxuICogQGdsb2JhbFxuICovXG5leHBvcnQgZGVmYXVsdCBGaWVsZFJ1bnRpbWU7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7RUFrREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0EsdUJBQXVCLENBQUNDLEtBQWMsRUFBMEM7SUFDeEYsSUFBSUMsT0FBTyxHQUFJRCxLQUFLLENBQUNFLGlCQUFpQixFQUFF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
@@ -223,7 +223,16 @@ const FieldRuntime = {
223
223
  (FieldAPI as any).handleChange(oEvent, oController);
224
224
  });
225
225
 
226
- oFEController.editFlow.syncTask(pValueResolved);
226
+ // For the EditFlow synchronization, we need to wait for the corresponding PATCH request to be sent, otherwise there could be e.g. action invoked in parallel with the PATCH request.
227
+ // This is done with a 0-timeout, to allow for the 'patchSent' event to be sent by the binding (then the internal edit flow synchronization kicks in with EditFlow.handlePatchSent).
228
+ const valueResolvedAndPatchSent = pValueResolved
229
+ .then(async () => {
230
+ return new Promise<void>((resolve) => {
231
+ setTimeout(resolve, 0);
232
+ });
233
+ })
234
+ .catch(() => {});
235
+ oFEController?.editFlow.syncTask(valueResolvedAndPatchSent);
227
236
 
228
237
  // if the context is transient, it means the request would fail anyway as the record does not exist in reality
229
238
  // TODO: should the request be made in future if the context is transient?
@@ -25,7 +25,7 @@ sap.ui.define(["sap/fe/core/library", "sap/fe/macros/filter/type/MultiValue", "s
25
25
  controls: [],
26
26
  elements: [],
27
27
  // eslint-disable-next-line no-template-curly-in-string
28
- version: "1.120.18",
28
+ version: "1.120.19",
29
29
  noLibraryCSS: true
30
30
  });
31
31
  thisLib.NavigationType = {
@@ -29,7 +29,7 @@ M_CONDITIONFIELDHELP_PERIOD=D\u00F6nem
29
29
  T_COMMON_PROGRESS_INDICATOR_DISPLAY_VALUE_NO_UOM={0}/{1}
30
30
  T_COMMON_PROGRESS_INDICATOR_DISPLAY_VALUE_WITH_UOM={0}/{1} {2}
31
31
 
32
- M_COMMON_TABLE_CREATE=Yarat
32
+ M_COMMON_TABLE_CREATE=Olu\u015Ftur
33
33
 
34
34
  M_COMMON_TABLE_DELETE=Sil
35
35
 
@@ -560,40 +560,37 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
560
560
  *
561
561
  * @param valueHelp The <code>ValueHelp</code> instance
562
562
  * @param content ValueHelp content instance
563
- * @param item Entry of a given list
563
+ * @param context Context of the selected item
564
564
  * @param conditions Current conditions
565
- * @returns True, if item is selected
566
- * @since 1.101.0
565
+ * @returns Conditions or []
567
566
  */
568
- isFilterableListItemSelected: function (valueHelp, content, item, conditions) {
569
- var _content$getConfig;
567
+ findConditionsForContext: function (valueHelp, content, context, conditions) {
568
+ var _content$getConfig, _payload$qualifiers$p;
570
569
  //In value help dialogs of single value fields the row for the key shouldn´t be selected/highlight anymore BCP: 2270175246
571
570
  const payload = valueHelp.getPayload();
572
571
  if (payload.isValueListWithFixedValues !== true && ((_content$getConfig = content.getConfig()) === null || _content$getConfig === void 0 ? void 0 : _content$getConfig.maxConditions) === 1) {
573
- return false;
572
+ return [];
574
573
  }
575
- const context = item.getBindingContext();
576
-
577
574
  /* Do not consider "NotValidated" conditions */
578
575
  conditions = conditions.filter(condition => condition.validated === ConditionValidated.Validated);
576
+ const vhKeys = ((_payload$qualifiers$p = payload.qualifiers[payload.valueHelpQualifier]) === null || _payload$qualifiers$p === void 0 ? void 0 : _payload$qualifiers$p.vhKeys) || [];
577
+ const keyPath = content.getKeyPath();
578
+ const valueHelpQualifier = payload.valueHelpQualifier || "";
579
579
  const selectedCondition = conditions.find(function (condition) {
580
- var _conditionPayloadMap$;
581
- const conditionPayloadMap = condition === null || condition === void 0 ? void 0 : condition.payload,
582
- valueHelpQualifier = payload.valueHelpQualifier || "";
583
- if (!conditionPayloadMap) {
584
- const keyPath = content.getKeyPath();
585
- return (context === null || context === void 0 ? void 0 : context.getObject(keyPath)) === (condition === null || condition === void 0 ? void 0 : condition.values[0]);
586
- }
587
- const conditionSelectedRow = (conditionPayloadMap === null || conditionPayloadMap === void 0 ? void 0 : (_conditionPayloadMap$ = conditionPayloadMap[valueHelpQualifier]) === null || _conditionPayloadMap$ === void 0 ? void 0 : _conditionPayloadMap$[0]) || {},
588
- selectedKeys = Object.keys(conditionSelectedRow);
589
- if (selectedKeys.length) {
590
- return selectedKeys.every(function (key) {
591
- return conditionSelectedRow[key] === (context === null || context === void 0 ? void 0 : context.getObject(key));
592
- });
580
+ if ((context === null || context === void 0 ? void 0 : context.getObject(keyPath)) === (condition === null || condition === void 0 ? void 0 : condition.values[0])) {
581
+ var _conditionPayloadMap$;
582
+ const conditionPayloadMap = condition.payload;
583
+ const conditionSelectedRow = (conditionPayloadMap === null || conditionPayloadMap === void 0 ? void 0 : (_conditionPayloadMap$ = conditionPayloadMap[valueHelpQualifier]) === null || _conditionPayloadMap$ === void 0 ? void 0 : _conditionPayloadMap$[0]) || {};
584
+ if (vhKeys.length === 1 || payload !== null && payload !== void 0 && payload.useMultiValueField || !conditionPayloadMap) {
585
+ return (context === null || context === void 0 ? void 0 : context.getObject(keyPath)) === (condition === null || condition === void 0 ? void 0 : condition.values[0]);
586
+ } else {
587
+ return vhKeys.every(function (vhkey) {
588
+ return (context === null || context === void 0 ? void 0 : context.getObject(vhkey)) === conditionSelectedRow[vhkey];
589
+ });
590
+ }
593
591
  }
594
- return false;
595
592
  });
596
- return selectedCondition ? true : false;
593
+ return selectedCondition ? [selectedCondition] : [];
597
594
  },
598
595
  /**
599
596
  * Creates contexts for additional values and resumes the list binding.
@@ -704,4 +701,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
704
701
  }
705
702
  });
706
703
  }, false);
707
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZUNvcmVDb250cm9sc0ZpbHRlckJhciIsIk9iamVjdCIsImFzc2lnbiIsIlZhbHVlSGVscERlbGVnYXRlIiwiYXBpVmVyc2lvbiIsImlzU2VhcmNoU3VwcG9ydGVkIiwidmFsdWVIZWxwIiwiY29udGVudCIsIl9saXN0QmluZGluZyIsImdldEZpbHRlckZpZWxkcyIsInVwZGF0ZUJpbmRpbmdJbmZvIiwiYmluZGluZ0luZm8iLCJzZWFyY2giLCJnZXRGaWx0ZXJWYWx1ZSIsIm5vcm1hbGl6ZWRTZWFyY2giLCJDb21tb25VdGlscyIsIm5vcm1hbGl6ZVNlYXJjaFRlcm0iLCJwYXJhbWV0ZXJzIiwiJHNlYXJjaCIsInVuZGVmaW5lZCIsInVwZGF0ZUJpbmRpbmciLCJsaXN0QmluZGluZyIsImlzQSIsInBheWxvYWQiLCJnZXRQYXlsb2FkIiwidmFsdWVMaXN0UHJvcGVydHkiLCJfZ2V0VmFsdWVMaXN0UHJvcGVydHlGcm9tUGF5bG9hZFF1YWxpZmllciIsImlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQiLCJnZXRDb250cm9sIiwiZmllbGQiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJoYXNQZW5kaW5nVXNlcklucHV0IiwiaXNUeXBlYWhlYWQiLCJpc0RlZmluZUNvbmRpdGlvblZhbHVlSGVscCIsImJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJhZGRpdGlvbmFsVmFsdWVzIiwiaW5wdXRWYWx1ZXMiLCJnZXRNb2RlbCIsImdldFByb3BlcnR5IiwidmFsdWVzIiwiYWRkaXRpb25hbFZhbHVlSGVscGVyIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMiLCJwcm9wZXJ0eVBhdGgiLCJnZXRCaW5kaW5nIiwiZ2V0UGF0aCIsImxlbmd0aCIsInB1c2giLCJncm91cEtleSIsIkFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5IiwicmVjb21tZW5kYXRpb24iLCJfdXBkYXRlQmluZGluZ0ZvclJlY29tbWVuZGF0aW9ucyIsIl91cGRhdGVCaW5kaW5nIiwiZXhlY3V0ZUZpbHRlciIsInJlcXVlc3RlZEl0ZW1zIiwiZ2V0Q29udGV4dHMiLCJjaGVja0xpc3RCaW5kaW5nUGVuZGluZyIsImlzUGVuZGluZyIsInVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZSIsInVwZGF0ZUJpbmRpbmdEb25lIiwiaXNTdXNwZW5kZWQiLCJjb250ZXh0cyIsInJlcXVlc3RDb250ZXh0cyIsImdldFR5cGVNYXAiLCJfdmFsdWVIZWxwIiwiVHlwZU1hcCIsInJldHJpZXZlQ29udGVudCIsImNvbnRhaW5lciIsImNvbnRlbnRJZCIsIlZhbHVlTGlzdEhlbHBlciIsInNob3dWYWx1ZUxpc3QiLCJfZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3QiLCJjb25kaXRpb24iLCJjb25kaXRpb25QYXlsb2FkTWFwIiwidmFsdWVIZWxwUXVhbGlmaWVycyIsImtleXMiLCJjb25kaXRpb25QYXlsb2FkTGlzdCIsInBhcmFtcyIsInF1YWxpZmllcnMiLCJ2YWx1ZUhlbHBRdWFsaWZpZXIiLCJ2aFBhcmFtZXRlcnMiLCJ2aEtleXMiLCJwcm9wZXJ0eUtleVBhdGgiLCJ2YWx1ZUhlbHBLZXlQYXRoIiwiZmlsdGVyZWRLZXlzIiwiaGVscFBhdGhzIiwiZm9yRWFjaCIsInBhcmFtIiwiaGVscFBhdGgiLCJmaWx0ZXIiLCJrZXkiLCJpbmNsdWRlcyIsIl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9GaWx0ZXJCYXIiLCJjb25kaXRpb25zIiwib3V0UGFyYW1ldGVycyIsImZpbHRlckJhciIsImxpc3RSZXBvcnRGaWx0ZXJCYXIiLCJzdGF0ZSIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsImluaXRpYWxTdGF0ZUl0ZW1zIiwiaXRlbXMiLCJmaWx0ZXJCYXJQcm9wZXJ0aWVzIiwiZ2V0UHJvcGVydHlIZWxwZXIiLCJnZXRQcm9wZXJ0aWVzIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiY29udGV4dFBhdGgiLCJzcGxpdCIsIm91dFBhcmFtZXRlciIsImZpbHRlclRhcmdldCIsInNvdXJjZSIsInBvcCIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwiZmlsdGVyVGFyZ2V0UGF0aCIsInN1YnN0cmluZyIsImFubm90YXRpb25QYXRoIiwiZ2V0UmVkdWNlZFBhdGgiLCJmaWx0ZXJCYXJQcm9wZXJ0eSIsImZpbmQiLCJpdGVtIiwibmFtZSIsImNvbmRpdGlvblBheWxvYWQiLCJuZXdDb25kaXRpb24iLCJDb25kaXRpb24iLCJjcmVhdGVDb25kaXRpb24iLCJDb25kaXRpb25WYWxpZGF0ZWQiLCJWYWxpZGF0ZWQiLCJjb25kaXRpb25QYXRoIiwiYXBwbHlFeHRlcm5hbFN0YXRlIiwiZXJyIiwibWVzc2FnZSIsIkVycm9yIiwiU3RyaW5nIiwiTG9nIiwiZXJyb3IiLCJfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvQmluZGluZ0NvbnRleHQiLCJjb250ZXh0Iiwib3V0VmFsdWVzIiwid2FybmluZyIsIl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVXBkYXRlUHJvcGVydHkiLCJjb252ZXJ0ZWRNZXRhZGF0YSIsImNvbnZlcnRUeXBlcyIsInJvb3RQYXRoIiwiZ2V0TWV0YUNvbnRleHQiLCJjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzIiwiaXNUcmFuc2llbnQiLCJpc0luYWN0aXZlIiwib3V0UGFyYW1ldGVyU291cmNlcyIsIl91cGRhdGVQcm9wZXJ0eVZpYU91dFBhcmFtZXRlciIsIkFjdGl2aXR5U3luYyIsImlzQ29ubmVjdGVkIiwiYmluZGluZyIsInZpZXciLCJnZXRUYXJnZXRWaWV3IiwiYXR0YWNoRXZlbnRPbmNlIiwic2VuZCIsImFjdGlvbiIsIkFjdGl2aXR5IiwiQ2hhbmdlIiwibWFwIiwidGFyZ2V0UHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsInRhcmdldCIsImZpZWxkQ29udHJvbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRmllbGRDb250cm9sIiwiZHluYW1pY1JlYWRPbmx5IiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJwYXRoIiwic2lkZUVmZmVjdFBhdGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJzZXRQcm9wZXJ0eSIsInRleHRQYXRoIiwiVGV4dCIsImdldEZpbHRlckNvbmRpdGlvbnMiLCJfY29uZmlnIiwiZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnMiLCJjb250cm9sIiwib25Db25kaXRpb25Qcm9wYWdhdGlvbiIsInJlYXNvbiIsInF1YWxpZmllciIsImdldE91dFBhcmFtZXRlcnMiLCJmaWVsZFBhcmVudCIsImdldFBhcmVudCIsImdldENvbmRpdGlvbnMiLCJfY3JlYXRlSW5pdGlhbEZpbHRlckNvbmRpdGlvbiIsInZhbHVlIiwiaW5pdGlhbFZhbHVlRmlsdGVyRW1wdHkiLCJfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tQmluZGluZyIsImluQ29uZGl0aW9ucyIsImluUGFyYW1ldGVycyIsImdldE1ldGFQYXRoIiwicHJvcGVydGllc1RvUmVxdWVzdCIsImluUGFyYW1ldGVyIiwiX2J1aWxkUHJvcGVydGllc1RvUmVxdWVzdCIsInJlcXVlc3RQcm9wZXJ0eSIsImkiLCJtZXRhTW9kZWxDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJyZWxhdGl2ZVBhdGhQYXJ0cyIsInNsaWNlIiwicGFydCIsInBhcnRuZXIiLCJnZXRPYmplY3QiLCIkUGFydG5lciIsImxvY2FsRGF0YVBhdGgiLCJsb2NhbERhdGFQYXJ0cyIsIm1hdGNoQ291bnQiLCJmaW5kSW5kZXgiLCJpbmRleCIsImNvbmNhdCIsImpvaW4iLCJfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tRmlsdGVyQmFyIiwiX2dldENvbmRpdGlvbnNGcm9tSW5QYXJhbWV0ZXIiLCJzb3VyY2VGaWVsZCIsImVuZHNXaXRoIiwiX3BhcnRpdGlvbkluUGFyYW1ldGVycyIsImluUGFyYW1ldGVyTWFwIiwiY29uc3RhbnQiLCJjb25zdGFudFZhbHVlIiwiaW5kZXhPZiIsIl90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGUiLCJvbkFmdGVyUmVuZGVyaW5nIiwiZXZlbnQiLCJ0YWJsZSIsInNyY0NvbnRyb2wiLCJ0YWJsZUNlbGxzRG9tUmVmcyIsIiQiLCJtZGNNVGFibGUiLCJoaWdobGlnaHRET01FbGVtZW50cyIsInBvcG92ZXJUYWJsZSIsImdldFRhYmxlIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsImFkZEV2ZW50RGVsZWdhdGUiLCJnZXRJblBhcmFtZXRlcnMiLCJpc09iamVjdFBhZ2UiLCJjcmVhdGVDb25kaXRpb25QYXlsb2FkIiwiX3ZhbHVlcyIsImVudHJ5IiwiaXNNdWx0aVZhbHVlRmllbGQiLCJ2aEtleSIsImlzRmlsdGVyYWJsZUxpc3RJdGVtU2VsZWN0ZWQiLCJpc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcyIsImdldENvbmZpZyIsIm1heENvbmRpdGlvbnMiLCJ2YWxpZGF0ZWQiLCJzZWxlY3RlZENvbmRpdGlvbiIsImtleVBhdGgiLCJnZXRLZXlQYXRoIiwiY29uZGl0aW9uU2VsZWN0ZWRSb3ciLCJzZWxlY3RlZEtleXMiLCJldmVyeSIsInVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZVJlc29sdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNvcnRBbmRGaWx0ZXJPdGhlcnMiLCJyZXN1bWVWYWx1ZUxpc3RCaW5kaW5nQW5kUmVzZXRDaGFuZ2VzIiwiYWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEiLCJyZXF1ZXN0Rm9yQWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEiLCJ1bmlxdWVBZGRpdGlvbmFsVmFsdWVzIiwicmVtb3ZlRHVwbGljYXRlQWRkaXRpb25hbFZhbHVlcyIsImNyZWF0ZUFkZGl0aW9uYWxWYWx1ZVRyYW5zaWVudENvbnRleHRzIiwicmV2ZXJzZSIsInJvb3RCaW5kaW5nIiwiZ2V0Um9vdEJpbmRpbmciLCJzdXNwZW5kIiwiY2hhbmdlUGFyYW1ldGVycyIsImZpbHRlcnMiLCJGaWx0ZXJUeXBlIiwiQXBwbGljYXRpb24iLCJzb3J0Iiwic29ydGVyIiwicmVzdW1lIiwicmVzZXRDaGFuZ2VzIiwiY2hlY2tJZkFkZGl0aW9uYWxWYWx1ZXNFeGlzdHMiLCJzaG93VHlwZWFoZWFkIiwiZmlsdGVyVmFsdWUiLCJ2aFZhbHVlIiwiZmllbGRUZXh0VmFsdWUiLCJnZXRBZGRpdGlvbmFsVmFsdWUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlZhbHVlSGVscERlbGVnYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udmVydGVkTWV0YWRhdGEsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBBY3Rpdml0eVN5bmMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlTeW5jXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSB7IEluT3V0UGFyYW1ldGVyLCBWYWx1ZUhlbHBQYXlsb2FkIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlclwiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgaGlnaGxpZ2h0RE9NRWxlbWVudHMgZnJvbSBcInNhcC9tL2lucHV0VXRpbHMvaGlnaGxpZ2h0RE9NRWxlbWVudHNcIjtcbmltcG9ydCB0eXBlIHsgQWdncmVnYXRpb25CaW5kaW5nSW5mbyB9IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFR5cGUgfSBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyIGZyb20gXCJzYXAvdWkvbWRjL0ZpbHRlckJhclwiO1xuaW1wb3J0IHR5cGUgVmFsdWVIZWxwIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscFwiO1xuaW1wb3J0IFZhbHVlSGVscERlbGVnYXRlIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscERlbGVnYXRlXCI7XG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvbk9iamVjdCB9IGZyb20gXCJzYXAvdWkvbWRjL2NvbmRpdGlvbi9Db25kaXRpb25cIjtcbmltcG9ydCBDb25kaXRpb24gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IENvbmRpdGlvblZhbGlkYXRlZCBmcm9tIFwic2FwL3VpL21kYy9lbnVtcy9Db25kaXRpb25WYWxpZGF0ZWRcIjtcbmltcG9ydCB0eXBlIEZpZWxkQmFzZSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9GaWVsZEJhc2VcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhckJhc2UgZnJvbSBcInNhcC91aS9tZGMvZmlsdGVyYmFyL0ZpbHRlckJhckJhc2VcIjtcbmltcG9ydCBUeXBlTWFwIGZyb20gXCJzYXAvdWkvbWRjL29kYXRhL3Y0L1R5cGVNYXBcIjtcbmltcG9ydCBTdGF0ZVV0aWwgZnJvbSBcInNhcC91aS9tZGMvcDEzbi9TdGF0ZVV0aWxcIjtcbmltcG9ydCB0eXBlIENvbnRhaW5lciBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvYmFzZS9Db250YWluZXJcIjtcbmltcG9ydCB0eXBlIENvbnRlbnQgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2Jhc2UvQ29udGVudFwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyYWJsZUxpc3RDb250ZW50IGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9iYXNlL0ZpbHRlcmFibGVMaXN0Q29udGVudFwiO1xuaW1wb3J0IHR5cGUgTVRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9jb250ZW50L01UYWJsZVwiO1xuaW1wb3J0IEZpbHRlclR5cGUgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJUeXBlXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEFkZGl0aW9uYWxWYWx1ZVR5cGUgfSBmcm9tIFwiLi4vaW50ZXJuYWwvdmFsdWVoZWxwL0FkZGl0aW9uYWxWYWx1ZUhlbHBlclwiO1xuaW1wb3J0IHsgQWRkaXRpb25hbFZhbHVlR3JvdXBLZXksIGFkZGl0aW9uYWxWYWx1ZUhlbHBlciB9IGZyb20gXCIuLi9pbnRlcm5hbC92YWx1ZWhlbHAvQWRkaXRpb25hbFZhbHVlSGVscGVyXCI7XG5cbmNvbnN0IEZlQ29yZUNvbnRyb2xzRmlsdGVyQmFyID0gXCJzYXAuZmUuY29yZS5jb250cm9scy5GaWx0ZXJCYXJcIjtcblxudHlwZSBDb25kaXRpb25PYmplY3RNYXAgPSBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25PYmplY3RbXT47XG5cbmV4cG9ydCB0eXBlIEV4dGVybmFsU3RhdGVUeXBlID0ge1xuXHRpdGVtczogeyBuYW1lOiBzdHJpbmcgfVtdO1xuXHRmaWx0ZXI6IENvbmRpdGlvbk9iamVjdE1hcDtcbn07XG5cbmV4cG9ydCB0eXBlIENvbmRpdGlvblBheWxvYWRUeXBlID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbj47XG5cbmV4cG9ydCB0eXBlIENvbmRpdGlvblBheWxvYWRNYXAgPSBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25QYXlsb2FkVHlwZVtdPjtcblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbih7fSwgVmFsdWVIZWxwRGVsZWdhdGUsIHtcblx0YXBpVmVyc2lvbjogMixcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+IHN1cHBvcnRzICRTZWFyY2guXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgQ29udGVudCBlbGVtZW50XG5cdCAqIEBwYXJhbSBfbGlzdEJpbmRpbmdcblx0ICogQHJldHVybnMgVHJ1ZSBpZiAkc2VhcmNoIGlzIHN1cHBvcnRlZFxuXHQgKi9cblx0aXNTZWFyY2hTdXBwb3J0ZWQ6IGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogRmlsdGVyYWJsZUxpc3RDb250ZW50LCBfbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpIHtcblx0XHRyZXR1cm4gY29udGVudC5nZXRGaWx0ZXJGaWVsZHMoKSA9PT0gXCIkc2VhcmNoXCI7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkanVzdGFibGUgZmlsdGVyaW5nIGZvciBsaXN0LWJhc2VkIGNvbnRlbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IFZhbHVlSGVscCBjb250ZW50IHJlcXVlc3RpbmcgY29uZGl0aW9ucyBjb25maWd1cmF0aW9uXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqL1xuXHR1cGRhdGVCaW5kaW5nSW5mbzogZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBGaWx0ZXJhYmxlTGlzdENvbnRlbnQsIGJpbmRpbmdJbmZvOiBBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvKSB7XG5cdFx0VmFsdWVIZWxwRGVsZWdhdGUudXBkYXRlQmluZGluZ0luZm8odmFsdWVIZWxwLCBjb250ZW50LCBiaW5kaW5nSW5mbyk7XG5cblx0XHRpZiAoY29udGVudC5nZXRGaWx0ZXJGaWVsZHMoKSA9PT0gXCIkc2VhcmNoXCIpIHtcblx0XHRcdGNvbnN0IHNlYXJjaCA9IGNvbnRlbnQuZ2V0RmlsdGVyVmFsdWUoKTtcblx0XHRcdGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBDb21tb25VdGlscy5ub3JtYWxpemVTZWFyY2hUZXJtKHNlYXJjaCk7IC8vIGFkanVzdFNlYXJjaFxuXG5cdFx0XHRpZiAoYmluZGluZ0luZm8ucGFyYW1ldGVycykge1xuXHRcdFx0XHQoYmluZGluZ0luZm8ucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuJHNlYXJjaCA9IG5vcm1hbGl6ZWRTZWFyY2ggfHwgdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGZpZWxkIGlzIHJlY29tbWVuZGF0aW9uIHJlbGV2YW50IGFuZCBjYWxscyBlaXRoZXIgX3VwZGF0ZUJpbmRpbmcgb3IgX3VwZGF0ZUJpbmRpbmdGb3JSZWNvbW1lbmRhdGlvbnMuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKi9cblx0dXBkYXRlQmluZGluZzogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdHZhbHVlSGVscDogVmFsdWVIZWxwLFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGJpbmRpbmdJbmZvOiBBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdGNvbnRlbnQ6IE1UYWJsZVxuXHQpIHtcblx0XHQvLyBsaXN0QmluZGluZyBzaG91bGQgYmUgb2YgdHlwZSBPRGF0YUxpc3RCaW5kaW5nXG5cdFx0aWYgKCFsaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vV2UgZmV0Y2ggdGhlIHZhbHVlbGlzdCBwcm9wZXJ0eSBmcm9tIHRoZSBwYXlsb2FkIHRvIG1ha2Ugc3VyZSB3ZSBwYXNzIHRoZSByaWdodCBwcm9wZXJ0eSB3aGlsZSBtYWtpbmcgYSBjYWxsIG9uIHZhbHVlbGlzdCBlbnRpdHkgc2V0XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRjb25zdCB2YWx1ZUxpc3RQcm9wZXJ0eSA9IHRoaXMuX2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXIocGF5bG9hZCk7XG5cdFx0Y29uc3QgaXNGaWx0ZXJGaWVsZE9yTXVsdGlWYWx1ZWRGaWVsZCA9XG5cdFx0XHRjb250ZW50LmdldENvbnRyb2woKS5pc0EoXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpIHx8IGNvbnRlbnQuZ2V0Q29udHJvbCgpLmlzQShcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpO1xuXHRcdGNvbnN0IGZpZWxkID0gY29udGVudC5nZXRDb250cm9sKCkgYXMgRmllbGRUeXBlO1xuXHRcdGNvbnN0IGZpZWxkVmFsdWUgPSAhaXNGaWx0ZXJGaWVsZE9yTXVsdGlWYWx1ZWRGaWVsZCAmJiBmaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdC8vIEZvciBkZWZpbmUgY29uZGl0aW9ucyB2YWx1ZWhlbHAgcmVjb21tZW5kYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgXCJpbnRlcm5hbFwiIG1vZGVsIGlzIG5vdCBhdmFpbGFibGUuXG5cdFx0Ly8gV2UgbmVlZCB0byBzaG93IHJlY29tbWVuZGF0aW9ucyBvbmx5IHdoZW4gdGhlIGZpZWxkIGhhcyBlbXB0eSB2YWx1ZSBvciB3aGVuIHVzZXIgaXMgdHlwaW5nIGEgdmFsdWUuIE90aGVyIHRpbWVzIHdlIHNob3VsZCBub3Qgc2hvdyByZWNvbW1lbmRhdGlvbnMuXG5cdFx0Ly9DaGVjayBpZiB0aGUgZmllbGQgaGFzIGFueSBwZW5kaW5nIHVzZXIgaW5wdXQgYW5kIGlmIGl0IGlzIHRoZW4gd2Ugc2hvdyByZWNvbW1lbmRhdGlvbnMgaWYgYW55LlxuXHRcdGlmICgoIWZpZWxkVmFsdWUgfHwgZmllbGQ/Lmhhc1BlbmRpbmdVc2VySW5wdXQoKSkgJiYgY29udGVudC5pc1R5cGVhaGVhZCgpICYmICFwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IGNvbnRlbnQuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZXM6IEFkZGl0aW9uYWxWYWx1ZVR5cGVbXSA9IFtdO1xuXHRcdFx0Ly9nZXQgdGhlIHJlY29tbWVuZGF0aW9uIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgbW9kZWxcblx0XHRcdGNvbnN0IGlucHV0VmFsdWVzID0gKGNvbnRlbnQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWwpLmdldFByb3BlcnR5KFwiL3JlY29tbWVuZGF0aW9uc0RhdGFcIikgfHwge307XG5cdFx0XHRsZXQgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG5cdFx0XHQvL0ZldGNoIHRoZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnMgYmFzZWQgb24gdGhlIGlucHV0dmFsdWVzIGFuZCBiaW5kaW5nY29udGV4dFxuXHRcdFx0aWYgKCFpc0ZpbHRlckZpZWxkT3JNdWx0aVZhbHVlZEZpZWxkKSB7XG5cdFx0XHRcdHZhbHVlcyA9XG5cdFx0XHRcdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKFxuXHRcdFx0XHRcdFx0aW5wdXRWYWx1ZXMsXG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0LFxuXHRcdFx0XHRcdFx0cGF5bG9hZC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRjb250ZW50LmdldENvbnRyb2woKS5nZXRCaW5kaW5nKFwidmFsdWVcIik/LmdldFBhdGgoKVxuXHRcdFx0XHRcdCkgfHwgW107XG5cdFx0XHR9XG5cdFx0XHQvL2lmIHRoZXJlIGFyZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnMgdGhlbiBjcmVhdGUgYWRkaXRpb25hbHZhbHVlIHN0cnVjdHVyZSBhbmQgY2FsbCBfdXBkYXRlQmluZGluZ0ZvclJlY29tbWVuZGF0aW9uc1xuXHRcdFx0aWYgKHZhbHVlcz8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVzLnB1c2goeyBwcm9wZXJ0eVBhdGg6IHZhbHVlTGlzdFByb3BlcnR5LCB2YWx1ZXMsIGdyb3VwS2V5OiBBZGRpdGlvbmFsVmFsdWVHcm91cEtleS5yZWNvbW1lbmRhdGlvbiB9KTtcblx0XHRcdFx0dGhpcy5fdXBkYXRlQmluZGluZ0ZvclJlY29tbWVuZGF0aW9ucyhwYXlsb2FkLCBsaXN0QmluZGluZywgYmluZGluZ0luZm8sIGFkZGl0aW9uYWxWYWx1ZXMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9jYWxsIF91cGRhdGVCaW5kaW5nIGlmIHRoZXJlIGFyZSBubyByZWxldmFudCByZWNvbW1lbmRhdGlvbnNcblx0XHRcdFx0dGhpcy5fdXBkYXRlQmluZGluZyhsaXN0QmluZGluZywgYmluZGluZ0luZm8pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvL2NhbGwgX3VwZGF0ZUJpbmRpbmcgaWYgdGhlcmUgYXJlIG5vIHJlbGV2YW50IHJlY29tbWVuZGF0aW9uc1xuXHRcdFx0dGhpcy5fdXBkYXRlQmluZGluZyhsaXN0QmluZGluZywgYmluZGluZ0luZm8pO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGEgZmlsdGVyIGluIGEgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+LlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIHJlcXVlc3RlZEl0ZW1zIE51bWJlciBvZiByZXF1ZXN0ZWQgaXRlbXNcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGlmIHNlYXJjaCBpcyBleGVjdXRlZFxuXHQgKi9cblx0ZXhlY3V0ZUZpbHRlcjogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcmVxdWVzdGVkSXRlbXM6IG51bWJlcikge1xuXHRcdGxpc3RCaW5kaW5nLmdldENvbnRleHRzKDAsIHJlcXVlc3RlZEl0ZW1zKTtcblxuXHRcdGF3YWl0IHRoaXMuY2hlY2tMaXN0QmluZGluZ1BlbmRpbmcodmFsdWVIZWxwLCBsaXN0QmluZGluZywgcmVxdWVzdGVkSXRlbXMpO1xuXHRcdHJldHVybiBsaXN0QmluZGluZztcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4gaXMgd2FpdGluZyBmb3IgYW4gdXBkYXRlLlxuXHQgKiBBcyBsb25nIGFzIHRoZSBjb250ZXh0IGhhcyBub3QgYmVlbiBzZXQgZm9yIDxjb2RlPkxpc3RCaW5kaW5nPC9jb2RlPixcblx0ICogPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBuZWVkcyB0byB3YWl0LlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0QmluZGluZyB0byBjaGVja1xuXHQgKiBAcGFyYW0gcmVxdWVzdGVkSXRlbXMgTnVtYmVyIG9mIHJlcXVlc3RlZCBpdGVtc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSBMaXN0QmluZGluZyBoYXMgYmVlbiB1cGRhdGVkXG5cdCAqL1xuXHRjaGVja0xpc3RCaW5kaW5nUGVuZGluZzogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZCwgcmVxdWVzdGVkSXRlbXM6IG51bWJlcikge1xuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0bGV0IGlzUGVuZGluZyA9IGZhbHNlO1xuXHRcdGlmIChwYXlsb2FkLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZSkge1xuXHRcdFx0Y29uc3QgdXBkYXRlQmluZGluZ0RvbmUgPSBhd2FpdCBwYXlsb2FkLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZTtcblx0XHRcdGlzUGVuZGluZyA9ICF1cGRhdGVCaW5kaW5nRG9uZTtcblx0XHR9IGVsc2UgaWYgKGxpc3RCaW5kaW5nICYmICFsaXN0QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRjb25zdCBjb250ZXh0cyA9IGF3YWl0IGxpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCByZXF1ZXN0ZWRJdGVtcyk7XG5cdFx0XHRpc1BlbmRpbmcgPSBjb250ZXh0cy5sZW5ndGggPT09IDA7XG5cdFx0fVxuXHRcdHJldHVybiBpc1BlbmRpbmc7XG5cdH0sXG5cblx0Z2V0VHlwZU1hcDogZnVuY3Rpb24gKF92YWx1ZUhlbHA6IFZhbHVlSGVscCkge1xuXHRcdHJldHVybiBUeXBlTWFwO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgY29udGVudCBvZiB0aGUgdmFsdWUgaGVscC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgaGVscCBpcyBvcGVuZWQgb3IgYSBrZXkgb3IgZGVzY3JpcHRpb24gaXMgcmVxdWVzdGVkLlxuXHQgKlxuXHQgKiBTbywgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBoZWxwIGNvbnRlbnQgdXNlZCwgYWxsIGNvbnRlbnQgY29udHJvbHMgYW5kIGRhdGEgbmVlZCB0byBiZSBhc3NpZ25lZC5cblx0ICogT25jZSB0aGV5IGFyZSBhc3NpZ25lZCBhbmQgdGhlIGRhdGEgaXMgc2V0LCB0aGUgcmV0dXJuZWQgPGNvZGU+UHJvbWlzZTwvY29kZT4gbmVlZHMgdG8gYmUgcmVzb2x2ZWQuXG5cdCAqIE9ubHkgdGhlbiBkb2VzIHRoZSB2YWx1ZSBoZWxwIGNvbnRpbnVlIG9wZW5pbmcgb3IgcmVhZGluZyBkYXRhLlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250YWluZXIgQ29udGFpbmVyIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50SWQgSWQgb2YgdGhlIGNvbnRlbnQgc2hvd24gYWZ0ZXIgdGhpcyBjYWxsIHRvIHJldHJpZXZlQ29udGVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgaWYgYWxsIGNvbnRlbnQgaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRyZXRyaWV2ZUNvbnRlbnQ6IGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGFpbmVyOiBDb250YWluZXIsIGNvbnRlbnRJZDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRyZXR1cm4gVmFsdWVMaXN0SGVscGVyLnNob3dWYWx1ZUxpc3QocGF5bG9hZCwgY29udGFpbmVyLCBjb250ZW50SWQpO1xuXHR9LFxuXG5cdF9nZXRDb25kaXRpb25QYXlsb2FkTGlzdDogZnVuY3Rpb24gKGNvbmRpdGlvbjogQ29uZGl0aW9uT2JqZWN0KSB7XG5cdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZE1hcCA9IChjb25kaXRpb24ucGF5bG9hZCB8fCB7fSkgYXMgQ29uZGl0aW9uUGF5bG9hZE1hcCxcblx0XHRcdHZhbHVlSGVscFF1YWxpZmllcnMgPSBPYmplY3Qua2V5cyhjb25kaXRpb25QYXlsb2FkTWFwKSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWRMaXN0ID0gdmFsdWVIZWxwUXVhbGlmaWVycy5sZW5ndGggPyBjb25kaXRpb25QYXlsb2FkTWFwW3ZhbHVlSGVscFF1YWxpZmllcnNbMF1dIDogW107XG5cblx0XHRyZXR1cm4gY29uZGl0aW9uUGF5bG9hZExpc3Q7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIFZhbHVlTGlzdFByb3BlcnR5IGZyb20gUGF5bG9hZCBiYXNlZCBvbiBkYXRhIGZyb20gcGF5bG9hZCBrZXlzIGFuZCBwYXJhbWV0ZXJzLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcmV0dXJucyBWYWx1ZUxpc3RQcm9wZXJ0eVxuXHQgKi9cblx0X2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXI6IGZ1bmN0aW9uIChwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkKSB7XG5cdFx0Y29uc3QgcGFyYW1zID0gcGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXS52aFBhcmFtZXRlcnMgfHwgW107XG5cdFx0Y29uc3Qga2V5cyA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0udmhLZXlzIHx8IFtdO1xuXHRcdGNvbnN0IHByb3BlcnR5S2V5UGF0aCA9IHBheWxvYWQudmFsdWVIZWxwS2V5UGF0aDtcblx0XHRsZXQgZmlsdGVyZWRLZXlzOiBzdHJpbmdbXSA9IFsuLi5rZXlzXTtcblx0XHRjb25zdCBoZWxwUGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0aWYgKHBhcmFtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL2NyZWF0ZSBoZWxwUGF0aHMgYXJyYXkgd2hpY2ggd2lsbCBvbmx5IGNvbnNpc3Qgb2YgcGFyYW1zIGhlbHBwYXRoXG5cdFx0XHRwYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW06IEluT3V0UGFyYW1ldGVyKSB7XG5cdFx0XHRcdGhlbHBQYXRocy5wdXNoKHBhcmFtLmhlbHBQYXRoKTtcblx0XHRcdH0pO1xuXHRcdFx0Ly9maWx0ZXIgdGhlIGtleXMgYmFzZWQgb24gaGVscFBhdGhzLiBJZiBrZXkgaXMgbm90IHByZXNlbnQgaW4gaGVscFBhdGggdGhlbiBpdCBpcyB2YWx1ZWxpc3Rwcm9wZXJ0eVxuXHRcdFx0ZmlsdGVyZWRLZXlzID0ga2V5cy5maWx0ZXIoKGtleTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdHJldHVybiAhaGVscFBhdGhzLmluY2x1ZGVzKGtleSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBmcm9tIGZpbHRlcmVkS2V5cyByZXR1cm4gdGhlIGtleSB0aGF0IG1hdGNoZXMgdGhlIHByb3BlcnR5IG5hbWVcblx0XHRyZXR1cm4gcHJvcGVydHlLZXlQYXRoICYmIGZpbHRlcmVkS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eUtleVBhdGgpID8gcHJvcGVydHlLZXlQYXRoIDogXCJcIjtcblx0fSxcblxuXHRfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvRmlsdGVyQmFyOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0Y29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10sXG5cdFx0b3V0UGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSxcblx0XHRmaWx0ZXJCYXI6IEZpbHRlckJhcixcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdGxpc3RSZXBvcnRGaWx0ZXJCYXI6IEZpbHRlckJhclxuXHQpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc3RhdGU6IEV4dGVybmFsU3RhdGVUeXBlID0gYXdhaXQgU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShsaXN0UmVwb3J0RmlsdGVyQmFyKTtcblx0XHRcdGNvbnN0IGluaXRpYWxTdGF0ZUl0ZW1zID0gc3RhdGUuaXRlbXM7IC8vIFZpc2libGUgRmlsdGVySXRlbXMgaW4gdGhlIExSLUZpbHRlckJhclxuXHRcdFx0Y29uc3QgZmlsdGVyQmFyUHJvcGVydGllcyA9IGZpbHRlckJhci5nZXRQcm9wZXJ0eUhlbHBlcigpLmdldFByb3BlcnRpZXMoKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGZpbHRlckJhci5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdGNvbnN0IGNvbnRleHRQYXRoID0gYC8ke3BheWxvYWQucHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKVsxXX1gO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG5cdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRMaXN0ID0gdGhpcy5fZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3QoY29uZGl0aW9uKTtcblx0XHRcdFx0Zm9yIChjb25zdCBvdXRQYXJhbWV0ZXIgb2Ygb3V0UGFyYW1ldGVycykge1xuXHRcdFx0XHRcdGNvbnN0IGZpbHRlclRhcmdldCA9IG91dFBhcmFtZXRlci5zb3VyY2Uuc3BsaXQoXCJjb25kaXRpb25zL1wiKS5wb3AoKSB8fCBcIlwiO1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RJbmRleCA9IHBheWxvYWQucHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdFx0XHRjb25zdCBmaWx0ZXJUYXJnZXRQYXRoID1cblx0XHRcdFx0XHRcdGxhc3RJbmRleCA+IDAgPyBgJHtwYXlsb2FkLnByb3BlcnR5UGF0aC5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KX0vJHtmaWx0ZXJUYXJnZXR9YCA6IGZpbHRlclRhcmdldDtcblx0XHRcdFx0XHRjb25zdCBhbm5vdGF0aW9uUGF0aCA9IG1ldGFNb2RlbD8uZ2V0UmVkdWNlZFBhdGgoZmlsdGVyVGFyZ2V0UGF0aCwgY29udGV4dFBhdGgpO1xuXHRcdFx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnR5ID0gZmlsdGVyQmFyUHJvcGVydGllcy5maW5kKChpdGVtKSA9PiBpdGVtLmFubm90YXRpb25QYXRoID09PSBhbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRcdFx0Ly8gUHJvcGFnYXRlIE9VVCBwYXJhbWV0ZXIgb25seSBpZiB0aGUgZmlsdGVyIGZpZWxkIGlzIHZpc2libGUgaW4gdGhlIExSIGZpbHRlcmJhclxuXHRcdFx0XHRcdC8vIExSIEZpbHRlckJhciBvciBMUiBBZGFwdEZpbHRlclxuXHRcdFx0XHRcdGlmIChmaWx0ZXJCYXJQcm9wZXJ0eSAmJiBpbml0aWFsU3RhdGVJdGVtcz8uZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBmaWx0ZXJCYXJQcm9wZXJ0eS5uYW1lKSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb25QYXlsb2FkIG9mIGNvbmRpdGlvblBheWxvYWRMaXN0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0NvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXG5cdFx0XHRcdFx0XHRcdFx0XCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcdFtjb25kaXRpb25QYXlsb2FkW291dFBhcmFtZXRlci5oZWxwUGF0aF1dLFxuXHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdHN0YXRlLmZpbHRlcltmaWx0ZXJCYXJQcm9wZXJ0eS5jb25kaXRpb25QYXRoXSB8fD0gW107XG5cdFx0XHRcdFx0XHRcdHN0YXRlLmZpbHRlcltmaWx0ZXJCYXJQcm9wZXJ0eS5jb25kaXRpb25QYXRoXS5wdXNoKG5ld0NvbmRpdGlvbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBBcHBseSB0byB0aGUgcGFyZW50IG9mIHRoZSBGaWx0ZXJGaWVsZFxuXHRcdFx0U3RhdGVVdGlsLmFwcGx5RXh0ZXJuYWxTdGF0ZShmaWx0ZXJCYXIsIHN0YXRlKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG5cdFx0XHRMb2cuZXJyb3IoYFZhbHVlSGVscERlbGVnYXRlOiAke21lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9LFxuXG5cdF9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9CaW5kaW5nQ29udGV4dDogZnVuY3Rpb24gKFxuXHRcdGNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdLFxuXHRcdG91dFBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW10sXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscFxuXHQpIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTGlzdCA9IHRoaXMuX2dldENvbmRpdGlvblBheWxvYWRMaXN0KGNvbmRpdGlvbiksXG5cdFx0XHRcdG91dFZhbHVlcyA9IGNvbmRpdGlvblBheWxvYWRMaXN0Lmxlbmd0aCA9PT0gMSA/IGNvbmRpdGlvblBheWxvYWRMaXN0WzBdIDogdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoY29uZGl0aW9uUGF5bG9hZExpc3QubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIlZhbHVlSGVscERlbGVnYXRlOiBQYXJhbWV0ZXJPdXQgaW4gbXVsdGktdmFsdWUtZmllbGQgbm90IHN1cHBvcnRlZFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChvdXRWYWx1ZXMpIHtcblx0XHRcdFx0dGhpcy5fb25Db25kaXRpb25Qcm9wYWdhdGlvblVwZGF0ZVByb3BlcnR5KG1ldGFNb2RlbCwgb3V0VmFsdWVzLCBvdXRQYXJhbWV0ZXJzLCBjb250ZXh0LCB2YWx1ZUhlbHApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRfb25Db25kaXRpb25Qcm9wYWdhdGlvblVwZGF0ZVByb3BlcnR5OiBmdW5jdGlvbiAoXG5cdFx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRvdXRWYWx1ZXM6IENvbmRpdGlvblBheWxvYWRUeXBlLFxuXHRcdG91dFBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW10sXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscFxuXHQpIHtcblx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpO1xuXHRcdGNvbnN0IHJvb3RQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKS5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgY29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0cyA9IGNvbnRleHQuaXNUcmFuc2llbnQoKSAhPT0gdHJ1ZSAmJiAhY29udGV4dC5pc0luYWN0aXZlKCk7XG5cdFx0Y29uc3Qgb3V0UGFyYW1ldGVyU291cmNlczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IG91dFBhcmFtZXRlciBvZiBvdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHQvKiBVcGRhdGVkIHByb3BlcnR5IHZpYSBvdXQtcGFyYW1ldGVyIGlmIHZhbHVlIGNoYW5nZWQgKi9cblx0XHRcdGlmIChjb250ZXh0LmdldFByb3BlcnR5KG91dFBhcmFtZXRlci5zb3VyY2UpICE9PSBvdXRWYWx1ZXNbb3V0UGFyYW1ldGVyLmhlbHBQYXRoXSkge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQcm9wZXJ0eVZpYU91dFBhcmFtZXRlcihcblx0XHRcdFx0XHRjb252ZXJ0ZWRNZXRhZGF0YSxcblx0XHRcdFx0XHRyb290UGF0aCxcblx0XHRcdFx0XHRvdXRWYWx1ZXMsXG5cdFx0XHRcdFx0b3V0UGFyYW1ldGVyLFxuXHRcdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdFx0Y29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0c1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0b3V0UGFyYW1ldGVyU291cmNlcy5wdXNoKG91dFBhcmFtZXRlci5zb3VyY2UpO1xuXHRcdH1cblx0XHRpZiAoQWN0aXZpdHlTeW5jLmlzQ29ubmVjdGVkKHZhbHVlSGVscCkpIHtcblx0XHRcdC8vIHdlIGRldGVybWluZSB0aGUgYmluZGluZyB0aGF0IHNlbmRzIHRoZSByZXF1ZXN0XG5cdFx0XHRsZXQgYmluZGluZztcblx0XHRcdGlmIChjb250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRiaW5kaW5nID0gY29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB2aWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldyh2YWx1ZUhlbHApO1xuXHRcdFx0XHRiaW5kaW5nID0gKHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KS5nZXRCaW5kaW5nKCk7XG5cdFx0XHR9XG5cdFx0XHQvKiBUaGUgb3V0IHZhbHVlcyBoYXZlIGJlZW4gY2hhbmdlZCAtLT4gd2FpdCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIgYmVmb3JlIHNlbmRpbmcgYSBub3RpZmljYXRpb24gdG8gdGhlIG90aGVyIGNvbGxhYm9yYXRvcnNcblx0XHRcdCAgIFdlIGF0dGFjaCB0aGUgZXZlbnQgb24gdGhlIHJpZ2h0IGJpbmRpbmcgKi9cblx0XHRcdGJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRBY3Rpdml0eVN5bmMuc2VuZCh2YWx1ZUhlbHAgYXMgdW5rbm93biBhcyBDb250cm9sLCB7XG5cdFx0XHRcdFx0YWN0aW9uOiBBY3Rpdml0eS5DaGFuZ2UsXG5cdFx0XHRcdFx0Y29udGVudDogb3V0UGFyYW1ldGVyU291cmNlcy5tYXAoKHNvdXJjZSkgPT4gY29udGV4dC5nZXRQYXRoKCkgKyBcIi9cIiArIHNvdXJjZSlcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0X3VwZGF0ZVByb3BlcnR5VmlhT3V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoXG5cdFx0Y29udmVydGVkTWV0YWRhdGE6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRcdHJvb3RQYXRoOiBzdHJpbmcsXG5cdFx0b3V0VmFsdWVzOiBDb25kaXRpb25QYXlsb2FkVHlwZSxcblx0XHRvdXRQYXJhbWV0ZXI6IEluT3V0UGFyYW1ldGVyLFxuXHRcdGNvbnRleHQ6IENvbnRleHQsXG5cdFx0Y29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0czogYm9vbGVhblxuXHQpIHtcblx0XHQvKiBVcGRhdGVkIHByb3BlcnR5IHZpYSBvdXQtcGFyYW1ldGVyIGlmIHZhbHVlIGNoYW5nZWQgKi9cblx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBgJHtyb290UGF0aH0vJHtvdXRQYXJhbWV0ZXIuc291cmNlfWA7XG5cdFx0Y29uc3QgdGFyZ2V0UHJvcGVydHkgPSBjb252ZXJ0ZWRNZXRhZGF0YS5yZXNvbHZlUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlQYXRoKS50YXJnZXQ7XG5cdFx0Y29uc3QgZmllbGRDb250cm9sID0gdGFyZ2V0UHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LkZpZWxkQ29udHJvbDtcblx0XHRjb25zdCBkeW5hbWljUmVhZE9ubHkgPSBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihmaWVsZENvbnRyb2wpID8gY29udGV4dC5nZXRQcm9wZXJ0eShmaWVsZENvbnRyb2wucGF0aCkgPT09IDEgOiBmYWxzZTtcblx0XHRpZiAoZHluYW1pY1JlYWRPbmx5ICYmIGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdC8qIE5vbi1UcmFuc2llbnQgYW5kIGFjdGl2ZSBjb250ZXh0ICovXG5cdFx0XHRjb25zdCBsYXN0SW5kZXggPSBvdXRQYXJhbWV0ZXIuc291cmNlLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RQYXRoID0gbGFzdEluZGV4ID4gMCA/IG91dFBhcmFtZXRlci5zb3VyY2Uuc3Vic3RyaW5nKDAsIGxhc3RJbmRleCkgOiBvdXRQYXJhbWV0ZXIuc291cmNlO1xuXHRcdFx0LyogV2Ugc2VuZCBbPHByb3BlcnR5TmFtZT5dIGluIGNhc2Ugb2YgYSBwcm9wZXJ0eSBwYXRoIHdpdGhvdXQgYW55IG5hdmlnYXRpb24gaW52b2x2ZWQgKi9cblx0XHRcdC8qIEluIGNhc2Ugb2YgYSBwYXRoIGludm9sdmluZyBuYXZpZ2F0aW9ucywgd2Ugc2VuZCBbPG5hdmlnYXRpb25QYXRoPl0gZW5kaW5nIHdpdGggYSBuYXZpZ2F0aW9uIHByb3BlcnR5IGFuZCBub3Qgd2l0aCBhIHByb3BlcnR5ICovXG5cdFx0XHRjb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhbc2lkZUVmZmVjdFBhdGhdKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0LyogVGhlIGZhc3QgY3JlYXRpb24gcm93ICh0cmFuc2llbnQgY29udGV4dCkgY2FuwrR0IGhhdmUgaW5zdGFudCBzcGVjaWZpYyAoZHluYW1pYykgcmVhZC1vbmx5IGZpZWxkcywgdGhlcmVmb3JlIHdlIGRvbsK0dCBuZWVkIHRvIGhhbmRsZS9jb25zaWRlciB0aGlzIGNhc2Ugc3BlY2lmaWNhbGx5ICovXG5cdFx0XHQvKiBBZGRpdGlvbmFsIGluZm9zOiAqL1xuXHRcdFx0LyogVGhlIGZhc3QgY3JlYXRpb24gcm93IGlzIG9ubHkgdXNlZCBieSBTRCAqL1xuXHRcdFx0LyogVGhlIGdyb3VwIElEICh0aGlyZCBhcmd1bWVudCBvZiBzZXRQcm9wZXJ0eSBkZXNjcmliZWQgYXBpIGRvY3VtZW50YXRpb24gb2YgdGhlIENvbnRleHQpIGlzIHVzZWQgZm9yIHRoZSBQQVRDSCByZXF1ZXN0LCBpZiBub3Qgc3BlY2lmaWVkLCB0aGUgdXBkYXRlIGdyb3VwIElEIGZvciB0aGUgY29udGV4dCdzIGJpbmRpbmcgaXMgdXNlZCwgJ251bGwnIHRvIHByZXZlbnQgdGhlIFBBVENIIHJlcXVlc3QgKi9cblx0XHRcdC8qIFRoZSBUcmFuc2llbnQgY29udGV4dCBjYW5ub3QgcmVxdWVzdCBTaWRlRWZmZWN0cyBhbmQgIGNhbm5vdCBwYXRjaCB2aWEgZ3JvdXAgJ251bGwnICovXG5cdFx0XHRjb250ZXh0LnNldFByb3BlcnR5KG91dFBhcmFtZXRlci5zb3VyY2UsIG91dFZhbHVlc1tvdXRQYXJhbWV0ZXIuaGVscFBhdGhdKTtcblx0XHR9XG5cdFx0LyogSWYgdGhlIGtleSBnZXRzIHVwZGF0ZWQgdmlhIG91dC1wYXJhbWV0ZXIsIHRoZW4gdGhlIGRlc2NyaXB0aW9uIG5lZWRzIGFsc28gcmV0cmlldmVkIHdpdGggcmVxdWVzdFNpZGVFZmZlY3RzICovXG5cdFx0Y29uc3QgdGV4dFBhdGggPSBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRQcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dClcblx0XHRcdD8gdGFyZ2V0UHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQucGF0aFxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0aWYgKHRleHRQYXRoICE9PSB1bmRlZmluZWQgJiYgY29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0Y29uc3QgbGFzdEluZGV4ID0gdGV4dFBhdGgubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdFBhdGggPSBsYXN0SW5kZXggPiAwID8gdGV4dFBhdGguc3Vic3RyaW5nKDAsIGxhc3RJbmRleCkgOiB0ZXh0UGF0aDtcblx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0UGF0aCBjYW4gYmUgWzxwcm9wZXJ0eU5hbWU+XSBvciBbPG5hdmlnYXRpb25QYXRoPl0gKi9cblx0XHRcdGNvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFtzaWRlRWZmZWN0UGF0aF0pO1xuXHRcdH1cblx0fSxcblxuXHRnZXRGaWx0ZXJDb25kaXRpb25zOiBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IENvbnRlbnQsIF9jb25maWc6IGFueSkge1xuXHRcdGlmICh0aGlzLmdldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9ucyh2YWx1ZUhlbHAsIGNvbnRlbnQsIChfY29uZmlnICYmIF9jb25maWcuY29udHJvbCkgfHwgKGNvbnRlbnQgJiYgY29udGVudC5nZXRDb250cm9sKCkpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHt9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxsYmFjayBpbnZva2VkIGV2ZXJ5IHRpbWUgYSB7QGxpbmsgc2FwLnVpLm1kYy5WYWx1ZUhlbHAgVmFsdWVIZWxwfSBmaXJlcyBhIHNlbGVjdCBldmVudCBvciB0aGUgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgY2hhbmdlc1xuXHQgKiBUaGlzIGNhbGxiYWNrIG1heSBiZSB1c2VkIHRvIHVwZGF0ZSBleHRlcm5hbCBmaWVsZHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVmFsdWVIZWxwIGNvbnRyb2wgaW5zdGFuY2UgcmVjZWl2aW5nIHRoZSA8Y29kZT5jb250cm9sQ2hhbmdlPC9jb2RlPlxuXHQgKiBAcGFyYW0gcmVhc29uIFJlYXNvbiB3aHkgdGhlIG1ldGhvZCB3YXMgaW52b2tlZFxuXHQgKiBAcGFyYW0gX2NvbmZpZyBDdXJyZW50IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgdGhlIGNhbGxpbmcgY29udHJvbFxuXHQgKiBAc2luY2UgMS4xMDEuMFxuXHQgKi9cblx0b25Db25kaXRpb25Qcm9wYWdhdGlvbjogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCByZWFzb246IHN0cmluZywgX2NvbmZpZzogdW5rbm93bikge1xuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0aWYgKHJlYXNvbiAhPT0gXCJDb250cm9sQ2hhbmdlXCIgfHwgcGF5bG9hZC5pc0RlZmluZUNvbmRpdGlvblZhbHVlSGVscCkge1xuXHRcdFx0Ly8gaGFuZGxlIG9ubHkgQ29udHJvbENoYW5nZSByZWFzb25cblx0XHRcdC8vIGFsc28gZG9uJ3QgaGFuZGxlIGZvciBkZWZpbmUgY29uZGl0aW9uIHZhbHVlIGhlbHAgYXMgcHJvcGFnYXRpbmcgY29uZGl0aW9ucyBvbiB0aGUgdmFsdWUgaGVscFxuXHRcdFx0Ly8gdG8gZGVmaW5lIGNvbmRpdGlvbnMgZG9lcyBub3QgbWFrZSBzZW5zZSBidXQgd291bGQgb25seSBjb25mdXNlIHVzZXJzIGJ5IGFsbG93aW5nIHJlY3Vyc2l2ZSB1c2Vcblx0XHRcdC8vIG9mIHRoZSBjb25kaXRpb24gdmFsdWUgaGVscFxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBxdWFsaWZpZXIgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdGNvbnN0IG91dFBhcmFtZXRlcnMgPSBxdWFsaWZpZXI/LnZoUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkID8gVmFsdWVMaXN0SGVscGVyLmdldE91dFBhcmFtZXRlcnMocXVhbGlmaWVyLnZoUGFyYW1ldGVycykgOiBbXSxcblx0XHRcdGZpZWxkID0gdmFsdWVIZWxwLmdldENvbnRyb2woKSBhcyBGaWVsZEJhc2UsXG5cdFx0XHRmaWVsZFBhcmVudCA9IGZpZWxkLmdldFBhcmVudCgpIGFzIEZpbHRlckJhckJhc2UgfCBDb250cm9sO1xuXG5cdFx0bGV0IGNvbmRpdGlvbnMgPSBmaWVsZC5nZXRDb25kaXRpb25zKCkgYXMgQ29uZGl0aW9uT2JqZWN0W107XG5cdFx0Y29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChjb25kaXRpb24pIHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSAoY29uZGl0aW9uLnBheWxvYWQgfHwge30pIGFzIENvbmRpdGlvblBheWxvYWRNYXA7XG5cdFx0XHRyZXR1cm4gY29uZGl0aW9uUGF5bG9hZE1hcFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl07XG5cdFx0fSk7XG5cblx0XHRjb25zdCBsaXN0UmVwb3J0RmlsdGVyQmFyID0gdmFsdWVIZWxwLmdldFBhcmVudCgpIGFzIEZpbHRlckJhckJhc2UgfCBDb250cm9sOyAvLyBDb250cm9sIGUuZy4gRm9ybUNvbnRhaW5lclxuXHRcdGlmIChsaXN0UmVwb3J0RmlsdGVyQmFyLmlzQShGZUNvcmVDb250cm9sc0ZpbHRlckJhcikpIHtcblx0XHRcdC8vIFByb3BhZ2F0ZSB0aGUgdmFsdWUgb25seSBpZiB0aGUgRmlsdGVyRmllbGQgaXMgcGFydCBvZiB0aGUgTFItRmlsdGVyQmFyIGFsc28gaW5zaWRlIGluIEFkYXB0IEZpbHRlcnMgZGlhbG9nXG5cdFx0XHRhd2FpdCB0aGlzLl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9GaWx0ZXJCYXIoXG5cdFx0XHRcdGNvbmRpdGlvbnMsXG5cdFx0XHRcdG91dFBhcmFtZXRlcnMsXG5cdFx0XHRcdGZpZWxkUGFyZW50IGFzIEZpbHRlckJhcixcblx0XHRcdFx0cGF5bG9hZCxcblx0XHRcdFx0bGlzdFJlcG9ydEZpbHRlckJhciBhcyBGaWx0ZXJCYXJcblx0XHRcdCk7XG5cdFx0XHQvLyBMUiBTZXR0aW5ncyBEaWFsb2cgb3IgT1AgU2V0dGluZ3MgRGlhbG9nIHNoYWxsIG5vdCBwcm9wYWdhdGUgdmFsdWUgdG8gdGhlIGRpYWxvZyBmaWx0ZXJmaWVsZHMgb3IgY29udGV4dFxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPYmplY3QgUGFnZVxuXHRcdFx0LyogVG8gYXZvaWQgdGltaW5nIGlzc3VlIHdlIHVzZSB0aGUgQmluZGluZ0NvbnRleHQgb2YgdGhlIGNvbnRyb2wgaW5zdGVhZCBvZiB0aGUgVmFsdWVIZWxwIChCQ1AgMjM4MDA1NzIyNykgKi9cblx0XHRcdGNvbnN0IGNvbnRleHQgPSBmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9CaW5kaW5nQ29udGV4dChjb25kaXRpb25zLCBvdXRQYXJhbWV0ZXJzLCBjb250ZXh0LCB2YWx1ZUhlbHApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRfY3JlYXRlSW5pdGlhbEZpbHRlckNvbmRpdGlvbjogZnVuY3Rpb24gKHZhbHVlOiB1bmtub3duLCBpbml0aWFsVmFsdWVGaWx0ZXJFbXB0eTogYm9vbGVhbikge1xuXHRcdGxldCBjb25kaXRpb246IENvbmRpdGlvbk9iamVjdCB8IHVuZGVmaW5lZDtcblxuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJWYWx1ZUhlbHBEZWxlZ2F0ZTogdmFsdWUgb2YgdGhlIHByb3BlcnR5IGNvdWxkIG5vdCBiZSByZXF1ZXN0ZWRcIik7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuXHRcdFx0aWYgKGluaXRpYWxWYWx1ZUZpbHRlckVtcHR5KSB7XG5cdFx0XHRcdGNvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXCJFbXB0eVwiLCBbXSwgbnVsbCwgbnVsbCwgQ29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXCJFUVwiLCBbdmFsdWVdLCBudWxsLCBudWxsLCBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbmRpdGlvbjtcblx0fSxcblxuXHRfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tQmluZGluZzogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGluQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0TWFwLFxuXHRcdGNvbnRyb2w6IENvbnRyb2wsXG5cdFx0aW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWRcblx0KSB7XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRpZiAoIWJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJWYWx1ZUhlbHBEZWxlZ2F0ZTogTm8gQmluZGluZ0NvbnRleHRcIik7XG5cdFx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHRcdH1cblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250cm9sLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGNvbnN0IHJvb3RQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0bGV0IHByb3BlcnRpZXNUb1JlcXVlc3QgPSBpblBhcmFtZXRlcnMubWFwKChpblBhcmFtZXRlcikgPT4gaW5QYXJhbWV0ZXIuc291cmNlKTtcblx0XHQvKiBJbiBjYXNlIG9mIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nLCB3aGljaCBjYW4gYmUgaWRlbnRpZmllZCBieSB0aGUgcGF0aCBcIiRQYXJhbWV0ZXJcIiwgdGhlIGJpbmRpbmcgY29udGV4dCBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIGluLXBhcmFtZXRlcnMuICovXG5cdFx0LyogV2UgbmVlZCB0byByZXF1ZXN0IHRoZSBpbi1wYXJhbWV0ZXIgdmFsdWVzIHJlbGF0aXZlIHRvIHRoZSBiaW5kaW5nIGNvbnRleHQuXG5JbiBzb21lIGNhc2VzIChlLmcuIG11bHRpIHZhbHVlIGZpZWxkKSwgdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCBwb2ludCB0byB0aGVcblZIIGFubm90YXRpb24gdGFyZ2V0LCB0aHVzIHdlIGlkZW50aWZ5IHRoZSBuZWVkZWQgbmF2aWdhdGlvbiByZWxhdGlvbiBieVxucmVkdWNpbmcgdGhlIHBheWxvYWQucHJvcGVydHlQYXRoIGJ5IHRoZSBwYXRoIGRlcml2ZWQgZnJvbSBiaW5kaW5nIGNvbnRleHQuXG5UaGlzIGNhbm5vdCBoYXBwZW4gaW4gY2FzZSBvZiBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZywgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdGggXCIkUGFyYW1ldGVyXCIuXG4qL1xuXHRcdGlmIChiaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0UGF0aCgpICE9PSBcIiRQYXJhbWV0ZXJcIikge1xuXHRcdFx0cHJvcGVydGllc1RvUmVxdWVzdCA9IHRoaXMuX2J1aWxkUHJvcGVydGllc1RvUmVxdWVzdChwcm9wZXJ0aWVzVG9SZXF1ZXN0LCByb290UGF0aCwgbWV0YU1vZGVsLCBwYXlsb2FkLnByb3BlcnR5UGF0aCk7XG5cdFx0fVxuXHRcdC8vIEFjY29yZGluZyB0byBvZGF0YSB2NCBhcGkgZG9jdW1lbnRhdGlvbiBmb3IgcmVxdWVzdFByb3BlcnR5OiBQcm9wZXJ0eSB2YWx1ZXMgdGhhdCBhcmUgbm90IGNhY2hlZCB5ZXQgYXJlIHJlcXVlc3RlZCBmcm9tIHRoZSBiYWNrIGVuZFxuXHRcdGNvbnN0IHZhbHVlcyA9IGF3YWl0IGJpbmRpbmdDb250ZXh0LnJlcXVlc3RQcm9wZXJ0eShwcm9wZXJ0aWVzVG9SZXF1ZXN0KTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaW5QYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBpblBhcmFtZXRlciA9IGluUGFyYW1ldGVyc1tpXTtcblx0XHRcdGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuX2NyZWF0ZUluaXRpYWxGaWx0ZXJDb25kaXRpb24odmFsdWVzW2ldLCBpblBhcmFtZXRlci5pbml0aWFsVmFsdWVGaWx0ZXJFbXB0eSk7XG5cblx0XHRcdGlmIChjb25kaXRpb24pIHtcblx0XHRcdFx0aW5Db25kaXRpb25zW2luUGFyYW1ldGVyLmhlbHBQYXRoXSA9IFtjb25kaXRpb25dO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHR9LFxuXG5cdF9idWlsZFByb3BlcnRpZXNUb1JlcXVlc3Q6IGZ1bmN0aW9uIChwcm9wZXJ0aWVzVG9SZXF1ZXN0OiBzdHJpbmdbXSwgcm9vdFBhdGg6IHN0cmluZywgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgcHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHQvKlxuXHRcdFRoZSBpblBhcmFtZXRlcnMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBoZWxwIGRlZmluaXRpb24sIGkuZS4gdGhlaXIgc291cmNlIGlzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgYW5ub3RhdGlvbiB0YXJnZXQgKG9yIG1vcmUgcHJlY2lzZWx5IHRoZSBFbnRpdHlTZXQgdGhlIGFubm90YXRpb24gdGFyZ2V0IGJlbG9uZ3MgdG8pLiBUaGUgYW5ub3RhdGlvbiB0YXJnZXQgaXMgdGhlIHByb3BlcnR5IHRoZSB2YWx1ZSBoZWxwIGlzIGRlZmluZWQgZm9yLlxuXHRcdFRvIHJlcXVlc3QgdGhlIHZhbHVlcyBmb3IgdGhlIGluUGFyYW1ldGVycyBmcm9tIHRoZSBiaW5kaW5nQ29udGV4dCAodGhlIGNvbnRyb2wgaXMgYm91bmQgdG8pLCB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSB0aGlzIHRvIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgYmluZGluZ0NvbnRleHQuIFRoaXMgZGlmZmVycywgaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkIGZvciBhIGRpcmVjdCBwcm9wZXJ0eSwgYnV0IHdpdGggYSBwYXRoIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIChlc3AuIG5lY2Vzc2FyeSB0byBkZWZpbmUgbXVsdGkgdmFsdWUgZmllbGRzKS5cblx0XHRUbyBtYWtlIHRoaXMgdHJhbnNsYXRpb24gcG9zc2libGUsIHRoZSBwYXlsb2FkIHByb3ZpZGVzIHRoZSBwcm9wZXJ0eVBhdGgsIHdoaWNoIGlzIGFuIGFic29sdXRlIG1ldGFQYXRoIHRvIHRoZSBwcm9wZXJ0eSAoaS5lLiBpbmNsdWRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbWV0YVBhdGggZm9yIHRoZSBiaW5kaW5nIGNvbnRleHQgYW5kIHRoZSBhZGRpdGlvbmFsIHBhdGggdGhlIHByb3BlcnR5IGlzIGJvdW5kIHRvKS5cblxuXHRcdFNvIGZhciwgdGhpcyBtZWFucyB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBtZXRhUGF0aCBvZiB0aGUgYmluZGluZ0NvbnRleHQgZnJvbSB0aGUgbGVmdCBzaWRlLCBhbmQgdGhlIGxhc3Qgc2VnbWVudCAodGhlIHByb3BlcnR5IGl0c2VsZikgZnJvbSB0aGUgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHByb3BlcnR5UGF0aCBwcm92aWRlZCBpbiB0aGUgcGF5bG9hZCwgdG8gZ2V0IGEgbWV0YVBhdGggZnJvbSB0aGUgYmluZGluZyBjb250ZXh0IHRvIHRoZSBhbm5vdGF0aW9uIHRhcmdldC5cblx0XHRJZiB0aGlzIG1ldGFQYXRoIGNvbnRhaW5zIDE6bi1uYXZpZ2F0aW9ucyAod2hpY2ggY2Fubm90IGJlIHRyYW5zbGF0ZWQgYmFjayB0byBhIHBhdGgsIGFzIHRoaXMgd291bGQgbWVhbiB0byBhZGQgY29ycmVzcG9uZGluZyBrZXlzLCB3aGljaCBhcmUgbm90IGtub3duKSwgdGhlIHNvdXJjZSBwYXRoIGluIHRoZSBpblBhcmFtZXRlciBkZWZpbml0aW9uIG9mIHRoZSB2YWx1ZSBuZWVkcyB0byBwb2ludCBiYWNrIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIHBhcnRuZXIgbmF2aWdhdGlvbihzKSB0byBhdm9pZCBhbWJpZ3VvdXMgZGVmaW5pdGlvbiBvZiBob3cgdG8gZ2V0IGl0cyB2YWx1ZS5cblx0XHRUaHVzLCB3ZSBjYW4gYW5kIG5lZWQgdG8gbWF0Y2ggYW5kIHJlZHVjZSB0aGUgcGFydHMgb2YgdGhpcyByZWxhdGl2ZSBtZXRhUGF0aCBmcm9tIHRoZSByaWdodCBzaWRlIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgcGFydHMgb2YgdGhlIGluUGFyYW1ldGVycyBzb3VyY2UgZGVmaW5pdGlvbiBmcm9tIHRoZSBsZWZ0IHNpZGUgYnkgY2hlY2tpbmcgd2hldGhlciB0aGV5IGFyZSBjb3JyZXNwb25kaW5nIHBhcnRuZXIgbmF2aWdhdGlvbnMuIFdoZW4gd2UgYXJlIGRvbmUgKG5vIG1vcmUgcGFydHMgaW4gcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCwgbm8gbW9yZSBwYXJ0cyBpbiByZWR1Y2VkIGluUGFyYW1ldGVyIHNvdXJjZSBwYXRoLCBvciBtb3N0IHJpZ2h0IHBhcnQgaW4gcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCBpcyBub3QgdGhlIHBhcnRuZXIgb2YgbW9zdCBsZWZ0IHBhcnQgaW4gcmVkdWNlZCBpblBhcmFtZXRlciBzb3VyY2UpLCBuZWl0aGVyIHJlZHVjZWQgcmVsYXRpdmUgbWV0YVBhdGggbm9yIHJlZHVjZWQgaW5QYXJhbWV0ZXIgc291cmNlIHBhdGggbWF5IGNvbnRhaW4gYW55IDE6bi1uYXZpZ2F0aW9uIHByb3BlcnRpZXMuXG5cdFx0SWYgdGhpcyBjb25kaXRpb24gaXMgZnVsZmlsbGVkLCB3ZSBjYW4gY29tYmluZSB0aGUgYW5kIHJlcXVlc3QgZnJvbSB0aGUgZ2l2ZW4gYmluZGluZyBjb250ZXh0LiBJZiBub3QsIHRoZSB2YWx1ZSBoZWxwIGRlZmluaXRpb24gZG9lcyBub3QgYWxsb3cgdG8gcmV0cmlldmUgdGhlIGluUGFyYW1ldGVycyB2YWx1ZSBpbiBhbiB1bmFtYmlndW91cyB3YXksIGkudC4gdGhlIHZhbHVlIGhlbHAgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5LlxuXHRcdCovXG5cdFx0Ly8gY29tbW9uIGZvciBhbGwgaW5QYXJhbWV0ZXJzXG5cdFx0bGV0IG1ldGFNb2RlbENvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQocm9vdFBhdGgpIGFzIENvbnRleHQ7XG5cdFx0Y29uc3QgcmVsYXRpdmVQYXRoUGFydHMgPSBwcm9wZXJ0eVBhdGhcblx0XHRcdC5zbGljZShyb290UGF0aC5sZW5ndGgpIC8vIHJlbW92ZSByb290IHBhdGhcblx0XHRcdC5zcGxpdChcIi9cIikgLy8gdHJhbnNmb3JtIHRvIGFycmF5XG5cdFx0XHQuc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSBmaXJzdCAoZW1wdHksIGFzIHJvb3RQYXRoIHByb3ZpZGVkIHdpdGhvdXQgZW5kaW5nIFwiL1wiKSwgYW5kIGxhc3QgKHByb3BlcnR5IHRoZSBWSCBpcyBhdHRhY2hlZCB0bykgcGFydFxuXHRcdFx0Lm1hcCgocGFydCkgPT4ge1xuXHRcdFx0XHQvLyBkZXRlcm1pbmUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lIGFuZCBjb3JyZXNwb25kaW5nIHBhcnRuZXIgZm9yIGVhY2ggbmF2aWdhdGlvbiBzdGVwXG5cdFx0XHRcdG1ldGFNb2RlbENvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQocGFydCwgbWV0YU1vZGVsQ29udGV4dCkgYXMgQ29udGV4dDtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRwYXJ0OiBwYXJ0LFxuXHRcdFx0XHRcdHBhcnRuZXI6IG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KCkuJFBhcnRuZXJcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHRcdC8vIGFjdHVhbCByZWR1Y3Rpb24gcGVyIGluUGFyYW1ldGVyXG5cdFx0cmV0dXJuIHByb3BlcnRpZXNUb1JlcXVlc3QubWFwKChsb2NhbERhdGFQYXRoKSA9PiB7XG5cdFx0XHRjb25zdCBsb2NhbERhdGFQYXJ0cyA9IGxvY2FsRGF0YVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3QgbWF0Y2hDb3VudCA9IGxvY2FsRGF0YVBhcnRzLmZpbmRJbmRleChcblx0XHRcdFx0KFxuXHRcdFx0XHRcdHBhcnQsXG5cdFx0XHRcdFx0aW5kZXggLy8gZmluZCBmaXJzdCBub24tbWF0Y2hpbmcgaW5kZXhcblx0XHRcdFx0KSA9PiByZWxhdGl2ZVBhdGhQYXJ0c1staW5kZXhdPy5wYXJ0bmVyICE9PSBwYXJ0XG5cdFx0XHQpOyAvLyByZWxhdGl2ZVBhdGhQYXJ0cyB0byBtYXRjaCBmcm9tIHRoZSBlbmQgKD0+IFwiLWluZGV4XCIpIHRvIGxvY2FsRGF0YVBhcnRzIGZyb20gdGhlIGJlZ2lubmluZ1xuXHRcdFx0Ly8gbGFzdCBwYXJ0IG9mIGxvY2FsRGF0YSBpcyBhIHByb3BlcnR5IG5hbWUsIHRodXMgaXQgY2Fubm90IG1hdGNoLiBPdGhlcndpc2UgbWF0Y2hDb3VudCBjb3VsZCBiZSAtMSBpZiBldmVyeXRoaW5nIG1hdGNoZXNcblx0XHRcdC8vIChpZiB3ZSB3YW50IHRvIGFkZGl0aW9uYWxseSBzZWN1cmUgYWdhaW5zdCB0aGlzIHNpdHVhdGlvbiwgdGhlIG1vc3QgYXBwcm9wcmlhdGUgd291bGQgYmUgdG8gc2V0IG1hdGNoQ291bnQgPSBsb2NhbERhdGFQYXJ0cy5sZW5ndGgg4oCTIDEpXG5cdFx0XHRyZXR1cm4gcmVsYXRpdmVQYXRoUGFydHNcblx0XHRcdFx0LnNsaWNlKDAsIC1tYXRjaENvdW50KSAvLyByZW1vdmUgYWxsIG1hdGNoZWQgcGFydHMgKGZyb20gdGhlIGVuZClcblx0XHRcdFx0Lm1hcCgocGFydCkgPT4gcGFydC5wYXJ0KVxuXHRcdFx0XHQuY29uY2F0KGxvY2FsRGF0YVBhcnRzLnNsaWNlKG1hdGNoQ291bnQpKSAvLyByZW1vdmUgdGhlIG1hdGNoZWQgcGFydHMgZnJvbSBsb2NhbERhdGEgKGZyb20gdGhlIGJlZ2lubmluZylcblx0XHRcdFx0LmpvaW4oXCIvXCIpOyAvLyB0cmFuc2ZlciBiYWNrIHRvIHN0cmluZyAoYnV0IG9ubHkgb25jZSBhdCB0aGUgZW5kIDspIClcblx0XHR9KTtcblx0fSxcblxuXHRfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tRmlsdGVyQmFyOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0aW5Db25kaXRpb25zOiBDb25kaXRpb25PYmplY3RNYXAsXG5cdFx0Y29udHJvbDogQ29udHJvbCxcblx0XHRpblBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW11cblx0KSB7XG5cdFx0Y29uc3QgZmlsdGVyQmFyID0gY29udHJvbC5nZXRQYXJlbnQoKSBhcyBGaWx0ZXJCYXJCYXNlO1xuXHRcdGNvbnN0IHN0YXRlOiBFeHRlcm5hbFN0YXRlVHlwZSA9IGF3YWl0IFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUoZmlsdGVyQmFyKTtcblxuXHRcdGZvciAoY29uc3QgaW5QYXJhbWV0ZXIgb2YgaW5QYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25zID0gdGhpcy5fZ2V0Q29uZGl0aW9uc0Zyb21JblBhcmFtZXRlcihpblBhcmFtZXRlciwgc3RhdGUpO1xuXHRcdFx0aWYgKGNvbmRpdGlvbnMpIHtcblx0XHRcdFx0aW5Db25kaXRpb25zW2luUGFyYW1ldGVyLmhlbHBQYXRoXSA9IGNvbmRpdGlvbnM7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBpbkNvbmRpdGlvbnM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGZpbHRlciBjb25kaXRpb25zLlxuXHQgKiBSZWdhcmRpbmcgYSBuYXZpZ2F0aW9uIHBhdGggaW4gdGhlIEluT3V0IHBhcmFtZXRlcnMgYW5kIGRpc3JlZ2FyZGluZyBwcmVmaXhlcyBpbiB0aGUgbmF2aWdhdGlvbiBwYXRoIGxpa2UgZS5nLiAnJGZpbHRlcnM+L2NvbmRpdGlvbnMvJyBvciAnb3duZXInLlxuXHQgKlxuXHQgKiBAcGFyYW0gaW5QYXJhbWV0ZXIgSW5QYXJtZXRlciBvZiB0aGUgZmlsdGVyIGZpZWxkIHZhbHVlIGhlbHBcblx0ICogQHBhcmFtIHN0YXRlIFRoZSBleHRlcm5hbCBmaWx0ZXIgc3RhdGVcblx0ICogQHJldHVybnMgVGhlIGZpbHRlciBjb25kaXRpb25zXG5cdCAqIEBzaW5jZSAxLjExNC4wXG5cdCAqL1xuXHRfZ2V0Q29uZGl0aW9uc0Zyb21JblBhcmFtZXRlcjogZnVuY3Rpb24gKGluUGFyYW1ldGVyOiBJbk91dFBhcmFtZXRlciwgc3RhdGU6IEV4dGVybmFsU3RhdGVUeXBlKSB7XG5cdFx0Y29uc3Qgc291cmNlRmllbGQgPSBpblBhcmFtZXRlci5zb3VyY2U7XG5cdFx0Y29uc3Qga2V5ID0gT2JqZWN0LmtleXMoc3RhdGUuZmlsdGVyKS5maW5kKChrZXkpID0+IChcIi9cIiArIHNvdXJjZUZpZWxkKS5lbmRzV2l0aChcIi9cIiArIGtleSkpOyAvL2FkZGl0aW9uYWwgJy8nIHRvIGhhbmRsZSBoZWFkaW5nIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSBuYW1lIGlmIHRoZXJlIGlzIG5vIHBhdGhcblx0XHRyZXR1cm4ga2V5ICYmIHN0YXRlLmZpbHRlcltrZXldO1xuXHR9LFxuXG5cdF9wYXJ0aXRpb25JblBhcmFtZXRlcnM6IGZ1bmN0aW9uIChpblBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW10pIHtcblx0XHRjb25zdCBpblBhcmFtZXRlck1hcDogUmVjb3JkPHN0cmluZywgSW5PdXRQYXJhbWV0ZXJbXT4gPSB7XG5cdFx0XHRjb25zdGFudDogW10sXG5cdFx0XHRiaW5kaW5nOiBbXSxcblx0XHRcdGZpbHRlcjogW11cblx0XHR9O1xuXG5cdFx0Zm9yIChjb25zdCBpblBhcmFtZXRlciBvZiBpblBhcmFtZXRlcnMpIHtcblx0XHRcdGlmIChpblBhcmFtZXRlci5jb25zdGFudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJNYXAuY29uc3RhbnQucHVzaChpblBhcmFtZXRlcik7XG5cdFx0XHR9IGVsc2UgaWYgKGluUGFyYW1ldGVyLnNvdXJjZS5pbmRleE9mKFwiJGZpbHRlclwiKSA9PT0gMCkge1xuXHRcdFx0XHRpblBhcmFtZXRlck1hcC5maWx0ZXIucHVzaChpblBhcmFtZXRlcik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpblBhcmFtZXRlck1hcC5iaW5kaW5nLnB1c2goaW5QYXJhbWV0ZXIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5QYXJhbWV0ZXJNYXA7XG5cdH0sXG5cblx0X3RhYmxlQWZ0ZXJSZW5kZXJEZWxlZ2F0ZToge1xuXHRcdG9uQWZ0ZXJSZW5kZXJpbmc6IGZ1bmN0aW9uIChldmVudDogalF1ZXJ5LkV2ZW50ICYgeyBzcmNDb250cm9sOiBDb250cm9sIH0pIHtcblx0XHRcdGNvbnN0IHRhYmxlID0gZXZlbnQuc3JjQ29udHJvbCwgLy8gbS5UYWJsZVxuXHRcdFx0XHR0YWJsZUNlbGxzRG9tUmVmcyA9IHRhYmxlLiQoKS5maW5kKFwidGJvZHkgLnNhcE1UZXh0XCIpLFxuXHRcdFx0XHRtZGNNVGFibGUgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBNVGFibGU7XG5cblx0XHRcdGhpZ2hsaWdodERPTUVsZW1lbnRzKHRhYmxlQ2VsbHNEb21SZWZzLCBtZGNNVGFibGUuZ2V0RmlsdGVyVmFsdWUoKSwgdHJ1ZSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyBhbiBpbml0aWFsIGNvbmRpdGlvbiBjb25maWd1cmF0aW9uIGV2ZXJ5dGltZSBhIHZhbHVlIGhlbHAgY29udGVudCBpcyBzaG93bi5cblx0ICpcblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBWYWx1ZUhlbHAgY29udGVudCByZXF1ZXN0aW5nIGNvbmRpdGlvbnMgY29uZmlndXJhdGlvblxuXHQgKiBAcGFyYW0gY29udHJvbCBJbnN0YW5jZSBvZiB0aGUgY2FsbGluZyBjb250cm9sXG5cdCAqIEByZXR1cm5zIFJldHVybnMgYSBtYXAgb2YgY29uZGl0aW9ucyBzdWl0YWJsZSBmb3IgYSBzYXAudWkubWRjLkZpbHRlckJhciBjb250cm9sXG5cdCAqIEBzaW5jZSAxLjEwMS4wXG5cdCAqL1xuXHRnZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9uczogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBDb250ZW50LCBjb250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkKSB7XG5cdFx0Ly8gaGlnaGxpZ2h0IHRleHQgaW4gVmFsdWVIZWxwIHBvcG92ZXJcblx0XHRpZiAoY29udGVudD8uaXNBKFwic2FwLnVpLm1kYy52YWx1ZWhlbHAuY29udGVudC5NVGFibGVcIikpIHtcblx0XHRcdGNvbnN0IHBvcG92ZXJUYWJsZSA9IChjb250ZW50IGFzIE1UYWJsZSkuZ2V0VGFibGUoKTtcblx0XHRcdHBvcG92ZXJUYWJsZT8ucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGUpO1xuXHRcdFx0cG9wb3ZlclRhYmxlPy5hZGRFdmVudERlbGVnYXRlKHRoaXMuX3RhYmxlQWZ0ZXJSZW5kZXJEZWxlZ2F0ZSwgdGhpcyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRjb25zdCBpbkNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdE1hcCA9IHt9O1xuXG5cdFx0Ly8gRm9yIGRlZmluZSBjb25kaXRpb25zIHZhbHVlaGVscCBpbml0aWFsIGZpbHRlciBjb25kaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHRoZSBjb250cm9sIG9mIHRoZSBkZWZpbmUgY29uZGl0aW9uc1xuXHRcdC8vIGlzIGNsb25lZCBhbmQgbm90IHRoZSBvcmlnaW5hbCBvbmUgdG8gd2hpY2ggZmllbGQgdmFsdWVoZWxwIHdhcyBhdHRhY2hlZC4gQW5kIGFzIGEgcmVzdWx0IHdlIGNhbm5vdCBnZXQgaW4gcGFyYW1ldGVyIHZhbHVlLiBGb3Igc2ltcGxpY2l0eVxuXHRcdC8vIHdlIGp1c3Qgc2tpcCB0aGUgcmVzdCBvZiB0aGUgY29kZSByZWxhdGVkIHRvIGZpbHRlciBjb25kaXRpb25zLlxuXHRcdGlmIChwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHRcdH1cblxuXHRcdGlmICghY29udHJvbCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IENvbnRyb2wgdW5kZWZpbmVkXCIpO1xuXHRcdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0XHR9XG5cblx0XHRjb25zdCBxdWFsaWZpZXIgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHF1YWxpZmllcj8udmhQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBWYWx1ZUxpc3RIZWxwZXIuZ2V0SW5QYXJhbWV0ZXJzKHF1YWxpZmllci52aFBhcmFtZXRlcnMpIDogW107XG5cdFx0Y29uc3QgaW5QYXJhbWV0ZXJNYXAgPSB0aGlzLl9wYXJ0aXRpb25JblBhcmFtZXRlcnMoaW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBpc09iamVjdFBhZ2UgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRmb3IgKGNvbnN0IGluUGFyYW1ldGVyIG9mIGluUGFyYW1ldGVyTWFwLmNvbnN0YW50KSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb24gPSB0aGlzLl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uKFxuXHRcdFx0XHRpblBhcmFtZXRlci5jb25zdGFudFZhbHVlLFxuXHRcdFx0XHRpc09iamVjdFBhZ2UgPyBpblBhcmFtZXRlci5pbml0aWFsVmFsdWVGaWx0ZXJFbXB0eSA6IGZhbHNlIC8vIG5vIGZpbHRlciB3aXRoIFwiZW1wdHlcIiBvbiBMaXN0UmVwb3J0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKGNvbmRpdGlvbikge1xuXHRcdFx0XHRpbkNvbmRpdGlvbnNbaW5QYXJhbWV0ZXIuaGVscFBhdGhdID0gW2NvbmRpdGlvbl07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGluUGFyYW1ldGVyTWFwLmJpbmRpbmcubGVuZ3RoKSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9uc0Zyb21CaW5kaW5nKGluQ29uZGl0aW9ucywgY29udHJvbCwgaW5QYXJhbWV0ZXJNYXAuYmluZGluZywgcGF5bG9hZCk7XG5cdFx0fVxuXG5cdFx0aWYgKGluUGFyYW1ldGVyTWFwLmZpbHRlci5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IHRoaXMuX2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUZpbHRlckJhcihpbkNvbmRpdGlvbnMsIGNvbnRyb2wsIGluUGFyYW1ldGVyTWFwLmZpbHRlcik7XG5cdFx0fVxuXHRcdHJldHVybiBpbkNvbmRpdGlvbnM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBwb3NzaWJpbGl0eSB0byBjb252ZXkgY3VzdG9tIGRhdGEgaW4gY29uZGl0aW9ucy5cblx0ICogVGhpcyBlbmFibGVzIGFuIGFwcGxpY2F0aW9uIHRvIGVuaGFuY2UgY29uZGl0aW9ucyB3aXRoIGRhdGEgcmVsZXZhbnQgZm9yIGNvbWJpbmVkIGtleSBvciBvdXRwYXJhbWV0ZXIgc2NlbmFyaW9zLlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IFZhbHVlSGVscCBjb250ZW50IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBfdmFsdWVzIERlc2NyaXB0aW9uIHBhaXIgZm9yIHRoZSBjb25kaXRpb24gd2hpY2ggaXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gY29udGV4dCBPcHRpb25hbCBhZGRpdGlvbmFsIGNvbnRleHRcblx0ICogQHJldHVybnMgT3B0aW9uYWxseSByZXR1cm5zIGEgc2VyaWFsaXphYmxlIG9iamVjdCB0byBiZSBzdG9yZWQgaW4gdGhlIGNvbmRpdGlvbiBwYXlsb2FkIGZpZWxkXG5cdCAqIEBzaW5jZSAxLjEwMS4wXG5cdCAqL1xuXHRjcmVhdGVDb25kaXRpb25QYXlsb2FkOiBmdW5jdGlvbiAoXG5cdFx0dmFsdWVIZWxwOiBWYWx1ZUhlbHAsXG5cdFx0Y29udGVudDogQ29udGVudCxcblx0XHRfdmFsdWVzOiB1bmtub3duW10sXG5cdFx0Y29udGV4dDogQ29udGV4dFxuXHQpOiBDb25kaXRpb25QYXlsb2FkTWFwIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGNvbnN0IHF1YWxpZmllciA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0sXG5cdFx0XHRlbnRyeTogQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSB7fSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRNYXAgPSB7fTtcblx0XHRjb25zdCBjb250cm9sID0gY29udGVudC5nZXRDb250cm9sKCk7XG5cdFx0Y29uc3QgaXNNdWx0aVZhbHVlRmllbGQgPSBjb250cm9sPy5pc0EoXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKTtcblx0XHRpZiAoIXF1YWxpZmllci52aEtleXMgfHwgcXVhbGlmaWVyLnZoS2V5cy5sZW5ndGggPT09IDEgfHwgaXNNdWx0aVZhbHVlRmllbGQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHF1YWxpZmllci52aEtleXMuZm9yRWFjaChmdW5jdGlvbiAodmhLZXkpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gY29udGV4dC5nZXRPYmplY3QodmhLZXkpO1xuXHRcdFx0aWYgKHZhbHVlICE9IG51bGwpIHtcblx0XHRcdFx0ZW50cnlbdmhLZXldID0gdmFsdWU/Lmxlbmd0aCA9PT0gMCA/IFwiXCIgOiB2YWx1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoZW50cnkpLmxlbmd0aCkge1xuXHRcdFx0LyogdmggcXVhbGlmaWVyIGFzIGtleSBmb3IgcmVsZXZhbnQgY29uZGl0aW9uICovXG5cdFx0XHRjb25kaXRpb25QYXlsb2FkW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXSA9IFtlbnRyeV07XG5cdFx0fVxuXHRcdHJldHVybiBjb25kaXRpb25QYXlsb2FkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyB0aGUgcG9zc2liaWxpdHkgdG8gY3VzdG9taXplIHNlbGVjdGlvbnMgaW4gJ1NlbGVjdCBmcm9tIGxpc3QnIHNjZW5hcmlvcy5cblx0ICogQnkgZGVmYXVsdCwgb25seSBjb25kaXRpb24ga2V5cyBhcmUgY29uc2lkZXJlZC4gVGhpcyBtYXkgYmUgZXh0ZW5kZWQgd2l0aCBwYXlsb2FkIGRlcGVuZGVudCBmaWx0ZXJzLlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IFZhbHVlSGVscCBjb250ZW50IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBpdGVtIEVudHJ5IG9mIGEgZ2l2ZW4gbGlzdFxuXHQgKiBAcGFyYW0gY29uZGl0aW9ucyBDdXJyZW50IGNvbmRpdGlvbnNcblx0ICogQHJldHVybnMgVHJ1ZSwgaWYgaXRlbSBpcyBzZWxlY3RlZFxuXHQgKiBAc2luY2UgMS4xMDEuMFxuXHQgKi9cblx0aXNGaWx0ZXJhYmxlTGlzdEl0ZW1TZWxlY3RlZDogZnVuY3Rpb24gKFxuXHRcdHZhbHVlSGVscDogVmFsdWVIZWxwLFxuXHRcdGNvbnRlbnQ6IEZpbHRlcmFibGVMaXN0Q29udGVudCxcblx0XHRpdGVtOiBDb250cm9sLFxuXHRcdGNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdXG5cdCkge1xuXHRcdC8vSW4gdmFsdWUgaGVscCBkaWFsb2dzIG9mIHNpbmdsZSB2YWx1ZSBmaWVsZHMgdGhlIHJvdyBmb3IgdGhlIGtleSBzaG91bGRuwrR0IGJlIHNlbGVjdGVkL2hpZ2hsaWdodCBhbnltb3JlIEJDUDogMjI3MDE3NTI0NlxuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0aWYgKHBheWxvYWQuaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMgIT09IHRydWUgJiYgKGNvbnRlbnQuZ2V0Q29uZmlnKCkgYXMgeyBtYXhDb25kaXRpb25zPzogbnVtYmVyIH0pPy5tYXhDb25kaXRpb25zID09PSAxKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29udGV4dCA9IGl0ZW0uZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdC8qIERvIG5vdCBjb25zaWRlciBcIk5vdFZhbGlkYXRlZFwiIGNvbmRpdGlvbnMgKi9cblx0XHRjb25kaXRpb25zID0gY29uZGl0aW9ucy5maWx0ZXIoKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uLnZhbGlkYXRlZCA9PT0gQ29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZCk7XG5cblx0XHRjb25zdCBzZWxlY3RlZENvbmRpdGlvbiA9IGNvbmRpdGlvbnMuZmluZChmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTWFwID0gY29uZGl0aW9uPy5wYXlsb2FkIGFzIENvbmRpdGlvblBheWxvYWRNYXAgfCB1bmRlZmluZWQsXG5cdFx0XHRcdHZhbHVlSGVscFF1YWxpZmllciA9IHBheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyIHx8IFwiXCI7XG5cdFx0XHRpZiAoIWNvbmRpdGlvblBheWxvYWRNYXApIHtcblx0XHRcdFx0Y29uc3Qga2V5UGF0aCA9IGNvbnRlbnQuZ2V0S2V5UGF0aCgpO1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dD8uZ2V0T2JqZWN0KGtleVBhdGgpID09PSBjb25kaXRpb24/LnZhbHVlc1swXTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGNvbmRpdGlvblNlbGVjdGVkUm93ID0gY29uZGl0aW9uUGF5bG9hZE1hcD8uW3ZhbHVlSGVscFF1YWxpZmllcl0/LlswXSB8fCB7fSxcblx0XHRcdFx0c2VsZWN0ZWRLZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uU2VsZWN0ZWRSb3cpO1xuXHRcdFx0aWYgKHNlbGVjdGVkS2V5cy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIHNlbGVjdGVkS2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIChjb25kaXRpb25TZWxlY3RlZFJvd1trZXldIGFzIHVua25vd24pID09PSBjb250ZXh0Py5nZXRPYmplY3Qoa2V5KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gc2VsZWN0ZWRDb25kaXRpb24gPyB0cnVlIDogZmFsc2U7XG5cdH0sXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGNvbnRleHRzIGZvciBhZGRpdGlvbmFsIHZhbHVlcyBhbmQgcmVzdW1lcyB0aGUgbGlzdCBiaW5kaW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBhZGRpdGlvbmFsVmFsdWVzIEFycmF5IG9mIEFkZGl0aW9uYWxWYWx1ZXNcblx0ICovXG5cdF91cGRhdGVCaW5kaW5nRm9yUmVjb21tZW5kYXRpb25zOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0cGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRiaW5kaW5nSW5mbzogQWdncmVnYXRpb25CaW5kaW5nSW5mbyxcblx0XHRhZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW11cblx0KSB7XG5cdFx0bGV0IHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZVJlc29sdmU6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdC8vY3JlYXRlIGEgcHJvbWlzZSB0byBtYWtlIHN1cmUgY2hlY2tMaXN0QmluZGluZ1BlbmRpbmcgaXMgb25seSBjb21wbGV0ZWQgb25jZSB0aGlzIHByb21pc2UgaXMgcmVzb2x2ZWRcblx0XHRwYXlsb2FkLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdFx0XHR1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTtcblx0XHR9KTtcblx0XHR0cnkge1xuXHRcdFx0Ly9zb3J0IGFuZCBmaWx0ZXIgdmFsdWVoZWxwYmluZGluZyB0byBtYWtlIHN1cmUgd2UgcmVuZGVyIG90aGVycyBncm91cFxuXHRcdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLnNvcnRBbmRGaWx0ZXJPdGhlcnMobGlzdEJpbmRpbmcsIGJpbmRpbmdJbmZvLCBhZGRpdGlvbmFsVmFsdWVzKTtcblx0XHRcdC8vcmVzdW1lIHRoZSBsaXN0IGJpbmRpbmcgYW5kIHRoZW4gcmVzZXQgdGhlIGNoYW5nZXNcblx0XHRcdGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5yZXN1bWVWYWx1ZUxpc3RCaW5kaW5nQW5kUmVzZXRDaGFuZ2VzKGxpc3RCaW5kaW5nKTtcblx0XHRcdC8vZmV0Y2ggdGhlIGNvbnRleHRzIG9mIGFkZGl0aW9uYWx2YWx1ZXNcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhID0gYXdhaXQgYWRkaXRpb25hbFZhbHVlSGVscGVyLnJlcXVlc3RGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YShcblx0XHRcdFx0YWRkaXRpb25hbFZhbHVlcyxcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdGJpbmRpbmdJbmZvLFxuXHRcdFx0XHRwYXlsb2FkXG5cdFx0XHQpO1xuXHRcdFx0Ly9yZW1vdmUgZHVwbGljYXRlIHZhbHVlcyBmcm9tIGRpZmZlcmVudCBncm91cHMgb2YgYWRkaXRpb25hbHZhbHVlc1xuXHRcdFx0Y29uc3QgdW5pcXVlQWRkaXRpb25hbFZhbHVlcyA9IGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5yZW1vdmVEdXBsaWNhdGVBZGRpdGlvbmFsVmFsdWVzKGFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhLCBbXG5cdFx0XHRcdC4uLmFkZGl0aW9uYWxWYWx1ZXNcblx0XHRcdF0pO1xuXHRcdFx0Ly8gYWRkIHRyYW5zaWVudCBjb250ZXh0IHRvIGxpc3QgYmluZGluZyBhZnRlciBiYWNrZW5kIHF1ZXJ5IGlzIGRvbmVcblx0XHRcdGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5jcmVhdGVBZGRpdGlvbmFsVmFsdWVUcmFuc2llbnRDb250ZXh0cyhcblx0XHRcdFx0YWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEsXG5cdFx0XHRcdHVuaXF1ZUFkZGl0aW9uYWxWYWx1ZXMucmV2ZXJzZSgpLFxuXHRcdFx0XHRsaXN0QmluZGluZ1xuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly9EbyBub3RoaW5nIGFzIHdlIGtub3cgdGhhdCByZXNldCBjaGFuZ2VzIHdvdWxkIHRocm93IGFuIGVycm9yIGluIGNvbnNvbGUgYW5kIHRoaXMgd2lsbCBwaWxlIHVwIGEgbG90IG9mIGNvbnNvbGUgZXJyb3JzXG5cdFx0fVxuXHRcdGlmICh1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VSZXNvbHZlKSB7XG5cdFx0XHQvL3Jlc29sdmUgdGhlIHByb21pc2UgYXMgZXZlcnl0aGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZVJlc29sdmUodHJ1ZSk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogRXhlY3V0ZXMgYSBmaWx0ZXIgaW4gYSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4gYW5kIHJlc3VtZXMgaXQsIGlmIHN1c3BlbmRlZC5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKi9cblx0X3VwZGF0ZUJpbmRpbmc6IGFzeW5jIGZ1bmN0aW9uIChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgYmluZGluZ0luZm86IEFnZ3JlZ2F0aW9uQmluZGluZ0luZm8pIHtcblx0XHRjb25zdCByb290QmluZGluZyA9IGxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgfHwgbGlzdEJpbmRpbmc7XG5cdFx0aWYgKCFyb290QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRyb290QmluZGluZy5zdXNwZW5kKCk7XG5cdFx0fVxuXHRcdGlmIChiaW5kaW5nSW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRsaXN0QmluZGluZy5jaGFuZ2VQYXJhbWV0ZXJzKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHRsaXN0QmluZGluZy5maWx0ZXIoYmluZGluZ0luZm8uZmlsdGVycywgRmlsdGVyVHlwZS5BcHBsaWNhdGlvbik7XG5cdFx0bGlzdEJpbmRpbmcuc29ydChiaW5kaW5nSW5mby5zb3J0ZXIpO1xuXG5cdFx0aWYgKHJvb3RCaW5kaW5nLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdHJvb3RCaW5kaW5nLnJlc3VtZSgpO1xuXHRcdFx0cm9vdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyBhbiBib29sZWFuIHZhbHVlIGlmIGFkZGl0aW9uYWx2YWx1ZXMgZXhpc3RzIHdoaWNoIHdpbGwgY29udGFpbiBkaWZmZXJlbnQgZ3JvdXBzIGxpa2UgcmVjb21tZW5kYXRpb25zLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlXG5cdCAqL1xuXHRjaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0czogZnVuY3Rpb24gKGNvbnRlbnQ6IE1UYWJsZSwgcGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCkge1xuXHRcdC8vIEZvciBkZWZpbmUgY29uZGl0aW9ucyB2YWx1ZWhlbHAgcmVjb21tZW5kYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgXCJpbnRlcm5hbFwiIG1vZGVsIGlzIG5vdCBhdmFpbGFibGUuXG5cdFx0aWYgKHBheWxvYWQuaXNEZWZpbmVDb25kaXRpb25WYWx1ZUhlbHApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IGNvbnRlbnQuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHQvL2dldCB0aGUgcmVjb21tZW5kYXRpb24gZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBtb2RlbFxuXHRcdGNvbnN0IGlucHV0VmFsdWVzID0gKGNvbnRlbnQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWwpLmdldFByb3BlcnR5KFwiL3JlY29tbWVuZGF0aW9uc0RhdGFcIikgfHwge307XG5cdFx0Ly9GZXRjaCB0aGUgcmVsZXZhbnQgcmVjb21tZW5kYXRpb25zIGJhc2VkIG9uIHRoZSBpbnB1dHZhbHVlcyBhbmQgYmluZGluZ2NvbnRleHRcblx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKFxuXHRcdFx0XHRpbnB1dFZhbHVlcyxcblx0XHRcdFx0YmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCxcblx0XHRcdFx0cGF5bG9hZC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdGNvbnRlbnQuZ2V0Q29udHJvbCgpLmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uZ2V0UGF0aCgpXG5cdFx0XHQpIHx8IFtdO1xuXHRcdGlmICh2YWx1ZXM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdC8vaWYgdGhlcmUgYXJlIHJlbGV2YW50IHJlY29tbWVuZGF0aW9ucyB0aGVuIHJldHVybiB0cnVlXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgd2hpY2ggd2lsbCB0ZWxsIHdoZXRoZXIgdHlwZWFoZWFkIHNob3VsZCBiZSBvcGVuZWQgb3Igbm90LlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IEZpbHRlcmFibGUgTGlzdCBDb250ZW50XG5cdCAqIEByZXR1cm5zIEJvb2xlYW4gdmFsdWUgd2hldGhlciB0byBzaG93IHR5cGVhaGVhZCBvciBub3Rcblx0ICovXG5cdHNob3dUeXBlYWhlYWQ6IGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogTVRhYmxlKSB7XG5cdFx0aWYgKCFjb250ZW50LmdldENvbnRyb2woKS5pc0EoXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpICYmICFjb250ZW50LmdldENvbnRyb2woKS5pc0EoXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkge1xuXHRcdFx0Y29uc3QgZmlsdGVyVmFsdWUgPSBjb250ZW50Py5nZXRGaWx0ZXJWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgdmhWYWx1ZSA9IChjb250ZW50Py5nZXRDb250cm9sKCkgYXMgRmllbGQpPy5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgZmllbGRUZXh0VmFsdWUgPSAoY29udGVudD8uZ2V0Q29udHJvbCgpIGFzIEZpZWxkKT8uZ2V0QWRkaXRpb25hbFZhbHVlKCk7XG5cdFx0XHRpZiAodmhWYWx1ZSB8fCBmaWVsZFRleHRWYWx1ZSkge1xuXHRcdFx0XHQvLyB2YWx1ZWhlbHAgaGFkIHNvbWUgdmFsdWUsIGJ1dCB1c2VyIGNsZWFyZWQgdGhlIHZhbHVlXG5cdFx0XHRcdC8vIGluIHN1Y2ggY2FzZSB3ZSBnZXQgaW5wdXQgdmFsdWUgYXMgJycgYW5kIHdlIHdpbGwgcmV0dXJuIGZhbHNlXG5cdFx0XHRcdC8vTm90ZTogSW4gU0RzIHVzZWNhc2Ugd2Ugd2FudGVkIHRvIG9wZW4gdGhlIHR5cGVBaGVhZCBpZiB0aGVyZSBhcmUgcmVjb21tZW5kYXRpb25zIGFuZCB2YWx1ZSBpcyBibGFuaywgdGhleSBzaG91bGQgcGFzcyB1cyBhIGZsYWcgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIHRoaXMgYWNjb3JkaW5nbHlcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHQoY29udGVudC5nZXRDb250cm9sKCkgYXMgRmllbGRUeXBlKS5oYXNQZW5kaW5nVXNlcklucHV0KCkgJiZcblx0XHRcdFx0XHQoZmlsdGVyVmFsdWUgIT09IFwiXCIgfHwgdGhpcy5jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyhjb250ZW50LCB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9pZiB2YWx1ZWhlbHAgdmFsdWUgaXMgbm90IHRoZXJlIGFuZCB0aGVyZSBpcyBmaWx0ZXIgdmFsdWUgdGhlbiB1c2VyIGlzIHR5cGluZyBhbmQgd2UgcmV0dXJuIHRydWUgZWxzZSB3ZSB3b3VsZCBvbmx5IG9wZW5cblx0XHRcdFx0Ly9pZiBpdCBpcyByZWNvbW1lbmRhdGlvbiByZWxldmFudCBmaWVsZFxuXHRcdFx0XHRpZiAoZmlsdGVyVmFsdWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyhjb250ZW50LCB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxufSk7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7OztFQW9DQSxNQUFNQSx1QkFBdUIsR0FBRyxnQ0FBZ0M7RUFBQyxPQWFsREMsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVDLGlCQUFpQixFQUFFO0lBQ25EQyxVQUFVLEVBQUUsQ0FBQztJQUViO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0MsaUJBQWlCLEVBQUUsVUFBVUMsU0FBb0IsRUFBRUMsT0FBOEIsRUFBRUMsWUFBOEIsRUFBRTtNQUNsSCxPQUFPRCxPQUFPLENBQUNFLGVBQWUsRUFBRSxLQUFLLFNBQVM7SUFDL0MsQ0FBQztJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFD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
704
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZUNvcmVDb250cm9sc0ZpbHRlckJhciIsIk9iamVjdCIsImFzc2lnbiIsIlZhbHVlSGVscERlbGVnYXRlIiwiYXBpVmVyc2lvbiIsImlzU2VhcmNoU3VwcG9ydGVkIiwidmFsdWVIZWxwIiwiY29udGVudCIsIl9saXN0QmluZGluZyIsImdldEZpbHRlckZpZWxkcyIsInVwZGF0ZUJpbmRpbmdJbmZvIiwiYmluZGluZ0luZm8iLCJzZWFyY2giLCJnZXRGaWx0ZXJWYWx1ZSIsIm5vcm1hbGl6ZWRTZWFyY2giLCJDb21tb25VdGlscyIsIm5vcm1hbGl6ZVNlYXJjaFRlcm0iLCJwYXJhbWV0ZXJzIiwiJHNlYXJjaCIsInVuZGVmaW5lZCIsInVwZGF0ZUJpbmRpbmciLCJsaXN0QmluZGluZyIsImlzQSIsInBheWxvYWQiLCJnZXRQYXlsb2FkIiwidmFsdWVMaXN0UHJvcGVydHkiLCJfZ2V0VmFsdWVMaXN0UHJvcGVydHlGcm9tUGF5bG9hZFF1YWxpZmllciIsImlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQiLCJnZXRDb250cm9sIiwiZmllbGQiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJoYXNQZW5kaW5nVXNlcklucHV0IiwiaXNUeXBlYWhlYWQiLCJpc0RlZmluZUNvbmRpdGlvblZhbHVlSGVscCIsImJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJhZGRpdGlvbmFsVmFsdWVzIiwiaW5wdXRWYWx1ZXMiLCJnZXRNb2RlbCIsImdldFByb3BlcnR5IiwidmFsdWVzIiwiYWRkaXRpb25hbFZhbHVlSGVscGVyIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMiLCJwcm9wZXJ0eVBhdGgiLCJnZXRCaW5kaW5nIiwiZ2V0UGF0aCIsImxlbmd0aCIsInB1c2giLCJncm91cEtleSIsIkFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5IiwicmVjb21tZW5kYXRpb24iLCJfdXBkYXRlQmluZGluZ0ZvclJlY29tbWVuZGF0aW9ucyIsIl91cGRhdGVCaW5kaW5nIiwiZXhlY3V0ZUZpbHRlciIsInJlcXVlc3RlZEl0ZW1zIiwiZ2V0Q29udGV4dHMiLCJjaGVja0xpc3RCaW5kaW5nUGVuZGluZyIsImlzUGVuZGluZyIsInVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZSIsInVwZGF0ZUJpbmRpbmdEb25lIiwiaXNTdXNwZW5kZWQiLCJjb250ZXh0cyIsInJlcXVlc3RDb250ZXh0cyIsImdldFR5cGVNYXAiLCJfdmFsdWVIZWxwIiwiVHlwZU1hcCIsInJldHJpZXZlQ29udGVudCIsImNvbnRhaW5lciIsImNvbnRlbnRJZCIsIlZhbHVlTGlzdEhlbHBlciIsInNob3dWYWx1ZUxpc3QiLCJfZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3QiLCJjb25kaXRpb24iLCJjb25kaXRpb25QYXlsb2FkTWFwIiwidmFsdWVIZWxwUXVhbGlmaWVycyIsImtleXMiLCJjb25kaXRpb25QYXlsb2FkTGlzdCIsInBhcmFtcyIsInF1YWxpZmllcnMiLCJ2YWx1ZUhlbHBRdWFsaWZpZXIiLCJ2aFBhcmFtZXRlcnMiLCJ2aEtleXMiLCJwcm9wZXJ0eUtleVBhdGgiLCJ2YWx1ZUhlbHBLZXlQYXRoIiwiZmlsdGVyZWRLZXlzIiwiaGVscFBhdGhzIiwiZm9yRWFjaCIsInBhcmFtIiwiaGVscFBhdGgiLCJmaWx0ZXIiLCJrZXkiLCJpbmNsdWRlcyIsIl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9GaWx0ZXJCYXIiLCJjb25kaXRpb25zIiwib3V0UGFyYW1ldGVycyIsImZpbHRlckJhciIsImxpc3RSZXBvcnRGaWx0ZXJCYXIiLCJzdGF0ZSIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsImluaXRpYWxTdGF0ZUl0ZW1zIiwiaXRlbXMiLCJmaWx0ZXJCYXJQcm9wZXJ0aWVzIiwiZ2V0UHJvcGVydHlIZWxwZXIiLCJnZXRQcm9wZXJ0aWVzIiwibWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiY29udGV4dFBhdGgiLCJzcGxpdCIsIm91dFBhcmFtZXRlciIsImZpbHRlclRhcmdldCIsInNvdXJjZSIsInBvcCIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwiZmlsdGVyVGFyZ2V0UGF0aCIsInN1YnN0cmluZyIsImFubm90YXRpb25QYXRoIiwiZ2V0UmVkdWNlZFBhdGgiLCJmaWx0ZXJCYXJQcm9wZXJ0eSIsImZpbmQiLCJpdGVtIiwibmFtZSIsImNvbmRpdGlvblBheWxvYWQiLCJuZXdDb25kaXRpb24iLCJDb25kaXRpb24iLCJjcmVhdGVDb25kaXRpb24iLCJDb25kaXRpb25WYWxpZGF0ZWQiLCJWYWxpZGF0ZWQiLCJjb25kaXRpb25QYXRoIiwiYXBwbHlFeHRlcm5hbFN0YXRlIiwiZXJyIiwibWVzc2FnZSIsIkVycm9yIiwiU3RyaW5nIiwiTG9nIiwiZXJyb3IiLCJfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvQmluZGluZ0NvbnRleHQiLCJjb250ZXh0Iiwib3V0VmFsdWVzIiwid2FybmluZyIsIl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVXBkYXRlUHJvcGVydHkiLCJjb252ZXJ0ZWRNZXRhZGF0YSIsImNvbnZlcnRUeXBlcyIsInJvb3RQYXRoIiwiZ2V0TWV0YUNvbnRleHQiLCJjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzIiwiaXNUcmFuc2llbnQiLCJpc0luYWN0aXZlIiwib3V0UGFyYW1ldGVyU291cmNlcyIsIl91cGRhdGVQcm9wZXJ0eVZpYU91dFBhcmFtZXRlciIsIkFjdGl2aXR5U3luYyIsImlzQ29ubmVjdGVkIiwiYmluZGluZyIsInZpZXciLCJnZXRUYXJnZXRWaWV3IiwiYXR0YWNoRXZlbnRPbmNlIiwic2VuZCIsImFjdGlvbiIsIkFjdGl2aXR5IiwiQ2hhbmdlIiwibWFwIiwidGFyZ2V0UHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsInRhcmdldCIsImZpZWxkQ29udHJvbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRmllbGRDb250cm9sIiwiZHluYW1pY1JlYWRPbmx5IiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJwYXRoIiwic2lkZUVmZmVjdFBhdGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJzZXRQcm9wZXJ0eSIsInRleHRQYXRoIiwiVGV4dCIsImdldEZpbHRlckNvbmRpdGlvbnMiLCJfY29uZmlnIiwiZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnMiLCJjb250cm9sIiwib25Db25kaXRpb25Qcm9wYWdhdGlvbiIsInJlYXNvbiIsInF1YWxpZmllciIsImdldE91dFBhcmFtZXRlcnMiLCJmaWVsZFBhcmVudCIsImdldFBhcmVudCIsImdldENvbmRpdGlvbnMiLCJfY3JlYXRlSW5pdGlhbEZpbHRlckNvbmRpdGlvbiIsInZhbHVlIiwiaW5pdGlhbFZhbHVlRmlsdGVyRW1wdHkiLCJfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tQmluZGluZyIsImluQ29uZGl0aW9ucyIsImluUGFyYW1ldGVycyIsImdldE1ldGFQYXRoIiwicHJvcGVydGllc1RvUmVxdWVzdCIsImluUGFyYW1ldGVyIiwiX2J1aWxkUHJvcGVydGllc1RvUmVxdWVzdCIsInJlcXVlc3RQcm9wZXJ0eSIsImkiLCJtZXRhTW9kZWxDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJyZWxhdGl2ZVBhdGhQYXJ0cyIsInNsaWNlIiwicGFydCIsInBhcnRuZXIiLCJnZXRPYmplY3QiLCIkUGFydG5lciIsImxvY2FsRGF0YVBhdGgiLCJsb2NhbERhdGFQYXJ0cyIsIm1hdGNoQ291bnQiLCJmaW5kSW5kZXgiLCJpbmRleCIsImNvbmNhdCIsImpvaW4iLCJfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tRmlsdGVyQmFyIiwiX2dldENvbmRpdGlvbnNGcm9tSW5QYXJhbWV0ZXIiLCJzb3VyY2VGaWVsZCIsImVuZHNXaXRoIiwiX3BhcnRpdGlvbkluUGFyYW1ldGVycyIsImluUGFyYW1ldGVyTWFwIiwiY29uc3RhbnQiLCJjb25zdGFudFZhbHVlIiwiaW5kZXhPZiIsIl90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGUiLCJvbkFmdGVyUmVuZGVyaW5nIiwiZXZlbnQiLCJ0YWJsZSIsInNyY0NvbnRyb2wiLCJ0YWJsZUNlbGxzRG9tUmVmcyIsIiQiLCJtZGNNVGFibGUiLCJoaWdobGlnaHRET01FbGVtZW50cyIsInBvcG92ZXJUYWJsZSIsImdldFRhYmxlIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsImFkZEV2ZW50RGVsZWdhdGUiLCJnZXRJblBhcmFtZXRlcnMiLCJpc09iamVjdFBhZ2UiLCJjcmVhdGVDb25kaXRpb25QYXlsb2FkIiwiX3ZhbHVlcyIsImVudHJ5IiwiaXNNdWx0aVZhbHVlRmllbGQiLCJ2aEtleSIsImZpbmRDb25kaXRpb25zRm9yQ29udGV4dCIsImlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzIiwiZ2V0Q29uZmlnIiwibWF4Q29uZGl0aW9ucyIsInZhbGlkYXRlZCIsImtleVBhdGgiLCJnZXRLZXlQYXRoIiwic2VsZWN0ZWRDb25kaXRpb24iLCJjb25kaXRpb25TZWxlY3RlZFJvdyIsInVzZU11bHRpVmFsdWVGaWVsZCIsImV2ZXJ5IiwidmhrZXkiLCJ1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VSZXNvbHZlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzb3J0QW5kRmlsdGVyT3RoZXJzIiwicmVzdW1lVmFsdWVMaXN0QmluZGluZ0FuZFJlc2V0Q2hhbmdlcyIsImFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIiwicmVxdWVzdEZvckFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIiwidW5pcXVlQWRkaXRpb25hbFZhbHVlcyIsInJlbW92ZUR1cGxpY2F0ZUFkZGl0aW9uYWxWYWx1ZXMiLCJjcmVhdGVBZGRpdGlvbmFsVmFsdWVUcmFuc2llbnRDb250ZXh0cyIsInJldmVyc2UiLCJyb290QmluZGluZyIsImdldFJvb3RCaW5kaW5nIiwic3VzcGVuZCIsImNoYW5nZVBhcmFtZXRlcnMiLCJmaWx0ZXJzIiwiRmlsdGVyVHlwZSIsIkFwcGxpY2F0aW9uIiwic29ydCIsInNvcnRlciIsInJlc3VtZSIsInJlc2V0Q2hhbmdlcyIsImNoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzIiwic2hvd1R5cGVhaGVhZCIsImZpbHRlclZhbHVlIiwidmhWYWx1ZSIsImZpZWxkVGV4dFZhbHVlIiwiZ2V0QWRkaXRpb25hbFZhbHVlIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJWYWx1ZUhlbHBEZWxlZ2F0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbnZlcnRlZE1ldGFkYXRhLCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgQWN0aXZpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9Db2xsYWJvcmF0aW9uQ29tbW9uXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHR5cGUgeyBJbk91dFBhcmFtZXRlciwgVmFsdWVIZWxwUGF5bG9hZCB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL3ZhbHVlaGVscC9WYWx1ZUxpc3RIZWxwZXJcIjtcbmltcG9ydCBWYWx1ZUxpc3RIZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlclwiO1xuaW1wb3J0IGhpZ2hsaWdodERPTUVsZW1lbnRzIGZyb20gXCJzYXAvbS9pbnB1dFV0aWxzL2hpZ2hsaWdodERPTUVsZW1lbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRUeXBlIH0gZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhciBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJCYXJcIjtcbmltcG9ydCB0eXBlIFZhbHVlSGVscCBmcm9tIFwic2FwL3VpL21kYy9WYWx1ZUhlbHBcIjtcbmltcG9ydCBWYWx1ZUhlbHBEZWxlZ2F0ZSBmcm9tIFwic2FwL3VpL21kYy9WYWx1ZUhlbHBEZWxlZ2F0ZVwiO1xuaW1wb3J0IHR5cGUgeyBDb25kaXRpb25PYmplY3QgfSBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vQ29uZGl0aW9uXCI7XG5pbXBvcnQgQ29uZGl0aW9uIGZyb20gXCJzYXAvdWkvbWRjL2NvbmRpdGlvbi9Db25kaXRpb25cIjtcbmltcG9ydCBDb25kaXRpb25WYWxpZGF0ZWQgZnJvbSBcInNhcC91aS9tZGMvZW51bXMvQ29uZGl0aW9uVmFsaWRhdGVkXCI7XG5pbXBvcnQgdHlwZSBGaWVsZEJhc2UgZnJvbSBcInNhcC91aS9tZGMvZmllbGQvRmllbGRCYXNlXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXJCYXNlIGZyb20gXCJzYXAvdWkvbWRjL2ZpbHRlcmJhci9GaWx0ZXJCYXJCYXNlXCI7XG5pbXBvcnQgVHlwZU1hcCBmcm9tIFwic2FwL3VpL21kYy9vZGF0YS92NC9UeXBlTWFwXCI7XG5pbXBvcnQgU3RhdGVVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3AxM24vU3RhdGVVdGlsXCI7XG5pbXBvcnQgdHlwZSBDb250YWluZXIgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2Jhc2UvQ29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBDb250ZW50IGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9iYXNlL0NvbnRlbnRcIjtcbmltcG9ydCB0eXBlIEZpbHRlcmFibGVMaXN0Q29udGVudCBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvYmFzZS9GaWx0ZXJhYmxlTGlzdENvbnRlbnRcIjtcbmltcG9ydCB0eXBlIE1UYWJsZSBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvY29udGVudC9NVGFibGVcIjtcbmltcG9ydCBGaWx0ZXJUeXBlIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyVHlwZVwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBBZGRpdGlvbmFsVmFsdWVUeXBlIH0gZnJvbSBcIi4uL2ludGVybmFsL3ZhbHVlaGVscC9BZGRpdGlvbmFsVmFsdWVIZWxwZXJcIjtcbmltcG9ydCB7IEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LCBhZGRpdGlvbmFsVmFsdWVIZWxwZXIgfSBmcm9tIFwiLi4vaW50ZXJuYWwvdmFsdWVoZWxwL0FkZGl0aW9uYWxWYWx1ZUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5cbmNvbnN0IEZlQ29yZUNvbnRyb2xzRmlsdGVyQmFyID0gXCJzYXAuZmUuY29yZS5jb250cm9scy5GaWx0ZXJCYXJcIjtcblxudHlwZSBDb25kaXRpb25PYmplY3RNYXAgPSBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25PYmplY3RbXT47XG5cbmV4cG9ydCB0eXBlIEV4dGVybmFsU3RhdGVUeXBlID0ge1xuXHRpdGVtczogeyBuYW1lOiBzdHJpbmcgfVtdO1xuXHRmaWx0ZXI6IENvbmRpdGlvbk9iamVjdE1hcDtcbn07XG5cbmV4cG9ydCB0eXBlIENvbmRpdGlvblBheWxvYWRUeXBlID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbj47XG5cbmV4cG9ydCB0eXBlIENvbmRpdGlvblBheWxvYWRNYXAgPSBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25QYXlsb2FkVHlwZVtdPjtcblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbih7fSwgVmFsdWVIZWxwRGVsZWdhdGUsIHtcblx0YXBpVmVyc2lvbjogMixcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+IHN1cHBvcnRzICRTZWFyY2guXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgQ29udGVudCBlbGVtZW50XG5cdCAqIEBwYXJhbSBfbGlzdEJpbmRpbmdcblx0ICogQHJldHVybnMgVHJ1ZSBpZiAkc2VhcmNoIGlzIHN1cHBvcnRlZFxuXHQgKi9cblx0aXNTZWFyY2hTdXBwb3J0ZWQ6IGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogRmlsdGVyYWJsZUxpc3RDb250ZW50LCBfbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpIHtcblx0XHRyZXR1cm4gY29udGVudC5nZXRGaWx0ZXJGaWVsZHMoKSA9PT0gXCIkc2VhcmNoXCI7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFkanVzdGFibGUgZmlsdGVyaW5nIGZvciBsaXN0LWJhc2VkIGNvbnRlbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IFZhbHVlSGVscCBjb250ZW50IHJlcXVlc3RpbmcgY29uZGl0aW9ucyBjb25maWd1cmF0aW9uXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqL1xuXHR1cGRhdGVCaW5kaW5nSW5mbzogZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBGaWx0ZXJhYmxlTGlzdENvbnRlbnQsIGJpbmRpbmdJbmZvOiBBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvKSB7XG5cdFx0VmFsdWVIZWxwRGVsZWdhdGUudXBkYXRlQmluZGluZ0luZm8odmFsdWVIZWxwLCBjb250ZW50LCBiaW5kaW5nSW5mbyk7XG5cblx0XHRpZiAoY29udGVudC5nZXRGaWx0ZXJGaWVsZHMoKSA9PT0gXCIkc2VhcmNoXCIpIHtcblx0XHRcdGNvbnN0IHNlYXJjaCA9IGNvbnRlbnQuZ2V0RmlsdGVyVmFsdWUoKTtcblx0XHRcdGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBDb21tb25VdGlscy5ub3JtYWxpemVTZWFyY2hUZXJtKHNlYXJjaCk7IC8vIGFkanVzdFNlYXJjaFxuXG5cdFx0XHRpZiAoYmluZGluZ0luZm8ucGFyYW1ldGVycykge1xuXHRcdFx0XHQoYmluZGluZ0luZm8ucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuJHNlYXJjaCA9IG5vcm1hbGl6ZWRTZWFyY2ggfHwgdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGZpZWxkIGlzIHJlY29tbWVuZGF0aW9uIHJlbGV2YW50IGFuZCBjYWxscyBlaXRoZXIgX3VwZGF0ZUJpbmRpbmcgb3IgX3VwZGF0ZUJpbmRpbmdGb3JSZWNvbW1lbmRhdGlvbnMuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKi9cblx0dXBkYXRlQmluZGluZzogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdHZhbHVlSGVscDogVmFsdWVIZWxwLFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGJpbmRpbmdJbmZvOiBBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdGNvbnRlbnQ6IE1UYWJsZVxuXHQpIHtcblx0XHQvLyBsaXN0QmluZGluZyBzaG91bGQgYmUgb2YgdHlwZSBPRGF0YUxpc3RCaW5kaW5nXG5cdFx0aWYgKCFsaXN0QmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vV2UgZmV0Y2ggdGhlIHZhbHVlbGlzdCBwcm9wZXJ0eSBmcm9tIHRoZSBwYXlsb2FkIHRvIG1ha2Ugc3VyZSB3ZSBwYXNzIHRoZSByaWdodCBwcm9wZXJ0eSB3aGlsZSBtYWtpbmcgYSBjYWxsIG9uIHZhbHVlbGlzdCBlbnRpdHkgc2V0XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRjb25zdCB2YWx1ZUxpc3RQcm9wZXJ0eSA9IHRoaXMuX2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXIocGF5bG9hZCk7XG5cdFx0Y29uc3QgaXNGaWx0ZXJGaWVsZE9yTXVsdGlWYWx1ZWRGaWVsZCA9XG5cdFx0XHRjb250ZW50LmdldENvbnRyb2woKS5pc0EoXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpIHx8IGNvbnRlbnQuZ2V0Q29udHJvbCgpLmlzQShcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpO1xuXHRcdGNvbnN0IGZpZWxkID0gY29udGVudC5nZXRDb250cm9sKCkgYXMgRmllbGRUeXBlO1xuXHRcdGNvbnN0IGZpZWxkVmFsdWUgPSAhaXNGaWx0ZXJGaWVsZE9yTXVsdGlWYWx1ZWRGaWVsZCAmJiBmaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdC8vIEZvciBkZWZpbmUgY29uZGl0aW9ucyB2YWx1ZWhlbHAgcmVjb21tZW5kYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgXCJpbnRlcm5hbFwiIG1vZGVsIGlzIG5vdCBhdmFpbGFibGUuXG5cdFx0Ly8gV2UgbmVlZCB0byBzaG93IHJlY29tbWVuZGF0aW9ucyBvbmx5IHdoZW4gdGhlIGZpZWxkIGhhcyBlbXB0eSB2YWx1ZSBvciB3aGVuIHVzZXIgaXMgdHlwaW5nIGEgdmFsdWUuIE90aGVyIHRpbWVzIHdlIHNob3VsZCBub3Qgc2hvdyByZWNvbW1lbmRhdGlvbnMuXG5cdFx0Ly9DaGVjayBpZiB0aGUgZmllbGQgaGFzIGFueSBwZW5kaW5nIHVzZXIgaW5wdXQgYW5kIGlmIGl0IGlzIHRoZW4gd2Ugc2hvdyByZWNvbW1lbmRhdGlvbnMgaWYgYW55LlxuXHRcdGlmICgoIWZpZWxkVmFsdWUgfHwgZmllbGQ/Lmhhc1BlbmRpbmdVc2VySW5wdXQoKSkgJiYgY29udGVudC5pc1R5cGVhaGVhZCgpICYmICFwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IGNvbnRlbnQuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZXM6IEFkZGl0aW9uYWxWYWx1ZVR5cGVbXSA9IFtdO1xuXHRcdFx0Ly9nZXQgdGhlIHJlY29tbWVuZGF0aW9uIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgbW9kZWxcblx0XHRcdGNvbnN0IGlucHV0VmFsdWVzID0gKGNvbnRlbnQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWwpLmdldFByb3BlcnR5KFwiL3JlY29tbWVuZGF0aW9uc0RhdGFcIikgfHwge307XG5cdFx0XHRsZXQgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG5cdFx0XHQvL0ZldGNoIHRoZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnMgYmFzZWQgb24gdGhlIGlucHV0dmFsdWVzIGFuZCBiaW5kaW5nY29udGV4dFxuXHRcdFx0aWYgKCFpc0ZpbHRlckZpZWxkT3JNdWx0aVZhbHVlZEZpZWxkKSB7XG5cdFx0XHRcdHZhbHVlcyA9XG5cdFx0XHRcdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKFxuXHRcdFx0XHRcdFx0aW5wdXRWYWx1ZXMsXG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0LFxuXHRcdFx0XHRcdFx0cGF5bG9hZC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRjb250ZW50LmdldENvbnRyb2woKS5nZXRCaW5kaW5nKFwidmFsdWVcIik/LmdldFBhdGgoKVxuXHRcdFx0XHRcdCkgfHwgW107XG5cdFx0XHR9XG5cdFx0XHQvL2lmIHRoZXJlIGFyZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnMgdGhlbiBjcmVhdGUgYWRkaXRpb25hbHZhbHVlIHN0cnVjdHVyZSBhbmQgY2FsbCBfdXBkYXRlQmluZGluZ0ZvclJlY29tbWVuZGF0aW9uc1xuXHRcdFx0aWYgKHZhbHVlcz8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVzLnB1c2goeyBwcm9wZXJ0eVBhdGg6IHZhbHVlTGlzdFByb3BlcnR5LCB2YWx1ZXMsIGdyb3VwS2V5OiBBZGRpdGlvbmFsVmFsdWVHcm91cEtleS5yZWNvbW1lbmRhdGlvbiB9KTtcblx0XHRcdFx0dGhpcy5fdXBkYXRlQmluZGluZ0ZvclJlY29tbWVuZGF0aW9ucyhwYXlsb2FkLCBsaXN0QmluZGluZywgYmluZGluZ0luZm8sIGFkZGl0aW9uYWxWYWx1ZXMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9jYWxsIF91cGRhdGVCaW5kaW5nIGlmIHRoZXJlIGFyZSBubyByZWxldmFudCByZWNvbW1lbmRhdGlvbnNcblx0XHRcdFx0dGhpcy5fdXBkYXRlQmluZGluZyhsaXN0QmluZGluZywgYmluZGluZ0luZm8pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvL2NhbGwgX3VwZGF0ZUJpbmRpbmcgaWYgdGhlcmUgYXJlIG5vIHJlbGV2YW50IHJlY29tbWVuZGF0aW9uc1xuXHRcdFx0dGhpcy5fdXBkYXRlQmluZGluZyhsaXN0QmluZGluZywgYmluZGluZ0luZm8pO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGEgZmlsdGVyIGluIGEgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+LlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIHJlcXVlc3RlZEl0ZW1zIE51bWJlciBvZiByZXF1ZXN0ZWQgaXRlbXNcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGlmIHNlYXJjaCBpcyBleGVjdXRlZFxuXHQgKi9cblx0ZXhlY3V0ZUZpbHRlcjogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcmVxdWVzdGVkSXRlbXM6IG51bWJlcikge1xuXHRcdGxpc3RCaW5kaW5nLmdldENvbnRleHRzKDAsIHJlcXVlc3RlZEl0ZW1zKTtcblxuXHRcdGF3YWl0IHRoaXMuY2hlY2tMaXN0QmluZGluZ1BlbmRpbmcodmFsdWVIZWxwLCBsaXN0QmluZGluZywgcmVxdWVzdGVkSXRlbXMpO1xuXHRcdHJldHVybiBsaXN0QmluZGluZztcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4gaXMgd2FpdGluZyBmb3IgYW4gdXBkYXRlLlxuXHQgKiBBcyBsb25nIGFzIHRoZSBjb250ZXh0IGhhcyBub3QgYmVlbiBzZXQgZm9yIDxjb2RlPkxpc3RCaW5kaW5nPC9jb2RlPixcblx0ICogPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBuZWVkcyB0byB3YWl0LlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0QmluZGluZyB0byBjaGVja1xuXHQgKiBAcGFyYW0gcmVxdWVzdGVkSXRlbXMgTnVtYmVyIG9mIHJlcXVlc3RlZCBpdGVtc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSBMaXN0QmluZGluZyBoYXMgYmVlbiB1cGRhdGVkXG5cdCAqL1xuXHRjaGVja0xpc3RCaW5kaW5nUGVuZGluZzogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHVuZGVmaW5lZCwgcmVxdWVzdGVkSXRlbXM6IG51bWJlcikge1xuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0bGV0IGlzUGVuZGluZyA9IGZhbHNlO1xuXHRcdGlmIChwYXlsb2FkLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZSkge1xuXHRcdFx0Y29uc3QgdXBkYXRlQmluZGluZ0RvbmUgPSBhd2FpdCBwYXlsb2FkLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZTtcblx0XHRcdGlzUGVuZGluZyA9ICF1cGRhdGVCaW5kaW5nRG9uZTtcblx0XHR9IGVsc2UgaWYgKGxpc3RCaW5kaW5nICYmICFsaXN0QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRjb25zdCBjb250ZXh0cyA9IGF3YWl0IGxpc3RCaW5kaW5nLnJlcXVlc3RDb250ZXh0cygwLCByZXF1ZXN0ZWRJdGVtcyk7XG5cdFx0XHRpc1BlbmRpbmcgPSBjb250ZXh0cy5sZW5ndGggPT09IDA7XG5cdFx0fVxuXHRcdHJldHVybiBpc1BlbmRpbmc7XG5cdH0sXG5cblx0Z2V0VHlwZU1hcDogZnVuY3Rpb24gKF92YWx1ZUhlbHA6IFZhbHVlSGVscCkge1xuXHRcdHJldHVybiBUeXBlTWFwO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgY29udGVudCBvZiB0aGUgdmFsdWUgaGVscC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgaGVscCBpcyBvcGVuZWQgb3IgYSBrZXkgb3IgZGVzY3JpcHRpb24gaXMgcmVxdWVzdGVkLlxuXHQgKlxuXHQgKiBTbywgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBoZWxwIGNvbnRlbnQgdXNlZCwgYWxsIGNvbnRlbnQgY29udHJvbHMgYW5kIGRhdGEgbmVlZCB0byBiZSBhc3NpZ25lZC5cblx0ICogT25jZSB0aGV5IGFyZSBhc3NpZ25lZCBhbmQgdGhlIGRhdGEgaXMgc2V0LCB0aGUgcmV0dXJuZWQgPGNvZGU+UHJvbWlzZTwvY29kZT4gbmVlZHMgdG8gYmUgcmVzb2x2ZWQuXG5cdCAqIE9ubHkgdGhlbiBkb2VzIHRoZSB2YWx1ZSBoZWxwIGNvbnRpbnVlIG9wZW5pbmcgb3IgcmVhZGluZyBkYXRhLlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250YWluZXIgQ29udGFpbmVyIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50SWQgSWQgb2YgdGhlIGNvbnRlbnQgc2hvd24gYWZ0ZXIgdGhpcyBjYWxsIHRvIHJldHJpZXZlQ29udGVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgaWYgYWxsIGNvbnRlbnQgaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRyZXRyaWV2ZUNvbnRlbnQ6IGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGFpbmVyOiBDb250YWluZXIsIGNvbnRlbnRJZDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRyZXR1cm4gVmFsdWVMaXN0SGVscGVyLnNob3dWYWx1ZUxpc3QocGF5bG9hZCwgY29udGFpbmVyLCBjb250ZW50SWQpO1xuXHR9LFxuXG5cdF9nZXRDb25kaXRpb25QYXlsb2FkTGlzdDogZnVuY3Rpb24gKGNvbmRpdGlvbjogQ29uZGl0aW9uT2JqZWN0KSB7XG5cdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZE1hcCA9IChjb25kaXRpb24ucGF5bG9hZCB8fCB7fSkgYXMgQ29uZGl0aW9uUGF5bG9hZE1hcCxcblx0XHRcdHZhbHVlSGVscFF1YWxpZmllcnMgPSBPYmplY3Qua2V5cyhjb25kaXRpb25QYXlsb2FkTWFwKSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWRMaXN0ID0gdmFsdWVIZWxwUXVhbGlmaWVycy5sZW5ndGggPyBjb25kaXRpb25QYXlsb2FkTWFwW3ZhbHVlSGVscFF1YWxpZmllcnNbMF1dIDogW107XG5cblx0XHRyZXR1cm4gY29uZGl0aW9uUGF5bG9hZExpc3Q7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIFZhbHVlTGlzdFByb3BlcnR5IGZyb20gUGF5bG9hZCBiYXNlZCBvbiBkYXRhIGZyb20gcGF5bG9hZCBrZXlzIGFuZCBwYXJhbWV0ZXJzLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcmV0dXJucyBWYWx1ZUxpc3RQcm9wZXJ0eVxuXHQgKi9cblx0X2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXI6IGZ1bmN0aW9uIChwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkKSB7XG5cdFx0Y29uc3QgcGFyYW1zID0gcGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXS52aFBhcmFtZXRlcnMgfHwgW107XG5cdFx0Y29uc3Qga2V5cyA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0udmhLZXlzIHx8IFtdO1xuXHRcdGNvbnN0IHByb3BlcnR5S2V5UGF0aCA9IHBheWxvYWQudmFsdWVIZWxwS2V5UGF0aDtcblx0XHRsZXQgZmlsdGVyZWRLZXlzOiBzdHJpbmdbXSA9IFsuLi5rZXlzXTtcblx0XHRjb25zdCBoZWxwUGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0aWYgKHBhcmFtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL2NyZWF0ZSBoZWxwUGF0aHMgYXJyYXkgd2hpY2ggd2lsbCBvbmx5IGNvbnNpc3Qgb2YgcGFyYW1zIGhlbHBwYXRoXG5cdFx0XHRwYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW06IEluT3V0UGFyYW1ldGVyKSB7XG5cdFx0XHRcdGhlbHBQYXRocy5wdXNoKHBhcmFtLmhlbHBQYXRoKTtcblx0XHRcdH0pO1xuXHRcdFx0Ly9maWx0ZXIgdGhlIGtleXMgYmFzZWQgb24gaGVscFBhdGhzLiBJZiBrZXkgaXMgbm90IHByZXNlbnQgaW4gaGVscFBhdGggdGhlbiBpdCBpcyB2YWx1ZWxpc3Rwcm9wZXJ0eVxuXHRcdFx0ZmlsdGVyZWRLZXlzID0ga2V5cy5maWx0ZXIoKGtleTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdHJldHVybiAhaGVscFBhdGhzLmluY2x1ZGVzKGtleSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBmcm9tIGZpbHRlcmVkS2V5cyByZXR1cm4gdGhlIGtleSB0aGF0IG1hdGNoZXMgdGhlIHByb3BlcnR5IG5hbWVcblx0XHRyZXR1cm4gcHJvcGVydHlLZXlQYXRoICYmIGZpbHRlcmVkS2V5cy5pbmNsdWRlcyhwcm9wZXJ0eUtleVBhdGgpID8gcHJvcGVydHlLZXlQYXRoIDogXCJcIjtcblx0fSxcblxuXHRfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvRmlsdGVyQmFyOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0Y29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10sXG5cdFx0b3V0UGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSxcblx0XHRmaWx0ZXJCYXI6IEZpbHRlckJhcixcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdGxpc3RSZXBvcnRGaWx0ZXJCYXI6IEZpbHRlckJhclxuXHQpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc3RhdGU6IEV4dGVybmFsU3RhdGVUeXBlID0gYXdhaXQgU3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShsaXN0UmVwb3J0RmlsdGVyQmFyKTtcblx0XHRcdGNvbnN0IGluaXRpYWxTdGF0ZUl0ZW1zID0gc3RhdGUuaXRlbXM7IC8vIFZpc2libGUgRmlsdGVySXRlbXMgaW4gdGhlIExSLUZpbHRlckJhclxuXHRcdFx0Y29uc3QgZmlsdGVyQmFyUHJvcGVydGllcyA9IGZpbHRlckJhci5nZXRQcm9wZXJ0eUhlbHBlcigpLmdldFByb3BlcnRpZXMoKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGZpbHRlckJhci5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdGNvbnN0IGNvbnRleHRQYXRoID0gYC8ke3BheWxvYWQucHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKVsxXX1gO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG5cdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRMaXN0ID0gdGhpcy5fZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3QoY29uZGl0aW9uKTtcblx0XHRcdFx0Zm9yIChjb25zdCBvdXRQYXJhbWV0ZXIgb2Ygb3V0UGFyYW1ldGVycykge1xuXHRcdFx0XHRcdGNvbnN0IGZpbHRlclRhcmdldCA9IG91dFBhcmFtZXRlci5zb3VyY2Uuc3BsaXQoXCJjb25kaXRpb25zL1wiKS5wb3AoKSB8fCBcIlwiO1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RJbmRleCA9IHBheWxvYWQucHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdFx0XHRjb25zdCBmaWx0ZXJUYXJnZXRQYXRoID1cblx0XHRcdFx0XHRcdGxhc3RJbmRleCA+IDAgPyBgJHtwYXlsb2FkLnByb3BlcnR5UGF0aC5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KX0vJHtmaWx0ZXJUYXJnZXR9YCA6IGZpbHRlclRhcmdldDtcblx0XHRcdFx0XHRjb25zdCBhbm5vdGF0aW9uUGF0aCA9IG1ldGFNb2RlbD8uZ2V0UmVkdWNlZFBhdGgoZmlsdGVyVGFyZ2V0UGF0aCwgY29udGV4dFBhdGgpO1xuXHRcdFx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnR5ID0gZmlsdGVyQmFyUHJvcGVydGllcy5maW5kKChpdGVtKSA9PiBpdGVtLmFubm90YXRpb25QYXRoID09PSBhbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRcdFx0Ly8gUHJvcGFnYXRlIE9VVCBwYXJhbWV0ZXIgb25seSBpZiB0aGUgZmlsdGVyIGZpZWxkIGlzIHZpc2libGUgaW4gdGhlIExSIGZpbHRlcmJhclxuXHRcdFx0XHRcdC8vIExSIEZpbHRlckJhciBvciBMUiBBZGFwdEZpbHRlclxuXHRcdFx0XHRcdGlmIChmaWx0ZXJCYXJQcm9wZXJ0eSAmJiBpbml0aWFsU3RhdGVJdGVtcz8uZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBmaWx0ZXJCYXJQcm9wZXJ0eS5uYW1lKSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb25QYXlsb2FkIG9mIGNvbmRpdGlvblBheWxvYWRMaXN0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0NvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXG5cdFx0XHRcdFx0XHRcdFx0XCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcdFtjb25kaXRpb25QYXlsb2FkW291dFBhcmFtZXRlci5oZWxwUGF0aF1dLFxuXHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdHN0YXRlLmZpbHRlcltmaWx0ZXJCYXJQcm9wZXJ0eS5jb25kaXRpb25QYXRoXSB8fD0gW107XG5cdFx0XHRcdFx0XHRcdHN0YXRlLmZpbHRlcltmaWx0ZXJCYXJQcm9wZXJ0eS5jb25kaXRpb25QYXRoXS5wdXNoKG5ld0NvbmRpdGlvbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBBcHBseSB0byB0aGUgcGFyZW50IG9mIHRoZSBGaWx0ZXJGaWVsZFxuXHRcdFx0U3RhdGVVdGlsLmFwcGx5RXh0ZXJuYWxTdGF0ZShmaWx0ZXJCYXIsIHN0YXRlKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG5cdFx0XHRMb2cuZXJyb3IoYFZhbHVlSGVscERlbGVnYXRlOiAke21lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9LFxuXG5cdF9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9CaW5kaW5nQ29udGV4dDogZnVuY3Rpb24gKFxuXHRcdGNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdFtdLFxuXHRcdG91dFBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW10sXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscFxuXHQpIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTGlzdCA9IHRoaXMuX2dldENvbmRpdGlvblBheWxvYWRMaXN0KGNvbmRpdGlvbiksXG5cdFx0XHRcdG91dFZhbHVlcyA9IGNvbmRpdGlvblBheWxvYWRMaXN0Lmxlbmd0aCA9PT0gMSA/IGNvbmRpdGlvblBheWxvYWRMaXN0WzBdIDogdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoY29uZGl0aW9uUGF5bG9hZExpc3QubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRMb2cud2FybmluZyhcIlZhbHVlSGVscERlbGVnYXRlOiBQYXJhbWV0ZXJPdXQgaW4gbXVsdGktdmFsdWUtZmllbGQgbm90IHN1cHBvcnRlZFwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChvdXRWYWx1ZXMpIHtcblx0XHRcdFx0dGhpcy5fb25Db25kaXRpb25Qcm9wYWdhdGlvblVwZGF0ZVByb3BlcnR5KG1ldGFNb2RlbCwgb3V0VmFsdWVzLCBvdXRQYXJhbWV0ZXJzLCBjb250ZXh0LCB2YWx1ZUhlbHApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRfb25Db25kaXRpb25Qcm9wYWdhdGlvblVwZGF0ZVByb3BlcnR5OiBmdW5jdGlvbiAoXG5cdFx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRvdXRWYWx1ZXM6IENvbmRpdGlvblBheWxvYWRUeXBlLFxuXHRcdG91dFBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW10sXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscFxuXHQpIHtcblx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpO1xuXHRcdGNvbnN0IHJvb3RQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKS5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgY29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0cyA9IGNvbnRleHQuaXNUcmFuc2llbnQoKSAhPT0gdHJ1ZSAmJiAhY29udGV4dC5pc0luYWN0aXZlKCk7XG5cdFx0Y29uc3Qgb3V0UGFyYW1ldGVyU291cmNlczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IG91dFBhcmFtZXRlciBvZiBvdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHQvKiBVcGRhdGVkIHByb3BlcnR5IHZpYSBvdXQtcGFyYW1ldGVyIGlmIHZhbHVlIGNoYW5nZWQgKi9cblx0XHRcdGlmIChjb250ZXh0LmdldFByb3BlcnR5KG91dFBhcmFtZXRlci5zb3VyY2UpICE9PSBvdXRWYWx1ZXNbb3V0UGFyYW1ldGVyLmhlbHBQYXRoXSkge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQcm9wZXJ0eVZpYU91dFBhcmFtZXRlcihcblx0XHRcdFx0XHRjb252ZXJ0ZWRNZXRhZGF0YSxcblx0XHRcdFx0XHRyb290UGF0aCxcblx0XHRcdFx0XHRvdXRWYWx1ZXMsXG5cdFx0XHRcdFx0b3V0UGFyYW1ldGVyLFxuXHRcdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdFx0Y29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0c1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0b3V0UGFyYW1ldGVyU291cmNlcy5wdXNoKG91dFBhcmFtZXRlci5zb3VyY2UpO1xuXHRcdH1cblx0XHRpZiAoQWN0aXZpdHlTeW5jLmlzQ29ubmVjdGVkKHZhbHVlSGVscCkpIHtcblx0XHRcdC8vIHdlIGRldGVybWluZSB0aGUgYmluZGluZyB0aGF0IHNlbmRzIHRoZSByZXF1ZXN0XG5cdFx0XHRsZXQgYmluZGluZztcblx0XHRcdGlmIChjb250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRiaW5kaW5nID0gY29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB2aWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldyh2YWx1ZUhlbHApO1xuXHRcdFx0XHRiaW5kaW5nID0gKHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KS5nZXRCaW5kaW5nKCk7XG5cdFx0XHR9XG5cdFx0XHQvKiBUaGUgb3V0IHZhbHVlcyBoYXZlIGJlZW4gY2hhbmdlZCAtLT4gd2FpdCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIgYmVmb3JlIHNlbmRpbmcgYSBub3RpZmljYXRpb24gdG8gdGhlIG90aGVyIGNvbGxhYm9yYXRvcnNcblx0XHRcdCAgIFdlIGF0dGFjaCB0aGUgZXZlbnQgb24gdGhlIHJpZ2h0IGJpbmRpbmcgKi9cblx0XHRcdGJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRBY3Rpdml0eVN5bmMuc2VuZCh2YWx1ZUhlbHAgYXMgdW5rbm93biBhcyBDb250cm9sLCB7XG5cdFx0XHRcdFx0YWN0aW9uOiBBY3Rpdml0eS5DaGFuZ2UsXG5cdFx0XHRcdFx0Y29udGVudDogb3V0UGFyYW1ldGVyU291cmNlcy5tYXAoKHNvdXJjZSkgPT4gY29udGV4dC5nZXRQYXRoKCkgKyBcIi9cIiArIHNvdXJjZSlcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0X3VwZGF0ZVByb3BlcnR5VmlhT3V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoXG5cdFx0Y29udmVydGVkTWV0YWRhdGE6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRcdHJvb3RQYXRoOiBzdHJpbmcsXG5cdFx0b3V0VmFsdWVzOiBDb25kaXRpb25QYXlsb2FkVHlwZSxcblx0XHRvdXRQYXJhbWV0ZXI6IEluT3V0UGFyYW1ldGVyLFxuXHRcdGNvbnRleHQ6IENvbnRleHQsXG5cdFx0Y29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0czogYm9vbGVhblxuXHQpIHtcblx0XHQvKiBVcGRhdGVkIHByb3BlcnR5IHZpYSBvdXQtcGFyYW1ldGVyIGlmIHZhbHVlIGNoYW5nZWQgKi9cblx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBgJHtyb290UGF0aH0vJHtvdXRQYXJhbWV0ZXIuc291cmNlfWA7XG5cdFx0Y29uc3QgdGFyZ2V0UHJvcGVydHkgPSBjb252ZXJ0ZWRNZXRhZGF0YS5yZXNvbHZlUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlQYXRoKS50YXJnZXQ7XG5cdFx0Y29uc3QgZmllbGRDb250cm9sID0gdGFyZ2V0UHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LkZpZWxkQ29udHJvbDtcblx0XHRjb25zdCBkeW5hbWljUmVhZE9ubHkgPSBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihmaWVsZENvbnRyb2wpID8gY29udGV4dC5nZXRQcm9wZXJ0eShmaWVsZENvbnRyb2wucGF0aCkgPT09IDEgOiBmYWxzZTtcblx0XHRpZiAoZHluYW1pY1JlYWRPbmx5ICYmIGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdC8qIE5vbi1UcmFuc2llbnQgYW5kIGFjdGl2ZSBjb250ZXh0ICovXG5cdFx0XHRjb25zdCBsYXN0SW5kZXggPSBvdXRQYXJhbWV0ZXIuc291cmNlLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RQYXRoID0gbGFzdEluZGV4ID4gMCA/IG91dFBhcmFtZXRlci5zb3VyY2Uuc3Vic3RyaW5nKDAsIGxhc3RJbmRleCkgOiBvdXRQYXJhbWV0ZXIuc291cmNlO1xuXHRcdFx0LyogV2Ugc2VuZCBbPHByb3BlcnR5TmFtZT5dIGluIGNhc2Ugb2YgYSBwcm9wZXJ0eSBwYXRoIHdpdGhvdXQgYW55IG5hdmlnYXRpb24gaW52b2x2ZWQgKi9cblx0XHRcdC8qIEluIGNhc2Ugb2YgYSBwYXRoIGludm9sdmluZyBuYXZpZ2F0aW9ucywgd2Ugc2VuZCBbPG5hdmlnYXRpb25QYXRoPl0gZW5kaW5nIHdpdGggYSBuYXZpZ2F0aW9uIHByb3BlcnR5IGFuZCBub3Qgd2l0aCBhIHByb3BlcnR5ICovXG5cdFx0XHRjb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhbc2lkZUVmZmVjdFBhdGhdKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0LyogVGhlIGZhc3QgY3JlYXRpb24gcm93ICh0cmFuc2llbnQgY29udGV4dCkgY2FuwrR0IGhhdmUgaW5zdGFudCBzcGVjaWZpYyAoZHluYW1pYykgcmVhZC1vbmx5IGZpZWxkcywgdGhlcmVmb3JlIHdlIGRvbsK0dCBuZWVkIHRvIGhhbmRsZS9jb25zaWRlciB0aGlzIGNhc2Ugc3BlY2lmaWNhbGx5ICovXG5cdFx0XHQvKiBBZGRpdGlvbmFsIGluZm9zOiAqL1xuXHRcdFx0LyogVGhlIGZhc3QgY3JlYXRpb24gcm93IGlzIG9ubHkgdXNlZCBieSBTRCAqL1xuXHRcdFx0LyogVGhlIGdyb3VwIElEICh0aGlyZCBhcmd1bWVudCBvZiBzZXRQcm9wZXJ0eSBkZXNjcmliZWQgYXBpIGRvY3VtZW50YXRpb24gb2YgdGhlIENvbnRleHQpIGlzIHVzZWQgZm9yIHRoZSBQQVRDSCByZXF1ZXN0LCBpZiBub3Qgc3BlY2lmaWVkLCB0aGUgdXBkYXRlIGdyb3VwIElEIGZvciB0aGUgY29udGV4dCdzIGJpbmRpbmcgaXMgdXNlZCwgJ251bGwnIHRvIHByZXZlbnQgdGhlIFBBVENIIHJlcXVlc3QgKi9cblx0XHRcdC8qIFRoZSBUcmFuc2llbnQgY29udGV4dCBjYW5ub3QgcmVxdWVzdCBTaWRlRWZmZWN0cyBhbmQgIGNhbm5vdCBwYXRjaCB2aWEgZ3JvdXAgJ251bGwnICovXG5cdFx0XHRjb250ZXh0LnNldFByb3BlcnR5KG91dFBhcmFtZXRlci5zb3VyY2UsIG91dFZhbHVlc1tvdXRQYXJhbWV0ZXIuaGVscFBhdGhdKTtcblx0XHR9XG5cdFx0LyogSWYgdGhlIGtleSBnZXRzIHVwZGF0ZWQgdmlhIG91dC1wYXJhbWV0ZXIsIHRoZW4gdGhlIGRlc2NyaXB0aW9uIG5lZWRzIGFsc28gcmV0cmlldmVkIHdpdGggcmVxdWVzdFNpZGVFZmZlY3RzICovXG5cdFx0Y29uc3QgdGV4dFBhdGggPSBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRQcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dClcblx0XHRcdD8gdGFyZ2V0UHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQucGF0aFxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0aWYgKHRleHRQYXRoICE9PSB1bmRlZmluZWQgJiYgY29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0Y29uc3QgbGFzdEluZGV4ID0gdGV4dFBhdGgubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdFBhdGggPSBsYXN0SW5kZXggPiAwID8gdGV4dFBhdGguc3Vic3RyaW5nKDAsIGxhc3RJbmRleCkgOiB0ZXh0UGF0aDtcblx0XHRcdC8qIFRoZSBzaWRlRWZmZWN0UGF0aCBjYW4gYmUgWzxwcm9wZXJ0eU5hbWU+XSBvciBbPG5hdmlnYXRpb25QYXRoPl0gKi9cblx0XHRcdGNvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKFtzaWRlRWZmZWN0UGF0aF0pO1xuXHRcdH1cblx0fSxcblxuXHRnZXRGaWx0ZXJDb25kaXRpb25zOiBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IENvbnRlbnQsIF9jb25maWc6IGFueSkge1xuXHRcdGlmICh0aGlzLmdldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9ucyh2YWx1ZUhlbHAsIGNvbnRlbnQsIChfY29uZmlnICYmIF9jb25maWcuY29udHJvbCkgfHwgKGNvbnRlbnQgJiYgY29udGVudC5nZXRDb250cm9sKCkpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHt9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxsYmFjayBpbnZva2VkIGV2ZXJ5IHRpbWUgYSB7QGxpbmsgc2FwLnVpLm1kYy5WYWx1ZUhlbHAgVmFsdWVIZWxwfSBmaXJlcyBhIHNlbGVjdCBldmVudCBvciB0aGUgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgY2hhbmdlc1xuXHQgKiBUaGlzIGNhbGxiYWNrIG1heSBiZSB1c2VkIHRvIHVwZGF0ZSBleHRlcm5hbCBmaWVsZHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVmFsdWVIZWxwIGNvbnRyb2wgaW5zdGFuY2UgcmVjZWl2aW5nIHRoZSA8Y29kZT5jb250cm9sQ2hhbmdlPC9jb2RlPlxuXHQgKiBAcGFyYW0gcmVhc29uIFJlYXNvbiB3aHkgdGhlIG1ldGhvZCB3YXMgaW52b2tlZFxuXHQgKiBAcGFyYW0gX2NvbmZpZyBDdXJyZW50IGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgdGhlIGNhbGxpbmcgY29udHJvbFxuXHQgKiBAc2luY2UgMS4xMDEuMFxuXHQgKi9cblx0b25Db25kaXRpb25Qcm9wYWdhdGlvbjogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCByZWFzb246IHN0cmluZywgX2NvbmZpZzogdW5rbm93bikge1xuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0aWYgKHJlYXNvbiAhPT0gXCJDb250cm9sQ2hhbmdlXCIgfHwgcGF5bG9hZC5pc0RlZmluZUNvbmRpdGlvblZhbHVlSGVscCkge1xuXHRcdFx0Ly8gaGFuZGxlIG9ubHkgQ29udHJvbENoYW5nZSByZWFzb25cblx0XHRcdC8vIGFsc28gZG9uJ3QgaGFuZGxlIGZvciBkZWZpbmUgY29uZGl0aW9uIHZhbHVlIGhlbHAgYXMgcHJvcGFnYXRpbmcgY29uZGl0aW9ucyBvbiB0aGUgdmFsdWUgaGVscFxuXHRcdFx0Ly8gdG8gZGVmaW5lIGNvbmRpdGlvbnMgZG9lcyBub3QgbWFrZSBzZW5zZSBidXQgd291bGQgb25seSBjb25mdXNlIHVzZXJzIGJ5IGFsbG93aW5nIHJlY3Vyc2l2ZSB1c2Vcblx0XHRcdC8vIG9mIHRoZSBjb25kaXRpb24gdmFsdWUgaGVscFxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBxdWFsaWZpZXIgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdGNvbnN0IG91dFBhcmFtZXRlcnMgPSBxdWFsaWZpZXI/LnZoUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkID8gVmFsdWVMaXN0SGVscGVyLmdldE91dFBhcmFtZXRlcnMocXVhbGlmaWVyLnZoUGFyYW1ldGVycykgOiBbXSxcblx0XHRcdGZpZWxkID0gdmFsdWVIZWxwLmdldENvbnRyb2woKSBhcyBGaWVsZEJhc2UsXG5cdFx0XHRmaWVsZFBhcmVudCA9IGZpZWxkLmdldFBhcmVudCgpIGFzIEZpbHRlckJhckJhc2UgfCBDb250cm9sO1xuXG5cdFx0bGV0IGNvbmRpdGlvbnMgPSBmaWVsZC5nZXRDb25kaXRpb25zKCkgYXMgQ29uZGl0aW9uT2JqZWN0W107XG5cdFx0Y29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChjb25kaXRpb24pIHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSAoY29uZGl0aW9uLnBheWxvYWQgfHwge30pIGFzIENvbmRpdGlvblBheWxvYWRNYXA7XG5cdFx0XHRyZXR1cm4gY29uZGl0aW9uUGF5bG9hZE1hcFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl07XG5cdFx0fSk7XG5cblx0XHRjb25zdCBsaXN0UmVwb3J0RmlsdGVyQmFyID0gdmFsdWVIZWxwLmdldFBhcmVudCgpIGFzIEZpbHRlckJhckJhc2UgfCBDb250cm9sOyAvLyBDb250cm9sIGUuZy4gRm9ybUNvbnRhaW5lclxuXHRcdGlmIChsaXN0UmVwb3J0RmlsdGVyQmFyLmlzQShGZUNvcmVDb250cm9sc0ZpbHRlckJhcikpIHtcblx0XHRcdC8vIFByb3BhZ2F0ZSB0aGUgdmFsdWUgb25seSBpZiB0aGUgRmlsdGVyRmllbGQgaXMgcGFydCBvZiB0aGUgTFItRmlsdGVyQmFyIGFsc28gaW5zaWRlIGluIEFkYXB0IEZpbHRlcnMgZGlhbG9nXG5cdFx0XHRhd2FpdCB0aGlzLl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9GaWx0ZXJCYXIoXG5cdFx0XHRcdGNvbmRpdGlvbnMsXG5cdFx0XHRcdG91dFBhcmFtZXRlcnMsXG5cdFx0XHRcdGZpZWxkUGFyZW50IGFzIEZpbHRlckJhcixcblx0XHRcdFx0cGF5bG9hZCxcblx0XHRcdFx0bGlzdFJlcG9ydEZpbHRlckJhciBhcyBGaWx0ZXJCYXJcblx0XHRcdCk7XG5cdFx0XHQvLyBMUiBTZXR0aW5ncyBEaWFsb2cgb3IgT1AgU2V0dGluZ3MgRGlhbG9nIHNoYWxsIG5vdCBwcm9wYWdhdGUgdmFsdWUgdG8gdGhlIGRpYWxvZyBmaWx0ZXJmaWVsZHMgb3IgY29udGV4dFxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPYmplY3QgUGFnZVxuXHRcdFx0LyogVG8gYXZvaWQgdGltaW5nIGlzc3VlIHdlIHVzZSB0aGUgQmluZGluZ0NvbnRleHQgb2YgdGhlIGNvbnRyb2wgaW5zdGVhZCBvZiB0aGUgVmFsdWVIZWxwIChCQ1AgMjM4MDA1NzIyNykgKi9cblx0XHRcdGNvbnN0IGNvbnRleHQgPSBmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHR0aGlzLl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9CaW5kaW5nQ29udGV4dChjb25kaXRpb25zLCBvdXRQYXJhbWV0ZXJzLCBjb250ZXh0LCB2YWx1ZUhlbHApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRfY3JlYXRlSW5pdGlhbEZpbHRlckNvbmRpdGlvbjogZnVuY3Rpb24gKHZhbHVlOiB1bmtub3duLCBpbml0aWFsVmFsdWVGaWx0ZXJFbXB0eTogYm9vbGVhbikge1xuXHRcdGxldCBjb25kaXRpb246IENvbmRpdGlvbk9iamVjdCB8IHVuZGVmaW5lZDtcblxuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJWYWx1ZUhlbHBEZWxlZ2F0ZTogdmFsdWUgb2YgdGhlIHByb3BlcnR5IGNvdWxkIG5vdCBiZSByZXF1ZXN0ZWRcIik7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuXHRcdFx0aWYgKGluaXRpYWxWYWx1ZUZpbHRlckVtcHR5KSB7XG5cdFx0XHRcdGNvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXCJFbXB0eVwiLCBbXSwgbnVsbCwgbnVsbCwgQ29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXCJFUVwiLCBbdmFsdWVdLCBudWxsLCBudWxsLCBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbmRpdGlvbjtcblx0fSxcblxuXHRfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tQmluZGluZzogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGluQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0TWFwLFxuXHRcdGNvbnRyb2w6IENvbnRyb2wsXG5cdFx0aW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWRcblx0KSB7XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRpZiAoIWJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJWYWx1ZUhlbHBEZWxlZ2F0ZTogTm8gQmluZGluZ0NvbnRleHRcIik7XG5cdFx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHRcdH1cblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250cm9sLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGNvbnN0IHJvb3RQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0bGV0IHByb3BlcnRpZXNUb1JlcXVlc3QgPSBpblBhcmFtZXRlcnMubWFwKChpblBhcmFtZXRlcikgPT4gaW5QYXJhbWV0ZXIuc291cmNlKTtcblx0XHQvKiBJbiBjYXNlIG9mIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nLCB3aGljaCBjYW4gYmUgaWRlbnRpZmllZCBieSB0aGUgcGF0aCBcIiRQYXJhbWV0ZXJcIiwgdGhlIGJpbmRpbmcgY29udGV4dCBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIGluLXBhcmFtZXRlcnMuICovXG5cdFx0LyogV2UgbmVlZCB0byByZXF1ZXN0IHRoZSBpbi1wYXJhbWV0ZXIgdmFsdWVzIHJlbGF0aXZlIHRvIHRoZSBiaW5kaW5nIGNvbnRleHQuXG5JbiBzb21lIGNhc2VzIChlLmcuIG11bHRpIHZhbHVlIGZpZWxkKSwgdGhlIGJpbmRpbmcgY29udGV4dCBkb2VzIG5vdCBwb2ludCB0byB0aGVcblZIIGFubm90YXRpb24gdGFyZ2V0LCB0aHVzIHdlIGlkZW50aWZ5IHRoZSBuZWVkZWQgbmF2aWdhdGlvbiByZWxhdGlvbiBieVxucmVkdWNpbmcgdGhlIHBheWxvYWQucHJvcGVydHlQYXRoIGJ5IHRoZSBwYXRoIGRlcml2ZWQgZnJvbSBiaW5kaW5nIGNvbnRleHQuXG5UaGlzIGNhbm5vdCBoYXBwZW4gaW4gY2FzZSBvZiBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZywgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdGggXCIkUGFyYW1ldGVyXCIuXG4qL1xuXHRcdGlmIChiaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0UGF0aCgpICE9PSBcIiRQYXJhbWV0ZXJcIikge1xuXHRcdFx0cHJvcGVydGllc1RvUmVxdWVzdCA9IHRoaXMuX2J1aWxkUHJvcGVydGllc1RvUmVxdWVzdChwcm9wZXJ0aWVzVG9SZXF1ZXN0LCByb290UGF0aCwgbWV0YU1vZGVsLCBwYXlsb2FkLnByb3BlcnR5UGF0aCk7XG5cdFx0fVxuXHRcdC8vIEFjY29yZGluZyB0byBvZGF0YSB2NCBhcGkgZG9jdW1lbnRhdGlvbiBmb3IgcmVxdWVzdFByb3BlcnR5OiBQcm9wZXJ0eSB2YWx1ZXMgdGhhdCBhcmUgbm90IGNhY2hlZCB5ZXQgYXJlIHJlcXVlc3RlZCBmcm9tIHRoZSBiYWNrIGVuZFxuXHRcdGNvbnN0IHZhbHVlcyA9IGF3YWl0IGJpbmRpbmdDb250ZXh0LnJlcXVlc3RQcm9wZXJ0eShwcm9wZXJ0aWVzVG9SZXF1ZXN0KTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaW5QYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBpblBhcmFtZXRlciA9IGluUGFyYW1ldGVyc1tpXTtcblx0XHRcdGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuX2NyZWF0ZUluaXRpYWxGaWx0ZXJDb25kaXRpb24odmFsdWVzW2ldLCBpblBhcmFtZXRlci5pbml0aWFsVmFsdWVGaWx0ZXJFbXB0eSk7XG5cblx0XHRcdGlmIChjb25kaXRpb24pIHtcblx0XHRcdFx0aW5Db25kaXRpb25zW2luUGFyYW1ldGVyLmhlbHBQYXRoXSA9IFtjb25kaXRpb25dO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHR9LFxuXG5cdF9idWlsZFByb3BlcnRpZXNUb1JlcXVlc3Q6IGZ1bmN0aW9uIChwcm9wZXJ0aWVzVG9SZXF1ZXN0OiBzdHJpbmdbXSwgcm9vdFBhdGg6IHN0cmluZywgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgcHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHQvKlxuXHRcdFRoZSBpblBhcmFtZXRlcnMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBoZWxwIGRlZmluaXRpb24sIGkuZS4gdGhlaXIgc291cmNlIGlzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgYW5ub3RhdGlvbiB0YXJnZXQgKG9yIG1vcmUgcHJlY2lzZWx5IHRoZSBFbnRpdHlTZXQgdGhlIGFubm90YXRpb24gdGFyZ2V0IGJlbG9uZ3MgdG8pLiBUaGUgYW5ub3RhdGlvbiB0YXJnZXQgaXMgdGhlIHByb3BlcnR5IHRoZSB2YWx1ZSBoZWxwIGlzIGRlZmluZWQgZm9yLlxuXHRcdFRvIHJlcXVlc3QgdGhlIHZhbHVlcyBmb3IgdGhlIGluUGFyYW1ldGVycyBmcm9tIHRoZSBiaW5kaW5nQ29udGV4dCAodGhlIGNvbnRyb2wgaXMgYm91bmQgdG8pLCB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSB0aGlzIHRvIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgYmluZGluZ0NvbnRleHQuIFRoaXMgZGlmZmVycywgaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkIGZvciBhIGRpcmVjdCBwcm9wZXJ0eSwgYnV0IHdpdGggYSBwYXRoIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIChlc3AuIG5lY2Vzc2FyeSB0byBkZWZpbmUgbXVsdGkgdmFsdWUgZmllbGRzKS5cblx0XHRUbyBtYWtlIHRoaXMgdHJhbnNsYXRpb24gcG9zc2libGUsIHRoZSBwYXlsb2FkIHByb3ZpZGVzIHRoZSBwcm9wZXJ0eVBhdGgsIHdoaWNoIGlzIGFuIGFic29sdXRlIG1ldGFQYXRoIHRvIHRoZSBwcm9wZXJ0eSAoaS5lLiBpbmNsdWRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbWV0YVBhdGggZm9yIHRoZSBiaW5kaW5nIGNvbnRleHQgYW5kIHRoZSBhZGRpdGlvbmFsIHBhdGggdGhlIHByb3BlcnR5IGlzIGJvdW5kIHRvKS5cblxuXHRcdFNvIGZhciwgdGhpcyBtZWFucyB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBtZXRhUGF0aCBvZiB0aGUgYmluZGluZ0NvbnRleHQgZnJvbSB0aGUgbGVmdCBzaWRlLCBhbmQgdGhlIGxhc3Qgc2VnbWVudCAodGhlIHByb3BlcnR5IGl0c2VsZikgZnJvbSB0aGUgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHByb3BlcnR5UGF0aCBwcm92aWRlZCBpbiB0aGUgcGF5bG9hZCwgdG8gZ2V0IGEgbWV0YVBhdGggZnJvbSB0aGUgYmluZGluZyBjb250ZXh0IHRvIHRoZSBhbm5vdGF0aW9uIHRhcmdldC5cblx0XHRJZiB0aGlzIG1ldGFQYXRoIGNvbnRhaW5zIDE6bi1uYXZpZ2F0aW9ucyAod2hpY2ggY2Fubm90IGJlIHRyYW5zbGF0ZWQgYmFjayB0byBhIHBhdGgsIGFzIHRoaXMgd291bGQgbWVhbiB0byBhZGQgY29ycmVzcG9uZGluZyBrZXlzLCB3aGljaCBhcmUgbm90IGtub3duKSwgdGhlIHNvdXJjZSBwYXRoIGluIHRoZSBpblBhcmFtZXRlciBkZWZpbml0aW9uIG9mIHRoZSB2YWx1ZSBuZWVkcyB0byBwb2ludCBiYWNrIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIHBhcnRuZXIgbmF2aWdhdGlvbihzKSB0byBhdm9pZCBhbWJpZ3VvdXMgZGVmaW5pdGlvbiBvZiBob3cgdG8gZ2V0IGl0cyB2YWx1ZS5cblx0XHRUaHVzLCB3ZSBjYW4gYW5kIG5lZWQgdG8gbWF0Y2ggYW5kIHJlZHVjZSB0aGUgcGFydHMgb2YgdGhpcyByZWxhdGl2ZSBtZXRhUGF0aCBmcm9tIHRoZSByaWdodCBzaWRlIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgcGFydHMgb2YgdGhlIGluUGFyYW1ldGVycyBzb3VyY2UgZGVmaW5pdGlvbiBmcm9tIHRoZSBsZWZ0IHNpZGUgYnkgY2hlY2tpbmcgd2hldGhlciB0aGV5IGFyZSBjb3JyZXNwb25kaW5nIHBhcnRuZXIgbmF2aWdhdGlvbnMuIFdoZW4gd2UgYXJlIGRvbmUgKG5vIG1vcmUgcGFydHMgaW4gcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCwgbm8gbW9yZSBwYXJ0cyBpbiByZWR1Y2VkIGluUGFyYW1ldGVyIHNvdXJjZSBwYXRoLCBvciBtb3N0IHJpZ2h0IHBhcnQgaW4gcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCBpcyBub3QgdGhlIHBhcnRuZXIgb2YgbW9zdCBsZWZ0IHBhcnQgaW4gcmVkdWNlZCBpblBhcmFtZXRlciBzb3VyY2UpLCBuZWl0aGVyIHJlZHVjZWQgcmVsYXRpdmUgbWV0YVBhdGggbm9yIHJlZHVjZWQgaW5QYXJhbWV0ZXIgc291cmNlIHBhdGggbWF5IGNvbnRhaW4gYW55IDE6bi1uYXZpZ2F0aW9uIHByb3BlcnRpZXMuXG5cdFx0SWYgdGhpcyBjb25kaXRpb24gaXMgZnVsZmlsbGVkLCB3ZSBjYW4gY29tYmluZSB0aGUgYW5kIHJlcXVlc3QgZnJvbSB0aGUgZ2l2ZW4gYmluZGluZyBjb250ZXh0LiBJZiBub3QsIHRoZSB2YWx1ZSBoZWxwIGRlZmluaXRpb24gZG9lcyBub3QgYWxsb3cgdG8gcmV0cmlldmUgdGhlIGluUGFyYW1ldGVycyB2YWx1ZSBpbiBhbiB1bmFtYmlndW91cyB3YXksIGkudC4gdGhlIHZhbHVlIGhlbHAgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5LlxuXHRcdCovXG5cdFx0Ly8gY29tbW9uIGZvciBhbGwgaW5QYXJhbWV0ZXJzXG5cdFx0bGV0IG1ldGFNb2RlbENvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQocm9vdFBhdGgpIGFzIENvbnRleHQ7XG5cdFx0Y29uc3QgcmVsYXRpdmVQYXRoUGFydHMgPSBwcm9wZXJ0eVBhdGhcblx0XHRcdC5zbGljZShyb290UGF0aC5sZW5ndGgpIC8vIHJlbW92ZSByb290IHBhdGhcblx0XHRcdC5zcGxpdChcIi9cIikgLy8gdHJhbnNmb3JtIHRvIGFycmF5XG5cdFx0XHQuc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSBmaXJzdCAoZW1wdHksIGFzIHJvb3RQYXRoIHByb3ZpZGVkIHdpdGhvdXQgZW5kaW5nIFwiL1wiKSwgYW5kIGxhc3QgKHByb3BlcnR5IHRoZSBWSCBpcyBhdHRhY2hlZCB0bykgcGFydFxuXHRcdFx0Lm1hcCgocGFydCkgPT4ge1xuXHRcdFx0XHQvLyBkZXRlcm1pbmUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lIGFuZCBjb3JyZXNwb25kaW5nIHBhcnRuZXIgZm9yIGVhY2ggbmF2aWdhdGlvbiBzdGVwXG5cdFx0XHRcdG1ldGFNb2RlbENvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQocGFydCwgbWV0YU1vZGVsQ29udGV4dCkgYXMgQ29udGV4dDtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRwYXJ0OiBwYXJ0LFxuXHRcdFx0XHRcdHBhcnRuZXI6IG1ldGFNb2RlbENvbnRleHQuZ2V0T2JqZWN0KCkuJFBhcnRuZXJcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHRcdC8vIGFjdHVhbCByZWR1Y3Rpb24gcGVyIGluUGFyYW1ldGVyXG5cdFx0cmV0dXJuIHByb3BlcnRpZXNUb1JlcXVlc3QubWFwKChsb2NhbERhdGFQYXRoKSA9PiB7XG5cdFx0XHRjb25zdCBsb2NhbERhdGFQYXJ0cyA9IGxvY2FsRGF0YVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3QgbWF0Y2hDb3VudCA9IGxvY2FsRGF0YVBhcnRzLmZpbmRJbmRleChcblx0XHRcdFx0KFxuXHRcdFx0XHRcdHBhcnQsXG5cdFx0XHRcdFx0aW5kZXggLy8gZmluZCBmaXJzdCBub24tbWF0Y2hpbmcgaW5kZXhcblx0XHRcdFx0KSA9PiByZWxhdGl2ZVBhdGhQYXJ0c1staW5kZXhdPy5wYXJ0bmVyICE9PSBwYXJ0XG5cdFx0XHQpOyAvLyByZWxhdGl2ZVBhdGhQYXJ0cyB0byBtYXRjaCBmcm9tIHRoZSBlbmQgKD0+IFwiLWluZGV4XCIpIHRvIGxvY2FsRGF0YVBhcnRzIGZyb20gdGhlIGJlZ2lubmluZ1xuXHRcdFx0Ly8gbGFzdCBwYXJ0IG9mIGxvY2FsRGF0YSBpcyBhIHByb3BlcnR5IG5hbWUsIHRodXMgaXQgY2Fubm90IG1hdGNoLiBPdGhlcndpc2UgbWF0Y2hDb3VudCBjb3VsZCBiZSAtMSBpZiBldmVyeXRoaW5nIG1hdGNoZXNcblx0XHRcdC8vIChpZiB3ZSB3YW50IHRvIGFkZGl0aW9uYWxseSBzZWN1cmUgYWdhaW5zdCB0aGlzIHNpdHVhdGlvbiwgdGhlIG1vc3QgYXBwcm9wcmlhdGUgd291bGQgYmUgdG8gc2V0IG1hdGNoQ291bnQgPSBsb2NhbERhdGFQYXJ0cy5sZW5ndGgg4oCTIDEpXG5cdFx0XHRyZXR1cm4gcmVsYXRpdmVQYXRoUGFydHNcblx0XHRcdFx0LnNsaWNlKDAsIC1tYXRjaENvdW50KSAvLyByZW1vdmUgYWxsIG1hdGNoZWQgcGFydHMgKGZyb20gdGhlIGVuZClcblx0XHRcdFx0Lm1hcCgocGFydCkgPT4gcGFydC5wYXJ0KVxuXHRcdFx0XHQuY29uY2F0KGxvY2FsRGF0YVBhcnRzLnNsaWNlKG1hdGNoQ291bnQpKSAvLyByZW1vdmUgdGhlIG1hdGNoZWQgcGFydHMgZnJvbSBsb2NhbERhdGEgKGZyb20gdGhlIGJlZ2lubmluZylcblx0XHRcdFx0LmpvaW4oXCIvXCIpOyAvLyB0cmFuc2ZlciBiYWNrIHRvIHN0cmluZyAoYnV0IG9ubHkgb25jZSBhdCB0aGUgZW5kIDspIClcblx0XHR9KTtcblx0fSxcblxuXHRfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tRmlsdGVyQmFyOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0aW5Db25kaXRpb25zOiBDb25kaXRpb25PYmplY3RNYXAsXG5cdFx0Y29udHJvbDogQ29udHJvbCxcblx0XHRpblBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW11cblx0KSB7XG5cdFx0Y29uc3QgZmlsdGVyQmFyID0gY29udHJvbC5nZXRQYXJlbnQoKSBhcyBGaWx0ZXJCYXJCYXNlO1xuXHRcdGNvbnN0IHN0YXRlOiBFeHRlcm5hbFN0YXRlVHlwZSA9IGF3YWl0IFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUoZmlsdGVyQmFyKTtcblxuXHRcdGZvciAoY29uc3QgaW5QYXJhbWV0ZXIgb2YgaW5QYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25zID0gdGhpcy5fZ2V0Q29uZGl0aW9uc0Zyb21JblBhcmFtZXRlcihpblBhcmFtZXRlciwgc3RhdGUpO1xuXHRcdFx0aWYgKGNvbmRpdGlvbnMpIHtcblx0XHRcdFx0aW5Db25kaXRpb25zW2luUGFyYW1ldGVyLmhlbHBQYXRoXSA9IGNvbmRpdGlvbnM7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBpbkNvbmRpdGlvbnM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGZpbHRlciBjb25kaXRpb25zLlxuXHQgKiBSZWdhcmRpbmcgYSBuYXZpZ2F0aW9uIHBhdGggaW4gdGhlIEluT3V0IHBhcmFtZXRlcnMgYW5kIGRpc3JlZ2FyZGluZyBwcmVmaXhlcyBpbiB0aGUgbmF2aWdhdGlvbiBwYXRoIGxpa2UgZS5nLiAnJGZpbHRlcnM+L2NvbmRpdGlvbnMvJyBvciAnb3duZXInLlxuXHQgKlxuXHQgKiBAcGFyYW0gaW5QYXJhbWV0ZXIgSW5QYXJtZXRlciBvZiB0aGUgZmlsdGVyIGZpZWxkIHZhbHVlIGhlbHBcblx0ICogQHBhcmFtIHN0YXRlIFRoZSBleHRlcm5hbCBmaWx0ZXIgc3RhdGVcblx0ICogQHJldHVybnMgVGhlIGZpbHRlciBjb25kaXRpb25zXG5cdCAqIEBzaW5jZSAxLjExNC4wXG5cdCAqL1xuXHRfZ2V0Q29uZGl0aW9uc0Zyb21JblBhcmFtZXRlcjogZnVuY3Rpb24gKGluUGFyYW1ldGVyOiBJbk91dFBhcmFtZXRlciwgc3RhdGU6IEV4dGVybmFsU3RhdGVUeXBlKSB7XG5cdFx0Y29uc3Qgc291cmNlRmllbGQgPSBpblBhcmFtZXRlci5zb3VyY2U7XG5cdFx0Y29uc3Qga2V5ID0gT2JqZWN0LmtleXMoc3RhdGUuZmlsdGVyKS5maW5kKChrZXkpID0+IChcIi9cIiArIHNvdXJjZUZpZWxkKS5lbmRzV2l0aChcIi9cIiArIGtleSkpOyAvL2FkZGl0aW9uYWwgJy8nIHRvIGhhbmRsZSBoZWFkaW5nIGNoYXJhY3RlcnMgaW4gdGhlIHNvdXJjZSBuYW1lIGlmIHRoZXJlIGlzIG5vIHBhdGhcblx0XHRyZXR1cm4ga2V5ICYmIHN0YXRlLmZpbHRlcltrZXldO1xuXHR9LFxuXG5cdF9wYXJ0aXRpb25JblBhcmFtZXRlcnM6IGZ1bmN0aW9uIChpblBhcmFtZXRlcnM6IEluT3V0UGFyYW1ldGVyW10pIHtcblx0XHRjb25zdCBpblBhcmFtZXRlck1hcDogUmVjb3JkPHN0cmluZywgSW5PdXRQYXJhbWV0ZXJbXT4gPSB7XG5cdFx0XHRjb25zdGFudDogW10sXG5cdFx0XHRiaW5kaW5nOiBbXSxcblx0XHRcdGZpbHRlcjogW11cblx0XHR9O1xuXG5cdFx0Zm9yIChjb25zdCBpblBhcmFtZXRlciBvZiBpblBhcmFtZXRlcnMpIHtcblx0XHRcdGlmIChpblBhcmFtZXRlci5jb25zdGFudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJNYXAuY29uc3RhbnQucHVzaChpblBhcmFtZXRlcik7XG5cdFx0XHR9IGVsc2UgaWYgKGluUGFyYW1ldGVyLnNvdXJjZS5pbmRleE9mKFwiJGZpbHRlclwiKSA9PT0gMCkge1xuXHRcdFx0XHRpblBhcmFtZXRlck1hcC5maWx0ZXIucHVzaChpblBhcmFtZXRlcik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpblBhcmFtZXRlck1hcC5iaW5kaW5nLnB1c2goaW5QYXJhbWV0ZXIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5QYXJhbWV0ZXJNYXA7XG5cdH0sXG5cblx0X3RhYmxlQWZ0ZXJSZW5kZXJEZWxlZ2F0ZToge1xuXHRcdG9uQWZ0ZXJSZW5kZXJpbmc6IGZ1bmN0aW9uIChldmVudDogalF1ZXJ5LkV2ZW50ICYgeyBzcmNDb250cm9sOiBDb250cm9sIH0pIHtcblx0XHRcdGNvbnN0IHRhYmxlID0gZXZlbnQuc3JjQ29udHJvbCwgLy8gbS5UYWJsZVxuXHRcdFx0XHR0YWJsZUNlbGxzRG9tUmVmcyA9IHRhYmxlLiQoKS5maW5kKFwidGJvZHkgLnNhcE1UZXh0XCIpLFxuXHRcdFx0XHRtZGNNVGFibGUgPSB0YWJsZS5nZXRQYXJlbnQoKSBhcyBNVGFibGU7XG5cblx0XHRcdGhpZ2hsaWdodERPTUVsZW1lbnRzKHRhYmxlQ2VsbHNEb21SZWZzLCBtZGNNVGFibGUuZ2V0RmlsdGVyVmFsdWUoKSwgdHJ1ZSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyBhbiBpbml0aWFsIGNvbmRpdGlvbiBjb25maWd1cmF0aW9uIGV2ZXJ5dGltZSBhIHZhbHVlIGhlbHAgY29udGVudCBpcyBzaG93bi5cblx0ICpcblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBWYWx1ZUhlbHAgY29udGVudCByZXF1ZXN0aW5nIGNvbmRpdGlvbnMgY29uZmlndXJhdGlvblxuXHQgKiBAcGFyYW0gY29udHJvbCBJbnN0YW5jZSBvZiB0aGUgY2FsbGluZyBjb250cm9sXG5cdCAqIEByZXR1cm5zIFJldHVybnMgYSBtYXAgb2YgY29uZGl0aW9ucyBzdWl0YWJsZSBmb3IgYSBzYXAudWkubWRjLkZpbHRlckJhciBjb250cm9sXG5cdCAqIEBzaW5jZSAxLjEwMS4wXG5cdCAqL1xuXHRnZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9uczogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBDb250ZW50LCBjb250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkKSB7XG5cdFx0Ly8gaGlnaGxpZ2h0IHRleHQgaW4gVmFsdWVIZWxwIHBvcG92ZXJcblx0XHRpZiAoY29udGVudD8uaXNBKFwic2FwLnVpLm1kYy52YWx1ZWhlbHAuY29udGVudC5NVGFibGVcIikpIHtcblx0XHRcdGNvbnN0IHBvcG92ZXJUYWJsZSA9IChjb250ZW50IGFzIE1UYWJsZSkuZ2V0VGFibGUoKTtcblx0XHRcdHBvcG92ZXJUYWJsZT8ucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGUpO1xuXHRcdFx0cG9wb3ZlclRhYmxlPy5hZGRFdmVudERlbGVnYXRlKHRoaXMuX3RhYmxlQWZ0ZXJSZW5kZXJEZWxlZ2F0ZSwgdGhpcyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRjb25zdCBpbkNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdE1hcCA9IHt9O1xuXG5cdFx0Ly8gRm9yIGRlZmluZSBjb25kaXRpb25zIHZhbHVlaGVscCBpbml0aWFsIGZpbHRlciBjb25kaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHRoZSBjb250cm9sIG9mIHRoZSBkZWZpbmUgY29uZGl0aW9uc1xuXHRcdC8vIGlzIGNsb25lZCBhbmQgbm90IHRoZSBvcmlnaW5hbCBvbmUgdG8gd2hpY2ggZmllbGQgdmFsdWVoZWxwIHdhcyBhdHRhY2hlZC4gQW5kIGFzIGEgcmVzdWx0IHdlIGNhbm5vdCBnZXQgaW4gcGFyYW1ldGVyIHZhbHVlLiBGb3Igc2ltcGxpY2l0eVxuXHRcdC8vIHdlIGp1c3Qgc2tpcCB0aGUgcmVzdCBvZiB0aGUgY29kZSByZWxhdGVkIHRvIGZpbHRlciBjb25kaXRpb25zLlxuXHRcdGlmIChwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHRcdH1cblxuXHRcdGlmICghY29udHJvbCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IENvbnRyb2wgdW5kZWZpbmVkXCIpO1xuXHRcdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0XHR9XG5cblx0XHRjb25zdCBxdWFsaWZpZXIgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHF1YWxpZmllcj8udmhQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBWYWx1ZUxpc3RIZWxwZXIuZ2V0SW5QYXJhbWV0ZXJzKHF1YWxpZmllci52aFBhcmFtZXRlcnMpIDogW107XG5cdFx0Y29uc3QgaW5QYXJhbWV0ZXJNYXAgPSB0aGlzLl9wYXJ0aXRpb25JblBhcmFtZXRlcnMoaW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBpc09iamVjdFBhZ2UgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRmb3IgKGNvbnN0IGluUGFyYW1ldGVyIG9mIGluUGFyYW1ldGVyTWFwLmNvbnN0YW50KSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb24gPSB0aGlzLl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uKFxuXHRcdFx0XHRpblBhcmFtZXRlci5jb25zdGFudFZhbHVlLFxuXHRcdFx0XHRpc09iamVjdFBhZ2UgPyBpblBhcmFtZXRlci5pbml0aWFsVmFsdWVGaWx0ZXJFbXB0eSA6IGZhbHNlIC8vIG5vIGZpbHRlciB3aXRoIFwiZW1wdHlcIiBvbiBMaXN0UmVwb3J0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKGNvbmRpdGlvbikge1xuXHRcdFx0XHRpbkNvbmRpdGlvbnNbaW5QYXJhbWV0ZXIuaGVscFBhdGhdID0gW2NvbmRpdGlvbl07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGluUGFyYW1ldGVyTWFwLmJpbmRpbmcubGVuZ3RoKSB7XG5cdFx0XHRhd2FpdCB0aGlzLl9nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9uc0Zyb21CaW5kaW5nKGluQ29uZGl0aW9ucywgY29udHJvbCwgaW5QYXJhbWV0ZXJNYXAuYmluZGluZywgcGF5bG9hZCk7XG5cdFx0fVxuXG5cdFx0aWYgKGluUGFyYW1ldGVyTWFwLmZpbHRlci5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IHRoaXMuX2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUZpbHRlckJhcihpbkNvbmRpdGlvbnMsIGNvbnRyb2wsIGluUGFyYW1ldGVyTWFwLmZpbHRlcik7XG5cdFx0fVxuXHRcdHJldHVybiBpbkNvbmRpdGlvbnM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBwb3NzaWJpbGl0eSB0byBjb252ZXkgY3VzdG9tIGRhdGEgaW4gY29uZGl0aW9ucy5cblx0ICogVGhpcyBlbmFibGVzIGFuIGFwcGxpY2F0aW9uIHRvIGVuaGFuY2UgY29uZGl0aW9ucyB3aXRoIGRhdGEgcmVsZXZhbnQgZm9yIGNvbWJpbmVkIGtleSBvciBvdXRwYXJhbWV0ZXIgc2NlbmFyaW9zLlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IFZhbHVlSGVscCBjb250ZW50IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBfdmFsdWVzIERlc2NyaXB0aW9uIHBhaXIgZm9yIHRoZSBjb25kaXRpb24gd2hpY2ggaXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gY29udGV4dCBPcHRpb25hbCBhZGRpdGlvbmFsIGNvbnRleHRcblx0ICogQHJldHVybnMgT3B0aW9uYWxseSByZXR1cm5zIGEgc2VyaWFsaXphYmxlIG9iamVjdCB0byBiZSBzdG9yZWQgaW4gdGhlIGNvbmRpdGlvbiBwYXlsb2FkIGZpZWxkXG5cdCAqIEBzaW5jZSAxLjEwMS4wXG5cdCAqL1xuXHRjcmVhdGVDb25kaXRpb25QYXlsb2FkOiBmdW5jdGlvbiAoXG5cdFx0dmFsdWVIZWxwOiBWYWx1ZUhlbHAsXG5cdFx0Y29udGVudDogQ29udGVudCxcblx0XHRfdmFsdWVzOiB1bmtub3duW10sXG5cdFx0Y29udGV4dDogQ29udGV4dFxuXHQpOiBDb25kaXRpb25QYXlsb2FkTWFwIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGNvbnN0IHF1YWxpZmllciA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0sXG5cdFx0XHRlbnRyeTogQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSB7fSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRNYXAgPSB7fTtcblx0XHRjb25zdCBjb250cm9sID0gY29udGVudC5nZXRDb250cm9sKCk7XG5cdFx0Y29uc3QgaXNNdWx0aVZhbHVlRmllbGQgPSBjb250cm9sPy5pc0EoXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKTtcblx0XHRpZiAoIXF1YWxpZmllci52aEtleXMgfHwgcXVhbGlmaWVyLnZoS2V5cy5sZW5ndGggPT09IDEgfHwgaXNNdWx0aVZhbHVlRmllbGQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHF1YWxpZmllci52aEtleXMuZm9yRWFjaChmdW5jdGlvbiAodmhLZXkpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gY29udGV4dC5nZXRPYmplY3QodmhLZXkpO1xuXHRcdFx0aWYgKHZhbHVlICE9IG51bGwpIHtcblx0XHRcdFx0ZW50cnlbdmhLZXldID0gdmFsdWU/Lmxlbmd0aCA9PT0gMCA/IFwiXCIgOiB2YWx1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoZW50cnkpLmxlbmd0aCkge1xuXHRcdFx0LyogdmggcXVhbGlmaWVyIGFzIGtleSBmb3IgcmVsZXZhbnQgY29uZGl0aW9uICovXG5cdFx0XHRjb25kaXRpb25QYXlsb2FkW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXSA9IFtlbnRyeV07XG5cdFx0fVxuXHRcdHJldHVybiBjb25kaXRpb25QYXlsb2FkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyB0aGUgcG9zc2liaWxpdHkgdG8gY3VzdG9taXplIHNlbGVjdGlvbnMgaW4gJ1NlbGVjdCBmcm9tIGxpc3QnIHNjZW5hcmlvcy5cblx0ICogQnkgZGVmYXVsdCwgb25seSBjb25kaXRpb24ga2V5cyBhcmUgY29uc2lkZXJlZC4gVGhpcyBtYXkgYmUgZXh0ZW5kZWQgd2l0aCBwYXlsb2FkIGRlcGVuZGVudCBmaWx0ZXJzLlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IFZhbHVlSGVscCBjb250ZW50IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIHNlbGVjdGVkIGl0ZW1cblx0ICogQHBhcmFtIGNvbmRpdGlvbnMgQ3VycmVudCBjb25kaXRpb25zXG5cdCAqIEByZXR1cm5zIENvbmRpdGlvbnMgb3IgW11cblx0ICovXG5cdGZpbmRDb25kaXRpb25zRm9yQ29udGV4dDogZnVuY3Rpb24gKFxuXHRcdHZhbHVlSGVscDogVmFsdWVIZWxwLFxuXHRcdGNvbnRlbnQ6IEZpbHRlcmFibGVMaXN0Q29udGVudCxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRjb25kaXRpb25zOiBDb25kaXRpb25PYmplY3RbXVxuXHQpIHtcblx0XHQvL0luIHZhbHVlIGhlbHAgZGlhbG9ncyBvZiBzaW5nbGUgdmFsdWUgZmllbGRzIHRoZSByb3cgZm9yIHRoZSBrZXkgc2hvdWxkbsK0dCBiZSBzZWxlY3RlZC9oaWdobGlnaHQgYW55bW9yZSBCQ1A6IDIyNzAxNzUyNDZcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGlmIChwYXlsb2FkLmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzICE9PSB0cnVlICYmIChjb250ZW50LmdldENvbmZpZygpIGFzIHsgbWF4Q29uZGl0aW9ucz86IG51bWJlciB9KT8ubWF4Q29uZGl0aW9ucyA9PT0gMSkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblx0XHQvKiBEbyBub3QgY29uc2lkZXIgXCJOb3RWYWxpZGF0ZWRcIiBjb25kaXRpb25zICovXG5cdFx0Y29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuZmlsdGVyKChjb25kaXRpb24pID0+IGNvbmRpdGlvbi52YWxpZGF0ZWQgPT09IENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWQpO1xuXG5cdFx0Y29uc3QgdmhLZXlzID0gcGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXT8udmhLZXlzIHx8IFtdO1xuXHRcdGNvbnN0IGtleVBhdGggPSBjb250ZW50LmdldEtleVBhdGgoKTtcblx0XHRjb25zdCB2YWx1ZUhlbHBRdWFsaWZpZXIgPSBwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllciB8fCBcIlwiO1xuXHRcdGNvbnN0IHNlbGVjdGVkQ29uZGl0aW9uID0gY29uZGl0aW9ucy5maW5kKGZ1bmN0aW9uIChjb25kaXRpb24pIHtcblx0XHRcdGlmIChjb250ZXh0Py5nZXRPYmplY3Qoa2V5UGF0aCkgPT09IGNvbmRpdGlvbj8udmFsdWVzWzBdKSB7XG5cdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSBjb25kaXRpb24ucGF5bG9hZCBhcyBDb25kaXRpb25QYXlsb2FkTWFwO1xuXHRcdFx0XHRjb25zdCBjb25kaXRpb25TZWxlY3RlZFJvdyA9IGNvbmRpdGlvblBheWxvYWRNYXA/Llt2YWx1ZUhlbHBRdWFsaWZpZXJdPy5bMF0gfHwge307XG5cdFx0XHRcdGlmICh2aEtleXMubGVuZ3RoID09PSAxIHx8IHBheWxvYWQ/LnVzZU11bHRpVmFsdWVGaWVsZCB8fCAhY29uZGl0aW9uUGF5bG9hZE1hcCkge1xuXHRcdFx0XHRcdHJldHVybiBjb250ZXh0Py5nZXRPYmplY3Qoa2V5UGF0aCkgPT09IGNvbmRpdGlvbj8udmFsdWVzWzBdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiB2aEtleXMuZXZlcnkoZnVuY3Rpb24gKHZoa2V5KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dD8uZ2V0T2JqZWN0KHZoa2V5KSA9PT0gY29uZGl0aW9uU2VsZWN0ZWRSb3dbdmhrZXldO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gc2VsZWN0ZWRDb25kaXRpb24gPyBbc2VsZWN0ZWRDb25kaXRpb25dIDogW107XG5cdH0sXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGNvbnRleHRzIGZvciBhZGRpdGlvbmFsIHZhbHVlcyBhbmQgcmVzdW1lcyB0aGUgbGlzdCBiaW5kaW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBhZGRpdGlvbmFsVmFsdWVzIEFycmF5IG9mIEFkZGl0aW9uYWxWYWx1ZXNcblx0ICovXG5cdF91cGRhdGVCaW5kaW5nRm9yUmVjb21tZW5kYXRpb25zOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0cGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRiaW5kaW5nSW5mbzogQWdncmVnYXRpb25CaW5kaW5nSW5mbyxcblx0XHRhZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW11cblx0KSB7XG5cdFx0bGV0IHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZVJlc29sdmU6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdC8vY3JlYXRlIGEgcHJvbWlzZSB0byBtYWtlIHN1cmUgY2hlY2tMaXN0QmluZGluZ1BlbmRpbmcgaXMgb25seSBjb21wbGV0ZWQgb25jZSB0aGlzIHByb21pc2UgaXMgcmVzb2x2ZWRcblx0XHRwYXlsb2FkLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdFx0XHR1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTtcblx0XHR9KTtcblx0XHR0cnkge1xuXHRcdFx0Ly9zb3J0IGFuZCBmaWx0ZXIgdmFsdWVoZWxwYmluZGluZyB0byBtYWtlIHN1cmUgd2UgcmVuZGVyIG90aGVycyBncm91cFxuXHRcdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLnNvcnRBbmRGaWx0ZXJPdGhlcnMobGlzdEJpbmRpbmcsIGJpbmRpbmdJbmZvLCBhZGRpdGlvbmFsVmFsdWVzKTtcblx0XHRcdC8vcmVzdW1lIHRoZSBsaXN0IGJpbmRpbmcgYW5kIHRoZW4gcmVzZXQgdGhlIGNoYW5nZXNcblx0XHRcdGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5yZXN1bWVWYWx1ZUxpc3RCaW5kaW5nQW5kUmVzZXRDaGFuZ2VzKGxpc3RCaW5kaW5nKTtcblx0XHRcdC8vZmV0Y2ggdGhlIGNvbnRleHRzIG9mIGFkZGl0aW9uYWx2YWx1ZXNcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhID0gYXdhaXQgYWRkaXRpb25hbFZhbHVlSGVscGVyLnJlcXVlc3RGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YShcblx0XHRcdFx0YWRkaXRpb25hbFZhbHVlcyxcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdGJpbmRpbmdJbmZvLFxuXHRcdFx0XHRwYXlsb2FkXG5cdFx0XHQpO1xuXHRcdFx0Ly9yZW1vdmUgZHVwbGljYXRlIHZhbHVlcyBmcm9tIGRpZmZlcmVudCBncm91cHMgb2YgYWRkaXRpb25hbHZhbHVlc1xuXHRcdFx0Y29uc3QgdW5pcXVlQWRkaXRpb25hbFZhbHVlcyA9IGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5yZW1vdmVEdXBsaWNhdGVBZGRpdGlvbmFsVmFsdWVzKGFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhLCBbXG5cdFx0XHRcdC4uLmFkZGl0aW9uYWxWYWx1ZXNcblx0XHRcdF0pO1xuXHRcdFx0Ly8gYWRkIHRyYW5zaWVudCBjb250ZXh0IHRvIGxpc3QgYmluZGluZyBhZnRlciBiYWNrZW5kIHF1ZXJ5IGlzIGRvbmVcblx0XHRcdGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5jcmVhdGVBZGRpdGlvbmFsVmFsdWVUcmFuc2llbnRDb250ZXh0cyhcblx0XHRcdFx0YWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEsXG5cdFx0XHRcdHVuaXF1ZUFkZGl0aW9uYWxWYWx1ZXMucmV2ZXJzZSgpLFxuXHRcdFx0XHRsaXN0QmluZGluZ1xuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly9EbyBub3RoaW5nIGFzIHdlIGtub3cgdGhhdCByZXNldCBjaGFuZ2VzIHdvdWxkIHRocm93IGFuIGVycm9yIGluIGNvbnNvbGUgYW5kIHRoaXMgd2lsbCBwaWxlIHVwIGEgbG90IG9mIGNvbnNvbGUgZXJyb3JzXG5cdFx0fVxuXHRcdGlmICh1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VSZXNvbHZlKSB7XG5cdFx0XHQvL3Jlc29sdmUgdGhlIHByb21pc2UgYXMgZXZlcnl0aGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdHVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZVJlc29sdmUodHJ1ZSk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogRXhlY3V0ZXMgYSBmaWx0ZXIgaW4gYSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4gYW5kIHJlc3VtZXMgaXQsIGlmIHN1c3BlbmRlZC5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKi9cblx0X3VwZGF0ZUJpbmRpbmc6IGFzeW5jIGZ1bmN0aW9uIChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgYmluZGluZ0luZm86IEFnZ3JlZ2F0aW9uQmluZGluZ0luZm8pIHtcblx0XHRjb25zdCByb290QmluZGluZyA9IGxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgfHwgbGlzdEJpbmRpbmc7XG5cdFx0aWYgKCFyb290QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRyb290QmluZGluZy5zdXNwZW5kKCk7XG5cdFx0fVxuXHRcdGlmIChiaW5kaW5nSW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRsaXN0QmluZGluZy5jaGFuZ2VQYXJhbWV0ZXJzKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHRsaXN0QmluZGluZy5maWx0ZXIoYmluZGluZ0luZm8uZmlsdGVycywgRmlsdGVyVHlwZS5BcHBsaWNhdGlvbik7XG5cdFx0bGlzdEJpbmRpbmcuc29ydChiaW5kaW5nSW5mby5zb3J0ZXIpO1xuXG5cdFx0aWYgKHJvb3RCaW5kaW5nLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdHJvb3RCaW5kaW5nLnJlc3VtZSgpO1xuXHRcdFx0cm9vdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyBhbiBib29sZWFuIHZhbHVlIGlmIGFkZGl0aW9uYWx2YWx1ZXMgZXhpc3RzIHdoaWNoIHdpbGwgY29udGFpbiBkaWZmZXJlbnQgZ3JvdXBzIGxpa2UgcmVjb21tZW5kYXRpb25zLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlXG5cdCAqL1xuXHRjaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0czogZnVuY3Rpb24gKGNvbnRlbnQ6IE1UYWJsZSwgcGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCkge1xuXHRcdC8vIEZvciBkZWZpbmUgY29uZGl0aW9ucyB2YWx1ZWhlbHAgcmVjb21tZW5kYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgXCJpbnRlcm5hbFwiIG1vZGVsIGlzIG5vdCBhdmFpbGFibGUuXG5cdFx0aWYgKHBheWxvYWQuaXNEZWZpbmVDb25kaXRpb25WYWx1ZUhlbHApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IGNvbnRlbnQuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHQvL2dldCB0aGUgcmVjb21tZW5kYXRpb24gZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBtb2RlbFxuXHRcdGNvbnN0IGlucHV0VmFsdWVzID0gKGNvbnRlbnQuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWwpLmdldFByb3BlcnR5KFwiL3JlY29tbWVuZGF0aW9uc0RhdGFcIikgfHwge307XG5cdFx0Ly9GZXRjaCB0aGUgcmVsZXZhbnQgcmVjb21tZW5kYXRpb25zIGJhc2VkIG9uIHRoZSBpbnB1dHZhbHVlcyBhbmQgYmluZGluZ2NvbnRleHRcblx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKFxuXHRcdFx0XHRpbnB1dFZhbHVlcyxcblx0XHRcdFx0YmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCxcblx0XHRcdFx0cGF5bG9hZC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdGNvbnRlbnQuZ2V0Q29udHJvbCgpLmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uZ2V0UGF0aCgpXG5cdFx0XHQpIHx8IFtdO1xuXHRcdGlmICh2YWx1ZXM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdC8vaWYgdGhlcmUgYXJlIHJlbGV2YW50IHJlY29tbWVuZGF0aW9ucyB0aGVuIHJldHVybiB0cnVlXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgd2hpY2ggd2lsbCB0ZWxsIHdoZXRoZXIgdHlwZWFoZWFkIHNob3VsZCBiZSBvcGVuZWQgb3Igbm90LlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IEZpbHRlcmFibGUgTGlzdCBDb250ZW50XG5cdCAqIEByZXR1cm5zIEJvb2xlYW4gdmFsdWUgd2hldGhlciB0byBzaG93IHR5cGVhaGVhZCBvciBub3Rcblx0ICovXG5cdHNob3dUeXBlYWhlYWQ6IGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogTVRhYmxlKSB7XG5cdFx0aWYgKCFjb250ZW50LmdldENvbnRyb2woKS5pc0EoXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpICYmICFjb250ZW50LmdldENvbnRyb2woKS5pc0EoXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkge1xuXHRcdFx0Y29uc3QgZmlsdGVyVmFsdWUgPSBjb250ZW50Py5nZXRGaWx0ZXJWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgdmhWYWx1ZSA9IChjb250ZW50Py5nZXRDb250cm9sKCkgYXMgRmllbGQpPy5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgZmllbGRUZXh0VmFsdWUgPSAoY29udGVudD8uZ2V0Q29udHJvbCgpIGFzIEZpZWxkKT8uZ2V0QWRkaXRpb25hbFZhbHVlKCk7XG5cdFx0XHRpZiAodmhWYWx1ZSB8fCBmaWVsZFRleHRWYWx1ZSkge1xuXHRcdFx0XHQvLyB2YWx1ZWhlbHAgaGFkIHNvbWUgdmFsdWUsIGJ1dCB1c2VyIGNsZWFyZWQgdGhlIHZhbHVlXG5cdFx0XHRcdC8vIGluIHN1Y2ggY2FzZSB3ZSBnZXQgaW5wdXQgdmFsdWUgYXMgJycgYW5kIHdlIHdpbGwgcmV0dXJuIGZhbHNlXG5cdFx0XHRcdC8vTm90ZTogSW4gU0RzIHVzZWNhc2Ugd2Ugd2FudGVkIHRvIG9wZW4gdGhlIHR5cGVBaGVhZCBpZiB0aGVyZSBhcmUgcmVjb21tZW5kYXRpb25zIGFuZCB2YWx1ZSBpcyBibGFuaywgdGhleSBzaG91bGQgcGFzcyB1cyBhIGZsYWcgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIHRoaXMgYWNjb3JkaW5nbHlcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHQoY29udGVudC5nZXRDb250cm9sKCkgYXMgRmllbGRUeXBlKS5oYXNQZW5kaW5nVXNlcklucHV0KCkgJiZcblx0XHRcdFx0XHQoZmlsdGVyVmFsdWUgIT09IFwiXCIgfHwgdGhpcy5jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyhjb250ZW50LCB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9pZiB2YWx1ZWhlbHAgdmFsdWUgaXMgbm90IHRoZXJlIGFuZCB0aGVyZSBpcyBmaWx0ZXIgdmFsdWUgdGhlbiB1c2VyIGlzIHR5cGluZyBhbmQgd2UgcmV0dXJuIHRydWUgZWxzZSB3ZSB3b3VsZCBvbmx5IG9wZW5cblx0XHRcdFx0Ly9pZiBpdCBpcyByZWNvbW1lbmRhdGlvbiByZWxldmFudCBmaWVsZFxuXHRcdFx0XHRpZiAoZmlsdGVyVmFsdWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyhjb250ZW50LCB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxufSk7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7OztFQXFDQSxNQUFNQSx1QkFBdUIsR0FBRyxnQ0FBZ0M7RUFBQyxPQWFsREMsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVDLGlCQUFpQixFQUFFO0lBQ25EQyxVQUFVLEVBQUUsQ0FBQztJQUViO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0MsaUJBQWlCLEVBQUUsVUFBVUMs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
@@ -33,6 +33,7 @@ import type ODataListBinding from "sap/ui/model/odata/v4/ODataListBinding";
33
33
  import type ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
34
34
  import type { AdditionalValueType } from "../internal/valuehelp/AdditionalValueHelper";
35
35
  import { AdditionalValueGroupKey, additionalValueHelper } from "../internal/valuehelp/AdditionalValueHelper";
36
+ import type ODataV4Context from "sap/ui/model/odata/v4/Context";
36
37
 
37
38
  const FeCoreControlsFilterBar = "sap.fe.core.controls.FilterBar";
38
39
 
@@ -706,46 +707,42 @@ This cannot happen in case of action parameter dialog, which can be identified b
706
707
  *
707
708
  * @param valueHelp The <code>ValueHelp</code> instance
708
709
  * @param content ValueHelp content instance
709
- * @param item Entry of a given list
710
+ * @param context Context of the selected item
710
711
  * @param conditions Current conditions
711
- * @returns True, if item is selected
712
- * @since 1.101.0
712
+ * @returns Conditions or []
713
713
  */
714
- isFilterableListItemSelected: function (
714
+ findConditionsForContext: function (
715
715
  valueHelp: ValueHelp,
716
716
  content: FilterableListContent,
717
- item: Control,
717
+ context: ODataV4Context,
718
718
  conditions: ConditionObject[]
719
719
  ) {
720
720
  //In value help dialogs of single value fields the row for the key shouldn´t be selected/highlight anymore BCP: 2270175246
721
721
  const payload = valueHelp.getPayload() as ValueHelpPayload;
722
722
  if (payload.isValueListWithFixedValues !== true && (content.getConfig() as { maxConditions?: number })?.maxConditions === 1) {
723
- return false;
723
+ return [];
724
724
  }
725
-
726
- const context = item.getBindingContext();
727
-
728
725
  /* Do not consider "NotValidated" conditions */
729
726
  conditions = conditions.filter((condition) => condition.validated === ConditionValidated.Validated);
730
727
 
728
+ const vhKeys = payload.qualifiers[payload.valueHelpQualifier]?.vhKeys || [];
729
+ const keyPath = content.getKeyPath();
730
+ const valueHelpQualifier = payload.valueHelpQualifier || "";
731
731
  const selectedCondition = conditions.find(function (condition) {
732
- const conditionPayloadMap = condition?.payload as ConditionPayloadMap | undefined,
733
- valueHelpQualifier = payload.valueHelpQualifier || "";
734
- if (!conditionPayloadMap) {
735
- const keyPath = content.getKeyPath();
736
- return context?.getObject(keyPath) === condition?.values[0];
737
- }
738
- const conditionSelectedRow = conditionPayloadMap?.[valueHelpQualifier]?.[0] || {},
739
- selectedKeys = Object.keys(conditionSelectedRow);
740
- if (selectedKeys.length) {
741
- return selectedKeys.every(function (key) {
742
- return (conditionSelectedRow[key] as unknown) === context?.getObject(key);
743
- });
732
+ if (context?.getObject(keyPath) === condition?.values[0]) {
733
+ const conditionPayloadMap = condition.payload as ConditionPayloadMap;
734
+ const conditionSelectedRow = conditionPayloadMap?.[valueHelpQualifier]?.[0] || {};
735
+ if (vhKeys.length === 1 || payload?.useMultiValueField || !conditionPayloadMap) {
736
+ return context?.getObject(keyPath) === condition?.values[0];
737
+ } else {
738
+ return vhKeys.every(function (vhkey) {
739
+ return context?.getObject(vhkey) === conditionSelectedRow[vhkey];
740
+ });
741
+ }
744
742
  }
745
- return false;
746
743
  });
747
744
 
748
- return selectedCondition ? true : false;
745
+ return selectedCondition ? [selectedCondition] : [];
749
746
  },
750
747
  /**
751
748
  * Creates contexts for additional values and resumes the list binding.