@sapui5/sap.fe.core 1.136.9 → 1.136.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +48 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +61 -35
  5. package/src/sap/fe/core/AppStateHandler.js +4 -5
  6. package/src/sap/fe/core/AppStateHandler.ts +6 -5
  7. package/src/sap/fe/core/CommonUtils.js +3 -3
  8. package/src/sap/fe/core/CommonUtils.ts +2 -2
  9. package/src/sap/fe/core/PageController.controller.js +10 -0
  10. package/src/sap/fe/core/PageController.controller.ts +3 -0
  11. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +4 -4
  12. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +5 -2
  13. package/src/sap/fe/core/controllerextensions/InternalRouting.js +26 -16
  14. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +37 -16
  15. package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
  16. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +1 -1
  17. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +20 -10
  18. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +29 -13
  19. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +12 -2
  20. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +14 -7
  21. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +5 -2
  22. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +4 -1
  23. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  24. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  25. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -6
  26. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +8 -5
  27. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +2 -1
  28. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +1 -0
  29. package/src/sap/fe/core/converters/controls/Common/Action.js +15 -1
  30. package/src/sap/fe/core/converters/controls/Common/Action.ts +21 -1
  31. package/src/sap/fe/core/converters/controls/Common/Table.js +54 -46
  32. package/src/sap/fe/core/converters/controls/Common/Table.ts +65 -45
  33. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +26 -6
  34. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +32 -10
  35. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
  36. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
  37. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
  38. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
  39. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  40. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  41. package/src/sap/fe/core/fpm/manifest.json +1 -1
  42. package/src/sap/fe/core/helpers/AppStartupHelper.js +75 -18
  43. package/src/sap/fe/core/helpers/AppStartupHelper.ts +79 -25
  44. package/src/sap/fe/core/helpers/MetaModelFunction.js +10 -3
  45. package/src/sap/fe/core/helpers/MetaModelFunction.ts +9 -3
  46. package/src/sap/fe/core/helpers/ModelHelper.js +5 -2
  47. package/src/sap/fe/core/helpers/ModelHelper.ts +7 -3
  48. package/src/sap/fe/core/library.js +1 -1
  49. package/src/sap/fe/core/messagebundle_ar.properties +1 -1
  50. package/src/sap/fe/core/messagebundle_bg.properties +3 -3
  51. package/src/sap/fe/core/messagebundle_es.properties +1 -1
  52. package/src/sap/fe/core/messagebundle_fr.properties +1 -1
  53. package/src/sap/fe/core/messagebundle_ko.properties +1 -1
  54. package/src/sap/fe/core/messagebundle_no.properties +2 -2
  55. package/src/sap/fe/core/rootView/RootViewBaseController.js +3 -2
  56. package/src/sap/fe/core/rootView/RootViewBaseController.ts +2 -1
  57. package/src/sap/fe/core/services/RoutingServiceFactory.js +4 -2
  58. package/src/sap/fe/core/services/RoutingServiceFactory.ts +5 -2
  59. package/ui5.yaml +1 -0
@@ -1169,6 +1169,7 @@ class TransactionHelper {
1169
1169
  if (!oModel) {
1170
1170
  throw new Error("Pass a context for a bound action or pass the model for an unbound action");
1171
1171
  }
1172
+ const messageHandlingKey = messageHandler.registerToHoldMessages();
1172
1173
  try {
1173
1174
  const control = (mParameters.controlId ? mParameters.view.byId(mParameters.controlId) : mParameters.view) as
1174
1175
  | Control
@@ -1245,15 +1246,10 @@ class TransactionHelper {
1245
1246
  view: mParameters.view as FEView
1246
1247
  });
1247
1248
  }
1248
-
1249
- if (messageHandler) {
1250
- this._handleActionResponse(mParameters, sActionName);
1251
- }
1249
+ await this._handleActionResponse(messageHandler, mParameters, sActionName, messageHandlingKey);
1252
1250
  return oResult;
1253
1251
  } catch (err: unknown) {
1254
- if (messageHandler) {
1255
- this._handleActionResponse(mParameters, sActionName);
1256
- }
1252
+ await this._handleActionResponse(messageHandler, mParameters, sActionName, messageHandlingKey);
1257
1253
  throw err;
1258
1254
  }
1259
1255
  }
@@ -1303,17 +1299,37 @@ class TransactionHelper {
1303
1299
  }
1304
1300
  }
1305
1301
 
1306
- _handleActionResponse(
1307
- mParameters: {
1302
+ async _handleActionResponse(
1303
+ messageHandler: MessageHandler,
1304
+ parameters: {
1305
+ contexts?: ODataV4Context | ODataV4Context[] | null;
1306
+ control?: Control;
1307
+ controlId?: string;
1308
+ view?: View;
1308
1309
  label?: string;
1309
1310
  internalModelContext?: InternalModelContext | null;
1310
1311
  },
1311
- sActionName: string
1312
- ): void {
1312
+ sActionName: string,
1313
+ messageHandlingKey: string
1314
+ ): Promise<unknown> {
1315
+ const actionName = parameters.label ? parameters.label : sActionName;
1316
+
1313
1317
  const aTransientMessages = messageHandling.getMessages(true, true);
1314
- if (aTransientMessages.length > 0 && mParameters && mParameters.internalModelContext) {
1315
- mParameters.internalModelContext.setProperty("sActionName", mParameters.label ? mParameters.label : sActionName);
1318
+ if (aTransientMessages.length > 0 && parameters.internalModelContext) {
1319
+ parameters.internalModelContext.setProperty("sActionName", actionName);
1316
1320
  }
1321
+ let control;
1322
+ if (parameters.controlId && parameters.view) {
1323
+ control = parameters.view.byId(parameters.controlId);
1324
+ } else {
1325
+ control = parameters.view;
1326
+ }
1327
+ return messageHandler.showMessages({
1328
+ sActionName: actionName,
1329
+ control: control as unknown as Control,
1330
+ unHoldKey: messageHandlingKey,
1331
+ aSelectedContexts: parameters.contexts
1332
+ });
1317
1333
  }
1318
1334
 
1319
1335
  /**
@@ -688,7 +688,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/isEmptyObject", "sap/fe/core/Commo
688
688
  // occur, but needs quite specific modelling (button visibility on item level bound against service property in an FCL app)
689
689
  // and acting (looking at button on third column while discarding on 2nd column). Currently, model seems not to be prepared
690
690
  // for that case, thus due to the minimal impact (only intermediate visual state), accepting this for the time being.
691
- return !oAppComponent._isFclEnabled() && !oContext.getProperty("IsActiveEntity") && ModelHelper.isDraftRoot(getInvolvedDataModelObjects(oContext.getModel().getMetaModel().getMetaContext(oContext.getPath()))?.targetEntitySet) && oContext.getProperty("HasActiveEntity") ? oContext.getModel().delete(oContext) : oContext.delete();
691
+ const isInlineEditGroup = oContext.getUpdateGroupId() === CommonUtils.INLINEEDIT_UPDATEGROUPID;
692
+ const metaModel = oContext.getModel().getMetaModel();
693
+ const targetEntitySet = getInvolvedDataModelObjects(metaModel.getMetaContext(oContext.getPath()))?.targetEntitySet;
694
+ const useModelDelete = !oAppComponent._isFclEnabled() && !oContext.getProperty("IsActiveEntity") && ModelHelper.isDraftRoot(targetEntitySet) && oContext.getProperty("HasActiveEntity");
695
+ if (useModelDelete) {
696
+ return oContext.getModel().delete(oContext);
697
+ }
698
+ if (isInlineEditGroup) {
699
+ return oContext.delete("$auto");
700
+ }
701
+ return oContext.delete();
692
702
  }
693
703
  } else {
694
704
  //Use Discard Post Action if it is a draft entity and discard action exists
@@ -715,4 +725,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/isEmptyObject", "sap/fe/core/Commo
715
725
  };
716
726
  return draft;
717
727
  }, false);
718
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkcmFmdE9wZXJhdGlvbnMiLCJFRElUIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiZ2V0Q29udmVydGVkQWN0aW9uIiwiY29udGV4dCIsIm9wZXJhdGlvbiIsIm9wZXJhdGlvbk5hbWUiLCJtZXRhTW9kZWwiLCJhY3Rpb25QYXRoIiwiYm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnZlcnRUeXBlcyIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiZ2V0UmV0dXJuVHlwZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiYlByZXNlcnZlQ2hhbmdlcyIsIm9WaWV3IiwiZ3JvdXBJZCIsIm1lc3NhZ2VIYW5kbGVyIiwib3ZlcndyaXRlQ2hhbmdlIiwiY29udmVydGVkQWN0aW9uIiwiT3BlcmF0aW9uIiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJjb250ZXh0cyIsImxhYmVsIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImdldFRleHQiLCJiaW5kaW5nUGFyYW1ldGVycyIsIiQkaW5oZXJpdEV4cGFuZFNlbGVjdCIsIiQkdXBkYXRlR3JvdXBJZCIsInNraXBNZXNzYWdlcyIsIm9EYXRhUHJvcGVydGllcyIsImRpc2FibGVTaWRlRWZmZWN0cyIsImlnbm9yZUVUYWciLCJpc0VtcHR5T2JqZWN0IiwicmVwbGFjZVdpdGhSVkMiLCJnZXRCaW5kaW5nIiwiaXNBIiwiZGVmZXJyZWRTdWJtaXQiLCJzZXREZWZhdWx0UGFyYW1ldGVyc1ZhbHVlcyIsIlByZXNlcnZlQ2hhbmdlcyIsInJlc3VsdCIsImV4ZWN1dGUiLCJzdGF0dXMiLCJtb2RpZmllZEVycm9yIiwiRXJyb3IiLCJyZWFzb24iLCJ2YWx1ZSIsInJldHVybmVkQ29udGV4dCIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJhcHBDb21wb25lbnQiLCJNb2RlbEhlbHBlciIsImdldE1lc3NhZ2VzUGF0aCIsImRyYWZ0IiwiaXNLZWVwQWxpdmUiLCJyZXF1ZXN0T2JqZWN0IiwiZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24iLCJnZXRVcGRhdGVHcm91cElkIiwicmVxdWVzdE1lc3NhZ2VzIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZXJyb3IiLCJMb2ciLCJ1bmRlZmluZWQiLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwib0FwcENvbXBvbmVudCIsInNHcm91cElkIiwib1ByZXBhcmVQcm9taXNlIiwicmVzb3VyY2VNb2RlbCIsImlzU3RhbmRhcmRTYXZlIiwiYkhhc1ByZXBhcmVBY3Rpb24iLCJiSWdub3JlRXRhZyIsImdldFByb3BlcnR5IiwiZSIsInByZXBhcmVPcGVyYXRpb24iLCJkZXN0cm95IiwiY2xlYXIiLCJhY3Rpb25OYW1lIiwib1NpZGVFZmZlY3RzU2VydmljZSIsIm9CaW5kaW5nUGFyYW1ldGVycyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJhVGFyZ2V0UGF0aHMiLCJwYXRoRXhwcmVzc2lvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJvRXJyb3IiLCJnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUiLCJnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQiLCJtZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0IiwiY29udmVydGVkQ29udGV4dCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm1lc3NhZ2VzIiwidGFyZ2V0RW50aXR5VHlwZSIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiTWVzc2FnZXMiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsInBhdGgiLCJiTWVzc2FnZXMiLCJzTWVzc2FnZXNQYXRoIiwib09wZXJhdGlvbiIsIiRzZWxlY3QiLCJzZXRQYXJhbWV0ZXIiLCJnZXRHcm91cElkIiwiaW52b2tlIiwidGhlbiIsImNhdGNoIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiYXJndW1lbnRzIiwiZGF0YSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24iLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJkaXNhYmxlU3RyaWN0SGFuZGxpbmciLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJyb290Q29udGV4dEluZm8iLCJjcmVhdGVLZWVwQWxpdmVDb250ZXh0Iiwic3RhcnRzV2l0aCIsIm1vZGVsIiwiYWRkaXRpb25hbFBhdGgiLCJyZXBsYWNlIiwic2VnbWVudHMiLCJzdWJzdHJpbmciLCJzcGxpdCIsInVuc2hpZnQiLCJvbGRQYXRocyIsIm5ld1BhdGhzIiwiY3VycmVudFBhdGgiLCJwYXRocyIsInJvb3RTaWJsaW5nUGF0aFByb21pc2UiLCJzaGlmdCIsImNhbm9uaWNhbFBhdGhQcm9taXNlcyIsIm1hcCIsInNlZ21lbnQiLCJlbmRzV2l0aCIsInNpYmxpbmdDb250ZXh0IiwiJCRncm91cElkIiwiZ2V0Qm91bmRDb250ZXh0IiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNhbm9uaWNhbFBhdGhzIiwiYWxsIiwic29tZSIsInJvb3RTaWJsaW5nUGF0aCIsInB1c2giLCJzaWJsaW5nUGF0aCIsImZvckVhY2giLCJjYW5vbmljYWxQYXRoIiwiaW5kZXgiLCJuYXZpZ2F0aW9uIiwia2V5cyIsInBhcmFtZXRlcnMiLCJtZXNzYWdlUGF0aCIsInRhcmdldENvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwicGF0aE1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwibVBhcmFtZXRlcnMiLCJ0cmFuc2FjdGlvbkRldGFpbHMiLCJtUGFyYW0iLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsInJlc3BvbnNlIiwiZHJhZnREYXRhQ29udGV4dCIsImRyYWZ0QWRtaW5EYXRhIiwic0luZm8iLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkluUHJvY2Vzc0J5VXNlciIsInNFbnRpdHlTZXQiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsInNMb2NrZWRCeVVzZXJNc2ciLCJNZXNzYWdlQm94IiwiQ3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uIiwiQ3JlYXRlZEJ5VXNlciIsInNVbnNhdmVkQ2hhbmdlc01zZyIsInNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveCIsIm1lc3NhZ2UiLCJvRHJhZnRDb250ZXh0Iiwib1Jlc3BvbnNlIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJzaWJsaW5nSW5mbyIsIl9pc0ZjbEVuYWJsZWQiLCJ3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCIsImV4aXN0aW5nRHJhZnRSZXVzZWQiLCJjYW5jZWxlZCIsInNFZGl0QWN0aW9uTmFtZSIsIm9TaWRlRWZmZWN0cyIsInRyaWdnZXJBY3Rpb25zIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJhY3RpdmF0ZURvY3VtZW50IiwiYkV4ZWN1dGUiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0Iiwic0JhdGNoR3JvdXAiLCJpZ25vcmVFdGFnIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJzdWJtaXRCYXRjaCIsIm9BY3RpdmF0ZVByb21pc2UiLCJ2YWx1ZXMiLCJmbkFmdGVyQWN0aXZhdGVEb2N1bWVudCIsImxvY2FsSTE4blJlZiIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsInJlamVjdCIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJ0ZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImRlbGV0ZURyYWZ0IiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJzRGlzY2FyZEFjdGlvbiIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiaXNJbmFjdGl2ZSIsInJlc2V0Q2hhbmdlcyIsImlzRHJhZnRSb290IiwidGFyZ2V0RW50aXR5U2V0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJOYXZpZ2F0aW9uVHlwZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZHJhZnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb24gYXMgRWRtQWN0aW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBpc0VtcHR5T2JqZWN0IGZyb20gXCJzYXAvYmFzZS91dGlsL2lzRW1wdHlPYmplY3RcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgZHJhZnREYXRhTG9zc1BvcHVwIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdERhdGFMb3NzUG9wdXBcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0RXJyb3JUeXBlIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwiLi4vLi4vQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwiLi4vLi4vaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgT3BlcmF0aW9uIGZyb20gXCIuL29wZXJhdGlvbnMvT3BlcmF0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIFNpYmxpbmdJbmZvcm1hdGlvbiA9IHtcblx0dGFyZ2V0Q29udGV4dDogQ29udGV4dDtcblx0cGF0aE1hcHBpbmc6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdO1xufTtcblxuZXhwb3J0IHR5cGUgUm9vdENvbnRleHRJbmZvID0ge1xuXHRyb290U2libGluZ1BhdGhQcm9taXNlOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgQmluZENvbnRleHRQYXJhbWV0ZXJzID0ge1xuXHQvKipcblx0ICogVGhlIHZhbHVlIGZvciB0aGUgXCI1LjEuMiBTeXN0ZW0gUXVlcnkgT3B0aW9uICRleHBhbmRcIiBvciBhbiBvYmplY3Qgd2hpY2ggZGV0ZXJtaW5lcyB0aGF0IHZhbHVlLiBUaGUgb2JqZWN0XG5cdCAqIGlzIGEgbWFwIGZyb20gZXhwYW5kIHBhdGggdG8gZXhwYW5kIG9wdGlvbnMsIHdoZXJlIHRoZSBvcHRpb25zIGFyZSBhZ2FpbiBtYXBzIG9mIHN5c3RlbSBxdWVyeSBvcHRpb25zLFxuXHQgKiB0eXBpY2FsbHkgd2l0aCBzdHJpbmcgdmFsdWVzLiAkY291bnQgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgYSBgYm9vbGVhbmAgdmFsdWUsICRleHBhbmQgY2FuIHJlY3Vyc2l2ZWx5XG5cdCAqIGJlIGdpdmVuIGFzIGEgbWFwLCAkbGV2ZWxzIGNhbiBhbHNvIGJlIGdpdmVuIGFzIGEgYG51bWJlcmAgdmFsdWUsIGFuZCAkc2VsZWN0IGNhbiBhbHNvIGJlIGdpdmVuIGFzIGFuXG5cdCAqIGFycmF5IChidXQgd2l0aG91dCBuYXZpZ2F0aW9uIHBhdGhzKS4gQW4gZW1wdHkgbWFwIGNhbiBhbHNvIGJlIGdpdmVuIGFzIGBudWxsYCBvciBgdHJ1ZWAuIFNlZSBhbHNvIHtAbGluayBodHRwczovL3VpNS5zYXAuY29tLyMvdG9waWMvMWFiNGY2MmRlNmFiNDY3MDk2YTJhOThiMzYzYTEzNzMgUGFyYW1ldGVyc30uXG5cdCAqL1xuXHQkZXhwYW5kPzogc3RyaW5nIHwgb2JqZWN0O1xuXHQvKipcblx0ICogQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvciBhbiBhcnJheSBvZiBpdGVtcyB3aGljaCBkZXRlcm1pbmUgdGhlIHZhbHVlIGZvciB0aGUgXCI1LjEuMyBTeXN0ZW0gUXVlcnkgT3B0aW9uXG5cdCAqICRzZWxlY3RcIi4gU2luY2UgMS43NS4wLCB3aGVuIHVzaW5nIHRoZSBcImF1dG9FeHBhbmRTZWxlY3RcIiBtb2RlbCBwYXJhbWV0ZXIgKHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9KSxcblx0ICogcGF0aHMgd2l0aCBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgY2FuIGJlIGluY2x1ZGVkIGFuZCB3aWxsIGNvbnRyaWJ1dGUgdG8gdGhlIFwiNS4xLjIgU3lzdGVtIFF1ZXJ5IE9wdGlvblxuXHQgKiAkZXhwYW5kXCIuXG5cdCAqL1xuXHQkc2VsZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogV2hldGhlciBhIGJpbmRpbmcgcmVsYXRpdmUgdG8gYW4ge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSB1c2VzIHRoZSBjYW5vbmljYWwgcGF0aCBjb21wdXRlZFxuXHQgKiBmcm9tIGl0cyBjb250ZXh0J3MgcGF0aCBmb3IgZGF0YSBzZXJ2aWNlIHJlcXVlc3RzOyBvbmx5IHRoZSB2YWx1ZSBgdHJ1ZWAgaXMgYWxsb3dlZC5cblx0ICovXG5cdCQkY2Fub25pY2FsUGF0aD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgKipyZWFkKiogcmVxdWVzdHMgdHJpZ2dlcmVkIGJ5IHRoaXMgYmluZGluZzsgaWYgbm90IHNwZWNpZmllZCwgZWl0aGVyIHRoZVxuXHQgKiBwYXJlbnQgYmluZGluZydzIGdyb3VwIElEIChpZiB0aGUgYmluZGluZyBpcyByZWxhdGl2ZSkgb3IgdGhlIG1vZGVsJ3MgZ3JvdXAgSUQgaXMgdXNlZCwgc2VlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbCNjb25zdHJ1Y3Rvcn0uXG5cdCAqIFZhbGlkIHZhbHVlcyBhcmUgYHVuZGVmaW5lZGAsICckYXV0bycsICckYXV0by4qJywgJyRkaXJlY3QnIG9yIGFwcGxpY2F0aW9uIGdyb3VwIElEcyBhcyBzcGVjaWZpZWQgaW5cblx0ICoge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfS5cblx0ICovXG5cdCQkZ3JvdXBJZD86IHN0cmluZztcblx0LyoqXG5cdCAqIEZvciBvcGVyYXRpb24gYmluZGluZ3Mgb25seTogV2hldGhlciAkZXhwYW5kIGFuZCAkc2VsZWN0IGZyb20gdGhlIHBhcmVudCBiaW5kaW5nIGFyZSB1c2VkIGluIHRoZSByZXF1ZXN0XG5cdCAqIHNlbnQgb24ge0BsaW5rICNleGVjdXRlfS4gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIGJpbmRpbmcgbXVzdCBub3Qgc2V0IHRoZSAkZXhwYW5kIGl0c2VsZiwgdGhlIG9wZXJhdGlvblxuXHQgKiBtdXN0IGJlIGJvdW5kLCBhbmQgdGhlIHJldHVybiB2YWx1ZSBhbmQgdGhlIGJpbmRpbmcgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIHRoZSBzYW1lIGVudGl0eSBzZXQuXG5cdCAqL1xuXHQkJGluaGVyaXRFeHBhbmRTZWxlY3Q/OiBib29sZWFuO1xuXHQvKipcblx0ICogV2hldGhlciB0aGUgYmluZGluZyBhbHdheXMgdXNlcyBhbiBvd24gc2VydmljZSByZXF1ZXN0IHRvIHJlYWQgaXRzIGRhdGE7IG9ubHkgdGhlIHZhbHVlIGB0cnVlYCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0JCRvd25SZXF1ZXN0PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFdoZXRoZXIgaW1wbGljaXQgbG9hZGluZyBvZiBzaWRlIGVmZmVjdHMgdmlhIFBBVENIIHJlcXVlc3RzIGlzIHN3aXRjaGVkIG9mZjsgb25seSB0aGUgdmFsdWUgYHRydWVgIGlzXG5cdCAqIGFsbG93ZWQuIFRoaXMgc2V0cyB0aGUgcHJlZmVyZW5jZSBcInJldHVybj1taW5pbWFsXCIgYW5kIHJlcXVpcmVzIHRoZSBzZXJ2aWNlIHRvIHJldHVybiBhbiBFVGFnIGhlYWRlclxuXHQgKiBmb3IgXCIyMDQgTm8gQ29udGVudFwiIHJlc3BvbnNlcy4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHZhbHVlIG9mIHRoZSBwYXJlbnQgYmluZGluZyBpcyB1c2VkLlxuXHQgKi9cblx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgKip1cGRhdGUqKiByZXF1ZXN0cyB0cmlnZ2VyZWQgYnkgdGhpcyBiaW5kaW5nOyBpZiBub3Qgc3BlY2lmaWVkLCBlaXRoZXIgdGhlXG5cdCAqIHBhcmVudCBiaW5kaW5nJ3MgdXBkYXRlIGdyb3VwIElEIChpZiB0aGUgYmluZGluZyBpcyByZWxhdGl2ZSkgb3IgdGhlIG1vZGVsJ3MgdXBkYXRlIGdyb3VwIElEIGlzIHVzZWQsXG5cdCAqIHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9LiBGb3IgdmFsaWQgdmFsdWVzLCBzZWUgcGFyYW1ldGVyIFwiJCRncm91cElkXCIuXG5cdCAqL1xuXHQkJHVwZGF0ZUdyb3VwSWQ/OiBzdHJpbmc7XG59O1xuXG4vKiBDb25zdGFudHMgZm9yIGRyYWZ0IG9wZXJhdGlvbnMgKi9cbmNvbnN0IGRyYWZ0T3BlcmF0aW9ucyA9IHtcblx0RURJVDogXCJFZGl0QWN0aW9uXCIsXG5cdEFDVElWQVRJT046IFwiQWN0aXZhdGlvbkFjdGlvblwiLFxuXHRESVNDQVJEOiBcIkRpc2NhcmRBY3Rpb25cIixcblx0UFJFUEFSRTogXCJQcmVwYXJhdGlvbkFjdGlvblwiXG59O1xuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgZm9yIHRoZSBkcmFmdCBwcm9ncmFtbWluZyBtb2RlbFxuICogQG5hbWVzcGFjZVxuICogQGV4cGVyaW1lbnRhbCBUaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBleHBlcmltZW50YWwgdXNlISA8YnIvPjxiPlRoaXMgaXMgb25seSBhIFBPQyBhbmQgbWF5YmUgZGVsZXRlZDwvYj5cbiAqIEBzaW5jZSAxLjU0LjBcbiAqL1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIGFjdGlvbiBuYW1lIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBkcmFmdCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0QWN0aW9uTmFtZShvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC8ke3NPcGVyYXRpb259YCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gb3BlcmF0aW9uIGNvbnRleHQgYmluZGluZyBmb3IgdGhlIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbnRleHQgYmluZGluZyBvZiB0aGUgYm91bmQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nLCBvT3B0aW9ucz86IEJpbmRDb250ZXh0UGFyYW1ldGVycyk6IE9EYXRhQ29udGV4dEJpbmRpbmcge1xuXHRjb25zdCBzT3BlcmF0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIHNPcGVyYXRpb24pO1xuXG5cdHJldHVybiBvQ29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGAke3NPcGVyYXRpb25OYW1lfSguLi4pYCwgb0NvbnRleHQsIG9PcHRpb25zKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb252ZXJ0ZWQgYWN0aW9uIGZvciBhIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBjb250ZXh0ICBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBhY3Rpb25cbiAqL1xuZnVuY3Rpb24gZ2V0Q29udmVydGVkQWN0aW9uKGNvbnRleHQ6IENvbnRleHQsIG9wZXJhdGlvbjogc3RyaW5nKTogRWRtQWN0aW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3Qgb3BlcmF0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUoY29udGV4dCwgb3BlcmF0aW9uKTtcblx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdGFjdGlvblBhdGggPSBgJHttZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpfS8ke29wZXJhdGlvbk5hbWV9YCxcblx0XHRib3VuZEFjdGlvbiA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChhY3Rpb25QYXRoKSE7XG5cdHJldHVybiBjb252ZXJ0VHlwZXMobWV0YU1vZGVsKS5yZXNvbHZlUGF0aDxFZG1BY3Rpb24gfCB1bmRlZmluZWQ+KGJvdW5kQWN0aW9uLmdldFBhdGgoKSkudGFyZ2V0O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHJldHVybiB0eXBlIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldFJldHVyblR5cGUob0NvbnRleHQ6IENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZyk6IHVua25vd24ge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290LyR7c09wZXJhdGlvbn0vJFJldHVyblR5cGVgKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgb3B0aW9uYWwgZHJhZnQgcHJlcGFyZSBhY3Rpb24gZXhpc3RzLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIFRydWUgaWYgYSBhIHByZXBhcmUgYWN0aW9uIGV4aXN0c1xuICovXG5mdW5jdGlvbiBoYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdHJldHVybiAhIWdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkcmFmdCBmcm9tIGFuIGFjdGl2ZSBkb2N1bWVudC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBiUHJlc2VydmVDaGFuZ2VzIElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIHByZXNlcnZlZCBhbmQgYW4gZXJyb3IgaXMgc2VudCBmcm9tIHRoZSBiYWNrZW5kLCBvdGhlcndpc2UgZmFsc2UgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIG92ZXJ3cml0dGVuPC9saT5cbiAqIEBwYXJhbSBvVmlldyBJZiB0cnVlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXJcbiAqIEBwYXJhbSBncm91cElkIFRoZSBiYXRjaCBncm91cElkIGZvciBwb3N0IGNhbGwgb2YgZWRpdCBhY3Rpb25cbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciAgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG92ZXJ3cml0ZUNoYW5nZVxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdGJQcmVzZXJ2ZUNoYW5nZXM6IGJvb2xlYW4sXG5cdG9WaWV3OiBWaWV3LFxuXHRncm91cElkOiBzdHJpbmcsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0b3ZlcndyaXRlQ2hhbmdlPzogYm9vbGVhblxuKTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdC8vIElmIHRoZSBjb250ZXh0IGlzIG5vdCBsb2FkZWQgKGkuZS4gb0NvbnRleHQuZ2V0T2JqZWN0KCkgPT0gdW5kZWZpbmVkKSwgd2UgYXNzdW1lIGl0IGNvcnJlc3BvbmRzIHRvIGFuIGFjdGl2ZSBjb250ZXh0XG5cdC8vIFRoaXMgc2l0dWF0aW9uIGhhcHBlbnMgd2hlbiBvcGVuaW5nIGFuIE9QIGRpcmVjdGx5IGluIGVkaXQgbW9kZSAoSW50ZXJuYWxSb3V0aW5nLl9iaW5kUGFnZUZvckVkaXQpXG5cdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGdldENvbnZlcnRlZEFjdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQpO1xuXHRpZiAoY29udmVydGVkQWN0aW9uKSB7XG5cdFx0Y29uc3Qgb3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbihDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpLCBvQ29udGV4dC5nZXRNb2RlbCgpLCBjb252ZXJ0ZWRBY3Rpb24sIHtcblx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdGNvbnRleHRzOiBbb0NvbnRleHRdLFxuXHRcdFx0bGFiZWw6IGdldFJlc291cmNlTW9kZWwob1ZpZXcpLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpLFxuXHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlLCAkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIiB9LFxuXHRcdFx0c2tpcE1lc3NhZ2VzOiB0cnVlLFxuXHRcdFx0b0RhdGFQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdGRpc2FibGVTaWRlRWZmZWN0czogdHJ1ZSxcblx0XHRcdFx0aWdub3JlRVRhZzogaXNFbXB0eU9iamVjdChvQ29udGV4dC5nZXRPYmplY3QoKSksIC8vIElmIHRoZSBjb250ZXh0IGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0LCB3ZSBjYW4gaWdub3JlIHRoZSBFVGFnIChhcyBubyBwcmV2aW91cyBFVGFnIGlzIGF2YWlsYWJsZSlcblx0XHRcdFx0Z3JvdXBJZDogZ3JvdXBJZCxcblx0XHRcdFx0cmVwbGFjZVdpdGhSVkM6IG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSxcblx0XHRcdFx0ZGVmZXJyZWRTdWJtaXQ6IG92ZXJ3cml0ZUNoYW5nZSAhPT0gdHJ1ZSAvL1x0SWYgdGhlIGNvbnRleHQgaXMgY29taW5nIGZyb20gYSBsaXN0IGJpbmRpbmcgd2UgcGFzcyB0aGUgZmxhZyB0cnVlIHRvIHJlcGxhY2UgdGhlIGNvbnRleHQgYnkgdGhlIGFjdGl2ZSBvbmVcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvcGVyYXRpb24uc2V0RGVmYXVsdFBhcmFtZXRlcnNWYWx1ZXMoeyBQcmVzZXJ2ZUNoYW5nZXM6IGJQcmVzZXJ2ZUNoYW5nZXMgfSk7XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9uLmV4ZWN1dGUoKTtcblx0XHRpZiAocmVzdWx0WzBdLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG5cdFx0XHRjb25zdCBtb2RpZmllZEVycm9yID0gbmV3IEVycm9yKHJlc3VsdFswXS5yZWFzb24pIGFzIEVycm9yICYgeyBzdGF0dXM/OiBudW1iZXIgfTtcblx0XHRcdC8vIHdlIG5lZWQgdG8gcGVyc2lzdCB0aGUgc3RhdHVzIGluIHRoZSBlcnJvciB0byBiZSBhYmxlIHRvIHNob3cgdGhlIGxvY2tlZCBieSBhbm90aGVyIHVzZXIgZGlhbG9nXG5cdFx0XHRtb2RpZmllZEVycm9yLnN0YXR1cyA9IHJlc3VsdFswXS5yZWFzb24uc3RhdHVzO1xuXHRcdFx0dGhyb3cgbW9kaWZpZWRFcnJvcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHJlc3VsdFswXS52YWx1ZS5yZXR1cm5lZENvbnRleHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBlZGl0IGFjdGlvbiBub3QgZm91bmRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZHJhZnQuIFRoZSBQcmVwYXJlQWN0aW9uIGlzIHRyaWdnZXJlZCBpZiB0aGUgbWVzc2FnZXMgYXJlIGFubm90YXRlZCBhbmQgZW50aXR5U2V0IGdldHMgYSBQcmVwYXJhdGlvbkFjdGlvbiBhbm5vdGF0ZWQuXG4gKiBJZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGFuZCBvcGVyYXRpb24gZG9lc24ndCBnZXQgYSByZXR1cm4gdHlwZSAoUkFQIHN5c3RlbSkgdGhlIG1lc3NhZ2VzIGFyZSByZXF1ZXN0ZWQuXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgUHJlcGFyZUFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBpZ25vcmVFVGFnIElmIHNldCB0byB0cnVlLCBFVGFncyBhcmUgaWdub3JlZCB3aGVuIGV4ZWN1dGluZyB0aGUgYWN0aW9uXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnNcbiAqICAtIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb24gaWYgdGhlIGFjdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXhlY3V0ZWRcbiAqICAtIHZvaWQgaWYgdGhlIGFjdGlvbiBoYXMgZmFpbGVkXG4gKiAgLSB1bmRlZmluZWQgaWYgdGhlIGFjdGlvbiBoYXMgbm90IGJlZW4gdHJpZ2dlcmVkIHNpbmNlIHRoZSBwcmVyZXF1aXNpdGVzIGFyZSBub3QgbWV0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdFZhbGlkYXRpb24oXG5cdGNvbnRleHQ6IENvbnRleHQsXG5cdGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRpZ25vcmVFVGFnOiBib29sZWFuXG4pOiBQcm9taXNlPE9EYXRhQ29udGV4dEJpbmRpbmcgfCB2b2lkIHwgdW5kZWZpbmVkPiB7XG5cdGlmIChNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgoY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBjb250ZXh0LmdldFBhdGgoKSkgJiYgZHJhZnQuaGFzUHJlcGFyZUFjdGlvbihjb250ZXh0KSkge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoIWlnbm9yZUVUYWcgJiYgIWNvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBlbnRpdHkgcmVsYXRlZCB0byB0aGUgY29udGV4dCB0byBwb3N0IHRoZSBhY3Rpb24gd2l0aCB0aGUgSWYtTWF0Y2ggaGVhZGVyXG5cdFx0XHRcdC8vIFNvbWUgdHJpZ2dlcnMgKGVudGVyIG9uIHRhYmxlKSBjYW4gZ2VuZXJhdGUgYSBwcm9taXNlIGluIHRoZSBjYWNoZSBzbyBpZiB3ZSBkb24ndCB3YWl0IGZvciB0aGUgZW50aXR5XG5cdFx0XHRcdC8vIHRoZSBQT1NUIHdpbGwgYmUgc2VudCB3aXRob3V0IElmLU1hdGNoIGFuZCB3aWxsIGdlbmVyYXRlIGFuIGVycm9yIG9uIGJhY2tlbmQgc2lkZS5cblx0XHRcdFx0YXdhaXQgKGNvbnRleHQuZ2V0QmluZGluZygpIGFzIE9EYXRhQ29udGV4dEJpbmRpbmcpLnJlcXVlc3RPYmplY3QoXCJcIik7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvcGVyYXRpb24gPSBkcmFmdC5leGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihjb250ZXh0LCBjb250ZXh0LmdldFVwZGF0ZUdyb3VwSWQoKSwgdHJ1ZSwgaWdub3JlRVRhZyk7XG5cdFx0XHRpZiAoIWdldFJldHVyblR5cGUoY29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpKSB7XG5cdFx0XHRcdHJlcXVlc3RNZXNzYWdlcyhjb250ZXh0LCBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXdhaXQgb3BlcmF0aW9uO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lc3NhZ2VzXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBY3RpdmF0ZXMgYSBkcmFmdCBkb2N1bWVudC4gVGhlIGRyYWZ0IHdpbGwgcmVwbGFjZSB0aGUgc2libGluZyBlbnRpdHkgYW5kIHdpbGwgYmUgZGVsZXRlZCBieSB0aGUgYmFjayBlbmQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcbiAqIEBwYXJhbSBbc0dyb3VwSWRdIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIHRvIGJlIGV4ZWN1dGVkXG4gKiBAcGFyYW0gW29QcmVwYXJlUHJvbWlzZV0gVGhlIHByb21pc2Ugb2YgdGhlIHByZXBhcmUgYWN0aW9uXG4gKiBAcGFyYW0gW3Jlc291cmNlTW9kZWxdIFRoZSByZXNvdXJjZSBtb2RlbCB0byBsb2FkIHRleHQgcmVzb3VyY2VzXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHNHcm91cElkPzogc3RyaW5nLFxuXHRvUHJlcGFyZVByb21pc2U/OiBQcm9taXNlPHZvaWQgfCBPRGF0YUNvbnRleHRCaW5kaW5nPixcblx0cmVzb3VyY2VNb2RlbD86IFJlc291cmNlTW9kZWwsXG5cdGlzU3RhbmRhcmRTYXZlPzogYm9vbGVhbiB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxDb250ZXh0PiB7XG5cdGNvbnN0IGJIYXNQcmVwYXJlQWN0aW9uID0gZHJhZnQuaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCk7XG5cdC8vIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3BlYyBpZiB0aGUgc2VydmljZSBjb250YWlucyBhIHByZXBhcmUgYWN0aW9uIGFuZCB3ZSB0cmlnZ2VyIGJvdGggcHJlcGFyZSBhbmRcblx0Ly8gYWN0aXZhdGUgaW4gb25lICRiYXRjaCB0aGUgYWN0aXZhdGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRoIGlGLU1hdGNoPSpcblx0Y29uc3QgYklnbm9yZUV0YWcgPSBiSGFzUHJlcGFyZUFjdGlvbjtcblx0bGV0IG9wZXJhdGlvbjogT3BlcmF0aW9uIHwgdW5kZWZpbmVkO1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBjb252ZXJ0ZWRBY3Rpb24gPSBnZXRDb252ZXJ0ZWRBY3Rpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5BQ1RJVkFUSU9OKTtcblx0XHRjb25zdCBsYWJlbCA9IGlzU3RhbmRhcmRTYXZlID8gcmVzb3VyY2VNb2RlbD8uZ2V0VGV4dChcIlRfT1BfT0JKRUNUX1BBR0VfU0FWRVwiKSA6IHJlc291cmNlTW9kZWw/LmdldFRleHQoXCJDX09QX09CSkVDVF9QQUdFX1NBVkVcIik7XG5cdFx0aWYgKGNvbnZlcnRlZEFjdGlvbikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0b3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbihvQXBwQ29tcG9uZW50LCBvQ29udGV4dC5nZXRNb2RlbCgpLCBjb252ZXJ0ZWRBY3Rpb24sIHtcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdFx0Y29udGV4dHM6IFtvQ29udGV4dF0sXG5cdFx0XHRcdFx0bGFiZWw6IGxhYmVsLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSB9LFxuXHRcdFx0XHRcdHNraXBNZXNzYWdlczogdHJ1ZSxcblx0XHRcdFx0XHRvRGF0YVByb3BlcnRpZXM6IHtcblx0XHRcdFx0XHRcdGRpc2FibGVTaWRlRWZmZWN0czogdHJ1ZSxcblx0XHRcdFx0XHRcdGdyb3VwSWQ6IHNHcm91cElkLFxuXHRcdFx0XHRcdFx0aWdub3JlRVRhZzogYklnbm9yZUV0YWcsXG5cdFx0XHRcdFx0XHRyZXBsYWNlV2l0aFJWQzogb0NvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9uLmV4ZWN1dGUoKTtcblx0XHRcdFx0aWYgKHJlc3VsdFswXS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihyZXN1bHRbMF0ucmVhc29uKTtcblx0XHRcdFx0fSBlbHNlIGlmIChyZXN1bHRbMF0udmFsdWUucmV0dXJuZWRDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdFswXS52YWx1ZS5yZXR1cm5lZENvbnRleHQ7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGlmIChiSGFzUHJlcGFyZUFjdGlvbikge1xuXHRcdFx0XHRcdC8vIGRlc3Ryb3kgdGhlIG9wZXJhdGlvbiBiaW5kaW5ncyB0byBhdm9pZCBhZGRpdGlvbmFsIG1lc3NhZ2UgcmVxdWVzdHMgc2VudCBieSB0aGUgbW9kZWxcblx0XHRcdFx0XHRjb25zdCBwcmVwYXJlT3BlcmF0aW9uID0gYXdhaXQgb1ByZXBhcmVQcm9taXNlO1xuXHRcdFx0XHRcdHByZXBhcmVPcGVyYXRpb24/LmRlc3Ryb3koKTtcblx0XHRcdFx0XHRvcGVyYXRpb24/LmNsZWFyKCk7XG5cblx0XHRcdFx0XHRjb25zdCBhY3Rpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpLFxuXHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZSA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCksXG5cdFx0XHRcdFx0XHRvQmluZGluZ1BhcmFtZXRlcnMgPSBvU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoYWN0aW9uTmFtZSwgb0NvbnRleHQpLFxuXHRcdFx0XHRcdFx0YVRhcmdldFBhdGhzID0gb0JpbmRpbmdQYXJhbWV0ZXJzICYmIG9CaW5kaW5nUGFyYW1ldGVycy5wYXRoRXhwcmVzc2lvbnM7XG5cdFx0XHRcdFx0aWYgKGFUYXJnZXRQYXRocyAmJiBhVGFyZ2V0UGF0aHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldFBhdGhzLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHJlcXVlc3RNZXNzYWdlcyhvQ29udGV4dCwgb1NpZGVFZmZlY3RzU2VydmljZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZXNzYWdlc1wiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGFjdGl2YXRpb24gYWN0aW9uIG5vdCBmb3VuZFwiKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGFjdGl2YXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzdXBwb3J0ZWQgbWVzc2FnZSBwcm9wZXJ0eSBwYXRoIG9uIHRoZSBQcmVwYXJlQWN0aW9uIGZvciBhIGNvbnRleHQuXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIFBhdGggdG8gdGhlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZVBhdGhGb3JQcmVwYXJlKGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHQvLyBJZiB0aGVyZSBpcyBubyByZXR1cm4gcGFyYW1ldGVyLCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVxdWVzdCBNZXNzYWdlcy5cblx0Ly8gUkFQIGRyYWZ0IHByZXBhcmUgaGFzIG5vIHJldHVybiBwYXJhbWV0ZXJcblx0cmV0dXJuIGdldFJldHVyblR5cGUoY29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpID8gZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KGNvbnRleHQpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHN1cHBvcnRlZCBtZXNzYWdlIHByb3BlcnR5IHBhdGggZm9yIGEgY29udGV4dC5cbiAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgUGF0aCB0byB0aGUgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQoY29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IG1ldGFDb250ZXh0ID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0Y29uc3QgY29udmVydGVkQ29udGV4dCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCk7XG5cdGNvbnN0IG1lc3NhZ2VzID0gY29udmVydGVkQ29udGV4dC50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uTWVzc2FnZXM7XG5cdHJldHVybiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihtZXNzYWdlcykgPyBtZXNzYWdlcy5wYXRoIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEV4ZWN1dGUgYSBwcmVwYXJhdGlvbiBhY3Rpb24uXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gZ3JvdXBJZCBUaGUgb3B0aW9uYWwgYmF0Y2ggZ3JvdXAgaW4gd2hpY2ggd2Ugd2FudCB0byBleGVjdXRlIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBiTWVzc2FnZXMgSWYgc2V0IHRvIHRydWUsIHRoZSBQUkVQQVJFIGFjdGlvbiByZXRyaWV2ZXMgU0FQX01lc3NhZ2VzXG4gKiBAcGFyYW0gaWdub3JlRVRhZyBJZiBzZXQgdG8gdHJ1ZSwgRVRhZyBpbmZvcm1hdGlvbiBpcyBpZ25vcmVkIHdoZW4gdGhlIGFjdGlvbiBpcyBleGVjdXRlZFxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24oXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRncm91cElkPzogc3RyaW5nLFxuXHRiTWVzc2FnZXM/OiBib29sZWFuLFxuXHRpZ25vcmVFVGFnPzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkIHwgT0RhdGFDb250ZXh0QmluZGluZz4ge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBzTWVzc2FnZXNQYXRoID0gYk1lc3NhZ2VzID8gZ2V0TWVzc2FnZVBhdGhGb3JQcmVwYXJlKG9Db250ZXh0KSA6IHVuZGVmaW5lZDtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSwgc01lc3NhZ2VzUGF0aCA/IHsgJHNlbGVjdDogc01lc3NhZ2VzUGF0aCB9IDogdW5kZWZpbmVkKTtcblxuXHRcdC8vIFRPRE86IHNpZGUgZWZmZWN0cyBxdWFsaWZpZXIgc2hhbGwgYmUgZXZlbiBkZXByZWNhdGVkIHRvIGJlIGNoZWNrZWRcblx0XHRvT3BlcmF0aW9uLnNldFBhcmFtZXRlcihcIlNpZGVFZmZlY3RzUXVhbGlmaWVyXCIsIFwiXCIpO1xuXG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBncm91cElkIHx8IG9PcGVyYXRpb24uZ2V0R3JvdXBJZCgpO1xuXHRcdHJldHVybiBvT3BlcmF0aW9uXG5cdFx0XHQuaW52b2tlKHNHcm91cElkLCBpZ25vcmVFVGFnKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gb09wZXJhdGlvbjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvblwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb247XG5cdFx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJlcGFyYXRpb24gYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyB0aGUgbWVzc2FnZXMgaWYgYW5ub3RhdGVkIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIG1lc3NhZ2VzIHNoYWxsIGJlIHJlcXVlc3RlZFxuICogQHBhcmFtIG9TaWRlRWZmZWN0c1NlcnZpY2UgU2VydmljZSBmb3IgdGhlIFNpZGVFZmZlY3RzIG9uIFNBUCBGaW9yaSBlbGVtZW50c1xuICogQHBhcmFtIHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyBJZiBzZXQgdG8gdHJ1ZSwgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcmUgcmVtb3ZlZCBpZiBzdGF0ZSBtZXNzYWdlcyBleGlzdFxuICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIG1lc3NhZ2VzIHdlcmUgcmVxdWVzdGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RNZXNzYWdlcyhcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9TaWRlRWZmZWN0c1NlcnZpY2U6IFNpZGVFZmZlY3RzU2VydmljZSxcblx0cmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzID0gZmFsc2Vcbik6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBzTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0YXdhaXQgb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3NNZXNzYWdlc1BhdGhdLCBvQ29udGV4dCk7XG5cdFx0aWYgKHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcykge1xuXHRcdFx0Y29uc3QgZGF0YSA9IGF3YWl0IG9Db250ZXh0LnJlcXVlc3RPYmplY3QoKTtcblx0XHRcdGlmIChkYXRhW3NNZXNzYWdlc1BhdGhdLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Ly9pZiBzdGF0ZSBtZXNzYWdlcyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIFBSRVBBUkFUSU9OIGFjdGlvbiwgdGhlbiBwcmV2aW91cyB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFyZSByZW1vdmVkXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm47XG59XG4vKipcbiAqIEV4ZWN1dGVzIGRpc2NhcmQgb2YgYSBkcmFmdCBmdW5jdGlvbiB1c2luZyBIVFRQIFBvc3QuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgQXBwIENvbXBvbmVudFxuICogQHBhcmFtIGJFbmFibGVTdHJpY3RIYW5kbGluZ1xuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3QgY29udmVydGVkQWN0aW9uID0gZ2V0Q29udmVydGVkQWN0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCk7XG5cdFx0aWYgKGNvbnZlcnRlZEFjdGlvbikge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3IE9wZXJhdGlvbihvQXBwQ29tcG9uZW50LCBvQ29udGV4dC5nZXRNb2RlbCgpLCBjb252ZXJ0ZWRBY3Rpb24sIHtcblx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRsYWJlbDogZ2V0UmVzb3VyY2VNb2RlbChvQXBwQ29tcG9uZW50KT8uZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIpIHx8IFwiXCIsXG5cdFx0XHRcdGNvbnRleHRzOiBbb0NvbnRleHRdLFxuXHRcdFx0XHRza2lwTWVzc2FnZXM6IHRydWUsXG5cdFx0XHRcdG9EYXRhUHJvcGVydGllczoge1xuXHRcdFx0XHRcdGRpc2FibGVTaWRlRWZmZWN0czogdHJ1ZSxcblx0XHRcdFx0XHRkaXNhYmxlU3RyaWN0SGFuZGxpbmc6ICFiRW5hYmxlU3RyaWN0SGFuZGxpbmcsXG5cdFx0XHRcdFx0aWdub3JlRVRhZzogaXNFbXB0eU9iamVjdChvQ29udGV4dC5nZXRPYmplY3QoKSksIC8vIElmIHRoZSBjb250ZXh0IGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0LCB3ZSBjYW4gaWdub3JlIHRoZSBFVGFnIChhcyBubyBwcmV2aW91cyBFVGFnIGlzIGF2YWlsYWJsZSlcblx0XHRcdFx0XHRncm91cElkOiBcImRpcmVjdFwiLFxuXHRcdFx0XHRcdHJlcGxhY2VXaXRoUlZDOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0ZGVmZXJyZWRTdWJtaXQ6IGZhbHNlXG5cdFx0XHRcdH1cblx0XHRcdH0pLmV4ZWN1dGUoKTtcblx0XHRcdGlmIChyZXN1bHRbMF0uc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKHJlc3VsdFswXS5yZWFzb24pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gbm90IGZvdW5kXCIpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZGlzY2FyZCBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGggZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHNcbiAqIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG4gKiBAcGFyYW0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcbiAqIEBwYXJhbSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0IHBhZ2VcbiAqIEBwYXJhbSByb290Q29udGV4dEluZm8gVGhlIGNvbnRleHQgaW5mbyBvZiByb290IG9mIHRoZSBkcmFmdFxuICogQHBhcmFtIGdyb3VwSWRcbiAqIEBwYXJhbSBiaW5kaW5nUGFyYW1ldGVycyBPcHRpb25hbCBiaW5kaW5nIHBhcmFtZXRlcnMgd2hlbiBjcmVhdGluZyB0aGUgY29udGV4dFxuICogQHBhcmFtIGNyZWF0ZUtlZXBBbGl2ZUNvbnRleHQgSWYgc2V0IHRvIHRydWUsIHRoZSBjb250ZXh0IHdpbGwgYmUgY3JlYXRlZCBhcyBhIGtlZXAtYWxpdmUgY29udGV4dFxuICogQHJldHVybnMgVGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0cm9vdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRncm91cElkPzogc3RyaW5nLFxuXHRiaW5kaW5nUGFyYW1ldGVycz86IG9iamVjdCxcblx0Y3JlYXRlS2VlcEFsaXZlQ29udGV4dCA9IGZhbHNlXG4pOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0Ly8gV3JvbmcgdXNhZ2UgISFcblx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdH1cblxuXHRpZiAoXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UgJiZcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2Vcblx0KSB7XG5cdFx0Ly8gV2UgYWxyZWFkeSBrbm93IHRoZSBzaWJsaW5nIGZvciByaWdodG1vc3RDdXJyZW50Q29udGV4dCBkb2Vzbid0IGV4aXN0XG5cdFx0Ly8gLS0+IE5vIG5lZWQgdG8gY2hlY2sgY2Fub25pY2FsIHBhdGhzIGV0Yy4uLlxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb25zdCBtb2RlbCA9IHJvb3RDdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpO1xuXHR0cnkge1xuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDEuIEZpbmQgYWxsIHNlZ21lbnRzIGJldHdlZW4gdGhlIHJvb3Qgb2JqZWN0IGFuZCB0aGUgc3ViLW9iamVjdFxuXHRcdC8vIEV4YW1wbGU6IGZvciByb290ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpIGFuZCByaWdodE1vc3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZClcblx0XHQvLyAtLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXG5cdFx0Ly8gRmluZCBhbGwgc2VnbWVudHMgaW4gdGhlIHJpZ2h0bW9zdCBwYXRoXG5cdFx0Y29uc3QgYWRkaXRpb25hbFBhdGggPSByaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkucmVwbGFjZShyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLCBcIlwiKTtcblx0XHRjb25zdCBzZWdtZW50cyA9IGFkZGl0aW9uYWxQYXRoID8gYWRkaXRpb25hbFBhdGguc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKSA6IFtdO1xuXHRcdC8vIEZpcnN0IHNlZ21lbnQgaXMgYWx3YXlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIHJvb3Qgb2JqZWN0LCB3aGljaCBjYW4gY29udGFpbiAnLycgaW4gY2FzZSBvZiBhIHBhcmFtZXRyaXplZCBlbnRpdHlcblx0XHRzZWdtZW50cy51bnNoaWZ0KHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDIuIFJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIG9mIHRoZSBzaWJsaW5nIGVudGl0eSBmb3IgZWFjaCBzZWdtZW50XG5cdFx0Ly8gRXhhbXBsZTogZm9yIFtcIlBhcmFtKGFhKS9FbnRpdHkoYmIpXCIsIFwiX05hdihjYylcIiwgXCJfU3ViTmF2KGRkKVwiXVxuXHRcdC8vIC0tPiByZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBmb3IgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9TaWJsaW5nRW50aXR5XCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpL1NpYmxpbmdFbnRpdHlcIlxuXHRcdGNvbnN0IG9sZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IG5ld1BhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCBjdXJyZW50UGF0aCA9IFwiXCI7XG5cblx0XHQvLyBDb21wdXRpbmcgc2libGluZyBlbnRpdHkgb2Ygcm9vdCBvZiB0aGUgZHJhZnQgY29udGV4dCBpcyBub3QgcmVxdWlyZWQgaWYgdGhlIGNvbnRleHQgaXMgYWxyZWFkeSBpbiB0aGUgc3ViLU9QXG5cdFx0Ly8gRXhhbXBsZTogRWRpdCBpbiBTdWItT1Agd2hlcmUgbmV3IGNvbnRleHQgaXMgYWxyZWFkeSBhdmFpbGFibGVcblx0XHRjb25zdCBwYXRocyA9IFsuLi5zZWdtZW50c107XG5cdFx0aWYgKHJvb3RDb250ZXh0SW5mbz8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSkge1xuXHRcdFx0cGF0aHMuc2hpZnQoKTtcblx0XHRcdGN1cnJlbnRQYXRoID0gXCIvXCIgKyByb290Q3VycmVudENvbnRleHQ/LmdldFBhdGgoKT8uc3Vic3RyaW5nKDEpO1xuXHRcdH1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRoUHJvbWlzZXMgPSBwYXRocy5tYXAoYXN5bmMgKHNlZ21lbnQpID0+IHtcblx0XHRcdGN1cnJlbnRQYXRoICs9IGAvJHtzZWdtZW50fWA7XG5cdFx0XHRvbGRQYXRocy51bnNoaWZ0KGN1cnJlbnRQYXRoKTtcblx0XHRcdGlmIChjdXJyZW50UGF0aC5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbFxuXHRcdFx0XHRcdC5iaW5kQ29udGV4dChgJHtjdXJyZW50UGF0aH0vU2libGluZ0VudGl0eWAsIHVuZGVmaW5lZCwgZ3JvdXBJZCA/IHsgJCRncm91cElkOiBncm91cElkIH0gOiB1bmRlZmluZWQpXG5cdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRyZXR1cm4gc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTsgLy8gMS0xIHJlbGF0aW9uXG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAzLiBSZWNvbnN0cnVjdCB0aGUgZnVsbCBwYXRocyBmcm9tIGNhbm9uaWNhbCBwYXRocyAoZm9yIHBhdGggbWFwcGluZylcblx0XHQvLyBFeGFtcGxlOiBmb3IgY2Fub25pY2FsIHBhdGhzIFwiL1BhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZylcIiwgXCIvRW50aXR5MihjYy1zaWJsaW5nKVwiLCBcIi9FbnRpdHkzKGRkLXNpYmxpbmcpXCJcblx0XHQvLyAtLT4gW1wiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZykvX05hdihjYy1zaWJsaW5nKVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZykvX05hdihjYy1zaWJsaW5nKS9fU3ViTmF2KGRkLXNpYmxpbmcpXCJdXG5cdFx0Y29uc3QgY2Fub25pY2FsUGF0aHMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoY2Fub25pY2FsUGF0aFByb21pc2VzKSkgYXMgc3RyaW5nW107XG5cblx0XHQvLyBXb3JrYXJvdW5kICh0ZW1wb3JhcnkgPyk6IHdoZW4gdGhlIHNpYmxpbmcgZG9lc24ndCBleGlzdCwgcmVxdWVzdENhbm9uaWNhbFBhdGggcmV0dXJucyB0aGUgc2FtZSBwYXRoXG5cdFx0aWYgKFxuXHRcdFx0Y2Fub25pY2FsUGF0aHMuc29tZSgocGF0aCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gcGF0aCAmJiBwYXRoLmVuZHNXaXRoKFwiL1NpYmxpbmdFbnRpdHlcIik7XG5cdFx0XHR9KVxuXHRcdCkge1xuXHRcdFx0Ly8gQXQgbGVhc3Qgb25lIHNpYmxpbmcgZW50aXR5IGRvZXNuJ3QgZXhpc3Rcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0aWYgKHJvb3RDb250ZXh0SW5mbz8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSkge1xuXHRcdFx0Y29uc3Qgcm9vdFNpYmxpbmdQYXRoID0gKGF3YWl0IHJvb3RDb250ZXh0SW5mby5yb290U2libGluZ1BhdGhQcm9taXNlKT8uZ2V0UGF0aCgpIGFzIHN0cmluZztcblx0XHRcdGNhbm9uaWNhbFBhdGhzLnVuc2hpZnQocm9vdFNpYmxpbmdQYXRoKTtcblx0XHRcdG9sZFBhdGhzLnB1c2gocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0fVxuXHRcdGxldCBzaWJsaW5nUGF0aCA9IFwiXCI7XG5cdFx0Y2Fub25pY2FsUGF0aHMuZm9yRWFjaCgoY2Fub25pY2FsUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdGlmIChpbmRleCAhPT0gMCkge1xuXHRcdFx0XHRpZiAoc2VnbWVudHNbaW5kZXhdLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IG5hdmlnYXRpb24gPSBzZWdtZW50c1tpbmRleF0ucmVwbGFjZSgvXFwoLiokLywgXCJcIik7IC8vIEtlZXAgb25seSBuYXZpZ2F0aW9uIG5hbWUgZnJvbSB0aGUgc2VnbWVudCwgaS5lLiBhYWEoeHh4KSAtLT4gYWFhXG5cdFx0XHRcdFx0Y29uc3Qga2V5cyA9IGNhbm9uaWNhbFBhdGgucmVwbGFjZSgvLipcXCgvLCBcIihcIik7IC8vIEtlZXAgb25seSB0aGUga2V5cyBmcm9tIHRoZSBjYW5vbmljYWwgcGF0aCwgaS5lLiBhYWEoeHh4KSAtLT4gKHh4eClcblx0XHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7bmF2aWdhdGlvbn0ke2tleXN9YDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzaWJsaW5nUGF0aCArPSBgLyR7c2VnbWVudHNbaW5kZXhdfWA7IC8vIDEtMSByZWxhdGlvblxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzaWJsaW5nUGF0aCA9IGNhbm9uaWNhbFBhdGg7IC8vIFRvIG1hbmFnZSBwYXJhbWV0cml6ZWQgZW50aXRpZXNcblx0XHRcdH1cblx0XHRcdG5ld1BhdGhzLnVuc2hpZnQoc2libGluZ1BhdGgpO1xuXHRcdH0pO1xuXG5cdFx0bGV0IHBhcmFtZXRlcnM6IHsgJHNlbGVjdD86IHN0cmluZzsgJCRncm91cElkPzogc3RyaW5nIH07XG5cdFx0Y29uc3QgbWVzc2FnZVBhdGggPSBnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQocmlnaHRtb3N0Q3VycmVudENvbnRleHQpO1xuXHRcdGlmIChjcmVhdGVLZWVwQWxpdmVDb250ZXh0KSB7XG5cdFx0XHRwYXJhbWV0ZXJzID0geyAkJGdyb3VwSWQ6IFwiJGF1dG8uV29ya2Vyc1wiIH07IC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBzYW1lIGdyb3VwIElEIGFzIGZvciB0aGUgcGFyZW50IGxpc3QgYmluZGluZ1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJhbWV0ZXJzID0gYmluZGluZ1BhcmFtZXRlcnMgPz8ge307XG5cdFx0XHRpZiAobWVzc2FnZVBhdGgpIHtcblx0XHRcdFx0aWYgKHBhcmFtZXRlcnMuJHNlbGVjdCkge1xuXHRcdFx0XHRcdHBhcmFtZXRlcnMuJHNlbGVjdCArPSBgLCR7bWVzc2FnZVBhdGh9YDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLiRzZWxlY3QgPSBtZXNzYWdlUGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cGFyYW1ldGVycy4kJGdyb3VwSWQgPSBcIiRhdXRvLkhlcm9lc1wiO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBjcmVhdGVLZWVwQWxpdmVDb250ZXh0XG5cdFx0XHRcdD8gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChzaWJsaW5nUGF0aCwgISFtZXNzYWdlUGF0aCwgcGFyYW1ldGVycylcblx0XHRcdFx0OiBtb2RlbC5iaW5kQ29udGV4dChzaWJsaW5nUGF0aCwgdW5kZWZpbmVkLCBwYXJhbWV0ZXJzKS5nZXRCb3VuZENvbnRleHQoKSwgLy8gQ3JlYXRlIHRoZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0IGZyb20gaXRzIHBhdGhcblx0XHRcdHBhdGhNYXBwaW5nOiBvbGRQYXRocy5tYXAoKG9sZFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0b2xkUGF0aCxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdQYXRoc1tpbmRleF1cblx0XHRcdFx0fTtcblx0XHRcdH0pXG5cdFx0fTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBBIGNhbm9uaWNhbCBwYXRoIGNvdWxkbid0IGJlIHJlc29sdmVkIChiZWNhdXNlIGEgc2libGluZyBkb2Vzbid0IGV4aXN0KVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZnJvbSBhbiBleGlzdGluZyBkb2N1bWVudC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gc3VwcG9ydHMgc2V2ZXJhbCBob29rcyBhcyB0aGVyZSBpcyBhIGNlcnRhaW4gY29yZW9ncmFwaHkgZGVmaW5lZC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtUGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5vVmlld10gVGhlIHZpZXdcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuYlByZXNlcnZlQ2hhbmdlc10gUHJlc2VydmUgY2hhbmdlcyBvZiBhbiBleGlzdGluZyBkcmFmdCBvZiBhbm90aGVyIHVzZXJcbiAqIEBwYXJhbSBncm91cElkIFRoZSBiYXRjaCBncm91cElkIGZvciBwb3N0IGNhbGwgb2YgZWRpdCBhY3Rpb25cbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gdHJhbnNhY3Rpb25EZXRhaWxzIE9wdGlvbmFsIG9iamVjdCB0byByZXR1cm4gYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IGhvdyB0aGUgdHJhbnNhY3Rpb24gd2FzIGV4ZWN1dGVkXG4gKiBAcGFyYW0gdHJhbnNhY3Rpb25EZXRhaWxzLmV4aXN0aW5nRHJhZnRSZXVzZWQgQW4gZXhpc3RpbmcgZHJhZnQgd2FzIHJldHVybmVkLCBpbnN0ZWFkIG9mIHJldHVybmluZyBhIG5ldyBvbmVcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQoXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b1ZpZXc6IEZFVmlldztcblx0XHRiUHJlc2VydmVDaGFuZ2VzPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0fSxcblx0Z3JvdXBJZDogc3RyaW5nLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdHRyYW5zYWN0aW9uRGV0YWlscz86IHtcblx0XHRleGlzdGluZ0RyYWZ0UmV1c2VkPzogYm9vbGVhbjtcblx0fVxuKTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9LFxuXHRcdGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ID1cblx0XHRcdHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAodHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcImJvb2xlYW5cIiAmJiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyk7IC8vZGVmYXVsdCB0cnVlXG5cblx0LyoqXG5cdCAqIE92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgY2hhbmdlLlxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0IG9yIHRoZSBlcnJvciByZXRyaWV2ZWRcblx0ICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCByZXN1bHQgb2Yge0BsaW5rIHNhcC5mZS5jb3JlLmFjdGlvbnMjZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbn1cblx0ICovXG5cdGFzeW5jIGZ1bmN0aW9uIG92ZXJ3cml0ZUNoYW5nZShyZXNwb25zZTogQ29udGV4dCB8IENvbnRleHRFcnJvclR5cGUpOiBQcm9taXNlPENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlIHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly9PdmVyd3JpdGUgZXhpc3RpbmcgY2hhbmdlc1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L0RyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhYCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwobVBhcmFtZXRlcnMub1ZpZXcpO1xuXHRcdGNvbnN0IGRyYWZ0QWRtaW5EYXRhID0gYXdhaXQgZHJhZnREYXRhQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHQvLyByZW1vdmUgYWxsIHVuYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcyB3ZSBzaG93IGEgc3BlY2lhbCBkaWFsb2dcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRsZXQgc0luZm8gPSBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gbVBhcmFtZXRlcnMub1ZpZXcuZ2V0Vmlld0RhdGEoKS5lbnRpdHlTZXQ7XG5cdFx0XHRpZiAoc0luZm8pIHtcblx0XHRcdFx0Y29uc3Qgc0xvY2tlZEJ5VXNlck1zZyA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfTE9DS0VEX0JZX1VTRVJcIiwgc0luZm8sIHNFbnRpdHlTZXQpO1xuXHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyO1xuXHRcdFx0XHRjb25zdCBzVW5zYXZlZENoYW5nZXNNc2cgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX0RSQUZUX1VOU0FWRURfQ0hBTkdFU1wiLCBzSW5mbywgc0VudGl0eVNldCk7XG5cdFx0XHRcdGF3YWl0IGRyYWZ0LnNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveChzVW5zYXZlZENoYW5nZXNNc2csIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIGRyYWZ0LmV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGZhbHNlLCBtUGFyYW1ldGVycy5vVmlldywgZ3JvdXBJZCwgbWVzc2FnZUhhbmRsZXIsIHRydWUpOyAvLyB0cnVlIGJlY2F1c2Ugd2Ugb3ZlcndyaXRlIGNoYW5nZXNcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKChyZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKT8ubWVzc2FnZSkge1xuXHRcdFx0TWVzc2FnZUJveC5lcnJvcigocmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkubWVzc2FnZSk7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBFcnJvcihgRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHR9XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdH1cblx0bGV0IG9EcmFmdENvbnRleHQ6IENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlIHwgdW5kZWZpbmVkO1xuXHR0cnkge1xuXHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBkcmFmdC5leGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdywgbVBhcmFtZXRlcnMub1ZpZXcsIGdyb3VwSWQsIG1lc3NhZ2VIYW5kbGVyKTtcblx0fSBjYXRjaCAob1Jlc3BvbnNlKSB7XG5cdFx0aWYgKChvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkuc3RhdHVzID09PSA0MDkgfHwgKG9SZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKS5zdGF0dXMgPT09IDQyMykge1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0Y29uc3QgYmluZGluZ1BhcmFtZXRlcnMgPSBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKVxuXHRcdFx0XHQ/IHsgJHNlbGVjdDogXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdEFkbWluaXN0cmF0aXZlVXNlclwiIH1cblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBzaWJsaW5nSW5mbyA9IGF3YWl0IGRyYWZ0LmNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRvQXBwQ29tcG9uZW50Ll9pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0KTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbz8udGFyZ2V0Q29udGV4dCkge1xuXHRcdFx0XHQvL3RoZXJlIGlzIGEgY29udGV4dCBhdXRob3JpemVkIHRvIGJlIGVkaXRlZCBieSB0aGUgY3VycmVudCB1c2VyXG5cdFx0XHRcdGF3YWl0IENvbW1vblV0aWxzLndhaXRGb3JDb250ZXh0UmVxdWVzdGVkKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQpO1xuXHRcdFx0XHRpZiAodHJhbnNhY3Rpb25EZXRhaWxzKSB7XG5cdFx0XHRcdFx0dHJhbnNhY3Rpb25EZXRhaWxzLmV4aXN0aW5nRHJhZnRSZXVzZWQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL3RoZXJlIGlzIG5vIGRyYWZ0IG93bmVkIGJ5IHRoZSBjdXJyZW50IHVzZXJcblx0XHRcdFx0b0RyYWZ0Q29udGV4dCA9IGF3YWl0IG92ZXJ3cml0ZUNoYW5nZShvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghKG9SZXNwb25zZSAmJiAob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLmNhbmNlbGVkKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKG9SZXNwb25zZSBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChvRHJhZnRDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc0VkaXRBY3Rpb25OYW1lID0gZHJhZnQuZ2V0QWN0aW9uTmFtZShvRHJhZnRDb250ZXh0IGFzIENvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElUKTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHMgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0VkaXRBY3Rpb25OYW1lLCBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdGlmIChvU2lkZUVmZmVjdHM/LnRyaWdnZXJBY3Rpb25zPy5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24ob1NpZGVFZmZlY3RzLCBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQgYXMgQ29udGV4dDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQgYXMgQ29udGV4dDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEBwYXJhbSBtUGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIHRoYXQgYWxsb3dzIGEgdmV0byBiZWZvcmUgdGhlICdDcmVhdGUnIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZm5BZnRlckFjdGl2YXRlRG9jdW1lbnRdIENhbGxiYWNrIGZvciBwb3N0cHJvY2Vzc2luZyBhZnRlciBkb2N1bWVudCB3YXMgYWN0aXZhdGVkLlxuICogQHBhcmFtIFttUGFyYW1ldGVycy5yZXNvdXJjZU1vZGVsXSBSZXNvdXJjZSBNb2RlbFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICovXG5hc3luYyBmdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdG1QYXJhbWV0ZXJzOiB7IGZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudD86IEZ1bmN0aW9uOyBmbkFmdGVyQWN0aXZhdGVEb2N1bWVudD86IEZ1bmN0aW9uOyByZXNvdXJjZU1vZGVsPzogUmVzb3VyY2VNb2RlbCB9LFxuXHRpc1N0YW5kYXJkU2F2ZT86IGJvb2xlYW4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8Q29udGV4dD4ge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBkcmFmdCBkb2N1bWVudCBpcyByZXF1aXJlZFwiKTtcblx0fVxuXG5cdGNvbnN0IGJFeGVjdXRlID0gbVBhcmFtLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudCA/IGF3YWl0IG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQpIDogdHJ1ZTtcblx0aWYgKCFiRXhlY3V0ZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgQWN0aXZhdGlvbiBvZiB0aGUgZG9jdW1lbnQgd2FzIGFib3J0ZWQgYnkgZXh0ZW5zaW9uIGZvciBkb2N1bWVudDogJHtvQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdH1cblxuXHRsZXQgb0FjdGl2ZURvY3VtZW50Q29udGV4dDogQ29udGV4dDtcblx0aWYgKCFkcmFmdC5oYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0KSkge1xuXHRcdG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSBhd2FpdCBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKFxuXHRcdFx0b0NvbnRleHQsXG5cdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRtUGFyYW1ldGVycy5yZXNvdXJjZU1vZGVsXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHQvKiBhY3RpdmF0aW9uIHJlcXVpcmVzIHByZXBhcmF0aW9uICovXG5cdFx0Y29uc3Qgc0JhdGNoR3JvdXAgPSBcIiRhdXRvXCI7XG5cdFx0Ly93aGVuIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgdGhlcmUgd2lsbCBiZSBhIHBhdGNoIHJlcXVlc3QgbWVyZ2VkIHRvZ2V0aGVyIHdpdGggdGhlIGRyYWZ0UHJlcGFyZSBhbmQgZHJhZnRBY2l2YXRlLlxuXHRcdC8vVGhlIHBhdGNoIGNoYW5nZXMgdGhlIEV0YWcsIHRoZXJmb3JlIHRoZSBwcmVwYXJlIG5lZWRzIHRvIGlnbm9yZSBFdGFnc1xuXHRcdGNvbnN0IGlnbm9yZUV0YWc6IGJvb2xlYW4gPSBvQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikgPyB0cnVlIDogZmFsc2U7XG5cdFx0Ly8gd2UgdXNlIHRoZSBzYW1lIGJhdGNoR3JvdXAgdG8gZm9yY2UgcHJlcGFyZSBhbmQgYWN0aXZhdGUgaW4gYSBzYW1lIGJhdGNoIGJ1dCB3aXRoIGRpZmZlcmVudCBjaGFuZ2VzZXRcblx0XHRjb25zdCBvUHJlcGFyZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihvQ29udGV4dCwgc0JhdGNoR3JvdXAsIHVuZGVmaW5lZCwgaWdub3JlRXRhZyk7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzQmF0Y2hHcm91cCk7XG5cdFx0Y29uc3Qgb0FjdGl2YXRlUHJvbWlzZSA9IGRyYWZ0LmV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24oXG5cdFx0XHRvQ29udGV4dCxcblx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdHNCYXRjaEdyb3VwLFxuXHRcdFx0b1ByZXBhcmVQcm9taXNlLFxuXHRcdFx0bVBhcmFtZXRlcnMucmVzb3VyY2VNb2RlbCxcblx0XHRcdGlzU3RhbmRhcmRTYXZlXG5cdFx0KTtcblxuXHRcdGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFtvUHJlcGFyZVByb21pc2UsIG9BY3RpdmF0ZVByb21pc2VdKTtcblx0XHRvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gdmFsdWVzWzFdO1xuXHR9XG5cdHJldHVybiBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpIDogb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcbn1cblxuLyoqXG4gKiBEaXNwbGF5IHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGJveCBhZnRlciBwcmVzc2luZyB0aGUgZWRpdCBidXR0b24gb2YgYW4gb2JqZWN0IHBhZ2Ugd2l0aCB1bnNhdmVkIGNoYW5nZXMuXG4gKiBAcGFyYW0gc1Vuc2F2ZWRDaGFuZ2VzTXNnIERpYWxvZyBib3ggbWVzc2FnZSBpbmZvcm1pbmcgdGhlIHVzZXIgdGhhdCBpZiBoZSBzdGFydHMgZWRpdGluZywgdGhlIHByZXZpb3VzIHVuc2F2ZWQgY2hhbmdlcyB3aWxsIGJlIGxvc3RcbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZzogc3RyaW5nLCBvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRjb25zdCBsb2NhbEkxOG5SZWYgPSBMaWJyYXJ5LmdldFJlc291cmNlQnVuZGxlRm9yKFwic2FwLmZlLmNvcmVcIikhO1xuXHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogdW5rbm93bikgPT4gdm9pZCkge1xuXHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdHRpdGxlOiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX1dBUk5JTkdcIiksXG5cdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRjb250ZW50OiBuZXcgVGV4dCh7XG5cdFx0XHRcdHRleHQ6IHNVbnNhdmVkQ2hhbmdlc01zZ1xuXHRcdFx0fSksXG5cdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9DQU5DRUxcIiksXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdHJlamVjdChgRHJhZnQgY3JlYXRpb24gYWJvcnRlZCBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRvRGlhbG9nLm9wZW4oKTtcblx0fSk7XG59XG5cbi8qKlxuICogSFRUUCBQT1NUIGNhbGwgd2hlbiBEcmFmdEFjdGlvbiBpcyBwcmVzZW50IGZvciBEcmFmdCBEZWxldGU7IEhUVFAgREVMRVRFIGNhbGwgd2hlbiB0aGVyZSBpcyBubyBEcmFmdEFjdGlvblxuICogYW5kIEFjdGl2ZSBJbnN0YW5jZSBhbHdheXMgdXNlcyBERUxFVEUuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgZGlzY2FyZGVkXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgZGlzY2FyZGVkXG4gKiBAcGFyYW0gYkVuYWJsZVN0cmljdEhhbmRsaW5nXG4gKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgd2hlbiB0aGUgY29udGV4dCBpcyBkZWxldGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURyYWZ0KFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdGJFbmFibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAob0NvbnRleHQuaXNUcmFuc2llbnQoKSkge1xuXHRcdC8vIFRyYW5zaWVudCBjb250ZXh0cyAoZS5nLiB3aGVuIHRyeWluZyB0byBkZWxldGUgYSBjb250ZXh0IHdoaWNoIGNvdWxkbid0IGJlIGNyZWF0ZWQgYmVjYXVzZSBvZiBhbiBlcnJvcikgY2FuIGJlIGRlbGV0ZWQgaW1tZWRpYXRlbHlcblx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdH1cblx0Y29uc3Qgc0Rpc2NhcmRBY3Rpb24gPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRElTQ0FSRCk7XG5cdGNvbnN0IGJJc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLklzQWN0aXZlRW50aXR5O1xuXG5cdGlmIChiSXNBY3RpdmVFbnRpdHkgfHwgKCFiSXNBY3RpdmVFbnRpdHkgJiYgIXNEaXNjYXJkQWN0aW9uKSkge1xuXHRcdC8vVXNlIERlbGV0ZSBpbiBjYXNlIG9mIGFjdGl2ZSBlbnRpdHkgYW5kIG5vIGRpc2NhcmQgYWN0aW9uIGF2YWlsYWJsZSBmb3IgZHJhZnRcblx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSAmJiAhb0NvbnRleHQuaXNJbmFjdGl2ZSgpKSB7XG5cdFx0XHRhd2FpdCBvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRyZXR1cm4gb0NvbnRleHQuZGVsZXRlKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFdoZW4gY2FuY2VsbGluZyBhbiBlZGl0IGRyYWZ0IHJvb3Qgbm9kZSwgdXNlIG1vZGVsLmRlbGV0ZSBpbnN0ZWFkIG9mIGNvbnRleHQuZGVsZXRlLCB0byBvbmx5IHNlbmQgZGVsZXRpb24gdG8gYmFja2VuZCxcblx0XHRcdC8vIGJ1dCBrZWVwIGNvbnRleHQgYWxpdmUgKGluY2x1ZGluZyBiaW5kaW5ncykuIFRodXMsIHdlIGNhbiBlbnN1cmUgc2VhbWxlc3MgdHJhbnNpc3Rpb24gZnJvbSBkcmFmdCB0byBhY3RpdmUgaW5zdGFuY2Vcblx0XHRcdC8vICh3aXRob3V0IGludGVybWVkaWF0ZSB1bmRlZmluZWQgYmluZGluZ3MgZS5nLiBsZWFkaW5nIHRvIGZsaWNrZXJpbmcpLiBUaGlzIGRvZXNuJ3Qgd29yayBpbiBjYXNlIG9mIEZDTCBhcHBzLCBhc1xuXHRcdFx0Ly8gbW9kZWwuZGVsZXRlIGRvZXNuJ3QgY2xlYW4gdXAgdGhlIHBhcmVudCBsaXN0QmluZGluZyBwcm9wZXJseSwgbGVhZGluZyB0byBpbmNvcnJlY3QgT0RhdGEgcmVxdWVzdHMuXG5cdFx0XHQvLyBJbiBvdGhlciBjYXNlcyAoZGVsZXRpbmcgYWN0aXZlLCBkaXNjYXJkaW5nIGNyZWF0ZSBkcmFmdCBvciBkaXNjYXJkaW5nIGRyYWZ0IG5vZGUpLCBzdGF5IHdpdGggY29udGV4dC5kZWxldGUuXG5cdFx0XHQvLyBXaGVuIGNhbmNlbGxpbmcgYSBjcmVhdGUgZHJhZnQsIHBhZ2UgaXMgY2xvc2VkLCB0aHVzIHRoZSBwcm9ibGVtIG9mIGZsaWNrZXJpbmcgY2Fubm90IG9jY3VyLlxuXHRcdFx0Ly8gSW4gY2FzZSBvZiBkaXNjYXJkaW5nIGEgZHJhZnQgbm9kZSwgdGhlb3JldGljYWxseSB0aGUgc2FtZSBwcm9ibGVtIGNvdWxkXG5cdFx0XHQvLyBvY2N1ciwgYnV0IG5lZWRzIHF1aXRlIHNwZWNpZmljIG1vZGVsbGluZyAoYnV0dG9uIHZpc2liaWxpdHkgb24gaXRlbSBsZXZlbCBib3VuZCBhZ2FpbnN0IHNlcnZpY2UgcHJvcGVydHkgaW4gYW4gRkNMIGFwcClcblx0XHRcdC8vIGFuZCBhY3RpbmcgKGxvb2tpbmcgYXQgYnV0dG9uIG9uIHRoaXJkIGNvbHVtbiB3aGlsZSBkaXNjYXJkaW5nIG9uIDJuZCBjb2x1bW4pLiBDdXJyZW50bHksIG1vZGVsIHNlZW1zIG5vdCB0byBiZSBwcmVwYXJlZFxuXHRcdFx0Ly8gZm9yIHRoYXQgY2FzZSwgdGh1cyBkdWUgdG8gdGhlIG1pbmltYWwgaW1wYWN0IChvbmx5IGludGVybWVkaWF0ZSB2aXN1YWwgc3RhdGUpLCBhY2NlcHRpbmcgdGhpcyBmb3IgdGhlIHRpbWUgYmVpbmcuXG5cdFx0XHRyZXR1cm4gIW9BcHBDb21wb25lbnQuX2lzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRcdCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpICYmXG5cdFx0XHRcdE1vZGVsSGVscGVyLmlzRHJhZnRSb290KFxuXHRcdFx0XHRcdGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkpPy50YXJnZXRFbnRpdHlTZXRcblx0XHRcdFx0KSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKVxuXHRcdFx0XHQ/IG9Db250ZXh0LmdldE1vZGVsKCkuZGVsZXRlKG9Db250ZXh0KVxuXHRcdFx0XHQ6IG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvL1VzZSBEaXNjYXJkIFBvc3QgQWN0aW9uIGlmIGl0IGlzIGEgZHJhZnQgZW50aXR5IGFuZCBkaXNjYXJkIGFjdGlvbiBleGlzdHNcblx0XHRhd2FpdCBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0LCBtZXNzYWdlSGFuZGxlciwgb0FwcENvbXBvbmVudCwgYkVuYWJsZVN0cmljdEhhbmRsaW5nKTtcblx0fVxufVxuXG5jb25zdCBkcmFmdCA9IHtcblx0Y3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ6IGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50LFxuXHRhY3RpdmF0ZURvY3VtZW50OiBhY3RpdmF0ZURvY3VtZW50LFxuXHRkZWxldGVEcmFmdDogZGVsZXRlRHJhZnQsXG5cdGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb246IGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24sXG5cdGV4ZWN1dGVEcmFmdFZhbGlkYXRpb246IGV4ZWN1dGVEcmFmdFZhbGlkYXRpb24sXG5cdGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uOiBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbixcblx0ZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbjogZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbixcblx0aGFzUHJlcGFyZUFjdGlvbjogaGFzUHJlcGFyZUFjdGlvbixcblx0Y29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbjogY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbixcblx0cHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb246IGRyYWZ0RGF0YUxvc3NQb3B1cC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbixcblx0c2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uOiBkcmFmdERhdGFMb3NzUG9wdXAuc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxuXHRjcmVhdGVPcGVyYXRpb246IGNyZWF0ZU9wZXJhdGlvbixcblx0ZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbjogZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbixcblx0TmF2aWdhdGlvblR5cGU6IGRyYWZ0RGF0YUxvc3NQb3B1cC5OYXZpZ2F0aW9uVHlwZSxcblx0Z2V0QWN0aW9uTmFtZTogZ2V0QWN0aW9uTmFtZSxcblx0c2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94OiBzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3hcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWZ0O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztFQXVGQTtFQUNBLE1BQU1BLGVBQWUsR0FBRztJQUN2QkMsSUFBSSxFQUFFLFlBQVk7SUFDbEJDLFVBQVUsRUFBRSxrQkFBa0I7SUFDOUJDLE9BQU8sRUFBRSxlQUFlO0lBQ3hCQyxPQUFPLEVBQUU7RUFDVixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTQyxhQUFhQSxDQUFDQyxRQUFpQixFQUFFQyxVQUFrQixFQUFVO0lBQ3JFLE1BQU1DLE1BQU0sR0FBR0YsUUFBUSxDQUFDRyxRQUFRLENBQUMsQ0FBQztNQUNqQ0MsVUFBVSxHQUFHRixNQUFNLENBQUNHLFlBQVksQ0FBQyxDQUFDO01BQ2xDQyxjQUFjLEdBQUdGLFVBQVUsQ0FBQ0csV0FBVyxDQUFDUCxRQUFRLENBQUNRLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFNUQsT0FBT0osVUFBVSxDQUFDSyxTQUFTLENBQUMsR0FBR0gsY0FBYyw2Q0FBNkNMLFVBQVUsRUFBRSxDQUFDO0VBQ3hHO0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTUyxlQUFlQSxDQUFDVixRQUFpQixFQUFFQyxVQUFrQixFQUFFVSxRQUFnQyxFQUF1QjtJQUN0SCxNQUFNQyxjQUFjLEdBQUdiLGFBQWEsQ0FBQ0MsUUFBUSxFQUFFQyxVQUFVLENBQUM7SUFFMUQsT0FBT0QsUUFBUSxDQUFDRyxRQUFRLENBQUMsQ0FBQyxDQUFDVSxXQUFXLENBQUMsR0FBR0QsY0FBYyxPQUFPLEVBQUVaLFFBQVEsRUFBRVcsUUFBUSxDQUFDO0VBQ3JGOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNHLGtCQUFrQkEsQ0FBQ0MsT0FBZ0IsRUFBRUMsU0FBaUIsRUFBeUI7SUFDdkYs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
728
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkcmFmdE9wZXJhdGlvbnMiLCJFRElUIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiZ2V0Q29udmVydGVkQWN0aW9uIiwiY29udGV4dCIsIm9wZXJhdGlvbiIsIm9wZXJhdGlvbk5hbWUiLCJtZXRhTW9kZWwiLCJhY3Rpb25QYXRoIiwiYm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnZlcnRUeXBlcyIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiZ2V0UmV0dXJuVHlwZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiYlByZXNlcnZlQ2hhbmdlcyIsIm9WaWV3IiwiZ3JvdXBJZCIsIm1lc3NhZ2VIYW5kbGVyIiwib3ZlcndyaXRlQ2hhbmdlIiwiY29udmVydGVkQWN0aW9uIiwiT3BlcmF0aW9uIiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJjb250ZXh0cyIsImxhYmVsIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImdldFRleHQiLCJiaW5kaW5nUGFyYW1ldGVycyIsIiQkaW5oZXJpdEV4cGFuZFNlbGVjdCIsIiQkdXBkYXRlR3JvdXBJZCIsInNraXBNZXNzYWdlcyIsIm9EYXRhUHJvcGVydGllcyIsImRpc2FibGVTaWRlRWZmZWN0cyIsImlnbm9yZUVUYWciLCJpc0VtcHR5T2JqZWN0IiwicmVwbGFjZVdpdGhSVkMiLCJnZXRCaW5kaW5nIiwiaXNBIiwiZGVmZXJyZWRTdWJtaXQiLCJzZXREZWZhdWx0UGFyYW1ldGVyc1ZhbHVlcyIsIlByZXNlcnZlQ2hhbmdlcyIsInJlc3VsdCIsImV4ZWN1dGUiLCJzdGF0dXMiLCJtb2RpZmllZEVycm9yIiwiRXJyb3IiLCJyZWFzb24iLCJ2YWx1ZSIsInJldHVybmVkQ29udGV4dCIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJhcHBDb21wb25lbnQiLCJNb2RlbEhlbHBlciIsImdldE1lc3NhZ2VzUGF0aCIsImRyYWZ0IiwiaXNLZWVwQWxpdmUiLCJyZXF1ZXN0T2JqZWN0IiwiZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24iLCJnZXRVcGRhdGVHcm91cElkIiwicmVxdWVzdE1lc3NhZ2VzIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZXJyb3IiLCJMb2ciLCJ1bmRlZmluZWQiLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwib0FwcENvbXBvbmVudCIsInNHcm91cElkIiwib1ByZXBhcmVQcm9taXNlIiwicmVzb3VyY2VNb2RlbCIsImlzU3RhbmRhcmRTYXZlIiwiYkhhc1ByZXBhcmVBY3Rpb24iLCJiSWdub3JlRXRhZyIsImdldFByb3BlcnR5IiwiZSIsInByZXBhcmVPcGVyYXRpb24iLCJkZXN0cm95IiwiY2xlYXIiLCJhY3Rpb25OYW1lIiwib1NpZGVFZmZlY3RzU2VydmljZSIsIm9CaW5kaW5nUGFyYW1ldGVycyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJhVGFyZ2V0UGF0aHMiLCJwYXRoRXhwcmVzc2lvbnMiLCJsZW5ndGgiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJvRXJyb3IiLCJnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUiLCJnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQiLCJtZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0IiwiY29udmVydGVkQ29udGV4dCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsIm1lc3NhZ2VzIiwidGFyZ2V0RW50aXR5VHlwZSIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiTWVzc2FnZXMiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsInBhdGgiLCJiTWVzc2FnZXMiLCJzTWVzc2FnZXNQYXRoIiwib09wZXJhdGlvbiIsIiRzZWxlY3QiLCJzZXRQYXJhbWV0ZXIiLCJnZXRHcm91cElkIiwiaW52b2tlIiwidGhlbiIsImNhdGNoIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiYXJndW1lbnRzIiwiZGF0YSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyIsImV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24iLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJkaXNhYmxlU3RyaWN0SGFuZGxpbmciLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJyb290Q29udGV4dEluZm8iLCJjcmVhdGVLZWVwQWxpdmVDb250ZXh0Iiwic3RhcnRzV2l0aCIsIm1vZGVsIiwiYWRkaXRpb25hbFBhdGgiLCJyZXBsYWNlIiwic2VnbWVudHMiLCJzdWJzdHJpbmciLCJzcGxpdCIsInVuc2hpZnQiLCJvbGRQYXRocyIsIm5ld1BhdGhzIiwiY3VycmVudFBhdGgiLCJwYXRocyIsInJvb3RTaWJsaW5nUGF0aFByb21pc2UiLCJzaGlmdCIsImNhbm9uaWNhbFBhdGhQcm9taXNlcyIsIm1hcCIsInNlZ21lbnQiLCJlbmRzV2l0aCIsInNpYmxpbmdDb250ZXh0IiwiJCRncm91cElkIiwiZ2V0Qm91bmRDb250ZXh0IiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNhbm9uaWNhbFBhdGhzIiwiYWxsIiwic29tZSIsInJvb3RTaWJsaW5nUGF0aCIsInB1c2giLCJzaWJsaW5nUGF0aCIsImZvckVhY2giLCJjYW5vbmljYWxQYXRoIiwiaW5kZXgiLCJuYXZpZ2F0aW9uIiwia2V5cyIsInBhcmFtZXRlcnMiLCJtZXNzYWdlUGF0aCIsInRhcmdldENvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwicGF0aE1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwibVBhcmFtZXRlcnMiLCJ0cmFuc2FjdGlvbkRldGFpbHMiLCJtUGFyYW0iLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsInJlc3BvbnNlIiwiZHJhZnREYXRhQ29udGV4dCIsImRyYWZ0QWRtaW5EYXRhIiwic0luZm8iLCJJblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiIsIkluUHJvY2Vzc0J5VXNlciIsInNFbnRpdHlTZXQiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsInNMb2NrZWRCeVVzZXJNc2ciLCJNZXNzYWdlQm94IiwiQ3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uIiwiQ3JlYXRlZEJ5VXNlciIsInNVbnNhdmVkQ2hhbmdlc01zZyIsInNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveCIsIm1lc3NhZ2UiLCJvRHJhZnRDb250ZXh0Iiwib1Jlc3BvbnNlIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJzaWJsaW5nSW5mbyIsIl9pc0ZjbEVuYWJsZWQiLCJ3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCIsImV4aXN0aW5nRHJhZnRSZXVzZWQiLCJjYW5jZWxlZCIsInNFZGl0QWN0aW9uTmFtZSIsIm9TaWRlRWZmZWN0cyIsInRyaWdnZXJBY3Rpb25zIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJhY3RpdmF0ZURvY3VtZW50IiwiYkV4ZWN1dGUiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0Iiwic0JhdGNoR3JvdXAiLCJpZ25vcmVFdGFnIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJzdWJtaXRCYXRjaCIsIm9BY3RpdmF0ZVByb21pc2UiLCJ2YWx1ZXMiLCJmbkFmdGVyQWN0aXZhdGVEb2N1bWVudCIsImxvY2FsSTE4blJlZiIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsInJlamVjdCIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJ0ZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImRlbGV0ZURyYWZ0IiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJzRGlzY2FyZEFjdGlvbiIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiaXNJbmFjdGl2ZSIsInJlc2V0Q2hhbmdlcyIsImlzSW5saW5lRWRpdEdyb3VwIiwiSU5MSU5FRURJVF9VUERBVEVHUk9VUElEIiwidGFyZ2V0RW50aXR5U2V0IiwidXNlTW9kZWxEZWxldGUiLCJpc0RyYWZ0Um9vdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiZHJhZnREYXRhTG9zc1BvcHVwIiwic2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwiTmF2aWdhdGlvblR5cGUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uIGFzIEVkbUFjdGlvbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgaXNFbXB0eU9iamVjdCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9pc0VtcHR5T2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IGRyYWZ0RGF0YUxvc3NQb3B1cCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnREYXRhTG9zc1BvcHVwXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSB7IFNpZGVFZmZlY3RzU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dEVycm9yVHlwZSB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcIi4uLy4uL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcIi4uLy4uL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCIuLi9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IE9wZXJhdGlvbiBmcm9tIFwiLi9vcGVyYXRpb25zL09wZXJhdGlvblwiO1xuXG5leHBvcnQgdHlwZSBTaWJsaW5nSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldENvbnRleHQ6IENvbnRleHQ7XG5cdHBhdGhNYXBwaW5nOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJvb3RDb250ZXh0SW5mbyA9IHtcblx0cm9vdFNpYmxpbmdQYXRoUHJvbWlzZTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPjtcbn07XG5cbmV4cG9ydCB0eXBlIEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHtcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSBmb3IgdGhlIFwiNS4xLjIgU3lzdGVtIFF1ZXJ5IE9wdGlvbiAkZXhwYW5kXCIgb3IgYW4gb2JqZWN0IHdoaWNoIGRldGVybWluZXMgdGhhdCB2YWx1ZS4gVGhlIG9iamVjdFxuXHQgKiBpcyBhIG1hcCBmcm9tIGV4cGFuZCBwYXRoIHRvIGV4cGFuZCBvcHRpb25zLCB3aGVyZSB0aGUgb3B0aW9ucyBhcmUgYWdhaW4gbWFwcyBvZiBzeXN0ZW0gcXVlcnkgb3B0aW9ucyxcblx0ICogdHlwaWNhbGx5IHdpdGggc3RyaW5nIHZhbHVlcy4gJGNvdW50IGNhbiBhbHNvIGJlIGdpdmVuIGFzIGEgYGJvb2xlYW5gIHZhbHVlLCAkZXhwYW5kIGNhbiByZWN1cnNpdmVseVxuXHQgKiBiZSBnaXZlbiBhcyBhIG1hcCwgJGxldmVscyBjYW4gYWxzbyBiZSBnaXZlbiBhcyBhIGBudW1iZXJgIHZhbHVlLCBhbmQgJHNlbGVjdCBjYW4gYWxzbyBiZSBnaXZlbiBhcyBhblxuXHQgKiBhcnJheSAoYnV0IHdpdGhvdXQgbmF2aWdhdGlvbiBwYXRocykuIEFuIGVtcHR5IG1hcCBjYW4gYWxzbyBiZSBnaXZlbiBhcyBgbnVsbGAgb3IgYHRydWVgLiBTZWUgYWxzbyB7QGxpbmsgaHR0cHM6Ly91aTUuc2FwLmNvbS8jL3RvcGljLzFhYjRmNjJkZTZhYjQ2NzA5NmEyYTk4YjM2M2ExMzczIFBhcmFtZXRlcnN9LlxuXHQgKi9cblx0JGV4cGFuZD86IHN0cmluZyB8IG9iamVjdDtcblx0LyoqXG5cdCAqIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb3IgYW4gYXJyYXkgb2YgaXRlbXMgd2hpY2ggZGV0ZXJtaW5lIHRoZSB2YWx1ZSBmb3IgdGhlIFwiNS4xLjMgU3lzdGVtIFF1ZXJ5IE9wdGlvblxuXHQgKiAkc2VsZWN0XCIuIFNpbmNlIDEuNzUuMCwgd2hlbiB1c2luZyB0aGUgXCJhdXRvRXhwYW5kU2VsZWN0XCIgbW9kZWwgcGFyYW1ldGVyIChzZWUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsI2NvbnN0cnVjdG9yfSksXG5cdCAqIHBhdGhzIHdpdGggbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGNhbiBiZSBpbmNsdWRlZCBhbmQgd2lsbCBjb250cmlidXRlIHRvIHRoZSBcIjUuMS4yIFN5c3RlbSBRdWVyeSBPcHRpb25cblx0ICogJGV4cGFuZFwiLlxuXHQgKi9cblx0JHNlbGVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIFdoZXRoZXIgYSBiaW5kaW5nIHJlbGF0aXZlIHRvIGFuIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gdXNlcyB0aGUgY2Fub25pY2FsIHBhdGggY29tcHV0ZWRcblx0ICogZnJvbSBpdHMgY29udGV4dCdzIHBhdGggZm9yIGRhdGEgc2VydmljZSByZXF1ZXN0czsgb25seSB0aGUgdmFsdWUgYHRydWVgIGlzIGFsbG93ZWQuXG5cdCAqL1xuXHQkJGNhbm9uaWNhbFBhdGg/OiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yICoqcmVhZCoqIHJlcXVlc3RzIHRyaWdnZXJlZCBieSB0aGlzIGJpbmRpbmc7IGlmIG5vdCBzcGVjaWZpZWQsIGVpdGhlciB0aGVcblx0ICogcGFyZW50IGJpbmRpbmcncyBncm91cCBJRCAoaWYgdGhlIGJpbmRpbmcgaXMgcmVsYXRpdmUpIG9yIHRoZSBtb2RlbCdzIGdyb3VwIElEIGlzIHVzZWQsIHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9LlxuXHQgKiBWYWxpZCB2YWx1ZXMgYXJlIGB1bmRlZmluZWRgLCAnJGF1dG8nLCAnJGF1dG8uKicsICckZGlyZWN0JyBvciBhcHBsaWNhdGlvbiBncm91cCBJRHMgYXMgc3BlY2lmaWVkIGluXG5cdCAqIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0uXG5cdCAqL1xuXHQkJGdyb3VwSWQ/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBGb3Igb3BlcmF0aW9uIGJpbmRpbmdzIG9ubHk6IFdoZXRoZXIgJGV4cGFuZCBhbmQgJHNlbGVjdCBmcm9tIHRoZSBwYXJlbnQgYmluZGluZyBhcmUgdXNlZCBpbiB0aGUgcmVxdWVzdFxuXHQgKiBzZW50IG9uIHtAbGluayAjZXhlY3V0ZX0uIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBiaW5kaW5nIG11c3Qgbm90IHNldCB0aGUgJGV4cGFuZCBpdHNlbGYsIHRoZSBvcGVyYXRpb25cblx0ICogbXVzdCBiZSBib3VuZCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgYW5kIHRoZSBiaW5kaW5nIHBhcmFtZXRlciBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBlbnRpdHkgc2V0LlxuXHQgKi9cblx0JCRpbmhlcml0RXhwYW5kU2VsZWN0PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFdoZXRoZXIgdGhlIGJpbmRpbmcgYWx3YXlzIHVzZXMgYW4gb3duIHNlcnZpY2UgcmVxdWVzdCB0byByZWFkIGl0cyBkYXRhOyBvbmx5IHRoZSB2YWx1ZSBgdHJ1ZWAgaXMgYWxsb3dlZC5cblx0ICovXG5cdCQkb3duUmVxdWVzdD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBXaGV0aGVyIGltcGxpY2l0IGxvYWRpbmcgb2Ygc2lkZSBlZmZlY3RzIHZpYSBQQVRDSCByZXF1ZXN0cyBpcyBzd2l0Y2hlZCBvZmY7IG9ubHkgdGhlIHZhbHVlIGB0cnVlYCBpc1xuXHQgKiBhbGxvd2VkLiBUaGlzIHNldHMgdGhlIHByZWZlcmVuY2UgXCJyZXR1cm49bWluaW1hbFwiIGFuZCByZXF1aXJlcyB0aGUgc2VydmljZSB0byByZXR1cm4gYW4gRVRhZyBoZWFkZXJcblx0ICogZm9yIFwiMjA0IE5vIENvbnRlbnRcIiByZXNwb25zZXMuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IGJpbmRpbmcgaXMgdXNlZC5cblx0ICovXG5cdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yICoqdXBkYXRlKiogcmVxdWVzdHMgdHJpZ2dlcmVkIGJ5IHRoaXMgYmluZGluZzsgaWYgbm90IHNwZWNpZmllZCwgZWl0aGVyIHRoZVxuXHQgKiBwYXJlbnQgYmluZGluZydzIHVwZGF0ZSBncm91cCBJRCAoaWYgdGhlIGJpbmRpbmcgaXMgcmVsYXRpdmUpIG9yIHRoZSBtb2RlbCdzIHVwZGF0ZSBncm91cCBJRCBpcyB1c2VkLFxuXHQgKiBzZWUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsI2NvbnN0cnVjdG9yfS4gRm9yIHZhbGlkIHZhbHVlcywgc2VlIHBhcmFtZXRlciBcIiQkZ3JvdXBJZFwiLlxuXHQgKi9cblx0JCR1cGRhdGVHcm91cElkPzogc3RyaW5nO1xufTtcblxuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcblxuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb25zIGZvciB0aGUgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcbiAqIEBuYW1lc3BhY2VcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41NC4wXG4gKi9cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBhY3Rpb24gbmFtZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEFjdGlvbk5hbWUob0NvbnRleHQ6IENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvJHtzT3BlcmF0aW9ufWApO1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIG9wZXJhdGlvbiBjb250ZXh0IGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiAoYWN0aW9uIG9yIGZ1bmN0aW9uIGltcG9ydClcbiAqIEBwYXJhbSBvT3B0aW9ucyBPcHRpb25zIHRvIGNyZWF0ZSB0aGUgb3BlcmF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBjb250ZXh0IGJpbmRpbmcgb2YgdGhlIGJvdW5kIG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQ6IENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZywgb09wdGlvbnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnMpOiBPRGF0YUNvbnRleHRCaW5kaW5nIHtcblx0Y29uc3Qgc09wZXJhdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBzT3BlcmF0aW9uKTtcblxuXHRyZXR1cm4gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChgJHtzT3BlcmF0aW9uTmFtZX0oLi4uKWAsIG9Db250ZXh0LCBvT3B0aW9ucyk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29udmVydGVkIGFjdGlvbiBmb3IgYSBnaXZlbiBjb250ZXh0IGFuZCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gY29udGV4dCAgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgYWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldENvbnZlcnRlZEFjdGlvbihjb250ZXh0OiBDb250ZXh0LCBvcGVyYXRpb246IHN0cmluZyk6IEVkbUFjdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IG9wZXJhdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKGNvbnRleHQsIG9wZXJhdGlvbik7XG5cdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRhY3Rpb25QYXRoID0gYCR7bWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKX0vJHtvcGVyYXRpb25OYW1lfWAsXG5cdFx0Ym91bmRBY3Rpb24gPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYWN0aW9uUGF0aCkhO1xuXHRyZXR1cm4gY29udmVydFR5cGVzKG1ldGFNb2RlbCkucmVzb2x2ZVBhdGg8RWRtQWN0aW9uIHwgdW5kZWZpbmVkPihib3VuZEFjdGlvbi5nZXRQYXRoKCkpLnRhcmdldDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSBkcmFmdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRSZXR1cm5UeXBlKG9Db250ZXh0OiBDb250ZXh0LCBzT3BlcmF0aW9uOiBzdHJpbmcpOiB1bmtub3duIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC8ke3NPcGVyYXRpb259LyRSZXR1cm5UeXBlYCk7XG59XG4vKipcbiAqIENoZWNrIGlmIG9wdGlvbmFsIGRyYWZ0IHByZXBhcmUgYWN0aW9uIGV4aXN0cy5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyBUcnVlIGlmIGEgYSBwcmVwYXJlIGFjdGlvbiBleGlzdHNcbiAqL1xuZnVuY3Rpb24gaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gISFnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZHJhZnQgZnJvbSBhbiBhY3RpdmUgZG9jdW1lbnQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gYlByZXNlcnZlQ2hhbmdlcyBJZiB0cnVlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXIgdXNlciB0aGF0IGFyZSBub3QgbG9ja2VkIGFyZSBwcmVzZXJ2ZWQgYW5kIGFuIGVycm9yIGlzIHNlbnQgZnJvbSB0aGUgYmFja2VuZCwgb3RoZXJ3aXNlIGZhbHNlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXIgdXNlciB0aGF0IGFyZSBub3QgbG9ja2VkIGFyZSBvdmVyd3JpdHRlbjwvbGk+XG4gKiBAcGFyYW0gb1ZpZXcgSWYgdHJ1ZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyXG4gKiBAcGFyYW0gZ3JvdXBJZCBUaGUgYmF0Y2ggZ3JvdXBJZCBmb3IgcG9zdCBjYWxsIG9mIGVkaXQgYWN0aW9uXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEBwYXJhbSBvdmVyd3JpdGVDaGFuZ2VcbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24oXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRiUHJlc2VydmVDaGFuZ2VzOiBib29sZWFuLFxuXHRvVmlldzogVmlldyxcblx0Z3JvdXBJZDogc3RyaW5nLFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdG92ZXJ3cml0ZUNoYW5nZT86IGJvb2xlYW5cbik6IFByb21pc2U8Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHQvLyBJZiB0aGUgY29udGV4dCBpcyBub3QgbG9hZGVkIChpLmUuIG9Db250ZXh0LmdldE9iamVjdCgpID09IHVuZGVmaW5lZCksIHdlIGFzc3VtZSBpdCBjb3JyZXNwb25kcyB0byBhbiBhY3RpdmUgY29udGV4dFxuXHQvLyBUaGlzIHNpdHVhdGlvbiBoYXBwZW5zIHdoZW4gb3BlbmluZyBhbiBPUCBkaXJlY3RseSBpbiBlZGl0IG1vZGUgKEludGVybmFsUm91dGluZy5fYmluZFBhZ2VGb3JFZGl0KVxuXHRjb25zdCBjb252ZXJ0ZWRBY3Rpb24gPSBnZXRDb252ZXJ0ZWRBY3Rpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5FRElUKTtcblx0aWYgKGNvbnZlcnRlZEFjdGlvbikge1xuXHRcdGNvbnN0IG9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb24oQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KSwgb0NvbnRleHQuZ2V0TW9kZWwoKSwgY29udmVydGVkQWN0aW9uLCB7XG5cdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRjb250ZXh0czogW29Db250ZXh0XSxcblx0XHRcdGxhYmVsOiBnZXRSZXNvdXJjZU1vZGVsKG9WaWV3KS5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfRURJVFwiKSxcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzOiB7ICQkaW5oZXJpdEV4cGFuZFNlbGVjdDogdHJ1ZSwgJCR1cGRhdGVHcm91cElkOiBcIiRhdXRvXCIgfSxcblx0XHRcdHNraXBNZXNzYWdlczogdHJ1ZSxcblx0XHRcdG9EYXRhUHJvcGVydGllczoge1xuXHRcdFx0XHRkaXNhYmxlU2lkZUVmZmVjdHM6IHRydWUsXG5cdFx0XHRcdGlnbm9yZUVUYWc6IGlzRW1wdHlPYmplY3Qob0NvbnRleHQuZ2V0T2JqZWN0KCkpLCAvLyBJZiB0aGUgY29udGV4dCBoYXMgbm90IGJlZW4gbG9hZGVkIHlldCwgd2UgY2FuIGlnbm9yZSB0aGUgRVRhZyAoYXMgbm8gcHJldmlvdXMgRVRhZyBpcyBhdmFpbGFibGUpXG5cdFx0XHRcdGdyb3VwSWQ6IGdyb3VwSWQsXG5cdFx0XHRcdHJlcGxhY2VXaXRoUlZDOiBvQ29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIiksXG5cdFx0XHRcdGRlZmVycmVkU3VibWl0OiBvdmVyd3JpdGVDaGFuZ2UgIT09IHRydWUgLy9cdElmIHRoZSBjb250ZXh0IGlzIGNvbWluZyBmcm9tIGEgbGlzdCBiaW5kaW5nIHdlIHBhc3MgdGhlIGZsYWcgdHJ1ZSB0byByZXBsYWNlIHRoZSBjb250ZXh0IGJ5IHRoZSBhY3RpdmUgb25lXG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0b3BlcmF0aW9uLnNldERlZmF1bHRQYXJhbWV0ZXJzVmFsdWVzKHsgUHJlc2VydmVDaGFuZ2VzOiBiUHJlc2VydmVDaGFuZ2VzIH0pO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbi5leGVjdXRlKCk7XG5cdFx0aWYgKHJlc3VsdFswXS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuXHRcdFx0Y29uc3QgbW9kaWZpZWRFcnJvciA9IG5ldyBFcnJvcihyZXN1bHRbMF0ucmVhc29uKSBhcyBFcnJvciAmIHsgc3RhdHVzPzogbnVtYmVyIH07XG5cdFx0XHQvLyB3ZSBuZWVkIHRvIHBlcnNpc3QgdGhlIHN0YXR1cyBpbiB0aGUgZXJyb3IgdG8gYmUgYWJsZSB0byBzaG93IHRoZSBsb2NrZWQgYnkgYW5vdGhlciB1c2VyIGRpYWxvZ1xuXHRcdFx0bW9kaWZpZWRFcnJvci5zdGF0dXMgPSByZXN1bHRbMF0ucmVhc29uLnN0YXR1cztcblx0XHRcdHRocm93IG1vZGlmaWVkRXJyb3I7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiByZXN1bHRbMF0udmFsdWUucmV0dXJuZWRDb250ZXh0O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZWRpdCBhY3Rpb24gbm90IGZvdW5kXCIpO1xuXHR9XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGRyYWZ0LiBUaGUgUHJlcGFyZUFjdGlvbiBpcyB0cmlnZ2VyZWQgaWYgdGhlIG1lc3NhZ2VzIGFyZSBhbm5vdGF0ZWQgYW5kIGVudGl0eVNldCBnZXRzIGEgUHJlcGFyYXRpb25BY3Rpb24gYW5ub3RhdGVkLlxuICogSWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBhbmQgb3BlcmF0aW9uIGRvZXNuJ3QgZ2V0IGEgcmV0dXJuIHR5cGUgKFJBUCBzeXN0ZW0pIHRoZSBtZXNzYWdlcyBhcmUgcmVxdWVzdGVkLlxuICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIFByZXBhcmVBY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gaWdub3JlRVRhZyBJZiBzZXQgdG8gdHJ1ZSwgRVRhZ3MgYXJlIGlnbm9yZWQgd2hlbiBleGVjdXRpbmcgdGhlIGFjdGlvblxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zXG4gKiAgLSB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uIGlmIHRoZSBhY3Rpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkXG4gKiAgLSB2b2lkIGlmIHRoZSBhY3Rpb24gaGFzIGZhaWxlZFxuICogIC0gdW5kZWZpbmVkIGlmIHRoZSBhY3Rpb24gaGFzIG5vdCBiZWVuIHRyaWdnZXJlZCBzaW5jZSB0aGUgcHJlcmVxdWlzaXRlcyBhcmUgbm90IG1ldFxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRWYWxpZGF0aW9uKFxuXHRjb250ZXh0OiBDb250ZXh0LFxuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0aWdub3JlRVRhZzogYm9vbGVhblxuKTogUHJvbWlzZTxPRGF0YUNvbnRleHRCaW5kaW5nIHwgdm9pZCB8IHVuZGVmaW5lZD4ge1xuXHRpZiAoTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgY29udGV4dC5nZXRQYXRoKCkpICYmIGRyYWZ0Lmhhc1ByZXBhcmVBY3Rpb24oY29udGV4dCkpIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKCFpZ25vcmVFVGFnICYmICFjb250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgZW50aXR5IHJlbGF0ZWQgdG8gdGhlIGNvbnRleHQgdG8gcG9zdCB0aGUgYWN0aW9uIHdpdGggdGhlIElmLU1hdGNoIGhlYWRlclxuXHRcdFx0XHQvLyBTb21lIHRyaWdnZXJzIChlbnRlciBvbiB0YWJsZSkgY2FuIGdlbmVyYXRlIGEgcHJvbWlzZSBpbiB0aGUgY2FjaGUgc28gaWYgd2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIGVudGl0eVxuXHRcdFx0XHQvLyB0aGUgUE9TVCB3aWxsIGJlIHNlbnQgd2l0aG91dCBJZi1NYXRjaCBhbmQgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvciBvbiBiYWNrZW5kIHNpZGUuXG5cdFx0XHRcdGF3YWl0IChjb250ZXh0LmdldEJpbmRpbmcoKSBhcyBPRGF0YUNvbnRleHRCaW5kaW5nKS5yZXF1ZXN0T2JqZWN0KFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb3BlcmF0aW9uID0gZHJhZnQuZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24oY29udGV4dCwgY29udGV4dC5nZXRVcGRhdGVHcm91cElkKCksIHRydWUsIGlnbm9yZUVUYWcpO1xuXHRcdFx0aWYgKCFnZXRSZXR1cm5UeXBlKGNvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSkge1xuXHRcdFx0XHRyZXF1ZXN0TWVzc2FnZXMoY29udGV4dCwgYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGF3YWl0IG9wZXJhdGlvbjtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZXNzYWdlc1wiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQWN0aXZhdGVzIGEgZHJhZnQgZG9jdW1lbnQuIFRoZSBkcmFmdCB3aWxsIHJlcGxhY2UgdGhlIHNpYmxpbmcgZW50aXR5IGFuZCB3aWxsIGJlIGRlbGV0ZWQgYnkgdGhlIGJhY2sgZW5kLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG4gKiBAcGFyYW0gW3NHcm91cElkXSBUaGUgb3B0aW9uYWwgYmF0Y2ggZ3JvdXAgaW4gd2hpY2ggdGhlIG9wZXJhdGlvbiBpcyB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIFtvUHJlcGFyZVByb21pc2VdIFRoZSBwcm9taXNlIG9mIHRoZSBwcmVwYXJlIGFjdGlvblxuICogQHBhcmFtIFtyZXNvdXJjZU1vZGVsXSBUaGUgcmVzb3VyY2UgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRzR3JvdXBJZD86IHN0cmluZyxcblx0b1ByZXBhcmVQcm9taXNlPzogUHJvbWlzZTx2b2lkIHwgT0RhdGFDb250ZXh0QmluZGluZz4sXG5cdHJlc291cmNlTW9kZWw/OiBSZXNvdXJjZU1vZGVsLFxuXHRpc1N0YW5kYXJkU2F2ZT86IGJvb2xlYW4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8Q29udGV4dD4ge1xuXHRjb25zdCBiSGFzUHJlcGFyZUFjdGlvbiA9IGRyYWZ0Lmhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpO1xuXHQvLyBBY2NvcmRpbmcgdG8gdGhlIGRyYWZ0IHNwZWMgaWYgdGhlIHNlcnZpY2UgY29udGFpbnMgYSBwcmVwYXJlIGFjdGlvbiBhbmQgd2UgdHJpZ2dlciBib3RoIHByZXBhcmUgYW5kXG5cdC8vIGFjdGl2YXRlIGluIG9uZSAkYmF0Y2ggdGhlIGFjdGl2YXRlIGFjdGlvbiBpcyBjYWxsZWQgd2l0aCBpRi1NYXRjaD0qXG5cdGNvbnN0IGJJZ25vcmVFdGFnID0gYkhhc1ByZXBhcmVBY3Rpb247XG5cdGxldCBvcGVyYXRpb246IE9wZXJhdGlvbiB8IHVuZGVmaW5lZDtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3QgY29udmVydGVkQWN0aW9uID0gZ2V0Q29udmVydGVkQWN0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuQUNUSVZBVElPTik7XG5cdFx0Y29uc3QgbGFiZWwgPSBpc1N0YW5kYXJkU2F2ZSA/IHJlc291cmNlTW9kZWw/LmdldFRleHQoXCJUX09QX09CSkVDVF9QQUdFX1NBVkVcIikgOiByZXNvdXJjZU1vZGVsPy5nZXRUZXh0KFwiQ19PUF9PQkpFQ1RfUEFHRV9TQVZFXCIpO1xuXHRcdGlmIChjb252ZXJ0ZWRBY3Rpb24pIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb24ob0FwcENvbXBvbmVudCwgb0NvbnRleHQuZ2V0TW9kZWwoKSwgY29udmVydGVkQWN0aW9uLCB7XG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdGNvbnRleHRzOiBbb0NvbnRleHRdLFxuXHRcdFx0XHRcdGxhYmVsOiBsYWJlbCxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogeyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfSxcblx0XHRcdFx0XHRza2lwTWVzc2FnZXM6IHRydWUsXG5cdFx0XHRcdFx0b0RhdGFQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XHRkaXNhYmxlU2lkZUVmZmVjdHM6IHRydWUsXG5cdFx0XHRcdFx0XHRncm91cElkOiBzR3JvdXBJZCxcblx0XHRcdFx0XHRcdGlnbm9yZUVUYWc6IGJJZ25vcmVFdGFnLFxuXHRcdFx0XHRcdFx0cmVwbGFjZVdpdGhSVkM6IG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbi5leGVjdXRlKCk7XG5cdFx0XHRcdGlmIChyZXN1bHRbMF0uc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IocmVzdWx0WzBdLnJlYXNvbik7XG5cdFx0XHRcdH0gZWxzZSBpZiAocmVzdWx0WzBdLnZhbHVlLnJldHVybmVkQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm8gY29udGV4dCByZXR1cm5lZCBieSB0aGUgYWN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXN1bHRbMF0udmFsdWUucmV0dXJuZWRDb250ZXh0O1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRpZiAoYkhhc1ByZXBhcmVBY3Rpb24pIHtcblx0XHRcdFx0XHQvLyBkZXN0cm95IHRoZSBvcGVyYXRpb24gYmluZGluZ3MgdG8gYXZvaWQgYWRkaXRpb25hbCBtZXNzYWdlIHJlcXVlc3RzIHNlbnQgYnkgdGhlIG1vZGVsXG5cdFx0XHRcdFx0Y29uc3QgcHJlcGFyZU9wZXJhdGlvbiA9IGF3YWl0IG9QcmVwYXJlUHJvbWlzZTtcblx0XHRcdFx0XHRwcmVwYXJlT3BlcmF0aW9uPy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0b3BlcmF0aW9uPy5jbGVhcigpO1xuXG5cdFx0XHRcdFx0Y29uc3QgYWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSxcblx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLFxuXHRcdFx0XHRcdFx0b0JpbmRpbmdQYXJhbWV0ZXJzID0gb1NpZGVFZmZlY3RzU2VydmljZS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKGFjdGlvbk5hbWUsIG9Db250ZXh0KSxcblx0XHRcdFx0XHRcdGFUYXJnZXRQYXRocyA9IG9CaW5kaW5nUGFyYW1ldGVycyAmJiBvQmluZGluZ1BhcmFtZXRlcnMucGF0aEV4cHJlc3Npb25zO1xuXHRcdFx0XHRcdGlmIChhVGFyZ2V0UGF0aHMgJiYgYVRhcmdldFBhdGhzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRQYXRocywgb0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCByZXF1ZXN0TWVzc2FnZXMob0NvbnRleHQsIG9TaWRlRWZmZWN0c1NlcnZpY2UsIHRydWUpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVzc2FnZXNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRocm93IGU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBhY3RpdmF0aW9uIGFjdGlvbiBub3QgZm91bmRcIik7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBhY3RpdmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc3VwcG9ydGVkIG1lc3NhZ2UgcHJvcGVydHkgcGF0aCBvbiB0aGUgUHJlcGFyZUFjdGlvbiBmb3IgYSBjb250ZXh0LlxuICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBQYXRoIHRvIHRoZSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VQYXRoRm9yUHJlcGFyZShjb250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Ly8gSWYgdGhlcmUgaXMgbm8gcmV0dXJuIHBhcmFtZXRlciwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlcXVlc3QgTWVzc2FnZXMuXG5cdC8vIFJBUCBkcmFmdCBwcmVwYXJlIGhhcyBubyByZXR1cm4gcGFyYW1ldGVyXG5cdHJldHVybiBnZXRSZXR1cm5UeXBlKGNvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSA/IGdldE1lc3NhZ2VQYXRoRm9yQ29udGV4dChjb250ZXh0KSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzdXBwb3J0ZWQgbWVzc2FnZSBwcm9wZXJ0eSBwYXRoIGZvciBhIGNvbnRleHQuXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIFBhdGggdG8gdGhlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBtZXRhQ29udGV4dCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdGNvbnN0IGNvbnZlcnRlZENvbnRleHQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpO1xuXHRjb25zdCBtZXNzYWdlcyA9IGNvbnZlcnRlZENvbnRleHQudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/Lk1lc3NhZ2VzO1xuXHRyZXR1cm4gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24obWVzc2FnZXMpID8gbWVzc2FnZXMucGF0aCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFeGVjdXRlIGEgcHJlcGFyYXRpb24gYWN0aW9uLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGdyb3VwSWQgVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHdlIHdhbnQgdG8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gYk1lc3NhZ2VzIElmIHNldCB0byB0cnVlLCB0aGUgUFJFUEFSRSBhY3Rpb24gcmV0cmlldmVzIFNBUF9NZXNzYWdlc1xuICogQHBhcmFtIGlnbm9yZUVUYWcgSWYgc2V0IHRvIHRydWUsIEVUYWcgaW5mb3JtYXRpb24gaXMgaWdub3JlZCB3aGVuIHRoZSBhY3Rpb24gaXMgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0Z3JvdXBJZD86IHN0cmluZyxcblx0Yk1lc3NhZ2VzPzogYm9vbGVhbixcblx0aWdub3JlRVRhZz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZCB8IE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IGJNZXNzYWdlcyA/IGdldE1lc3NhZ2VQYXRoRm9yUHJlcGFyZShvQ29udGV4dCkgOiB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUsIHNNZXNzYWdlc1BhdGggPyB7ICRzZWxlY3Q6IHNNZXNzYWdlc1BhdGggfSA6IHVuZGVmaW5lZCk7XG5cblx0XHQvLyBUT0RPOiBzaWRlIGVmZmVjdHMgcXVhbGlmaWVyIHNoYWxsIGJlIGV2ZW4gZGVwcmVjYXRlZCB0byBiZSBjaGVja2VkXG5cdFx0b09wZXJhdGlvbi5zZXRQYXJhbWV0ZXIoXCJTaWRlRWZmZWN0c1F1YWxpZmllclwiLCBcIlwiKTtcblxuXHRcdGNvbnN0IHNHcm91cElkID0gZ3JvdXBJZCB8fCBvT3BlcmF0aW9uLmdldEdyb3VwSWQoKTtcblx0XHRyZXR1cm4gb09wZXJhdGlvblxuXHRcdFx0Lmludm9rZShzR3JvdXBJZCwgaWdub3JlRVRhZylcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb247XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb25cIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHJldHVybiBvT3BlcmF0aW9uO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIHByZXBhcmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogUmVxdWVzdHMgdGhlIG1lc3NhZ2VzIGlmIGFubm90YXRlZCBmb3IgYSBnaXZlbiBjb250ZXh0LlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBtZXNzYWdlcyBzaGFsbCBiZSByZXF1ZXN0ZWRcbiAqIEBwYXJhbSBvU2lkZUVmZmVjdHNTZXJ2aWNlIFNlcnZpY2UgZm9yIHRoZSBTaWRlRWZmZWN0cyBvbiBTQVAgRmlvcmkgZWxlbWVudHNcbiAqIEBwYXJhbSByZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMgSWYgc2V0IHRvIHRydWUsIHRyYW5zaXRpb24gbWVzc2FnZXMgYXJlIHJlbW92ZWQgaWYgc3RhdGUgbWVzc2FnZXMgZXhpc3RcbiAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSBtZXNzYWdlcyB3ZXJlIHJlcXVlc3RlZFxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0TWVzc2FnZXMoXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRvU2lkZUVmZmVjdHNTZXJ2aWNlOiBTaWRlRWZmZWN0c1NlcnZpY2UsXG5cdHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyA9IGZhbHNlXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdGF3YWl0IG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFtzTWVzc2FnZXNQYXRoXSwgb0NvbnRleHQpO1xuXHRcdGlmIChyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMpIHtcblx0XHRcdGNvbnN0IGRhdGEgPSBhd2FpdCBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRpZiAoZGF0YVtzTWVzc2FnZXNQYXRoXS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdC8vaWYgc3RhdGUgbWVzc2FnZXMgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBQUkVQQVJBVElPTiBhY3Rpb24sIHRoZW4gcHJldmlvdXMgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcmUgcmVtb3ZlZFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuO1xufVxuLyoqXG4gKiBFeGVjdXRlcyBkaXNjYXJkIG9mIGEgZHJhZnQgZnVuY3Rpb24gdXNpbmcgSFRUUCBQb3N0LlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IEFwcCBDb21wb25lbnRcbiAqIEBwYXJhbSBiRW5hYmxlU3RyaWN0SGFuZGxpbmdcbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24oXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0YkVuYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGdldENvbnZlcnRlZEFjdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpO1xuXHRcdGlmIChjb252ZXJ0ZWRBY3Rpb24pIHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5ldyBPcGVyYXRpb24ob0FwcENvbXBvbmVudCwgb0NvbnRleHQuZ2V0TW9kZWwoKSwgY29udmVydGVkQWN0aW9uLCB7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0bGFiZWw6IGdldFJlc291cmNlTW9kZWwob0FwcENvbXBvbmVudCk/LmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiKSB8fCBcIlwiLFxuXHRcdFx0XHRjb250ZXh0czogW29Db250ZXh0XSxcblx0XHRcdFx0c2tpcE1lc3NhZ2VzOiB0cnVlLFxuXHRcdFx0XHRvRGF0YVByb3BlcnRpZXM6IHtcblx0XHRcdFx0XHRkaXNhYmxlU2lkZUVmZmVjdHM6IHRydWUsXG5cdFx0XHRcdFx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nOiAhYkVuYWJsZVN0cmljdEhhbmRsaW5nLFxuXHRcdFx0XHRcdGlnbm9yZUVUYWc6IGlzRW1wdHlPYmplY3Qob0NvbnRleHQuZ2V0T2JqZWN0KCkpLCAvLyBJZiB0aGUgY29udGV4dCBoYXMgbm90IGJlZW4gbG9hZGVkIHlldCwgd2UgY2FuIGlnbm9yZSB0aGUgRVRhZyAoYXMgbm8gcHJldmlvdXMgRVRhZyBpcyBhdmFpbGFibGUpXG5cdFx0XHRcdFx0Z3JvdXBJZDogXCJkaXJlY3RcIixcblx0XHRcdFx0XHRyZXBsYWNlV2l0aFJWQzogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdGRlZmVycmVkU3VibWl0OiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9KS5leGVjdXRlKCk7XG5cdFx0XHRpZiAocmVzdWx0WzBdLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihyZXN1bHRbMF0ucmVhc29uKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGRpc2NhcmQgYWN0aW9uIG5vdCBmb3VuZFwiKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGRpc2NhcmQgYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgc2libGluZyBjb250ZXh0IGZvciBhIHN1Ym9iamVjdCBwYWdlIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoIGZvciBhbGwgaW50ZXJtZWRpYXRlIHBhdGhzXG4gKiBiZXR3ZWVuIHRoZSBvYmplY3QgcGFnZSBhbmQgdGhlIHN1Ym9iamVjdCBwYWdlLlxuICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG4gKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdCBwYWdlXG4gKiBAcGFyYW0gcm9vdENvbnRleHRJbmZvIFRoZSBjb250ZXh0IGluZm8gb2Ygcm9vdCBvZiB0aGUgZHJhZnRcbiAqIEBwYXJhbSBncm91cElkXG4gKiBAcGFyYW0gYmluZGluZ1BhcmFtZXRlcnMgT3B0aW9uYWwgYmluZGluZyBwYXJhbWV0ZXJzIHdoZW4gY3JlYXRpbmcgdGhlIGNvbnRleHRcbiAqIEBwYXJhbSBjcmVhdGVLZWVwQWxpdmVDb250ZXh0IElmIHNldCB0byB0cnVlLCB0aGUgY29udGV4dCB3aWxsIGJlIGNyZWF0ZWQgYXMgYSBrZWVwLWFsaXZlIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdHJvb3RDb250ZXh0SW5mbz86IFJvb3RDb250ZXh0SW5mbyxcblx0Z3JvdXBJZD86IHN0cmluZyxcblx0YmluZGluZ1BhcmFtZXRlcnM/OiBvYmplY3QsXG5cdGNyZWF0ZUtlZXBBbGl2ZUNvbnRleHQgPSBmYWxzZVxuKTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0aWYgKCFyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3RhcnRzV2l0aChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHR9XG5cblx0aWYgKFxuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlICYmXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlXG5cdCkge1xuXHRcdC8vIFdlIGFscmVhZHkga25vdyB0aGUgc2libGluZyBmb3IgcmlnaHRtb3N0Q3VycmVudENvbnRleHQgZG9lc24ndCBleGlzdFxuXHRcdC8vIC0tPiBObyBuZWVkIHRvIGNoZWNrIGNhbm9uaWNhbCBwYXRocyBldGMuLi5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0dHJ5IHtcblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAxLiBGaW5kIGFsbCBzZWdtZW50cyBiZXR3ZWVuIHRoZSByb290IG9iamVjdCBhbmQgdGhlIHN1Yi1vYmplY3Rcblx0XHQvLyBFeGFtcGxlOiBmb3Igcm9vdCA9IC9QYXJhbShhYSkvRW50aXR5KGJiKSBhbmQgcmlnaHRNb3N0ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpXG5cdFx0Ly8gLS0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblxuXHRcdC8vIEZpbmQgYWxsIHNlZ21lbnRzIGluIHRoZSByaWdodG1vc3QgcGF0aFxuXHRcdGNvbnN0IGFkZGl0aW9uYWxQYXRoID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnJlcGxhY2Uocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSwgXCJcIik7XG5cdFx0Y29uc3Qgc2VnbWVudHMgPSBhZGRpdGlvbmFsUGF0aCA/IGFkZGl0aW9uYWxQYXRoLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIikgOiBbXTtcblx0XHQvLyBGaXJzdCBzZWdtZW50IGlzIGFsd2F5cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSByb290IG9iamVjdCwgd2hpY2ggY2FuIGNvbnRhaW4gJy8nIGluIGNhc2Ugb2YgYSBwYXJhbWV0cml6ZWQgZW50aXR5XG5cdFx0c2VnbWVudHMudW5zaGlmdChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAyLiBSZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBvZiB0aGUgc2libGluZyBlbnRpdHkgZm9yIGVhY2ggc2VnbWVudFxuXHRcdC8vIEV4YW1wbGU6IGZvciBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblx0XHQvLyAtLT4gcmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgZm9yIFwiUGFyYW0oYWEpL0VudGl0eShiYikvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKS9TaWJsaW5nRW50aXR5XCJcblx0XHRjb25zdCBvbGRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBuZXdQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgY3VycmVudFBhdGggPSBcIlwiO1xuXG5cdFx0Ly8gQ29tcHV0aW5nIHNpYmxpbmcgZW50aXR5IG9mIHJvb3Qgb2YgdGhlIGRyYWZ0IGNvbnRleHQgaXMgbm90IHJlcXVpcmVkIGlmIHRoZSBjb250ZXh0IGlzIGFscmVhZHkgaW4gdGhlIHN1Yi1PUFxuXHRcdC8vIEV4YW1wbGU6IEVkaXQgaW4gU3ViLU9QIHdoZXJlIG5ldyBjb250ZXh0IGlzIGFscmVhZHkgYXZhaWxhYmxlXG5cdFx0Y29uc3QgcGF0aHMgPSBbLi4uc2VnbWVudHNdO1xuXHRcdGlmIChyb290Q29udGV4dEluZm8/LnJvb3RTaWJsaW5nUGF0aFByb21pc2UpIHtcblx0XHRcdHBhdGhzLnNoaWZ0KCk7XG5cdFx0XHRjdXJyZW50UGF0aCA9IFwiL1wiICsgcm9vdEN1cnJlbnRDb250ZXh0Py5nZXRQYXRoKCk/LnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3QgY2Fub25pY2FsUGF0aFByb21pc2VzID0gcGF0aHMubWFwKGFzeW5jIChzZWdtZW50KSA9PiB7XG5cdFx0XHRjdXJyZW50UGF0aCArPSBgLyR7c2VnbWVudH1gO1xuXHRcdFx0b2xkUGF0aHMudW5zaGlmdChjdXJyZW50UGF0aCk7XG5cdFx0XHRpZiAoY3VycmVudFBhdGguZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWxcblx0XHRcdFx0XHQuYmluZENvbnRleHQoYCR7Y3VycmVudFBhdGh9L1NpYmxpbmdFbnRpdHlgLCB1bmRlZmluZWQsIGdyb3VwSWQgPyB7ICQkZ3JvdXBJZDogZ3JvdXBJZCB9IDogdW5kZWZpbmVkKVxuXHRcdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0cmV0dXJuIHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7IC8vIDEtMSByZWxhdGlvblxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMy4gUmVjb25zdHJ1Y3QgdGhlIGZ1bGwgcGF0aHMgZnJvbSBjYW5vbmljYWwgcGF0aHMgKGZvciBwYXRoIG1hcHBpbmcpXG5cdFx0Ly8gRXhhbXBsZTogZm9yIGNhbm9uaWNhbCBwYXRocyBcIi9QYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiL0VudGl0eTIoY2Mtc2libGluZylcIiwgXCIvRW50aXR5MyhkZC1zaWJsaW5nKVwiXG5cdFx0Ly8gLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZylcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpL19OYXYoY2Mtc2libGluZylcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpL19OYXYoY2Mtc2libGluZykvX1N1Yk5hdihkZC1zaWJsaW5nKVwiXVxuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhzID0gKGF3YWl0IFByb21pc2UuYWxsKGNhbm9uaWNhbFBhdGhQcm9taXNlcykpIGFzIHN0cmluZ1tdO1xuXG5cdFx0Ly8gV29ya2Fyb3VuZCAodGVtcG9yYXJ5ID8pOiB3aGVuIHRoZSBzaWJsaW5nIGRvZXNuJ3QgZXhpc3QsIHJlcXVlc3RDYW5vbmljYWxQYXRoIHJldHVybnMgdGhlIHNhbWUgcGF0aFxuXHRcdGlmIChcblx0XHRcdGNhbm9uaWNhbFBhdGhzLnNvbWUoKHBhdGgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHBhdGggJiYgcGF0aC5lbmRzV2l0aChcIi9TaWJsaW5nRW50aXR5XCIpO1xuXHRcdFx0fSlcblx0XHQpIHtcblx0XHRcdC8vIEF0IGxlYXN0IG9uZSBzaWJsaW5nIGVudGl0eSBkb2Vzbid0IGV4aXN0XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmIChyb290Q29udGV4dEluZm8/LnJvb3RTaWJsaW5nUGF0aFByb21pc2UpIHtcblx0XHRcdGNvbnN0IHJvb3RTaWJsaW5nUGF0aCA9IChhd2FpdCByb290Q29udGV4dEluZm8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSk/LmdldFBhdGgoKSBhcyBzdHJpbmc7XG5cdFx0XHRjYW5vbmljYWxQYXRocy51bnNoaWZ0KHJvb3RTaWJsaW5nUGF0aCk7XG5cdFx0XHRvbGRQYXRocy5wdXNoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdH1cblx0XHRsZXQgc2libGluZ1BhdGggPSBcIlwiO1xuXHRcdGNhbm9uaWNhbFBhdGhzLmZvckVhY2goKGNhbm9uaWNhbFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggIT09IDApIHtcblx0XHRcdFx0aWYgKHNlZ21lbnRzW2luZGV4XS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uID0gc2VnbWVudHNbaW5kZXhdLnJlcGxhY2UoL1xcKC4qJC8sIFwiXCIpOyAvLyBLZWVwIG9ubHkgbmF2aWdhdGlvbiBuYW1lIGZyb20gdGhlIHNlZ21lbnQsIGkuZS4gYWFhKHh4eCkgLS0+IGFhYVxuXHRcdFx0XHRcdGNvbnN0IGtleXMgPSBjYW5vbmljYWxQYXRoLnJlcGxhY2UoLy4qXFwoLywgXCIoXCIpOyAvLyBLZWVwIG9ubHkgdGhlIGtleXMgZnJvbSB0aGUgY2Fub25pY2FsIHBhdGgsIGkuZS4gYWFhKHh4eCkgLS0+ICh4eHgpXG5cdFx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke25hdmlnYXRpb259JHtrZXlzfWA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke3NlZ21lbnRzW2luZGV4XX1gOyAvLyAxLTEgcmVsYXRpb25cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2libGluZ1BhdGggPSBjYW5vbmljYWxQYXRoOyAvLyBUbyBtYW5hZ2UgcGFyYW1ldHJpemVkIGVudGl0aWVzXG5cdFx0XHR9XG5cdFx0XHRuZXdQYXRocy51bnNoaWZ0KHNpYmxpbmdQYXRoKTtcblx0XHR9KTtcblxuXHRcdGxldCBwYXJhbWV0ZXJzOiB7ICRzZWxlY3Q/OiBzdHJpbmc7ICQkZ3JvdXBJZD86IHN0cmluZyB9O1xuXHRcdGNvbnN0IG1lc3NhZ2VQYXRoID0gZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0KTtcblx0XHRpZiAoY3JlYXRlS2VlcEFsaXZlQ29udGV4dCkge1xuXHRcdFx0cGFyYW1ldGVycyA9IHsgJCRncm91cElkOiBcIiRhdXRvLldvcmtlcnNcIiB9OyAvLyBXZSBuZWVkIHRvIHVzZSB0aGUgc2FtZSBncm91cCBJRCBhcyBmb3IgdGhlIHBhcmVudCBsaXN0IGJpbmRpbmdcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyYW1ldGVycyA9IGJpbmRpbmdQYXJhbWV0ZXJzID8/IHt9O1xuXHRcdFx0aWYgKG1lc3NhZ2VQYXRoKSB7XG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLiRzZWxlY3QpIHtcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLiRzZWxlY3QgKz0gYCwke21lc3NhZ2VQYXRofWA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cGFyYW1ldGVycy4kc2VsZWN0ID0gbWVzc2FnZVBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHBhcmFtZXRlcnMuJCRncm91cElkID0gXCIkYXV0by5IZXJvZXNcIjtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogY3JlYXRlS2VlcEFsaXZlQ29udGV4dFxuXHRcdFx0XHQ/IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoc2libGluZ1BhdGgsICEhbWVzc2FnZVBhdGgsIHBhcmFtZXRlcnMpXG5cdFx0XHRcdDogbW9kZWwuYmluZENvbnRleHQoc2libGluZ1BhdGgsIHVuZGVmaW5lZCwgcGFyYW1ldGVycykuZ2V0Qm91bmRDb250ZXh0KCksIC8vIENyZWF0ZSB0aGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dCBmcm9tIGl0cyBwYXRoXG5cdFx0XHRwYXRoTWFwcGluZzogb2xkUGF0aHMubWFwKChvbGRQYXRoLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG9sZFBhdGgsXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3UGF0aHNbaW5kZXhdXG5cdFx0XHRcdH07XG5cdFx0XHR9KVxuXHRcdH07XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gQSBjYW5vbmljYWwgcGF0aCBjb3VsZG4ndCBiZSByZXNvbHZlZCAoYmVjYXVzZSBhIHNpYmxpbmcgZG9lc24ndCBleGlzdClcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRyYWZ0IGRvY3VtZW50IGZyb20gYW4gZXhpc3RpbmcgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNvcmVvZ3JhcGh5IGRlZmluZWQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMub1ZpZXddIFRoZSB2aWV3XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJQcmVzZXJ2ZUNoYW5nZXNdIFByZXNlcnZlIGNoYW5nZXMgb2YgYW4gZXhpc3RpbmcgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAcGFyYW0gZ3JvdXBJZCBUaGUgYmF0Y2ggZ3JvdXBJZCBmb3IgcG9zdCBjYWxsIG9mIGVkaXQgYWN0aW9uXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIHRyYW5zYWN0aW9uRGV0YWlscyBPcHRpb25hbCBvYmplY3QgdG8gcmV0dXJuIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCBob3cgdGhlIHRyYW5zYWN0aW9uIHdhcyBleGVjdXRlZFxuICogQHBhcmFtIHRyYW5zYWN0aW9uRGV0YWlscy5leGlzdGluZ0RyYWZ0UmV1c2VkIEFuIGV4aXN0aW5nIGRyYWZ0IHdhcyByZXR1cm5lZCwgaW5zdGVhZCBvZiByZXR1cm5pbmcgYSBuZXcgb25lXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dCBjb250ZXh0fSBvZiB0aGUgbmV3IGRyYWZ0IGRvY3VtZW50XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtUGFyYW1ldGVyczoge1xuXHRcdG9WaWV3OiBGRVZpZXc7XG5cdFx0YlByZXNlcnZlQ2hhbmdlcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdH0sXG5cdGdyb3VwSWQ6IHN0cmluZyxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHR0cmFuc2FjdGlvbkRldGFpbHM/OiB7XG5cdFx0ZXhpc3RpbmdEcmFmdFJldXNlZD86IGJvb2xlYW47XG5cdH1cbik6IFByb21pc2U8Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fSxcblx0XHRiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyA9XG5cdFx0XHR0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwidW5kZWZpbmVkXCIgfHwgKHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJib29sZWFuXCIgJiYgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMpOyAvL2RlZmF1bHQgdHJ1ZVxuXG5cdC8qKlxuXHQgKiBPdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGNoYW5nZS5cblx0ICogQHBhcmFtIHJlc3BvbnNlIENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdCBvciB0aGUgZXJyb3IgcmV0cmlldmVkXG5cdCAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHtAbGluayBzYXAuZmUuY29yZS5hY3Rpb25zI2V4ZWN1dGVEcmFmdEVkaXRBY3Rpb259XG5cdCAqL1xuXHRhc3luYyBmdW5jdGlvbiBvdmVyd3JpdGVDaGFuZ2UocmVzcG9uc2U6IENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlKTogUHJvbWlzZTxDb250ZXh0IHwgQ29udGV4dEVycm9yVHlwZSB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vT3ZlcndyaXRlIGV4aXN0aW5nIGNoYW5nZXNcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG1QYXJhbWV0ZXJzLm9WaWV3KTtcblx0XHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IGF3YWl0IGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0Ly8gcmVtb3ZlIGFsbCB1bmJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgYXMgd2Ugc2hvdyBhIHNwZWNpYWwgZGlhbG9nXG5cdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0bGV0IHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IG1QYXJhbWV0ZXJzLm9WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0O1xuXHRcdFx0aWYgKHNJbmZvKSB7XG5cdFx0XHRcdGNvbnN0IHNMb2NrZWRCeVVzZXJNc2cgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX0RSQUZUX0xPQ0tFRF9CWV9VU0VSXCIsIHNJbmZvLCBzRW50aXR5U2V0KTtcblx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0luZm8gPSBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlcjtcblx0XHRcdFx0Y29uc3Qgc1Vuc2F2ZWRDaGFuZ2VzTXNnID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9VTlNBVkVEX0NIQU5HRVNcIiwgc0luZm8sIHNFbnRpdHlTZXQpO1xuXHRcdFx0XHRhd2FpdCBkcmFmdC5zaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnLCBvQ29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBkcmFmdC5leGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBmYWxzZSwgbVBhcmFtZXRlcnMub1ZpZXcsIGdyb3VwSWQsIG1lc3NhZ2VIYW5kbGVyLCB0cnVlKTsgLy8gdHJ1ZSBiZWNhdXNlIHdlIG92ZXJ3cml0ZSBjaGFuZ2VzXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICgocmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSk/Lm1lc3NhZ2UpIHtcblx0XHRcdE1lc3NhZ2VCb3guZXJyb3IoKHJlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLm1lc3NhZ2UpO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoYERyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0fVxuXG5cdGlmICghb0NvbnRleHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHR9XG5cdGxldCBvRHJhZnRDb250ZXh0OiBDb250ZXh0IHwgQ29udGV4dEVycm9yVHlwZSB8IHVuZGVmaW5lZDtcblx0dHJ5IHtcblx0XHRvRHJhZnRDb250ZXh0ID0gYXdhaXQgZHJhZnQuZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3csIG1QYXJhbWV0ZXJzLm9WaWV3LCBncm91cElkLCBtZXNzYWdlSGFuZGxlcik7XG5cdH0gY2F0Y2ggKG9SZXNwb25zZSkge1xuXHRcdGlmICgob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLnN0YXR1cyA9PT0gNDA5IHx8IChvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkuc3RhdHVzID09PSA0MjMpIHtcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXJzID0gTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSlcblx0XHRcdFx0PyB7ICRzZWxlY3Q6IFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRBZG1pbmlzdHJhdGl2ZVVzZXJcIiB9XG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3Qgc2libGluZ0luZm8gPSBhd2FpdCBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0b0FwcENvbXBvbmVudC5faXNGY2xFbmFibGVkKClcblx0XHRcdCk7XG5cdFx0XHRpZiAoc2libGluZ0luZm8/LnRhcmdldENvbnRleHQpIHtcblx0XHRcdFx0Ly90aGVyZSBpcyBhIGNvbnRleHQgYXV0aG9yaXplZCB0byBiZSBlZGl0ZWQgYnkgdGhlIGN1cnJlbnQgdXNlclxuXHRcdFx0XHRhd2FpdCBDb21tb25VdGlscy53YWl0Rm9yQ29udGV4dFJlcXVlc3RlZChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0KTtcblx0XHRcdFx0aWYgKHRyYW5zYWN0aW9uRGV0YWlscykge1xuXHRcdFx0XHRcdHRyYW5zYWN0aW9uRGV0YWlscy5leGlzdGluZ0RyYWZ0UmV1c2VkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly90aGVyZSBpcyBubyBkcmFmdCBvd25lZCBieSB0aGUgY3VycmVudCB1c2VyXG5cdFx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBvdmVyd3JpdGVDaGFuZ2Uob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIShvUmVzcG9uc2UgJiYgKG9SZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKS5jYW5jZWxlZCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihvUmVzcG9uc2UgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHRpZiAob0RyYWZ0Q29udGV4dCkge1xuXHRcdGNvbnN0IHNFZGl0QWN0aW9uTmFtZSA9IGRyYWZ0LmdldEFjdGlvbk5hbWUob0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRURJVCk7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNFZGl0QWN0aW9uTmFtZSwgb0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRpZiAob1NpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRhd2FpdCBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck9EYXRhQWN0aW9uKG9TaWRlRWZmZWN0cywgb0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBhY3RpdmUgZG9jdW1lbnQgZnJvbSBhIGRyYWZ0IGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjaG9yZW9ncmFwaHkgZGVmaW5lZC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyBhIHZldG8gYmVmb3JlIHRoZSAnQ3JlYXRlJyByZXF1ZXN0IGlzIGV4ZWN1dGVkXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayBmb3IgcG9zdHByb2Nlc3NpbmcgYWZ0ZXIgZG9jdW1lbnQgd2FzIGFjdGl2YXRlZC5cbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMucmVzb3VyY2VNb2RlbF0gUmVzb3VyY2UgTW9kZWxcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVEb2N1bWVudChcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRtUGFyYW1ldGVyczogeyBmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQ/OiBGdW5jdGlvbjsgZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQ/OiBGdW5jdGlvbjsgcmVzb3VyY2VNb2RlbD86IFJlc291cmNlTW9kZWwgfSxcblx0aXNTdGFuZGFyZFNhdmU/OiBib29sZWFuIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0Y29uc3QgbVBhcmFtID0gbVBhcmFtZXRlcnMgfHwge307XG5cdGlmICghb0NvbnRleHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gZHJhZnQgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdH1cblxuXHRjb25zdCBiRXhlY3V0ZSA9IG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBhd2FpdCBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWU7XG5cdGlmICghYkV4ZWN1dGUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEFjdGl2YXRpb24gb2YgdGhlIGRvY3VtZW50IHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHR9XG5cblx0bGV0IG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IENvbnRleHQ7XG5cdGlmICghZHJhZnQuaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihcblx0XHRcdG9Db250ZXh0LFxuXHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0bVBhcmFtZXRlcnMucmVzb3VyY2VNb2RlbFxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0LyogYWN0aXZhdGlvbiByZXF1aXJlcyBwcmVwYXJhdGlvbiAqL1xuXHRcdGNvbnN0IHNCYXRjaEdyb3VwID0gXCIkYXV0b1wiO1xuXHRcdC8vd2hlbiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIHRoZXJlIHdpbGwgYmUgYSBwYXRjaCByZXF1ZXN0IG1lcmdlZCB0b2dldGhlciB3aXRoIHRoZSBkcmFmdFByZXBhcmUgYW5kIGRyYWZ0QWNpdmF0ZS5cblx0XHQvL1RoZSBwYXRjaCBjaGFuZ2VzIHRoZSBFdGFnLCB0aGVyZm9yZSB0aGUgcHJlcGFyZSBuZWVkcyB0byBpZ25vcmUgRXRhZ3Ncblx0XHRjb25zdCBpZ25vcmVFdGFnOiBib29sZWFuID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0Y29uc3Qgb1ByZXBhcmVQcm9taXNlID0gZHJhZnQuZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQsIHNCYXRjaEdyb3VwLCB1bmRlZmluZWQsIGlnbm9yZUV0YWcpO1xuXHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0JhdGNoR3JvdXApO1xuXHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKFxuXHRcdFx0b0NvbnRleHQsXG5cdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRzQmF0Y2hHcm91cCxcblx0XHRcdG9QcmVwYXJlUHJvbWlzZSxcblx0XHRcdG1QYXJhbWV0ZXJzLnJlc291cmNlTW9kZWwsXG5cdFx0XHRpc1N0YW5kYXJkU2F2ZVxuXHRcdCk7XG5cblx0XHRjb25zdCB2YWx1ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChbb1ByZXBhcmVQcm9taXNlLCBvQWN0aXZhdGVQcm9taXNlXSk7XG5cdFx0b0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IHZhbHVlc1sxXTtcblx0fVxuXHRyZXR1cm4gbVBhcmFtLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50ID8gbVBhcmFtLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0LCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KSA6IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG59XG5cbi8qKlxuICogRGlzcGxheSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZyBib3ggYWZ0ZXIgcHJlc3NpbmcgdGhlIGVkaXQgYnV0dG9uIG9mIGFuIG9iamVjdCBwYWdlIHdpdGggdW5zYXZlZCBjaGFuZ2VzLlxuICogQHBhcmFtIHNVbnNhdmVkQ2hhbmdlc01zZyBEaWFsb2cgYm94IG1lc3NhZ2UgaW5mb3JtaW5nIHRoZSB1c2VyIHRoYXQgaWYgaGUgc3RhcnRzIGVkaXRpbmcsIHRoZSBwcmV2aW91cyB1bnNhdmVkIGNoYW5nZXMgd2lsbCBiZSBsb3N0XG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveChzVW5zYXZlZENoYW5nZXNNc2c6IHN0cmluZywgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0Y29uc3QgbG9jYWxJMThuUmVmID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IHVua25vd24pID0+IHZvaWQpIHtcblx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHR0aXRsZTogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9USVRMRV9XQVJOSU5HXCIpLFxuXHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0Y29udGVudDogbmV3IFRleHQoe1xuXHRcdFx0XHR0ZXh0OiBzVW5zYXZlZENoYW5nZXNNc2dcblx0XHRcdH0pLFxuXHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIiksXG5cdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRyZWplY3QoYERyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9EaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0b0RpYWxvZy5vcGVuKCk7XG5cdH0pO1xufVxuXG4vKipcbiAqIEhUVFAgUE9TVCBjYWxsIHdoZW4gRHJhZnRBY3Rpb24gaXMgcHJlc2VudCBmb3IgRHJhZnQgRGVsZXRlOyBIVFRQIERFTEVURSBjYWxsIHdoZW4gdGhlcmUgaXMgbm8gRHJhZnRBY3Rpb25cbiAqIGFuZCBBY3RpdmUgSW5zdGFuY2UgYWx3YXlzIHVzZXMgREVMRVRFLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGRpc2NhcmRlZFxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGRpc2NhcmRlZFxuICogQHBhcmFtIGJFbmFibGVTdHJpY3RIYW5kbGluZ1xuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIGNvbnRleHQgaXMgZGVsZXRlZFxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVEcmFmdChcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKG9Db250ZXh0LmlzVHJhbnNpZW50KCkpIHtcblx0XHQvLyBUcmFuc2llbnQgY29udGV4dHMgKGUuZy4gd2hlbiB0cnlpbmcgdG8gZGVsZXRlIGEgY29udGV4dCB3aGljaCBjb3VsZG4ndCBiZSBjcmVhdGVkIGJlY2F1c2Ugb2YgYW4gZXJyb3IpIGNhbiBiZSBkZWxldGVkIGltbWVkaWF0ZWx5XG5cdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHR9XG5cdGNvbnN0IHNEaXNjYXJkQWN0aW9uID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpO1xuXHRjb25zdCBiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eTtcblxuXHRpZiAoYklzQWN0aXZlRW50aXR5IHx8ICghYklzQWN0aXZlRW50aXR5ICYmICFzRGlzY2FyZEFjdGlvbikpIHtcblx0XHQvL1VzZSBEZWxldGUgaW4gY2FzZSBvZiBhY3RpdmUgZW50aXR5IGFuZCBubyBkaXNjYXJkIGFjdGlvbiBhdmFpbGFibGUgZm9yIGRyYWZ0XG5cdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkgJiYgIW9Db250ZXh0LmlzSW5hY3RpdmUoKSkge1xuXHRcdFx0YXdhaXQgb0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXaGVuIGNhbmNlbGxpbmcgYW4gZWRpdCBkcmFmdCByb290IG5vZGUsIHVzZSBtb2RlbC5kZWxldGUgaW5zdGVhZCBvZiBjb250ZXh0LmRlbGV0ZSwgdG8gb25seSBzZW5kIGRlbGV0aW9uIHRvIGJhY2tlbmQsXG5cdFx0XHQvLyBidXQga2VlcCBjb250ZXh0IGFsaXZlIChpbmNsdWRpbmcgYmluZGluZ3MpLiBUaHVzLCB3ZSBjYW4gZW5zdXJlIHNlYW1sZXNzIHRyYW5zaXN0aW9uIGZyb20gZHJhZnQgdG8gYWN0aXZlIGluc3RhbmNlXG5cdFx0XHQvLyAod2l0aG91dCBpbnRlcm1lZGlhdGUgdW5kZWZpbmVkIGJpbmRpbmdzIGUuZy4gbGVhZGluZyB0byBmbGlja2VyaW5nKS4gVGhpcyBkb2Vzbid0IHdvcmsgaW4gY2FzZSBvZiBGQ0wgYXBwcywgYXNcblx0XHRcdC8vIG1vZGVsLmRlbGV0ZSBkb2Vzbid0IGNsZWFuIHVwIHRoZSBwYXJlbnQgbGlzdEJpbmRpbmcgcHJvcGVybHksIGxlYWRpbmcgdG8gaW5jb3JyZWN0IE9EYXRhIHJlcXVlc3RzLlxuXHRcdFx0Ly8gSW4gb3RoZXIgY2FzZXMgKGRlbGV0aW5nIGFjdGl2ZSwgZGlzY2FyZGluZyBjcmVhdGUgZHJhZnQgb3IgZGlzY2FyZGluZyBkcmFmdCBub2RlKSwgc3RheSB3aXRoIGNvbnRleHQuZGVsZXRlLlxuXHRcdFx0Ly8gV2hlbiBjYW5jZWxsaW5nIGEgY3JlYXRlIGRyYWZ0LCBwYWdlIGlzIGNsb3NlZCwgdGh1cyB0aGUgcHJvYmxlbSBvZiBmbGlja2VyaW5nIGNhbm5vdCBvY2N1ci5cblx0XHRcdC8vIEluIGNhc2Ugb2YgZGlzY2FyZGluZyBhIGRyYWZ0IG5vZGUsIHRoZW9yZXRpY2FsbHkgdGhlIHNhbWUgcHJvYmxlbSBjb3VsZFxuXHRcdFx0Ly8gb2NjdXIsIGJ1dCBuZWVkcyBxdWl0ZSBzcGVjaWZpYyBtb2RlbGxpbmcgKGJ1dHRvbiB2aXNpYmlsaXR5IG9uIGl0ZW0gbGV2ZWwgYm91bmQgYWdhaW5zdCBzZXJ2aWNlIHByb3BlcnR5IGluIGFuIEZDTCBhcHApXG5cdFx0XHQvLyBhbmQgYWN0aW5nIChsb29raW5nIGF0IGJ1dHRvbiBvbiB0aGlyZCBjb2x1bW4gd2hpbGUgZGlzY2FyZGluZyBvbiAybmQgY29sdW1uKS4gQ3VycmVudGx5LCBtb2RlbCBzZWVtcyBub3QgdG8gYmUgcHJlcGFyZWRcblx0XHRcdC8vIGZvciB0aGF0IGNhc2UsIHRodXMgZHVlIHRvIHRoZSBtaW5pbWFsIGltcGFjdCAob25seSBpbnRlcm1lZGlhdGUgdmlzdWFsIHN0YXRlKSwgYWNjZXB0aW5nIHRoaXMgZm9yIHRoZSB0aW1lIGJlaW5nLlxuXHRcdFx0Y29uc3QgaXNJbmxpbmVFZGl0R3JvdXAgPSBvQ29udGV4dC5nZXRVcGRhdGVHcm91cElkKCkgPT09IENvbW1vblV0aWxzLklOTElORUVESVRfVVBEQVRFR1JPVVBJRDtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCB0YXJnZXRFbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkpPy50YXJnZXRFbnRpdHlTZXQ7XG5cdFx0XHRjb25zdCB1c2VNb2RlbERlbGV0ZSA9XG5cdFx0XHRcdCFvQXBwQ29tcG9uZW50Ll9pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0XHQhb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSAmJlxuXHRcdFx0XHRNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdCh0YXJnZXRFbnRpdHlTZXQpICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0aWYgKHVzZU1vZGVsRGVsZXRlKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5nZXRNb2RlbCgpLmRlbGV0ZShvQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNJbmxpbmVFZGl0R3JvdXApIHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZShcIiRhdXRvXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvL1VzZSBEaXNjYXJkIFBvc3QgQWN0aW9uIGlmIGl0IGlzIGEgZHJhZnQgZW50aXR5IGFuZCBkaXNjYXJkIGFjdGlvbiBleGlzdHNcblx0XHRhd2FpdCBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKG9Db250ZXh0LCBtZXNzYWdlSGFuZGxlciwgb0FwcENvbXBvbmVudCwgYkVuYWJsZVN0cmljdEhhbmRsaW5nKTtcblx0fVxufVxuXG5jb25zdCBkcmFmdCA9IHtcblx0Y3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ6IGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50LFxuXHRhY3RpdmF0ZURvY3VtZW50OiBhY3RpdmF0ZURvY3VtZW50LFxuXHRkZWxldGVEcmFmdDogZGVsZXRlRHJhZnQsXG5cdGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb246IGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24sXG5cdGV4ZWN1dGVEcmFmdFZhbGlkYXRpb246IGV4ZWN1dGVEcmFmdFZhbGlkYXRpb24sXG5cdGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uOiBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbixcblx0ZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbjogZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbixcblx0aGFzUHJlcGFyZUFjdGlvbjogaGFzUHJlcGFyZUFjdGlvbixcblx0Y29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbjogY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbixcblx0cHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb246IGRyYWZ0RGF0YUxvc3NQb3B1cC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbixcblx0c2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uOiBkcmFmdERhdGFMb3NzUG9wdXAuc2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uLFxuXHRjcmVhdGVPcGVyYXRpb246IGNyZWF0ZU9wZXJhdGlvbixcblx0ZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbjogZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbixcblx0TmF2aWdhdGlvblR5cGU6IGRyYWZ0RGF0YUxvc3NQb3B1cC5OYXZpZ2F0aW9uVHlwZSxcblx0Z2V0QWN0aW9uTmFtZTogZ2V0QWN0aW9uTmFtZSxcblx0c2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94OiBzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3hcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWZ0O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztFQXVGQTtFQUNBLE1BQU1BLGVBQWUsR0FBRztJQUN2QkMsSUFBSSxFQUFFLFlBQVk7SUFDbEJDLFVBQVUsRUFBRSxrQkFBa0I7SUFDOUJDLE9BQU8sRUFBRSxlQUFlO0lBQ3hCQyxPQUFPLEVBQUU7RUFDVixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTQyxhQUFhQSxDQUFDQyxRQUFpQixFQUFFQyxVQUFrQixFQUFVO0lBQ3JFLE1BQU1DLE1BQU0sR0FBR0YsUUFBUSxDQUFDRyxRQUFRLENBQUMsQ0FBQztNQUNqQ0MsVUFBVSxHQUFHRixNQUFNLENBQUNHLFlBQVksQ0FBQyxDQUFDO01BQ2xDQyxjQUFjLEdBQUdGLFVBQVUsQ0FBQ0csV0FBVyxDQUFDUCxRQUFRLENBQUNRLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFNUQsT0FBT0osVUFBVSxDQUFDSyxTQUFTLENBQUMsR0FBR0gsY0FBYyw2Q0FBNkNMLFVBQVUsRUFBRSxDQUFDO0VBQ3hHO0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTUyxlQUFlQSxDQUFDVixRQUFpQixFQUFFQyxVQUFrQixFQUFFVSxRQUFnQyxFQUF1QjtJQUN0SCxNQUFNQyxjQUFjLEdBQUdiLGFBQWEsQ0FBQ0MsUUFBUSxFQUFFQyxVQUFVLENBQUM7SUFFMUQsT0FBT0QsUUFBUSxDQUFDRyxRQUFRLENBQUMsQ0FBQyxDQUFDVSxXQUFXLENBQUMsR0FBR0QsY0FBYyxPQUFPLEVBQUVaLFFBQVEsRUFBRVcsUUFBUSxDQUFDO0VBQ3JGOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNHLGtCQUFrQkEsQ0FBQ0MsT0FBZ0IsRUFBRUMsU0FBaUIsRUFBeUI7SUFDdkYsTUFBTUMsYUFBYSxHQUFHbEIsYUFBYSxDQUFDZ0IsT0FBTyxFQUFFQyxTQUFTLENBQUM7SUFDdkQsTUFBTUUsU0FBUyxHQUFHSCxPQUFPLENBQUNaLFFBQVEsQ0FBQyxDQUFDLENBQUNFLFlBQVksQ0FBQyxDQUFDO01BQ2xEYyxVQUFVLEdBQUcsR0FBR0QsU0FBUyxDQUFDWCxXQUFXLENBQUNRLE9BQU8sQ0FBQ1AsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJUyxhQUFhLEVBQUU7TUFDM0VHLFdBQVcsR0FBR0YsU0FBUyxDQUFDRyxvQkFBb0IsQ0FBQ0YsVUFBVSxDQUFFO0lBQzFELE9BQU9HLFlBQVksQ0FBQ0osU0FBUyxDQUFDLENBQUNLLFdBQVcsQ0FBd0JILFdBQVcsQ0FBQ1osT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDZ0IsTUFBTTtFQUNoRzs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTQyxhQUFhQSxDQUFDekIsUUFBaUIsRUFBRUMsVUFBa0IsRUFBVztJQUN0RSxNQUFNQyxNQUFNLEdBQUdGLFFBQVEsQ0FBQ0csUUFBUSxDQUFDLENBQUM7TUFDakNDLFVBQVUsR0FBR0YsTUFBTSxDQUFDRyxZQUFZLENBQUMsQ0FBQztNQUNsQ0MsY0FBYyxHQUFHRixVQUFVLENBQUNHLFdBQVcsQ0FBQ1AsUUFBUSxDQUFDUSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRTVELE9BQU9KLFVBQVUsQ0FBQ0ssU0FBUyxDQUFDLEdBQUdILGNBQWMsNkNBQTZDTCxVQUFVLGNBQWMsQ0FBQztFQUNwSDtFQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTeUIsZ0JBQWdCQSxDQUFDMUIsUUFBaUIsRUFBVztJQUNyRCxPQUFPLENBQUMsQ0FBQ0QsYUFBYSxDQUFDQyxRQUFRLEVBQUVOLGVBQWUsQ0FBQ0ksT0FBTyxDQUFDO0VBQzFEO0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlNkIsc0JBQXNCQSxDQUNwQzNCLFFBQWlCLEVBQ2pCNEIsZ0JBQXlCLEVBQ3pCQyxLQUFXLEVBQ1hDLE9BQWUsRUFDZkMsY0FBOEIsRUFDOUJDLGVBQXlCLEVBQ007SUFDL0I7SUFDQTtJQUNBLE1BQU1DLGVBQWUsR0FBR25CLGtCQUFrQixDQUFDZCxRQUFRLEVBQUVOLGVBQWUsQ0FBQ0MsSUFBSSxDQUFDO0lBQzFFLElBQUlzQyxlQUFlLEVBQUU7TUFDcEIsTUFBTWpCLFNBQVMsR0FBRyxJQUFJa0IsU0FBUyxDQUFDQyxXQUFXLENBQUNDLGVBQWUsQ0FBQ1AsS0FBSyxDQUFDLEVBQUU3QixRQUFRLENBQUNHLFFBQVEsQ0FBQyxDQUFDLEVBQUU4QixlQUFlLEVBQUU7UUFDekdGLGNBQWMsRUFBRUEsY0FBYztRQUM5Qk0sUUFBUSxFQUFFLENBQUNyQyxRQUFRLENBQUM7UUFDcEJzQyxLQUFLLEVBQUVDLGdCQUFnQixDQUFDVixLQUFLLENBQUMsQ0FBQ1csT0FBTyxDQUFDLDJCQUEyQixDQUFDO1FBQ25FQyxpQkFBaUIsRUFBRTtVQUFFQyxxQkFBcUIsRUFBRSxJQUFJO1VBQUVDLGVBQWUsRUFBRTtRQUFRLENBQUM7UUFDNUVDLFlBQVksRUFBRSxJQUFJO1FBQ2xCQyxlQUFlLEVBQUU7VUFDaEJDLGtCQUFrQixFQUFFLElBQUk7VUFDeEJDLFVBQVUsRUFBRUMsYUFBYSxDQUFDaEQsUUFBUSxDQUFDUyxTQUFTLENBQUMsQ0FBQyxDQUFDO1VBQUU7VUFDakRxQixPQUFPLEVBQUVBLE9BQU87VUFDaEJtQixjQUFjLEVBQUVqRCxRQUFRLENBQUNrRCxVQUFVLENBQUMsQ0FBQyxDQUFDQyxHQUFHLENBQUMsd0NBQXdDLENBQUM7VUFDbkZDLGNBQWMsRUFBRXBCLGVBQWUsS0FBSyxJQUFJLENBQUM7UUFDMUM7TUFDRCxDQUFDLENBQUM7TUFDRmhCLFNBQVMsQ0FBQ3FDLDBCQUEwQixDQUFDO1FBQUVDLGVBQWUsRUFBRTFCO01BQWlCLENBQUMsQ0FBQztNQUMzRSxNQUFNMkIsTUFBTSxHQUFHLE1BQU12QyxTQUFTLENBQUN3QyxPQUFPLENBQUMsQ0FBQztNQUN4QyxJQUFJRCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUNFLE1BQU0sS0FBSyxVQUFVLEVBQUU7UUFDcEMsTUFBTUMsYUFBYSxHQUFHLElBQUlDLEtBQUssQ0FBQ0osTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDSyxNQUFNLENBQWdDO1FBQ2hGO1FBQ0FGLGFBQWEsQ0FBQ0QsTUFBTSxHQUFHRixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUNLLE1BQU0sQ0FBQ0gsTUFBTTtRQUM5QyxNQUFNQyxhQUFhO01BQ3BCLENBQUMsTUFBTTtRQUNOLE9BQU9ILE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQ00sS0FBSyxDQUFDQyxlQUFlO01BQ3ZDO0lBQ0QsQ0FBQyxNQUFNO01BQ04sTUFBTSxJQUFJSCxLQUFLLENBQUMsMkJBQTJCLENBQUM7SUFDN0M7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZUksc0JBQXNCQSxDQUNwQ2hELE9BQWdCLEVBQ2hCaUQsWUFBMEIsRUFDMUJqQixVQUFtQixFQUMrQjtJQUNsRCxJQUFJa0IsV0FBVyxDQUFDQyxlQUFlLENBQUNuRCxPQUFPLENBQUNaLFFBQVEsQ0FBQyxDQUFDLENBQUNFLFlBQVksQ0FBQyxDQUFDLEVBQUVVLE9BQU8sQ0FBQ1AsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJMkQsS0FBSyxDQUFDekMsZ0JBQWdCLENBQUNYLE9BQU8sQ0FBQyxFQUFFO01BQ3pILElBQUk7UUFDSCxJQUFJLENBQUNnQyxVQUFVLElBQUksQ0FBQ2hDLE9BQU8sQ0FBQ3FELFdBQVcsQ0FBQyxDQUFDLEVBQUU7VUFDMUM7VUFDQTtVQUNBO1VBQ0EsTUFBT3JELE9BQU8sQ0FBQ21DLFVBQVUsQ0FBQyxDQUFDLENBQXlCbUIsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN0RTtRQUNBLE1BQU1yRCxTQUFTLEdBQUdtRCxLQUFLLENBQUNHLDZCQUE2QixDQUFDdkQsT0FBTyxFQUFFQSxPQUFPLENBQUN3RCxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFeEIsVUFBVSxDQUFDO1FBQzVHLElBQUksQ0FBQ3RCLGFBQWEsQ0FBQ1YsT0FBTyxFQUFFckIsZUFBZSxDQUFDSSxPQUFPLENBQUMsRUFBRTtVQUNyRDBFLGVBQWUsQ0FBQ3pELE9BQU8sRUFBRWlELFlBQVksQ0FBQ1MscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1FBQy9EO1FBRUEsT0FBTyxNQUFNekQsU0FBUztNQUN2QixDQUFDLENBQUMsT0FBTzBELEtBQWMsRUFBRTtRQUN4QkMsR0FBRyxDQUFDRCxLQUFLLENBQUMsaUNBQWlDLEVBQUVBLEtBQWUsQ0FBQztNQUM5RDtJQUNEO0lBRUEsT0FBT0UsU0FBUztFQUNqQjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWVDLDRCQUE0QkEsQ0FDMUM3RSxRQUFpQixFQUNqQjhFLGFBQTJCLEVBQzNCL0MsY0FBOEIsRUFDOUJnRCxRQUFpQixFQUNqQkMsZUFBcUQsRUFDckRDLGFBQTZCLEVBQzdCQyxjQUFvQyxFQUNqQjtJQUNuQixNQUFNQyxpQkFBaUIsR0FBR2hCLEtBQUssQ0FBQ3pDLGdCQUFnQixDQUFDMUIsUUFBUSxDQUFDO0lBQzFEO0lBQ0E7SUFDQSxNQUFNb0YsV0FBVyxHQUFHRCxpQkFBaUI7SUFDckMsSUFBSW5FLFNBQWdDO0lBQ3BDLElBQUksQ0FBQ2hCLFFBQVEsQ0FBQ3FGLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO01BQzVDLE1BQU1wRCxlQUFlLEdBQUduQixrQkFBa0IsQ0FBQ2QsUUFBUSxFQUFFTixlQUFlLENBQUNFLFVBQVUsQ0FBQztNQUNoRixNQUFNMEMsS0FBSyxHQUFHNEMsY0FBYyxHQUFHRCxhQUFhLEVBQUV6QyxPQUFPLENBQUMsdUJBQXVCLENBQUMsR0FBR3lDLGFBQWEsRUFBRXpDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztNQUNoSSxJQUFJUCxlQUFlLEVBQUU7UUFDcEIsSUFBSTtVQUNIakIsU0FBUyxHQUFHLElBQUlrQixTQUFTLENBQUM0QyxhQUFhLEVBQUU5RSxRQUFRLENBQUNHLFFBQVEsQ0FBQyxDQUFDLEVBQUU4QixlQUFlLEVBQUU7WUFDOUVGLGNBQWMsRUFBRUEsY0FBYztZQUM5Qk0sUUFBUSxFQUFFLENBQUNyQyxRQUFRLENBQUM7WUFDcEJzQyxLQUFLLEVBQUVBLEtBQUs7WUFDWkcsaUJBQWlCLEVBQUU7Y0FBRUMscUJBQXFCLEVBQUU7WUFBSyxDQUFDO1lBQ2xERSxZQUFZLEVBQUUsSUFBSTtZQUNsQkMsZUFBZSxFQUFFO2NBQ2hCQyxrQkFBa0IsRUFBRSxJQUFJO2NBQ3hCaEIsT0FBTyxFQUFFaUQsUUFBUTtjQUNqQmhDLFVBQVUsRUFBRXFDLFdBQVc7Y0FDdkJuQyxjQUFjLEVBQUVqRCxRQUFRLENBQUNrRCxVQUFVLENBQUMsQ0FBQyxDQUFDQyxHQUFHLENBQUMsd0NBQXdDO1lBQ25GO1VBQ0QsQ0FBQyxDQUFDO1VBQ0YsTUFBTUksTUFBTSxHQUFHLE1BQU12QyxTQUFTLENBQUN3QyxPQUFPLENBQUMsQ0FBQztVQUN4QyxJQUFJRCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUNFLE1BQU0sS0FBSyxVQUFVLEVBQUU7WUFDcEMsTUFBTSxJQUFJRSxLQUFLLENBQUNKLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQ0ssTUFBTSxDQUFDO1VBQ2xDLENBQUMsTUFBTSxJQUFJTCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUNNLEtBQUssQ0FBQ0MsZUFBZSxLQUFLYyxTQUFTLEVBQUU7WUFDekQsTUFBTSxJQUFJakIsS0FBSyxDQUFDLG1DQUFtQyxDQUFDO1VBQ3JEO1VBQ0EsT0FBT0osTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDTSxLQUFLLENBQUNDLGVBQWU7UUFDdkMsQ0FBQyxDQUFDLE9BQU93QixDQUFDLEVBQUU7VUFDWCxJQUFJSCxpQkFBaUIsRUFBRTtZQUN0QjtZQUNBLE1BQU1JLGdCQUFnQixHQUFHLE1BQU1QLGVBQWU7WUFDOUNPLGdCQUFnQixFQUFFQyxPQUFPLENBQUMsQ0FBQztZQUMzQnhFLFNBQVMsRUFBRXlFLEtBQUssQ0FBQyxDQUFDO1lBRWxCLE1BQU1DLFVBQVUsR0FBRzNGLGFBQWEsQ0FBQ0MsUUFBUSxFQUFFTixlQUFlLENBQUNJLE9BQU8sQ0FBQztjQUNsRTZGLG1CQUFtQixHQUFHYixhQUFhLENBQUNMLHFCQUFxQixDQUFDLENBQUM7Y0FDM0RtQixrQkFBa0IsR0FBR0QsbUJBQW1CLENBQUNFLHlCQUF5QixDQUFDSCxVQUFVLEVBQUUxRixRQUFRLENBQUM7Y0FDeEY4RixZQUFZLEdBQUdGLGtCQUFrQixJQUFJQSxrQkFBa0IsQ0FBQ0csZUFBZTtZQUN4RSxJQUFJRCxZQUFZLElBQUlBLFlBQVksQ0FBQ0UsTUFBTSxHQUFHLENBQUMsRUFBRTtjQUM1QyxJQUFJO2dCQUNILE1BQU1MLG1CQUFtQixDQUFDTSxrQkFBa0IsQ0FBQ0gsWUFBWSxFQUFFOUYsUUFBUSxDQUFDO2NBQ3JFLENBQUMsQ0FBQyxPQUFPa0csTUFBZSxFQUFFO2dCQUN6QnZCLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLHFDQUFxQyxFQUFFd0IsTUFBZ0IsQ0FBQztjQUNuRTtZQUNELENBQUMsTUFBTTtjQUNOLElBQUk7Z0JBQ0gsTUFBTTFCLGVBQWUsQ0FBQ3hFLFFBQVEsRUFBRTJGLG1CQUFtQixFQUFFLElBQUksQ0FBQztjQUMzRCxDQUFDLENBQUMsT0FBT08sTUFBZSxFQUFFO2dCQUN6QnZCLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLGlDQUFpQyxFQUFFd0IsTUFBZ0IsQ0FBQztjQUMvRDtZQUNEO1VBQ0Q7VUFDQSxNQUFNWixDQUFDO1FBQ1I7TUFDRCxDQUFDLE1BQU07UUFDTixNQUFNLElBQUkzQixLQUFLLENBQUMsaUNBQWlDLENBQUM7TUFDbkQ7SUFDRCxDQUFDLE1BQU07TUFDTixNQUFNLElBQUlBLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQztJQUNsRjtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTd0Msd0JBQXdCQSxDQUFDcEYsT0FBZ0IsRUFBc0I7SUFDdkU7SUFDQTtJQUNBLE9BQU9VLGFBQWEsQ0FBQ1YsT0FBTyxFQUFFckIsZUFBZSxDQUFDSSxPQUFPLENBQUMsR0FBR3NHLHdCQUF3QixDQUFDckYsT0FBTyxDQUFDLEdBQUc2RCxTQUFTO0VBQ3ZHOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTd0Isd0JBQXdCQSxDQUFDckYsT0FBZ0IsRUFBc0I7SUFDdkUsTUFBTXNGLFdBQVcsR0FBR3RGLE9BQU8sQ0FBQ1osUUFBUSxDQUFDLENBQUMsQ0FBQ0UsWUFBWSxDQUFDLENBQUMsQ0FBQ2lHLGNBQWMsQ0FBQ3ZGLE9BQU8sQ0FBQ1AsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN2RixNQUFNK0YsZ0JBQWdCLEdBQUdDLDJCQUEyQixDQUFDSCxXQUFXLENBQUM7SUFDakUsTUFBTUksUUFBUSxHQUFHRixnQkFBZ0IsQ0FBQ0csZ0JBQWdCLENBQUNDLFdBQVcsQ0FBQ0MsTUFBTSxFQUFFQyxRQUFRO0lBQy9FLE9BQU9DLDBCQUEwQixDQUFDTCxRQUFRLENBQUMsR0FBR0EsUUFBUSxDQUFDTSxJQUFJLEdBQUduQyxTQUFTO0VBQ3hFOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxlQUFlTiw2QkFBNkJBLENBQzNDdEUsUUFBaUIsRUFDakI4QixPQUFnQixFQUNoQmtGLFNBQW1CLEVBQ25CakUsVUFBb0IsRUFDa0I7SUFDdEMsSUFBSSxDQUFDL0MsUUFBUSxDQUFDcUYsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7TUFDNUMsTUFBTTRCLGFBQWEsR0FBR0QsU0FBUyxHQUFHYix3QkFBd0IsQ0FBQ25HLFFBQVEsQ0FBQyxHQUFHNEUsU0FBUztNQUNoRixNQUFNc0MsVUFBVSxHQUFHeEcsZUFBZSxDQUFDVixRQUFRLEVBQUVOLGVBQWUsQ0FBQ0ksT0FBTyxFQUFFbUgsYUFBYSxHQUFHO1FBQUVFLE9BQU8sRUFBRUY7TUFBYyxDQUFDLEdBQUdyQyxTQUFTLENBQUM7O01BRTdIO01BQ0FzQyxVQUFVLENBQUNFLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLENBQUM7TUFFbkQsTUFBTXJDLFFBQVEsR0FBR2pELE9BQU8sSUFBSW9GLFVBQVUsQ0FBQ0csVUFBVSxDQUFDLENBQUM7TUFDbkQsT0FBT0gsVUFBVSxDQUNmSSxNQUFNLENBQUN2QyxRQUFRLEVBQUVoQyxVQUFVLENBQUMsQ0FDNUJ3RSxJQUFJLENBQUMsWUFBWTtRQUNqQixPQUFPTCxVQUFVO01BQ2xCLENBQUMsQ0FBQyxDQUNETSxLQUFLLENBQUMsVUFBVXRCLE1BQWUsRUFBRTtRQUNqQ3ZCLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLHFDQUFxQyxFQUFFd0IsTUFBZ0IsQ0FBQztRQUNsRSxPQUFPZ0IsVUFBVTtNQUNsQixDQUFDLENBQUM7SUFDSixDQUFDLE1BQU07TUFDTixNQUFNLElBQUl2RCxLQUFLLENBQUMsaUVBQWlFLENBQUM7SUFDbkY7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWVhLGVBQWVBLENBQzdCeEUsUUFBaUIsRUFDakIyRixtQkFBdUMsRUFFdkI7SUFBQSxJQURoQjhCLHdCQUF3QixHQUFBQyxTQUFBLENBQUExQixNQUFBLFFBQUEwQixTQUFBLFFBQUE5QyxTQUFBLEdBQUE4QyxTQUFBLE1BQUcsS0FBSztJQUVoQyxNQUFNVCxhQUFhLEdBQUdoRCxXQUFXLENBQUNDLGVBQWUsQ0FBQ2xFLFFBQVEsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQ0UsWUFBWSxDQUFDLENBQUMsRUFBRUwsUUFBUSxDQUFDUSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3pHLElBQUl5RyxhQUFhLEVBQUU7TUFDbEIsTUFBTXRCLG1CQUFtQixDQUFDTSxrQkFBa0IsQ0FBQyxDQUFDZ0IsYUFBYSxDQUFDLEVBQUVqSCxRQUFRLENBQUM7TUFDdkUsSUFBSXlILHdCQUF3QixFQUFFO1FBQzdCLE1BQU1FLElBQUksR0FBRyxNQUFNM0gsUUFBUSxDQUFDcUUsYUFBYSxDQUFDLENBQUM7UUFDM0MsSUFBSXNELElBQUksQ0FBQ1YsYUFBYSxDQUFDLENBQUNqQixNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQ25DO1VBQ0E0QixlQUFlLENBQUNDLCtCQUErQixDQUFDLENBQUM7VUFDakRELGVBQWUsQ0FBQ0UsNkJBQTZCLENBQUMsQ0FBQztRQUNoRDtNQUNEO0lBQ0Q7SUFDQTtFQUNEO0VBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWVDLHlCQUF5QkEsQ0FDdkMvSCxRQUFpQixFQUNqQitCLGNBQThCLEVBQzlCK0MsYUFBMkIsRUFDM0JrRCxxQkFBK0IsRUFDZjtJQUNoQixJQUFJLENBQUNoSSxRQUFRLENBQUNxRixXQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtNQUM1QyxNQUFNcEQsZUFBZSxHQUFHbkIsa0JBQWtCLENBQUNkLFFBQVEsRUFBRU4sZUFBZSxDQUFDRyxPQUFPLENBQUM7TUFDN0UsSUFBSW9DLGVBQWUsRUFBRTtRQUNwQixNQUFNc0IsTUFBTSxHQUFHLE1BQU0sSUFBSXJCLFNBQVMsQ0FBQzRDLGFBQWEsRUFBRTlFLFFBQVEsQ0FBQ0csUUFBUSxDQUFDLENBQUMsRUFBRThCLGVBQWUsRUFBRTtVQUN2RkYsY0FBYyxFQUFFQSxjQUFjO1VBQzlCTyxLQUFLLEVBQUVDLGdCQUFnQixDQUFDdUMsYUFBYSxDQUFDLEVBQUV0QyxPQUFPLENBQUMsMkNBQTJDLENBQUMsSUFBSSxFQUFFO1VBQ2xHSCxRQUFRLEVBQUUsQ0FBQ3JDLFFBQVEsQ0FBQztVQUNwQjRDLFlBQVksRUFBRSxJQUFJO1VBQ2xCQyxlQUFlLEVBQUU7WUFDaEJDLGtCQUFrQixFQUFFLElBQUk7WUFDeEJtRixxQkFBcUIsRUFBRSxDQUFDRCxxQkFBcUI7WUFDN0NqRixVQUFVLEVBQUVDLGFBQWEsQ0FBQ2hELFFBQVEsQ0FBQ1MsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUFFO1lBQ2pEcUIsT0FBTyxFQUFFLFFBQVE7WUFDakJtQixjQUFjLEVBQUUyQixTQUFTO1lBQ3pCeEIsY0FBYyxFQUFFO1VBQ2pCO1FBQ0QsQ0FBQyxDQUFDLENBQUNJLE9BQU8sQ0FBQyxDQUFDO1FBQ1osSUFBSUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDRSxNQUFNLEtBQUssVUFBVSxFQUFFO1VBQ3BDLE1BQU0sSUFBSUUsS0FBSyxDQUFDSixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUNLLE1BQU0sQ0FBQztRQUNsQztNQUNELENBQUMsTUFBTTtRQUNOLE1BQU0sSUFBSUQsS0FBSyxDQUFDLDhCQUE4QixDQUFDO01BQ2hEO0lBQ0QsQ0FBQyxNQUFNO01BQ04sTUFBTSxJQUFJQSxLQUFLLENBQUMsNkRBQTZELENBQUM7SUFDL0U7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZXVFLHlCQUF5QkEsQ0FDdkNDLGtCQUEyQixFQUMzQkMsdUJBQWdDLEVBQ2hDQyxlQUFpQyxFQUNqQ3ZHLE9BQWdCLEVBQ2hCVyxpQkFBMEIsRUFFZ0I7SUFBQSxJQUQxQzZGLHNCQUFzQixHQUFBWixTQUFBLENBQUExQixNQUFBLFFBQUEwQixTQUFBLFFBQUE5QyxTQUFBLEdBQUE4QyxTQUFBLE1BQUcsS0FBSztJQUU5QixJQUFJLENBQUNVLHVCQUF1QixDQUFDNUgsT0FBTyxDQUFDLENBQUMsQ0FBQytILFVBQVUsQ0FBQ0osa0JBQWtCLENBQUMzSCxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7TUFDaEY7TUFDQW1FLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLDBDQUEwQyxDQUFDO01BQ3JELE1BQU0sSUFBSWYsS0FBSyxDQUFDLDBDQUEwQyxDQUFDO0lBQzVEO0lBRUEsSUFDQ3lFLHVCQUF1QixDQUFDL0MsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEtBQUssS0FBSyxJQUMvRCtDLHVCQUF1QixDQUFDL0MsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssS0FBSyxFQUMvRDtNQUNEO01BQ0E7TUFDQSxPQUFPVCxTQUFTO0lBQ2pCO0lBRUEsTUFBTTRELEtBQUssR0FBR0wsa0JBQWtCLENBQUNoSSxRQUFRLENBQUMsQ0FBQztJQUMzQyxJQUFJO01BQ0g7TUFDQTtNQUNBO01BQ0E7O01BRUE7TUFDQSxNQUFNc0ksY0FBYyxHQUFHTCx1QkFBdUIsQ0FBQzVILE9BQU8sQ0FBQyxDQUFDLENBQUNrSSxPQUFPLENBQUNQLGtCQUFrQixDQUFDM0gsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7TUFDbEcsTUFBTW1JLFFBQVEsR0FBR0YsY0FBYyxHQUFHQSxjQUFjLENBQUNHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7TUFDN0U7TUFDQUYsUUFBUSxDQUFDRyxPQUFPLENBQUNYLGtCQUFrQixDQUFDM0gsT0FBTyxDQUFDLENBQUMsQ0FBQ29JLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7TUFFM0Q7TUFDQTtNQUNBO01BQ0E7TUFDQSxNQUFNRyxRQUFrQixHQUFHLEVBQUU7TUFDN0IsTUFBTUMsUUFBa0IsR0FBRyxFQUFFO01BQzdCLElBQUlDLFdBQVcsR0FBRyxFQUFFOztNQUVwQjtNQUNBO01BQ0EsTUFBTUMsS0FBSyxHQUFHLENBQUMsR0FBR1AsUUFBUSxDQUFDO01BQzNCLElBQUlOLGVBQWUsRUFBRWMsc0JBQXNCLEVBQUU7UUFDNUNELEtBQUssQ0FBQ0UsS0FBSyxDQUFDLENBQUM7UUFDYkgsV0FBVyxHQUFHLEdBQUcsR0FBR2Qsa0JBQWtCLEVBQUUzSCxPQUFPLENBQUMsQ0FBQyxFQUFFb0ksU0FBUyxDQUFDLENBQUMsQ0FBQztNQUNoRTtNQUNBLE1BQU1TLHFCQUFxQixHQUFHSCxLQUFLLENBQUNJLEdBQUcsQ0FBQyxNQUFPQyxPQUFPLElBQUs7UUFDMUROLFdBQVcsSUFBSSxJQUFJTSxPQUFPLEVBQUU7UUFDNUJSLFFBQVEsQ0FBQ0QsT0FBTyxDQUFDRyxXQUFXLENBQUM7UUFDN0IsSUFBSUEsV0FBVyxDQUFDTyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7VUFDOUIsTUFBTUMsY0FBYyxHQUFHakIsS0FBSyxDQUMxQjNILFdBQVcsQ0FBQyxHQUFHb0ksV0FBVyxnQkFBZ0IsRUFBRXJFLFNBQVMsRUFBRTlDLE9BQU8sR0FBRztZQUFFNEgsU0FBUyxFQUFFNUg7VUFBUSxDQUFDLEdBQUc4QyxTQUFTLENBQUMsQ0FDcEcrRSxlQUFlLENBQUMsQ0FBQztVQUNuQixPQUFPRixjQUFjLENBQUNHLG9CQUFvQixDQUFDLENBQUM7UUFDN0MsQ0FBQyxNQUFNO1VBQ04sT0FBT0MsT0FBTyxDQUFDQyxPQUFPLENBQUNsRixTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3BDO01BQ0QsQ0FBQyxDQUFDOztNQUVGO01BQ0E7TUFDQTtNQUNBO01BQ0EsTUFBTW1GLGNBQWMsR0FBSSxNQUFNRixPQUFPLENBQUNHLEdBQUcsQ0FBQ1gscUJBQXFCLENBQWM7O01BRTdFO01BQ0EsSUFDQ1UsY0FBYyxDQUFDRSxJQUFJLENBQUVsRCxJQUFJLElBQUs7UUFDN0IsT0FBT0EsSUFBSSxJQUFJQSxJQUFJLENBQUN5QyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7TUFDL0MsQ0FBQyxDQUFDLEVBQ0Q7UUFDRDtRQUNBLE9BQU81RSxTQUFTO01BQ2pCO01BRUEsSUFBSXlELGVBQWUsRUFBRWMsc0JBQXNCLEVBQUU7UUFDNUMsTUFBTWUsZUFBZSxHQUFHLENBQUMsTUFBTTdCLGVBQWUsQ0FBQ2Msc0JBQXNCLEdBQUczSSxPQUFPLENBQUMsQ0FBVztRQUMzRnVKLGNBQWMsQ0FBQ2pCLE9BQU8sQ0FBQ29CLGVBQWUsQ0FBQztRQUN2Q25CLFFBQVEsQ0FBQ29CLElBQUksQ0FBQ2hDLGtCQUFrQixDQUFDM0gsT0FBTyxDQUFDLENBQUMsQ0FBQztNQUM1QztNQUNBLElBQUk0SixXQUFXLEdBQUcsRUFBRTtNQUNwQkwsY0FBYyxDQUFDTSxPQUFPLENBQUMsQ0FBQ0MsYUFBYSxFQUFFQyxLQUFLLEtBQUs7UUFDaEQsSUFBSUEsS0FBSyxLQUFLLENBQUMsRUFBRTtVQUNoQixJQUFJNUIsUUFBUSxDQUFDNEIsS0FBSyxDQUFDLENBQUNmLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNsQyxNQUFNZ0IsVUFBVSxHQUFHN0IsUUFBUSxDQUFDNEIsS0FBSyxDQUFDLENBQUM3QixPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekQsTUFBTStCLElBQUksR0FBR0gsYUFBYSxDQUFDNUIsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pEMEIsV0FBVyxJQUFJLElBQUlJLFVBQVUsR0FBR0MsSUFBSSxFQUFFO1VBQ3ZDLENBQUMsTUFBTTtZQUNOTCxXQUFXLElBQUksSUFBSXpCLFFBQVEsQ0FBQzRCLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztVQUN2QztRQUNELENBQUMsTUFBTTtVQUNOSCxXQUFXLEdBQUdFLGFBQWEsQ0FBQyxDQUFDO1FBQzlCO1FBQ0F0QixRQUFRLENBQUNGLE9BQU8sQ0FBQ3NCLFdBQVcsQ0FBQztNQUM5QixDQUFDLENBQUM7TUFFRixJQUFJTSxVQUFvRDtNQUN4RCxNQUFNQyxXQUFXLEdBQUd2RSx3QkFBd0IsQ0FBQ2dDLHVCQUF1QixDQUFDO01BQ3JFLElBQUlFLHNCQUFzQixFQUFFO1FBQzNCb0MsVUFBVSxHQUFHO1VBQUVoQixTQUFTLEVBQUU7UUFBZ0IsQ0FBQyxDQUFDLENBQUM7TUFDOUMsQ0FBQyxNQUFNO1FBQ05nQixVQUFVLEdBQUdqSSxpQkFBaUIsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSWtJLFdBQVcsRUFBRTtVQUNoQixJQUFJRCxVQUFVLENBQUN2RCxPQUFPLEVBQUU7WUFDdkJ1RCxVQUFVLENBQUN2RCxPQUFPLElBQUksSUFBSXdELFdBQVcsRUFBRTtVQUN4QyxDQUFDLE1BQU07WUFDTkQsVUFBVSxDQUFDdkQsT0FBTyxHQUFHd0QsV0FBVztVQUNqQztRQUNEO1FBQ0FELFVBQVUsQ0FBQ2hCLFNBQVMsR0FBRyxjQUFjO01BQ3RDO01BRUEsT0FBTztRQUNOa0IsYUFBYSxFQUFFdEMsc0JBQXNCLEdBQ2xDRSxLQUFLLENBQUNxQyxtQkFBbUIsQ0FBQ1QsV0FBVyxFQUFFLENBQUMsQ0FBQ08sV0FBVyxFQUFFRCxVQUFVLENBQUMsR0FDakVsQyxLQUFLLENBQUMzSCxXQUFXLENBQUN1SixXQUFXLEVBQUV4RixTQUFTLEVBQUU4RixVQUFVLENBQUMsQ0FBQ2YsZUFBZSxDQUFDLENBQUM7UUFBRTtRQUM1RW1CLFdBQVcsRUFBRS9CLFFBQVEsQ0FBQ08sR0FBRyxDQUFDLENBQUN5QixPQUFPLEVBQUVSLEtBQUssS0FBSztVQUM3QyxPQUFPO1lBQ05RLE9BQU87WUFDUEMsT0FBTyxFQUFFaEMsUUFBUSxDQUFDdUIsS0FBSztVQUN4QixDQUFDO1FBQ0YsQ0FBQztNQUNGLENBQUM7SUFDRixDQUFDLENBQUMsT0FBTzdGLEtBQUssRUFBRTtNQUNmO01BQ0EsT0FBT0UsU0FBUztJQUNqQjtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLGVBQWVxRyw2QkFBNkJBLENBQzNDakwsUUFBaUIsRUFDakI4RSxhQUEyQixFQUMzQm9HLFdBR0MsRUFDRHBKLE9BQWUsRUFDZkMsY0FBOEIsRUFDOUJvSixrQkFFQyxFQUM4QjtJQUMvQixNQUFNQyxNQUFNLEdBQUdGLFdBQVcsSUFBSSxDQUFDLENBQUM7TUFDL0JHLHVCQUF1QixHQUN0QixPQUFPRCxNQUFNLENBQUN4SixnQkFBZ0IsS0FBSyxXQUFXLElBQUssT0FBT3dKLE1BQU0sQ0FBQ3hKLGdCQUFnQixLQUFLLFNBQVMsSUFBSXdKLE1BQU0sQ0FBQ3hKLGdCQUFpQixDQUFDLENBQUM7O0lBRS9IO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7SUFDQyxlQUFlSSxlQUFlQSxDQUFDc0osUUFBb0MsRUFBbUQ7TUFDckg7TUFDQSxNQUFNcEwsTUFBTSxHQUFHRixRQUFRLENBQUNHLFFBQVEsQ0FBQyxDQUFDO01BQ2xDLE1BQU1vTCxnQkFBZ0IsR0FBR3JMLE1BQU0sQ0FBQ1csV0FBVyxDQUFDLEdBQUdiLFFBQVEsQ0FBQ1EsT0FBTyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQ21KLGVBQWUsQ0FBQyxDQUFDO01BQzlHLE1BQU0xRSxhQUFhLEdBQUcxQyxnQkFBZ0IsQ0FBQzJJLFdBQVcsQ0FBQ3JKLEtBQUssQ0FBQztNQUN6RCxNQUFNMkosY0FBYyxHQUFHLE1BQU1ELGdCQUFnQixDQUFDbEgsYUFBYSxDQUFDLENBQUM7TUFDN0QsSUFBSW1ILGNBQWMsRUFBRTtRQUNuQjtRQUNBNUQsZUFBZSxDQUFDQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ2pELElBQUk0RCxLQUFLLEdBQUdELGNBQWMsQ0FBQ0UsMEJBQTBCLElBQUlGLGNBQWMsQ0FBQ0csZUFBZTtRQUN2RixNQUFNQyxVQUFVLEdBQUdWLFdBQVcsQ0FBQ3JKLEtBQUssQ0FBQ2dLLFdBQVcsQ0FBQyxDQUFDLENBQUNDLFNBQVM7UUFDNUQsSUFBSUwsS0FBSyxFQUFFO1VBQ1YsTUFBTU0sZ0JBQWdCLEdBQUc5RyxhQUFhLENBQUN6QyxPQUFPLENBQUMsMENBQTBDLEVBQUVpSixLQUFLLEVBQUVHLFVBQVUsQ0FBQztVQUM3R0ksVUFBVSxDQUFDdEgsS0FBSyxDQUFDcUgsZ0JBQWdCLENBQUM7VUFDbEMsTUFBTSxJQUFJcEksS0FBSyxDQUFDb0ksZ0JBQWdCLENBQUM7UUFDbEMsQ0FBQyxNQUFNO1VBQ05OLEtBQUssR0FBR0QsY0FBYyxDQUFDUyx3QkFBd0IsSUFBSVQsY0FBYyxDQUFDVSxhQUFhO1VBQy9FLE1BQU1DLGtCQUFrQixHQUFHbEgsYUFBYSxDQUFDekMsT0FBTyxDQUFDLDJDQUEyQyxFQUFFaUosS0FBSyxFQUFFRyxVQUFVLENBQUM7VUFDaEgsTUFBTXpILEtBQUssQ0FBQ2lJLDhCQUE4QixDQUFDRCxrQkFBa0IsRUFBRW5NLFFBQVEsQ0FBQztVQUN4RSxPQUFPbUUsS0FBSyxDQUFDeEMsc0JBQXNCLENBQUMzQixRQUFRLEVBQUUsS0FBSyxFQUFFa0wsV0FBVyxDQUFDckosS0FBSyxFQUFFQyxPQUFPLEVBQUVDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3pHO01BQ0QsQ0FBQyxNQUFNLElBQUt1SixRQUFRLEVBQXVCZSxPQUFPLEVBQUU7UUFDbkRMLFVBQVUsQ0FBQ3RILEtBQUssQ0FBRTRHLFFBQVEsQ0FBc0JlLE9BQU8sQ0FBQztNQUN6RDtNQUNBLE1BQU0sSUFBSTFJLEtBQUssQ0FBQyx3Q0FBd0MzRCxRQUFRLENBQUNRLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM5RTtJQUVBLElBQUksQ0FBQ1IsUUFBUSxFQUFFO01BQ2QsTUFBTSxJQUFJMkQsS0FBSyxDQUFDLGdEQUFnRCxDQUFDO0lBQ2xFO0lBQ0EsSUFBSTJJLGFBQXFEO0lBQ3pELElBQUk7TUFDSEEsYUFBYSxHQUFHLE1BQU1uSSxLQUFLLENBQUN4QyxzQkFBc0IsQ0FBQzNCLFFBQVEsRUFBRXFMLHVCQUF1QixFQUFFSCxXQUFXLENBQUNySixLQUFLLEVBQUVDLE9BQU8sRUFBRUMsY0FBYyxDQUFDO0lBQ2xJLENBQUMsQ0FBQyxPQUFPd0ssU0FBUyxFQUFFO01BQ25CLElBQUtBLFNBQVMsQ0FBc0I5SSxNQUFNLEtBQUssR0FBRyxJQUFLOEksU0FBUyxDQUFzQjlJLE1BQU0sS0FBSyxHQUFHLEVBQUU7UUFDckdtRSxlQUFlLENBQUNFLDZCQUE2QixDQUFDLENBQUM7UUFDL0NGLGVBQWUsQ0FBQ0MsK0JBQStCLENBQUMsQ0FBQztRQUNqRCxNQUFNcEYsaUJBQWlCLEdBQUd3QixXQUFXLENBQUN1SSw2QkFBNkIsQ0FBQ3hNLFFBQVEsQ0FBQ0csUUFBUSxDQUFDLENBQUMsQ0FBQ0UsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUNwRztVQUFFOEcsT0FBTyxFQUFFO1FBQWtELENBQUMsR0FDOUR2QyxTQUFTO1FBQ1osTUFBTTZILFdBQVcsR0FBRyxNQUFNdEksS0FBSyxDQUFDK0QseUJBQXlCLENBQ3hEbEksUUFBUSxFQUNSQSxRQUFRLEVBQ1I0RSxTQUFTLEVBQ1RBLFNBQVMsRUFDVG5DLGlCQUFpQixFQUNqQnFDLGFBQWEsQ0FBQzRILGFBQWEsQ0FBQyxDQUM3QixDQUFDO1FBQ0QsSUFBSUQsV0FBVyxFQUFFN0IsYUFBYSxFQUFFO1VBQy9CO1VBQ0EsTUFBTXpJLFdBQVcsQ0FBQ3dLLHVCQUF1QixDQUFDRixXQUFXLENBQUM3QixhQUFhLENBQUM7VUFDcEUsSUFBSU8sa0JBQWtCLEVBQUU7WUFDdkJBLGtCQUFrQixDQUFDeUIsbUJBQW1CLEdBQUcsSUFBSTtVQUM5QztVQUVBLE9BQU9ILFdBQVcsQ0FBQzdCLGFBQWE7UUFDakMsQ0FBQyxNQUFNO1VBQ047VUFDQTBCLGFBQWEsR0FBRyxNQUFNdEssZUFBZSxDQUFDdUssU0FBNkIsQ0FBQztRQUNyRTtNQUNELENBQUMsTUFBTSxJQUFJLEVBQUVBLFNBQVMsSUFBS0EsU0FBUyxDQUFzQk0sUUFBUSxDQUFDLEVBQUU7UUFDcEUsTUFBTSxJQUFJbEosS0FBSyxDQUFDNEksU0FBbUIsQ0FBQztNQUNyQztJQUNEO0lBRUEsSUFBSUQsYUFBYSxFQUFFO01BQ2xCLE1BQU1RLGVBQWUsR0FBRzNJLEtBQUssQ0FBQ3BFLGFBQWEsQ0FBQ3VNLGFBQWEsRUFBYTVNLGVBQWUsQ0FBQ0MsSUFBSSxDQUFDO01BQzNGLE1BQU1vTixZQUFZLEdBQUdqSSxhQUFhLENBQUNMLHFCQUFxQixDQUFDLENBQUMsQ0FBQ29CLHlCQUF5QixDQUFDaUgsZUFBZSxFQUFFUixhQUF3QixDQUFDO01BQy9ILElBQUlTLFlBQVksRUFBRUMsY0FBYyxFQUFFaEgsTUFBTSxFQUFFO1FBQ3pDLE1BQU1sQixhQUFhLENBQUNMLHFCQUFxQixDQUFDLENBQUMsQ0FBQ3dJLGdDQUFnQyxDQUFDRixZQUFZLEVBQUVULGFBQXdCLENBQUM7UUFDcEgsT0FBT0EsYUFBYTtNQUNyQixDQUFDLE1BQU07UUFDTixPQUFPQSxhQUFhO01BQ3JCO0lBQ0QsQ0FBQyxNQUFNO01BQ04sT0FBTzFILFNBQVM7SUFDakI7RUFDRDtFQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZXNJLGdCQUFnQkEsQ0FDOUJsTixRQUFpQixFQUNqQjhFLGFBQTJCLEVBQzNCL0MsY0FBOEIsRUFDOUJtSixXQUF1SCxFQUN2SGhHLGNBQW9DLEVBQ2pCO0lBQ25CLE1BQU1rRyxNQUFNLEdBQUdGLFdBQVcsSUFBSSxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDbEwsUUFBUSxFQUFFO01BQ2QsTUFBTSxJQUFJMkQsS0FBSyxDQUFDLCtDQUErQyxDQUFDO0lBQ2pFO0lBRUEsTUFBTXdKLFFBQVEsR0FBRy9CLE1BQU0sQ0FBQ2dDLHdCQUF3QixHQUFHLE1BQU1oQyxNQUFNLENBQUNnQyx3QkFBd0IsQ0FBQ3BOLFFBQVEsQ0FBQyxHQUFHLElBQUk7SUFDekcsSUFBSSxDQUFDbU4sUUFBUSxFQUFFO01BQ2QsTUFBTSxJQUFJeEosS0FBSyxDQUFDLHFFQUFxRTNELFFBQVEsQ0FBQ1EsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzNHO0lBRUEsSUFBSTZNLHNCQUErQjtJQUNuQyxJQUFJLENBQUNsSixLQUFLLENBQUN6QyxnQkFBZ0IsQ0FBQzFCLFFBQVEsQ0FBQyxFQUFFO01BQ3RDcU4sc0JBQXNCLEdBQUcsTUFBTXhJLDRCQUE0QixDQUMxRDdFLFFBQVEsRUFDUjhFLGFBQWEsRUFDYi9DLGNBQWMsRUFDZDZDLFNBQVMsRUFDVEEsU0FBUyxFQUNUc0csV0FBVyxDQUFDakcsYUFDYixDQUFDO0lBQ0YsQ0FBQyxNQUFNO01BQ047TUFDQSxNQUFNcUksV0FBVyxHQUFHLE9BQU87TUFDM0I7TUFDQTtNQUNBLE1BQU1DLFVBQW1CLEdBQUd2TixRQUFRLENBQUNHLFFBQVEsQ0FBQyxDQUFDLENBQUNxTixpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSztNQUN6RjtNQUNBLE1BQU14SSxlQUFlLEdBQUdiLEtBQUssQ0FBQ0csNkJBQTZCLENBQUN0RSxRQUFRLEVBQUVzTixXQUFXLEVBQUUxSSxTQUFTLEVBQUUySSxVQUFVLENBQUM7TUFDekd2TixRQUFRLENBQUNHLFFBQVEsQ0FBQyxDQUFDLENBQUNzTixXQUFXLENBQUNILFdBQVcsQ0FBQztNQUM1QyxNQUFNSSxnQkFBZ0IsR0FBR3ZKLEtBQUssQ0FBQ1UsNEJBQTRCLENBQzFEN0UsUUFBUSxFQUNSOEUsYUFBYSxFQUNiL0MsY0FBYyxFQUNkdUwsV0FBVyxFQUNYdEksZUFBZSxFQUNma0csV0FBVyxDQUFDakcsYUFBYSxFQUN6QkMsY0FDRCxDQUFDO01BRUQsTUFBTXlJLE1BQU0sR0FBRyxNQUFNOUQsT0FBTyxDQUFDRyxHQUFHLENBQUMsQ0FBQ2hGLGVBQWUsRUFBRTBJLGdCQUFnQixDQUFDLENBQUM7TUFDckVMLHNCQUFzQixHQUFHTSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25DO0lBQ0EsT0FBT3ZDLE1BQU0sQ0FBQ3dDLHVCQUF1QixHQUFHeEMsTUFBTSxDQUFDd0MsdUJBQXVCLENBQUM1TixRQUFRLEVBQUVxTixzQkFBc0IsQ0FBQyxHQUFHQSxzQkFBc0I7RUFDbEk7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZWpCLDhCQUE4QkEsQ0FBQ0Qsa0JBQTBCLEVBQUVuTSxRQUFpQixFQUFvQjtJQUM5RyxNQUFNNk4sWUFBWSxHQUFHQyxPQUFPLENBQUNDLG9CQUFvQixDQUFDLGFBQWEsQ0FBRTtJQUNqRSxPQUFPLElBQUlsRSxPQUFPLENBQUMsVUFBVUMsT0FBaUMsRUFBRWtFLE1BQWtDLEVBQUU7TUFDbkcsTUFBTUMsT0FBTyxHQUFHLElBQUlDLE1BQU0sQ0FBQztRQUMxQkMsS0FBSyxFQUFFTixZQUFZLENBQUNyTCxPQUFPLENBQUMsNERBQTRELENBQUM7UUFDekY0TCxLQUFLLEVBQUUsU0FBUztRQUNoQkMsT0FBTyxFQUFFLElBQUlDLElBQUksQ0FBQztVQUNqQkMsSUFBSSxFQUFFcEM7UUFDUCxDQUFDLENBQUM7UUFDRnFDLFdBQVcsRUFBRSxJQUFJQyxNQUFNLENBQUM7VUFDdkJGLElBQUksRUFBRVYsWUFBWSxDQUFDckwsT0FBTyxDQUFDLDJCQUEyQixDQUFDO1VBQ3ZEa00sSUFBSSxFQUFFLFlBQVk7VUFDbEJDLEtBQUssRUFBRSxTQUFBQSxDQUFBLEVBQWtCO1lBQ3hCVixPQUFPLENBQUNXLEtBQUssQ0FBQyxDQUFDO1lBQ2Y5RSxPQUFPLENBQUMsSUFBSSxDQUFDO1VBQ2Q7UUFDRCxDQUFDLENBQUM7UUFDRitFLFNBQVMsRUFBRSxJQUFJSixNQUFNLENBQUM7VUFDckJGLElBQUksRUFBRVYsWUFBWSxDQUFDckwsT0FBTyxDQUFDLDZCQUE2QixDQUFDO1VBQ3pEbU0sS0FBSyxFQUFFLFNBQUFBLENBQUEsRUFBa0I7WUFDeEJWLE9BQU8sQ0FBQ1csS0FBSyxDQUFDLENBQUM7WUFDZlosTUFBTSxDQUFDLHdDQUF3Q2hPLFFBQVEsQ0FBQ1EsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO1VBQ3JFO1FBQ0QsQ0FBQyxDQUFDO1FBQ0ZzTyxVQUFVLEVBQUUsU0FBQUEsQ0FBQSxFQUFrQjtVQUM3QmIsT0FBTyxDQUFDekksT0FBTyxDQUFDLENBQUM7UUFDbEI7TUFDRCxDQUFDLENBQUM7TUFDRnlJLE9BQU8sQ0FBQ2MsYUFBYSxDQUFDLHFCQUFxQixDQUFDO01BQzVDZCxPQUFPLENBQUNlLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0VBQ0g7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsZUFBZUMsV0FBV0EsQ0FDekJqUCxRQUFpQixFQUNqQitCLGNBQThCLEVBQzlCK0MsYUFBMkIsRUFDM0JrRCxxQkFBK0IsRUFDZjtJQUNoQixJQUFJaEksUUFBUSxDQUFDa1AsV0FBVyxDQUFDLENBQUMsRUFBRTtNQUMzQjtNQUNBLE9BQU9sUCxRQUFRLENBQUNtUCxNQUFNLENBQUMsQ0FBQztJQUN6QjtJQUNBLE1BQU1DLGNBQWMsR0FBR3JQLGFBQWEsQ0FBQ0MsUUFBUSxFQUFFTixlQUFlLENBQUNHLE9BQU8sQ0FBQztJQUN2RSxNQUFNd1AsZUFBZSxHQUFHclAsUUFBUSxDQUFDUyxTQUFTLENBQUMsQ0FBQyxDQUFDNk8sY0FBYztJQUUzRCxJQUFJRCxlQUFlLElBQUssQ0FBQ0EsZUFBZSxJQUFJLENBQUNELGNBQWUsRUFBRTtNQUM3RDtNQUNBLElBQUlwUCxRQUFRLENBQUN3TixpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQ3hOLFFBQVEsQ0FBQ3VQLFVBQVUsQ0FBQyxDQUFDLEVBQUU7UUFDM0QsTUFBTXZQLFFBQVEsQ0FBQ2tELFVBQVUsQ0FBQyxDQUFDLENBQUNzTSxZQUFZLENBQUMsQ0FBQztRQUMxQyxPQUFPeFAsUUFBUSxDQUFDbVAsTUFBTSxDQUFDLENBQUM7TUFDekIsQ0FBQyxNQUFNO1FBQ047UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxNQUFNTSxpQkFBaUIsR0FBR3pQLFFBQVEsQ0FBQ3VFLGdCQUFnQixDQUFDLENBQUMsS0FBS3BDLFdBQVcsQ0FBQ3VOLHdCQUF3QjtRQUM5RixNQUFNeE8sU0FBUyxHQUFHbEIsUUFBUSxDQUFDRyxRQUFRLENBQUMsQ0FBQyxDQUFDRSxZQUFZLENBQUMsQ0FBQztRQUNwRCxNQUFNc1AsZUFBZSxHQUFHbkosMkJBQTJCLENBQUN0RixTQUFTLENBQUNvRixjQUFjLENBQUN0RyxRQUFRLENBQUNRLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFbVAsZUFBZTtRQUNsSCxNQUFNQyxjQUFjLEdBQ25CLENBQUM5SyxhQUFhLENBQUM0SCxhQUFhLENBQUMsQ0FBQyxJQUM5QixDQUFDMU0sUUFBUSxDQUFDcUYsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQ3ZDcEIsV0FBVyxDQUFDNEwsV0FBVyxDQUFDRixlQUFlLENBQUMsSUFDeEMzUCxRQUFRLENBQUNxRixXQUFXLENBQUMsaUJBQWlCLENBQUM7UUFDeEMsSUFBSXVLLGNBQWMsRUFBRTtVQUNuQixPQUFPNVAsUUFBUSxDQUFDRyxRQUFRLENBQUMsQ0FBQyxDQUFDZ1AsTUFBTSxDQUFDblAsUUFBUSxDQUFDO1FBQzVDO1FBQ0EsSUFBSXlQLGlCQUFpQixFQUFFO1VBQ3RCLE9BQU96UCxRQUFRLENBQUNtUCxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ2hDO1FBQ0EsT0FBT25QLFFBQVEsQ0FBQ21QLE1BQU0sQ0FBQyxDQUFDO01BQ3pCO0lBQ0QsQ0FBQyxNQUFNO01BQ047TUFDQSxNQUFNcEgseUJBQXlCLENBQUMvSCxRQUFRLEVBQUUrQixjQUFjLEVBQUUrQyxhQUFhLEVBQUVrRCxxQkFBcUIsQ0FBQztJQUNoRztFQUNEO0VBRUEsTUFBTTdELEtBQUssR0FBRztJQUNiOEcsNkJBQTZCLEVBQUVBLDZCQUE2QjtJQUM1RGlDLGdCQUFnQixFQUFFQSxnQkFBZ0I7SUFDbEMrQixXQUFXLEVBQUVBLFdBQVc7SUFDeEJ0TixzQkFBc0IsRUFBRUEsc0JBQXNCO0lBQzlDb0Msc0JBQXNCLEVBQUVBLHNCQUFzQjtJQUM5Q08sNkJBQTZCLEVBQUVBLDZCQUE2QjtJQUM1RE8sNEJBQTRCLEVBQUVBLDRCQUE0QjtJQUMxRG5ELGdCQUFnQixFQUFFQSxnQkFBZ0I7SUFDbEN3Ryx5QkFBeUIsRUFBRUEseUJBQXlCO0lBQ3BENEgseUNBQXlDLEVBQUVDLGtCQUFrQixDQUFDRCx5Q0FBeUM7SUFDdkdFLG9DQUFvQyxFQUFFRCxrQkFBa0IsQ0FBQ0Msb0NBQW9DO0lBQzdGdFAsZUFBZSxFQUFFQSxlQUFlO0lBQ2hDcUgseUJBQXlCLEVBQUVBLHlCQUF5QjtJQUNwRGtJLGNBQWMsRUFBRUYsa0JBQWtCLENBQUNFLGNBQWM7SUFDakRsUSxhQUFhLEVBQUVBLGFBQWE7SUFDNUJxTSw4QkFBOEIsRUFBRUE7RUFDakMsQ0FBQztFQUFDLE9BRWFqSSxLQUFLO0FBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -863,14 +863,21 @@ async function deleteDraft(
863
863
  // occur, but needs quite specific modelling (button visibility on item level bound against service property in an FCL app)
864
864
  // and acting (looking at button on third column while discarding on 2nd column). Currently, model seems not to be prepared
865
865
  // for that case, thus due to the minimal impact (only intermediate visual state), accepting this for the time being.
866
- return !oAppComponent._isFclEnabled() &&
866
+ const isInlineEditGroup = oContext.getUpdateGroupId() === CommonUtils.INLINEEDIT_UPDATEGROUPID;
867
+ const metaModel = oContext.getModel().getMetaModel();
868
+ const targetEntitySet = getInvolvedDataModelObjects(metaModel.getMetaContext(oContext.getPath()))?.targetEntitySet;
869
+ const useModelDelete =
870
+ !oAppComponent._isFclEnabled() &&
867
871
  !oContext.getProperty("IsActiveEntity") &&
868
- ModelHelper.isDraftRoot(
869
- getInvolvedDataModelObjects(oContext.getModel().getMetaModel().getMetaContext(oContext.getPath()))?.targetEntitySet
870
- ) &&
871
- oContext.getProperty("HasActiveEntity")
872
- ? oContext.getModel().delete(oContext)
873
- : oContext.delete();
872
+ ModelHelper.isDraftRoot(targetEntitySet) &&
873
+ oContext.getProperty("HasActiveEntity");
874
+ if (useModelDelete) {
875
+ return oContext.getModel().delete(oContext);
876
+ }
877
+ if (isInlineEditGroup) {
878
+ return oContext.delete("$auto");
879
+ }
880
+ return oContext.delete();
874
881
  }
875
882
  } else {
876
883
  //Use Discard Post Action if it is a draft entity and discard action exists