@sapui5/sap.fe.templates 1.148.3 → 1.150.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/AnalyticalListPage/manifest.json +1 -1
  4. package/src/sap/fe/templates/ListComponent.js +2 -5
  5. package/src/sap/fe/templates/ListReport/Component.js +2 -5
  6. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +84 -14
  7. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +88 -13
  8. package/src/sap/fe/templates/ListReport/LRMessageStrip.js +41 -1
  9. package/src/sap/fe/templates/ListReport/LRMessageStrip.ts +43 -0
  10. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +87 -11
  11. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +74 -2
  12. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +4 -7
  13. package/src/sap/fe/templates/ListReport/manifest.json +1 -1
  14. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +12 -6
  15. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +14 -6
  16. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +7 -1
  17. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +5 -0
  18. package/src/sap/fe/templates/ListReport/view/fragments/Table.fragment.xml +1 -0
  19. package/src/sap/fe/templates/ListReport/view/fragments/VariantManagement.fragment.xml +1 -0
  20. package/src/sap/fe/templates/ObjectPage/Component.js +12 -15
  21. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +3 -7
  22. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +3 -2
  23. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +105 -83
  24. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +88 -80
  25. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +5 -18
  26. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +2 -15
  27. package/src/sap/fe/templates/ObjectPage/components/CollaborationDraft.js +28 -3
  28. package/src/sap/fe/templates/ObjectPage/components/CollaborationDraft.tsx +29 -1
  29. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +2 -5
  30. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +2 -5
  31. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +3 -6
  32. package/src/sap/fe/templates/ObjectPage/manifest.json +1 -1
  33. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +1 -0
  34. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContent.fragment.xml +0 -4
  35. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionFormContent.fragment.xml +0 -1
  36. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionMoreFormContent.fragment.xml +0 -1
  37. package/src/sap/fe/templates/ObjectPage/view/fragments/Table.fragment.xml +1 -0
  38. package/src/sap/fe/templates/library.js +1 -1
@@ -2,10 +2,10 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2026 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/PageController", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/MessageHandler", "sap/fe/core/controllerextensions/PageReady", "sap/fe/core/controllerextensions/Paginator", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/controllerextensions/cards/CollaborationManager", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/editFlowConstants", "sap/fe/core/controllerextensions/routing/NavigationReason", "sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog", "sap/fe/core/converters/ManifestSettings", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/fe/macros/CommonHelper", "sap/fe/macros/table/TableHelper", "sap/fe/macros/table/Utils", "sap/fe/navigation/SelectionVariant", "sap/fe/templates/ObjectPage/ExtensionAPI", "sap/fe/templates/ObjectPage/components/CollaborationDiscardDialog", "sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper", "sap/fe/templates/TableScroller", "sap/m/InstanceManager", "sap/ui/Device", "sap/ui/core/Element", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType", "sap/ui/core/mvc/OverrideExecution", "./overrides/CollaborationManager", "./overrides/IntentBasedNavigation", "./overrides/InternalRouting", "./overrides/MessageHandler", "./overrides/Paginator", "./overrides/Share", "./overrides/ViewState"], function (Log, merge, ClassSupport, ActionRuntime, CommonUtils, PageController, BusyLocker, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, MessageHandler, PageReady, Paginator, Placeholder, Share, ViewState, CollaborationManager, draft, UiModelConstants, NavigationReason, ConfirmRecommendationDialog, ManifestSettings, ModelHelper, FELibrary, CommonHelper, TableHelper, TableUtils, SelectionVariant, ExtensionAPI, CollaborationDiscard, SectionNavigationHelper, TableScroller, InstanceManager, Device, UI5Element, Library, Messaging, Message, MessageType, OverrideExecution, CollaborationManagerOverride, IntentBasedNavigationOverride, InternalRoutingOverride, MessageHandlerOverride, PaginatorOverride, ShareOverrides, ViewStateOverrides) {
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/PageController", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/MessageHandler", "sap/fe/core/controllerextensions/PageReady", "sap/fe/core/controllerextensions/Paginator", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/controllerextensions/cards/CollaborationManager", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/editFlowConstants", "sap/fe/core/controllerextensions/routing/NavigationReason", "sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog", "sap/fe/core/converters/ManifestSettings", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/library", "sap/fe/macros/CommonHelper", "sap/fe/macros/VariantManagement", "sap/fe/macros/table/TableHelper", "sap/fe/macros/table/Utils", "sap/fe/navigation/SelectionVariant", "sap/fe/templates/ObjectPage/ExtensionAPI", "sap/fe/templates/ObjectPage/components/CollaborationDiscardDialog", "sap/fe/templates/ObjectPage/helpers/SectionNavigationHelper", "sap/fe/templates/TableScroller", "sap/m/InstanceManager", "sap/ui/Device", "sap/ui/core/Element", "sap/ui/core/Lib", "sap/ui/core/Messaging", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType", "sap/ui/core/mvc/OverrideExecution", "./overrides/CollaborationManager", "./overrides/IntentBasedNavigation", "./overrides/InternalRouting", "./overrides/MessageHandler", "./overrides/Paginator", "./overrides/Share", "./overrides/ViewState"], function (Log, merge, ClassSupport, ActionRuntime, CommonUtils, PageController, BusyLocker, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, MessageHandler, PageReady, Paginator, Placeholder, Share, ViewState, CollaborationManager, draft, UiModelConstants, NavigationReason, ConfirmRecommendationDialog, ManifestSettings, ModelHelper, FELibrary, CommonHelper, VariantManagementBB, TableHelper, TableUtils, SelectionVariant, ExtensionAPI, CollaborationDiscard, SectionNavigationHelper, TableScroller, InstanceManager, Device, UI5Element, Library, Messaging, Message, MessageType, OverrideExecution, CollaborationManagerOverride, IntentBasedNavigationOverride, InternalRoutingOverride, MessageHandlerOverride, PaginatorOverride, ShareOverrides, ViewStateOverrides) {
6
6
  "use strict";
7
7
 
8
- var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10;
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec0, _dec1, _dec10, _dec11, _dec12, _dec13, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor0;
9
9
  var pollForSectionStability = SectionNavigationHelper.pollForSectionStability;
10
10
  var CreationMode = ManifestSettings.CreationMode;
11
11
  var RecommendationDialogDecision = ConfirmRecommendationDialog.RecommendationDialogDecision;
@@ -19,6 +19,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
19
19
  function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
20
20
  function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
21
21
  function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); }
22
+ const {
23
+ VariantType
24
+ } = VariantManagementBB;
22
25
  const ProgrammingModel = FELibrary.ProgrammingModel;
23
26
  const PreferredActionStatus = FELibrary.PreferredActionStatusType;
24
27
 
@@ -30,16 +33,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
30
33
  const bIsStickyEditMode = this.getView().getController().getStickyEditMode && this.getView().getController().getStickyEditMode();
31
34
  return bIsStickyEditMode ? "explace" : undefined;
32
35
  }
33
- })), _dec10 = usingExtension(ViewState.override(ViewStateOverrides)), _dec11 = usingExtension(PageReady.override({
36
+ })), _dec0 = usingExtension(ViewState.override(ViewStateOverrides)), _dec1 = usingExtension(PageReady.override({
34
37
  isContextExpected: function () {
35
38
  return true;
36
39
  }
37
- })), _dec12 = publicExtension(), _dec13 = finalExtension(), _dec14 = publicExtension(), _dec15 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
38
- function ObjectPageController() {
40
+ })), _dec10 = publicExtension(), _dec11 = finalExtension(), _dec12 = publicExtension(), _dec13 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
41
+ function ObjectPageController(...args) {
39
42
  var _this;
40
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
41
- args[_key] = arguments[_key];
42
- }
43
43
  _this = _PageController.call(this, ...args) || this;
44
44
  _initializerDefineProperty(_this, "placeholder", _descriptor, _this);
45
45
  _initializerDefineProperty(_this, "share", _descriptor2, _this);
@@ -50,7 +50,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
50
50
  _initializerDefineProperty(_this, "collaborationManager", _descriptor7, _this);
51
51
  _initializerDefineProperty(_this, "_intentBasedNavigation", _descriptor8, _this);
52
52
  _initializerDefineProperty(_this, "viewState", _descriptor9, _this);
53
- _initializerDefineProperty(_this, "pageReady", _descriptor10, _this);
53
+ _initializerDefineProperty(_this, "pageReady", _descriptor0, _this);
54
54
  _this.invalidateTitleHierarchyCacheSetUp = false;
55
55
  _this.mergePatchDraft = false;
56
56
  _this.fclCloseHandlerSet = false;
@@ -220,11 +220,15 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
220
220
  onVariantSelected: function () {
221
221
  this.getExtensionAPI().updateAppState();
222
222
  },
223
- onVariantSaved: function () {
223
+ onVariantSaved: function (event) {
224
224
  //TODO: Should remove this setTimeOut once Variant Management provides an api to fetch the current variant key on save
225
225
  setTimeout(() => {
226
226
  this.getExtensionAPI().updateAppState();
227
227
  }, 2000);
228
+ this.trackVariantSavedTelemetry(event);
229
+ },
230
+ onVariantManaged: function (event) {
231
+ this.trackVariantManagedTelemetry(event);
228
232
  },
229
233
  navigateToSubSection: function (oController, vDetailConfig) {
230
234
  const oDetailConfig = typeof vDetailConfig === "string" ? JSON.parse(vDetailConfig) : vDetailConfig;
@@ -272,8 +276,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
272
276
  * @param onlyActionable If true, only actionable (enabled) candidates are returned
273
277
  * @returns An array of controls that are candidates for primary action shortcuts
274
278
  */
275
- _proto._getPrimaryActionShortcutCandidates = function _getPrimaryActionShortcutCandidates(root) {
276
- let onlyActionable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
279
+ _proto._getPrimaryActionShortcutCandidates = function _getPrimaryActionShortcutCandidates(root, onlyActionable = false) {
277
280
  return root.findAggregatedObjects(true, object => {
278
281
  const isButton = object.isA("sap.m.Button");
279
282
  const isMenuButton = object.isA("sap.m.MenuButton");
@@ -477,8 +480,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
477
480
  this.checkSectionsForNonResponsiveTable(subSections);
478
481
  }
479
482
  };
480
- _proto._onBeforeBinding = function _onBeforeBinding(oContext) {
481
- let mParameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
483
+ _proto._onBeforeBinding = function _onBeforeBinding(oContext, mParameters = {}) {
482
484
  // Reset flag to allow section restoration on this new binding context.
483
485
  // This ensures ViewState.apply() can properly restore sections after discard or re-navigation.
484
486
  this.skipViewStateSectionRestore = false;
@@ -661,6 +663,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
661
663
  // SubSection's contents binding is disabled.
662
664
  blocks.forEach(block => {
663
665
  if (block.isA("sap.fe.templates.ObjectPage.controls.SubSectionBlock")) {
666
+ // Set binding context to null on both the block and its content
667
+ // to support both: subsections with UI.Hidden annotation (content needs to be cleared)
668
+ // and customer controller extensions that set binding context on the block level
669
+ block.setBindingContext(undefined);
664
670
  block.content.setBindingContext?.(null);
665
671
  } else {
666
672
  block.setBindingContext(null);
@@ -684,7 +690,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
684
690
  aFormContainers = blockControl.getFormContainers();
685
691
  } else if (blockControl.getContent && blockControl.getContent()?.isA("sap.ui.layout.form.Form")) {
686
692
  aFormContainers = blockControl.getContent().getFormContainers();
687
- } else if (blockControl?.getContent?.()?.isA("sap.fe.macros.form.FormAPI")) {
693
+ } else if (blockControl?.getContent?.()?.isA("sap.fe.macros.Form")) {
688
694
  aFormContainers = blockControl.getContent().getContent().getFormContainers();
689
695
  }
690
696
  if (aFormContainers) {
@@ -734,8 +740,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
734
740
  * @param aSubSections Object page sub sections
735
741
  * @param fromTabNavigation Indicates if the focus is set after a tab navigation
736
742
  */;
737
- _proto._updateFocusInEditMode = function _updateFocusInEditMode(aSubSections) {
738
- let fromTabNavigation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
743
+ _proto._updateFocusInEditMode = function _updateFocusInEditMode(aSubSections, fromTabNavigation = false) {
739
744
  setTimeout(function () {
740
745
  // We set the focus in a timeeout, otherwise the focus sometimes goes to the TabBar
741
746
  const oObjectPage = this._getObjectPageLayoutControl();
@@ -801,6 +806,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
801
806
  const blocks = oSubSection.getBlocks();
802
807
  blocks.forEach(block => {
803
808
  if (block.isA("sap.fe.templates.ObjectPage.controls.SubSectionBlock")) {
809
+ // Set binding context to undefined on both the block and its content
810
+ // to support both: subsections with UI.Hidden annotation (content needs to be cleared)
811
+ // and customer controller extensions that set binding context on the block level
812
+ block.setBindingContext(undefined);
804
813
  block.content.setBindingContext?.(undefined);
805
814
  } else {
806
815
  block.setBindingContext(undefined);
@@ -808,47 +817,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
808
817
  });
809
818
  oSubSection.getMoreBlocks().forEach(subBlock => subBlock.setBindingContext(undefined));
810
819
  oSubSection.getActions().forEach(actions => actions.setBindingContext(undefined));
811
- };
812
- _proto._onBackNavigationInDraft = function _onBackNavigationInDraft(oContext) {
813
- this.messageHandler.removeTransitionMessages();
814
-
815
- // Function to navigate back, or display the launchpad if we're on the first page of the history
816
- const navBack = () => {
817
- // Use the new Navigation API if it's available in the browser, to check if we can go back in history.
818
- const canGoBack = window.navigation?.canGoBack;
819
- if (canGoBack === true) {
820
- history.back();
821
- } else if (canGoBack === false) {
822
- this._routing.navigateBackFromContext(oContext);
823
- } else {
824
- // Fallback in case the browser doesn't support the Navigation API
825
- const currentURL = document.URL;
826
- history.back();
827
- // In case there is no previous page in the history, history.back does nothing.
828
- // In this case, we need to use navigateBackFromContext, that will display the home page
829
- setTimeout(() => {
830
- if (document.URL === currentURL) {
831
- this._routing.navigateBackFromContext(oContext);
832
- }
833
- }, 500);
834
- }
835
- };
836
- if (this.getAppComponent().getRouterProxy().checkIfBackHasSameContext()) {
837
- // Back nav will keep the same context --> no need to display the dialog
838
- history.back();
839
- } else if (!this.getView().getBindingContext()) {
840
- // This object page doesn't have a binding context, but still handles the shell back navigation --> pform the nav back and remove the navback handler as it makes no sense any longer
841
- this.getAppComponent().getShellServices().setBackNavigation(undefined).then(navBack).catch(e => {
842
- Log.warning("Error while setting back navigation", e);
843
- });
844
- } else {
845
- const hiddenDraftEnabled = this.getAppComponent()?.getEnvironmentCapabilities()?.getCapabilities()?.HiddenDraft?.enabled;
846
- draft.processDataLossOrDraftDiscardConfirmation(navBack, Function.prototype, oContext, this, true, draft.NavigationType.BackNavigation, undefined, hiddenDraftEnabled ? true : undefined);
847
- }
848
820
  }
849
821
 
850
822
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
851
- ;
823
+ ;
852
824
  _proto._onAfterBinding = function _onAfterBinding(inputBindingContext, mParameters) {
853
825
  const view = this.getView();
854
826
  const viewLevel = view?.getViewData()?.viewLevel;
@@ -1012,6 +984,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
1012
984
  if (!targetControlId) {
1013
985
  return;
1014
986
  }
987
+ // Reset stale flag so ViewState.apply() is not blocked when the OP is re-activated
988
+ // via shell keep-alive (cross-app re-entry) without _onBeforeBinding firing.
989
+ // Intentional ordering: reset to false here before pollForSectionStability (below) sets it back
990
+ // to true, so any concurrent ViewState.apply() triggered on re-entry is unblocked immediately.
991
+ if (xAppStateTargetControlId) {
992
+ this.skipViewStateSectionRestore = false;
993
+ }
1015
994
 
1016
995
  // Wait for visibility bindings (needed for lazy loading scenarios)
1017
996
  try {
@@ -1060,20 +1039,20 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
1060
1039
  return;
1061
1040
  }
1062
1041
 
1063
- // Poll to detect UX rules reset only on new entity binding.
1064
- // _adjustSelectedSectionByUXRules() only runs when ObjectPageLayout re-initializes with a new entity.
1065
- if (this.isNewBindingContext) {
1066
- pollForSectionStability({
1067
- getSelectedSection: () => oObjectPage.getSelectedSection(),
1068
- targetSectionId,
1069
- onResetDetected: navigateToTarget
1070
- }).then(() => {
1071
- this.skipViewStateSectionRestore = true;
1072
- return; // Required by linter rule promise/always-return
1073
- }).catch(() => {
1074
- // Required by linter rule promise/catch-or-return - polling failures are non-critical
1075
- });
1076
- }
1042
+ // Poll to detect UX rules reset. The guard on isNewBindingContext was removed because
1043
+ // _adjustSelectedSectionByUXRules() can also reset the section on cross-app re-entry to
1044
+ // the same entity (shell keep-alive). Polling is lightweight (max 10 × 50 ms) and safe to
1045
+ // run unconditionally whenever we need to hold a target section.
1046
+ pollForSectionStability({
1047
+ getSelectedSection: () => oObjectPage.getSelectedSection(),
1048
+ targetSectionId,
1049
+ onResetDetected: navigateToTarget
1050
+ }).then(() => {
1051
+ this.skipViewStateSectionRestore = true;
1052
+ return; // Required by linter rule promise/always-return
1053
+ }).catch(() => {
1054
+ // Required by linter rule promise/catch-or-return - polling failures are non-critical
1055
+ });
1077
1056
  }
1078
1057
 
1079
1058
  /**
@@ -1091,9 +1070,53 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
1091
1070
  }
1092
1071
 
1093
1072
  /**
1094
- * Performs navigation to the target section and then updates the app state.
1095
- * @param targetControlId The local ID of the target section or subsection.
1073
+ * Tracks telemetry when a new variant is saved.
1074
+ * @param event The save event.
1096
1075
  */;
1076
+ _proto.trackVariantSavedTelemetry = async function trackVariantSavedTelemetry(event) {
1077
+ if (event.getParameter("overwrite")) {
1078
+ return;
1079
+ }
1080
+ if (!event.getSource().isA("sap.fe.macros.Table")) {
1081
+ return;
1082
+ }
1083
+ if (!(await this.getAppComponent()?.getTelemetryService()?.isEnabled())) {
1084
+ return;
1085
+ }
1086
+ const tableAPI = event.getSource();
1087
+ this.fireTelemetry(tableAPI?.getContent?.()?.getVariant?.()?.getVariants?.()?.length ?? 0, VariantType.OBJECT_PAGE_TABLE);
1088
+ }
1089
+
1090
+ /**
1091
+ * Tracks telemetry when variants are managed (e.g. deleted).
1092
+ * @param event The manage event.
1093
+ */;
1094
+ _proto.trackVariantManagedTelemetry = async function trackVariantManagedTelemetry(event) {
1095
+ const deletedCount = (event.getParameter("deleted") ?? []).length;
1096
+ if (deletedCount === 0) {
1097
+ return;
1098
+ }
1099
+ if (!(await this.getAppComponent()?.getTelemetryService()?.isEnabled())) {
1100
+ return;
1101
+ }
1102
+ this.fireTelemetry(deletedCount, VariantType.OBJECT_PAGE_TABLE);
1103
+ }
1104
+
1105
+ /**
1106
+ * Stores a FE.Variant telemetry event.
1107
+ * @param countVariants Number of variants affected by the action.
1108
+ * @param variantType The variant type discriminator.
1109
+ */;
1110
+ _proto.fireTelemetry = function fireTelemetry(countVariants, variantType) {
1111
+ const telemetryEvent = {
1112
+ type: "FE.Variant",
1113
+ parameters: {
1114
+ countVariants,
1115
+ variantType
1116
+ }
1117
+ };
1118
+ this.getAppComponent()?.getTelemetryService()?.storeAction(telemetryEvent);
1119
+ };
1097
1120
  _proto.navigateWithConfirmation = function navigateWithConfirmation(targetControlId) {
1098
1121
  // Set targetSubSection BEFORE navigation for app state saving.
1099
1122
  // scrollToSection() doesn't fire the navigate event, so onNavigateChange won't be called.
@@ -1124,8 +1147,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
1124
1147
  * @param waitForVisibilityBindings Boolean indicating whether to wait for visibility bindings to be resolved before reconnecting observers
1125
1148
  * @returns A promise that resolves to true if the observers were reconnected, false otherwise
1126
1149
  */;
1127
- _proto.reconnectSubSectionVisibilityObservers = async function reconnectSubSectionVisibilityObservers(subSectionInfo, objectPageLayout, waitForApplyAppstate) {
1128
- let waitForVisibilityBindings = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
1150
+ _proto.reconnectSubSectionVisibilityObservers = async function reconnectSubSectionVisibilityObservers(subSectionInfo, objectPageLayout, waitForApplyAppstate, waitForVisibilityBindings = true) {
1129
1151
  if (!this.getDisableObjectPageRequestOptimization() && subSectionInfo) {
1130
1152
  await Promise.all(waitForVisibilityBindings ? this.waitForVisibilityBindings : []).then(async () => {
1131
1153
  objectPageLayout.setVisible(true);
@@ -1230,12 +1252,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
1230
1252
  const oView = this.getView();
1231
1253
  const oInternalModelContext = oView.getBindingContext("internal");
1232
1254
  const oBindingContext = oView.getBindingContext();
1233
- //Show popup while navigating back from object page in case of draft
1255
+ // Show popup while navigating back from object page in case of draft (incl. hidden draft).
1256
+ // Sticky's shell back is registered centrally from EditFlow.registerEditLifecycleCallbacks.
1234
1257
  if (oBindingContext) {
1235
- const bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
1236
- if (!bIsStickyMode) {
1258
+ const isDraftSupported = ModelHelper.isDraftSupported(oBindingContext.getModel().getMetaModel(), oBindingContext.getPath());
1259
+ if (isDraftSupported) {
1237
1260
  const oAppComponent = CommonUtils.getAppComponent(oView);
1238
- await oAppComponent.getShellServices().setBackNavigation(() => this._onBackNavigationInDraft(oBindingContext));
1261
+ await oAppComponent.getShellServices().setBackNavigation(() => this.editFlow.onBackNavigationInDraft(oBindingContext));
1239
1262
  }
1240
1263
  }
1241
1264
  // do not request recommendations action if we are in Display mode
@@ -1470,8 +1493,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
1470
1493
  * @param byPassSideEffects Only the draft Validation step is executed
1471
1494
  * @returns Promise of the global validation
1472
1495
  */;
1473
- _proto.executeGlobalValidation = async function executeGlobalValidation(context) {
1474
- let byPassSideEffects = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1496
+ _proto.executeGlobalValidation = async function executeGlobalValidation(context, byPassSideEffects = false) {
1475
1497
  const appComponent = this.getAppComponent();
1476
1498
  // the draft validation is treated as a user interaction, and the service must return transition messages again if still valid
1477
1499
  this.messageHandler.removeTransitionMessages();
@@ -2034,17 +2056,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/base/ClassSupport"
2034
2056
  enumerable: true,
2035
2057
  writable: true,
2036
2058
  initializer: null
2037
- }), _descriptor9 = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec10], {
2059
+ }), _descriptor9 = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec0], {
2038
2060
  configurable: true,
2039
2061
  enumerable: true,
2040
2062
  writable: true,
2041
2063
  initializer: null
2042
- }), _descriptor10 = _applyDecoratedDescriptor(_class2.prototype, "pageReady", [_dec11], {
2064
+ }), _descriptor0 = _applyDecoratedDescriptor(_class2.prototype, "pageReady", [_dec1], {
2043
2065
  configurable: true,
2044
2066
  enumerable: true,
2045
2067
  writable: true,
2046
2068
  initializer: null
2047
- }), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype), _class2)) || _class);
2069
+ }), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype), _class2)) || _class);
2048
2070
  return ObjectPageController;
2049
2071
  }, false);
2050
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiUHJlZmVycmVkQWN0aW9uU3RhdHVzIiwiUHJlZmVycmVkQWN0aW9uU3RhdHVzVHlwZSIsIk9iamVjdFBhZ2VDb250cm9sbGVyIiwiX2RlYyIsImRlZmluZVVJNUNsYXNzIiwiX2RlYzIiLCJ1c2luZ0V4dGVuc2lvbiIsIlBsYWNlaG9sZGVyIiwiX2RlYzMiLCJTaGFyZSIsIm92ZXJyaWRlIiwiU2hhcmVPdmVycmlkZXMiLCJfZGVjNCIsIkludGVybmFsUm91dGluZyIsIkludGVybmFsUm91dGluZ092ZXJyaWRlIiwiX2RlYzUiLCJQYWdpbmF0b3IiLCJQYWdpbmF0b3JPdmVycmlkZSIsIl9kZWM2IiwiTWVzc2FnZUhhbmRsZXIiLCJNZXNzYWdlSGFuZGxlck92ZXJyaWRlIiwiX2RlYzciLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsIl9kZWM4IiwiQ29sbGFib3JhdGlvbk1hbmFnZXIiLCJDb2xsYWJvcmF0aW9uTWFuYWdlck92ZXJyaWRlIiwiX2RlYzkiLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE5hdmlnYXRpb25Nb2RlIiwiYklzU3RpY2t5RWRpdE1vZGUiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsImdldFN0aWNreUVkaXRNb2RlIiwidW5kZWZpbmVkIiwiX2RlYzEwIiwiVmlld1N0YXRlIiwiVmlld1N0YXRlT3ZlcnJpZGVzIiwiX2RlYzExIiwiUGFnZVJlYWR5IiwiaXNDb250ZXh0RXhwZWN0ZWQiLCJfZGVjMTIiLCJwdWJsaWNFeHRlbnNpb24iLCJfZGVjMTMiLCJmaW5hbEV4dGVuc2lvbiIsIl9kZWMxNCIsIl9kZWMxNSIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiX2NsYXNzIiwiX2NsYXNzMiIsIl9QYWdlQ29udHJvbGxlciIsIl90aGlzIiwiX2xlbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjYWxsIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJfZGVzY3JpcHRvciIsIl9kZXNjcmlwdG9yMiIsIl9kZXNjcmlwdG9yMyIsIl9kZXNjcmlwdG9yNCIsIl9kZXNjcmlwdG9yNSIsIl9kZXNjcmlwdG9yNiIsIl9kZXNjcmlwdG9yNyIsIl9kZXNjcmlwdG9yOCIsIl9kZXNjcmlwdG9yOSIsIl9kZXNjcmlwdG9yMTAiLCJpbnZhbGlkYXRlVGl0bGVIaWVyYXJjaHlDYWNoZVNldFVwIiwibWVyZ2VQYXRjaERyYWZ0IiwiZmNsQ2xvc2VIYW5kbGVyU2V0Iiwic2tpcFZpZXdTdGF0ZVNlY3Rpb25SZXN0b3JlIiwiaXNOZXdCaW5kaW5nQ29udGV4dCIsImhhbmRsZXJzIiwib25QcmltYXJ5QWN0aW9uIiwib0NvbnRyb2xsZXIiLCJvVmlldyIsIm9Db250ZXh0Iiwic0FjdGlvbk5hbWUiLCJtUGFyYW1ldGVycyIsIm1Db25kaXRpb25zIiwicHJpbWFyeUNhbmRpZGF0ZSIsIl9nZXRQcmltYXJ5QWN0aW9uU2hvcnRjdXRDYW5kaWRhdGVzIiwiZ2V0RW5hYmxlZCIsImlzQSIsImZpcmVQcmVzcyIsImZpcmVEZWZhdWx0QWN0aW9uIiwiaVZpZXdMZXZlbCIsImdldFZpZXdEYXRhIiwidmlld0xldmVsIiwicG9zaXRpdmVBY3Rpb25WaXNpYmxlIiwicG9zaXRpdmVBY3Rpb25FbmFibGVkIiwib25DYWxsQWN0aW9uIiwiZWRpdEFjdGlvblZpc2libGUiLCJlZGl0QWN0aW9uRW5hYmxlZCIsIl9lZGl0RG9jdW1lbnQiLCJDb21tb25VdGlscyIsImdldElzRWRpdGFibGUiLCJfc2F2ZURvY3VtZW50IiwiX2FwcGx5RG9jdW1lbnQiLCJvblRhYmxlQ29udGV4dENoYW5nZSIsImV2ZW50IiwidGFibGVBUEkiLCJnZXRTb3VyY2UiLCJ0YWJsZSIsImNvbnRlbnQiLCJjdXJyZW50QWN0aW9uUHJvbWlzZSIsImVkaXRGbG93IiwiZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJ0YWJsZUNvbnRleHRzIiwiX2dldFRhYmxlQmluZGluZyIsImdldEFsbEN1cnJlbnRDb250ZXh0cyIsImFjdGlvblJlc3BvbnNlIiwiY29udHJvbElkIiwiZ2V0SWQiLCJhY3Rpb25EYXRhIiwib0RhdGEiLCJrZXlzIiwibmV3SXRlbSIsImZpbmQiLCJ0YWJsZUNvbnRleHQiLCJ0YWJsZURhdGEiLCJnZXRPYmplY3QiLCJldmVyeSIsImtleSIsImdldEluZGV4IiwiZGlhbG9nIiwiSW5zdGFuY2VNYW5hZ2VyIiwiZ2V0T3BlbkRpYWxvZ3MiLCJkYXRhIiwiYXR0YWNoRXZlbnRPbmNlIiwiZm9jdXNSb3ciLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImUiLCJMb2ciLCJlcnJvciIsIm1lc3NhZ2VCdXR0b24iLCJmaXJlTW9kZWxDb250ZXh0Q2hhbmdlIiwib25UYWJsZUJpbmRpbmdVcGRhdGVkIiwic3luY1Rhc2siLCJpbnZva2VBY3Rpb24iLCJ0aGVuIiwicmVzIiwiX3Nob3dNZXNzYWdlUG9wb3ZlciIsImNhdGNoIiwib25EYXRhUG9pbnRUaXRsZVByZXNzZWQiLCJvU291cmNlIiwib01hbmlmZXN0T3V0Ym91bmQiLCJzQ29udHJvbENvbmZpZyIsInNDb2xsZWN0aW9uUGF0aCIsIkpTT04iLCJwYXJzZSIsIm9UYXJnZXRJbmZvIiwib0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwic01ldGFQYXRoIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJhU2VtYW50aWNPYmplY3RNYXBwaW5nIiwiZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nIiwiYU5hdmlnYXRpb25EYXRhIiwiX2dldENoYXJ0Q29udGV4dERhdGEiLCJhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJtYXAiLCJvTmF2aWdhdGlvbkRhdGEiLCJtZXRhUGF0aCIsInBhcmFtZXRlcnMiLCJvUGFyYW1zIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE91dGJvdW5kUGFyYW1zIiwiT2JqZWN0IiwiY3VzdG9tRGF0YSIsImdldEN1c3RvbURhdGEiLCJnZXRLZXkiLCJfZ2V0SW1wbGljaXRTZW1hbnRpY09iamVjdE1hcHBpbmdGb3JEYXRhUG9pbnRzIiwiZ2V0VmFsdWUiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsIm5hdmlnYXRlIiwibmF2aWdhdGlvbkNvbnRleHRzIiwic2VtYW50aWNPYmplY3RNYXBwaW5nIiwib25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kIiwic091dGJvdW5kVGFyZ2V0Iiwic0NyZWF0ZVBhdGgiLCJvbk5hdmlnYXRlQ2hhbmdlIiwib0V2ZW50IiwiYlNlY3Rpb25OYXZpZ2F0ZWQiLCJzdWJTZWN0aW9uIiwiZ2V0UGFyYW1ldGVyIiwidGFyZ2V0U3ViU2VjdGlvbiIsImdldEV4dGVuc2lvbkFQSSIsInVwZGF0ZUFwcFN0YXRlIiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwic2VjdGlvbkxheW91dCIsImdldFByb3BlcnR5IiwiX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZSIsIm9uVmFyaWFudFNlbGVjdGVkIiwib25WYXJpYW50U2F2ZWQiLCJzZXRUaW1lb3V0IiwibmF2aWdhdGVUb1N1YlNlY3Rpb24iLCJ2RGV0YWlsQ29uZmlnIiwib0RldGFpbENvbmZpZyIsInRhcmdldElkIiwic3ViU2VjdGlvbklkIiwic2VjdGlvbklkIiwiY2xvc2VDb2xsYWJvcmF0aW9uU3RyaXAiLCJzZXRQcm9wZXJ0eSIsImNsb3NlT1BNZXNzYWdlU3RyaXAiLCJ2aWV3IiwiYklzSW5FZGl0TW9kZSIsImludGVybmFsTW9kZWwiLCJtZXNzYWdlc3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dCIsImJpbmRDb250ZXh0IiwiX2dldE1lc3NhZ2VTdHJpcEJpbmRpbmdDb250ZXh0UGF0aCIsImdldEJvdW5kQ29udGV4dCIsImNvbnRleHRCb3VuZE1lc3NhZ2VzIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZpbHRlciIsIm1lc3NhZ2UiLCJnZXRUYXJnZXRzIiwiZ2V0UGVyc2lzdGVudCIsInJlbW92ZU1lc3NhZ2VzIiwiaGlkZU1lc3NhZ2UiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsInJvb3QiLCJvbmx5QWN0aW9uYWJsZSIsImZpbmRBZ2dyZWdhdGVkT2JqZWN0cyIsIm9iamVjdCIsImlzQnV0dG9uIiwiaXNNZW51QnV0dG9uIiwiY3RybCIsImZsYWciLCJnZXRWaXNpYmxlIiwic0lkIiwibUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzIiwiRXh0ZW5zaW9uQVBJIiwiZXh0ZW5zaW9uQVBJIiwib25Jbml0Iiwib09iamVjdFBhZ2UiLCJfZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2wiLCJnZXRPd25lckNvbXBvbmVudCIsInBhZ2UiLCJ2aXNpYmlsaXR5IiwiaXRlbXMiLCJfZ2V0QmF0Y2hHcm91cHNGb3JWaWV3IiwiZ2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uIiwiYXR0YWNoRXZlbnQiLCJfaGFuZGxlU3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydCIsImJpbmQiLCJfZ2V0QWxsU3ViU2VjdGlvbnMiLCJmb3JFYWNoIiwiYnlJZCIsIm1lc3NhZ2VCaW5kaW5nIiwiYmluZExpc3QiLCJhdHRhY2hDaGFuZ2UiLCJfZm5TaG93T1BNZXNzYWdlIiwiX2hhbmRsZVNtYXJ0U3VtbWFyeVN0YXJ0dXBBY3Rpb24iLCJvbkV4aXQiLCJkZXN0cm95Iiwib01lc3NhZ2VQb3BvdmVyIiwiaXNPcGVuIiwiY2xvc2UiLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsImNvbGxhYm9yYXRpdmVEcmFmdCIsImRpc2Nvbm5lY3QiLCJkZXRhY2hDaGFuZ2UiLCJnZXRBcHBDb21wb25lbnQiLCJpc1N1c3BlbmRlZCIsIm1lc3NhZ2VzIiwiX3Nob3dNZXNzYWdlcyIsIm9UYWJsZSIsImdldFJvd0JpbmRpbmciLCJjaGVja1NlY3Rpb25zRm9yTm9uUmVzcG9uc2l2ZVRhYmxlIiwic3ViU2VjdGlvbnMiLCJjaGFuZ2VDbGFzc0ZvclRhYmxlcyIsInZpc2libGVTdWJTZWN0aW9uIiwiYmxvY2tzIiwiZ2V0QmxvY2tzIiwiZ2V0TW9yZUJsb2NrcyIsImJsb2NrIiwic2VhcmNoVGFibGVJbkJsb2NrIiwidGFibGVUeXBlIiwiZ2V0VHlwZSIsImdldFBhcmVudCIsInRhYmxlQ29udHJvbCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbnRyb2wiLCJyb3dDb3VudE1vZGUiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsImFkZFN0eWxlQ2xhc3MiLCJkZXRhY2hFdmVudCIsImdldFRhYmxlQVBJIiwibWFpbkNvbnRlbnQiLCJnZXRNYWluQ29udGVudCIsIm1haW5Db250ZW50VGFibGVBUEkiLCJzaWRlQ29udGVudCIsImdldFNpZGVDb250ZW50Iiwic2lkZUNvbnRlbnRUYWJsZUFQSSIsIm9uQmVmb3JlUmVuZGVyaW5nIiwiUGFnZUNvbnRyb2xsZXIiLCJhcHBseSIsInJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QiLCJDb21tb25IZWxwZXIiLCJzZXRNZXRhTW9kZWwiLCJvbkFmdGVyUmVuZGVyaW5nIiwiZ2V0VXNlSWNvblRhYkJhciIsInNlY3Rpb25zIiwiZ2V0U2VjdGlvbnMiLCJzZWN0aW9uIiwiZ2V0U3ViU2VjdGlvbnMiLCJfb25CZWZvcmVCaW5kaW5nIiwicGVuZGluZ1RhcmdldENvbnRyb2xJZCIsInRhcmdldENvbnRyb2xJZCIsImN1cnJlbnRDb250ZXh0UGF0aCIsImdldEVudGl0eUlkZW50aXR5IiwicGF0aCIsInJlcGxhY2UiLCJjdXJyZW50RW50aXR5SWQiLCJwcmV2aW91c0VudGl0eUlkIiwicHJldmlvdXNCaW5kaW5nQ29udGV4dFBhdGgiLCJhVGFibGVzIiwiX2ZpbmRUYWJsZXMiLCJvSW50ZXJuYWxNb2RlbCIsImFCYXRjaEdyb3VwcyIsIm9GYXN0Q3JlYXRpb25Sb3ciLCJwdXNoIiwicmVhc29uIiwiTmF2aWdhdGlvblJlYXNvbiIsIkVkaXRGbG93QWN0aW9uIiwiX2Nsb3NlU2lkZUNvbnRlbnQiLCJvcENvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInNvbWUiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiaXRlbSIsImdldENyZWF0aW9uUm93Iiwic2V0QmluZGluZ0NvbnRleHQiLCJmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24iLCJpc0ZpcnN0UmVuZGVyaW5nIiwiYlBlcnNpc3RPUFNjcm9sbCIsInNldFNlbGVjdGVkU2VjdGlvbiIsImZuT1BSZW5kZXJpbmdMYXlvdXQiLCJlZGl0YWJsZUhlYWRlckNvbnRlbnQiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwiYWRkRXZlbnREZWxlZ2F0ZSIsIl9pbml0aWFsaXplUGFnaW5hdGlvbiIsImxpc3RCaW5kaW5nIiwiX2Rpc2FibGVCbG9ja3NCaW5kaW5ncyIsImRpc2Nvbm5lY3RTdWJTZWN0aW9uVmlzaWJpbGl0eU9ic2VydmVycyIsIndhaXRGb3JWaXNpYmlsaXR5QmluZGluZ3MiLCJ3YWl0Rm9yQWxsU3ViU2VjdGlvblZpc2liaWxpdHlCaW5kaW5nc1Jlc29sdmVkIiwicGxhY2Vob2xkZXIiLCJpc1BsYWNlaG9sZGVyRW5hYmxlZCIsInNob3dQbGFjZWhvbGRlciIsIm9OYXZDb250YWluZXIiLCJvQ29udGFpbmVyIiwiZW5hYmxlQW5pbWF0aW9uIiwib2JqZWN0UGFnZUxheW91dCIsInNldFZpc2libGUiLCJzdWJTZWN0aW9uc0luZm8iLCJmZSIsIm90aGVycyIsImRpc2Nvbm5lY3RWaXNpYmlsaXR5T2JzZXJ2ZXIiLCJnZXRGaXJzdEVkaXRhYmxlSW5wdXQiLCJkb21FZGl0YWJsZUVsZW1lbnQiLCJfZ2V0Rmlyc3RFZGl0YWJsZUlucHV0IiwiVUk1RWxlbWVudCIsImNsb3Nlc3RUbyIsImdldEZpcnN0Q2xpY2thYmxlRWxlbWVudCIsIm9iamVjdFBhZ2UiLCJmb290ZXIiLCJnZXRGb290ZXIiLCJmb290ZXJQcmltYXJ5QWN0aW9uIiwiZmlyc3RDbGlja2FibGVFbGVtZW50IiwiYWN0aW9ucyIsImdldEhlYWRlclRpdGxlIiwiZ2V0QWN0aW9ucyIsImdldENvbnRlbnQiLCJhU2VjdGlvbnMiLCJiVXNlSWNvblRhYkJhciIsImlTa2lwIiwiYkVkaXRhYmxlSGVhZGVyIiwiZmlyc3RWaXNpYmlsaXR5QmluZGluZyIsIl9nZXRmaXJzdFN1YlNlY3Rpb25WaXNpYmlsaXR5QmluZGluZyIsImlTZWN0aW9uIiwib1NlY3Rpb24iLCJhU3ViU2VjdGlvbnMiLCJpU3ViU2VjdGlvbiIsIm9TdWJTZWN0aW9uIiwiZGlzYWJsZUJpbmRpbmdDb250ZXh0Q29uZGl0aW9uIiwic3ViQmxvY2siLCJfZ2V0Rmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkRnJvbVN1YlNlY3Rpb24iLCJhQmxvY2tzIiwiYmxvY2tDb250cm9sIiwiYUZvcm1Db250YWluZXJzIiwiZ2V0Rm9ybUNvbnRhaW5lcnMiLCJmb3JtQ29udGFpbmVyIiwiYUZvcm1FbGVtZW50cyIsImdldEZvcm1FbGVtZW50cyIsImZvcm1FbGVtZW50IiwiYUZpZWxkcyIsImdldEZpZWxkcyIsImVtcHR5RmllbGQiLCJnZXRGaXJzdEVtcHR5UmVxdWlyZWRGaWVsZCIsImZpZWxkcyIsImdldFJlcXVpcmVkIiwiaXNFbXB0eSIsImdldE11bHRpVmFsdWVGaWVsZCIsImdldEl0ZW1zIiwidmFsdWUiLCJkZWJ1ZyIsImZyb21UYWJOYXZpZ2F0aW9uIiwib01hbmRhdG9yeUZpZWxkIiwib0ZpZWxkVG9Gb2N1cyIsImdldENvbnRlbnRFZGl0IiwiZm9jdXNJbmZvIiwiZ2V0Rm9jdXNJbmZvIiwidGFyZ2V0SW5mbyIsInNpbGVudCIsImdldEVuYWJsZVN1Z2dlc3Rpb25zIiwiaXNCb3VuZCIsInNldEVuYWJsZVN1Z2dlc3Rpb25zIiwiZm9jdXMiLCJhbGxzdWJTZWN0aW9ucyIsImN1cnJlbnRNb2RlbCIsImdldEJpbmRpbmdzIiwiYmluZGluZyIsIlByb21pc2UiLCJyZXNvbHZlIiwiaGFuZGxlU3ViU2VjdGlvbkNyZWF0ZWQiLCJfb25CYWNrTmF2aWdhdGlvbkluRHJhZnQiLCJtZXNzYWdlSGFuZGxlciIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsIm5hdkJhY2siLCJjYW5Hb0JhY2siLCJ3aW5kb3ciLCJuYXZpZ2F0aW9uIiwiaGlzdG9yeSIsImJhY2siLCJfcm91dGluZyIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwiY3VycmVudFVSTCIsImRvY3VtZW50IiwiVVJMIiwiZ2V0Um91dGVyUHJveHkiLCJjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0IiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwid2FybmluZyIsImhpZGRlbkRyYWZ0RW5hYmxlZCIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiSGlkZGVuRHJhZnQiLCJlbmFibGVkIiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIl9vbkFmdGVyQmluZGluZyIsImlucHV0QmluZGluZ0NvbnRleHQiLCJSb3dQcmVzcyIsImluY2x1ZGVzIiwic3RvcmVTaWJsaW5nQ29udGV4dERhdGEiLCJzaWRlRWZmZWN0cyIsImNsZWFyRmllbGRHcm91cHNWYWxpZGl0eSIsImJpbmRpbmdDb250ZXh0IiwiYUlCTkFjdGlvbnMiLCJnZXRJQk5BY3Rpb25zIiwib1RhYmxlUm93QmluZGluZyIsIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwicmVtb3ZlQ2FjaGVzQW5kTWVzc2FnZXMiLCJvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwidGFibGVEZWZpbml0aW9uIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJjbGVhclNlbGVjdGlvbiIsIm9PYmplY3RQYWdlVGl0bGUiLCJhSUJOSGVhZGVyQWN0aW9ucyIsImNvbmNhdCIsInVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5Iiwib01vZGVsIiwib0ZpbmFsVUlTdGF0ZSIsImhhbmRsZVRhYmxlTW9kaWZpY2F0aW9ucyIsIm9CaW5kaW5nIiwiZm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzIiwiVGFibGVIZWxwZXIiLCJlbmFibGVGYXN0Q3JlYXRpb25Sb3ciLCJnZXRDb250ZXh0IiwiZm5IYW5kbGVDaGFuZ2UiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZSIsIl91cGRhdGVSZWxhdGVkQXBwcyIsImN1cnJlbnRCaW5kaW5nIiwiaGFuZGxlUGF0Y2hTZW50IiwiVGFibGVVdGlscyIsIndoZW5Cb3VuZCIsIm9FcnJvciIsIl90cmlnZ2VyVmlzaWJsZVN1YlNlY3Rpb25zRXZlbnRzIiwidXBkYXRlRWRpdEJ1dHRvblZpc2liaWxpdHlBbmRFbmFibGVtZW50IiwiX3VwZGF0ZUF2YWlsYWJsZUNhcmRzIiwicmVjb21tZW5kYXRpb25zIiwiY2xlYXJSZWNvbW1lbmRhdGlvbnMiLCJkaXNwbGF5Q29sbGFib3JhdGlvbk1lc3NhZ2UiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsIl9zZXRPUE1lc3NhZ2VTdHJpcEludGVybmFsQ29udGV4dCIsImFwcGx5QXBwU3RhdGUiLCJnZXRBcHBTdGF0ZUhhbmRsZXIiLCJwYWdlUmVhZHkiLCJ3YWl0Rm9yIiwicmVjb25uZWN0U3ViU2VjdGlvblZpc2liaWxpdHlPYnNlcnZlcnMiLCJoYW5kbGVQZW5kaW5nVGFyZ2V0Q29udHJvbElkTmF2aWdhdGlvbiIsInhBcHBTdGF0ZVRhcmdldENvbnRyb2xJZCIsImNvbnN1bWVQZW5kaW5nVGFyZ2V0Q29udHJvbElkIiwiYWxsIiwid2FpdFBhZ2VSZWFkeSIsIm5hdmlnYXRlVG9UYXJnZXRTZWN0aW9uIiwidGFyZ2V0Q29udHJvbCIsImlzU2VjdGlvbiIsInRhcmdldFNlY3Rpb25JZCIsIm5hdmlnYXRlVG9UYXJnZXQiLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJuYXZpZ2F0ZVdpdGhDb25maXJtYXRpb24iLCJwb2xsRm9yU2VjdGlvblN0YWJpbGl0eSIsIm9uUmVzZXREZXRlY3RlZCIsInNldFRhcmdldFN1YlNlY3Rpb24iLCJ2aWV3U3RhdGUiLCJ1cGRhdGVBcHBTdGF0ZURlYm91bmNlZCIsImlzSW5FZGl0TW9kZSIsInN1YlNlY3Rpb25JbmZvIiwid2FpdEZvckFwcGx5QXBwc3RhdGUiLCJvYnNlcnZlQ3VycmVudFNlY3Rpb24iLCJzdWJzZWN0aW9uIiwiZmlyZUV2ZW50IiwiY2FyZHMiLCJjb2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2UiLCJnZXRDb2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2UiLCJoYXNDb2xsYWJvcmF0aW9uTWFuYWdlckNvbm5lY3RlZCIsImNvbGxhYm9yYXRpb25NYW5hZ2VyIiwiY29sbGVjdEF2YWlsYWJsZUNhcmRzIiwiY2FyZE9iamVjdCIsInVwZGF0ZUNhcmRzIiwicGFyZW50QXBwSWQiLCJhZGRDYXJkc1RvQ29sbGFib3JhdGlvbk1hbmFnZXIiLCJzaGFyZUF2YWlsYWJsZUNhcmRzIiwiZmluZEVsZW1lbnRzIiwiZWxlbSIsIm1lc3NhZ2VTdHJpcCIsImVudGl0eU5hbWUiLCJyZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsImNvbGxhYm9yYXRpb25NZXNzYWdlIiwiTWVzc2FnZSIsImdldFRleHQiLCJ0eXBlIiwiTWVzc2FnZVR5cGUiLCJJbmZvcm1hdGlvbiIsInRhcmdldCIsImFkZE1lc3NhZ2VzIiwib25QYWdlUmVhZHkiLCJzZXRGb2N1cyIsImlzSW5EaXNwbGF5TW9kZSIsIm9GaXJzdENsaWNrYWJsZUVsZW1lbnQiLCJvU2VsZWN0ZWRTZWN0aW9uIiwiZ2V0RWxlbWVudEJ5SWQiLCJjdHh0Iiwib0JpbmRpbmdDb250ZXh0IiwiYklzU3RpY2t5TW9kZSIsIm9BcHBDb21wb25lbnQiLCJpc0VkaXRhYmxlIiwiZmV0Y2hBbmRBcHBseVJlY29tbWVuZGF0aW9ucyIsImNvbnRleHQiLCJmb3JjZUZvY3VzIiwiX2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJEZXZpY2UiLCJzdXBwb3J0IiwidG91Y2giLCJzYXZlQnV0dG9uIiwiYXV0b1F1ZXVlVW5sb2NrIiwiYXV0b1F1ZXVlTG9jayIsImlzTG9ja2VkIiwidW5sb2NrIiwiZGV0YWNoQnJvd3NlckV2ZW50IiwiYXR0YWNoQnJvd3NlckV2ZW50IiwibG9jayIsImZjbENsb3NlQnV0dG9uIiwiY2xvc2VDb2x1bW4iLCJfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24iLCJvT2JqZWN0UGFnZVN1YnRpdGxlIiwib0N1c3RvbURhdGEiLCJvT2JqZWN0UGFnZURlc2NyaXB0aW9uIiwiZXh0cmFjdFBhdGhzIiwiYmluZGluZ0luZm8iLCJmcm9tIiwiU2V0IiwicGFydHMiLCJwYXJ0IiwibW9kZWwiLCJCb29sZWFuIiwic3VidGl0bGVQYXRocyIsImdldEJpbmRpbmdJbmZvIiwiZGVzY3JpcHRpb25QYXRocyIsInBhdGhzVG9SZXNvbHZlIiwiYXBwQ29tcG9uZW50Iiwicm9vdFZpZXdDb250cm9sbGVyIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZm5DbGVhckNhY2hlVGl0bGUiLCJpbnZhbGlkYXRlVGl0bGVIaWVyYXJjaHlDYWNoZSIsIm9PYmplY3RQYWdlQ29udGV4dCIsImJ1aWxkIiwidGl0bGUiLCJzdWJ0aXRsZSIsImludGVudCIsImljb24iLCJkZXNjcmlwdGlvbiIsInAiLCJyZXF1ZXN0UHJvcGVydHkiLCJfZXhlY3V0ZVRhYlNob3J0Q3V0Iiwib0V4ZWN1dGlvbiIsImlTZWN0aW9uSW5kZXhNYXgiLCJzQ29tbWFuZCIsImdldENvbW1hbmQiLCJuZXdTZWN0aW9uIiwiaVNlbGVjdGVkU2VjdGlvbkluZGV4IiwiaW5kZXhPZlNlY3Rpb24iLCJfZ2V0Rm9vdGVyVmlzaWJpbGl0eSIsInNWaWV3SWQiLCJpc0hpZGRlbkRyYWZ0RW5hYmxlZCIsIm9NZXNzYWdlIiwiaXNFcnJvck1lc3NhZ2UiLCJ2YWxpZGF0aW9uIiwibWVzc2FnZVZhbGlkYXRpb24iLCJpc0VkaXRNb2RlIiwiY3VycmVudFBhZ2VWaWV3IiwiaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0VmlldyIsImdldFJvb3RDb250YWluZXIiLCJnZXRDdXJyZW50UGFnZSIsIm9NZXNzYWdlQnV0dG9uIiwib0l0ZW1CaW5kaW5nIiwiZ2V0TGVuZ3RoIiwib3BlbkJ5IiwiQnVzeUxvY2tlciIsImVkaXREb2N1bWVudCIsImZpbmFsbHkiLCJwcm9wZXJ0eVBhdGgiLCJMb2NhbFByb3BlcnR5IiwiJFByb3BlcnR5UGF0aCIsIlNlbWFudGljT2JqZWN0UHJvcGVydHkiLCJfdmFsaWRhdGVEb2N1bWVudCIsImdldEFjdGl2ZUVsZW1lbnQiLCJieVBhc3NTaWRlRWZmZWN0cyIsImlzVHJhbnNpZW50IiwiY3JlYXRlZCIsImhvbGRNZXNzYWdlc0ZvckNvbnRyb2wiLCJyZXQiLCJleGVjdXRlR2xvYmFsVmFsaWRhdGlvbiIsInNob3dNZXNzYWdlcyIsInNpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQiLCJnbG9iYWxTaWRlRWZmZWN0cyIsImdldEdsb2JhbE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJkcmFmdFJvb3RDb250ZXh0IiwiY3JlYXRlUm9vdENvbnRleHQiLCJEcmFmdCIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJpc0Nvbm5lY3RlZCIsInNraXBCaW5kaW5nVG9WaWV3IiwidXNlU2F2ZUFuZExlYXZlIiwiYXdhaXRDcmVhdGVEb2N1bWVudHMiLCJleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwibWVzc2FnZVBvcG92ZXJFcnIiLCJpc0NvbGxhYm9yYXRpb25FbmFibGVkIiwiZGlhbG9nQWN0aW9uIiwiQ29sbGFib3JhdGlvbkRpc2NhcmQiLCJnZXRVc2VyQWN0aW9uIiwiZXJyIiwiY3JlYXRpb25Sb3ciLCJ0YWJsZUJpbmRpbmciLCJjb250ZXh0S2V5cyIsInN0YXJ0c1dpdGgiLCJjcmVhdGVEb2N1bWVudCIsImNyZWF0ZUF0RW5kIiwiZ2V0QWdncmVnYXRpb24iLCJza2lwU2lkZUVmZmVjdHMiLCJpc1N0YW5kYXJkU2F2ZSIsImNvbW1hbmQiLCJiaW5kaW5ncyIsInNhdmVEb2N1bWVudCIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiX2NhbmNlbERvY3VtZW50IiwiY2FuY2VsQnV0dG9uIiwibGFzdEZvY3VzZWRDb250cm9sSWQiLCJzaG91bGRTa2lwRGlzY2FyZFBvcG92ZXIiLCJpc0RvY3VtZW50TW9kaWZpZWQiLCJVaU1vZGVsQ29uc3RhbnRzIiwiRG9jdW1lbnRNb2RpZmllZCIsImFmdGVyQ2FuY2VsIiwicHJvbWlzZVJlc3VsdCIsImNhbmNlbERvY3VtZW50Iiwic2tpcERpc2NhcmRQb3BvdmVyIiwiYXBwbHlEb2N1bWVudCIsInNob3dSZWxhdGVkQXBwcyIsInVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyIsIl9maW5kQ29udHJvbEluU3ViU2VjdGlvbiIsImFQYXJlbnRFbGVtZW50IiwiYVN1YnNlY3Rpb24iLCJhQ29udHJvbHMiLCJiSXNDaGFydCIsIml0ZW0xIiwib0VsZW1lbnQiLCJjaGFydENvbnRyb2wiLCJnZXRDaGFydENvbnRyb2wiLCJvU3ViRWxlbWVudCIsIl9nZXRBbGxCbG9ja3MiLCJfZmluZENoYXJ0cyIsImFDaGFydHMiLCJvQmxvY2siLCJvQ29udGVudCIsInNldFNob3dTaWRlQ29udGVudCIsIm9DaGFydENvbnRleHQiLCJzQ2hhcnRQYXRoIiwib0NvbnRleHREYXRhIiwib0NoYXJ0Q29udGV4dERhdGEiLCJfc2Nyb2xsVGFibGVzVG9Sb3ciLCJzUm93UGF0aCIsIlRhYmxlU2Nyb2xsZXIiLCJzY3JvbGxUYWJsZVRvUm93IiwiX21lcmdlTXVsdGlwbGVDb250ZXh0cyIsIm9QYWdlQ29udGV4dCIsImFMaW5lQ29udGV4dCIsImFBdHRyaWJ1dGVzIiwiYVBhZ2VBdHRyaWJ1dGVzIiwic01ldGFQYXRoTGluZSIsInNQYXRoTGluZSIsInNQYWdlUGF0aCIsIm9NZXRhTW9kZWwiLCJzTWV0YVBhdGhQYWdlIiwib1NpbmdsZUNvbnRleHQiLCJvU3ViQ2hhcnRDb250ZXh0RGF0YSIsImNvbnRleHREYXRhIiwiZW50aXR5U2V0IiwicmVtb3ZlU2Vuc2l0aXZlRGF0YSIsIm9QYWdlTGV2ZWxTViIsImFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50IiwiU2VsZWN0aW9uVmFyaWFudCIsInNlbGVjdGlvblZhcmlhbnQiLCJhdHRyaWJ1dGVzIiwib1ZpZXdEYXRhIiwib0NvbmZpZ3VyYXRpb25zIiwiY29udHJvbENvbmZpZ3VyYXRpb24iLCJhQ29uZmlndXJhdGlvbnMiLCJzS2V5Iiwib0NvbmZpZ3VyYXRpb24iLCJyZXF1ZXN0R3JvdXBJZCIsInBhZ2luYXRvckN1cnJlbnRDb250ZXh0IiwiYmluZGluZ1RvVXNlIiwicGFnaW5hdG9yIiwiaW5pdGlhbGl6ZSIsIm9EYXRhUG9pbnRzIiwiZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJnZXRPdXRib3VuZHMiLCJvU2hlbGxTZXJ2aWNlcyIsInJlcXVlc3RPYmplY3QiLCJmbkdldExpbmtzIiwiZm5PbkVycm9yIiwiZm5TZXRMaW5rRW5hYmxlbWVudCIsImlkIiwiYVN1cHBvcnRlZExpbmtzIiwic0xpbmtJZCIsInN1cHBvcnRlZCIsIm9TdWJEYXRhUG9pbnRzIiwib1BhZ2VEYXRhIiwib0RhdGFQb2ludCIsIm9MaW5rIiwib0xpbmtDb250ZXh0Iiwib0xpbmtEYXRhIiwib01peGVkQ29udGV4dCIsIm1lcmdlIiwib01hcHBpbmciLCJzTWFpblByb3BlcnR5Iiwic01hcHBlZFByb3BlcnR5IiwiaGFzT3duUHJvcGVydHkiLCJvTmV3TWFwcGluZyIsImlzTmF2aWdhdGlvblN1cHBvcnRlZCIsInBhcmFtcyIsImFMaW5rcyIsIl9maW5kU3VtbWFyaXplQnV0dG9uIiwib2JqZWN0UGFnZVRpdGxlIiwic3VtbWFyaXplQnV0dG9uIiwiYnV0dG9uIiwiZW5kc1dpdGgiLCJnZXRTdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbXMiLCJwcmVmZXJyZWRBY3Rpb24iLCJwcmVmZXJyZWRBY3Rpb25MZXZlbCIsInBhcnNlSW50Iiwic3BsaXQiLCJpc05hTiIsImdldFByZWZlcnJlZEFjdGlvblN0YXR1cyIsIkNhblBlcmZvcm0iLCJzZXRQcmVmZXJyZWRBY3Rpb25TdGF0dXMiLCJBbHJlYWR5UGVyZm9ybWVkIiwiZW52aXJvbm1lbnRTZXJ2aWNlIiwiZW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJTbWFydFN1bW1hcml6ZSIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJpbml0aWFsaXplciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZVdpdGhVSTUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiwgdXNpbmdFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwic2FwL2ZlL2NvcmUvQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHR5cGUgeyBTdGFydHVwUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCBQYWdlUmVhZHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BhZ2VSZWFkeVwiO1xuaW1wb3J0IFBhZ2luYXRvciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGFnaW5hdG9yXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgU2hhcmUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCBDb2xsYWJvcmF0aW9uTWFuYWdlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY2FyZHMvQ29sbGFib3JhdGlvbk1hbmFnZXJcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IE5hdmlnYXRpb25SZWFzb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvTmF2aWdhdGlvblJlYXNvblwiO1xuaW1wb3J0IHR5cGUgQ29tbWFuZEV4ZWN1dGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvQ29tbWFuZEV4ZWN1dGlvblwiO1xuaW1wb3J0IHsgUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9SZWNvbW1lbmRhdGlvbnMvQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nXCI7XG5pbXBvcnQgdHlwZSB7IEhpZGRlbkRyYWZ0LCBNaWNyb0NoYXJ0TWFuaWZlc3RDb25maWd1cmF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgQ3JlYXRpb25Nb2RlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB7IHR5cGUgV3JhcHBlZENhcmQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvQ29sbGFib3JhdGlvbk1hbmFnZXJTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgQ2hhcnRCbG9jayBmcm9tIFwic2FwL2ZlL21hY3Jvcy9DaGFydFwiO1xuaW1wb3J0IENvbW1vbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db21tb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIE1hY3JvQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL01hY3JvQVBJXCI7XG5pbXBvcnQgdHlwZSBNdWx0aVZhbHVlRmllbGRCbG9jayBmcm9tIFwic2FwL2ZlL21hY3Jvcy9NdWx0aVZhbHVlRmllbGRcIjtcbmltcG9ydCB0eXBlIFRhYmxlQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBFYXN5RmlsbEJ1dHRvbiBmcm9tIFwic2FwL2ZlL21hY3Jvcy9haS9FYXN5RmlsbEJ1dHRvblwiO1xuaW1wb3J0IHR5cGUgU3VtbWFyaXphdGlvbkJ1dHRvbiBmcm9tIFwic2FwL2ZlL21hY3Jvcy9haS9TdW1tYXJpemF0aW9uQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBTdWJTZWN0aW9uIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NvbnRyb2xzL3NlY3Rpb24vU3ViU2VjdGlvblwiO1xuaW1wb3J0IHR5cGUgRm9ybUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9mb3JtL0Zvcm1BUElcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VCdXR0b24gZnJvbSBcInNhcC9mZS9tYWNyb3MvbWVzc2FnZXMvTWVzc2FnZUJ1dHRvblwiO1xuaW1wb3J0IHR5cGUgU2hhcmVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3Mvc2hhcmUvU2hhcmVBUElcIjtcbmltcG9ydCB0eXBlIFRhYmxlQ3JlYXRpb25PcHRpb25zIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlQ3JlYXRpb25PcHRpb25zXCI7XG5pbXBvcnQgVGFibGVIZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVIZWxwZXJcIjtcbmltcG9ydCBUYWJsZVV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1V0aWxzXCI7XG5pbXBvcnQgU2VsZWN0aW9uVmFyaWFudCBmcm9tIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9iamVjdFBhZ2VFeHRlbnNpb25BUEkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBFeHRlbnNpb25BUEkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IENvbGxhYm9yYXRpb25EaXNjYXJkIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvY29tcG9uZW50cy9Db2xsYWJvcmF0aW9uRGlzY2FyZERpYWxvZ1wiO1xuaW1wb3J0IHR5cGUgU3ViU2VjdGlvbkJsb2NrIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvY29udHJvbHMvU3ViU2VjdGlvbkJsb2NrXCI7XG5pbXBvcnQgeyBwb2xsRm9yU2VjdGlvblN0YWJpbGl0eSB9IGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvaGVscGVycy9TZWN0aW9uTmF2aWdhdGlvbkhlbHBlclwiO1xuaW1wb3J0IFRhYmxlU2Nyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvVGFibGVTY3JvbGxlclwiO1xuaW1wb3J0IHR5cGUgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCB0eXBlIElucHV0QmFzZSBmcm9tIFwic2FwL20vSW5wdXRCYXNlXCI7XG5pbXBvcnQgSW5zdGFuY2VNYW5hZ2VyIGZyb20gXCJzYXAvbS9JbnN0YW5jZU1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIE1lbnVCdXR0b24gZnJvbSBcInNhcC9tL01lbnVCdXR0b25cIjtcbmltcG9ydCB0eXBlIE5hdkNvbnRhaW5lciBmcm9tIFwic2FwL20vTmF2Q29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgdHlwZSBTZWFyY2hGaWVsZCBmcm9tIFwic2FwL20vU2VhcmNoRmllbGRcIjtcbmltcG9ydCB0eXBlIFRvb2xiYXJTcGFjZXIgZnJvbSBcInNhcC9tL1Rvb2xiYXJTcGFjZXJcIjtcbmltcG9ydCBEZXZpY2UgZnJvbSBcInNhcC91aS9EZXZpY2VcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kRXhlY3V0aW9uJEV4ZWN1dGVFdmVudCB9IGZyb20gXCJzYXAvdWkvY29yZS9Db21tYW5kRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBDdXN0b21EYXRhIGZyb20gXCJzYXAvdWkvY29yZS9DdXN0b21EYXRhXCI7XG5pbXBvcnQgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgSW52aXNpYmxlVGV4dCBmcm9tIFwic2FwL3VpL2NvcmUvSW52aXNpYmxlVGV4dFwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL0xpYlwiO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdE91dGJvdW5kRW50cnkgfSBmcm9tIFwic2FwL3VpL2NvcmUvTWFuaWZlc3RcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgRHluYW1pY1NpZGVDb250ZW50IGZyb20gXCJzYXAvdWkvbGF5b3V0L0R5bmFtaWNTaWRlQ29udGVudFwiO1xuaW1wb3J0IHR5cGUgRm9ybSBmcm9tIFwic2FwL3VpL2xheW91dC9mb3JtL0Zvcm1cIjtcbmltcG9ydCB0eXBlIENoYXJ0IGZyb20gXCJzYXAvdWkvbWRjL0NoYXJ0XCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgVGFibGVUeXBlQmFzZSBmcm9tIFwic2FwL3VpL21kYy90YWJsZS9UYWJsZVR5cGVCYXNlXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29tcG9zaXRlQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbXBvc2l0ZUJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0xpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVNlY3Rpb25cIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VTdWJTZWN0aW9uIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlU3ViU2VjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxUeXBlIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3R5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IHR5cGUgQ29sbGFib3JhdGlvbkRyYWZ0IGZyb20gXCIuL2NvbXBvbmVudHMvQ29sbGFib3JhdGlvbkRyYWZ0XCI7XG5pbXBvcnQgQ29sbGFib3JhdGlvbk1hbmFnZXJPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvQ29sbGFib3JhdGlvbk1hbmFnZXJcIjtcbmltcG9ydCBJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxSb3V0aW5nT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IE1lc3NhZ2VIYW5kbGVyT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgUGFnaW5hdG9yT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL1BhZ2luYXRvclwiO1xuaW1wb3J0IFNoYXJlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9TaGFyZVwiO1xuaW1wb3J0IFZpZXdTdGF0ZU92ZXJyaWRlcyBmcm9tIFwiLi9vdmVycmlkZXMvVmlld1N0YXRlXCI7XG5cbmV4cG9ydCB0eXBlIEJpbmRpbmdQYXJhbXMgPSB7XG5cdHJlZGlyZWN0ZWRUb05vbkRyYWZ0Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRyZWFzb24/OiBOYXZpZ2F0aW9uUmVhc29uO1xuXHRiUGVyc2lzdE9QU2Nyb2xsPzogYm9vbGVhbjtcblx0bGlzdEJpbmRpbmc/OiBPRGF0YUxpc3RCaW5kaW5nO1xuXHRzaG93UGxhY2Vob2xkZXI/OiBib29sZWFuO1xuXHRyZXF1ZXN0T25CaW5kaW5nPzogc3RyaW5nW107XG5cdHRhcmdldENvbnRyb2xJZD86IHN0cmluZztcbn07XG5cbmNvbnN0IFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbDtcbmNvbnN0IFByZWZlcnJlZEFjdGlvblN0YXR1cyA9IEZFTGlicmFyeS5QcmVmZXJyZWRBY3Rpb25TdGF0dXNUeXBlO1xuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VDb250cm9sbGVyXCIpXG5jbGFzcyBPYmplY3RQYWdlQ29udHJvbGxlciBleHRlbmRzIFBhZ2VDb250cm9sbGVyIHtcblx0b1ZpZXchOiBGRVZpZXc7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFBsYWNlaG9sZGVyKVxuXHRwbGFjZWhvbGRlciE6IFBsYWNlaG9sZGVyO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihTaGFyZS5vdmVycmlkZShTaGFyZU92ZXJyaWRlcykpXG5cdHNoYXJlITogU2hhcmU7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKEludGVybmFsUm91dGluZy5vdmVycmlkZShJbnRlcm5hbFJvdXRpbmdPdmVycmlkZSkpXG5cdF9yb3V0aW5nITogSW50ZXJuYWxSb3V0aW5nO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihQYWdpbmF0b3Iub3ZlcnJpZGUoUGFnaW5hdG9yT3ZlcnJpZGUpKVxuXHRwYWdpbmF0b3IhOiBQYWdpbmF0b3I7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKE1lc3NhZ2VIYW5kbGVyLm92ZXJyaWRlKE1lc3NhZ2VIYW5kbGVyT3ZlcnJpZGUpKVxuXHRtZXNzYWdlSGFuZGxlciE6IE1lc3NhZ2VIYW5kbGVyO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUpKVxuXHRpbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cblx0QHVzaW5nRXh0ZW5zaW9uKENvbGxhYm9yYXRpb25NYW5hZ2VyLm92ZXJyaWRlKENvbGxhYm9yYXRpb25NYW5hZ2VyT3ZlcnJpZGUpKVxuXHRjb2xsYWJvcmF0aW9uTWFuYWdlciE6IENvbGxhYm9yYXRpb25NYW5hZ2VyO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihcblx0XHRJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbi5vdmVycmlkZSh7XG5cdFx0XHRnZXROYXZpZ2F0aW9uTW9kZTogZnVuY3Rpb24gKHRoaXM6IEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IGJJc1N0aWNreUVkaXRNb2RlID1cblx0XHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5nZXRTdGlja3lFZGl0TW9kZSAmJlxuXHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXIpLmdldFN0aWNreUVkaXRNb2RlKCk7XG5cdFx0XHRcdHJldHVybiBiSXNTdGlja3lFZGl0TW9kZSA/IFwiZXhwbGFjZVwiIDogdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0X2ludGVudEJhc2VkTmF2aWdhdGlvbiE6IEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihWaWV3U3RhdGUub3ZlcnJpZGUoVmlld1N0YXRlT3ZlcnJpZGVzKSlcblx0dmlld1N0YXRlITogVmlld1N0YXRlO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihcblx0XHRQYWdlUmVhZHkub3ZlcnJpZGUoe1xuXHRcdFx0aXNDb250ZXh0RXhwZWN0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fSlcblx0KVxuXHRwYWdlUmVhZHkhOiBQYWdlUmVhZHk7XG5cblx0cHJpdmF0ZSBtQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXM/OiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJPjtcblxuXHRwcm90ZWN0ZWQgZXh0ZW5zaW9uQVBJPzogT2JqZWN0UGFnZUV4dGVuc2lvbkFQSTtcblxuXHRwcml2YXRlIGJTZWN0aW9uTmF2aWdhdGVkPzogYm9vbGVhbjtcblxuXHRwcml2YXRlIGludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlU2V0VXAgPSBmYWxzZTtcblxuXHRwcml2YXRlIHN3aXRjaERyYWZ0QW5kQWN0aXZlUG9wT3Zlcj86IFBvcG92ZXI7XG5cblx0cHJpdmF0ZSBjdXJyZW50QmluZGluZz86IEJpbmRpbmc7XG5cblx0cHJpdmF0ZSBtZXNzYWdlQnV0dG9uITogTWVzc2FnZUJ1dHRvbjtcblxuXHRwcml2YXRlIGNvbGxhYm9yYXRpb25NZXNzYWdlPzogTWVzc2FnZTtcblxuXHRwcml2YXRlIG1lcmdlUGF0Y2hEcmFmdCA9IGZhbHNlO1xuXG5cdHByaXZhdGUgZmNsQ2xvc2VIYW5kbGVyU2V0ID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBhdXRvUXVldWVMb2NrOiBSZXR1cm5UeXBlPE9EYXRhTW9kZWxbXCJsb2NrXCJdPiB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIG1lc3NhZ2VCaW5kaW5nPzogQmluZGluZztcblxuXHRwcml2YXRlIHdhaXRGb3JWaXNpYmlsaXR5QmluZGluZ3MhOiBQcm9taXNlPHVua25vd24+W107XG5cblx0cHJpdmF0ZSBzdWJTZWN0aW9ucz86IHsgZmU6IFN1YlNlY3Rpb25bXTsgb3RoZXJzOiBPYmplY3RQYWdlU3ViU2VjdGlvbltdIH07XG5cblx0cHJpdmF0ZSBwcmV2aW91c0JpbmRpbmdDb250ZXh0UGF0aD86IHN0cmluZztcblxuXHRwcml2YXRlIHBlbmRpbmdUYXJnZXRDb250cm9sSWQ/OiBzdHJpbmc7XG5cblx0cHJpdmF0ZSB0YXJnZXRTdWJTZWN0aW9uPzogT2JqZWN0UGFnZVN1YlNlY3Rpb247XG5cblx0Ly8gRmxhZyB0byBwcmV2ZW50IFZpZXdTdGF0ZS5hcHBseSgpIGZyb20gb3ZlcnJpZGluZyBzZWN0aW9uIHNlbGVjdGlvbiBhZnRlciB1c2VyIGludGVyYWN0aW9uIG9yIHRhcmdldENvbnRyb2xJZCBuYXZpZ2F0aW9uXG5cdHByaXZhdGUgc2tpcFZpZXdTdGF0ZVNlY3Rpb25SZXN0b3JlID0gZmFsc2U7XG5cblx0Ly8gVHJhY2tzIGlmIHRoZSBiaW5kaW5nIGNvbnRleHQgcGF0aCBjaGFuZ2VkIChuZXcgZW50aXR5IHZzIHNhbWUgZW50aXR5IHJlLWJpbmRpbmcpXG5cdHByaXZhdGUgaXNOZXdCaW5kaW5nQ29udGV4dCA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGNvbnRyb2xzIChCdXR0b24gLyBNZW51QnV0dG9uKSB0aGF0IGFyZSBtYXJrZWQgYXMgXCJwcmltYXJ5IGFjdGlvblwiLlxuXHQgKiBUaGUgbWFya2VyIGlzIHNldCBieSB0aGUgY29udmVydGVycyB3aGVuIGFuIGFjdGlvbiBpcyBlbXBoYXNpemVkIChhbm5vdGF0aW9uLWJhc2VkKSBvclxuXHQgKiBjb25maWd1cmVkIGFzIHByaW1hcnlBY3Rpb24gKGN1c3RvbSBhY3Rpb24gZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpLlxuXHQgKiBAcGFyYW0gcm9vdCBSb290IGNvbnRyb2wgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tXG5cdCAqIEBwYXJhbSBvbmx5QWN0aW9uYWJsZSBJZiB0cnVlLCBvbmx5IGFjdGlvbmFibGUgKGVuYWJsZWQpIGNhbmRpZGF0ZXMgYXJlIHJldHVybmVkXG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGNvbnRyb2xzIHRoYXQgYXJlIGNhbmRpZGF0ZXMgZm9yIHByaW1hcnkgYWN0aW9uIHNob3J0Y3V0c1xuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0UHJpbWFyeUFjdGlvblNob3J0Y3V0Q2FuZGlkYXRlcyhyb290OiBNYW5hZ2VkT2JqZWN0LCBvbmx5QWN0aW9uYWJsZSA9IGZhbHNlKTogQXJyYXk8QnV0dG9uIHwgTWVudUJ1dHRvbj4ge1xuXHRcdHJldHVybiByb290LmZpbmRBZ2dyZWdhdGVkT2JqZWN0cyh0cnVlLCAob2JqZWN0OiBNYW5hZ2VkT2JqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBpc0J1dHRvbiA9IG9iamVjdC5pc0EoXCJzYXAubS5CdXR0b25cIik7XG5cdFx0XHRjb25zdCBpc01lbnVCdXR0b24gPSBvYmplY3QuaXNBKFwic2FwLm0uTWVudUJ1dHRvblwiKTtcblx0XHRcdGlmICghaXNCdXR0b24gJiYgIWlzTWVudUJ1dHRvbikge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjdHJsID0gb2JqZWN0IGFzIEJ1dHRvbiB8IE1lbnVCdXR0b247XG5cdFx0XHRjb25zdCBmbGFnID0gY3RybFxuXHRcdFx0XHQuZ2V0Q3VzdG9tRGF0YSgpXG5cdFx0XHRcdC5maW5kKChjdXN0b21EYXRhOiBDdXN0b21EYXRhKSA9PiBjdXN0b21EYXRhLmdldEtleSgpID09PSBcImZlUHJpbWFyeUFjdGlvblNob3J0Y3V0XCIpXG5cdFx0XHRcdD8uZ2V0VmFsdWUoKTtcblx0XHRcdGlmIChmbGFnICE9PSB0cnVlICYmIGZsYWcgIT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlmICghY3RybC5nZXRWaXNpYmxlKCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRm9yIGZvY3VzIHBsYWNlbWVudCB3ZSBtdXN0IGlnbm9yZSBkaXNhYmxlZCBjYW5kaWRhdGVzLlxuXHRcdFx0cmV0dXJuIG9ubHlBY3Rpb25hYmxlID8gY3RybC5nZXRFbmFibGVkKCkgOiB0cnVlO1xuXHRcdH0pIGFzIEFycmF5PEJ1dHRvbiB8IE1lbnVCdXR0b24+O1xuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEV4dGVuc2lvbkFQSShzSWQ/OiBzdHJpbmcpOiBFeHRlbnNpb25BUEkge1xuXHRcdGlmIChzSWQpIHtcblx0XHRcdC8vIHRvIGFsbG93IGxvY2FsIElEIHVzYWdlIGZvciBjdXN0b20gcGFnZXMgd2UnbGwgY3JlYXRlL3JldHVybiBvd24gaW5zdGFuY2VzIGZvciBjdXN0b20gc2VjdGlvbnNcblx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzID0gdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMgfHwge307XG5cblx0XHRcdGlmICghdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXSkge1xuXHRcdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdID0gbmV3IEV4dGVuc2lvbkFQSSh0aGlzLCBzSWQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghdGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdFx0dGhpcy5leHRlbnNpb25BUEkgPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXHRcdH1cblx0fVxuXG5cdG9uSW5pdCgpOiB2b2lkIHtcblx0XHRzdXBlci5vbkluaXQoKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cblx0XHQvLyBTZXR0aW5nIGRlZmF1bHRzIG9mIGludGVybmFsIG1vZGVsIGNvbnRleHRcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldE93bmVyQ29tcG9uZW50KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwiZXh0ZXJuYWxOYXZpZ2F0aW9uQ29udGV4dFwiLCB7IHBhZ2U6IHRydWUgfSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFxuXHRcdFx0XCJyZWxhdGVkQXBwc1wiLFxuXHRcdFx0e1xuXHRcdFx0XHR2aXNpYmlsaXR5OiBmYWxzZSxcblx0XHRcdFx0aXRlbXM6IG51bGxcblx0XHRcdH0sXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwiYmF0Y2hHcm91cHNcIiwgdGhpcy5fZ2V0QmF0Y2hHcm91cHNGb3JWaWV3KCkpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiLCBmYWxzZSk7XG5cblx0XHRpZiAodGhpcy5nZXREaXNhYmxlT2JqZWN0UGFnZVJlcXVlc3RPcHRpbWl6YXRpb24oKSkge1xuXHRcdFx0b09iamVjdFBhZ2UuYXR0YWNoRXZlbnQoXCJzdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0XCIsIHRoaXMuX2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQuYmluZCh0aGlzKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCkuZm9yRWFjaCgoc3ViU2VjdGlvbikgPT4ge1xuXHRcdFx0XHRzdWJTZWN0aW9uLmF0dGFjaEV2ZW50KFwic3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydFwiLCB0aGlzLl9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0LmJpbmQodGhpcykpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5tZXNzYWdlQnV0dG9uID0gdGhpcy5nZXRWaWV3KCkuYnlJZChcImZlOjpGb290ZXJCYXI6Ok1lc3NhZ2VCdXR0b25cIikgYXMgTWVzc2FnZUJ1dHRvbjtcblx0XHR0aGlzLm1lc3NhZ2VCaW5kaW5nID0gTWVzc2FnaW5nLmdldE1lc3NhZ2VNb2RlbCgpLmJpbmRMaXN0KFwiL1wiKTtcblx0XHR0aGlzLm1lc3NhZ2VCaW5kaW5nPy5hdHRhY2hDaGFuZ2UodGhpcy5fZm5TaG93T1BNZXNzYWdlLCB0aGlzKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwicm9vdEVkaXRFbmFibGVkXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcInJvb3RFZGl0VmlzaWJsZVwiLCB0cnVlLCB1bmRlZmluZWQsIHRydWUpO1xuXG5cdFx0dGhpcy5faGFuZGxlU21hcnRTdW1tYXJ5U3RhcnR1cEFjdGlvbigpO1xuXHR9XG5cblx0b25FeGl0KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcykge1xuXHRcdFx0Zm9yIChjb25zdCBzSWQgb2YgT2JqZWN0LmtleXModGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMpKSB7XG5cdFx0XHRcdGlmICh0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdKSB7XG5cdFx0XHRcdFx0dGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXS5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGRlbGV0ZSB0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcztcblx0XHR9XG5cdFx0aWYgKHRoaXMuZXh0ZW5zaW9uQVBJKSB7XG5cdFx0XHR0aGlzLmV4dGVuc2lvbkFQSS5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdGRlbGV0ZSB0aGlzLmV4dGVuc2lvbkFQSTtcblxuXHRcdGNvbnN0IG9NZXNzYWdlUG9wb3ZlciA9IHRoaXMubWVzc2FnZUJ1dHRvbiA/IHRoaXMubWVzc2FnZUJ1dHRvbi5vTWVzc2FnZVBvcG92ZXIgOiBudWxsO1xuXHRcdGlmIChvTWVzc2FnZVBvcG92ZXIgJiYgb01lc3NhZ2VQb3BvdmVyLmlzT3BlbigpKSB7XG5cdFx0XHRvTWVzc2FnZVBvcG92ZXIuY2xvc2UoKTtcblx0XHR9XG5cdFx0Ly93aGVuIGV4aXRpbmcgd2Ugc2V0IGtlZXBBbGl2ZSBjb250ZXh0IHRvIGZhbHNlXG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGlmIChvQ29udGV4dCAmJiBvQ29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdH1cblxuXHRcdHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTsgLy8gQ2xlYW51cCBjb2xsYWJvcmF0aW9uIGNvbm5lY3Rpb24gd2hlbiBsZWF2aW5nIHRoZSBhcHBcblxuXHRcdHRoaXMubWVzc2FnZUJpbmRpbmc/LmRldGFjaENoYW5nZSh0aGlzLl9mblNob3dPUE1lc3NhZ2UsIHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBzaG93IHRoZSBtZXNzYWdlIHN0cmlwIG9uIHRoZSBvYmplY3QgcGFnZS5cblx0ICpcblx0ICovXG5cdF9mblNob3dPUE1lc3NhZ2UoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuaXNTdXNwZW5kZWQoKSkge1xuXHRcdFx0Ly8gSWYgdGhlIGFwcCBpcyBzdXNwZW5kZWQsIHdlIGRvIG5vdCBzaG93IHRoZSBtZXNzYWdlcyAodGhlIE1lc3NhZ2VNb2RlbCBjb250YWlucyBtZXNzYWdlcyBmcm9tIHRoZSBhY3RpdmUgYXBwKS5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBleHRlbnNpb25BUEkgPSB0aGlzLmdldEV4dGVuc2lvbkFQSSgpO1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBtZXNzYWdlcyA9IE1lc3NhZ2luZz8uZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpWzBdID09PSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRcdH0pO1xuXG5cdFx0aWYgKGV4dGVuc2lvbkFQSSkge1xuXHRcdFx0ZXh0ZW5zaW9uQVBJLl9zaG93TWVzc2FnZXMobWVzc2FnZXMsIFwiQmFja2VuZFwiKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0VGFibGVCaW5kaW5nKG9UYWJsZTogVGFibGUpOiBPRGF0YUxpc3RCaW5kaW5nIHtcblx0XHRyZXR1cm4gb1RhYmxlICYmIG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkIHRoZSBzYXBVeEFQT2JqZWN0UGFnZVN1YlNlY3Rpb25GaXRDb250YWluZXIgQ1NTIGNsYXNzIHRvIGV2ZXJ5IHZpc2libGUgc3Vic2VjdGlvbiB0aGF0IGNvbnRhaW5zIG9ubHkgYSBzaW5nbGUgR3JpZFRhYmxlIG9yIFRyZWVUYWJsZS5cblx0ICogVGhpcyBtYWtlcyB0aGUgdGFibGUgZmlsbCB0aGUgZnVsbCBoZWlnaHQgb2YgaXRzIGNvbnRhaW5lciBzbyB0aGF0IHRoZSBzY3JvbGxiYXIgYXBwZWFycyBvbiB0aGUgdGFibGUgaXRzZWxmIHJhdGhlciB0aGFuIG9uIHRoZSBwYWdlLlxuXHQgKiBAcGFyYW0gc3ViU2VjdGlvbnMgVGhlIHN1YiBzZWN0aW9ucyB0byBsb29rIGZvclxuXHQgKi9cblx0cHJpdmF0ZSBjaGVja1NlY3Rpb25zRm9yTm9uUmVzcG9uc2l2ZVRhYmxlKHN1YlNlY3Rpb25zOiBPYmplY3RQYWdlU3ViU2VjdGlvbltdKTogdm9pZCB7XG5cdFx0Y29uc3QgY2hhbmdlQ2xhc3NGb3JUYWJsZXMgPSAoZXZlbnQ6IEV2ZW50LCB2aXNpYmxlU3ViU2VjdGlvbjogT2JqZWN0UGFnZVN1YlNlY3Rpb24pOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGJsb2NrcyA9IFsuLi52aXNpYmxlU3ViU2VjdGlvbi5nZXRCbG9ja3MoKSwgLi4udmlzaWJsZVN1YlNlY3Rpb24uZ2V0TW9yZUJsb2NrcygpXS5maWx0ZXIoKGJsb2NrKSA9PlxuXHRcdFx0XHRibG9jay5pc0EoXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuY29udHJvbHMuU3ViU2VjdGlvbkJsb2NrXCIpXG5cdFx0XHQpO1xuXHRcdFx0aWYgKGJsb2Nrcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0Y29uc3QgdGFibGUgPSB0aGlzLnNlYXJjaFRhYmxlSW5CbG9jayhibG9ja3NbMF0gYXMgU3ViU2VjdGlvbkJsb2NrKTtcblx0XHRcdFx0aWYgKCF0YWJsZSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCB0YWJsZVR5cGUgPSB0YWJsZS5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSAmJiAodGFibGUuZ2V0VHlwZSgpIGFzIFRhYmxlVHlwZUJhc2UpO1xuXHRcdFx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpPy5pc0E8VGFibGVBUEk+KFwic2FwLmZlLm1hY3Jvcy5UYWJsZVwiKSA/ICh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdGNvbnN0IHRhYmxlQ29udHJvbCA9IHRhYmxlQVBJPy5nZXRUYWJsZURlZmluaXRpb24oKS5jb250cm9sO1xuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR0YWJsZVR5cGUgJiZcblx0XHRcdFx0XHQodGFibGVUeXBlPy5pc0EoXCJzYXAudWkubWRjLnRhYmxlLkdyaWRUYWJsZVR5cGVcIikgfHwgdGFibGVUeXBlPy5pc0EoXCJzYXAudWkubWRjLnRhYmxlLlRyZWVUYWJsZVR5cGVcIikpICYmXG5cdFx0XHRcdFx0dGFibGVDb250cm9sPy5yb3dDb3VudE1vZGUgPT09IFwiQXV0b1wiICYmXG5cdFx0XHRcdFx0Ly8gRXhjbHVkZSBDcmVhdGlvblJvdyBtb2RlIHVubGVzcyBzZWN0aW9uTGF5b3V0IGlzIFRhYnM6IHRoZSBmaXQtY29udGFpbmVyIHN0eWxlIGNyZWF0ZXMgd2hpdGVzcGFjZSBpbiB0aGUgc3Vic2VjdGlvbiBpbiBlZGl0IG1vZGUgd2hlbiBDcmVhdGlvblJvdyBpcyB1c2VkIGluIFRhYmxlQ3JlYXRpb25PcHRpb25zXG5cdFx0XHRcdFx0KHRhYmxlQ29udHJvbD8uY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgfHwgdGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKS5zZWN0aW9uTGF5b3V0ID09PSBcIlRhYnNcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly9JbiBjYXNlIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGFibGUgaW4gYSBzdWJTZWN0aW9uIHdlIGZpdCB0aGF0IHRvIHRoZSB3aG9sZSBwYWdlIHNvIHRoYXQgdGhlIHNjcm9sbGJhciBjb21lcyBvbmx5IG9uIHRhYmxlIGFuZCBub3Qgb24gcGFnZVxuXHRcdFx0XHRcdHZpc2libGVTdWJTZWN0aW9uLmFkZFN0eWxlQ2xhc3MoXCJzYXBVeEFQT2JqZWN0UGFnZVN1YlNlY3Rpb25GaXRDb250YWluZXJcIik7XG5cdFx0XHRcdFx0dmlzaWJsZVN1YlNlY3Rpb24uZGV0YWNoRXZlbnQoXCJtb2RlbENvbnRleHRDaGFuZ2VcIiwgY2hhbmdlQ2xhc3NGb3JUYWJsZXMsIHRoaXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRmb3IgKGNvbnN0IHN1YlNlY3Rpb24gb2Ygc3ViU2VjdGlvbnMpIHtcblx0XHRcdGlmIChzdWJTZWN0aW9uLmdldFZpc2libGUoKSkge1xuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIGF0dGFjaCB0aGlzIGV2ZW50IGluIG9yZGVyIHRvIG1hbmFnZSB0aGUgT2JqZWN0IFBhZ2UgTGF6eSBMb2FkaW5nIG1lY2hhbmlzbVxuXHRcdFx0XHRzdWJTZWN0aW9uLmF0dGFjaEV2ZW50KFwibW9kZWxDb250ZXh0Q2hhbmdlXCIsIHN1YlNlY3Rpb24sIGNoYW5nZUNsYXNzRm9yVGFibGVzLCB0aGlzKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRmluZCBhIHRhYmxlIGluIGJsb2NrcyBvZiBzZWN0aW9uLlxuXHQgKiBAcGFyYW0gYmxvY2sgT25lIHN1YiBzZWN0aW9uIGJsb2NrXG5cdCAqIEByZXR1cm5zIFRhYmxlIGlmIGV4aXN0c1xuXHQgKi9cblx0cHJpdmF0ZSBzZWFyY2hUYWJsZUluQmxvY2soYmxvY2s6IFN1YlNlY3Rpb25CbG9jayk6IFRhYmxlIHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgdGFibGVBUEk6IFRhYmxlQVBJIHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGdldFRhYmxlQVBJID0gKGNvbnRyb2w6IENvbnRyb2wpOiBUYWJsZUFQSSB8IHVuZGVmaW5lZCA9PiB7XG5cdFx0XHQvLyBUaGUgdGFibGUgbWF5IGN1cnJlbnRseSBiZSBzaG93biBpbiBhIGZ1bGwgc2NyZWVuIGRpYWxvZywgd2UgY2FuIHRoZW4gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIFRhYmxlQVBJXG5cdFx0XHQvLyBjb250cm9sIGZyb20gdGhlIGN1c3RvbSBkYXRhIG9mIHRoZSBwbGFjZSBob2xkZXIgcGFuZWxcblx0XHRcdGlmIChjb250cm9sLmlzQShcInNhcC5tLlBhbmVsXCIpICYmIGNvbnRyb2wuZGF0YShcIkZ1bGxTY3JlZW5UYWJsZVBsYWNlSG9sZGVyXCIpKSB7XG5cdFx0XHRcdHJldHVybiBjb250cm9sLmRhdGEoXCJ0YWJsZUFQSXJlZmVyZW5jZVwiKTtcblx0XHRcdH0gZWxzZSBpZiAoY29udHJvbC5pc0EoXCJzYXAuZmUubWFjcm9zLlRhYmxlXCIpKSB7XG5cdFx0XHRcdHJldHVybiBjb250cm9sIGFzIFRhYmxlQVBJO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0aWYgKGJsb2NrLmlzQShcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5jb250cm9scy5TdWJTZWN0aW9uQmxvY2tcIikpIHtcblx0XHRcdGNvbnN0IGNvbnRyb2wgPSBibG9jay5jb250ZW50O1xuXHRcdFx0aWYgKGNvbnRyb2wuaXNBKFwic2FwLnVpLmxheW91dC5EeW5hbWljU2lkZUNvbnRlbnRcIikpIHtcblx0XHRcdFx0Y29uc3QgbWFpbkNvbnRlbnQgPSAoY29udHJvbCBhcyBEeW5hbWljU2lkZUNvbnRlbnQpLmdldE1haW5Db250ZW50KClbMF07XG5cdFx0XHRcdGNvbnN0IG1haW5Db250ZW50VGFibGVBUEkgPSBnZXRUYWJsZUFQSShtYWluQ29udGVudCk7XG5cdFx0XHRcdGlmIChtYWluQ29udGVudFRhYmxlQVBJKSB7XG5cdFx0XHRcdFx0dGFibGVBUEkgPSBtYWluQ29udGVudFRhYmxlQVBJO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHNpZGVDb250ZW50ID0gKGNvbnRyb2wgYXMgRHluYW1pY1NpZGVDb250ZW50KS5nZXRTaWRlQ29udGVudCgpWzBdO1xuXHRcdFx0XHRcdGNvbnN0IHNpZGVDb250ZW50VGFibGVBUEkgPSBnZXRUYWJsZUFQSShzaWRlQ29udGVudCk7XG5cdFx0XHRcdFx0aWYgKHNpZGVDb250ZW50VGFibGVBUEkpIHtcblx0XHRcdFx0XHRcdHRhYmxlQVBJID0gc2lkZUNvbnRlbnRUYWJsZUFQSTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRhYmxlQVBJID0gZ2V0VGFibGVBUEkoY29udHJvbCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0YWJsZUFQSSkge1xuXHRcdFx0XHRyZXR1cm4gdGFibGVBUEkuY29udGVudDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdG9uQmVmb3JlUmVuZGVyaW5nKCk6IHZvaWQge1xuXHRcdFBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcmluZy5hcHBseSh0aGlzKTtcblx0XHQvLyBJbiB0aGUgcmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCBzY2VuYXJpbyB3ZSBuZWVkIHRvIGVuc3VyZSBpbiBjYXNlIG9mIHJlbG9hZC9yZWZyZXNoIHRoYXQgdGhlIG1ldGEgbW9kZWwgaW4gdGhlIG1ldGhvZGUgcmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCBvZiB0aGUgRmllbGRSdW50aW1lIGlzIGF2YWlsYWJsZVxuXHRcdGlmICh0aGlzLm9WaWV3LmdldFZpZXdEYXRhKCk/LnJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QgJiYgQ29tbW9uSGVscGVyLmdldE1ldGFNb2RlbCgpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdENvbW1vbkhlbHBlci5zZXRNZXRhTW9kZWwodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0fVxuXHR9XG5cblx0b25BZnRlclJlbmRlcmluZygpOiB2b2lkIHtcblx0XHRsZXQgc3ViU2VjdGlvbnM6IE9iamVjdFBhZ2VTdWJTZWN0aW9uW107XG5cdFx0aWYgKHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkuZ2V0VXNlSWNvblRhYkJhcigpKSB7XG5cdFx0XHRjb25zdCBzZWN0aW9ucyA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkuZ2V0U2VjdGlvbnMoKTtcblx0XHRcdGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuXHRcdFx0XHRzdWJTZWN0aW9ucyA9IHNlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdFx0dGhpcy5jaGVja1NlY3Rpb25zRm9yTm9uUmVzcG9uc2l2ZVRhYmxlKHN1YlNlY3Rpb25zKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c3ViU2VjdGlvbnMgPSB0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpO1xuXHRcdFx0dGhpcy5jaGVja1NlY3Rpb25zRm9yTm9uUmVzcG9uc2l2ZVRhYmxlKHN1YlNlY3Rpb25zKTtcblx0XHR9XG5cdH1cblxuXHRfb25CZWZvcmVCaW5kaW5nKG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCwgbVBhcmFtZXRlcnM6IEJpbmRpbmdQYXJhbXMgPSB7fSk6IHZvaWQge1xuXHRcdC8vIFJlc2V0IGZsYWcgdG8gYWxsb3cgc2VjdGlvbiByZXN0b3JhdGlvbiBvbiB0aGlzIG5ldyBiaW5kaW5nIGNvbnRleHQuXG5cdFx0Ly8gVGhpcyBlbnN1cmVzIFZpZXdTdGF0ZS5hcHBseSgpIGNhbiBwcm9wZXJseSByZXN0b3JlIHNlY3Rpb25zIGFmdGVyIGRpc2NhcmQgb3IgcmUtbmF2aWdhdGlvbi5cblx0XHR0aGlzLnNraXBWaWV3U3RhdGVTZWN0aW9uUmVzdG9yZSA9IGZhbHNlO1xuXG5cdFx0Ly8gU3RvcmUgdGFyZ2V0Q29udHJvbElkIGZvciBzY3JvbGxpbmcgYWZ0ZXIgYmluZGluZyBjb21wbGV0ZXNcblx0XHR0aGlzLnBlbmRpbmdUYXJnZXRDb250cm9sSWQgPSBtUGFyYW1ldGVycy50YXJnZXRDb250cm9sSWQ7XG5cblx0XHQvLyBBcHBseSB0YXJnZXRDb250cm9sSWQgb25seSBvbiBpbml0aWFsIG5hdmlnYXRpb24gLSBkb24ndCBhcHBseSBkdXJpbmcgZWRpdC9zYXZlL2Rpc2NhcmQgdHJhbnNpdGlvbnNcblx0XHQvLyB0byBwcmVzZXJ2ZSB1c2VyJ3Mgc2VjdGlvbiBzZWxlY3Rpb24uIE5vdGU6IGdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIHJldHVybnMgdGhlIE9MRCBjb250ZXh0XG5cdFx0Ly8gdGhlcmVmb3JlIHRoZSBvQ29udGV4dCBwYXJhbWV0ZXIgaXMgdXNlZC5cblx0XHRjb25zdCBjdXJyZW50Q29udGV4dFBhdGggPSBvQ29udGV4dD8uZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IGdldEVudGl0eUlkZW50aXR5ID0gKHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG5cdFx0XHRpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHQvLyBSZW1vdmUgSXNBY3RpdmVFbnRpdHkgZnJvbSB0aGUgcGF0aCB0byBnZXQgZW50aXR5IGlkZW50aXR5XG5cdFx0XHQvLyBlLmcuLCBcIi9Qcm9kdWN0cyhJRD0xLElzQWN0aXZlRW50aXR5PXRydWUpXCIgLT4gXCIvUHJvZHVjdHMoSUQ9MSlcIlxuXHRcdFx0cmV0dXJuIHBhdGhcblx0XHRcdFx0LnJlcGxhY2UoLyw/SXNBY3RpdmVFbnRpdHk9KHRydWV8ZmFsc2UpLD8vLCBcIlwiKVxuXHRcdFx0XHQucmVwbGFjZSgvXFwoXFxzKiwvLCBcIihcIilcblx0XHRcdFx0LnJlcGxhY2UoLyxcXHMqXFwpLywgXCIpXCIpO1xuXHRcdH07XG5cdFx0Y29uc3QgY3VycmVudEVudGl0eUlkID0gZ2V0RW50aXR5SWRlbnRpdHkoY3VycmVudENvbnRleHRQYXRoKTtcblx0XHRjb25zdCBwcmV2aW91c0VudGl0eUlkID0gZ2V0RW50aXR5SWRlbnRpdHkodGhpcy5wcmV2aW91c0JpbmRpbmdDb250ZXh0UGF0aCk7XG5cdFx0dGhpcy5pc05ld0JpbmRpbmdDb250ZXh0ID0gcHJldmlvdXNFbnRpdHlJZCAhPT0gY3VycmVudEVudGl0eUlkO1xuXHRcdHRoaXMucHJldmlvdXNCaW5kaW5nQ29udGV4dFBhdGggPSBjdXJyZW50Q29udGV4dFBhdGg7XG5cdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKSxcblx0XHRcdG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKSxcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRvSW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIiksXG5cdFx0XHRhQmF0Y2hHcm91cHMgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJiYXRjaEdyb3Vwc1wiKTtcblx0XHRsZXQgb0Zhc3RDcmVhdGlvblJvdztcblx0XHRhQmF0Y2hHcm91cHMucHVzaChcIiRhdXRvXCIpO1xuXHRcdGlmIChtUGFyYW1ldGVycy5yZWFzb24gIT09IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24pIHtcblx0XHRcdHRoaXMuX2Nsb3NlU2lkZUNvbnRlbnQoKTtcblx0XHR9XG5cdFx0Y29uc3Qgb3BDb250ZXh0ID0gb09iamVjdFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRpZiAoXG5cdFx0XHRvcENvbnRleHQgJiZcblx0XHRcdG9wQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpICYmXG5cdFx0XHQhYUJhdGNoR3JvdXBzLnNvbWUob3BDb250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMuYmluZChvcENvbnRleHQuZ2V0TW9kZWwoKSkpXG5cdFx0KSB7XG5cdFx0XHQvKiBcdEluIGNhc2UgdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyBmb3IgdGhlIGNyZWF0aW9uIHJvdyBhbmQgbm8gb3RoZXJzIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGNoYW5nZXNcblx0XHRcdFx0XHRcdFx0XHRUT0RPOiB0aGlzIGlzIGp1c3QgYSBxdWljayBzb2x1dGlvbiwgdGhpcyBuZWVkcyB0byBiZSByZXdvcmtlZFxuXHRcdFx0XHRcdFx0XHRcdCovXG5cblx0XHRcdG9wQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIG5vdyB3ZSBoYXZlIHRvIHNldCB0aGUgYmluZGluZyBjb250ZXh0IHRvIG51bGwgZm9yIGV2ZXJ5IGZhc3QgY3JlYXRpb24gcm93XG5cdFx0Ly8gVE9ETzogR2V0IHJpZCBvZiB0aGlzIGNvZGluZyBvciBtb3ZlIGl0IHRvIGFub3RoZXIgbGF5ZXIgLSB0byBiZSBkaXNjdXNzZWQgd2l0aCBNREMgYW5kIG1vZGVsXG5cdFx0Zm9yIChjb25zdCBpdGVtIG9mIGFUYWJsZXMpIHtcblx0XHRcdG9GYXN0Q3JlYXRpb25Sb3cgPSBpdGVtLmdldENyZWF0aW9uUm93KCk7XG5cdFx0XHRpZiAob0Zhc3RDcmVhdGlvblJvdykge1xuXHRcdFx0XHRvRmFzdENyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNjcm9sbCB0byBwcmVzZW50IFNlY3Rpb24gc28gdGhhdCBiaW5kaW5ncyBhcmUgZW5hYmxlZCBkdXJpbmcgbmF2aWdhdGlvbiB0aHJvdWdoIHBhZ2luYXRvciBidXR0b25zLCBhcyB0aGVyZSBpcyBubyB2aWV3IHJlcmVuZGVyaW5nL3JlYmluZFxuXHRcdGNvbnN0IGZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvbiA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdGlmICghKG9PYmplY3RQYWdlIGFzIHsgaXNGaXJzdFJlbmRlcmluZz86ICgpID0+IGJvb2xlYW4gfSkuaXNGaXJzdFJlbmRlcmluZz8uKCkgJiYgIW1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwpIHtcblx0XHRcdFx0b09iamVjdFBhZ2Uuc2V0U2VsZWN0ZWRTZWN0aW9uKG51bGwgYXMgdW5rbm93biBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0b09iamVjdFBhZ2UuYXR0YWNoRXZlbnRPbmNlKFwibW9kZWxDb250ZXh0Q2hhbmdlXCIsIGZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvbik7XG5cblx0XHRjb25zdCBmbk9QUmVuZGVyaW5nTGF5b3V0ID0ge1xuXHRcdFx0b25BZnRlclJlbmRlcmluZzogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKT8uZWRpdGFibGVIZWFkZXJDb250ZW50KSB7XG5cdFx0XHRcdFx0Zm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b09iamVjdFBhZ2UucmVtb3ZlRXZlbnREZWxlZ2F0ZShmbk9QUmVuZGVyaW5nTGF5b3V0KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdG9PYmplY3RQYWdlLmFkZEV2ZW50RGVsZWdhdGUoZm5PUFJlbmRlcmluZ0xheW91dCk7XG5cblx0XHQvL1NldCB0aGUgQmluZGluZyBmb3IgUGFnaW5hdG9ycyB1c2luZyBMaXN0QmluZGluZyBJRFxuXHRcdHRoaXMuX2luaXRpYWxpemVQYWdpbmF0aW9uKG9Db250ZXh0LCBvSW50ZXJuYWxNb2RlbCwgbVBhcmFtZXRlcnM/Lmxpc3RCaW5kaW5nKTtcblxuXHRcdHRoaXMuX2Rpc2FibGVCbG9ja3NCaW5kaW5ncyhvT2JqZWN0UGFnZSk7XG5cblx0XHR0aGlzLnN1YlNlY3Rpb25zID0gdGhpcy5kaXNjb25uZWN0U3ViU2VjdGlvblZpc2liaWxpdHlPYnNlcnZlcnMob09iamVjdFBhZ2UpO1xuXHRcdHRoaXMud2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyA9IHRoaXMud2FpdEZvckFsbFN1YlNlY3Rpb25WaXNpYmlsaXR5QmluZGluZ3NSZXNvbHZlZCgpO1xuXG5cdFx0aWYgKHRoaXMucGxhY2Vob2xkZXIuaXNQbGFjZWhvbGRlckVuYWJsZWQoKSAmJiBtUGFyYW1ldGVycy5zaG93UGxhY2Vob2xkZXIpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRjb25zdCBvTmF2Q29udGFpbmVyID0gKG9WaWV3LmdldFBhcmVudCgpIGFzIHVua25vd24gYXMgeyBvQ29udGFpbmVyOiBDb250cm9sIH0pLm9Db250YWluZXIuZ2V0UGFyZW50KCk7XG5cdFx0XHRpZiAob05hdkNvbnRhaW5lcikge1xuXHRcdFx0XHR0aGlzLnBsYWNlaG9sZGVyLmVuYWJsZUFuaW1hdGlvbigpO1xuXHRcdFx0XHQob05hdkNvbnRhaW5lciBhcyB1bmtub3duIGFzIHsgc2hvd1BsYWNlaG9sZGVyOiBGdW5jdGlvbiB9KS5zaG93UGxhY2Vob2xkZXIoe30pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjb25uZWN0IHRoZSB2aXNpYmlsaXR5IG9ic2VydmVycyBvZiBhbGwgRkUgc3Vic2VjdGlvbnMuXG5cdCAqIEBwYXJhbSBvYmplY3RQYWdlTGF5b3V0XG5cdCAqIEByZXR1cm5zIFRoZSBzdWJzZWN0aW9ucyBpbmZvcm1hdGlvbiBvciB1bmRlZmluZWQgaWYgb3B0aW1pemF0aW9uIGlzIGRpc2FibGVkXG5cdCAqL1xuXHRkaXNjb25uZWN0U3ViU2VjdGlvblZpc2liaWxpdHlPYnNlcnZlcnMoXG5cdFx0b2JqZWN0UGFnZUxheW91dDogT2JqZWN0UGFnZUxheW91dFxuXHQpOiB7IGZlOiBTdWJTZWN0aW9uW107IG90aGVyczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSB9IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoIXRoaXMuZ2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uKCkpIHtcblx0XHRcdG9iamVjdFBhZ2VMYXlvdXQuc2V0VmlzaWJsZShmYWxzZSk7XG5cdFx0XHRjb25zdCBzdWJTZWN0aW9uc0luZm86IHtcblx0XHRcdFx0ZmU6IFN1YlNlY3Rpb25bXTtcblx0XHRcdFx0b3RoZXJzOiBPYmplY3RQYWdlU3ViU2VjdGlvbltdO1xuXHRcdFx0fSA9IHsgZmU6IFtdLCBvdGhlcnM6IFtdIH07XG5cdFx0XHR0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpLmZvckVhY2goKHN1YlNlY3Rpb24pID0+IHtcblx0XHRcdFx0aWYgKHN1YlNlY3Rpb24uaXNBPFN1YlNlY3Rpb24+KFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5zZWN0aW9uLlN1YlNlY3Rpb25cIikpIHtcblx0XHRcdFx0XHRzdWJTZWN0aW9uc0luZm8uZmUucHVzaChzdWJTZWN0aW9uKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdWJTZWN0aW9uc0luZm8ub3RoZXJzLnB1c2goc3ViU2VjdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0c3ViU2VjdGlvbnNJbmZvLmZlLmZvckVhY2goKHN1YlNlY3Rpb24pID0+IHN1YlNlY3Rpb24uZGlzY29ubmVjdFZpc2liaWxpdHlPYnNlcnZlcigpKTtcblx0XHRcdHJldHVybiBzdWJTZWN0aW9uc0luZm87XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBsb2FkaW5nIHN0cmF0ZWd5IGZvciB0aGUgb2JqZWN0IHBhZ2UuXG5cdCAqIEByZXR1cm5zIFRoZSBsb2FkaW5nIHN0cmF0ZWd5IGZvciB0aGUgb2JqZWN0IHBhZ2UuXG5cdCAqL1xuXHRnZXREaXNhYmxlT2JqZWN0UGFnZVJlcXVlc3RPcHRpbWl6YXRpb24oKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkuZGF0YShcImRpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvblwiKSA9PT0gXCJ0cnVlXCI7XG5cdH1cblxuXHRwcml2YXRlIGdldEZpcnN0RWRpdGFibGVJbnB1dCgpOiBVSTVFbGVtZW50IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBkb21FZGl0YWJsZUVsZW1lbnQgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLl9nZXRGaXJzdEVkaXRhYmxlSW5wdXQoKTtcblx0XHRyZXR1cm4gZG9tRWRpdGFibGVFbGVtZW50ID8gVUk1RWxlbWVudC5jbG9zZXN0VG8oZG9tRWRpdGFibGVFbGVtZW50KSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGZpcnN0IGNsaWNrYWJsZSBlbGVtZW50IGluIHRoZSBvYmplY3QgcGFnZS5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIG9iamVjdFBhZ2UgT2JqZWN0IFBhZ2UgTGF5b3V0IGNvbnRyb2xcblx0ICogQHJldHVybnMgVGhlIGZpcnN0IGNsaWNrYWJsZSBlbGVtZW50IGZvdW5kXG5cdCAqL1xuXHRwcml2YXRlIGdldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvYmplY3RQYWdlOiBPYmplY3RQYWdlTGF5b3V0KTogVUk1RWxlbWVudCB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gSW4gZGlzcGxheSBtb2RlLCBpZiBhIHZpc2libGUgcHJpbWFyeSBhY3Rpb24gd2l0aCB0aGUgZW1waGFzaXMgZXhpc3RzIGluIHRoZSBmb290ZXIsIGl0IG11c3QgYmUgdGhlIGZpcnN0IGNsaWNrYWJsZSBlbGVtZW50IG9uIHRoZSBwYWdlLlxuXHRcdGNvbnN0IGZvb3RlciA9IG9iamVjdFBhZ2UuZ2V0Rm9vdGVyKCk7XG5cdFx0Y29uc3QgZm9vdGVyUHJpbWFyeUFjdGlvbiA9IGZvb3RlclxuXHRcdFx0PyB0aGlzLl9nZXRQcmltYXJ5QWN0aW9uU2hvcnRjdXRDYW5kaWRhdGVzKGZvb3RlciBhcyB1bmtub3duIGFzIE1hbmFnZWRPYmplY3QsIHRydWUpWzBdXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRpZiAoZm9vdGVyUHJpbWFyeUFjdGlvbikge1xuXHRcdFx0cmV0dXJuIGZvb3RlclByaW1hcnlBY3Rpb247XG5cdFx0fVxuXHRcdC8vIEZhbGxiYWNrOiBmaXJzdCB2aXNpYmxlICYgZW5hYmxlZCBoZWFkZXIgYWN0aW9uIChFZGl0LCBldGMuKVxuXHRcdGxldCBmaXJzdENsaWNrYWJsZUVsZW1lbnQ7XG5cdFx0Y29uc3QgYWN0aW9ucyA9IG9iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSAmJiAob2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpIGFzIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUpLmdldEFjdGlvbnMoKTtcblx0XHRpZiAoYWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRmaXJzdENsaWNrYWJsZUVsZW1lbnQgPSBhY3Rpb25zLmZpbmQoZnVuY3Rpb24gKGFjdGlvbjogQ29udHJvbCkge1xuXHRcdFx0XHQvLyBEdWUgdG8gdGhlIGxlZnQgYWxpZ25tZW50IG9mIHRoZSBEcmFmdCBzd2l0Y2ggYW5kIHRoZSBjb2xsYWJvcmF0aXZlIGRyYWZ0IGF2YXRhciBjb250cm9sc1xuXHRcdFx0XHQvLyB0aGVyZSBpcyBhIFRvb2xiYXJTcGFjZXIgaW4gdGhlIGFjdGlvbnMgYWdncmVnYXRpb24gd2hpY2ggd2UgbmVlZCB0byBleGNsdWRlIGhlcmUhXG5cdFx0XHRcdC8vIER1ZSB0byB0aGUgQUNDIHJlcG9ydCwgd2UgYWxzbyBuZWVkIG5vdCB0byBjaGVjayBmb3IgdGhlIEludmlzaWJsZVRleHQgZWxlbWVudHNcblx0XHRcdFx0aWYgKGFjdGlvbi5pc0E8U3VtbWFyaXphdGlvbkJ1dHRvbj4oXCJzYXAuZmUubWFjcm9zLmFpLlN1bW1hcml6YXRpb25CdXR0b25cIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gYWN0aW9uLmdldENvbnRlbnQoKT8uZ2V0VmlzaWJsZSgpID8/IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdGFjdGlvbi5pc0E8U2hhcmVBUEk+KFwic2FwLmZlLm1hY3Jvcy5TaGFyZVwiKSB8fFxuXHRcdFx0XHRcdGFjdGlvbi5pc0E8RWFzeUZpbGxCdXR0b24+KFwic2FwLmZlLm1hY3Jvcy5haS5FYXN5RmlsbEJ1dHRvblwiKSB8fFxuXHRcdFx0XHRcdGFjdGlvbi5pc0E8Q29sbGFib3JhdGlvbkRyYWZ0PihcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5jb21wb25lbnRzLkNvbGxhYm9yYXRpb25EcmFmdFwiKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvLyBzaW5jZSBTaGFyZSBhbmQgQ29sbGFib3JhdGlvbkRyYWZ0IGRvZXMgbm90IGhhdmUgYSBkaXNhYmxlIHByb3BlcnR5XG5cdFx0XHRcdFx0Ly8gaGVuY2UgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZiBpdCBpcyBkaXNhYmxlZCBvciBub3Rcblx0XHRcdFx0XHRyZXR1cm4gYWN0aW9uLmdldFZpc2libGUoKTtcblx0XHRcdFx0fSBlbHNlIGlmICghYWN0aW9uLmlzQTxJbnZpc2libGVUZXh0PihcInNhcC51aS5jb3JlLkludmlzaWJsZVRleHRcIikgJiYgIWFjdGlvbi5pc0E8VG9vbGJhclNwYWNlcj4oXCJzYXAubS5Ub29sYmFyU3BhY2VyXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGFjdGlvbi5nZXRWaXNpYmxlKCkgJiYgKGFjdGlvbiBhcyBCdXR0b24pLmdldEVuYWJsZWQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBmaXJzdENsaWNrYWJsZUVsZW1lbnQ7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZSB0aGUgYmluZGluZ3Mgb2YgYmxvY2tzIGluIE9iamVjdCBQYWdlIExheW91dCBiYXNlZCBvbiB0aGUgaXRzIG92ZXJhbGwgY29udGVudC5cblx0ICogQHBhcmFtIG9iamVjdFBhZ2UgT2JqZWN0IFBhZ2UgTGF5b3V0IGNvbnRyb2xcblx0ICovXG5cdF9kaXNhYmxlQmxvY2tzQmluZGluZ3ModGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIG9iamVjdFBhZ2U6IE9iamVjdFBhZ2VMYXlvdXQpOiB2b2lkIHtcblx0XHRjb25zdCBhU2VjdGlvbnMgPSBvYmplY3RQYWdlLmdldFNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgYlVzZUljb25UYWJCYXIgPSBvYmplY3RQYWdlLmdldFVzZUljb25UYWJCYXIoKTtcblx0XHRsZXQgaVNraXAgPSAzOyAvLyAzIHNlY3Rpb25zL3N1YnNlY3Rpb25zIGFyZSBsb2FkZWQgaW5pdGlhbGx5LCB0aGUgb3RoZXJzIGFyZSBsb2FkZWQgbGF6aWx5XG5cdFx0Y29uc3QgYklzSW5FZGl0TW9kZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXHRcdGNvbnN0IGJFZGl0YWJsZUhlYWRlciA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkuZWRpdGFibGVIZWFkZXJDb250ZW50O1xuXHRcdGNvbnN0IGZpcnN0VmlzaWJpbGl0eUJpbmRpbmcgPSB0aGlzLl9nZXRmaXJzdFN1YlNlY3Rpb25WaXNpYmlsaXR5QmluZGluZygpO1xuXHRcdGZvciAobGV0IGlTZWN0aW9uID0gMDsgaVNlY3Rpb24gPCBhU2VjdGlvbnMubGVuZ3RoOyBpU2VjdGlvbisrKSB7XG5cdFx0XHRjb25zdCBvU2VjdGlvbiA9IGFTZWN0aW9uc1tpU2VjdGlvbl07XG5cdFx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpO1xuXHRcdFx0Zm9yIChsZXQgaVN1YlNlY3Rpb24gPSAwOyBpU3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IGlTdWJTZWN0aW9uKyssIGlTa2lwLS0pIHtcblx0XHRcdFx0Ly8gSW4gSWNvblRhYkJhciBtb2RlIGtlZXAgdGhlIHNlY29uZCBzZWN0aW9uIGJvdW5kIGlmIHRoZXJlIGlzIGFuIGVkaXRhYmxlIGhlYWRlciBhbmQgd2UgYXJlIHN3aXRjaGluZyB0byBkaXNwbGF5IG1vZGVcblx0XHRcdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBhU3ViU2VjdGlvbnNbaVN1YlNlY3Rpb25dO1xuXHRcdFx0XHRjb25zdCBkaXNhYmxlQmluZGluZ0NvbnRleHRDb25kaXRpb24gPVxuXHRcdFx0XHRcdCh0aGlzLmdldERpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvbigpICYmXG5cdFx0XHRcdFx0XHQoaVNraXAgPCAxIHx8IChiVXNlSWNvblRhYkJhciAmJiAoaVNlY3Rpb24gPiAxIHx8IChpU2VjdGlvbiA9PT0gMSAmJiAhYkVkaXRhYmxlSGVhZGVyICYmICFiSXNJbkVkaXRNb2RlKSkpKSkgfHxcblx0XHRcdFx0XHQoIXRoaXMuZ2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uKCkgJiZcblx0XHRcdFx0XHRcdCgoIWJVc2VJY29uVGFiQmFyICYmIChpU2tpcCA8IDEgfHwgb1N1YlNlY3Rpb24uZ2V0QmluZGluZyhcInZpc2libGVcIikpKSB8fCAvL2lmIHdlIGFyZSBub3QgaW4gSWNvblRhYkJhciBtb2RlLCBhbGwgc2VjdGlvbiB3aXRoIGluZGV4ID49MyBvciB3aXRoIHZpc2liaWxpdHkgYmluZGluZyBzaG91bGQgYmUgZGlzY29ubmVjdGVkXG5cdFx0XHRcdFx0XHRcdCghYlVzZUljb25UYWJCYXIgJiYgIWZpcnN0VmlzaWJpbGl0eUJpbmRpbmcgJiYgaVNraXAgPCAxKSB8fCAvLyBpZiBubyBzdWJzZWN0aW9uIGhhcyB2aXNpYmlsaXR5IGJpbmRpbmcgYW5kIHdlIGFyZSBub3QgaW4gSWNvblRhYkJhciBtb2RlXG5cdFx0XHRcdFx0XHRcdChiVXNlSWNvblRhYkJhciAmJiAoaVNlY3Rpb24gPiAxIHx8IChpU2VjdGlvbiA9PT0gMSAmJiAhYkVkaXRhYmxlSGVhZGVyICYmICFiSXNJbkVkaXRNb2RlKSkpKSk7XG5cdFx0XHRcdGlmIChkaXNhYmxlQmluZGluZ0NvbnRleHRDb25kaXRpb24pIHtcblx0XHRcdFx0XHQvLyBTdWJTZWN0aW9uJ3MgYmluZGluZyBpcyBlbmFibGVkLlxuXHRcdFx0XHRcdG9TdWJTZWN0aW9uLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCk7XG5cdFx0XHRcdFx0Y29uc3QgYmxvY2tzID0gb1N1YlNlY3Rpb24uZ2V0QmxvY2tzKCk7XG5cdFx0XHRcdFx0Ly8gU3ViU2VjdGlvbidzIGNvbnRlbnRzIGJpbmRpbmcgaXMgZGlzYWJsZWQuXG5cdFx0XHRcdFx0YmxvY2tzLmZvckVhY2goKGJsb2NrKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoYmxvY2suaXNBPFN1YlNlY3Rpb25CbG9jaz4oXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuY29udHJvbHMuU3ViU2VjdGlvbkJsb2NrXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGJsb2NrLmNvbnRlbnQuc2V0QmluZGluZ0NvbnRleHQ/LihudWxsKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGJsb2NrLnNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG9TdWJTZWN0aW9uLmdldE1vcmVCbG9ja3MoKS5mb3JFYWNoKChzdWJCbG9jaykgPT4gc3ViQmxvY2suc2V0QmluZGluZ0NvbnRleHQobnVsbCkpO1xuXHRcdFx0XHRcdG9TdWJTZWN0aW9uLmdldEFjdGlvbnMoKS5mb3JFYWNoKChhY3Rpb25zKSA9PiBhY3Rpb25zLnNldEJpbmRpbmdDb250ZXh0KG51bGwpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbihhU3ViU2VjdGlvbnM6IE9iamVjdFBhZ2VTdWJTZWN0aW9uW10pOiBJbnB1dEJhc2UgfCB1bmRlZmluZWQge1xuXHRcdGlmIChhU3ViU2VjdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRcdGZvciAoY29uc3Qgc3ViU2VjdGlvbiBvZiBhU3ViU2VjdGlvbnMpIHtcblx0XHRcdGNvbnN0IGFCbG9ja3MgPSBzdWJTZWN0aW9uLmdldEJsb2NrcygpIGFzIChGb3JtIHwgRm9ybUFQSSlbXTtcblxuXHRcdFx0aWYgKGFCbG9ja3MpIHtcblx0XHRcdFx0Zm9yIChjb25zdCBibG9ja0NvbnRyb2wgb2YgYUJsb2Nrcykge1xuXHRcdFx0XHRcdGlmIChibG9ja0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQ/LigpKSB7XG5cdFx0XHRcdFx0XHRsZXQgYUZvcm1Db250YWluZXJzO1xuXG5cdFx0XHRcdFx0XHRpZiAoYmxvY2tDb250cm9sLmlzQTxGb3JtPihcInNhcC51aS5sYXlvdXQuZm9ybS5Gb3JtXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGFGb3JtQ29udGFpbmVycyA9IGJsb2NrQ29udHJvbC5nZXRGb3JtQ29udGFpbmVycygpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChibG9ja0NvbnRyb2wuZ2V0Q29udGVudCAmJiBibG9ja0NvbnRyb2wuZ2V0Q29udGVudCgpPy5pc0E8Rm9ybT4oXCJzYXAudWkubGF5b3V0LmZvcm0uRm9ybVwiKSkge1xuXHRcdFx0XHRcdFx0XHRhRm9ybUNvbnRhaW5lcnMgPSAoYmxvY2tDb250cm9sLmdldENvbnRlbnQoKSBhcyBGb3JtKS5nZXRGb3JtQ29udGFpbmVycygpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChibG9ja0NvbnRyb2w/LmdldENvbnRlbnQ/LigpPy5pc0E8Rm9ybUFQST4oXCJzYXAuZmUubWFjcm9zLmZvcm0uRm9ybUFQSVwiKSkge1xuXHRcdFx0XHRcdFx0XHRhRm9ybUNvbnRhaW5lcnMgPSAoKGJsb2NrQ29udHJvbC5nZXRDb250ZW50KCkgYXMgRm9ybUFQSSkuZ2V0Q29udGVudCgpIGFzIEZvcm0pLmdldEZvcm1Db250YWluZXJzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYUZvcm1Db250YWluZXJzKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgZm9ybUNvbnRhaW5lciBvZiBhRm9ybUNvbnRhaW5lcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBhRm9ybUVsZW1lbnRzID0gZm9ybUNvbnRhaW5lci5nZXRGb3JtRWxlbWVudHMoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoYUZvcm1FbGVtZW50cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBmb3JtRWxlbWVudCBvZiBhRm9ybUVsZW1lbnRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGaWVsZHMgPSBmb3JtRWxlbWVudC5nZXRGaWVsZHMoKSBhcyBJbnB1dEJhc2VbXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZW1wdHlGaWVsZCA9IHRoaXMuZ2V0Rmlyc3RFbXB0eVJlcXVpcmVkRmllbGQoYUZpZWxkcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbXB0eUZpZWxkKSByZXR1cm4gZW1wdHlGaWVsZDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFZlcmlmeSBpZiB0aGUgZmlyc3QgZmllbGQgaXMgZW1wdHkgYW5kIHJlcXVpcmVkLlxuXHQgKiBAcGFyYW0gZmllbGRzIFRoZSBmaWVsZHMgdG8gY2hlY2tcblx0ICogQHJldHVybnMgVGhlIGZpcnN0IGVtcHR5IHJlcXVpcmVkIGZpZWxkIG9yIHVuZGVmaW5lZCBpZiBubyBzdWNoIGZpZWxkIGV4aXN0c1xuXHQgKi9cblx0Z2V0Rmlyc3RFbXB0eVJlcXVpcmVkRmllbGQoZmllbGRzOiBJbnB1dEJhc2VbXSk6IElucHV0QmFzZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKCFmaWVsZHMgfHwgZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG5cdFx0aWYgKCFmaWVsZHNbMF0uZ2V0UmVxdWlyZWQ/LigpKSByZXR1cm47XG5cblx0XHRsZXQgaXNFbXB0eSA9IGZhbHNlO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChmaWVsZHNbMF0uaXNBKFwic2FwLmZlLm1hY3Jvcy5NdWx0aVZhbHVlRmllbGRcIikpIHtcblx0XHRcdFx0Y29uc3QgaXRlbXMgPSAoZmllbGRzWzBdIGFzIHVua25vd24gYXMgTXVsdGlWYWx1ZUZpZWxkQmxvY2spLmdldE11bHRpVmFsdWVGaWVsZCgpLmdldEl0ZW1zKCk7XG5cdFx0XHRcdGlzRW1wdHkgPSBpdGVtcy5sZW5ndGggPT09IDA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IChmaWVsZHNbMF0gYXMgSW5wdXRCYXNlKS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRpc0VtcHR5ID0gIXZhbHVlO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoZW4gY2hlY2tpbmcgZmllbGQgcHJvcGVydGllczogJHtlcnJvcn1gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaXNFbXB0eSA/IGZpZWxkc1swXSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGluaXRpYWwgZm9jdXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAcGFyYW0gYVN1YlNlY3Rpb25zIE9iamVjdCBwYWdlIHN1YiBzZWN0aW9uc1xuXHQgKiBAcGFyYW0gZnJvbVRhYk5hdmlnYXRpb24gSW5kaWNhdGVzIGlmIHRoZSBmb2N1cyBpcyBzZXQgYWZ0ZXIgYSB0YWIgbmF2aWdhdGlvblxuXHQgKi9cblx0X3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShhU3ViU2VjdGlvbnM6IE9iamVjdFBhZ2VTdWJTZWN0aW9uW10sIGZyb21UYWJOYXZpZ2F0aW9uID0gZmFsc2UpOiB2b2lkIHtcblx0XHRzZXRUaW1lb3V0KFxuXHRcdFx0ZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKTogdm9pZCB7XG5cdFx0XHRcdC8vIFdlIHNldCB0aGUgZm9jdXMgaW4gYSB0aW1lZW91dCwgb3RoZXJ3aXNlIHRoZSBmb2N1cyBzb21ldGltZXMgZ29lcyB0byB0aGUgVGFiQmFyXG5cdFx0XHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdFx0Y29uc3Qgb01hbmRhdG9yeUZpZWxkID0gdGhpcy5fZ2V0Rmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkRnJvbVN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zKTtcblx0XHRcdFx0bGV0IG9GaWVsZFRvRm9jdXM6IFVJNUVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChvTWFuZGF0b3J5RmllbGQpIHtcblx0XHRcdFx0XHRpZiAob01hbmRhdG9yeUZpZWxkLmlzQShcInNhcC5mZS5tYWNyb3MuTXVsdGlWYWx1ZUZpZWxkXCIpKSB7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzID0gKG9NYW5kYXRvcnlGaWVsZCBhcyB1bmtub3duIGFzIE11bHRpVmFsdWVGaWVsZEJsb2NrKS5nZXRNdWx0aVZhbHVlRmllbGQoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IChcblx0XHRcdFx0XHRcdFx0b01hbmRhdG9yeUZpZWxkIGFzIHVua25vd24gYXMgeyBjb250ZW50OiB7IGdldENvbnRlbnRFZGl0OiBGdW5jdGlvbiB9IH1cblx0XHRcdFx0XHRcdCkuY29udGVudC5nZXRDb250ZW50RWRpdCgpWzBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzID0gdGhpcy5nZXRGaXJzdEVkaXRhYmxlSW5wdXQoKSA/PyB0aGlzLmdldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9GaWVsZFRvRm9jdXMpIHtcblx0XHRcdFx0XHRjb25zdCBmb2N1c0luZm8gPSBvRmllbGRUb0ZvY3VzLmdldEZvY3VzSW5mbygpIGFzIHsgdGFyZ2V0SW5mbzogb2JqZWN0IH07XG5cdFx0XHRcdFx0Zm9jdXNJbmZvLnRhcmdldEluZm8gPSB7IHNpbGVudDogdHJ1ZSB9O1xuXHRcdFx0XHRcdGlmIChvRmllbGRUb0ZvY3VzLmlzQShcInNhcC51aS5tZGMuZmllbGQuRmllbGRJbnB1dFwiKSkge1xuXHRcdFx0XHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IG9GaWVsZFRvRm9jdXMuZ2V0UGFyZW50KCkgYXMgVUk1RWxlbWVudCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzPy5pc0E8U2VhcmNoRmllbGQ+KFwic2FwLm0uU2VhcmNoRmllbGRcIikgJiZcblx0XHRcdFx0XHRcdG9GaWVsZFRvRm9jdXMuZ2V0RW5hYmxlU3VnZ2VzdGlvbnMoKSAmJlxuXHRcdFx0XHRcdFx0IW9GaWVsZFRvRm9jdXMuaXNCb3VuZChcImVuYWJsZVN1Z2dlc3Rpb25zXCIpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBmb2N1cyBpcyBzZXQgb24gYSBzZWFyY2ggZmllbGQgd2l0aCBzdWdnZXN0aW9ucywgd2UgdGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgc3VnZ2VzdGlvbnMgdG8gYXZvaWQgdHJpZ2dlcmluZyB0aGVtIG9uIGZvY3VzXG5cdFx0XHRcdFx0XHQvLyB1bmxlc3MgdGhpcyBwcm9wZXJ0eSBpcyBib3VuZCAodG8gYXZvaWQgbW9kaWZ5aW5nIHNvbWV0aGluZyBpbiBhIG1vZGVsKVxuXHRcdFx0XHRcdFx0b0ZpZWxkVG9Gb2N1cy5zZXRFbmFibGVTdWdnZXN0aW9ucyhmYWxzZSk7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzLmZvY3VzKGZvY3VzSW5mbyk7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzLnNldEVuYWJsZVN1Z2dlc3Rpb25zKHRydWUpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzPy5mb2N1cyhmb2N1c0luZm8pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fS5iaW5kKHRoaXMpLFxuXHRcdFx0ZnJvbVRhYk5hdmlnYXRpb24gPyAzMDAgOiAwXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGZpcnN0IHN1Yi1zZWN0aW9uIHdpdGggYSB2aXNpYmlsaXR5IGJvdW5kIHRvIHRoZSBtb2RlbCBvZiB0aGUgdmlldy5cblx0ICogU2VjdGlvbnMgd2l0aCBiaW5kaW5ncyBvbiBpbnRlcm5hbCBtb2RlbHMgb25seSBhcmUgaWdub3JlZC5cblx0ICogQHJldHVybnMgVGhlIHZpc2liaWxpdHkgYmluZGluZyBvZiB0aGUgZmlyc3Qgc3ViLXNlY3Rpb24gb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cblx0ICovXG5cdF9nZXRmaXJzdFN1YlNlY3Rpb25WaXNpYmlsaXR5QmluZGluZygpOiBCaW5kaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBhbGxzdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgY3VycmVudE1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRyZXR1cm4gYWxsc3ViU2VjdGlvbnNcblx0XHRcdC5maW5kKFxuXHRcdFx0XHQoc3ViU2VjdGlvbikgPT5cblx0XHRcdFx0XHQoc3ViU2VjdGlvbi5nZXRCaW5kaW5nKFwidmlzaWJsZVwiKSBhcyBDb21wb3NpdGVCaW5kaW5nIHwgdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0Py5nZXRCaW5kaW5ncz8uKClcblx0XHRcdFx0XHRcdC5zb21lKChiaW5kaW5nKSA9PiBiaW5kaW5nLmdldE1vZGVsKCkgPT09IGN1cnJlbnRNb2RlbClcblx0XHRcdClcblx0XHRcdD8uZ2V0QmluZGluZyhcInZpc2libGVcIik7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgYWxsIHN1YnNlY3Rpb24gdmlzaWJpbGl0eSBiaW5kaW5ncyB0byBiZSByZXNvbHZlZC5cblx0ICogVGhpcyBtZXRob2QgbGlzdGVucyBmb3IgdGhlICd2aXNpYmlsaXR5Q2hhbmdlZCcgZXZlbnQgIC4gVGhlIGNoYW5nZSBldmVudCBpcyBmaXJlZCBldmVuIGlmIHRoZSB2YWx1ZXMgYXJlIG5vdCBjaGFuZ2VkIGJ1dCBqdXN0IHJlc29sdmVkLlxuXHQgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBwcm9taXNlcyB0aGF0IHJlc29sdmUgd2hlbiBlYWNoIHZpc2liaWxpdHkgYmluZGluZyBpcyByZXNvbHZlZC5cblx0ICovXG5cdHdhaXRGb3JBbGxTdWJTZWN0aW9uVmlzaWJpbGl0eUJpbmRpbmdzUmVzb2x2ZWQoKTogUHJvbWlzZTx1bmtub3duPltdIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKVxuXHRcdFx0LmZpbHRlcihcblx0XHRcdFx0KHN1YlNlY3Rpb24pID0+IHN1YlNlY3Rpb24uaXNBPFN1YlNlY3Rpb24+KFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5zZWN0aW9uLlN1YlNlY3Rpb25cIikgJiYgc3ViU2VjdGlvbi5nZXRCaW5kaW5nKFwidmlzaWJsZVwiKVxuXHRcdFx0KSAvL2ZpbHRlcmluZyBvbiBGRSBzdWJzZWN0aW9ucyB3aXRoIHZpc2liaWxpdHkgYmluZGluZylcblx0XHRcdC5tYXAoYXN5bmMgKHN1YlNlY3Rpb24pID0+IHtcblx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzdWJTZWN0aW9uLmF0dGFjaEV2ZW50T25jZShcInZpc2liaWxpdHlDaGFuZ2VkXCIsIHJlc29sdmUpKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0X2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQob0V2ZW50OiBVSTVFdmVudDx7IHN1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uIH0+KTogdm9pZCB7XG5cdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3ViU2VjdGlvblwiKTtcblx0XHRpZiAob1N1YlNlY3Rpb24uaXNBPFN1YlNlY3Rpb24+KFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5zZWN0aW9uLlN1YlNlY3Rpb25cIikpIHtcblx0XHRcdG9TdWJTZWN0aW9uLmhhbmRsZVN1YlNlY3Rpb25DcmVhdGVkKHRoaXMuZ2V0VmlldygpKTtcblx0XHR9XG5cdFx0Y29uc3QgYmxvY2tzID0gb1N1YlNlY3Rpb24uZ2V0QmxvY2tzKCk7XG5cdFx0YmxvY2tzLmZvckVhY2goKGJsb2NrKSA9PiB7XG5cdFx0XHRpZiAoYmxvY2suaXNBPFN1YlNlY3Rpb25CbG9jaz4oXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuY29udHJvbHMuU3ViU2VjdGlvbkJsb2NrXCIpKSB7XG5cdFx0XHRcdGJsb2NrLmNvbnRlbnQuc2V0QmluZGluZ0NvbnRleHQ/Lih1bmRlZmluZWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YmxvY2suc2V0QmluZGluZ0NvbnRleHQodW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvU3ViU2VjdGlvbi5nZXRNb3JlQmxvY2tzKCkuZm9yRWFjaCgoc3ViQmxvY2spID0+IHN1YkJsb2NrLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCkpO1xuXHRcdG9TdWJTZWN0aW9uLmdldEFjdGlvbnMoKS5mb3JFYWNoKChhY3Rpb25zKSA9PiBhY3Rpb25zLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCkpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JbkRyYWZ0KG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IHZvaWQge1xuXHRcdHRoaXMubWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHQvLyBGdW5jdGlvbiB0byBuYXZpZ2F0ZSBiYWNrLCBvciBkaXNwbGF5IHRoZSBsYXVuY2hwYWQgaWYgd2UncmUgb24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGhpc3Rvcnlcblx0XHRjb25zdCBuYXZCYWNrID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0Ly8gVXNlIHRoZSBuZXcgTmF2aWdhdGlvbiBBUEkgaWYgaXQncyBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXIsIHRvIGNoZWNrIGlmIHdlIGNhbiBnbyBiYWNrIGluIGhpc3RvcnkuXG5cdFx0XHRjb25zdCBjYW5Hb0JhY2sgPSAod2luZG93IGFzIHsgbmF2aWdhdGlvbj86IHsgY2FuR29CYWNrPzogYm9vbGVhbiB9IH0pLm5hdmlnYXRpb24/LmNhbkdvQmFjaztcblx0XHRcdGlmIChjYW5Hb0JhY2sgPT09IHRydWUpIHtcblx0XHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0XHR9IGVsc2UgaWYgKGNhbkdvQmFjayA9PT0gZmFsc2UpIHtcblx0XHRcdFx0dGhpcy5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBGYWxsYmFjayBpbiBjYXNlIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgTmF2aWdhdGlvbiBBUElcblx0XHRcdFx0Y29uc3QgY3VycmVudFVSTCA9IGRvY3VtZW50LlVSTDtcblx0XHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlcmUgaXMgbm8gcHJldmlvdXMgcGFnZSBpbiB0aGUgaGlzdG9yeSwgaGlzdG9yeS5iYWNrIGRvZXMgbm90aGluZy5cblx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHVzZSBuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCwgdGhhdCB3aWxsIGRpc3BsYXkgdGhlIGhvbWUgcGFnZVxuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRpZiAoZG9jdW1lbnQuVVJMID09PSBjdXJyZW50VVJMKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIDUwMCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGlmICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkuY2hlY2tJZkJhY2tIYXNTYW1lQ29udGV4dCgpKSB7XG5cdFx0XHQvLyBCYWNrIG5hdiB3aWxsIGtlZXAgdGhlIHNhbWUgY29udGV4dCAtLT4gbm8gbmVlZCB0byBkaXNwbGF5IHRoZSBkaWFsb2dcblx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdH0gZWxzZSBpZiAoIXRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdC8vIFRoaXMgb2JqZWN0IHBhZ2UgZG9lc24ndCBoYXZlIGEgYmluZGluZyBjb250ZXh0LCBidXQgc3RpbGwgaGFuZGxlcyB0aGUgc2hlbGwgYmFjayBuYXZpZ2F0aW9uIC0tPiBwZm9ybSB0aGUgbmF2IGJhY2sgYW5kIHJlbW92ZSB0aGUgbmF2YmFjayBoYW5kbGVyIGFzIGl0IG1ha2VzIG5vIHNlbnNlIGFueSBsb25nZXJcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0LmdldFNoZWxsU2VydmljZXMoKVxuXHRcdFx0XHQuc2V0QmFja05hdmlnYXRpb24odW5kZWZpbmVkKVxuXHRcdFx0XHQudGhlbihuYXZCYWNrKVxuXHRcdFx0XHQuY2F0Y2goKGUpID0+IHtcblx0XHRcdFx0XHRMb2cud2FybmluZyhcIkVycm9yIHdoaWxlIHNldHRpbmcgYmFjayBuYXZpZ2F0aW9uXCIsIGUpO1xuXHRcdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaGlkZGVuRHJhZnRFbmFibGVkID0gKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk/LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCk/LmdldENhcGFiaWxpdGllcygpPy5IaWRkZW5EcmFmdCBhcyBIaWRkZW5EcmFmdClcblx0XHRcdFx0Py5lbmFibGVkO1xuXHRcdFx0ZHJhZnQucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24oXG5cdFx0XHRcdG5hdkJhY2ssXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdGhpZGRlbkRyYWZ0RW5hYmxlZCA/IHRydWUgOiB1bmRlZmluZWRcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRfb25BZnRlckJpbmRpbmcoaW5wdXRCaW5kaW5nQ29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQsIG1QYXJhbWV0ZXJzOiBCaW5kaW5nUGFyYW1zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IHZpZXdMZXZlbCA9IHZpZXc/LmdldFZpZXdEYXRhKCk/LnZpZXdMZXZlbDtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKTtcblx0XHRpZiAoW05hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24sIE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3NdLmluY2x1ZGVzKG1QYXJhbWV0ZXJzPy5yZWFzb24gYXMgTmF2aWdhdGlvblJlYXNvbikpIHtcblx0XHRcdHRoaXMuZWRpdEZsb3cuc3RvcmVTaWJsaW5nQ29udGV4dERhdGEoaW5wdXRCaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zaWRlRWZmZWN0cy5jbGVhckZpZWxkR3JvdXBzVmFsaWRpdHkoKTtcblxuXHRcdC8vIFRPRE86IHRoaXMgaXMgb25seSBhIHRlbXAgc29sdXRpb24gYXMgbG9uZyBhcyB0aGUgbW9kZWwgZml4IHRoZSBjYWNoZSBpc3N1ZSBhbmQgd2UgdXNlIHRoaXMgYWRkaXRpb25hbFxuXHRcdC8vIGJpbmRpbmcgd2l0aCBvd25SZXF1ZXN0XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBvT2JqZWN0UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXG5cdFx0bGV0IGFJQk5BY3Rpb25zOiBVSTVFbGVtZW50W10gPSBbXTtcblx0XHRvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikge1xuXHRcdFx0b1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU3ViU2VjdGlvbjogT2JqZWN0UGFnZVN1YlNlY3Rpb24pIHtcblx0XHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9TdWJTZWN0aW9uLCBhSUJOQWN0aW9ucyk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdC8vIEFzc2lnbiBpbnRlcm5hbCBiaW5kaW5nIGNvbnRleHRzIHRvIG9Gb3JtQ29udGFpbmVyOlxuXHRcdC8vIDEuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhc3NpZ24gdGhlIGludGVybmFsIGJpbmRpbmcgY29udGV4dCB0byB0aGUgWE1MIGZyYWdtZW50XG5cdFx0Ly8gKEZvcm1Db250YWluZXIuZnJhZ21lbnQueG1sKSB5ZXQgLSBpdCBpcyB1c2VkIGFscmVhZHkgZm9yIHRoZSBkYXRhLXN0cnVjdHVyZS5cblx0XHQvLyAyLiBBbm90aGVyIHByb2JsZW0gaXMsIHRoYXQgRm9ybUNvbnRhaW5lcnMgYXNzaWduZWQgdG8gYSAnTW9yZUJsb2NrJyBkb2VzIG5vdCBoYXZlIGFuXG5cdFx0Ly8gaW50ZXJuYWwgbW9kZWwgY29udGV4dCBhdCBhbGwuXG5cblx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogVGFibGUpIHtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0aWYgKG9JbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIsIHt9KTtcblxuXHRcdFx0XHRhSUJOQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob1RhYmxlLCBhSUJOQWN0aW9ucyk7XG5cblx0XHRcdFx0Ly8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIEJDUDogMjA4MDIxODAwNFxuXHRcdFx0XHQvLyBOZWVkIHRvIGZpeCB3aXRoIEJMSTogRklPUklURUNIUDEtMTUyNzRcblx0XHRcdFx0Ly8gb25seSBmb3IgZWRpdCBtb2RlLCB3ZSBjbGVhciB0aGUgdGFibGUgY2FjaGVcblx0XHRcdFx0Ly8gV29ya2Fyb3VuZCBzdGFydHMgaGVyZSEhXG5cdFx0XHRcdGNvbnN0IG9UYWJsZVJvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRpZiAob1RhYmxlUm93QmluZGluZykge1xuXHRcdFx0XHRcdGlmIChNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob1RhYmxlUm93QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdFx0Ly8gYXBwbHkgZm9yIGJvdGggZWRpdCBhbmQgZGlzcGxheSBtb2RlIGluIHN0aWNreVxuXHRcdFx0XHRcdFx0KG9UYWJsZVJvd0JpbmRpbmcgYXMgdW5rbm93biBhcyB7IHJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzOiBGdW5jdGlvbiB9KS5yZW1vdmVDYWNoZXNBbmRNZXNzYWdlcyhcIlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gV29ya2Fyb3VuZCBlbmRzIGhlcmUhIVxuXG5cdFx0XHRcdC8vIENsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHRhYmxlIGFuZCB1cGRhdGUgYWN0aW9uIGVuYWJsZW1lbnQgYWNjb3JkaW5nbHlcblx0XHRcdFx0Ly8gV2lsbCB0byBiZSBmaXhlZCB3aXRoIEJMSTogRklPUklURUNIUDEtMjQzMThcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBvVGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRcdGNvbnN0IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgPSB0YWJsZUFQSSA/IEpTT04ucGFyc2UodGFibGVBUEkudGFibGVEZWZpbml0aW9uLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCkgOiB7fTtcblxuXHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQob0ludGVybmFsTW9kZWxDb250ZXh0LCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBbXSwgXCJ0YWJsZVwiKTtcblxuXHRcdFx0XHRvVGFibGUuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvL1JldHJpZXZlIE9iamVjdCBQYWdlIGhlYWRlciBhY3Rpb25zIGZyb20gT2JqZWN0IFBhZ2UgdGl0bGUgY29udHJvbFxuXHRcdGNvbnN0IG9PYmplY3RQYWdlVGl0bGUgPSBvT2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpIGFzIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGU7XG5cdFx0bGV0IGFJQk5IZWFkZXJBY3Rpb25zOiBVSTVFbGVtZW50W10gPSBbXTtcblx0XHRhSUJOSGVhZGVyQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob09iamVjdFBhZ2VUaXRsZSwgYUlCTkhlYWRlckFjdGlvbnMpO1xuXHRcdGFJQk5BY3Rpb25zID0gYUlCTkFjdGlvbnMuY29uY2F0KGFJQk5IZWFkZXJBY3Rpb25zKTtcblx0XHRDb21tb25VdGlscy51cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eShhSUJOQWN0aW9ucywgdGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0bGV0IG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRcdG9GaW5hbFVJU3RhdGU6IFByb21pc2U8dW5rbm93bj4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdC8vIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYXQgdGhlIGFsbFxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvVGFibGVcblx0XHQgKi9cblx0XHRjb25zdCBoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMgPSAob1RhYmxlOiBUYWJsZSk6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcob1RhYmxlKSxcblx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdFRhYmxlSGVscGVyLmVuYWJsZUZhc3RDcmVhdGlvblJvdyhcblx0XHRcdFx0XHRcdG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLFxuXHRcdFx0XHRcdFx0b0JpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0b0JpbmRpbmcuZ2V0Q29udGV4dCgpLFxuXHRcdFx0XHRcdFx0b01vZGVsLFxuXHRcdFx0XHRcdFx0b0ZpbmFsVUlTdGF0ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH07XG5cblx0XHRcdGlmICghb0JpbmRpbmcpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBFeHBlY3RlZCBiaW5kaW5nIG1pc3NpbmcgZm9yIHRhYmxlOiAke29UYWJsZS5nZXRJZCgpfWApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBmbkhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRpZiAob0JpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMoKTtcblx0XHRcdFx0XHRcdG9CaW5kaW5nLmRldGFjaENoYW5nZShmbkhhbmRsZUNoYW5nZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvQmluZGluZy5hdHRhY2hDaGFuZ2UoZm5IYW5kbGVDaGFuZ2UpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoYmluZGluZ0NvbnRleHQpIHtcblx0XHRcdG9Nb2RlbCA9IGJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCk7XG5cblx0XHRcdC8vIFN0b3JlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBpbiBpbnRlcm5hbCBtb2RlbCBmb3IgYWNjZXNzIGJ5IGNvbnRyb2xsZXIgZXh0ZW5zaW9uc1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcIm5hdmlnYXRpb25QYXJhbWV0ZXJzXCIsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcHV0ZSBFZGl0IE1vZGVcblx0XHRcdG9GaW5hbFVJU3RhdGUgPSB0aGlzLmVkaXRGbG93LmNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZShiaW5kaW5nQ29udGV4dCk7XG5cblx0XHRcdC8vIHVwZGF0ZSByZWxhdGVkIGFwcHNcblx0XHRcdHRoaXMuX3VwZGF0ZVJlbGF0ZWRBcHBzKCk7XG5cblx0XHRcdC8vQXR0YWNoIHRoZSBwYXRjaCBzZW50IGFuZCBwYXRjaCBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gKGJpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcgJiYgYmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKSB8fCBiaW5kaW5nQ29udGV4dDtcblxuXHRcdFx0Ly8gQXR0YWNoIHRoZSBldmVudCBoYW5kbGVyIG9ubHkgb25jZSB0byB0aGUgc2FtZSBiaW5kaW5nXG5cdFx0XHRpZiAodGhpcy5jdXJyZW50QmluZGluZyAhPT0gb0JpbmRpbmcpIHtcblx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJwYXRjaFNlbnRcIiwge30sIHRoaXMuZWRpdEZsb3cuaGFuZGxlUGF0Y2hTZW50LCB0aGlzKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50QmluZGluZyA9IG9CaW5kaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogVGFibGUpOiB2b2lkIHtcblx0XHRcdFx0Ly8gYWNjZXNzIGJpbmRpbmcgb25seSBhZnRlciB0YWJsZSBpcyBib3VuZFxuXHRcdFx0XHRUYWJsZVV0aWxzLndoZW5Cb3VuZChvVGFibGUpXG5cdFx0XHRcdFx0LnRoZW4oaGFuZGxlVGFibGVNb2RpZmljYXRpb25zKVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgdGFibGUgdG8gYmUgYm91bmRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIGJpbmRpbmcgaXMgcmVhZHkgaGVuY2UgY2FsbGluZyBpdCBpbiBvbkFmdGVyQmluZGluZ1xuXHRcdFx0aWYgKHRoaXMuZ2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uKCkpIHtcblx0XHRcdFx0KG9PYmplY3RQYWdlIGFzIHVua25vd24gYXMgeyBfdHJpZ2dlclZpc2libGVTdWJTZWN0aW9uc0V2ZW50czogRnVuY3Rpb24gfSkuX3RyaWdnZXJWaXNpYmxlU3ViU2VjdGlvbnNFdmVudHMoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9UbyBDb21wdXRlIHRoZSBFZGl0IEJpbmRpbmcgb2YgdGhlIHN1Yk9iamVjdCBwYWdlIHVzaW5nIHJvb3Qgb2JqZWN0IHBhZ2UsIGNyZWF0ZSBhIGNvbnRleHQgZm9yIGRyYWZ0IHJvb3QgYW5kIHVwZGF0ZSB0aGUgZWRpdCBidXR0b24gaW4gc3ViIE9QIHVzaW5nIHRoZSBjb250ZXh0XG5cdFx0XHRBY3Rpb25SdW50aW1lLnVwZGF0ZUVkaXRCdXR0b25WaXNpYmlsaXR5QW5kRW5hYmxlbWVudCh0aGlzLmdldFZpZXcoKSk7XG5cblx0XHRcdHRoaXMuX3VwZGF0ZUF2YWlsYWJsZUNhcmRzKFtdKTtcblx0XHR9XG5cdFx0Ly8gd2UgYXJlIGNsZWFyaW5nIGFueSBwcmV2aW91cyBkYXRhIGZyb20gcmVjb21tZW5kYXRpb25zIGV2ZXJ5IHRpbWUgd2UgY29tZSB0byBuZXcgT1Bcblx0XHQvLyBzbyB0aGF0IGNhY2hlZCByZWNvbW1lbmRhdGlvbnMgYXJlIG5vdCBzaG93biB0byB1c2VyXG5cdFx0aWYgKHZpZXdMZXZlbCAmJiB2aWV3TGV2ZWwgPT09IDEpIHtcblx0XHRcdG9GaW5hbFVJU3RhdGU/LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9ucy5jbGVhclJlY29tbWVuZGF0aW9ucygpO1xuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHR0aGlzLmRpc3BsYXlDb2xsYWJvcmF0aW9uTWVzc2FnZShtUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQpO1xuXHRcdHRoaXMuX3NldE9QTWVzc2FnZVN0cmlwSW50ZXJuYWxDb250ZXh0KCk7XG5cblx0XHRjb25zdCBhcHBseUFwcFN0YXRlID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRBcHBTdGF0ZUhhbmRsZXIoKS5hcHBseUFwcFN0YXRlKHZpZXcpO1xuXHRcdHRoaXMucGFnZVJlYWR5LndhaXRGb3IoYXBwbHlBcHBTdGF0ZSk7XG5cblx0XHR0aGlzLnJlY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzKFxuXHRcdFx0dGhpcy5zdWJTZWN0aW9ucyxcblx0XHRcdG9PYmplY3RQYWdlLFxuXHRcdFx0YXBwbHlBcHBTdGF0ZSxcblx0XHRcdHRoaXMucHJldmlvdXNCaW5kaW5nQ29udGV4dFBhdGggIT09IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKVxuXHRcdCk7XG5cblx0XHQvLyBDYXB0dXJlIHN5bmNocm9ub3VzbHkgdG8gYXZvaWQgcmFjZSB3aXRoIHN1YnNlcXVlbnQgbmF2aWdhdGlvbnNcblx0XHRjb25zdCBwZW5kaW5nVGFyZ2V0Q29udHJvbElkID0gdGhpcy5wZW5kaW5nVGFyZ2V0Q29udHJvbElkO1xuXHRcdHRoaXMucGVuZGluZ1RhcmdldENvbnRyb2xJZCA9IHVuZGVmaW5lZDtcblxuXHRcdHRoaXMuaGFuZGxlUGVuZGluZ1RhcmdldENvbnRyb2xJZE5hdmlnYXRpb24oYXBwbHlBcHBTdGF0ZSwgb09iamVjdFBhZ2UsIHBlbmRpbmdUYXJnZXRDb250cm9sSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgbmF2aWdhdGlvbiB0byBhIHRhcmdldCBzZWN0aW9uIG9yIHN1YnNlY3Rpb24gYWZ0ZXIgYXBwIHN0YXRlIGlzIGFwcGxpZWQuXG5cdCAqIFRoaXMgY29vcmRpbmF0ZXMgdGFyZ2V0Q29udHJvbElkIG5hdmlnYXRpb24gZnJvbSB0d28gc291cmNlczpcblx0ICogLSBJbi1hcHAgbmF2aWdhdGlvbjogcGVuZGluZ1RhcmdldENvbnRyb2xJZCBjYXB0dXJlZCBiZWZvcmUgYXBwbHlBcHBTdGF0ZS5cblx0ICogLSBDcm9zcy1hcHAgbmF2aWdhdGlvbjogeEFwcFN0YXRlIHRhcmdldENvbnRyb2xJZCBzdG9yZWQgYnkgQXBwU3RhdGVIYW5kbGVyIGR1cmluZyBMUiB0byBPUCB0cmFuc2l0aW9uLlxuXHQgKiBAcGFyYW0gYXBwbHlBcHBTdGF0ZSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhcHAgc3RhdGUgaGFzIGJlZW4gYXBwbGllZC5cblx0ICogQHBhcmFtIG9PYmplY3RQYWdlIFRoZSBPYmplY3RQYWdlTGF5b3V0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBwZW5kaW5nVGFyZ2V0Q29udHJvbElkIFRoZSB0YXJnZXRDb250cm9sSWQgY2FwdHVyZWQgYmVmb3JlIGFwcGx5QXBwU3RhdGUsIGlmIGFueS5cblx0ICovXG5cdHByaXZhdGUgaGFuZGxlUGVuZGluZ1RhcmdldENvbnRyb2xJZE5hdmlnYXRpb24oXG5cdFx0YXBwbHlBcHBTdGF0ZTogUHJvbWlzZTx2b2lkIHwgb2JqZWN0Pixcblx0XHRvT2JqZWN0UGFnZTogT2JqZWN0UGFnZUxheW91dCxcblx0XHRwZW5kaW5nVGFyZ2V0Q29udHJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWRcblx0KTogdm9pZCB7XG5cdFx0YXBwbHlBcHBTdGF0ZVxuXHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB4QXBwU3RhdGVUYXJnZXRDb250cm9sSWQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldEFwcFN0YXRlSGFuZGxlcigpPy5jb25zdW1lUGVuZGluZ1RhcmdldENvbnRyb2xJZCgpO1xuXHRcdFx0XHRjb25zdCB0YXJnZXRDb250cm9sSWQgPSBwZW5kaW5nVGFyZ2V0Q29udHJvbElkID8/IHhBcHBTdGF0ZVRhcmdldENvbnRyb2xJZDtcblx0XHRcdFx0aWYgKCF0YXJnZXRDb250cm9sSWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXYWl0IGZvciB2aXNpYmlsaXR5IGJpbmRpbmdzICAobmVlZGVkIGZvciBsYXp5IGxvYWRpbmcgc2NlbmFyaW9zKVxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHRoaXMud2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdC8vIFNvbWUgdmlzaWJpbGl0eSBiaW5kaW5ncyBmYWlsZWQgdG8gcmVzb2x2ZSwgcHJvY2VlZGluZyBhbnl3YXlcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdhaXQgZm9yIHBhZ2VSZWFkeSB0byBlbnN1cmUgT2JqZWN0UGFnZSBpcyBmdWxseSBpbml0aWFsaXplZFxuXHRcdFx0XHRhd2FpdCB0aGlzLnBhZ2VSZWFkeS53YWl0UGFnZVJlYWR5KCk7XG5cblx0XHRcdFx0Ly8gTmF2aWdhdGUgdG8gdGFyZ2V0IHNlY3Rpb25cblx0XHRcdFx0dGhpcy5uYXZpZ2F0ZVRvVGFyZ2V0U2VjdGlvbihvT2JqZWN0UGFnZSwgdGFyZ2V0Q29udHJvbElkKTtcblx0XHRcdFx0cmV0dXJuOyAvLyBSZXF1aXJlZCBieSBsaW50ZXIgcnVsZSBwcm9taXNlL2Fsd2F5cy1yZXR1cm5cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHQvLyBhcHBseUFwcFN0YXRlIGZhaWxlZCAtIHNraXAgdGFyZ2V0Q29udHJvbElkIG5hdmlnYXRpb25cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hdmlnYXRlcyB0byBhIHRhcmdldCBzZWN0aW9uIHdpdGggYXV0b21hdGljIHJlLW5hdmlnYXRpb24gaWYgVVggcnVsZXMgcmVzZXQgdGhlIHNlbGVjdGlvbi5cblx0ICogUG9sbHMgdGhlIHNlY3Rpb24gc3RhdGUgc2luY2Ugc2V0U2VsZWN0ZWRTZWN0aW9uKCkgZG9lc24ndCBmaXJlIHRoZSBuYXZpZ2F0ZSBldmVudC5cblx0ICogQHBhcmFtIG9PYmplY3RQYWdlIFRoZSBPYmplY3RQYWdlTGF5b3V0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSB0YXJnZXRDb250cm9sSWQgVGhlIGxvY2FsIElEIG9mIHRoZSB0YXJnZXQgc2VjdGlvbiBvciBzdWJzZWN0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBuYXZpZ2F0ZVRvVGFyZ2V0U2VjdGlvbihvT2JqZWN0UGFnZTogT2JqZWN0UGFnZUxheW91dCwgdGFyZ2V0Q29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBEZXRlcm1pbmUgdGFyZ2V0IHNlY3Rpb24gSUQgZm9yIGNvbXBhcmlzb25cblx0XHRjb25zdCB0YXJnZXRDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZCh0YXJnZXRDb250cm9sSWQpO1xuXHRcdGNvbnN0IGlzU2VjdGlvbiA9IHRhcmdldENvbnRyb2w/LmlzQShcInNhcC51eGFwLk9iamVjdFBhZ2VTZWN0aW9uXCIpO1xuXHRcdGNvbnN0IHRhcmdldFNlY3Rpb25JZCA9IGlzU2VjdGlvbiA/IHRhcmdldENvbnRyb2w/LmdldElkKCkgOiAodGFyZ2V0Q29udHJvbD8uZ2V0UGFyZW50KCkgYXMgT2JqZWN0UGFnZVNlY3Rpb24pPy5nZXRJZCgpO1xuXG5cdFx0Ly8gTmF2aWdhdGUgZnVuY3Rpb24gd2l0aCBndWFyZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBjYWxscyB3aGVuIGFscmVhZHkgb24gdGFyZ2V0XG5cdFx0Y29uc3QgbmF2aWdhdGVUb1RhcmdldCA9ICgpOiB2b2lkID0+IHtcblx0XHRcdGlmIChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSA9PT0gdGFyZ2V0U2VjdGlvbklkKSB7XG5cdFx0XHRcdHJldHVybjsgLy8gQWxyZWFkeSBvbiB0YXJnZXQgc2VjdGlvblxuXHRcdFx0fVxuXHRcdFx0dGhpcy5uYXZpZ2F0ZVdpdGhDb25maXJtYXRpb24odGFyZ2V0Q29udHJvbElkKTtcblx0XHR9O1xuXG5cdFx0Ly8gTmF2aWdhdGUgaW1tZWRpYXRlbHlcblx0XHRuYXZpZ2F0ZVRvVGFyZ2V0KCk7XG5cblx0XHQvLyBTa2lwIHBvbGxpbmcgaWYgYWxyZWFkeSBvbiB0YXJnZXQgc2VjdGlvbiAobmF2aWdhdGlvbiB3YXMgbm8tb3Agb3Igc3VjY2VlZGVkIGltbWVkaWF0ZWx5KVxuXHRcdGlmIChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSA9PT0gdGFyZ2V0U2VjdGlvbklkKSB7XG5cdFx0XHR0aGlzLnNraXBWaWV3U3RhdGVTZWN0aW9uUmVzdG9yZSA9IHRydWU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUG9sbCB0byBkZXRlY3QgVVggcnVsZXMgcmVzZXQgb25seSBvbiBuZXcgZW50aXR5IGJpbmRpbmcuXG5cdFx0Ly8gX2FkanVzdFNlbGVjdGVkU2VjdGlvbkJ5VVhSdWxlcygpIG9ubHkgcnVucyB3aGVuIE9iamVjdFBhZ2VMYXlvdXQgcmUtaW5pdGlhbGl6ZXMgd2l0aCBhIG5ldyBlbnRpdHkuXG5cdFx0aWYgKHRoaXMuaXNOZXdCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0cG9sbEZvclNlY3Rpb25TdGFiaWxpdHkoe1xuXHRcdFx0XHRnZXRTZWxlY3RlZFNlY3Rpb246ICgpID0+IG9PYmplY3RQYWdlLmdldFNlbGVjdGVkU2VjdGlvbigpLFxuXHRcdFx0XHR0YXJnZXRTZWN0aW9uSWQsXG5cdFx0XHRcdG9uUmVzZXREZXRlY3RlZDogbmF2aWdhdGVUb1RhcmdldFxuXHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuc2tpcFZpZXdTdGF0ZVNlY3Rpb25SZXN0b3JlID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm47IC8vIFJlcXVpcmVkIGJ5IGxpbnRlciBydWxlIHByb21pc2UvYWx3YXlzLXJldHVyblxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRcdC8vIFJlcXVpcmVkIGJ5IGxpbnRlciBydWxlIHByb21pc2UvY2F0Y2gtb3ItcmV0dXJuIC0gcG9sbGluZyBmYWlsdXJlcyBhcmUgbm9uLWNyaXRpY2FsXG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRhcmdldFN1YlNlY3Rpb24gYmFzZWQgb24gdGhlIHRhcmdldCBjb250cm9sIElEIGZvciBhcHAgc3RhdGUgcGVyc2lzdGVuY2UuXG5cdCAqIEBwYXJhbSB0YXJnZXRDb250cm9sSWQgVGhlIGxvY2FsIElEIG9mIHRoZSB0YXJnZXQgc2VjdGlvbiBvciBzdWJzZWN0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBzZXRUYXJnZXRTdWJTZWN0aW9uKHRhcmdldENvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3QgdGFyZ2V0Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQodGFyZ2V0Q29udHJvbElkKTtcblx0XHRpZiAodGFyZ2V0Q29udHJvbD8uaXNBPE9iamVjdFBhZ2VTdWJTZWN0aW9uPihcInNhcC51eGFwLk9iamVjdFBhZ2VTdWJTZWN0aW9uXCIpKSB7XG5cdFx0XHR0aGlzLnRhcmdldFN1YlNlY3Rpb24gPSB0YXJnZXRDb250cm9sO1xuXHRcdH0gZWxzZSBpZiAodGFyZ2V0Q29udHJvbD8uaXNBPE9iamVjdFBhZ2VTZWN0aW9uPihcInNhcC51eGFwLk9iamVjdFBhZ2VTZWN0aW9uXCIpKSB7XG5cdFx0XHRjb25zdCBzdWJTZWN0aW9ucyA9IHRhcmdldENvbnRyb2wuZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdHRoaXMudGFyZ2V0U3ViU2VjdGlvbiA9IHN1YlNlY3Rpb25zWzBdO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBuYXZpZ2F0aW9uIHRvIHRoZSB0YXJnZXQgc2VjdGlvbiBhbmQgdGhlbiB1cGRhdGVzIHRoZSBhcHAgc3RhdGUuXG5cdCAqIEBwYXJhbSB0YXJnZXRDb250cm9sSWQgVGhlIGxvY2FsIElEIG9mIHRoZSB0YXJnZXQgc2VjdGlvbiBvciBzdWJzZWN0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBuYXZpZ2F0ZVdpdGhDb25maXJtYXRpb24odGFyZ2V0Q29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBTZXQgdGFyZ2V0U3ViU2VjdGlvbiBCRUZPUkUgbmF2aWdhdGlvbiBmb3IgYXBwIHN0YXRlIHNhdmluZy5cblx0XHQvLyBzY3JvbGxUb1NlY3Rpb24oKSBkb2Vzbid0IGZpcmUgdGhlIG5hdmlnYXRlIGV2ZW50LCBzbyBvbk5hdmlnYXRlQ2hhbmdlIHdvbid0IGJlIGNhbGxlZC5cblx0XHR0aGlzLnNldFRhcmdldFN1YlNlY3Rpb24odGFyZ2V0Q29udHJvbElkKTtcblxuXHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkubmF2aWdhdGVUb1N1YlNlY3Rpb24odGFyZ2V0Q29udHJvbElkKTtcblxuXHRcdC8vIFdhaXQgZm9yIEV4dGVuc2lvbkFQSSBwb2xsaW5nIHRvIGNvbXBsZXRlICh+MTAwbXMpIHBsdXMgc2Nyb2xsIHRvIGZpbmlzaFxuXHRcdC8vIGJlZm9yZSB1cGRhdGluZyBhcHAgc3RhdGUgYW5kIHNldHRpbmcgZm9jdXMuXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLnZpZXdTdGF0ZS51cGRhdGVBcHBTdGF0ZURlYm91bmNlZCgpO1xuXG5cdFx0XHQvLyBTZXQgZm9jdXMgaWYgaW4gZWRpdCBtb2RlIChmb3IgaW4tYXBwIG5hdmlnYXRpb24gdG8gc3ViLW9iamVjdCBwYWdlIGluIGVkaXQgbW9kZSlcblx0XHRcdC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc2Nyb2xsVG9TZWN0aW9uKCkgZG9lc24ndCBmaXJlIG9uTmF2aWdhdGVDaGFuZ2UsXG5cdFx0XHQvLyBzbyB3ZSBuZWVkIHRvIG1hbnVhbGx5IHRyaWdnZXIgZm9jdXMgc2V0dGluZyBoZXJlXG5cdFx0XHRjb25zdCBpc0luRWRpdE1vZGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdGlmIChpc0luRWRpdE1vZGUgJiYgdGhpcy50YXJnZXRTdWJTZWN0aW9uKSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShbdGhpcy50YXJnZXRTdWJTZWN0aW9uXSwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0sIDE1MCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVjb25uZWN0IHRoZSB2aXNpYmlsaXR5IG9ic2VydmVycyBvZiBhbGwgRkUgc3Vic2VjdGlvbnMgYWZ0ZXIgdGhlIHN1YnNlY3Rpb24gdmlzaWJpbGl0eSBiaW5kaW5ncyBhcmUgcmVzb2x2ZWQgYW5kIHRoZSBhcHAgc3RhdGUgaXMgYXBwbGllZC5cblx0ICogVGhpcyBmdW5jdGlvbiB3YWl0IGZvciB0aGUgYXBwU2F0ZSB0byBiZSBhcHBsaWVkIGJlZm9yZSByZWNvbm5lY3RpbmcgdGhlIG9ic2VydmVycyBhbmQgdGhlIHNjcm9sbGluZyB0byB0aGUgc2VsZWN0ZWQgc2VjdGlvbiBpZiBpdCBjaGFuZ2VkIGR1cmluZyB0aGUgYXBwU3RhdGUgYXBwbGljYXRpb24uXG5cdCAqIEBwYXJhbSBzdWJTZWN0aW9uSW5mbyBTdWJzZWN0aW9ucyBpbmZvcm1hdGlvbiByZXRyaWV2ZWQgZHVyaW5nIGRpc2Nvbm5lY3Rpb25cblx0ICogQHBhcmFtIG9iamVjdFBhZ2VMYXlvdXQgT2JqZWN0IFBhZ2UgTGF5b3V0IGNvbnRyb2xcblx0ICogQHBhcmFtIHdhaXRGb3JBcHBseUFwcHN0YXRlIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhcHAgc3RhdGUgaXMgYXBwbGllZFxuXHQgKiBAcGFyYW0gd2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byB3YWl0IGZvciB2aXNpYmlsaXR5IGJpbmRpbmdzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSByZWNvbm5lY3Rpbmcgb2JzZXJ2ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIG9ic2VydmVycyB3ZXJlIHJlY29ubmVjdGVkLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdGFzeW5jIHJlY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzKFxuXHRcdHN1YlNlY3Rpb25JbmZvOiB7IGZlOiBTdWJTZWN0aW9uW107IG90aGVyczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSB9IHwgdW5kZWZpbmVkLFxuXHRcdG9iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdFx0d2FpdEZvckFwcGx5QXBwc3RhdGU6IFByb21pc2U8dW5rbm93bj4sXG5cdFx0d2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyA9IHRydWVcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCF0aGlzLmdldERpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvbigpICYmIHN1YlNlY3Rpb25JbmZvKSB7XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yVmlzaWJpbGl0eUJpbmRpbmdzID8gdGhpcy53YWl0Rm9yVmlzaWJpbGl0eUJpbmRpbmdzIDogW10pXG5cdFx0XHRcdC50aGVuKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRvYmplY3RQYWdlTGF5b3V0LnNldFZpc2libGUodHJ1ZSk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdC8vd2FpdGluZyBmb3IgdGhlIGFwcCBzdGF0ZSB0byBiZSBhcHBsaWVkIGJ0byBlbnN1cmUgZm9jdXNpbmcgb24gdGhlIGNvcnJlY3Qgc2VjdGlvbiBpZiByZXF1aXJlZFxuXHRcdFx0XHRcdFx0YXdhaXQgd2FpdEZvckFwcGx5QXBwc3RhdGU7XG5cdFx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0XHRMb2cud2FybmluZyhcIkVycm9yIHdoaWxlIGFwcGx5aW5nIGFwcCBzdGF0ZVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c3ViU2VjdGlvbkluZm8uZmUuZm9yRWFjaCgoc3ViU2VjdGlvbikgPT4gc3ViU2VjdGlvbi5vYnNlcnZlQ3VycmVudFNlY3Rpb24oKSk7XG5cdFx0XHRcdFx0c3ViU2VjdGlvbkluZm8ub3RoZXJzXG5cdFx0XHRcdFx0XHQuZmlsdGVyKChzdWJzZWN0aW9uKSA9PiBzdWJzZWN0aW9uLmdldFZpc2libGUoKSlcblx0XHRcdFx0XHRcdC5mb3JFYWNoKChzdWJTZWN0aW9uKSA9PiBzdWJTZWN0aW9uLmZpcmVFdmVudChcInN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnRcIiwgeyBzdWJTZWN0aW9uOiBzdWJTZWN0aW9uIH0pKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGFwcGx5aW5nIGFwcCBzdGF0ZVwiLCBlIGFzIHN0cmluZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgdGhlIGNhcmRzIHdoZW4gdGhlIGJpbmRpbmcgaXMgcmVmcmVzaGVkLlxuXHQgKiBAcGFyYW0gY2FyZHMgQXJyYXkgb2YgY2FyZHMgdG8gYmUgdXBkYXRlZFxuXHQgKi9cblx0YXN5bmMgX3VwZGF0ZUF2YWlsYWJsZUNhcmRzKGNhcmRzOiBXcmFwcGVkQ2FyZFtdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgY29sbGFib3JhdGlvbk1hbmFnZXJTZXJ2aWNlID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRDb2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2UoKTtcblx0XHQvLyBPbmx5IGNvbGxlY3QgY2FyZHMgd2hlbiBjb25zdW1lcnMgYXJlIGNvbm5lY3RlZCB0byB0aGUgY2FyZHMgY2hhbm5lbFxuXHRcdGlmIChjb2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2UuaGFzQ29sbGFib3JhdGlvbk1hbmFnZXJDb25uZWN0ZWQoKSkge1xuXHRcdFx0YXdhaXQgdGhpcy5jb2xsYWJvcmF0aW9uTWFuYWdlci5jb2xsZWN0QXZhaWxhYmxlQ2FyZHMoY2FyZHMpO1xuXHRcdFx0aWYgKGNhcmRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29uc3QgY2FyZE9iamVjdCA9IHRoaXMuY29sbGFib3JhdGlvbk1hbmFnZXIudXBkYXRlQ2FyZHMoY2FyZHMpO1xuXHRcdFx0XHRjb25zdCBwYXJlbnRBcHBJZCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0SWQoKTtcblx0XHRcdFx0Y29sbGFib3JhdGlvbk1hbmFnZXJTZXJ2aWNlLmFkZENhcmRzVG9Db2xsYWJvcmF0aW9uTWFuYWdlcihjYXJkT2JqZWN0LCBwYXJlbnRBcHBJZCwgdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKSk7XG5cdFx0XHRcdGNvbGxhYm9yYXRpb25NYW5hZ2VyU2VydmljZS5zaGFyZUF2YWlsYWJsZUNhcmRzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgaW50ZXJuYWwgYmluZGluZyBjb250ZXh0IG9mIHRoZSBNZXNzYWdlc3RyaXAgT1AuXG5cdCAqL1xuXHRfc2V0T1BNZXNzYWdlU3RyaXBJbnRlcm5hbENvbnRleHQoKTogdm9pZCB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsQ29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJNZXNzYWdlU3RyaXBcIiwgeyAuLi5pbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0UHJvcGVydHkoXCJNZXNzYWdlU3RyaXBcIikgfSk7XG5cdFx0aWYgKGludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHQob09iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSBhcyB1bmtub3duIGFzIENvbnRyb2wpXG5cdFx0XHRcdD8uZmluZEVsZW1lbnRzKHRydWUsIChlbGVtOiBDb250cm9sKSA9PiBlbGVtLmlzQShcInNhcC5tLk1lc3NhZ2VTdHJpcFwiKSlcblx0XHRcdFx0LmZvckVhY2goKG1lc3NhZ2VTdHJpcDogVUk1RWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdG1lc3NhZ2VTdHJpcC5zZXRCaW5kaW5nQ29udGV4dChcblx0XHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0XG5cdFx0XHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5iaW5kQ29udGV4dCh0aGlzLmdldEV4dGVuc2lvbkFQSSgpLl9nZXRNZXNzYWdlU3RyaXBCaW5kaW5nQ29udGV4dFBhdGgoKSlcblx0XHRcdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpISxcblx0XHRcdFx0XHRcdFwiaW50ZXJuYWxcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Ly8gSWYgdGhlIHZpZXcncyBiaW5kaW5nIGNvbnRleHQgYWxyZWFkeSBoYWQgbWVzc2FnZXMgdGhhdCB3ZXJlIG5vdCBjbGVhcmVkLCB3ZSB3b3VsZCBuZWVkIHRvIHJlLWV2YWx1YXRlIHRvIHNob3cgdGhlIG1lc3NhZ2Ugc3RyaXAuXG5cdFx0XHR0aGlzLl9mblNob3dPUE1lc3NhZ2UoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2hvdyBhIG1lc3NhZ2Ugc3RyaXAgaWYgYSByZWRpcmVjdGlvbiB0byBhIG5vbi1kcmFmdCBlbGVtZW50IGhhcyBiZWVuIGRvbmUuXG5cdCAqIFJlbW92ZSB0aGUgbWVzc2FnZSBzdHJpcCBpbiBjYXNlIHdlIG5hdmlnYXRlIHRvIGFub3RoZXIgb2JqZWN0IHBhZ2UuXG5cdCAqIEBwYXJhbSBlbnRpdHlOYW1lIE5hbWUgb2YgdGhlIEVudGl0eSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIG1lc3NhZ2Vcblx0ICovXG5cdGRpc3BsYXlDb2xsYWJvcmF0aW9uTWVzc2FnZShlbnRpdHlOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cblx0XHRpZiAodGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZSkge1xuXHRcdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKFt0aGlzLmNvbGxhYm9yYXRpb25NZXNzYWdlXSk7XG5cdFx0XHRkZWxldGUgdGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZTtcblx0XHR9XG5cblx0XHRpZiAoZW50aXR5TmFtZSkge1xuXHRcdFx0dGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZSA9IG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0bWVzc2FnZTogcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlJFUk9VVEVEX05BVklHQVRJT05fVE9fU0FWRURfVkVSU0lPTlwiLCBbZW50aXR5TmFtZV0pLFxuXHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5JbmZvcm1hdGlvbixcblx0XHRcdFx0dGFyZ2V0OiB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpXG5cdFx0XHR9KTtcblx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhbdGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZV0pO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25QYWdlUmVhZHkobVBhcmFtZXRlcnM6IHsgZm9yY2VGb2N1czogYm9vbGVhbiB9IHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc2V0Rm9jdXMgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHQvLyBTZXQgdGhlIGZvY3VzIHRvIHRoZSBmaXJzdCBhY3Rpb24gYnV0dG9uLCBvciB0byB0aGUgZmlyc3QgZWRpdGFibGUgaW5wdXQgaWYgaW4gZWRpdGFibGUgbW9kZVxuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0Y29uc3QgaXNJbkRpc3BsYXlNb2RlID0gIUNvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0XHRpZiAoaXNJbkRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSB0aGlzLmdldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZSk7XG5cdFx0XHRcdGlmIChvRmlyc3RDbGlja2FibGVFbGVtZW50KSB7XG5cdFx0XHRcdFx0b0ZpcnN0Q2xpY2thYmxlRWxlbWVudC5mb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRTZWN0aW9uID0gVUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSkgYXMgT2JqZWN0UGFnZVNlY3Rpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChvU2VsZWN0ZWRTZWN0aW9uKSB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlRm9jdXNJbkVkaXRNb2RlKG9TZWxlY3RlZFNlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IGN0eHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdC8vIHNldHRpbmcgdGhpcyBtb2RlbCBkYXRhIHRvIGJlIHVzZWQgZm9yIHJlY29tbWVuZGF0aW9ucyBiaW5kaW5nXG5cdFx0dGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKS5zZXRQcm9wZXJ0eShcIi9jdXJyZW50Q3R4dFwiLCBjdHh0KTtcblxuXHRcdC8vIEFwcGx5IGFwcCBzdGF0ZSBvbmx5IGFmdGVyIHRoZSBwYWdlIGlzIHJlYWR5IHdpdGggdGhlIGZpcnN0IHNlY3Rpb24gc2VsZWN0ZWRcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHQvL1Nob3cgcG9wdXAgd2hpbGUgbmF2aWdhdGluZyBiYWNrIGZyb20gb2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBkcmFmdFxuXHRcdGlmIChvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdFx0aWYgKCFiSXNTdGlja3lNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdFx0XHRhd2FpdCBvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigoKSA9PiB0aGlzLl9vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdChvQmluZGluZ0NvbnRleHQpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gZG8gbm90IHJlcXVlc3QgcmVjb21tZW5kYXRpb25zIGFjdGlvbiBpZiB3ZSBhcmUgaW4gRGlzcGxheSBtb2RlXG5cdFx0Y29uc3QgaXNFZGl0YWJsZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXHRcdGlmIChpc0VkaXRhYmxlICYmIG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0YXdhaXQgdGhpcy5yZWNvbW1lbmRhdGlvbnMuZmV0Y2hBbmRBcHBseVJlY29tbWVuZGF0aW9ucyhbeyBjb250ZXh0OiBvQmluZGluZ0NvbnRleHQgfV0pO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycz8uZm9yY2VGb2N1cykge1xuXHRcdFx0c2V0Rm9jdXMoKTtcblx0XHR9XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIiwgZmFsc2UpO1xuXHRcdHRoaXMuX2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24oKTtcblxuXHRcdC8vVGhlIGZvbGxvd2luZyBjb2RpbmcgaXMgZG9uZSB0byBtZXJnZSBhbiBvcGVuIFBBVENIIGFuZCB0aGUgZHJhZnRwcmVwYXJlL2RyYWZ0YWN0aXZhdGVcblx0XHQvL3JlcXVlc3QgaW50byBvbmUgJGJhdGNoIHJlcXVlc3Rcblx0XHQvL1RvIGFjaGlldmUgdGhpcyB0aGUgJGF1dG8gcXVldWUgaXMgbG9ja2VkIGF0IHRoZSBtb3VzZWRvd24gZXZlbnQgKGJlZm9yZSBmb2N1c291dCkgaW5cblx0XHQvL29yZGVyIHRvIHdhaXQgZm9yIHRoZSBkcmFmdCByZXF1ZXN0IGlzc3VlZCBpbiB0aGUgc2F2ZSBidXR0b25zIHByZXNzIGV2ZW50IGhhbmRsZXIuXG5cdFx0Ly9UaGUgcXVldWUgaXMgcmVsZWFzZWQgYWdhaW4gZHVyaW5nIG1vdXNldXAgKGJlZm9yZSBwcmVzcykuXG5cdFx0Ly9UaGlzIGlzIG9ubHkgcG9zc2libGUgb24gbm9uIHRvdWNoIGRldmljZXMgYmVjYXVzZSBvbiB0b3VjaCBkZXZpY2VzIHRoZSBmb2N1c291dCBhbmQgcHJlc3Ncblx0XHQvL2V2ZW50cyBhcmUgYm90aCBpbml0aWF0ZWQgYXQgdG91Y2hlbmQgYnkgc2FwLm0uQnV0dG9uLlxuXHRcdC8vbW91c2VIYW5kbGVyU2V0IGlzIHVzZWQgdG8gZW5zdXJlcyB0aGF0IHRoZSBldmVudCBoYW5kbGVycyBhcmUgYXR0YWNoZWQgb25seSBvbmUgdGltZS5cblx0XHQvL1RoZXJlIGNhbiBiZSBtdWx0aXBsZSBvblBhZ2VSZWFkeSBlLmcuIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZWRpdC9kaXNwbGF5IG1vZGVcblx0XHRpZiAoIXRoaXMubWVyZ2VQYXRjaERyYWZ0ICYmICFEZXZpY2Uuc3VwcG9ydC50b3VjaCkge1xuXHRcdFx0Y29uc3Qgc2F2ZUJ1dHRvbiA9IG9WaWV3LmJ5SWQoXCJmZTo6Rm9vdGVyQmFyOjpTdGFuZGFyZEFjdGlvbjo6U2F2ZVwiKSBhcyBCdXR0b247XG5cdFx0XHRjb25zdCBhdXRvUXVldWVVbmxvY2sgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmF1dG9RdWV1ZUxvY2s/LmlzTG9ja2VkKCkpIHtcblx0XHRcdFx0XHR0aGlzLmF1dG9RdWV1ZUxvY2sudW5sb2NrKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2F2ZUJ1dHRvbi5kZXRhY2hCcm93c2VyRXZlbnQoXCJtb3VzZXVwXCIsIGF1dG9RdWV1ZVVubG9jayk7XG5cdFx0XHRcdHNhdmVCdXR0b24uZGV0YWNoQnJvd3NlckV2ZW50KFwiYmx1clwiLCBhdXRvUXVldWVVbmxvY2spO1xuXHRcdFx0fTtcblxuXHRcdFx0c2F2ZUJ1dHRvbj8uYXR0YWNoQnJvd3NlckV2ZW50KFwibW91c2Vkb3duXCIsICgpOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLmF1dG9RdWV1ZUxvY2s/LmlzTG9ja2VkKCkpIHtcblx0XHRcdFx0XHR0aGlzLmF1dG9RdWV1ZUxvY2sgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLmxvY2soXCIkYXV0b1wiKTtcblx0XHRcdFx0XHQvL3doZW4gdGhlIG1vdXNlIGlzIGRyYWdnZWQgYXdheSBmcm9tIHRoZSBzYXZlIGJ1dHRvbiB3aGlsZSBwcmVzc2VkIHRoZW4gdGhlcmUgd2lsbCBiZSBub1xuXHRcdFx0XHRcdC8vbW91c2V1cCBldmVudCBvbiB0aGUgc2F2ZSBidXR0b24uIFRoZXJlZm9yZSwgdGhlIHVubG9ja2luZyBpcyBkb25lIG9uIFwibW91c2V1cFwiIGFuZCBcImJsdXJcIlxuXHRcdFx0XHRcdHNhdmVCdXR0b24uYXR0YWNoQnJvd3NlckV2ZW50KFwibW91c2V1cFwiLCBhdXRvUXVldWVVbmxvY2spO1xuXHRcdFx0XHRcdHNhdmVCdXR0b24uYXR0YWNoQnJvd3NlckV2ZW50KFwiYmx1clwiLCBhdXRvUXVldWVVbmxvY2spO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5tZXJnZVBhdGNoRHJhZnQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBGQ0wgQ2xvc2UgYnV0dG9uIHdoaWxlIGEga2V5IHByb3BlcnR5IGZpZWxkIGhhcyBmb2N1cyxcblx0XHQvLyB0aGUgZmllbGQncyBmb2N1cy1sb3NzIHRyaWdnZXJzIHNpZGUgZWZmZWN0cyB0aGF0IHJlZnJlc2ggdGhlIE9EYXRhIGJpbmRpbmcgYW5kXG5cdFx0Ly8gcmUtcmVuZGVyIHRoZSBPYmplY3RQYWdlIGhlYWRlciB0aXRsZSDigJQgcmVtb3ZpbmcgdGhlIENsb3NlIGJ1dHRvbiBmcm9tIHRoZSBET01cblx0XHQvLyBiZWZvcmUgdGhlIGNsaWNrIGV2ZW50IGZpcmVzLCBzbyB0aGUgcHJlc3MgaXMgc2lsZW50bHkgbG9zdC5cblx0XHQvLyBMaXN0ZW5pbmcgb24gbW91c2Vkb3duICh3aGljaCBmaXJlcyBiZWZvcmUgZm9jdXMtbG9zcykgZW5zdXJlcyBjbG9zZUNvbHVtbigpIGlzXG5cdFx0Ly8gYWx3YXlzIGNhbGxlZCByZWdhcmRsZXNzIG9mIHRoZSBzdWJzZXF1ZW50IHJlLXJlbmRlci5cblx0XHRpZiAoIXRoaXMuZmNsQ2xvc2VIYW5kbGVyU2V0ICYmICFEZXZpY2Uuc3VwcG9ydC50b3VjaCkge1xuXHRcdFx0Y29uc3QgZmNsQ2xvc2VCdXR0b24gPSBvVmlldy5ieUlkKFwiZmU6OkZDTFN0YW5kYXJkQWN0aW9uOjpDbG9zZVwiKTtcblx0XHRcdGlmIChmY2xDbG9zZUJ1dHRvbj8uaXNBPEJ1dHRvbj4oXCJzYXAubS5CdXR0b25cIikpIHtcblx0XHRcdFx0ZmNsQ2xvc2VCdXR0b24uYXR0YWNoQnJvd3NlckV2ZW50KFwibW91c2Vkb3duXCIsICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHR0aGlzLl9yb3V0aW5nLmNsb3NlQ29sdW1uKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5mY2xDbG9zZUhhbmRsZXJTZXQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHN0YXR1cyBvZiBlZGl0IG1vZGUgZm9yIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcmV0dXJucyBUaGUgc3RhdHVzIG9mIGVkaXQgbW9kZSBmb3Igc3RpY2t5IHNlc3Npb25cblx0ICovXG5cdGdldFN0aWNreUVkaXRNb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0ICYmIHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0bGV0IGJJc1N0aWNreUVkaXRNb2RlID0gZmFsc2U7XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRpZiAoYklzU3RpY2t5TW9kZSkge1xuXHRcdFx0XHRiSXNTdGlja3lFZGl0TW9kZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYklzU3RpY2t5RWRpdE1vZGU7XG5cdH1cblxuXHRfZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTogT2JqZWN0UGFnZUxheW91dCB7XG5cdFx0cmV0dXJuIHRoaXMuYnlJZChcImZlOjpPYmplY3RQYWdlXCIpIGFzIE9iamVjdFBhZ2VMYXlvdXQ7XG5cdH1cblxuXHRhc3luYyBfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24oKTogUHJvbWlzZTx7IHRpdGxlOiBzdHJpbmc7IHN1YnRpdGxlOiBzdHJpbmc7IGludGVudDogc3RyaW5nOyBpY29uOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfT4ge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZVN1YnRpdGxlID0gb09iamVjdFBhZ2UuZ2V0Q3VzdG9tRGF0YSgpLmZpbmQoZnVuY3Rpb24gKG9DdXN0b21EYXRhKSB7XG5cdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwiT2JqZWN0UGFnZVN1YnRpdGxlXCI7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2VEZXNjcmlwdGlvbiA9IG9PYmplY3RQYWdlLmdldEN1c3RvbURhdGEoKS5maW5kKGZ1bmN0aW9uIChvQ3VzdG9tRGF0YSkge1xuXHRcdFx0cmV0dXJuIG9DdXN0b21EYXRhLmdldEtleSgpID09PSBcIk9iamVjdFBhZ2VEZXNjcmlwdGlvblwiO1xuXHRcdH0pO1xuXHRcdGNvbnN0IGV4dHJhY3RQYXRocyA9IChiaW5kaW5nSW5mbz86IHsgcGFydHM/OiB7IHBhdGg/OiBzdHJpbmc7IG1vZGVsPzogc3RyaW5nIH1bXSB9KTogc3RyaW5nW10gPT5cblx0XHRcdEFycmF5LmZyb20oXG5cdFx0XHRcdG5ldyBTZXQoXG5cdFx0XHRcdFx0KGJpbmRpbmdJbmZvPy5wYXJ0cyB8fCBbXSlcblx0XHRcdFx0XHRcdC5maWx0ZXIoKHBhcnQpID0+ICFwYXJ0Lm1vZGVsKVxuXHRcdFx0XHRcdFx0Lm1hcCgocGFydCkgPT4gcGFydC5wYXRoIHx8IFwiXCIpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKEJvb2xlYW4pXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0Y29uc3Qgc3VidGl0bGVQYXRocyA9IGV4dHJhY3RQYXRocyhvT2JqZWN0UGFnZVN1YnRpdGxlPy5nZXRCaW5kaW5nSW5mbyhcInZhbHVlXCIpKTtcblx0XHRjb25zdCBkZXNjcmlwdGlvblBhdGhzID0gZXh0cmFjdFBhdGhzKG9PYmplY3RQYWdlRGVzY3JpcHRpb24/LmdldEJpbmRpbmdJbmZvKFwidmFsdWVcIikpO1xuXHRcdGNvbnN0IHBhdGhzVG9SZXNvbHZlID0gWy4uLnN1YnRpdGxlUGF0aHMsIC4uLmRlc2NyaXB0aW9uUGF0aHNdO1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gYXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGNvbnN0IGZuQ2xlYXJDYWNoZVRpdGxlID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0cm9vdFZpZXdDb250cm9sbGVyLmludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlKG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKSBhcyBzdHJpbmcpO1xuXHRcdH07XG5cdFx0aWYgKChvT2JqZWN0UGFnZURlc2NyaXB0aW9uIHx8IG9PYmplY3RQYWdlU3VidGl0bGUpICYmICF0aGlzLmludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlU2V0VXApIHtcblx0XHRcdG9PYmplY3RQYWdlU3VidGl0bGU/LmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uYXR0YWNoQ2hhbmdlKGZuQ2xlYXJDYWNoZVRpdGxlLCB0aGlzKTtcblx0XHRcdG9PYmplY3RQYWdlRGVzY3JpcHRpb24/LmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uYXR0YWNoQ2hhbmdlKGZuQ2xlYXJDYWNoZVRpdGxlLCB0aGlzKTtcblx0XHRcdHRoaXMuaW52YWxpZGF0ZVRpdGxlSGllcmFyY2h5Q2FjaGVTZXRVcCA9IHRydWU7XG5cdFx0fVxuXHRcdGNvbnN0IG9PYmplY3RQYWdlQ29udGV4dCA9IG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgYnVpbGQgPSAoKTogeyB0aXRsZTogc3RyaW5nOyBzdWJ0aXRsZTogc3RyaW5nOyBpbnRlbnQ6IHN0cmluZzsgaWNvbjogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0gPT4gKHtcblx0XHRcdHRpdGxlOiBvT2JqZWN0UGFnZS5kYXRhKFwiT2JqZWN0UGFnZVRpdGxlXCIpID8/IFwiXCIsXG5cdFx0XHRzdWJ0aXRsZTogb09iamVjdFBhZ2VTdWJ0aXRsZT8uZ2V0VmFsdWUoKSA/PyBcIlwiLFxuXHRcdFx0aW50ZW50OiBcIlwiLFxuXHRcdFx0aWNvbjogXCJcIixcblx0XHRcdGRlc2NyaXB0aW9uOiBvT2JqZWN0UGFnZURlc2NyaXB0aW9uPy5nZXRWYWx1ZSgpID8/IFwiXCJcblx0XHR9KTtcblx0XHQvL2lmIG5vIGNvbnRleHQgb3Igbm90aGluZyB0byByZXNvbHZlLCBkaXJlY3QgcmV0dXJuXG5cdFx0aWYgKCFvT2JqZWN0UGFnZUNvbnRleHQgfHwgcGF0aHNUb1Jlc29sdmUubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJ1aWxkKCkpO1xuXHRcdH1cblx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHBhdGhzVG9SZXNvbHZlLm1hcChhc3luYyAocCkgPT4gKG9PYmplY3RQYWdlQ29udGV4dCBhcyBPRGF0YVY0Q29udGV4dCkucmVxdWVzdFByb3BlcnR5KHApLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpXG5cdFx0KTtcblx0XHRyZXR1cm4gYnVpbGQoKTtcblx0fVxuXG5cdF9leGVjdXRlVGFiU2hvcnRDdXQob0V4ZWN1dGlvbjogVUk1RXZlbnQpOiB2b2lkIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCksXG5cdFx0XHRhU2VjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLFxuXHRcdFx0aVNlY3Rpb25JbmRleE1heCA9IGFTZWN0aW9ucy5sZW5ndGggLSAxLFxuXHRcdFx0c0NvbW1hbmQgPSAob0V4ZWN1dGlvbi5nZXRTb3VyY2UoKSBhcyB1bmtub3duIGFzIENvbW1hbmRFeGVjdXRpb24pLmdldENvbW1hbmQoKTtcblx0XHRsZXQgbmV3U2VjdGlvbixcblx0XHRcdGlTZWxlY3RlZFNlY3Rpb25JbmRleCA9IG9PYmplY3RQYWdlLmluZGV4T2ZTZWN0aW9uKHRoaXMuYnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSEpIGFzIE9iamVjdFBhZ2VTZWN0aW9uKTtcblx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4ICE9PSAtMSAmJiBpU2VjdGlvbkluZGV4TWF4ID4gMCkge1xuXHRcdFx0aWYgKHNDb21tYW5kID09PSBcIk5leHRUYWJcIikge1xuXHRcdFx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4IDw9IGlTZWN0aW9uSW5kZXhNYXggLSAxKSB7XG5cdFx0XHRcdFx0bmV3U2VjdGlvbiA9IGFTZWN0aW9uc1srK2lTZWxlY3RlZFNlY3Rpb25JbmRleF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4ICE9PSAwKSB7XG5cdFx0XHRcdC8vIFByZXZpb3VzVGFiXG5cdFx0XHRcdG5ld1NlY3Rpb24gPSBhU2VjdGlvbnNbLS1pU2VsZWN0ZWRTZWN0aW9uSW5kZXhdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3U2VjdGlvbikge1xuXHRcdFx0XHRvT2JqZWN0UGFnZS5zZXRTZWxlY3RlZFNlY3Rpb24obmV3U2VjdGlvbik7XG5cdFx0XHRcdG5ld1NlY3Rpb24uZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZ2V0Rm9vdGVyVmlzaWJpbGl0eSgpOiB2b2lkIHtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiLCBmYWxzZSk7XG5cdFx0Y29uc3QgaXNIaWRkZW5EcmFmdEVuYWJsZWQgPSAodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpLmdldENhcGFiaWxpdGllcygpLkhpZGRlbkRyYWZ0IGFzIEhpZGRlbkRyYWZ0KVxuXHRcdFx0Py5lbmFibGVkO1xuXHRcdE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKVxuXHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBNZXNzYWdlKTogdm9pZCB7XG5cdFx0XHRcdGNvbnN0IGlzRXJyb3JNZXNzYWdlID0gb01lc3NhZ2UudmFsaWRhdGlvbiAmJiBvTWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiRXJyb3JcIjtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZVZhbGlkYXRpb24gPSBpc0hpZGRlbkRyYWZ0RW5hYmxlZFxuXHRcdFx0XHRcdD8gaXNFcnJvck1lc3NhZ2Vcblx0XHRcdFx0XHQ6IGlzRXJyb3JNZXNzYWdlICYmIG9NZXNzYWdlLmdldFRhcmdldHMoKS5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcyhzVmlld0lkKSk7XG5cdFx0XHRcdGlmIChtZXNzYWdlVmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHRfc2hvd01lc3NhZ2VQb3BvdmVyKCk6IHZvaWQge1xuXHRcdGNvbnN0IGlzRWRpdE1vZGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKTtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGNvbnN0IGN1cnJlbnRQYWdlVmlldyA9IHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0PyByb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0VmlldygpXG5cdFx0XHQ6ICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RDb250YWluZXIoKSBhcyBOYXZDb250YWluZXIpLmdldEN1cnJlbnRQYWdlKCk7XG5cdFx0aWYgKGlzRWRpdE1vZGUgJiYgIWN1cnJlbnRQYWdlVmlldy5pc0EoXCJzYXAubS5NZXNzYWdlUGFnZVwiKSkge1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VCdXR0b24gPSB0aGlzLm1lc3NhZ2VCdXR0b24sXG5cdFx0XHRcdG9NZXNzYWdlUG9wb3ZlciA9IG9NZXNzYWdlQnV0dG9uLm9NZXNzYWdlUG9wb3Zlcixcblx0XHRcdFx0b0l0ZW1CaW5kaW5nID0gb01lc3NhZ2VQb3BvdmVyLmdldEJpbmRpbmcoXCJpdGVtc1wiKSBhcyBMaXN0QmluZGluZztcblxuXHRcdFx0aWYgKG9JdGVtQmluZGluZy5nZXRMZW5ndGgoKSA+IDAgJiYgIW9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0XHRvTWVzc2FnZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHQvLyB3b3JrYXJvdW5kIHRvIGVuc3VyZSB0aGF0IG9NZXNzYWdlQnV0dG9uIGlzIHJlbmRlcmVkIHdoZW4gb3BlbkJ5IGlzIGNhbGxlZFxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvTWVzc2FnZVBvcG92ZXIub3BlbkJ5KG9NZXNzYWdlQnV0dG9uKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgX2VkaXREb2N1bWVudCgpOiBQcm9taXNlPHZvaWQgfCBDb250ZXh0PiB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIik7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Nb2RlbCk7XG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuZWRpdERvY3VtZW50LmFwcGx5KHRoaXMuZWRpdEZsb3csIFtvQ29udGV4dF0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sob01vZGVsKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNlbWFudGljIG9iamVjdCBtYXBwaW5nIG9iamVjdC5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgdmFsdWUgb2YgdGhlIGRhdGEgcG9pbnQgcHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0gc2VtYW50aWNPYmplY3QgVGhlIHNlbWFudGljIG9iamVjdFxuXHQgKiBAcmV0dXJucyBUaGUgYXJyYXkgb2YgdGhlIGRlZmF1bHQgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmcgb2JqZWN0XG5cdCAqL1xuXHRfZ2V0SW1wbGljaXRTZW1hbnRpY09iamVjdE1hcHBpbmdGb3JEYXRhUG9pbnRzKFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdHNlbWFudGljT2JqZWN0OiBzdHJpbmdcblx0KTogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRMb2NhbFByb3BlcnR5OiB7XG5cdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogcHJvcGVydHlQYXRoXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFNlbWFudGljT2JqZWN0UHJvcGVydHk6IHNlbWFudGljT2JqZWN0XG5cdFx0XHR9XG5cdFx0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZG9jdW1lbnRcblx0ICogT25lIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBpcyB0cmlnZ2VyZWQgb24gdGhlIGRyYWZ0IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50OlxuXHQgKiAtIG9uIGEgdHJhbnNpZW50IGNvbnRleHQ6XG5cdCAqIC0gaWYgdGhlIGNvbnRleHQgZ2V0cyBkYXRhLCB3YWl0IGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbnRleHQgYW5kIGV4ZWN1dGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uXG5cdCAqIC0gaWYgbm8gZGF0YSBpcyBmb3VuZCBvbiB0aGlzIGNvbnRleHQsIG9ubHkgdGhlIHByZXBhcmVBY3Rpb24gaXMgcmVxdWVzdGVkXG5cdCAqIC0gb24gYSByZWd1bGFyIGNvbnRleHQsIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBpcyByZXF1ZXN0ZWQuXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugb2YgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIG9yIHVuZGVmaW5lZCBpZiBub3QgZXhlY3V0ZWRcblx0ICovXG5cdGFzeW5jIF92YWxpZGF0ZURvY3VtZW50KCk6IFByb21pc2U8dm9pZCB8IHVua25vd25bXSB8IE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0XHRjb25zdCBjb250cm9sID0gVUk1RWxlbWVudC5nZXRBY3RpdmVFbGVtZW50KCkgYXMgQ29udHJvbDtcblx0XHRjb25zdCBjb250ZXh0ID0gY29udHJvbD8uZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdGlmICghY29udHJvbCB8fCAhY29udGV4dCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0bGV0IGJ5UGFzc1NpZGVFZmZlY3RzID0gZmFsc2U7XG5cdFx0aWYgKGNvbnRleHQuaXNUcmFuc2llbnQoKSkge1xuXHRcdFx0aWYgKGNvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRhd2FpdCBjb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ5UGFzc1NpZGVFZmZlY3RzID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5tZXNzYWdlSGFuZGxlci5ob2xkTWVzc2FnZXNGb3JDb250cm9sKGNvbnRyb2wpO1xuXHRcdGNvbnN0IHJldCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdsb2JhbFZhbGlkYXRpb24oY29udGV4dCwgYnlQYXNzU2lkZUVmZmVjdHMpO1xuXHRcdHRoaXMubWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgY29udHJvbCB9KTtcblx0XHRyZXR1cm4gcmV0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBvZiB0aGUgZHJhZnRcblx0ICogT25lIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBpcyB0cmlnZ2VyZWQgb24gdGhlIGRyYWZ0IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50OlxuXHQgKiAtIHRoZSBnbG9iYWwgc2lkZSBlZmZlY3RzIGFyZSBleGVjdXRlZCBpZiB0aGVzZSBzaWRlIGVmZmVjdHMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbnRleHRcblx0ICogLSB0aGUgZHJhZnQgVmFsaWRhdGlvbiBvbiB0aGUgRHJhZnRSb290IGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0XG5cdCAqIEBwYXJhbSBieVBhc3NTaWRlRWZmZWN0cyBPbmx5IHRoZSBkcmFmdCBWYWxpZGF0aW9uIHN0ZXAgaXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSBvZiB0aGUgZ2xvYmFsIHZhbGlkYXRpb25cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVHbG9iYWxWYWxpZGF0aW9uKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBieVBhc3NTaWRlRWZmZWN0cyA9IGZhbHNlKTogUHJvbWlzZTx2b2lkIHwgdW5rbm93bltdIHwgT0RhdGFDb250ZXh0QmluZGluZz4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Ly8gdGhlIGRyYWZ0IHZhbGlkYXRpb24gaXMgdHJlYXRlZCBhcyBhIHVzZXIgaW50ZXJhY3Rpb24sIGFuZCB0aGUgc2VydmljZSBtdXN0IHJldHVybiB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFnYWluIGlmIHN0aWxsIHZhbGlkXG5cdFx0dGhpcy5tZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRpZiAoIWJ5UGFzc1NpZGVFZmZlY3RzKSB7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c1NlcnZpY2UgPSBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gc2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdGNvbnN0IGdsb2JhbFNpZGVFZmZlY3RzID0gZW50aXR5VHlwZSA/IHNpZGVFZmZlY3RzU2VydmljZS5nZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGUpIDogW107XG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZ2xvYmFsIFNpZGVFZmZlY3RzIGZvciB0aGUgcmVsYXRlZCBlbnRpdHksIGV4ZWN1dGUgaXQvdGhlbVxuXHRcdFx0aWYgKGdsb2JhbFNpZGVFZmZlY3RzLmxlbmd0aCkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmVkaXRGbG93LnN5bmNUYXNrKCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChnbG9iYWxTaWRlRWZmZWN0cy5tYXAoYXN5bmMgKHNpZGVFZmZlY3RzKSA9PiB0aGlzLnNpZGVFZmZlY3RzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cywgY29udGV4dCkpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBkcmFmdFJvb3RDb250ZXh0ID0gKGF3YWl0IENvbW1vblV0aWxzLmNyZWF0ZVJvb3RDb250ZXh0KFxuXHRcdFx0UHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCxcblx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0YXBwQ29tcG9uZW50XG5cdFx0KSkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0Ly9FeGVjdXRlIHRoZSBkcmFmdFZhbGlkYXRpb24gaWYgdGhlcmUgaXMgbm8gZ2xvYmFsU2lkZUVmZmVjdHMgKGlnbm9yZSBFVGFncyBpbiBjb2xsYWJvcmF0aW9uIGRyYWZ0KVxuXHRcdGlmIChkcmFmdFJvb3RDb250ZXh0KSB7XG5cdFx0XHRhd2FpdCB0aGlzLmVkaXRGbG93LnN5bmNUYXNrKCk7XG5cdFx0XHRyZXR1cm4gZHJhZnQuZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbihkcmFmdFJvb3RDb250ZXh0LCBhcHBDb21wb25lbnQsIHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZHJhZnQgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnRcblx0ICogSWYgZGF0YSBoYXMgYmVlbiBwcm92aWRlZCBvbiB0aGUgY3JlYXRpb24gcm93cywgdGhlIHJlbGF0ZWQgZG9jdW1lbnRzIGFyZSBjcmVhdGVkXG5cdCAqIGJlZm9yZSBzYXZpbmcgdGhlIGRyYWZ0IHZlcnNpb24uXG5cdCAqIEBwYXJhbSBza2lwQmluZGluZ1RvVmlldyBJbmRpY2F0ZXMgaWYgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXcgc2hvdWxkIGJlIHNraXBwZWRcblx0ICogQHBhcmFtIHVzZVNhdmVBbmRMZWF2ZSBJbmRpY2F0ZXMgaWYgdGhlIHNhdmUgaXMgdHJpZ2dlcmVkIGZyb20gYSBzYXZlIGFuZCBsZWF2ZSBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgX3NhdmVEb2N1bWVudChza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sIHVzZVNhdmVBbmRMZWF2ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBtb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIiksXG5cdFx0XHRhd2FpdENyZWF0ZURvY3VtZW50czogUHJvbWlzZTx2b2lkIHwgT0RhdGFMaXN0QmluZGluZz5bXSA9IFtdO1xuXHRcdC8vIGluZGljYXRlcyBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgcm93IGluIHRoZSBPUFxuXHRcdGxldCBleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gZmFsc2U7XG5cdFx0bGV0IG1lc3NhZ2VQb3BvdmVyRXJyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG1vZGVsKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29sbGFib3JhdGlvbkVuYWJsZWQoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGRpYWxvZ0FjdGlvbiA9IGF3YWl0IG5ldyBDb2xsYWJvcmF0aW9uRGlzY2FyZCh0aGlzLmdldFZpZXcoKSwgdHJ1ZSkuZ2V0VXNlckFjdGlvbigpO1xuXHRcdFx0XHRcdC8vIFdlIGNhbmNlbCB0aGUgYWN0aW9uXG5cdFx0XHRcdFx0aWYgKGRpYWxvZ0FjdGlvbiA9PT0gXCJjYW5jZWxcIikge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBXZSBrZWVwIHRoZSBkcmFmdCBhbmQgbGVhdmUgZm9yIExSXG5cdFx0XHRcdFx0aWYgKGRpYWxvZ0FjdGlvbiA9PT0gXCJrZWVwRHJhZnRcIikge1xuXHRcdFx0XHRcdFx0dGhpcy5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihgU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCBjb2xsYWJvcmF0aW9uIGRpc2NhcmQ6ICR7ZXJyfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc3luY1Rhc2soKTtcblx0XHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5mb3JFYWNoKCh0YWJsZTogVGFibGUpID0+IHtcblx0XHRcdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSB0YWJsZS5nZXRDcmVhdGlvblJvdygpO1xuXHRcdFx0XHRjb25zdCB0YWJsZUJpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcodGFibGUpO1xuXG5cdFx0XHRcdGNvbnN0IGNvbnRleHRLZXlzID0gT2JqZWN0LmtleXMoKGNyZWF0aW9uUm93Py5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkKT8uZ2V0T2JqZWN0KCkgfHwge30pO1xuXHRcdFx0XHRpZiAoY29udGV4dEtleXMuZmlsdGVyKChrZXkpID0+ICFrZXkuc3RhcnRzV2l0aChcIkAkdWk1LlwiKSkubGVuZ3RoKSB7XG5cdFx0XHRcdFx0ZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IHRydWU7XG5cdFx0XHRcdFx0YXdhaXRDcmVhdGVEb2N1bWVudHMucHVzaChcblx0XHRcdFx0XHRcdHRoaXMuZWRpdEZsb3dcblx0XHRcdFx0XHRcdFx0LmNyZWF0ZURvY3VtZW50KHRhYmxlQmluZGluZywge1xuXHRcdFx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogdGFibGUuZGF0YShcImNyZWF0aW9uTW9kZVwiKSxcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGlvblJvdzogY3JlYXRpb25Sb3csXG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6XG5cdFx0XHRcdFx0XHRcdFx0XHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0QWdncmVnYXRpb24oXCJjcmVhdGlvbk1vZGVcIikgYXMgVGFibGVDcmVhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHRcdCk/LmdldFByb3BlcnR5KFwiY3JlYXRlQXRFbmRcIikgPT09IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiB0cnVlIC8vIHRoZSBza2lwU2lkZUVmZmVjdHMgaXMgYSBwYXJhbWV0ZXIgY3JlYXRlZCB3aGVuIHdlIGNsaWNrIHRoZSBzYXZlIGtleS4gSWYgd2UgcHJlc3MgdGhpcyBrZXksIHdlIGRvbid0IGV4ZWN1dGUgdGhlIGhhbmRsZVNpZGVFZmZlY3RzIGZ1bmNpdG9uIHRvIGF2b2lkIGJhdGNoIHJlZHVuZGFuY3lcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4gdGFibGVCaW5kaW5nKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0bGV0IGlzU3RhbmRhcmRTYXZlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHNraXBCaW5kaW5nVG9WaWV3ICYmIHR5cGVvZiBza2lwQmluZGluZ1RvVmlldyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRjb25zdCBjb21tYW5kID0gKHNraXBCaW5kaW5nVG9WaWV3IGFzIENvbW1hbmRFeGVjdXRpb24kRXhlY3V0ZUV2ZW50KT8uZ2V0U291cmNlPy4oKT8uZ2V0Q29tbWFuZD8uKCk7XG5cdFx0XHRcdGlzU3RhbmRhcmRTYXZlID0gY29tbWFuZCA9PT0gXCJTYXZlXCI7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBiaW5kaW5ncyA9IGF3YWl0IFByb21pc2UuYWxsKGF3YWl0Q3JlYXRlRG9jdW1lbnRzKTtcblx0XHRcdC8vIFdlIG5lZWQgdG8gZWl0aGVyIHJlamVjdCBvciByZXNvbHZlIGEgcHJvbWlzZSBoZXJlIGFuZCByZXR1cm4gaXQgc2luY2UgdGhpcyBzYXZlXG5cdFx0XHQvLyBmdW5jdGlvbiBpcyBub3Qgb25seSBjYWxsZWQgd2hlbiBwcmVzc2luZyB0aGUgc2F2ZSBidXR0b24gaW4gdGhlIGZvb3RlciwgYnV0IGFsc29cblx0XHRcdC8vIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBjcmVhdGUgb3Igc2F2ZSBpbiBhIGRhdGFsb3NzIHBvcHVwLlxuXHRcdFx0Ly8gVGhlIGxvZ2ljIG9mIHRoZSBkYXRhbG9zcyBwb3B1cCBuZWVkcyB0byBkZXRlY3QgaWYgdGhlIHNhdmUgaGFkIGVycm9ycyBvciBub3QgaW4gb3JkZXJcblx0XHRcdC8vIHRvIGRlY2lkZSBpZiB0aGUgc3Vic2VxdWVudCBhY3Rpb24gLSBsaWtlIGEgYmFjayBuYXZpZ2F0aW9uIC0gaGFzIHRvIGJlIGV4ZWN1dGVkIG9yIG5vdC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc2F2ZURvY3VtZW50KGNvbnRleHQsIHtcblx0XHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0XHRiaW5kaW5nczogYmluZGluZ3MgYXMgdW5rbm93biBhcyBPRGF0YUxpc3RCaW5kaW5nW10sXG5cdFx0XHRcdFx0bWVyZ2VQYXRjaERyYWZ0OiB0aGlzLm1lcmdlUGF0Y2hEcmFmdCxcblx0XHRcdFx0XHRza2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRpc1N0YW5kYXJkU2F2ZSxcblx0XHRcdFx0XHR1c2VTYXZlQW5kTGVhdmVcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHQvLyBJZiB0aGUgc2F2ZURvY3VtZW50IGluIGVkaXRGbG93IHJldHVybnMgZXJyb3JzIHdlIG5lZWRcblx0XHRcdFx0Ly8gdG8gc2hvdyB0aGUgbWVzc2FnZSBwb3BvdmVyIGhlcmUgYW5kIGVuc3VyZSB0aGF0IHRoZVxuXHRcdFx0XHQvLyBkYXRhbG9zcyBsb2dpYyBkb2VzIG5vdCBwZXJmb3JtIHRoZSBmb2xsb3cgdXAgZnVuY3Rpb25cblx0XHRcdFx0Ly8gbGlrZSBlLmcuIGEgYmFjayBuYXZpZ2F0aW9uIGhlbmNlIHdlIHJldHVybiBhIHByb21pc2UgYW5kIHJlamVjdCBpdFxuXHRcdFx0XHRpZiAoZXJyb3IgIT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0XHRtZXNzYWdlUG9wb3ZlckVyciA9IChlcnJvciBhcyBzdHJpbmcpID8/IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG1vZGVsKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhtb2RlbCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobWVzc2FnZVBvcG92ZXJFcnIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAobWVzc2FnZVBvcG92ZXJFcnIubGVuZ3RoKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKG1lc3NhZ2VQb3BvdmVyRXJyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9zaG93TWVzc2FnZVBvcG92ZXIoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRhc3luYyBfY2FuY2VsRG9jdW1lbnQobVBhcmFtZXRlcnM6IHsgY2FuY2VsQnV0dG9uOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGV4dCB8IHZvaWQ+IHtcblx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgY2FuY2VsQnV0dG9uID0gdGhpcy5nZXRWaWV3KCkuYnlJZChtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24pIGFzIEJ1dHRvbiB8IHVuZGVmaW5lZDsgLy90byBnZXQgdGhlIHJlZmVyZW5jZSBvZiB0aGUgY2FuY2VsIGJ1dHRvbiBmcm9tIGNvbW1hbmQgZXhlY3V0aW9uXG5cdFx0Y29uc3QgbGFzdEZvY3VzZWRDb250cm9sSWQgPSBVSTVFbGVtZW50LmdldEFjdGl2ZUVsZW1lbnQoKT8uZ2V0SWQoKTtcblx0XHRsZXQgc2hvdWxkU2tpcERpc2NhcmRQb3BvdmVyID0gZmFsc2U7XG5cdFx0aWYgKHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29sbGFib3JhdGlvbkVuYWJsZWQoKSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgZGlhbG9nQWN0aW9uID0gYXdhaXQgbmV3IENvbGxhYm9yYXRpb25EaXNjYXJkKHRoaXMuZ2V0VmlldygpLCBmYWxzZSkuZ2V0VXNlckFjdGlvbigpO1xuXHRcdFx0XHQvLyBXZSBjYW5jZWwgdGhlIGFjdGlvblxuXHRcdFx0XHRpZiAoZGlhbG9nQWN0aW9uID09PSBcImNhbmNlbFwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFdlIGtlZXAgdGhlIGRyYWZ0IGFuZCBsZWF2ZSBmb3IgTFJcblx0XHRcdFx0aWYgKGRpYWxvZ0FjdGlvbiA9PT0gXCJrZWVwRHJhZnRcIikge1xuXHRcdFx0XHRcdHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KGNvbnRleHQpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBXZSBoYXZlIGRpc3BsYXllZCB0aGUgZGlhbG9nIGFuZCB0aGUgdXNlciBjb25maXJtZWQgdGhlIGRpc2NhcmQgLT4gV2Ugc2tpcCB0aGUgZGlzY2FyZCBjb25maXJtYXRpb25cblx0XHRcdFx0aWYgKGRpYWxvZ0FjdGlvbiA9PT0gXCJkaXNjYXJkQ29uZmlybWVkXCIpIHtcblx0XHRcdFx0XHRzaG91bGRTa2lwRGlzY2FyZFBvcG92ZXIgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGdldCBjb2xsYWJvcmF0aXZlIHVzZXJzXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBpc0RvY3VtZW50TW9kaWZpZWQgPVxuXHRcdFx0ISF0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCkgfHxcblx0XHRcdCghdGhpcy5nZXRTdGlja3lFZGl0TW9kZSgpICYmIGNvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlKTtcblx0XHRjb25zdCBhZnRlckNhbmNlbDogRnVuY3Rpb24gPSAocHJvbWlzZVJlc3VsdDogT0RhdGFWNENvbnRleHQpID0+IHtcblx0XHRcdC8vIGZvY3VzIGlzIHJldGFpbmVkIG9uIHRoZSBsYXN0IGZvY3VzZWQgZWxlbWVudFxuXHRcdFx0aWYgKGxhc3RGb2N1c2VkQ29udHJvbElkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0VUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZChsYXN0Rm9jdXNlZENvbnRyb2xJZCk/LmZvY3VzKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcHJvbWlzZVJlc3VsdDtcblx0XHR9O1xuXHRcdGlmIChcblx0XHRcdCh0aGlzLmdldEFwcENvbXBvbmVudCgpPy5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpPy5nZXRDYXBhYmlsaXRpZXMoKT8uSGlkZGVuRHJhZnQgYXMgSGlkZGVuRHJhZnQpPy5lbmFibGVkICYmXG5cdFx0XHRpc0RvY3VtZW50TW9kaWZpZWRcblx0XHQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0YWZ0ZXJDYW5jZWwsXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lZGl0Rmxvd1xuXHRcdFx0LmNhbmNlbERvY3VtZW50KGNvbnRleHQsIHsgY29udHJvbDogY2FuY2VsQnV0dG9uLCBza2lwRGlzY2FyZFBvcG92ZXI6IHNob3VsZFNraXBEaXNjYXJkUG9wb3ZlciB9KVxuXHRcdFx0LnRoZW4oKHByb21pc2VSZXN1bHQpID0+IHtcblx0XHRcdFx0cmV0dXJuIGFmdGVyQ2FuY2VsKHByb21pc2VSZXN1bHQpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRhc3luYyBfYXBwbHlEb2N1bWVudChvQ29udGV4dDogT0RhdGFWNENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5lZGl0Rmxvdy5hcHBseURvY3VtZW50KG9Db250ZXh0KS5jYXRjaCgoKSA9PiB7XG5cdFx0XHR0aGlzLl9zaG93TWVzc2FnZVBvcG92ZXIoKTtcblx0XHRcdHJldHVybjtcblx0XHR9KTtcblx0fVxuXG5cdF91cGRhdGVSZWxhdGVkQXBwcygpOiB2b2lkIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0Y29uc3Qgc2hvd1JlbGF0ZWRBcHBzID0gb09iamVjdFBhZ2UuZGF0YShcInNob3dSZWxhdGVkQXBwc1wiKTtcblx0XHRpZiAoc2hvd1JlbGF0ZWRBcHBzID09PSBcInRydWVcIiB8fCBzaG93UmVsYXRlZEFwcHMgPT09IHRydWUpIHtcblx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRDb21tb25VdGlscy51cGRhdGVSZWxhdGVkQXBwc0RldGFpbHMob09iamVjdFBhZ2UsIGFwcENvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0X2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uKGFQYXJlbnRFbGVtZW50OiBDb250cm9sW10sIGFTdWJzZWN0aW9uOiBPYmplY3RQYWdlU3ViU2VjdGlvbiwgYUNvbnRyb2xzOiBDb250cm9sW10sIGJJc0NoYXJ0PzogYm9vbGVhbik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgaXRlbTEgb2YgYVBhcmVudEVsZW1lbnQpIHtcblx0XHRcdGxldCBvRWxlbWVudCA9IChpdGVtMSBhcyBNYWNyb0FQSSkuZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gKGl0ZW0xIGFzIE1hY3JvQVBJKS5nZXRDb250ZW50KCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoYklzQ2hhcnQpIHtcblx0XHRcdFx0aWYgKG9FbGVtZW50Py5nZXRBZ2dyZWdhdGlvbihcIml0ZW1zXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbXMgPSBvRWxlbWVudC5nZXRBZ2dyZWdhdGlvbihcIml0ZW1zXCIpIGFzIENvbnRyb2xbXTtcblx0XHRcdFx0XHRpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtOiBDb250cm9sKSB7XG5cdFx0XHRcdFx0XHRpZiAoaXRlbS5pc0E8Q2hhcnRCbG9jaz4oXCJzYXAuZmUubWFjcm9zLkNoYXJ0XCIpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoYXJ0Q29udHJvbCA9IGl0ZW0uZ2V0Q2hhcnRDb250cm9sKCk7XG5cdFx0XHRcdFx0XHRcdGFDb250cm9scy5wdXNoKGNoYXJ0Q29udHJvbCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBPER5bmFtaWNTaWRlQ29udGVudD4oXCJzYXAudWkubGF5b3V0LkR5bmFtaWNTaWRlQ29udGVudFwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IG9TdWJFbGVtZW50ID0gb0VsZW1lbnQuZ2V0TWFpbkNvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IG9FbGVtZW50LmdldE1haW5Db250ZW50KCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0aWYgKG9TdWJFbGVtZW50ICYmIG9TdWJFbGVtZW50Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdG9FbGVtZW50ID0gb1N1YkVsZW1lbnRbMF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFRoZSB0YWJsZSBtYXkgY3VycmVudGx5IGJlIHNob3duIGluIGEgZnVsbCBzY3JlZW4gZGlhbG9nLCB3ZSBjYW4gdGhlbiBnZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgVGFibGVBUElcblx0XHRcdFx0Ly8gY29udHJvbCBmcm9tIHRoZSBjdXN0b20gZGF0YSBvZiB0aGUgcGxhY2UgaG9sZGVyIHBhbmVsXG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLm0uUGFuZWxcIikgJiYgb0VsZW1lbnQuZGF0YShcIkZ1bGxTY3JlZW5UYWJsZVBsYWNlSG9sZGVyXCIpKSB7XG5cdFx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudC5kYXRhKFwidGFibGVBUElyZWZlcmVuY2VcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0E8VGFibGVBUEk+KFwic2FwLmZlLm1hY3Jvcy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IG9TdWJFbGVtZW50ID0gb0VsZW1lbnQuZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gb0VsZW1lbnQuZ2V0Q29udGVudCgpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGlmIChvU3ViRWxlbWVudCAmJiBvU3ViRWxlbWVudC5pc0EgJiYgb1N1YkVsZW1lbnQuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRcdGFDb250cm9scy5wdXNoKG9TdWJFbGVtZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZ2V0QWxsU3ViU2VjdGlvbnMoKTogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdGxldCBhU3ViU2VjdGlvbnM6IE9iamVjdFBhZ2VTdWJTZWN0aW9uW10gPSBbXTtcblx0XHRvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikge1xuXHRcdFx0YVN1YlNlY3Rpb25zID0gYVN1YlNlY3Rpb25zLmNvbmNhdChvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gYVN1YlNlY3Rpb25zO1xuXHR9XG5cblx0X2dldEFsbEJsb2NrcygpOiBFbmhhbmNlV2l0aFVJNTxTdWJTZWN0aW9uQmxvY2s+W10ge1xuXHRcdGxldCBhQmxvY2tzOiBFbmhhbmNlV2l0aFVJNTxTdWJTZWN0aW9uQmxvY2s+W10gPSBbXTtcblx0XHR0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TdWJTZWN0aW9uOiBPYmplY3RQYWdlU3ViU2VjdGlvbikge1xuXHRcdFx0YUJsb2NrcyA9IGFCbG9ja3MuY29uY2F0KG9TdWJTZWN0aW9uLmdldEJsb2NrcygpIGFzIEVuaGFuY2VXaXRoVUk1PFN1YlNlY3Rpb25CbG9jaz5bXSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFCbG9ja3M7XG5cdH1cblxuXHRfZmluZFRhYmxlcygpOiBUYWJsZVtdIHtcblx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSB0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpO1xuXHRcdGNvbnN0IGFUYWJsZXM6IFRhYmxlW10gPSBbXTtcblx0XHRmb3IgKGxldCBzdWJTZWN0aW9uID0gMDsgc3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IHN1YlNlY3Rpb24rKykge1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldEJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFUYWJsZXMpO1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldE1vcmVCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhVGFibGVzKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFUYWJsZXM7XG5cdH1cblxuXHRfZmluZENoYXJ0cygpOiBDaGFydFtdIHtcblx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSB0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpO1xuXHRcdGNvbnN0IGFDaGFydHM6IENoYXJ0W10gPSBbXTtcblx0XHRmb3IgKGxldCBzdWJTZWN0aW9uID0gMDsgc3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IHN1YlNlY3Rpb24rKykge1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldEJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFDaGFydHMsIHRydWUpO1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldE1vcmVCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhQ2hhcnRzLCB0cnVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFDaGFydHM7XG5cdH1cblxuXHRfY2xvc2VTaWRlQ29udGVudCgpOiB2b2lkIHtcblx0XHR0aGlzLl9nZXRBbGxCbG9ja3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChvQmxvY2s6IEVuaGFuY2VXaXRoVUk1PFN1YlNlY3Rpb25CbG9jaz4pOiB2b2lkIHtcblx0XHRcdGNvbnN0IG9Db250ZW50ID0gb0Jsb2NrLmdldENvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvQmxvY2suZ2V0Q29udGVudCgpO1xuXHRcdFx0aWYgKG9Db250ZW50ICYmIG9Db250ZW50LmlzQSAmJiBvQ29udGVudC5pc0E8RHluYW1pY1NpZGVDb250ZW50PihcInNhcC51aS5sYXlvdXQuRHluYW1pY1NpZGVDb250ZW50XCIpKSB7XG5cdFx0XHRcdGlmIChvQ29udGVudC5zZXRTaG93U2lkZUNvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHRcdFx0XHRcdG9Db250ZW50LnNldFNob3dTaWRlQ29udGVudChmYWxzZSwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhcnQgQ29udGV4dCBpcyByZXNvbHZlZCBmb3IgMTpuIG1pY3JvY2hhcnRzLlxuXHQgKiBAcGFyYW0gb0NoYXJ0Q29udGV4dCBUaGUgQ29udGV4dCBvZiB0aGUgTWljcm9DaGFydFxuXHQgKiBAcGFyYW0gc0NoYXJ0UGF0aCBUaGUgY29sbGVjdGlvblBhdGggb2YgdGhlIHRoZSBjaGFydFxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBBdHRyaWJ1dGVzIG9mIHRoZSBjaGFydCBDb250ZXh0XG5cdCAqL1xuXHRfZ2V0Q2hhcnRDb250ZXh0RGF0YShvQ2hhcnRDb250ZXh0OiBDb250ZXh0LCBzQ2hhcnRQYXRoOiBzdHJpbmcpOiB1bmtub3duW10ge1xuXHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9DaGFydENvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IG9DaGFydENvbnRleHREYXRhID0gW29Db250ZXh0RGF0YV07XG5cdFx0aWYgKG9DaGFydENvbnRleHQgJiYgc0NoYXJ0UGF0aCkge1xuXHRcdFx0aWYgKG9Db250ZXh0RGF0YVtzQ2hhcnRQYXRoXSkge1xuXHRcdFx0XHRvQ2hhcnRDb250ZXh0RGF0YSA9IG9Db250ZXh0RGF0YVtzQ2hhcnRQYXRoXTtcblx0XHRcdFx0ZGVsZXRlIG9Db250ZXh0RGF0YVtzQ2hhcnRQYXRoXTtcblx0XHRcdFx0b0NoYXJ0Q29udGV4dERhdGEucHVzaChvQ29udGV4dERhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb0NoYXJ0Q29udGV4dERhdGE7XG5cdH1cblxuXHQvKipcblx0ICogU2Nyb2xsIHRoZSB0YWJsZXMgdG8gdGhlIHJvdyB3aXRoIHRoZSBzUGF0aFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1Jvd1BhdGggJ3NQYXRoIG9mIHRoZSB0YWJsZSByb3cnXG5cdCAqL1xuXG5cdF9zY3JvbGxUYWJsZXNUb1JvdyhzUm93UGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX2ZpbmRUYWJsZXMgJiYgdGhpcy5fZmluZFRhYmxlcygpLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCk7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgYVRhYmxlcykge1xuXHRcdFx0XHRUYWJsZVNjcm9sbGVyLnNjcm9sbFRhYmxlVG9Sb3coaXRlbSwgc1Jvd1BhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gbWVyZ2Ugc2VsZWN0ZWQgY29udGV4dHMgYW5kIGZpbHRlcnMuXG5cdCAqIEBwYXJhbSBvUGFnZUNvbnRleHQgUGFnZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBhTGluZUNvbnRleHQgU2VsZWN0ZWQgQ29udGV4dHNcblx0ICogQHBhcmFtIHNDaGFydFBhdGggQ29sbGVjdGlvbiBuYW1lIG9mIHRoZSBjaGFydFxuXHQgKiBAcmV0dXJucyBTZWxlY3Rpb24gVmFyaWFudCBPYmplY3Rcblx0ICovXG5cdF9tZXJnZU11bHRpcGxlQ29udGV4dHMoXG5cdFx0b1BhZ2VDb250ZXh0OiBDb250ZXh0LFxuXHRcdGFMaW5lQ29udGV4dDogT0RhdGFWNENvbnRleHRbXSxcblx0XHRzQ2hhcnRQYXRoOiBzdHJpbmdcblx0KTogeyBzZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50OyBhdHRyaWJ1dGVzOiB1bmtub3duW10gfSB7XG5cdFx0bGV0IGFBdHRyaWJ1dGVzOiB1bmtub3duW10gPSBbXSxcblx0XHRcdGFQYWdlQXR0cmlidXRlcyA9IFtdLFxuXHRcdFx0b0NvbnRleHQsXG5cdFx0XHRzTWV0YVBhdGhMaW5lOiBzdHJpbmcsXG5cdFx0XHRzUGF0aExpbmU7XG5cblx0XHRjb25zdCBzUGFnZVBhdGggPSBvUGFnZUNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvUGFnZUNvbnRleHQgJiYgb1BhZ2VDb250ZXh0LmdldE1vZGVsKCkgJiYgb1BhZ2VDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgc01ldGFQYXRoUGFnZSA9IG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGFnZVBhdGgpLnJlcGxhY2UoL15cXC8qLywgXCJcIik7XG5cblx0XHQvLyBHZXQgc2luZ2xlIGxpbmUgY29udGV4dCBpZiBuZWNlc3Nhcnlcblx0XHRpZiAoYUxpbmVDb250ZXh0ICYmIGFMaW5lQ29udGV4dC5sZW5ndGgpIHtcblx0XHRcdG9Db250ZXh0ID0gYUxpbmVDb250ZXh0WzBdO1xuXHRcdFx0c1BhdGhMaW5lID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0c01ldGFQYXRoTGluZSA9IG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aExpbmUpLnJlcGxhY2UoL15cXC8qLywgXCJcIik7XG5cblx0XHRcdGFMaW5lQ29udGV4dC5mb3JFYWNoKChvU2luZ2xlQ29udGV4dDogT0RhdGFWNENvbnRleHQpOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKHNDaGFydFBhdGgpIHtcblx0XHRcdFx0XHRjb25zdCBvQ2hhcnRDb250ZXh0RGF0YSA9IHRoaXMuX2dldENoYXJ0Q29udGV4dERhdGEob1NpbmdsZUNvbnRleHQsIHNDaGFydFBhdGgpO1xuXHRcdFx0XHRcdGlmIChvQ2hhcnRDb250ZXh0RGF0YSkge1xuXHRcdFx0XHRcdFx0YUF0dHJpYnV0ZXMgPSBvQ2hhcnRDb250ZXh0RGF0YS5tYXAoZnVuY3Rpb24gKG9TdWJDaGFydENvbnRleHREYXRhOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGE6IG9TdWJDaGFydENvbnRleHREYXRhLFxuXHRcdFx0XHRcdFx0XHRcdGVudGl0eVNldDogYCR7c01ldGFQYXRoUGFnZX0vJHtzQ2hhcnRQYXRofWBcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhQXR0cmlidXRlcy5wdXNoKHtcblx0XHRcdFx0XHRcdGNvbnRleHREYXRhOiBvU2luZ2xlQ29udGV4dC5nZXRPYmplY3QoKSxcblx0XHRcdFx0XHRcdGVudGl0eVNldDogc01ldGFQYXRoTGluZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0YVBhZ2VBdHRyaWJ1dGVzLnB1c2goe1xuXHRcdFx0Y29udGV4dERhdGE6IG9QYWdlQ29udGV4dC5nZXRPYmplY3QoKSxcblx0XHRcdGVudGl0eVNldDogc01ldGFQYXRoUGFnZVxuXHRcdH0pO1xuXHRcdC8vIEFkZGluZyBQYWdlIENvbnRleHQgdG8gc2VsZWN0aW9uIHZhcmlhbnRcblx0XHRhUGFnZUF0dHJpYnV0ZXMgPSB0aGlzLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ucmVtb3ZlU2Vuc2l0aXZlRGF0YShhUGFnZUF0dHJpYnV0ZXMsIHNNZXRhUGF0aFBhZ2UpO1xuXHRcdGNvbnN0IG9QYWdlTGV2ZWxTViA9IENvbW1vblV0aWxzLmFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50KG5ldyBTZWxlY3Rpb25WYXJpYW50KCksIGFQYWdlQXR0cmlidXRlcywgdGhpcy5nZXRWaWV3KCkpO1xuXHRcdGFBdHRyaWJ1dGVzID0gdGhpcy5faW50ZW50QmFzZWROYXZpZ2F0aW9uLnJlbW92ZVNlbnNpdGl2ZURhdGEoYUF0dHJpYnV0ZXMsIHNNZXRhUGF0aFBhZ2UpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50OiBvUGFnZUxldmVsU1YsXG5cdFx0XHRhdHRyaWJ1dGVzOiBhQXR0cmlidXRlc1xuXHRcdH07XG5cdH1cblxuXHRfZ2V0QmF0Y2hHcm91cHNGb3JWaWV3KCk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBvVmlld0RhdGEgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLFxuXHRcdFx0b0NvbmZpZ3VyYXRpb25zID0gb1ZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRcdFx0YUNvbmZpZ3VyYXRpb25zID0gb0NvbmZpZ3VyYXRpb25zICYmIE9iamVjdC5rZXlzKG9Db25maWd1cmF0aW9ucyksXG5cdFx0XHRhQmF0Y2hHcm91cHMgPSBbXCIkYXV0by5IZXJvZXNcIiwgXCIkYXV0by5EZWNvcmF0aW9uXCIsIFwiJGF1dG8uV29ya2Vyc1wiXTtcblxuXHRcdGlmIChhQ29uZmlndXJhdGlvbnMgJiYgYUNvbmZpZ3VyYXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdGFDb25maWd1cmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0XHRcdGNvbnN0IG9Db25maWd1cmF0aW9uID0gb0NvbmZpZ3VyYXRpb25zW3NLZXldIGFzIE1pY3JvQ2hhcnRNYW5pZmVzdENvbmZpZ3VyYXRpb247XG5cdFx0XHRcdGlmIChvQ29uZmlndXJhdGlvbi5yZXF1ZXN0R3JvdXBJZCA9PT0gXCJMb25nUnVubmVyc1wiKSB7XG5cdFx0XHRcdFx0YUJhdGNoR3JvdXBzLnB1c2goXCIkYXV0by5Mb25nUnVubmVyc1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBhQmF0Y2hHcm91cHM7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGluaXRpYWxpemUgcGFnaW5hdGlvbi5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiBvYmplY3QgcGFnZVxuXHQgKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBJbnRlcm5hbCBtb2RlbFxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgUGFyZW50IGxpc3QgYmluZGluZyB0byB1c2Vcblx0ICovXG5cdF9pbml0aWFsaXplUGFnaW5hdGlvbihjb250ZXh0OiBPRGF0YVY0Q29udGV4dCwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBsaXN0QmluZGluZz86IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRpZiAodmlld0xldmVsID4gMSkge1xuXHRcdFx0Y29uc3QgcGFnaW5hdG9yQ3VycmVudENvbnRleHQgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIpO1xuXHRcdFx0aWYgKHBhZ2luYXRvckN1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdUb1VzZSA9IHBhZ2luYXRvckN1cnJlbnRDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZShiaW5kaW5nVG9Vc2UsIHBhZ2luYXRvckN1cnJlbnRDb250ZXh0KTtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblx0XHRcdH0gZWxzZSBpZiAobGlzdEJpbmRpbmcpIHtcblx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZShsaXN0QmluZGluZywgY29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24oKTogdm9pZCB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IG9EYXRhUG9pbnRzID0gQ29tbW9uVXRpbHMuZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKFxuXHRcdFx0b1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRPdXRib3VuZHMoKVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1NoZWxsU2VydmljZXMgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFNoZWxsU2VydmljZXMoKTtcblx0XHRjb25zdCBvUGFnZUNvbnRleHQgPSBvVmlldyAmJiBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImlzSGVhZGVyRFBMaW5rVmlzaWJsZVwiLCB7fSk7XG5cdFx0aWYgKG9QYWdlQ29udGV4dCkge1xuXHRcdFx0b1BhZ2VDb250ZXh0XG5cdFx0XHRcdC5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9EYXRhOiBvYmplY3QpIHtcblx0XHRcdFx0XHRyZXR1cm4gZm5HZXRMaW5rcyhvRGF0YVBvaW50cywgb0RhdGEpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgbGlua3MgZnJvbSB0aGUgc2hlbGwgc2VydmljZVwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIG9FcnJvclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZuT25FcnJvcihvRXJyb3I6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0TG9nLmVycm9yKG9FcnJvcik7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZm5TZXRMaW5rRW5hYmxlbWVudChpZDogc3RyaW5nLCBhU3VwcG9ydGVkTGlua3M6IHsgc3VwcG9ydGVkPzogYm9vbGVhbiB9W10pOiB2b2lkIHtcblx0XHRcdGNvbnN0IHNMaW5rSWQgPSBpZDtcblx0XHRcdC8vIHByb2Nlc3MgdmlhYmxlIGxpbmtzIGZyb20gZ2V0TGlua3MgZm9yIGFsbCBkYXRhcG9pbnRzIGhhdmluZyBvdXRib3VuZFxuXHRcdFx0aWYgKGFTdXBwb3J0ZWRMaW5rcyAmJiBhU3VwcG9ydGVkTGlua3MubGVuZ3RoID09PSAxICYmIGFTdXBwb3J0ZWRMaW5rc1swXS5zdXBwb3J0ZWQpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBpc0hlYWRlckRQTGlua1Zpc2libGUvJHtzTGlua0lkfWAsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvU3ViRGF0YVBvaW50c1xuXHRcdCAqIEBwYXJhbSBvUGFnZURhdGFcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBmbkdldExpbmtzKFxuXHRcdFx0b1N1YkRhdGFQb2ludHM6IFJlY29yZDxcblx0XHRcdFx0c3RyaW5nLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IHN0cmluZztcblx0XHRcdFx0XHRhY3Rpb246IHN0cmluZztcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5bXTtcblx0XHRcdFx0fVxuXHRcdFx0Pixcblx0XHRcdG9QYWdlRGF0YTogb2JqZWN0XG5cdFx0KTogdm9pZCB7XG5cdFx0XHRmb3IgKGNvbnN0IHNJZCBpbiBvU3ViRGF0YVBvaW50cykge1xuXHRcdFx0XHRjb25zdCBvRGF0YVBvaW50ID0gb1N1YkRhdGFQb2ludHNbc0lkXTtcblx0XHRcdFx0Y29uc3Qgb1BhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0XHRcdFx0Y29uc3Qgb0xpbmsgPSBvVmlldy5ieUlkKHNJZCk7XG5cdFx0XHRcdGlmICghb0xpbmspIHtcblx0XHRcdFx0XHQvLyBmb3IgZGF0YSBwb2ludHMgY29uZmlndXJlZCBpbiBhcHAgZGVzY3JpcHRvciBidXQgbm90IGFubm90YXRlZCBpbiB0aGUgaGVhZGVyXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgb0xpbmtDb250ZXh0ID0gb0xpbmsuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgb0xpbmtEYXRhOiBvYmplY3QgPSBvTGlua0NvbnRleHQgJiYgb0xpbmtDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRsZXQgb01peGVkQ29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBtZXJnZSh7fSwgb1BhZ2VEYXRhLCBvTGlua0RhdGEpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0XHQvLyBwcm9jZXNzIHNlbWFudGljIG9iamVjdCBtYXBwaW5nc1xuXHRcdFx0XHRpZiAob0RhdGFQb2ludC5zZW1hbnRpY09iamVjdE1hcHBpbmcpIHtcblx0XHRcdFx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RNYXBwaW5nID0gb0RhdGFQb2ludC5zZW1hbnRpY09iamVjdE1hcHBpbmc7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIGluIGFTZW1hbnRpY09iamVjdE1hcHBpbmcpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9NYXBwaW5nID0gYVNlbWFudGljT2JqZWN0TWFwcGluZ1tpdGVtXTtcblx0XHRcdFx0XHRcdGNvbnN0IHNNYWluUHJvcGVydHkgPSBvTWFwcGluZ1tcIkxvY2FsUHJvcGVydHlcIl0hW1wiJFByb3BlcnR5UGF0aFwiXTtcblx0XHRcdFx0XHRcdGNvbnN0IHNNYXBwZWRQcm9wZXJ0eSA9IG9NYXBwaW5nW1wiU2VtYW50aWNPYmplY3RQcm9wZXJ0eVwiXSE7XG5cdFx0XHRcdFx0XHRpZiAoc01haW5Qcm9wZXJ0eSAhPT0gc01hcHBlZFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvTWl4ZWRDb250ZXh0Lmhhc093blByb3BlcnR5KHNNYWluUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld01hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRcdFx0XHRcdFx0b05ld01hcHBpbmdbc01hcHBlZFByb3BlcnR5XSA9IG9NaXhlZENvbnRleHRbc01haW5Qcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRcdFx0b01peGVkQ29udGV4dCA9IG1lcmdlKHt9LCBvTWl4ZWRDb250ZXh0LCBvTmV3TWFwcGluZykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIG9NaXhlZENvbnRleHRbc01haW5Qcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob01peGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3Qgc0tleSBpbiBvTWl4ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRpZiAoIXNLZXkuc3RhcnRzV2l0aChcIl9cIikgJiYgIXNLZXkuaW5jbHVkZXMoXCJvZGF0YS5jb250ZXh0XCIpKSB7XG5cdFx0XHRcdFx0XHRcdG9QYXJhbXNbc0tleV0gPSBvTWl4ZWRDb250ZXh0W3NLZXldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyB2YWxpZGF0ZSBpZiBhIGxpbmsgbXVzdCBiZSByZW5kZXJlZFxuXHRcdFx0XHRvU2hlbGxTZXJ2aWNlc1xuXHRcdFx0XHRcdC5pc05hdmlnYXRpb25TdXBwb3J0ZWQoW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6IHtcblx0XHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogb0RhdGFQb2ludC5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdFx0XHRhY3Rpb246IG9EYXRhUG9pbnQuYWN0aW9uXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHBhcmFtczogb1BhcmFtc1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0pXG5cdFx0XHRcdFx0LnRoZW4oKGFMaW5rcykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuU2V0TGlua0VuYWJsZW1lbnQoc0lkLCBhTGlua3MpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZuT25FcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2ZpbmRTdW1tYXJpemVCdXR0b24oKTogQnV0dG9uIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBvYmplY3RQYWdlVGl0bGUgPSBvYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkgYXMgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZTtcblx0XHRjb25zdCBhY3Rpb25zID0gb2JqZWN0UGFnZVRpdGxlPy5nZXRBY3Rpb25zKCk7XG5cdFx0bGV0IHN1bW1hcml6ZUJ1dHRvbjogQnV0dG9uIHwgdW5kZWZpbmVkO1xuXG5cdFx0Zm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuXHRcdFx0aWYgKGFjdGlvbi5pc0E8U3VtbWFyaXphdGlvbkJ1dHRvbj4oXCJzYXAuZmUubWFjcm9zLmFpLlN1bW1hcml6YXRpb25CdXR0b25cIikpIHtcblx0XHRcdFx0Y29uc3QgYnV0dG9uID0gYWN0aW9uLmdldENvbnRlbnQoKSBhcyBCdXR0b24gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChidXR0b24gJiYgYnV0dG9uLmdldElkKCkuZW5kc1dpdGgoXCI6OlN1bW1hcml6ZTo6YnV0dG9uXCIpKSB7XG5cdFx0XHRcdFx0c3VtbWFyaXplQnV0dG9uID0gYnV0dG9uO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN1bW1hcml6ZUJ1dHRvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBFdmFsdWF0ZXMgc3RhcnR1cCBwYXJhbWV0ZXJzIGFuZCB0cmlnZ2VycyB0aGUgc21hcnQgc3VtbWFyeSBhY3Rpb24gb24gdGhlIE9iamVjdCBQYWdlIGlmIHJlcXVpcmVkLlxuXHQgKlxuXHQgKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzIGluZGljYXRlIHRoYXQgYSBzbWFydCBzdW1tYXJ5IHNob3VsZCBiZSBwZXJmb3JtZWQgZm9yIHRoZSBjdXJyZW50IE9iamVjdCBQYWdlIGxldmVsLlxuXHQgKiBUaGUgbGV2ZWwgcGFyYW1ldGVyIGRldGVybWluZXMgd2hpY2ggT2JqZWN0IFBhZ2Ugc2hvdWxkIGJlIHN1bW1hcml6ZWQsIHdoaWNoIGlzIHJlbGV2YW50IGluIEZsZXhpYmxlIENvbHVtbiBMYXlvdXQgKEZDTCkgc2NlbmFyaW9zIHdoZXJlXG5cdCAqIG11bHRpcGxlIE9iamVjdCBQYWdlcyBtYXkgYmUgZGlzcGxheWVkIHNpbXVsdGFuZW91c2x5LlxuXHQgKiBJZiBubyBsZXZlbCBpcyBwcm92aWRlZCBpbiB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzLCB0aGUgbWV0aG9kIGRlZmF1bHRzIHRoZSBsZXZlbCB0byAxLlxuXHQgKiBJZiB0aGUgc3VtbWFyeSBhY3Rpb24gaXMgYWxsb3dlZCBhbmQgdGhlIFNtYXJ0U3VtbWFyaXplIGNhcGFiaWxpdHkgaXMgYXZhaWxhYmxlLCBpdCBsb2NhdGVzIHRoZSBzdW1tYXJpemUgYnV0dG9uIGFuZCB0cmlnZ2VycyBpdHMgcHJlc3MgZXZlbnQuXG5cdCAqIFRoZSBtZXRob2QgZW5zdXJlcyB0aGUgc3VtbWFyeSBpcyBvbmx5IGV4ZWN1dGVkIG9uY2UgcGVyIG5hdmlnYXRpb24gYW5kIGxvZ3MgZXJyb3JzIGlmIHByZXJlcXVpc2l0ZXMgYXJlIG5vdCBtZXQgb3IgdGhlIGJ1dHRvbiBpcyB1bmF2YWlsYWJsZS5cblx0ICogQWxsIGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHByb2Nlc3MgYXJlIGNhdWdodCBhbmQgbG9nZ2VkLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2hhbmRsZVNtYXJ0U3VtbWFyeVN0YXJ0dXBBY3Rpb24oKTogdm9pZCB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRhcHBDb21wb25lbnRcblx0XHRcdD8uZ2V0U3RhcnR1cFBhcmFtZXRlcnMoKVxuXHRcdFx0Py50aGVuKChzdGFydHVwUGFyYW1zOiBTdGFydHVwUGFyYW1ldGVycykgPT4ge1xuXHRcdFx0XHRpZiAoIXN0YXJ0dXBQYXJhbXMucHJlZmVycmVkQWN0aW9uIHx8ICFzdGFydHVwUGFyYW1zLnByZWZlcnJlZEFjdGlvblswXS5zdGFydHNXaXRoKFwic3VtbWFyeVwiKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGNoZWNrIGlmIHdlIGFyZSBvbiB0aGUgY29ycmVjdCBPUCBieSBjaGVja2luZyB0aGUgbGV2ZWwgcHJvdmlkZWQgaW4gdGhlIHN0YXJ0dXAgcGFyYW1ldGVyc1xuXHRcdFx0XHRjb25zdCB2aWV3TGV2ZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRcdFx0Y29uc3QgcHJlZmVycmVkQWN0aW9uTGV2ZWwgPVxuXHRcdFx0XHRcdHN0YXJ0dXBQYXJhbXMucHJlZmVycmVkQWN0aW9uWzBdID09PSBcInN1bW1hcnlcIiA/IDEgOiBwYXJzZUludChzdGFydHVwUGFyYW1zLnByZWZlcnJlZEFjdGlvblswXS5zcGxpdChcIi1cIilbMV0sIDEwKTtcblx0XHRcdFx0aWYgKGlzTmFOKHByZWZlcnJlZEFjdGlvbkxldmVsKSB8fCB2aWV3TGV2ZWwgIT09IHByZWZlcnJlZEFjdGlvbkxldmVsKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgc3VtbWFyeSBhY3Rpb24gc2hhbGwgYmUgZXhlY3V0ZWQgbm93IChpdCBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBleGVjdXRlZCBieSBhIGhpZ2hlciBsZXZlbCBPUClcblx0XHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRQcmVmZXJyZWRBY3Rpb25TdGF0dXMoKSA9PT0gUHJlZmVycmVkQWN0aW9uU3RhdHVzLkNhblBlcmZvcm0pIHtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuc2V0UHJlZmVycmVkQWN0aW9uU3RhdHVzKFByZWZlcnJlZEFjdGlvblN0YXR1cy5BbHJlYWR5UGVyZm9ybWVkKTsgLy8gdG8gcHJldmVudCBvdGhlciBPUHMgb24gaGlnaGVyIGxldmVscyB0byBleGVjdXRlIHRoZSBzdW1tYXJ5IGFnYWluXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgU21hcnRTdW1tYXJpemUgY2FwYWJpbGl0eSBpcyBhdmFpbGFibGVcblx0XHRcdFx0Y29uc3QgZW52aXJvbm1lbnRTZXJ2aWNlID0gYXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCk7XG5cdFx0XHRcdGlmICghZW52aXJvbm1lbnRTZXJ2aWNlPy5lbnZpcm9ubWVudENhcGFiaWxpdGllcy5TbWFydFN1bW1hcml6ZSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIlNtYXJ0IFN1bW1hcml6YXRpb24gd2FzIG5vdCB0cmlnZ2VyZWQgYmVjYXVzZSBTbWFydFN1bW1hcml6ZSBjYXBhYmlsaXR5IGlzIG5vdCBhdmFpbGFibGVcIik7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRmluZCB0aGUgU3VtbWFyeSBidXR0b25cblx0XHRcdFx0Y29uc3Qgc3VtbWFyaXplQnV0dG9uID0gdGhpcy5fZmluZFN1bW1hcml6ZUJ1dHRvbigpO1xuXG5cdFx0XHRcdGlmIChzdW1tYXJpemVCdXR0b24gJiYgc3VtbWFyaXplQnV0dG9uLmdldFZpc2libGUoKSAmJiBzdW1tYXJpemVCdXR0b24uZ2V0RW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0c3VtbWFyaXplQnV0dG9uLmZpcmVQcmVzcygpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0XHRcIlNtYXJ0IFN1bW1hcml6YXRpb24gd2FzIG5vdCB0cmlnZ2VyZWQgYmVjYXVzZSB0aGUgU3VtbWFyaXplIGJ1dHRvbiBpcyBlaXRoZXIgbm90IHZpc2libGUgb3Igbm90IGVuYWJsZWQgb3Igbm90IGZvdW5kLlwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgc3RhcnR1cCBwYXJhbWV0ZXJzIG9yIHRyaWdnZXJpbmcgc21hcnQgc3VtbWFyeTpcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0aGFuZGxlcnMgPSB7XG5cdFx0b25QcmltYXJ5QWN0aW9uKFxuXHRcdFx0b0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLFxuXHRcdFx0b1ZpZXc6IEZFVmlldyxcblx0XHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdO1xuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRcdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0XHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdG5vdEFwcGxpY2FibGVDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdGVuYWJsZUF1dG9TY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0XHR9LFxuXHRcdFx0bUNvbmRpdGlvbnM6IHtcblx0XHRcdFx0cG9zaXRpdmVBY3Rpb25WaXNpYmxlOiBib29sZWFuO1xuXHRcdFx0XHRwb3NpdGl2ZUFjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG5cdFx0XHRcdGVkaXRBY3Rpb25WaXNpYmxlOiBib29sZWFuO1xuXHRcdFx0XHRlZGl0QWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcblx0XHRcdH1cblx0XHQpOiB2b2lkIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogSW52b2tlcyB0aGUgcGFnZSBwcmltYXJ5IGFjdGlvbiB3aGVuIHRoZSB1c2VyIHByZXNzZXMgQ3RybCtFbnRlciAoQ21kK0VudGVyIG9uIG1hY09TKS5cblx0XHRcdCAqL1xuXG5cdFx0XHRjb25zdCBwcmltYXJ5Q2FuZGlkYXRlID0gb0NvbnRyb2xsZXIuX2dldFByaW1hcnlBY3Rpb25TaG9ydGN1dENhbmRpZGF0ZXMob1ZpZXcpWzBdO1xuXG5cdFx0XHQvKiBCeSBkZXNpZ24sIHRoZXJlIG11c3QgYmUgYXQgbW9zdCBvbmUgY2FuZGlkYXRlIGR1ZSB0byB0aGUgXCJzaW5nbGUgZW1waGFzaXMgcGVyIHBhZ2VcIiBydWxlLlxuXHRcdFx0ICAgSWYgYSBwcmltYXJ5LWVudGVyIHRhcmdldCBpcyBmb3VuZCwgaXQgbXVzdCBmdWxseSB0YWtlIG92ZXIgQ3RybC9DbWQrRW50ZXIuKi9cblxuXHRcdFx0aWYgKHByaW1hcnlDYW5kaWRhdGUpIHtcblx0XHRcdFx0aWYgKCFwcmltYXJ5Q2FuZGlkYXRlLmdldEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdC8vIFRha2Ugb3ZlciBDdHJsL0NtZCtFbnRlciwgYnV0IGRvIG5vdCB0cmlnZ2VyIGFueXRoaW5nIHdoZW4gdGhlIHByaW1hcnkgYWN0aW9uIGlzIGRpc2FibGVkLlxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJpbWFyeUNhbmRpZGF0ZS5pc0EoXCJzYXAubS5CdXR0b25cIikpIHtcblx0XHRcdFx0XHQocHJpbWFyeUNhbmRpZGF0ZSBhcyBCdXR0b24pLmZpcmVQcmVzcygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgocHJpbWFyeUNhbmRpZGF0ZSBhcyBNZW51QnV0dG9uKS5pc0EoXCJzYXAubS5NZW51QnV0dG9uXCIpKSB7XG5cdFx0XHRcdFx0KHByaW1hcnlDYW5kaWRhdGUgYXMgTWVudUJ1dHRvbikuZmlyZURlZmF1bHRBY3Rpb24oKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpVmlld0xldmVsID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdFx0aWYgKG1Db25kaXRpb25zLnBvc2l0aXZlQWN0aW9uVmlzaWJsZSkge1xuXHRcdFx0XHRpZiAobUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25FbmFibGVkKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIuaGFuZGxlcnMub25DYWxsQWN0aW9uKG9WaWV3LCBzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG1Db25kaXRpb25zLmVkaXRBY3Rpb25WaXNpYmxlKSB7XG5cdFx0XHRcdGlmIChtQ29uZGl0aW9ucy5lZGl0QWN0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0RG9jdW1lbnQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpVmlld0xldmVsID09PSAxICYmIENvbW1vblV0aWxzLmdldElzRWRpdGFibGUob1ZpZXcpKSB7XG5cdFx0XHRcdG9Db250cm9sbGVyLl9zYXZlRG9jdW1lbnQoKTtcblx0XHRcdH0gZWxzZSBpZiAoQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZShvVmlldykpIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuX2FwcGx5RG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBNYW5hZ2VzIHRoZSBjb250ZXh0IGNoYW5nZSBldmVudCBvbiB0aGUgdGFibGVzLlxuXHRcdCAqIFRoZSBmb2N1cyBpcyBzZXQgaWYgdGhpcyBjaGFuZ2UgaXMgcmVsYXRlZCB0byBhbiBlZGl0RmxvdyBhY3Rpb24gYW5kXG5cdFx0ICogYW4gZXZlbnQgaXMgZmlyZWQgb24gdGhlIG9iamVjdFBhZ2UgbWVzc2FnZUJ1dHRvbi5cblx0XHQgKiBAcGFyYW0gdGhpcyBUaGUgb2JqZWN0UGFnZSBjb250cm9sbGVyXG5cdFx0ICogQHBhcmFtIGV2ZW50IFRoZSBVSTUgZXZlbnRcblx0XHQgKi9cblx0XHRhc3luYyBvblRhYmxlQ29udGV4dENoYW5nZSh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlciwgZXZlbnQ6IFVJNUV2ZW50PHt9LCBUYWJsZUFQST4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdGNvbnN0IHRhYmxlQVBJID0gZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRjb25zdCB0YWJsZSA9IHRhYmxlQVBJLmNvbnRlbnQ7XG5cdFx0XHRjb25zdCBjdXJyZW50QWN0aW9uUHJvbWlzZSA9IHRoaXMuZWRpdEZsb3cuZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTtcblx0XHRcdGNvbnN0IHRhYmxlQ29udGV4dHMgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcodGFibGUpPy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKTtcblxuXHRcdFx0aWYgKGN1cnJlbnRBY3Rpb25Qcm9taXNlICYmIHRhYmxlQ29udGV4dHM/Lmxlbmd0aCkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGFjdGlvblJlc3BvbnNlID0gYXdhaXQgY3VycmVudEFjdGlvblByb21pc2U7XG5cdFx0XHRcdFx0aWYgKGFjdGlvblJlc3BvbnNlPy5jb250cm9sSWQgPT09IHRhYmxlLmdldElkKCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGFjdGlvbkRhdGEgPSBhY3Rpb25SZXNwb25zZS5vRGF0YTtcblx0XHRcdFx0XHRcdGNvbnN0IGtleXMgPSBhY3Rpb25SZXNwb25zZS5rZXlzO1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV3SXRlbSA9XG5cdFx0XHRcdFx0XHRcdHRhYmxlQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHQuZmluZCgodGFibGVDb250ZXh0OiBDb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCB0YWJsZURhdGEgPSB0YWJsZUNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ga2V5cy5ldmVyeSgoa2V5OiBzdHJpbmcpID0+IHRhYmxlRGF0YVtrZXldID09PSBhY3Rpb25EYXRhW2tleV0pO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0Py5nZXRJbmRleCgpID8/IC0xO1xuXHRcdFx0XHRcdFx0aWYgKG5ld0l0ZW0gIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRpYWxvZyA9IEluc3RhbmNlTWFuYWdlci5nZXRPcGVuRGlhbG9ncygpLmZpbmQoKGRpYWxvZykgPT4gZGlhbG9nLmRhdGEoXCJGdWxsU2NyZWVuRGlhbG9nXCIpICE9PSB0cnVlKTtcblx0XHRcdFx0XHRcdFx0aWYgKGRpYWxvZykge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGJ5IGRlc2lnbiwgYSBzYXAubS5kaWFsb2cgc2V0IHRoZSBmb2N1cyB0byB0aGUgcHJldmlvdXMgZm9jdXNlZCBlbGVtZW50IHdoZW4gY2xvc2luZy5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgd2FpdCBmb3IgdGhlIGRpYWxvZyB0byBiZSBjbG9zZWQgYmVmb3JlIHNldCB0aGUgZm9jdXMgdG8gYW5vdGhlciBlbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0ZGlhbG9nLmF0dGFjaEV2ZW50T25jZShcImFmdGVyQ2xvc2VcIiwgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGFibGUuZm9jdXNSb3cobmV3SXRlbSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFibGUuZm9jdXNSb3cobmV3SXRlbSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhpcy5lZGl0Rmxvdy5kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihgQW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNjcm9sbGluZyB0byB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtOiAke2V9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIGZpcmUgTW9kZWxDb250ZXh0Q2hhbmdlIG9uIHRoZSBtZXNzYWdlIGJ1dHRvbiB3aGVuZXZlciB0aGUgdGFibGUgY29udGV4dCBjaGFuZ2VzXG5cdFx0XHR0aGlzLm1lc3NhZ2VCdXR0b24uZmlyZU1vZGVsQ29udGV4dENoYW5nZSgpO1xuXHRcdH0sXG5cblx0XHRvblRhYmxlQmluZGluZ1VwZGF0ZWQodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpOiB2b2lkIHtcblx0XHRcdHRoaXMubWVzc2FnZUJ1dHRvbi5maXJlTW9kZWxDb250ZXh0Q2hhbmdlKCk7XG5cdFx0fSxcblxuXHRcdGFzeW5jIG9uQ2FsbEFjdGlvbihcblx0XHRcdG9WaWV3OiBGRVZpZXcsXG5cdFx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcblx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRcdGNvbnRleHRzPzogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRcdGJTdGF0aWNBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0XHRub3RBcHBsaWNhYmxlQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0XHRlbmFibGVBdXRvU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0XHRkaXNhYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuO1xuXHRcdFx0fVxuXHRcdCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG5cblx0XHRcdC8vIFdhaXQgZm9yIFZIIHZhbHVlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyB0aGUgYWN0aW9uXG5cdFx0XHRhd2FpdCBvQ29udHJvbGxlci5lZGl0Rmxvdy5zeW5jVGFzaygpO1xuXG5cdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIuZWRpdEZsb3dcblx0XHRcdFx0Lmludm9rZUFjdGlvbihzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMpXG5cdFx0XHRcdC50aGVuKChyZXMpID0+IHtcblx0XHRcdFx0XHRvQ29udHJvbGxlci5fc2hvd01lc3NhZ2VQb3BvdmVyKCk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlcztcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0XHRvQ29udHJvbGxlci5fc2hvd01lc3NhZ2VQb3BvdmVyKCk7XG5cdFx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0b25EYXRhUG9pbnRUaXRsZVByZXNzZWQoXG5cdFx0XHRvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsXG5cdFx0XHRvU291cmNlOiBDb250cm9sLFxuXHRcdFx0b01hbmlmZXN0T3V0Ym91bmQ6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0T3V0Ym91bmRFbnRyeT4sXG5cdFx0XHRzQ29udHJvbENvbmZpZzogc3RyaW5nLFxuXHRcdFx0c0NvbGxlY3Rpb25QYXRoOiBzdHJpbmdcblx0XHQpOiB2b2lkIHtcblx0XHRcdG9NYW5pZmVzdE91dGJvdW5kID0gdHlwZW9mIG9NYW5pZmVzdE91dGJvdW5kID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShvTWFuaWZlc3RPdXRib3VuZCkgOiBvTWFuaWZlc3RPdXRib3VuZDtcblx0XHRcdGNvbnN0IG9UYXJnZXRJbmZvID0gb01hbmlmZXN0T3V0Ym91bmRbc0NvbnRyb2xDb25maWddLFxuXHRcdFx0XHRvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpISxcblx0XHRcdFx0c01ldGFQYXRoID0gb0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dFxuXHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFQYXRoKG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGxldCBhU2VtYW50aWNPYmplY3RNYXBwaW5nID0gQ29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nKG9UYXJnZXRJbmZvKSxcblx0XHRcdFx0YU5hdmlnYXRpb25EYXRhID0gb0NvbnRyb2xsZXIuX2dldENoYXJ0Q29udGV4dERhdGEob0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCwgc0NvbGxlY3Rpb25QYXRoKSxcblx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzO1xuXG5cdFx0XHRhTmF2aWdhdGlvbkRhdGEgPSBhTmF2aWdhdGlvbkRhdGEubWFwKGZ1bmN0aW9uIChvTmF2aWdhdGlvbkRhdGE6IHVua25vd24pIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRkYXRhOiBvTmF2aWdhdGlvbkRhdGEsXG5cdFx0XHRcdFx0bWV0YVBhdGg6IHNNZXRhUGF0aCArIChzQ29sbGVjdGlvblBhdGggPyBgLyR7c0NvbGxlY3Rpb25QYXRofWAgOiBcIlwiKVxuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAob1RhcmdldEluZm8gJiYgb1RhcmdldEluZm8ucGFyYW1ldGVycykge1xuXHRcdFx0XHRjb25zdCBvUGFyYW1zID0gb1RhcmdldEluZm8ucGFyYW1ldGVycyAmJiBvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLmdldE91dGJvdW5kUGFyYW1zKG9UYXJnZXRJbmZvLnBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoT2JqZWN0LmtleXMob1BhcmFtcykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9QYXJhbXM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIENoZWNrIGlmIGltcGxpY2l0IHNlbWFudGljIG9iamVjdCBtYXBwaW5nIGlzIG5lZWRlZFxuXHRcdFx0aWYgKGFTZW1hbnRpY09iamVjdE1hcHBpbmcubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGNvbnN0IGN1c3RvbURhdGEgPSBvU291cmNlLmdldEN1c3RvbURhdGEoKS5maW5kKChkYXRhKSA9PiBkYXRhLmdldEtleSgpID09PSBcIlZhbHVlUHJvcGVydHlQYXRoXCIpO1xuXHRcdFx0XHRpZiAoY3VzdG9tRGF0YSkge1xuXHRcdFx0XHRcdGFTZW1hbnRpY09iamVjdE1hcHBpbmcgPSBvQ29udHJvbGxlci5fZ2V0SW1wbGljaXRTZW1hbnRpY09iamVjdE1hcHBpbmdGb3JEYXRhUG9pbnRzKFxuXHRcdFx0XHRcdFx0Y3VzdG9tRGF0YS5nZXRWYWx1ZSgpLFxuXHRcdFx0XHRcdFx0b1RhcmdldEluZm8uc2VtYW50aWNPYmplY3Rcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvVGFyZ2V0SW5mbyAmJiBvVGFyZ2V0SW5mby5zZW1hbnRpY09iamVjdCAmJiBvVGFyZ2V0SW5mby5hY3Rpb24pIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5uYXZpZ2F0ZShvVGFyZ2V0SW5mby5zZW1hbnRpY09iamVjdCwgb1RhcmdldEluZm8uYWN0aW9uLCB7XG5cdFx0XHRcdFx0bmF2aWdhdGlvbkNvbnRleHRzOiBhTmF2aWdhdGlvbkRhdGEsXG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nOiBhU2VtYW50aWNPYmplY3RNYXBwaW5nLFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVyczogYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBUcmlnZ2VycyBhbiBvdXRib3VuZCBuYXZpZ2F0aW9uIHdoZW4gYSB1c2VyIGNob29zZXMgdGhlIGNoZXZyb24uXG5cdFx0ICogQHBhcmFtIG9Db250cm9sbGVyXG5cdFx0ICogQHBhcmFtIHNPdXRib3VuZFRhcmdldCBOYW1lIG9mIHRoZSBvdXRib3VuZCB0YXJnZXQgKG5lZWRzIHRvIGJlIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0KVxuXHRcdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIGZvciB0aGUgdGFyZ2V0IGFwcFxuXHRcdCAqIEBwYXJhbSBzQ3JlYXRlUGF0aCBDcmVhdGUgcGF0aCB3aGVuIHRoZSBjaGV2cm9uIGlzIGNyZWF0ZWQuXG5cdFx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZCAoPz8/IG1heWJlIG9ubHkgb25jZSBmaW5pc2hlZD8pXG5cdFx0ICogQGZpbmFsXG5cdFx0ICovXG5cdFx0YXN5bmMgb25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKFxuXHRcdFx0b0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLFxuXHRcdFx0c091dGJvdW5kVGFyZ2V0OiBzdHJpbmcsXG5cdFx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0XHRzQ3JlYXRlUGF0aDogc3RyaW5nXG5cdFx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXIsIHNPdXRib3VuZFRhcmdldCwgb0NvbnRleHQsIHNDcmVhdGVQYXRoKTtcblx0XHR9LFxuXG5cdFx0b25OYXZpZ2F0ZUNoYW5nZSh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlciwgb0V2ZW50OiBVSTVFdmVudDx7IHN1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uIH0+KTogdm9pZCB7XG5cdFx0XHQvL3dpbGwgYmUgY2FsbGVkIGFsd2F5cyB3aGVuIHdlIGNsaWNrIG9uIGEgc2VjdGlvbiB0YWJcblx0XHRcdHRoaXMuYlNlY3Rpb25OYXZpZ2F0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBQcmV2ZW50IFZpZXdTdGF0ZSBmcm9tIG92ZXJyaWRpbmcgdGhlIHVzZXIncyBtYW51YWwgdGFiIHNlbGVjdGlvbi5cblx0XHRcdC8vIFRoaXMgaXMgaW1wb3J0YW50IGFmdGVyIGRpc2NhcmQgd2hlbiBWaWV3U3RhdGUuYXBwbHkgbWlnaHQgdHJ5IHRvIHJlc3RvcmUgdGhlIHByZXZpb3VzIHNlY3Rpb24uXG5cdFx0XHR0aGlzLnNraXBWaWV3U3RhdGVTZWN0aW9uUmVzdG9yZSA9IHRydWU7XG5cblx0XHRcdGNvbnN0IHN1YlNlY3Rpb24gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3ViU2VjdGlvblwiKTtcblx0XHRcdHRoaXMudGFyZ2V0U3ViU2VjdGlvbiA9IHN1YlNlY3Rpb247XG5cblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblxuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKSAmJlxuXHRcdFx0XHR0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLnNlY3Rpb25MYXlvdXQgPT09IFwiVGFic1wiICYmXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImVycm9yTmF2aWdhdGlvblNlY3Rpb25GbGFnXCIpID09PSBmYWxzZVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShbc3ViU2VjdGlvbl0sIHRydWUpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25WYXJpYW50U2VsZWN0ZWQ6IGZ1bmN0aW9uICh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcik6IHZvaWQge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH0sXG5cdFx0b25WYXJpYW50U2F2ZWQ6IGZ1bmN0aW9uICh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcik6IHZvaWQge1xuXHRcdFx0Ly9UT0RPOiBTaG91bGQgcmVtb3ZlIHRoaXMgc2V0VGltZU91dCBvbmNlIFZhcmlhbnQgTWFuYWdlbWVudCBwcm92aWRlcyBhbiBhcGkgdG8gZmV0Y2ggdGhlIGN1cnJlbnQgdmFyaWFudCBrZXkgb24gc2F2ZVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdH0sIDIwMDApO1xuXHRcdH0sXG5cdFx0bmF2aWdhdGVUb1N1YlNlY3Rpb246IGZ1bmN0aW9uIChvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIHZEZXRhaWxDb25maWc6IHN0cmluZyB8IG9iamVjdCk6IHZvaWQge1xuXHRcdFx0Y29uc3Qgb0RldGFpbENvbmZpZyA9IHR5cGVvZiB2RGV0YWlsQ29uZmlnID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZSh2RGV0YWlsQ29uZmlnKSA6IHZEZXRhaWxDb25maWc7XG5cblx0XHRcdC8vIERldGVybWluZSB0aGUgdGFyZ2V0IElEIGJhc2VkIG9uIGlucHV0IHR5cGVcblx0XHRcdGxldCB0YXJnZXRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHR5cGVvZiBvRGV0YWlsQ29uZmlnID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRhcmdldElkID0gb0RldGFpbENvbmZpZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFByaW9yaXR5OiBzdWJTZWN0aW9uSWQgPiBzZWN0aW9uSWRcblx0XHRcdFx0dGFyZ2V0SWQgPSBvRGV0YWlsQ29uZmlnLnN1YlNlY3Rpb25JZCA/PyBvRGV0YWlsQ29uZmlnLnNlY3Rpb25JZDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRhcmdldElkKSB7XG5cdFx0XHRcdG9Db250cm9sbGVyLmdldEV4dGVuc2lvbkFQSSgpLm5hdmlnYXRlVG9TdWJTZWN0aW9uKHRhcmdldElkKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Y2xvc2VDb2xsYWJvcmF0aW9uU3RyaXA6IGZ1bmN0aW9uICh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcik6IHZvaWQge1xuXHRcdFx0dGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKS5zZXRQcm9wZXJ0eShcIi9zaG93Q29sbGFib3JhdGlvblN0cmlwXCIsIGZhbHNlKTtcblx0XHR9LFxuXG5cdFx0Y2xvc2VPUE1lc3NhZ2VTdHJpcDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKTogdm9pZCB7XG5cdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRjb25zdCBiSXNJbkVkaXRNb2RlID0gQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZSh2aWV3KTtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB2aWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIik7XG5cdFx0XHRjb25zdCBtZXNzYWdlc3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dCA9IGludGVybmFsTW9kZWxcblx0XHRcdFx0LmJpbmRDb250ZXh0KHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkuX2dldE1lc3NhZ2VTdHJpcEJpbmRpbmdDb250ZXh0UGF0aCgpKVxuXHRcdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCkhO1xuXHRcdFx0Ly8gUmVtb3ZlIGNvbnRleHQgYm91bmQgbWVzc2FnZXMgYW5kIHNldCB0aGUgcHJvcGVydHkgdG8gZmFsc2UgZm9yIHRoZSBiYWNrZW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgaW4gZWRpdCBtb2RlLlxuXHRcdFx0aWYgKCFiSXNJbkVkaXRNb2RlICYmIG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiT1BCYWNrZW5kTWVzc2FnZVZpc2libGVcIikgPT09IHRydWUpIHtcblx0XHRcdFx0Y29uc3QgY29udGV4dEJvdW5kTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHRcdChtZXNzYWdlOiBNZXNzYWdlKSA9PlxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlLmdldFRhcmdldHMoKVswXSA9PT0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpICYmIG1lc3NhZ2UuZ2V0UGVyc2lzdGVudCgpID09PSB0cnVlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKGNvbnRleHRCb3VuZE1lc3NhZ2VzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhjb250ZXh0Qm91bmRNZXNzYWdlcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiT1BCYWNrZW5kTWVzc2FnZVZpc2libGVcIiwgZmFsc2UpO1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS5oaWRlTWVzc2FnZSgpO1xuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG4iXSwibWFwcGluZ3MiOiI7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
2072
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYXJpYW50VHlwZSIsIlZhcmlhbnRNYW5hZ2VtZW50QkIiLCJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiUHJlZmVycmVkQWN0aW9uU3RhdHVzIiwiUHJlZmVycmVkQWN0aW9uU3RhdHVzVHlwZSIsIk9iamVjdFBhZ2VDb250cm9sbGVyIiwiX2RlYyIsImRlZmluZVVJNUNsYXNzIiwiX2RlYzIiLCJ1c2luZ0V4dGVuc2lvbiIsIlBsYWNlaG9sZGVyIiwiX2RlYzMiLCJTaGFyZSIsIm92ZXJyaWRlIiwiU2hhcmVPdmVycmlkZXMiLCJfZGVjNCIsIkludGVybmFsUm91dGluZyIsIkludGVybmFsUm91dGluZ092ZXJyaWRlIiwiX2RlYzUiLCJQYWdpbmF0b3IiLCJQYWdpbmF0b3JPdmVycmlkZSIsIl9kZWM2IiwiTWVzc2FnZUhhbmRsZXIiLCJNZXNzYWdlSGFuZGxlck92ZXJyaWRlIiwiX2RlYzciLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsIl9kZWM4IiwiQ29sbGFib3JhdGlvbk1hbmFnZXIiLCJDb2xsYWJvcmF0aW9uTWFuYWdlck92ZXJyaWRlIiwiX2RlYzkiLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE5hdmlnYXRpb25Nb2RlIiwiYklzU3RpY2t5RWRpdE1vZGUiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsImdldFN0aWNreUVkaXRNb2RlIiwidW5kZWZpbmVkIiwiX2RlYzAiLCJWaWV3U3RhdGUiLCJWaWV3U3RhdGVPdmVycmlkZXMiLCJfZGVjMSIsIlBhZ2VSZWFkeSIsImlzQ29udGV4dEV4cGVjdGVkIiwiX2RlYzEwIiwicHVibGljRXh0ZW5zaW9uIiwiX2RlYzExIiwiZmluYWxFeHRlbnNpb24iLCJfZGVjMTIiLCJfZGVjMTMiLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsIl9jbGFzcyIsIl9jbGFzczIiLCJfUGFnZUNvbnRyb2xsZXIiLCJhcmdzIiwiX3RoaXMiLCJjYWxsIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJfZGVzY3JpcHRvciIsIl9kZXNjcmlwdG9yMiIsIl9kZXNjcmlwdG9yMyIsIl9kZXNjcmlwdG9yNCIsIl9kZXNjcmlwdG9yNSIsIl9kZXNjcmlwdG9yNiIsIl9kZXNjcmlwdG9yNyIsIl9kZXNjcmlwdG9yOCIsIl9kZXNjcmlwdG9yOSIsIl9kZXNjcmlwdG9yMCIsImludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlU2V0VXAiLCJtZXJnZVBhdGNoRHJhZnQiLCJmY2xDbG9zZUhhbmRsZXJTZXQiLCJza2lwVmlld1N0YXRlU2VjdGlvblJlc3RvcmUiLCJpc05ld0JpbmRpbmdDb250ZXh0IiwiaGFuZGxlcnMiLCJvblByaW1hcnlBY3Rpb24iLCJvQ29udHJvbGxlciIsIm9WaWV3Iiwib0NvbnRleHQiLCJzQWN0aW9uTmFtZSIsIm1QYXJhbWV0ZXJzIiwibUNvbmRpdGlvbnMiLCJwcmltYXJ5Q2FuZGlkYXRlIiwiX2dldFByaW1hcnlBY3Rpb25TaG9ydGN1dENhbmRpZGF0ZXMiLCJnZXRFbmFibGVkIiwiaXNBIiwiZmlyZVByZXNzIiwiZmlyZURlZmF1bHRBY3Rpb24iLCJpVmlld0xldmVsIiwiZ2V0Vmlld0RhdGEiLCJ2aWV3TGV2ZWwiLCJwb3NpdGl2ZUFjdGlvblZpc2libGUiLCJwb3NpdGl2ZUFjdGlvbkVuYWJsZWQiLCJvbkNhbGxBY3Rpb24iLCJlZGl0QWN0aW9uVmlzaWJsZSIsImVkaXRBY3Rpb25FbmFibGVkIiwiX2VkaXREb2N1bWVudCIsIkNvbW1vblV0aWxzIiwiZ2V0SXNFZGl0YWJsZSIsIl9zYXZlRG9jdW1lbnQiLCJfYXBwbHlEb2N1bWVudCIsIm9uVGFibGVDb250ZXh0Q2hhbmdlIiwiZXZlbnQiLCJ0YWJsZUFQSSIsImdldFNvdXJjZSIsInRhYmxlIiwiY29udGVudCIsImN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZWRpdEZsb3ciLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsInRhYmxlQ29udGV4dHMiLCJfZ2V0VGFibGVCaW5kaW5nIiwiZ2V0QWxsQ3VycmVudENvbnRleHRzIiwibGVuZ3RoIiwiYWN0aW9uUmVzcG9uc2UiLCJjb250cm9sSWQiLCJnZXRJZCIsImFjdGlvbkRhdGEiLCJvRGF0YSIsImtleXMiLCJuZXdJdGVtIiwiZmluZCIsInRhYmxlQ29udGV4dCIsInRhYmxlRGF0YSIsImdldE9iamVjdCIsImV2ZXJ5Iiwia2V5IiwiZ2V0SW5kZXgiLCJkaWFsb2ciLCJJbnN0YW5jZU1hbmFnZXIiLCJnZXRPcGVuRGlhbG9ncyIsImRhdGEiLCJhdHRhY2hFdmVudE9uY2UiLCJmb2N1c1JvdyIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZSIsIkxvZyIsImVycm9yIiwibWVzc2FnZUJ1dHRvbiIsImZpcmVNb2RlbENvbnRleHRDaGFuZ2UiLCJvblRhYmxlQmluZGluZ1VwZGF0ZWQiLCJzeW5jVGFzayIsImludm9rZUFjdGlvbiIsInRoZW4iLCJyZXMiLCJfc2hvd01lc3NhZ2VQb3BvdmVyIiwiY2F0Y2giLCJvbkRhdGFQb2ludFRpdGxlUHJlc3NlZCIsIm9Tb3VyY2UiLCJvTWFuaWZlc3RPdXRib3VuZCIsInNDb250cm9sQ29uZmlnIiwic0NvbGxlY3Rpb25QYXRoIiwiSlNPTiIsInBhcnNlIiwib1RhcmdldEluZm8iLCJvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzTWV0YVBhdGgiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImFTZW1hbnRpY09iamVjdE1hcHBpbmciLCJnZXRTZW1hbnRpY09iamVjdE1hcHBpbmciLCJhTmF2aWdhdGlvbkRhdGEiLCJfZ2V0Q2hhcnRDb250ZXh0RGF0YSIsImFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVycyIsIm1hcCIsIm9OYXZpZ2F0aW9uRGF0YSIsIm1ldGFQYXRoIiwicGFyYW1ldGVycyIsIm9QYXJhbXMiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiZ2V0T3V0Ym91bmRQYXJhbXMiLCJPYmplY3QiLCJjdXN0b21EYXRhIiwiZ2V0Q3VzdG9tRGF0YSIsImdldEtleSIsIl9nZXRJbXBsaWNpdFNlbWFudGljT2JqZWN0TWFwcGluZ0ZvckRhdGFQb2ludHMiLCJnZXRWYWx1ZSIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwibmF2aWdhdGUiLCJuYXZpZ2F0aW9uQ29udGV4dHMiLCJzZW1hbnRpY09iamVjdE1hcHBpbmciLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJzT3V0Ym91bmRUYXJnZXQiLCJzQ3JlYXRlUGF0aCIsIm9uTmF2aWdhdGVDaGFuZ2UiLCJvRXZlbnQiLCJiU2VjdGlvbk5hdmlnYXRlZCIsInN1YlNlY3Rpb24iLCJnZXRQYXJhbWV0ZXIiLCJ0YXJnZXRTdWJTZWN0aW9uIiwiZ2V0RXh0ZW5zaW9uQVBJIiwidXBkYXRlQXBwU3RhdGUiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJzZWN0aW9uTGF5b3V0IiwiZ2V0UHJvcGVydHkiLCJfdXBkYXRlRm9jdXNJbkVkaXRNb2RlIiwib25WYXJpYW50U2VsZWN0ZWQiLCJvblZhcmlhbnRTYXZlZCIsInNldFRpbWVvdXQiLCJ0cmFja1ZhcmlhbnRTYXZlZFRlbGVtZXRyeSIsIm9uVmFyaWFudE1hbmFnZWQiLCJ0cmFja1ZhcmlhbnRNYW5hZ2VkVGVsZW1ldHJ5IiwibmF2aWdhdGVUb1N1YlNlY3Rpb24iLCJ2RGV0YWlsQ29uZmlnIiwib0RldGFpbENvbmZpZyIsInRhcmdldElkIiwic3ViU2VjdGlvbklkIiwic2VjdGlvbklkIiwiY2xvc2VDb2xsYWJvcmF0aW9uU3RyaXAiLCJzZXRQcm9wZXJ0eSIsImNsb3NlT1BNZXNzYWdlU3RyaXAiLCJ2aWV3IiwiYklzSW5FZGl0TW9kZSIsImludGVybmFsTW9kZWwiLCJtZXNzYWdlc3RyaXBJbnRlcm5hbE1vZGVsQ29udGV4dCIsImJpbmRDb250ZXh0IiwiX2dldE1lc3NhZ2VTdHJpcEJpbmRpbmdDb250ZXh0UGF0aCIsImdldEJvdW5kQ29udGV4dCIsImNvbnRleHRCb3VuZE1lc3NhZ2VzIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZpbHRlciIsIm1lc3NhZ2UiLCJnZXRUYXJnZXRzIiwiZ2V0UGVyc2lzdGVudCIsInJlbW92ZU1lc3NhZ2VzIiwiaGlkZU1lc3NhZ2UiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsInJvb3QiLCJvbmx5QWN0aW9uYWJsZSIsImZpbmRBZ2dyZWdhdGVkT2JqZWN0cyIsIm9iamVjdCIsImlzQnV0dG9uIiwiaXNNZW51QnV0dG9uIiwiY3RybCIsImZsYWciLCJnZXRWaXNpYmxlIiwic0lkIiwibUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzIiwiRXh0ZW5zaW9uQVBJIiwiZXh0ZW5zaW9uQVBJIiwib25Jbml0Iiwib09iamVjdFBhZ2UiLCJfZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2wiLCJnZXRPd25lckNvbXBvbmVudCIsInBhZ2UiLCJ2aXNpYmlsaXR5IiwiaXRlbXMiLCJfZ2V0QmF0Y2hHcm91cHNGb3JWaWV3IiwiZ2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uIiwiYXR0YWNoRXZlbnQiLCJfaGFuZGxlU3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydCIsImJpbmQiLCJfZ2V0QWxsU3ViU2VjdGlvbnMiLCJmb3JFYWNoIiwiYnlJZCIsIm1lc3NhZ2VCaW5kaW5nIiwiYmluZExpc3QiLCJhdHRhY2hDaGFuZ2UiLCJfZm5TaG93T1BNZXNzYWdlIiwiX2hhbmRsZVNtYXJ0U3VtbWFyeVN0YXJ0dXBBY3Rpb24iLCJvbkV4aXQiLCJkZXN0cm95Iiwib01lc3NhZ2VQb3BvdmVyIiwiaXNPcGVuIiwiY2xvc2UiLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsImNvbGxhYm9yYXRpdmVEcmFmdCIsImRpc2Nvbm5lY3QiLCJkZXRhY2hDaGFuZ2UiLCJnZXRBcHBDb21wb25lbnQiLCJpc1N1c3BlbmRlZCIsIm1lc3NhZ2VzIiwiX3Nob3dNZXNzYWdlcyIsIm9UYWJsZSIsImdldFJvd0JpbmRpbmciLCJjaGVja1NlY3Rpb25zRm9yTm9uUmVzcG9uc2l2ZVRhYmxlIiwic3ViU2VjdGlvbnMiLCJjaGFuZ2VDbGFzc0ZvclRhYmxlcyIsInZpc2libGVTdWJTZWN0aW9uIiwiYmxvY2tzIiwiZ2V0QmxvY2tzIiwiZ2V0TW9yZUJsb2NrcyIsImJsb2NrIiwic2VhcmNoVGFibGVJbkJsb2NrIiwidGFibGVUeXBlIiwiZ2V0VHlwZSIsImdldFBhcmVudCIsInRhYmxlQ29udHJvbCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbnRyb2wiLCJyb3dDb3VudE1vZGUiLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsImFkZFN0eWxlQ2xhc3MiLCJkZXRhY2hFdmVudCIsImdldFRhYmxlQVBJIiwibWFpbkNvbnRlbnQiLCJnZXRNYWluQ29udGVudCIsIm1haW5Db250ZW50VGFibGVBUEkiLCJzaWRlQ29udGVudCIsImdldFNpZGVDb250ZW50Iiwic2lkZUNvbnRlbnRUYWJsZUFQSSIsIm9uQmVmb3JlUmVuZGVyaW5nIiwiUGFnZUNvbnRyb2xsZXIiLCJhcHBseSIsInJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QiLCJDb21tb25IZWxwZXIiLCJzZXRNZXRhTW9kZWwiLCJvbkFmdGVyUmVuZGVyaW5nIiwiZ2V0VXNlSWNvblRhYkJhciIsInNlY3Rpb25zIiwiZ2V0U2VjdGlvbnMiLCJzZWN0aW9uIiwiZ2V0U3ViU2VjdGlvbnMiLCJfb25CZWZvcmVCaW5kaW5nIiwicGVuZGluZ1RhcmdldENvbnRyb2xJZCIsInRhcmdldENvbnRyb2xJZCIsImN1cnJlbnRDb250ZXh0UGF0aCIsImdldEVudGl0eUlkZW50aXR5IiwicGF0aCIsInJlcGxhY2UiLCJjdXJyZW50RW50aXR5SWQiLCJwcmV2aW91c0VudGl0eUlkIiwicHJldmlvdXNCaW5kaW5nQ29udGV4dFBhdGgiLCJhVGFibGVzIiwiX2ZpbmRUYWJsZXMiLCJvSW50ZXJuYWxNb2RlbCIsImFCYXRjaEdyb3VwcyIsIm9GYXN0Q3JlYXRpb25Sb3ciLCJwdXNoIiwicmVhc29uIiwiTmF2aWdhdGlvblJlYXNvbiIsIkVkaXRGbG93QWN0aW9uIiwiX2Nsb3NlU2lkZUNvbnRlbnQiLCJvcENvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInNvbWUiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiaXRlbSIsImdldENyZWF0aW9uUm93Iiwic2V0QmluZGluZ0NvbnRleHQiLCJmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24iLCJpc0ZpcnN0UmVuZGVyaW5nIiwiYlBlcnNpc3RPUFNjcm9sbCIsInNldFNlbGVjdGVkU2VjdGlvbiIsImZuT1BSZW5kZXJpbmdMYXlvdXQiLCJlZGl0YWJsZUhlYWRlckNvbnRlbnQiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwiYWRkRXZlbnREZWxlZ2F0ZSIsIl9pbml0aWFsaXplUGFnaW5hdGlvbiIsImxpc3RCaW5kaW5nIiwiX2Rpc2FibGVCbG9ja3NCaW5kaW5ncyIsImRpc2Nvbm5lY3RTdWJTZWN0aW9uVmlzaWJpbGl0eU9ic2VydmVycyIsIndhaXRGb3JWaXNpYmlsaXR5QmluZGluZ3MiLCJ3YWl0Rm9yQWxsU3ViU2VjdGlvblZpc2liaWxpdHlCaW5kaW5nc1Jlc29sdmVkIiwicGxhY2Vob2xkZXIiLCJpc1BsYWNlaG9sZGVyRW5hYmxlZCIsInNob3dQbGFjZWhvbGRlciIsIm9OYXZDb250YWluZXIiLCJvQ29udGFpbmVyIiwiZW5hYmxlQW5pbWF0aW9uIiwib2JqZWN0UGFnZUxheW91dCIsInNldFZpc2libGUiLCJzdWJTZWN0aW9uc0luZm8iLCJmZSIsIm90aGVycyIsImRpc2Nvbm5lY3RWaXNpYmlsaXR5T2JzZXJ2ZXIiLCJnZXRGaXJzdEVkaXRhYmxlSW5wdXQiLCJkb21FZGl0YWJsZUVsZW1lbnQiLCJfZ2V0Rmlyc3RFZGl0YWJsZUlucHV0IiwiVUk1RWxlbWVudCIsImNsb3Nlc3RUbyIsImdldEZpcnN0Q2xpY2thYmxlRWxlbWVudCIsIm9iamVjdFBhZ2UiLCJmb290ZXIiLCJnZXRGb290ZXIiLCJmb290ZXJQcmltYXJ5QWN0aW9uIiwiZmlyc3RDbGlja2FibGVFbGVtZW50IiwiYWN0aW9ucyIsImdldEhlYWRlclRpdGxlIiwiZ2V0QWN0aW9ucyIsImdldENvbnRlbnQiLCJhU2VjdGlvbnMiLCJiVXNlSWNvblRhYkJhciIsImlTa2lwIiwiYkVkaXRhYmxlSGVhZGVyIiwiZmlyc3RWaXNpYmlsaXR5QmluZGluZyIsIl9nZXRmaXJzdFN1YlNlY3Rpb25WaXNpYmlsaXR5QmluZGluZyIsImlTZWN0aW9uIiwib1NlY3Rpb24iLCJhU3ViU2VjdGlvbnMiLCJpU3ViU2VjdGlvbiIsIm9TdWJTZWN0aW9uIiwiZGlzYWJsZUJpbmRpbmdDb250ZXh0Q29uZGl0aW9uIiwic3ViQmxvY2siLCJfZ2V0Rmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkRnJvbVN1YlNlY3Rpb24iLCJhQmxvY2tzIiwiYmxvY2tDb250cm9sIiwiYUZvcm1Db250YWluZXJzIiwiZ2V0Rm9ybUNvbnRhaW5lcnMiLCJmb3JtQ29udGFpbmVyIiwiYUZvcm1FbGVtZW50cyIsImdldEZvcm1FbGVtZW50cyIsImZvcm1FbGVtZW50IiwiYUZpZWxkcyIsImdldEZpZWxkcyIsImVtcHR5RmllbGQiLCJnZXRGaXJzdEVtcHR5UmVxdWlyZWRGaWVsZCIsImZpZWxkcyIsImdldFJlcXVpcmVkIiwiaXNFbXB0eSIsImdldE11bHRpVmFsdWVGaWVsZCIsImdldEl0ZW1zIiwidmFsdWUiLCJkZWJ1ZyIsImZyb21UYWJOYXZpZ2F0aW9uIiwib01hbmRhdG9yeUZpZWxkIiwib0ZpZWxkVG9Gb2N1cyIsImdldENvbnRlbnRFZGl0IiwiZm9jdXNJbmZvIiwiZ2V0Rm9jdXNJbmZvIiwidGFyZ2V0SW5mbyIsInNpbGVudCIsImdldEVuYWJsZVN1Z2dlc3Rpb25zIiwiaXNCb3VuZCIsInNldEVuYWJsZVN1Z2dlc3Rpb25zIiwiZm9jdXMiLCJhbGxzdWJTZWN0aW9ucyIsImN1cnJlbnRNb2RlbCIsImdldEJpbmRpbmdzIiwiYmluZGluZyIsIlByb21pc2UiLCJyZXNvbHZlIiwiaGFuZGxlU3ViU2VjdGlvbkNyZWF0ZWQiLCJfb25BZnRlckJpbmRpbmciLCJpbnB1dEJpbmRpbmdDb250ZXh0IiwiUm93UHJlc3MiLCJpbmNsdWRlcyIsInN0b3JlU2libGluZ0NvbnRleHREYXRhIiwic2lkZUVmZmVjdHMiLCJjbGVhckZpZWxkR3JvdXBzVmFsaWRpdHkiLCJiaW5kaW5nQ29udGV4dCIsImFJQk5BY3Rpb25zIiwiZ2V0SUJOQWN0aW9ucyIsIm9UYWJsZVJvd0JpbmRpbmciLCJNb2RlbEhlbHBlciIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsInJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzIiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsInRhYmxlRGVmaW5pdGlvbiIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwiY2xlYXJTZWxlY3Rpb24iLCJvT2JqZWN0UGFnZVRpdGxlIiwiYUlCTkhlYWRlckFjdGlvbnMiLCJjb25jYXQiLCJ1cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSIsIm9Nb2RlbCIsIm9GaW5hbFVJU3RhdGUiLCJoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMiLCJvQmluZGluZyIsImZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cyIsIlRhYmxlSGVscGVyIiwiZW5hYmxlRmFzdENyZWF0aW9uUm93IiwiZ2V0Q29udGV4dCIsImZuSGFuZGxlQ2hhbmdlIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJjb21wdXRlTW9kZWxzRm9yRWRpdE1vZGUiLCJfdXBkYXRlUmVsYXRlZEFwcHMiLCJjdXJyZW50QmluZGluZyIsImhhbmRsZVBhdGNoU2VudCIsIlRhYmxlVXRpbHMiLCJ3aGVuQm91bmQiLCJvRXJyb3IiLCJfdHJpZ2dlclZpc2libGVTdWJTZWN0aW9uc0V2ZW50cyIsInVwZGF0ZUVkaXRCdXR0b25WaXNpYmlsaXR5QW5kRW5hYmxlbWVudCIsIl91cGRhdGVBdmFpbGFibGVDYXJkcyIsInJlY29tbWVuZGF0aW9ucyIsImNsZWFyUmVjb21tZW5kYXRpb25zIiwiZGlzcGxheUNvbGxhYm9yYXRpb25NZXNzYWdlIiwicmVkaXJlY3RlZFRvTm9uRHJhZnQiLCJfc2V0T1BNZXNzYWdlU3RyaXBJbnRlcm5hbENvbnRleHQiLCJhcHBseUFwcFN0YXRlIiwiZ2V0QXBwU3RhdGVIYW5kbGVyIiwicGFnZVJlYWR5Iiwid2FpdEZvciIsInJlY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzIiwiaGFuZGxlUGVuZGluZ1RhcmdldENvbnRyb2xJZE5hdmlnYXRpb24iLCJ4QXBwU3RhdGVUYXJnZXRDb250cm9sSWQiLCJjb25zdW1lUGVuZGluZ1RhcmdldENvbnRyb2xJZCIsImFsbCIsIndhaXRQYWdlUmVhZHkiLCJuYXZpZ2F0ZVRvVGFyZ2V0U2VjdGlvbiIsInRhcmdldENvbnRyb2wiLCJpc1NlY3Rpb24iLCJ0YXJnZXRTZWN0aW9uSWQiLCJuYXZpZ2F0ZVRvVGFyZ2V0IiwiZ2V0U2VsZWN0ZWRTZWN0aW9uIiwibmF2aWdhdGVXaXRoQ29uZmlybWF0aW9uIiwicG9sbEZvclNlY3Rpb25TdGFiaWxpdHkiLCJvblJlc2V0RGV0ZWN0ZWQiLCJzZXRUYXJnZXRTdWJTZWN0aW9uIiwiZ2V0VGVsZW1ldHJ5U2VydmljZSIsImlzRW5hYmxlZCIsImZpcmVUZWxlbWV0cnkiLCJnZXRWYXJpYW50IiwiZ2V0VmFyaWFudHMiLCJPQkpFQ1RfUEFHRV9UQUJMRSIsImRlbGV0ZWRDb3VudCIsImNvdW50VmFyaWFudHMiLCJ2YXJpYW50VHlwZSIsInRlbGVtZXRyeUV2ZW50IiwidHlwZSIsInN0b3JlQWN0aW9uIiwidmlld1N0YXRlIiwidXBkYXRlQXBwU3RhdGVEZWJvdW5jZWQiLCJpc0luRWRpdE1vZGUiLCJzdWJTZWN0aW9uSW5mbyIsIndhaXRGb3JBcHBseUFwcHN0YXRlIiwid2FybmluZyIsIm9ic2VydmVDdXJyZW50U2VjdGlvbiIsInN1YnNlY3Rpb24iLCJmaXJlRXZlbnQiLCJjYXJkcyIsImNvbGxhYm9yYXRpb25NYW5hZ2VyU2VydmljZSIsImdldENvbGxhYm9yYXRpb25NYW5hZ2VyU2VydmljZSIsImhhc0NvbGxhYm9yYXRpb25NYW5hZ2VyQ29ubmVjdGVkIiwiY29sbGFib3JhdGlvbk1hbmFnZXIiLCJjb2xsZWN0QXZhaWxhYmxlQ2FyZHMiLCJjYXJkT2JqZWN0IiwidXBkYXRlQ2FyZHMiLCJwYXJlbnRBcHBJZCIsImFkZENhcmRzVG9Db2xsYWJvcmF0aW9uTWFuYWdlciIsInNoYXJlQXZhaWxhYmxlQ2FyZHMiLCJmaW5kRWxlbWVudHMiLCJlbGVtIiwibWVzc2FnZVN0cmlwIiwiZW50aXR5TmFtZSIsInJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwiY29sbGFib3JhdGlvbk1lc3NhZ2UiLCJNZXNzYWdlIiwiZ2V0VGV4dCIsIk1lc3NhZ2VUeXBlIiwiSW5mb3JtYXRpb24iLCJ0YXJnZXQiLCJhZGRNZXNzYWdlcyIsIm9uUGFnZVJlYWR5Iiwic2V0Rm9jdXMiLCJpc0luRGlzcGxheU1vZGUiLCJvRmlyc3RDbGlja2FibGVFbGVtZW50Iiwib1NlbGVjdGVkU2VjdGlvbiIsImdldEVsZW1lbnRCeUlkIiwiY3R4dCIsIm9CaW5kaW5nQ29udGV4dCIsImlzRHJhZnRTdXBwb3J0ZWQiLCJvQXBwQ29tcG9uZW50IiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwib25CYWNrTmF2aWdhdGlvbkluRHJhZnQiLCJpc0VkaXRhYmxlIiwiZmV0Y2hBbmRBcHBseVJlY29tbWVuZGF0aW9ucyIsImNvbnRleHQiLCJmb3JjZUZvY3VzIiwiX2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJEZXZpY2UiLCJzdXBwb3J0IiwidG91Y2giLCJzYXZlQnV0dG9uIiwiYXV0b1F1ZXVlVW5sb2NrIiwiYXV0b1F1ZXVlTG9jayIsImlzTG9ja2VkIiwidW5sb2NrIiwiZGV0YWNoQnJvd3NlckV2ZW50IiwiYXR0YWNoQnJvd3NlckV2ZW50IiwibG9jayIsImZjbENsb3NlQnV0dG9uIiwiX3JvdXRpbmciLCJjbG9zZUNvbHVtbiIsImJJc1N0aWNreU1vZGUiLCJfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24iLCJvT2JqZWN0UGFnZVN1YnRpdGxlIiwib0N1c3RvbURhdGEiLCJvT2JqZWN0UGFnZURlc2NyaXB0aW9uIiwiZXh0cmFjdFBhdGhzIiwiYmluZGluZ0luZm8iLCJBcnJheSIsImZyb20iLCJTZXQiLCJwYXJ0cyIsInBhcnQiLCJtb2RlbCIsIkJvb2xlYW4iLCJzdWJ0aXRsZVBhdGhzIiwiZ2V0QmluZGluZ0luZm8iLCJkZXNjcmlwdGlvblBhdGhzIiwicGF0aHNUb1Jlc29sdmUiLCJhcHBDb21wb25lbnQiLCJyb290Vmlld0NvbnRyb2xsZXIiLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJmbkNsZWFyQ2FjaGVUaXRsZSIsImludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlIiwib09iamVjdFBhZ2VDb250ZXh0IiwiYnVpbGQiLCJ0aXRsZSIsInN1YnRpdGxlIiwiaW50ZW50IiwiaWNvbiIsImRlc2NyaXB0aW9uIiwicCIsInJlcXVlc3RQcm9wZXJ0eSIsIl9leGVjdXRlVGFiU2hvcnRDdXQiLCJvRXhlY3V0aW9uIiwiaVNlY3Rpb25JbmRleE1heCIsInNDb21tYW5kIiwiZ2V0Q29tbWFuZCIsIm5ld1NlY3Rpb24iLCJpU2VsZWN0ZWRTZWN0aW9uSW5kZXgiLCJpbmRleE9mU2VjdGlvbiIsIl9nZXRGb290ZXJWaXNpYmlsaXR5Iiwic1ZpZXdJZCIsImlzSGlkZGVuRHJhZnRFbmFibGVkIiwiZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJnZXRDYXBhYmlsaXRpZXMiLCJIaWRkZW5EcmFmdCIsImVuYWJsZWQiLCJvTWVzc2FnZSIsImlzRXJyb3JNZXNzYWdlIiwidmFsaWRhdGlvbiIsIm1lc3NhZ2VWYWxpZGF0aW9uIiwiaXNFZGl0TW9kZSIsImN1cnJlbnRQYWdlVmlldyIsImlzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdFZpZXciLCJnZXRSb290Q29udGFpbmVyIiwiZ2V0Q3VycmVudFBhZ2UiLCJvTWVzc2FnZUJ1dHRvbiIsIm9JdGVtQmluZGluZyIsImdldExlbmd0aCIsIm9wZW5CeSIsIkJ1c3lMb2NrZXIiLCJlZGl0RG9jdW1lbnQiLCJmaW5hbGx5IiwicHJvcGVydHlQYXRoIiwiTG9jYWxQcm9wZXJ0eSIsIiRQcm9wZXJ0eVBhdGgiLCJTZW1hbnRpY09iamVjdFByb3BlcnR5IiwiX3ZhbGlkYXRlRG9jdW1lbnQiLCJnZXRBY3RpdmVFbGVtZW50IiwiYnlQYXNzU2lkZUVmZmVjdHMiLCJpc1RyYW5zaWVudCIsImNyZWF0ZWQiLCJtZXNzYWdlSGFuZGxlciIsImhvbGRNZXNzYWdlc0ZvckNvbnRyb2wiLCJyZXQiLCJleGVjdXRlR2xvYmFsVmFsaWRhdGlvbiIsInNob3dNZXNzYWdlcyIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsInNpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQiLCJnbG9iYWxTaWRlRWZmZWN0cyIsImdldEdsb2JhbE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJkcmFmdFJvb3RDb250ZXh0IiwiY3JlYXRlUm9vdENvbnRleHQiLCJEcmFmdCIsImRyYWZ0IiwiZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbiIsImlzQ29ubmVjdGVkIiwic2tpcEJpbmRpbmdUb1ZpZXciLCJ1c2VTYXZlQW5kTGVhdmUiLCJhd2FpdENyZWF0ZURvY3VtZW50cyIsImV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJtZXNzYWdlUG9wb3ZlckVyciIsImlzQ29sbGFib3JhdGlvbkVuYWJsZWQiLCJkaWFsb2dBY3Rpb24iLCJDb2xsYWJvcmF0aW9uRGlzY2FyZCIsImdldFVzZXJBY3Rpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsImVyciIsImNyZWF0aW9uUm93IiwidGFibGVCaW5kaW5nIiwiY29udGV4dEtleXMiLCJzdGFydHNXaXRoIiwiY3JlYXRlRG9jdW1lbnQiLCJjcmVhdGVBdEVuZCIsImdldEFnZ3JlZ2F0aW9uIiwic2tpcFNpZGVFZmZlY3RzIiwiaXNTdGFuZGFyZFNhdmUiLCJjb21tYW5kIiwiYmluZGluZ3MiLCJzYXZlRG9jdW1lbnQiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsIlJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24iLCJDb250aW51ZSIsIl9jYW5jZWxEb2N1bWVudCIsImNhbmNlbEJ1dHRvbiIsImxhc3RGb2N1c2VkQ29udHJvbElkIiwic2hvdWxkU2tpcERpc2NhcmRQb3BvdmVyIiwiaXNEb2N1bWVudE1vZGlmaWVkIiwiVWlNb2RlbENvbnN0YW50cyIsIkRvY3VtZW50TW9kaWZpZWQiLCJhZnRlckNhbmNlbCIsInByb21pc2VSZXN1bHQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsImNhbmNlbERvY3VtZW50Iiwic2tpcERpc2NhcmRQb3BvdmVyIiwiYXBwbHlEb2N1bWVudCIsInNob3dSZWxhdGVkQXBwcyIsInVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyIsIl9maW5kQ29udHJvbEluU3ViU2VjdGlvbiIsImFQYXJlbnRFbGVtZW50IiwiYVN1YnNlY3Rpb24iLCJhQ29udHJvbHMiLCJiSXNDaGFydCIsIml0ZW0xIiwib0VsZW1lbnQiLCJjaGFydENvbnRyb2wiLCJnZXRDaGFydENvbnRyb2wiLCJvU3ViRWxlbWVudCIsIl9nZXRBbGxCbG9ja3MiLCJfZmluZENoYXJ0cyIsImFDaGFydHMiLCJvQmxvY2siLCJvQ29udGVudCIsInNldFNob3dTaWRlQ29udGVudCIsIm9DaGFydENvbnRleHQiLCJzQ2hhcnRQYXRoIiwib0NvbnRleHREYXRhIiwib0NoYXJ0Q29udGV4dERhdGEiLCJfc2Nyb2xsVGFibGVzVG9Sb3ciLCJzUm93UGF0aCIsIlRhYmxlU2Nyb2xsZXIiLCJzY3JvbGxUYWJsZVRvUm93IiwiX21lcmdlTXVsdGlwbGVDb250ZXh0cyIsIm9QYWdlQ29udGV4dCIsImFMaW5lQ29udGV4dCIsImFBdHRyaWJ1dGVzIiwiYVBhZ2VBdHRyaWJ1dGVzIiwic01ldGFQYXRoTGluZSIsInNQYXRoTGluZSIsInNQYWdlUGF0aCIsIm9NZXRhTW9kZWwiLCJzTWV0YVBhdGhQYWdlIiwib1NpbmdsZUNvbnRleHQiLCJvU3ViQ2hhcnRDb250ZXh0RGF0YSIsImNvbnRleHREYXRhIiwiZW50aXR5U2V0IiwicmVtb3ZlU2Vuc2l0aXZlRGF0YSIsIm9QYWdlTGV2ZWxTViIsImFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50IiwiU2VsZWN0aW9uVmFyaWFudCIsInNlbGVjdGlvblZhcmlhbnQiLCJhdHRyaWJ1dGVzIiwib1ZpZXdEYXRhIiwib0NvbmZpZ3VyYXRpb25zIiwiY29udHJvbENvbmZpZ3VyYXRpb24iLCJhQ29uZmlndXJhdGlvbnMiLCJzS2V5Iiwib0NvbmZpZ3VyYXRpb24iLCJyZXF1ZXN0R3JvdXBJZCIsInBhZ2luYXRvckN1cnJlbnRDb250ZXh0IiwiYmluZGluZ1RvVXNlIiwicGFnaW5hdG9yIiwiaW5pdGlhbGl6ZSIsIm9EYXRhUG9pbnRzIiwiZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJnZXRPdXRib3VuZHMiLCJvU2hlbGxTZXJ2aWNlcyIsInJlcXVlc3RPYmplY3QiLCJmbkdldExpbmtzIiwiZm5PbkVycm9yIiwiZm5TZXRMaW5rRW5hYmxlbWVudCIsImlkIiwiYVN1cHBvcnRlZExpbmtzIiwic0xpbmtJZCIsInN1cHBvcnRlZCIsIm9TdWJEYXRhUG9pbnRzIiwib1BhZ2VEYXRhIiwib0RhdGFQb2ludCIsIm9MaW5rIiwib0xpbmtDb250ZXh0Iiwib0xpbmtEYXRhIiwib01peGVkQ29udGV4dCIsIm1lcmdlIiwib01hcHBpbmciLCJzTWFpblByb3BlcnR5Iiwic01hcHBlZFByb3BlcnR5IiwiaGFzT3duUHJvcGVydHkiLCJvTmV3TWFwcGluZyIsImlzTmF2aWdhdGlvblN1cHBvcnRlZCIsInBhcmFtcyIsImFMaW5rcyIsIl9maW5kU3VtbWFyaXplQnV0dG9uIiwib2JqZWN0UGFnZVRpdGxlIiwic3VtbWFyaXplQnV0dG9uIiwiYnV0dG9uIiwiZW5kc1dpdGgiLCJnZXRTdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbXMiLCJwcmVmZXJyZWRBY3Rpb24iLCJwcmVmZXJyZWRBY3Rpb25MZXZlbCIsInBhcnNlSW50Iiwic3BsaXQiLCJpc05hTiIsImdldFByZWZlcnJlZEFjdGlvblN0YXR1cyIsIkNhblBlcmZvcm0iLCJzZXRQcmVmZXJyZWRBY3Rpb25TdGF0dXMiLCJBbHJlYWR5UGVyZm9ybWVkIiwiZW52aXJvbm1lbnRTZXJ2aWNlIiwiZW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJTbWFydFN1bW1hcml6ZSIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJpbml0aWFsaXplciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNlbWFudGljT2JqZWN0TWFwcGluZ1R5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZVdpdGhVSTUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiwgdXNpbmdFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwic2FwL2ZlL2NvcmUvQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHR5cGUgeyBTdGFydHVwUGFyYW1ldGVycyB9IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcInNhcC9mZS9jb3JlL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCBQYWdlUmVhZHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BhZ2VSZWFkeVwiO1xuaW1wb3J0IFBhZ2luYXRvciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGFnaW5hdG9yXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgU2hhcmUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCBDb2xsYWJvcmF0aW9uTWFuYWdlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY2FyZHMvQ29sbGFib3JhdGlvbk1hbmFnZXJcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IE5hdmlnYXRpb25SZWFzb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL3JvdXRpbmcvTmF2aWdhdGlvblJlYXNvblwiO1xuaW1wb3J0IHR5cGUgQ29tbWFuZEV4ZWN1dGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvQ29tbWFuZEV4ZWN1dGlvblwiO1xuaW1wb3J0IHsgUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9SZWNvbW1lbmRhdGlvbnMvQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nXCI7XG5pbXBvcnQgdHlwZSB7IEhpZGRlbkRyYWZ0LCBNaWNyb0NoYXJ0TWFuaWZlc3RDb25maWd1cmF0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgQ3JlYXRpb25Nb2RlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB7IHR5cGUgV3JhcHBlZENhcmQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvQ29sbGFib3JhdGlvbk1hbmFnZXJTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgeyBUZWxlbWV0cnlWYXJpYW50RXZlbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvVGVsZW1ldHJ5U2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIENoYXJ0QmxvY2sgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ2hhcnRcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBGb3JtQmxvY2sgZnJvbSBcInNhcC9mZS9tYWNyb3MvRm9ybVwiO1xuaW1wb3J0IHR5cGUgTWFjcm9BUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvTWFjcm9BUElcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZEJsb2NrIGZyb20gXCJzYXAvZmUvbWFjcm9zL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvVGFibGVcIjtcbmltcG9ydCBWYXJpYW50TWFuYWdlbWVudEJCIGZyb20gXCJzYXAvZmUvbWFjcm9zL1ZhcmlhbnRNYW5hZ2VtZW50XCI7XG5pbXBvcnQgdHlwZSBFYXN5RmlsbEJ1dHRvbiBmcm9tIFwic2FwL2ZlL21hY3Jvcy9haS9FYXN5RmlsbEJ1dHRvblwiO1xuaW1wb3J0IHR5cGUgU3VtbWFyaXphdGlvbkJ1dHRvbiBmcm9tIFwic2FwL2ZlL21hY3Jvcy9haS9TdW1tYXJpemF0aW9uQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBTdWJTZWN0aW9uIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NvbnRyb2xzL3NlY3Rpb24vU3ViU2VjdGlvblwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUJ1dHRvbiBmcm9tIFwic2FwL2ZlL21hY3Jvcy9tZXNzYWdlcy9NZXNzYWdlQnV0dG9uXCI7XG5pbXBvcnQgdHlwZSBTaGFyZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9zaGFyZS9TaGFyZUFQSVwiO1xuaW1wb3J0IHR5cGUgVGFibGVDcmVhdGlvbk9wdGlvbnMgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVDcmVhdGlvbk9wdGlvbnNcIjtcbmltcG9ydCBUYWJsZUhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUhlbHBlclwiO1xuaW1wb3J0IFRhYmxlVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVXRpbHNcIjtcbmltcG9ydCBTZWxlY3Rpb25WYXJpYW50IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgT2JqZWN0UGFnZUV4dGVuc2lvbkFQSSB9IGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvRXh0ZW5zaW9uQVBJXCI7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIEV4dGVuc2lvbkFQSSB9IGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL09iamVjdFBhZ2UvRXh0ZW5zaW9uQVBJXCI7XG5pbXBvcnQgQ29sbGFib3JhdGlvbkRpc2NhcmQgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9jb21wb25lbnRzL0NvbGxhYm9yYXRpb25EaXNjYXJkRGlhbG9nXCI7XG5pbXBvcnQgdHlwZSBTdWJTZWN0aW9uQmxvY2sgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9jb250cm9scy9TdWJTZWN0aW9uQmxvY2tcIjtcbmltcG9ydCB7IHBvbGxGb3JTZWN0aW9uU3RhYmlsaXR5IH0gZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9oZWxwZXJzL1NlY3Rpb25OYXZpZ2F0aW9uSGVscGVyXCI7XG5pbXBvcnQgVGFibGVTY3JvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9UYWJsZVNjcm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IHR5cGUgSW5wdXRCYXNlIGZyb20gXCJzYXAvbS9JbnB1dEJhc2VcIjtcbmltcG9ydCBJbnN0YW5jZU1hbmFnZXIgZnJvbSBcInNhcC9tL0luc3RhbmNlTWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgTWVudUJ1dHRvbiBmcm9tIFwic2FwL20vTWVudUJ1dHRvblwiO1xuaW1wb3J0IHR5cGUgTmF2Q29udGFpbmVyIGZyb20gXCJzYXAvbS9OYXZDb250YWluZXJcIjtcbmltcG9ydCB0eXBlIFBvcG92ZXIgZnJvbSBcInNhcC9tL1BvcG92ZXJcIjtcbmltcG9ydCB0eXBlIFNlYXJjaEZpZWxkIGZyb20gXCJzYXAvbS9TZWFyY2hGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVG9vbGJhclNwYWNlciBmcm9tIFwic2FwL20vVG9vbGJhclNwYWNlclwiO1xuaW1wb3J0IERldmljZSBmcm9tIFwic2FwL3VpL0RldmljZVwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRFeGVjdXRpb24kRXhlY3V0ZUV2ZW50IH0gZnJvbSBcInNhcC91aS9jb3JlL0NvbW1hbmRFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIEN1c3RvbURhdGEgZnJvbSBcInNhcC91aS9jb3JlL0N1c3RvbURhdGFcIjtcbmltcG9ydCBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSBJbnZpc2libGVUZXh0IGZyb20gXCJzYXAvdWkvY29yZS9JbnZpc2libGVUZXh0XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0T3V0Ym91bmRFbnRyeSB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuaW1wb3J0IE1lc3NhZ2luZyBmcm9tIFwic2FwL3VpL2NvcmUvTWVzc2FnaW5nXCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBEeW5hbWljU2lkZUNvbnRlbnQgZnJvbSBcInNhcC91aS9sYXlvdXQvRHluYW1pY1NpZGVDb250ZW50XCI7XG5pbXBvcnQgdHlwZSBGb3JtIGZyb20gXCJzYXAvdWkvbGF5b3V0L2Zvcm0vRm9ybVwiO1xuaW1wb3J0IHR5cGUgQ2hhcnQgZnJvbSBcInNhcC91aS9tZGMvQ2hhcnRcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBUYWJsZVR5cGVCYXNlIGZyb20gXCJzYXAvdWkvbWRjL3RhYmxlL1RhYmxlVHlwZUJhc2VcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb21wb3NpdGVCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQ29tcG9zaXRlQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIExpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGVcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VMYXlvdXQgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VMYXlvdXRcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VTZWN0aW9uIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlU2VjdGlvblwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZVN1YlNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTdWJTZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbFR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgdHlwZSBDb2xsYWJvcmF0aW9uRHJhZnQgZnJvbSBcIi4vY29tcG9uZW50cy9Db2xsYWJvcmF0aW9uRHJhZnRcIjtcbmltcG9ydCBDb2xsYWJvcmF0aW9uTWFuYWdlck92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9Db2xsYWJvcmF0aW9uTWFuYWdlclwiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmdPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgTWVzc2FnZUhhbmRsZXJPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCBQYWdpbmF0b3JPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvUGFnaW5hdG9yXCI7XG5pbXBvcnQgU2hhcmVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9WaWV3U3RhdGVcIjtcbmNvbnN0IHsgVmFyaWFudFR5cGUgfSA9IFZhcmlhbnRNYW5hZ2VtZW50QkI7XG5leHBvcnQgdHlwZSBCaW5kaW5nUGFyYW1zID0ge1xuXHRyZWRpcmVjdGVkVG9Ob25EcmFmdD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0cmVhc29uPzogTmF2aWdhdGlvblJlYXNvbjtcblx0YlBlcnNpc3RPUFNjcm9sbD86IGJvb2xlYW47XG5cdGxpc3RCaW5kaW5nPzogT0RhdGFMaXN0QmluZGluZztcblx0c2hvd1BsYWNlaG9sZGVyPzogYm9vbGVhbjtcblx0cmVxdWVzdE9uQmluZGluZz86IHN0cmluZ1tdO1xuXHR0YXJnZXRDb250cm9sSWQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWw7XG5jb25zdCBQcmVmZXJyZWRBY3Rpb25TdGF0dXMgPSBGRUxpYnJhcnkuUHJlZmVycmVkQWN0aW9uU3RhdHVzVHlwZTtcblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlQ29udHJvbGxlclwiKVxuY2xhc3MgT2JqZWN0UGFnZUNvbnRyb2xsZXIgZXh0ZW5kcyBQYWdlQ29udHJvbGxlciB7XG5cdG9WaWV3ITogRkVWaWV3O1xuXG5cdEB1c2luZ0V4dGVuc2lvbihQbGFjZWhvbGRlcilcblx0cGxhY2Vob2xkZXIhOiBQbGFjZWhvbGRlcjtcblxuXHRAdXNpbmdFeHRlbnNpb24oU2hhcmUub3ZlcnJpZGUoU2hhcmVPdmVycmlkZXMpKVxuXHRzaGFyZSE6IFNoYXJlO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlcm5hbFJvdXRpbmcub3ZlcnJpZGUoSW50ZXJuYWxSb3V0aW5nT3ZlcnJpZGUpKVxuXHRfcm91dGluZyE6IEludGVybmFsUm91dGluZztcblxuXHRAdXNpbmdFeHRlbnNpb24oUGFnaW5hdG9yLm92ZXJyaWRlKFBhZ2luYXRvck92ZXJyaWRlKSlcblx0cGFnaW5hdG9yITogUGFnaW5hdG9yO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihNZXNzYWdlSGFuZGxlci5vdmVycmlkZShNZXNzYWdlSGFuZGxlck92ZXJyaWRlKSlcblx0bWVzc2FnZUhhbmRsZXIhOiBNZXNzYWdlSGFuZGxlcjtcblxuXHRAdXNpbmdFeHRlbnNpb24oSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlKSlcblx0aW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihDb2xsYWJvcmF0aW9uTWFuYWdlci5vdmVycmlkZShDb2xsYWJvcmF0aW9uTWFuYWdlck92ZXJyaWRlKSlcblx0Y29sbGFib3JhdGlvbk1hbmFnZXIhOiBDb2xsYWJvcmF0aW9uTWFuYWdlcjtcblxuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0SW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoe1xuXHRcdFx0Z2V0TmF2aWdhdGlvbk1vZGU6IGZ1bmN0aW9uICh0aGlzOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRjb25zdCBiSXNTdGlja3lFZGl0TW9kZSA9XG5cdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuZ2V0U3RpY2t5RWRpdE1vZGUgJiZcblx0XHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5nZXRTdGlja3lFZGl0TW9kZSgpO1xuXHRcdFx0XHRyZXR1cm4gYklzU3RpY2t5RWRpdE1vZGUgPyBcImV4cGxhY2VcIiA6IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9pbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbjtcblxuXHRAdXNpbmdFeHRlbnNpb24oVmlld1N0YXRlLm92ZXJyaWRlKFZpZXdTdGF0ZU92ZXJyaWRlcykpXG5cdHZpZXdTdGF0ZSE6IFZpZXdTdGF0ZTtcblxuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0UGFnZVJlYWR5Lm92ZXJyaWRlKHtcblx0XHRcdGlzQ29udGV4dEV4cGVjdGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0cGFnZVJlYWR5ITogUGFnZVJlYWR5O1xuXG5cdHByaXZhdGUgbUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzPzogUmVjb3JkPHN0cmluZywgT2JqZWN0UGFnZUV4dGVuc2lvbkFQST47XG5cblx0cHJvdGVjdGVkIGV4dGVuc2lvbkFQST86IE9iamVjdFBhZ2VFeHRlbnNpb25BUEk7XG5cblx0cHJpdmF0ZSBiU2VjdGlvbk5hdmlnYXRlZD86IGJvb2xlYW47XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlVGl0bGVIaWVyYXJjaHlDYWNoZVNldFVwID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBzd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcE92ZXI/OiBQb3BvdmVyO1xuXG5cdHByaXZhdGUgY3VycmVudEJpbmRpbmc/OiBCaW5kaW5nO1xuXG5cdHByaXZhdGUgbWVzc2FnZUJ1dHRvbiE6IE1lc3NhZ2VCdXR0b247XG5cblx0cHJpdmF0ZSBjb2xsYWJvcmF0aW9uTWVzc2FnZT86IE1lc3NhZ2U7XG5cblx0cHJpdmF0ZSBtZXJnZVBhdGNoRHJhZnQgPSBmYWxzZTtcblxuXHRwcml2YXRlIGZjbENsb3NlSGFuZGxlclNldCA9IGZhbHNlO1xuXG5cdHByaXZhdGUgYXV0b1F1ZXVlTG9jazogUmV0dXJuVHlwZTxPRGF0YU1vZGVsW1wibG9ja1wiXT4gfCB1bmRlZmluZWQ7XG5cblx0cHJpdmF0ZSBtZXNzYWdlQmluZGluZz86IEJpbmRpbmc7XG5cblx0cHJpdmF0ZSB3YWl0Rm9yVmlzaWJpbGl0eUJpbmRpbmdzITogUHJvbWlzZTx1bmtub3duPltdO1xuXG5cdHByaXZhdGUgc3ViU2VjdGlvbnM/OiB7IGZlOiBTdWJTZWN0aW9uW107IG90aGVyczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSB9O1xuXG5cdHByaXZhdGUgcHJldmlvdXNCaW5kaW5nQ29udGV4dFBhdGg/OiBzdHJpbmc7XG5cblx0cHJpdmF0ZSBwZW5kaW5nVGFyZ2V0Q29udHJvbElkPzogc3RyaW5nO1xuXG5cdHByaXZhdGUgdGFyZ2V0U3ViU2VjdGlvbj86IE9iamVjdFBhZ2VTdWJTZWN0aW9uO1xuXG5cdC8vIEZsYWcgdG8gcHJldmVudCBWaWV3U3RhdGUuYXBwbHkoKSBmcm9tIG92ZXJyaWRpbmcgc2VjdGlvbiBzZWxlY3Rpb24gYWZ0ZXIgdXNlciBpbnRlcmFjdGlvbiBvciB0YXJnZXRDb250cm9sSWQgbmF2aWdhdGlvblxuXHRwcml2YXRlIHNraXBWaWV3U3RhdGVTZWN0aW9uUmVzdG9yZSA9IGZhbHNlO1xuXG5cdC8vIFRyYWNrcyBpZiB0aGUgYmluZGluZyBjb250ZXh0IHBhdGggY2hhbmdlZCAobmV3IGVudGl0eSB2cyBzYW1lIGVudGl0eSByZS1iaW5kaW5nKVxuXHRwcml2YXRlIGlzTmV3QmluZGluZ0NvbnRleHQgPSBmYWxzZTtcblxuXHQvKipcblx0ICogUmV0dXJucyBjb250cm9scyAoQnV0dG9uIC8gTWVudUJ1dHRvbikgdGhhdCBhcmUgbWFya2VkIGFzIFwicHJpbWFyeSBhY3Rpb25cIi5cblx0ICogVGhlIG1hcmtlciBpcyBzZXQgYnkgdGhlIGNvbnZlcnRlcnMgd2hlbiBhbiBhY3Rpb24gaXMgZW1waGFzaXplZCAoYW5ub3RhdGlvbi1iYXNlZCkgb3Jcblx0ICogY29uZmlndXJlZCBhcyBwcmltYXJ5QWN0aW9uIChjdXN0b20gYWN0aW9uIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0KS5cblx0ICogQHBhcmFtIHJvb3QgUm9vdCBjb250cm9sIHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbVxuXHQgKiBAcGFyYW0gb25seUFjdGlvbmFibGUgSWYgdHJ1ZSwgb25seSBhY3Rpb25hYmxlIChlbmFibGVkKSBjYW5kaWRhdGVzIGFyZSByZXR1cm5lZFxuXHQgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBjb250cm9scyB0aGF0IGFyZSBjYW5kaWRhdGVzIGZvciBwcmltYXJ5IGFjdGlvbiBzaG9ydGN1dHNcblx0ICovXG5cdHByaXZhdGUgX2dldFByaW1hcnlBY3Rpb25TaG9ydGN1dENhbmRpZGF0ZXMocm9vdDogTWFuYWdlZE9iamVjdCwgb25seUFjdGlvbmFibGUgPSBmYWxzZSk6IEFycmF5PEJ1dHRvbiB8IE1lbnVCdXR0b24+IHtcblx0XHRyZXR1cm4gcm9vdC5maW5kQWdncmVnYXRlZE9iamVjdHModHJ1ZSwgKG9iamVjdDogTWFuYWdlZE9iamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgaXNCdXR0b24gPSBvYmplY3QuaXNBKFwic2FwLm0uQnV0dG9uXCIpO1xuXHRcdFx0Y29uc3QgaXNNZW51QnV0dG9uID0gb2JqZWN0LmlzQShcInNhcC5tLk1lbnVCdXR0b25cIik7XG5cdFx0XHRpZiAoIWlzQnV0dG9uICYmICFpc01lbnVCdXR0b24pIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY3RybCA9IG9iamVjdCBhcyBCdXR0b24gfCBNZW51QnV0dG9uO1xuXHRcdFx0Y29uc3QgZmxhZyA9IGN0cmxcblx0XHRcdFx0LmdldEN1c3RvbURhdGEoKVxuXHRcdFx0XHQuZmluZCgoY3VzdG9tRGF0YTogQ3VzdG9tRGF0YSkgPT4gY3VzdG9tRGF0YS5nZXRLZXkoKSA9PT0gXCJmZVByaW1hcnlBY3Rpb25TaG9ydGN1dFwiKVxuXHRcdFx0XHQ/LmdldFZhbHVlKCk7XG5cdFx0XHRpZiAoZmxhZyAhPT0gdHJ1ZSAmJiBmbGFnICE9PSBcInRydWVcIikge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWN0cmwuZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdC8vIEZvciBmb2N1cyBwbGFjZW1lbnQgd2UgbXVzdCBpZ25vcmUgZGlzYWJsZWQgY2FuZGlkYXRlcy5cblx0XHRcdHJldHVybiBvbmx5QWN0aW9uYWJsZSA/IGN0cmwuZ2V0RW5hYmxlZCgpIDogdHJ1ZTtcblx0XHR9KSBhcyBBcnJheTxCdXR0b24gfCBNZW51QnV0dG9uPjtcblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRnZXRFeHRlbnNpb25BUEkoc0lkPzogc3RyaW5nKTogRXh0ZW5zaW9uQVBJIHtcblx0XHRpZiAoc0lkKSB7XG5cdFx0XHQvLyB0byBhbGxvdyBsb2NhbCBJRCB1c2FnZSBmb3IgY3VzdG9tIHBhZ2VzIHdlJ2xsIGNyZWF0ZS9yZXR1cm4gb3duIGluc3RhbmNlcyBmb3IgY3VzdG9tIHNlY3Rpb25zXG5cdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyA9IHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzIHx8IHt9O1xuXG5cdFx0XHRpZiAoIXRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0pIHtcblx0XHRcdFx0dGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXSA9IG5ldyBFeHRlbnNpb25BUEkodGhpcywgc0lkKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIXRoaXMuZXh0ZW5zaW9uQVBJKSB7XG5cdFx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJID0gbmV3IEV4dGVuc2lvbkFQSSh0aGlzKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbkFQSTtcblx0XHR9XG5cdH1cblxuXHRvbkluaXQoKTogdm9pZCB7XG5cdFx0c3VwZXIub25Jbml0KCk7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXG5cdFx0Ly8gU2V0dGluZyBkZWZhdWx0cyBvZiBpbnRlcm5hbCBtb2RlbCBjb250ZXh0XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRPd25lckNvbXBvbmVudCgpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcImV4dGVybmFsTmF2aWdhdGlvbkNvbnRleHRcIiwgeyBwYWdlOiB0cnVlIH0sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcblx0XHRcdFwicmVsYXRlZEFwcHNcIixcblx0XHRcdHtcblx0XHRcdFx0dmlzaWJpbGl0eTogZmFsc2UsXG5cdFx0XHRcdGl0ZW1zOiBudWxsXG5cdFx0XHR9LFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0dHJ1ZVxuXHRcdCk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcImJhdGNoR3JvdXBzXCIsIHRoaXMuX2dldEJhdGNoR3JvdXBzRm9yVmlldygpKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIiwgZmFsc2UpO1xuXG5cdFx0aWYgKHRoaXMuZ2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uKCkpIHtcblx0XHRcdG9PYmplY3RQYWdlLmF0dGFjaEV2ZW50KFwic3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydFwiLCB0aGlzLl9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0LmJpbmQodGhpcykpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpLmZvckVhY2goKHN1YlNlY3Rpb24pID0+IHtcblx0XHRcdFx0c3ViU2VjdGlvbi5hdHRhY2hFdmVudChcInN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnRcIiwgdGhpcy5faGFuZGxlU3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydC5iaW5kKHRoaXMpKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRoaXMubWVzc2FnZUJ1dHRvbiA9IHRoaXMuZ2V0VmlldygpLmJ5SWQoXCJmZTo6Rm9vdGVyQmFyOjpNZXNzYWdlQnV0dG9uXCIpIGFzIE1lc3NhZ2VCdXR0b247XG5cdFx0dGhpcy5tZXNzYWdlQmluZGluZyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5iaW5kTGlzdChcIi9cIik7XG5cdFx0dGhpcy5tZXNzYWdlQmluZGluZz8uYXR0YWNoQ2hhbmdlKHRoaXMuX2ZuU2hvd09QTWVzc2FnZSwgdGhpcyk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcInJvb3RFZGl0RW5hYmxlZFwiLCB0cnVlLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJyb290RWRpdFZpc2libGVcIiwgdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlKTtcblxuXHRcdHRoaXMuX2hhbmRsZVNtYXJ0U3VtbWFyeVN0YXJ0dXBBY3Rpb24oKTtcblx0fVxuXG5cdG9uRXhpdCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMpIHtcblx0XHRcdGZvciAoY29uc3Qgc0lkIG9mIE9iamVjdC5rZXlzKHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzKSkge1xuXHRcdFx0XHRpZiAodGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXSkge1xuXHRcdFx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0uZGVzdHJveSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRkZWxldGUgdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXM7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmV4dGVuc2lvbkFQSSkge1xuXHRcdFx0dGhpcy5leHRlbnNpb25BUEkuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRkZWxldGUgdGhpcy5leHRlbnNpb25BUEk7XG5cblx0XHRjb25zdCBvTWVzc2FnZVBvcG92ZXIgPSB0aGlzLm1lc3NhZ2VCdXR0b24gPyB0aGlzLm1lc3NhZ2VCdXR0b24ub01lc3NhZ2VQb3BvdmVyIDogbnVsbDtcblx0XHRpZiAob01lc3NhZ2VQb3BvdmVyICYmIG9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0b01lc3NhZ2VQb3BvdmVyLmNsb3NlKCk7XG5cdFx0fVxuXHRcdC8vd2hlbiBleGl0aW5nIHdlIHNldCBrZWVwQWxpdmUgY29udGV4dCB0byBmYWxzZVxuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRpZiAob0NvbnRleHQgJiYgb0NvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGZhbHNlKTtcblx0XHR9XG5cblx0XHR0aGlzLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7IC8vIENsZWFudXAgY29sbGFib3JhdGlvbiBjb25uZWN0aW9uIHdoZW4gbGVhdmluZyB0aGUgYXBwXG5cblx0XHR0aGlzLm1lc3NhZ2VCaW5kaW5nPy5kZXRhY2hDaGFuZ2UodGhpcy5fZm5TaG93T1BNZXNzYWdlLCB0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gc2hvdyB0aGUgbWVzc2FnZSBzdHJpcCBvbiB0aGUgb2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqL1xuXHRfZm5TaG93T1BNZXNzYWdlKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdC8vIElmIHRoZSBhcHAgaXMgc3VzcGVuZGVkLCB3ZSBkbyBub3Qgc2hvdyB0aGUgbWVzc2FnZXMgKHRoZSBNZXNzYWdlTW9kZWwgY29udGFpbnMgbWVzc2FnZXMgZnJvbSB0aGUgYWN0aXZlIGFwcCkuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgZXh0ZW5zaW9uQVBJID0gdGhpcy5nZXRFeHRlbnNpb25BUEkoKTtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3QgbWVzc2FnZXMgPSBNZXNzYWdpbmc/LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHQuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFRhcmdldHMoKVswXSA9PT0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0XHR9KTtcblxuXHRcdGlmIChleHRlbnNpb25BUEkpIHtcblx0XHRcdGV4dGVuc2lvbkFQSS5fc2hvd01lc3NhZ2VzKG1lc3NhZ2VzLCBcIkJhY2tlbmRcIik7XG5cdFx0fVxuXHR9XG5cblx0X2dldFRhYmxlQmluZGluZyhvVGFibGU6IFRhYmxlKTogT0RhdGFMaXN0QmluZGluZyB7XG5cdFx0cmV0dXJuIG9UYWJsZSAmJiBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCB0aGUgc2FwVXhBUE9iamVjdFBhZ2VTdWJTZWN0aW9uRml0Q29udGFpbmVyIENTUyBjbGFzcyB0byBldmVyeSB2aXNpYmxlIHN1YnNlY3Rpb24gdGhhdCBjb250YWlucyBvbmx5IGEgc2luZ2xlIEdyaWRUYWJsZSBvciBUcmVlVGFibGUuXG5cdCAqIFRoaXMgbWFrZXMgdGhlIHRhYmxlIGZpbGwgdGhlIGZ1bGwgaGVpZ2h0IG9mIGl0cyBjb250YWluZXIgc28gdGhhdCB0aGUgc2Nyb2xsYmFyIGFwcGVhcnMgb24gdGhlIHRhYmxlIGl0c2VsZiByYXRoZXIgdGhhbiBvbiB0aGUgcGFnZS5cblx0ICogQHBhcmFtIHN1YlNlY3Rpb25zIFRoZSBzdWIgc2VjdGlvbnMgdG8gbG9vayBmb3Jcblx0ICovXG5cdHByaXZhdGUgY2hlY2tTZWN0aW9uc0Zvck5vblJlc3BvbnNpdmVUYWJsZShzdWJTZWN0aW9uczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSk6IHZvaWQge1xuXHRcdGNvbnN0IGNoYW5nZUNsYXNzRm9yVGFibGVzID0gKGV2ZW50OiBFdmVudCwgdmlzaWJsZVN1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uKTogdm9pZCA9PiB7XG5cdFx0XHRjb25zdCBibG9ja3MgPSBbLi4udmlzaWJsZVN1YlNlY3Rpb24uZ2V0QmxvY2tzKCksIC4uLnZpc2libGVTdWJTZWN0aW9uLmdldE1vcmVCbG9ja3MoKV0uZmlsdGVyKChibG9jaykgPT5cblx0XHRcdFx0YmxvY2suaXNBKFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLmNvbnRyb2xzLlN1YlNlY3Rpb25CbG9ja1wiKVxuXHRcdFx0KTtcblx0XHRcdGlmIChibG9ja3MubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdGNvbnN0IHRhYmxlID0gdGhpcy5zZWFyY2hUYWJsZUluQmxvY2soYmxvY2tzWzBdIGFzIFN1YlNlY3Rpb25CbG9jayk7XG5cdFx0XHRcdGlmICghdGFibGUpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgdGFibGVUeXBlID0gdGFibGUuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikgJiYgKHRhYmxlLmdldFR5cGUoKSBhcyBUYWJsZVR5cGVCYXNlKTtcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSB0YWJsZS5nZXRQYXJlbnQoKT8uaXNBPFRhYmxlQVBJPihcInNhcC5mZS5tYWNyb3MuVGFibGVcIikgPyAodGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRjb25zdCB0YWJsZUNvbnRyb2wgPSB0YWJsZUFQST8uZ2V0VGFibGVEZWZpbml0aW9uKCkuY29udHJvbDtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dGFibGVUeXBlICYmXG5cdFx0XHRcdFx0KHRhYmxlVHlwZT8uaXNBKFwic2FwLnVpLm1kYy50YWJsZS5HcmlkVGFibGVUeXBlXCIpIHx8IHRhYmxlVHlwZT8uaXNBKFwic2FwLnVpLm1kYy50YWJsZS5UcmVlVGFibGVUeXBlXCIpKSAmJlxuXHRcdFx0XHRcdHRhYmxlQ29udHJvbD8ucm93Q291bnRNb2RlID09PSBcIkF1dG9cIiAmJlxuXHRcdFx0XHRcdC8vIEV4Y2x1ZGUgQ3JlYXRpb25Sb3cgbW9kZSB1bmxlc3Mgc2VjdGlvbkxheW91dCBpcyBUYWJzOiB0aGUgZml0LWNvbnRhaW5lciBzdHlsZSBjcmVhdGVzIHdoaXRlc3BhY2UgaW4gdGhlIHN1YnNlY3Rpb24gaW4gZWRpdCBtb2RlIHdoZW4gQ3JlYXRpb25Sb3cgaXMgdXNlZCBpbiBUYWJsZUNyZWF0aW9uT3B0aW9uc1xuXHRcdFx0XHRcdCh0YWJsZUNvbnRyb2w/LmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93IHx8IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkuc2VjdGlvbkxheW91dCA9PT0gXCJUYWJzXCIpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vSW4gY2FzZSB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRhYmxlIGluIGEgc3ViU2VjdGlvbiB3ZSBmaXQgdGhhdCB0byB0aGUgd2hvbGUgcGFnZSBzbyB0aGF0IHRoZSBzY3JvbGxiYXIgY29tZXMgb25seSBvbiB0YWJsZSBhbmQgbm90IG9uIHBhZ2Vcblx0XHRcdFx0XHR2aXNpYmxlU3ViU2VjdGlvbi5hZGRTdHlsZUNsYXNzKFwic2FwVXhBUE9iamVjdFBhZ2VTdWJTZWN0aW9uRml0Q29udGFpbmVyXCIpO1xuXHRcdFx0XHRcdHZpc2libGVTdWJTZWN0aW9uLmRldGFjaEV2ZW50KFwibW9kZWxDb250ZXh0Q2hhbmdlXCIsIGNoYW5nZUNsYXNzRm9yVGFibGVzLCB0aGlzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Zm9yIChjb25zdCBzdWJTZWN0aW9uIG9mIHN1YlNlY3Rpb25zKSB7XG5cdFx0XHRpZiAoc3ViU2VjdGlvbi5nZXRWaXNpYmxlKCkpIHtcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBhdHRhY2ggdGhpcyBldmVudCBpbiBvcmRlciB0byBtYW5hZ2UgdGhlIE9iamVjdCBQYWdlIExhenkgTG9hZGluZyBtZWNoYW5pc21cblx0XHRcdFx0c3ViU2VjdGlvbi5hdHRhY2hFdmVudChcIm1vZGVsQ29udGV4dENoYW5nZVwiLCBzdWJTZWN0aW9uLCBjaGFuZ2VDbGFzc0ZvclRhYmxlcywgdGhpcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbmQgYSB0YWJsZSBpbiBibG9ja3Mgb2Ygc2VjdGlvbi5cblx0ICogQHBhcmFtIGJsb2NrIE9uZSBzdWIgc2VjdGlvbiBibG9ja1xuXHQgKiBAcmV0dXJucyBUYWJsZSBpZiBleGlzdHNcblx0ICovXG5cdHByaXZhdGUgc2VhcmNoVGFibGVJbkJsb2NrKGJsb2NrOiBTdWJTZWN0aW9uQmxvY2spOiBUYWJsZSB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IHRhYmxlQVBJOiBUYWJsZUFQSSB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBnZXRUYWJsZUFQSSA9IChjb250cm9sOiBDb250cm9sKTogVGFibGVBUEkgfCB1bmRlZmluZWQgPT4ge1xuXHRcdFx0Ly8gVGhlIHRhYmxlIG1heSBjdXJyZW50bHkgYmUgc2hvd24gaW4gYSBmdWxsIHNjcmVlbiBkaWFsb2csIHdlIGNhbiB0aGVuIGdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBUYWJsZUFQSVxuXHRcdFx0Ly8gY29udHJvbCBmcm9tIHRoZSBjdXN0b20gZGF0YSBvZiB0aGUgcGxhY2UgaG9sZGVyIHBhbmVsXG5cdFx0XHRpZiAoY29udHJvbC5pc0EoXCJzYXAubS5QYW5lbFwiKSAmJiBjb250cm9sLmRhdGEoXCJGdWxsU2NyZWVuVGFibGVQbGFjZUhvbGRlclwiKSkge1xuXHRcdFx0XHRyZXR1cm4gY29udHJvbC5kYXRhKFwidGFibGVBUElyZWZlcmVuY2VcIik7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wuaXNBKFwic2FwLmZlLm1hY3Jvcy5UYWJsZVwiKSkge1xuXHRcdFx0XHRyZXR1cm4gY29udHJvbCBhcyBUYWJsZUFQSTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGlmIChibG9jay5pc0EoXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuY29udHJvbHMuU3ViU2VjdGlvbkJsb2NrXCIpKSB7XG5cdFx0XHRjb25zdCBjb250cm9sID0gYmxvY2suY29udGVudDtcblx0XHRcdGlmIChjb250cm9sLmlzQShcInNhcC51aS5sYXlvdXQuRHluYW1pY1NpZGVDb250ZW50XCIpKSB7XG5cdFx0XHRcdGNvbnN0IG1haW5Db250ZW50ID0gKGNvbnRyb2wgYXMgRHluYW1pY1NpZGVDb250ZW50KS5nZXRNYWluQ29udGVudCgpWzBdO1xuXHRcdFx0XHRjb25zdCBtYWluQ29udGVudFRhYmxlQVBJID0gZ2V0VGFibGVBUEkobWFpbkNvbnRlbnQpO1xuXHRcdFx0XHRpZiAobWFpbkNvbnRlbnRUYWJsZUFQSSkge1xuXHRcdFx0XHRcdHRhYmxlQVBJID0gbWFpbkNvbnRlbnRUYWJsZUFQSTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBzaWRlQ29udGVudCA9IChjb250cm9sIGFzIER5bmFtaWNTaWRlQ29udGVudCkuZ2V0U2lkZUNvbnRlbnQoKVswXTtcblx0XHRcdFx0XHRjb25zdCBzaWRlQ29udGVudFRhYmxlQVBJID0gZ2V0VGFibGVBUEkoc2lkZUNvbnRlbnQpO1xuXHRcdFx0XHRcdGlmIChzaWRlQ29udGVudFRhYmxlQVBJKSB7XG5cdFx0XHRcdFx0XHR0YWJsZUFQSSA9IHNpZGVDb250ZW50VGFibGVBUEk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0YWJsZUFQSSA9IGdldFRhYmxlQVBJKGNvbnRyb2wpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGFibGVBUEkpIHtcblx0XHRcdFx0cmV0dXJuIHRhYmxlQVBJLmNvbnRlbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRvbkJlZm9yZVJlbmRlcmluZygpOiB2b2lkIHtcblx0XHRQYWdlQ29udHJvbGxlci5wcm90b3R5cGUub25CZWZvcmVSZW5kZXJpbmcuYXBwbHkodGhpcyk7XG5cdFx0Ly8gSW4gdGhlIHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Qgc2NlbmFyaW8gd2UgbmVlZCB0byBlbnN1cmUgaW4gY2FzZSBvZiByZWxvYWQvcmVmcmVzaCB0aGF0IHRoZSBtZXRhIG1vZGVsIGluIHRoZSBtZXRob2RlIHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Qgb2YgdGhlIEZpZWxkUnVudGltZSBpcyBhdmFpbGFibGVcblx0XHRpZiAodGhpcy5vVmlldy5nZXRWaWV3RGF0YSgpPy5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0ICYmIENvbW1vbkhlbHBlci5nZXRNZXRhTW9kZWwoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRDb21tb25IZWxwZXIuc2V0TWV0YU1vZGVsKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdH1cblx0fVxuXG5cdG9uQWZ0ZXJSZW5kZXJpbmcoKTogdm9pZCB7XG5cdFx0bGV0IHN1YlNlY3Rpb25zOiBPYmplY3RQYWdlU3ViU2VjdGlvbltdO1xuXHRcdGlmICh0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldFVzZUljb25UYWJCYXIoKSkge1xuXHRcdFx0Y29uc3Qgc2VjdGlvbnMgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldFNlY3Rpb25zKCk7XG5cdFx0XHRmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcblx0XHRcdFx0c3ViU2VjdGlvbnMgPSBzZWN0aW9uLmdldFN1YlNlY3Rpb25zKCk7XG5cdFx0XHRcdHRoaXMuY2hlY2tTZWN0aW9uc0Zvck5vblJlc3BvbnNpdmVUYWJsZShzdWJTZWN0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN1YlNlY3Rpb25zID0gdGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKTtcblx0XHRcdHRoaXMuY2hlY2tTZWN0aW9uc0Zvck5vblJlc3BvbnNpdmVUYWJsZShzdWJTZWN0aW9ucyk7XG5cdFx0fVxuXHR9XG5cblx0X29uQmVmb3JlQmluZGluZyhvQ29udGV4dDogT0RhdGFWNENvbnRleHQsIG1QYXJhbWV0ZXJzOiBCaW5kaW5nUGFyYW1zID0ge30pOiB2b2lkIHtcblx0XHQvLyBSZXNldCBmbGFnIHRvIGFsbG93IHNlY3Rpb24gcmVzdG9yYXRpb24gb24gdGhpcyBuZXcgYmluZGluZyBjb250ZXh0LlxuXHRcdC8vIFRoaXMgZW5zdXJlcyBWaWV3U3RhdGUuYXBwbHkoKSBjYW4gcHJvcGVybHkgcmVzdG9yZSBzZWN0aW9ucyBhZnRlciBkaXNjYXJkIG9yIHJlLW5hdmlnYXRpb24uXG5cdFx0dGhpcy5za2lwVmlld1N0YXRlU2VjdGlvblJlc3RvcmUgPSBmYWxzZTtcblxuXHRcdC8vIFN0b3JlIHRhcmdldENvbnRyb2xJZCBmb3Igc2Nyb2xsaW5nIGFmdGVyIGJpbmRpbmcgY29tcGxldGVzXG5cdFx0dGhpcy5wZW5kaW5nVGFyZ2V0Q29udHJvbElkID0gbVBhcmFtZXRlcnMudGFyZ2V0Q29udHJvbElkO1xuXG5cdFx0Ly8gQXBwbHkgdGFyZ2V0Q29udHJvbElkIG9ubHkgb24gaW5pdGlhbCBuYXZpZ2F0aW9uIC0gZG9uJ3QgYXBwbHkgZHVyaW5nIGVkaXQvc2F2ZS9kaXNjYXJkIHRyYW5zaXRpb25zXG5cdFx0Ly8gdG8gcHJlc2VydmUgdXNlcidzIHNlY3Rpb24gc2VsZWN0aW9uLiBOb3RlOiBnZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSByZXR1cm5zIHRoZSBPTEQgY29udGV4dFxuXHRcdC8vIHRoZXJlZm9yZSB0aGUgb0NvbnRleHQgcGFyYW1ldGVyIGlzIHVzZWQuXG5cdFx0Y29uc3QgY3VycmVudENvbnRleHRQYXRoID0gb0NvbnRleHQ/LmdldFBhdGgoKTtcblx0XHRjb25zdCBnZXRFbnRpdHlJZGVudGl0eSA9IChwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuXHRcdFx0aWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0Ly8gUmVtb3ZlIElzQWN0aXZlRW50aXR5IGZyb20gdGhlIHBhdGggdG8gZ2V0IGVudGl0eSBpZGVudGl0eVxuXHRcdFx0Ly8gZS5nLiwgXCIvUHJvZHVjdHMoSUQ9MSxJc0FjdGl2ZUVudGl0eT10cnVlKVwiIC0+IFwiL1Byb2R1Y3RzKElEPTEpXCJcblx0XHRcdHJldHVybiBwYXRoXG5cdFx0XHRcdC5yZXBsYWNlKC8sP0lzQWN0aXZlRW50aXR5PSh0cnVlfGZhbHNlKSw/LywgXCJcIilcblx0XHRcdFx0LnJlcGxhY2UoL1xcKFxccyosLywgXCIoXCIpXG5cdFx0XHRcdC5yZXBsYWNlKC8sXFxzKlxcKS8sIFwiKVwiKTtcblx0XHR9O1xuXHRcdGNvbnN0IGN1cnJlbnRFbnRpdHlJZCA9IGdldEVudGl0eUlkZW50aXR5KGN1cnJlbnRDb250ZXh0UGF0aCk7XG5cdFx0Y29uc3QgcHJldmlvdXNFbnRpdHlJZCA9IGdldEVudGl0eUlkZW50aXR5KHRoaXMucHJldmlvdXNCaW5kaW5nQ29udGV4dFBhdGgpO1xuXHRcdHRoaXMuaXNOZXdCaW5kaW5nQ29udGV4dCA9IHByZXZpb3VzRW50aXR5SWQgIT09IGN1cnJlbnRFbnRpdHlJZDtcblx0XHR0aGlzLnByZXZpb3VzQmluZGluZ0NvbnRleHRQYXRoID0gY3VycmVudENvbnRleHRQYXRoO1xuXHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCksXG5cdFx0XHRvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCksXG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0b0ludGVybmFsTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpLFxuXHRcdFx0YUJhdGNoR3JvdXBzID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiYmF0Y2hHcm91cHNcIik7XG5cdFx0bGV0IG9GYXN0Q3JlYXRpb25Sb3c7XG5cdFx0YUJhdGNoR3JvdXBzLnB1c2goXCIkYXV0b1wiKTtcblx0XHRpZiAobVBhcmFtZXRlcnMucmVhc29uICE9PSBOYXZpZ2F0aW9uUmVhc29uLkVkaXRGbG93QWN0aW9uKSB7XG5cdFx0XHR0aGlzLl9jbG9zZVNpZGVDb250ZW50KCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9wQ29udGV4dCA9IG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0aWYgKFxuXHRcdFx0b3BDb250ZXh0ICYmXG5cdFx0XHRvcENvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSAmJlxuXHRcdFx0IWFCYXRjaEdyb3Vwcy5zb21lKG9wQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzLmJpbmQob3BDb250ZXh0LmdldE1vZGVsKCkpKVxuXHRcdCkge1xuXHRcdFx0LyogXHRJbiBjYXNlIHRoZXJlIGFyZSBwZW5kaW5nIGNoYW5nZXMgZm9yIHRoZSBjcmVhdGlvbiByb3cgYW5kIG5vIG90aGVycyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRcdFx0VE9ETzogdGhpcyBpcyBqdXN0IGEgcXVpY2sgc29sdXRpb24sIHRoaXMgbmVlZHMgdG8gYmUgcmV3b3JrZWRcblx0XHRcdFx0XHRcdFx0XHQqL1xuXG5cdFx0XHRvcENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdC8vIEZvciBub3cgd2UgaGF2ZSB0byBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCB0byBudWxsIGZvciBldmVyeSBmYXN0IGNyZWF0aW9uIHJvd1xuXHRcdC8vIFRPRE86IEdldCByaWQgb2YgdGhpcyBjb2Rpbmcgb3IgbW92ZSBpdCB0byBhbm90aGVyIGxheWVyIC0gdG8gYmUgZGlzY3Vzc2VkIHdpdGggTURDIGFuZCBtb2RlbFxuXHRcdGZvciAoY29uc3QgaXRlbSBvZiBhVGFibGVzKSB7XG5cdFx0XHRvRmFzdENyZWF0aW9uUm93ID0gaXRlbS5nZXRDcmVhdGlvblJvdygpO1xuXHRcdFx0aWYgKG9GYXN0Q3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0b0Zhc3RDcmVhdGlvblJvdy5zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTY3JvbGwgdG8gcHJlc2VudCBTZWN0aW9uIHNvIHRoYXQgYmluZGluZ3MgYXJlIGVuYWJsZWQgZHVyaW5nIG5hdmlnYXRpb24gdGhyb3VnaCBwYWdpbmF0b3IgYnV0dG9ucywgYXMgdGhlcmUgaXMgbm8gdmlldyByZXJlbmRlcmluZy9yZWJpbmRcblx0XHRjb25zdCBmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24gPSBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRpZiAoIShvT2JqZWN0UGFnZSBhcyB7IGlzRmlyc3RSZW5kZXJpbmc/OiAoKSA9PiBib29sZWFuIH0pLmlzRmlyc3RSZW5kZXJpbmc/LigpICYmICFtUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsKSB7XG5cdFx0XHRcdG9PYmplY3RQYWdlLnNldFNlbGVjdGVkU2VjdGlvbihudWxsIGFzIHVua25vd24gYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdG9PYmplY3RQYWdlLmF0dGFjaEV2ZW50T25jZShcIm1vZGVsQ29udGV4dENoYW5nZVwiLCBmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24pO1xuXG5cdFx0Y29uc3QgZm5PUFJlbmRlcmluZ0xheW91dCA9IHtcblx0XHRcdG9uQWZ0ZXJSZW5kZXJpbmc6ICgpOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCk/LmVkaXRhYmxlSGVhZGVyQ29udGVudCkge1xuXHRcdFx0XHRcdGZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9PYmplY3RQYWdlLnJlbW92ZUV2ZW50RGVsZWdhdGUoZm5PUFJlbmRlcmluZ0xheW91dCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRvT2JqZWN0UGFnZS5hZGRFdmVudERlbGVnYXRlKGZuT1BSZW5kZXJpbmdMYXlvdXQpO1xuXG5cdFx0Ly9TZXQgdGhlIEJpbmRpbmcgZm9yIFBhZ2luYXRvcnMgdXNpbmcgTGlzdEJpbmRpbmcgSURcblx0XHR0aGlzLl9pbml0aWFsaXplUGFnaW5hdGlvbihvQ29udGV4dCwgb0ludGVybmFsTW9kZWwsIG1QYXJhbWV0ZXJzPy5saXN0QmluZGluZyk7XG5cblx0XHR0aGlzLl9kaXNhYmxlQmxvY2tzQmluZGluZ3Mob09iamVjdFBhZ2UpO1xuXG5cdFx0dGhpcy5zdWJTZWN0aW9ucyA9IHRoaXMuZGlzY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzKG9PYmplY3RQYWdlKTtcblx0XHR0aGlzLndhaXRGb3JWaXNpYmlsaXR5QmluZGluZ3MgPSB0aGlzLndhaXRGb3JBbGxTdWJTZWN0aW9uVmlzaWJpbGl0eUJpbmRpbmdzUmVzb2x2ZWQoKTtcblxuXHRcdGlmICh0aGlzLnBsYWNlaG9sZGVyLmlzUGxhY2Vob2xkZXJFbmFibGVkKCkgJiYgbVBhcmFtZXRlcnMuc2hvd1BsYWNlaG9sZGVyKSB7XG5cdFx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0Y29uc3Qgb05hdkNvbnRhaW5lciA9IChvVmlldy5nZXRQYXJlbnQoKSBhcyB1bmtub3duIGFzIHsgb0NvbnRhaW5lcjogQ29udHJvbCB9KS5vQ29udGFpbmVyLmdldFBhcmVudCgpO1xuXHRcdFx0aWYgKG9OYXZDb250YWluZXIpIHtcblx0XHRcdFx0dGhpcy5wbGFjZWhvbGRlci5lbmFibGVBbmltYXRpb24oKTtcblx0XHRcdFx0KG9OYXZDb250YWluZXIgYXMgdW5rbm93biBhcyB7IHNob3dQbGFjZWhvbGRlcjogRnVuY3Rpb24gfSkuc2hvd1BsYWNlaG9sZGVyKHt9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzY29ubmVjdCB0aGUgdmlzaWJpbGl0eSBvYnNlcnZlcnMgb2YgYWxsIEZFIHN1YnNlY3Rpb25zLlxuXHQgKiBAcGFyYW0gb2JqZWN0UGFnZUxheW91dFxuXHQgKiBAcmV0dXJucyBUaGUgc3Vic2VjdGlvbnMgaW5mb3JtYXRpb24gb3IgdW5kZWZpbmVkIGlmIG9wdGltaXphdGlvbiBpcyBkaXNhYmxlZFxuXHQgKi9cblx0ZGlzY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzKFxuXHRcdG9iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXRcblx0KTogeyBmZTogU3ViU2VjdGlvbltdOyBvdGhlcnM6IE9iamVjdFBhZ2VTdWJTZWN0aW9uW10gfSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKCF0aGlzLmdldERpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvbigpKSB7XG5cdFx0XHRvYmplY3RQYWdlTGF5b3V0LnNldFZpc2libGUoZmFsc2UpO1xuXHRcdFx0Y29uc3Qgc3ViU2VjdGlvbnNJbmZvOiB7XG5cdFx0XHRcdGZlOiBTdWJTZWN0aW9uW107XG5cdFx0XHRcdG90aGVyczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXTtcblx0XHRcdH0gPSB7IGZlOiBbXSwgb3RoZXJzOiBbXSB9O1xuXHRcdFx0dGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKS5mb3JFYWNoKChzdWJTZWN0aW9uKSA9PiB7XG5cdFx0XHRcdGlmIChzdWJTZWN0aW9uLmlzQTxTdWJTZWN0aW9uPihcInNhcC5mZS5tYWNyb3MuY29udHJvbHMuc2VjdGlvbi5TdWJTZWN0aW9uXCIpKSB7XG5cdFx0XHRcdFx0c3ViU2VjdGlvbnNJbmZvLmZlLnB1c2goc3ViU2VjdGlvbik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3ViU2VjdGlvbnNJbmZvLm90aGVycy5wdXNoKHN1YlNlY3Rpb24pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHN1YlNlY3Rpb25zSW5mby5mZS5mb3JFYWNoKChzdWJTZWN0aW9uKSA9PiBzdWJTZWN0aW9uLmRpc2Nvbm5lY3RWaXNpYmlsaXR5T2JzZXJ2ZXIoKSk7XG5cdFx0XHRyZXR1cm4gc3ViU2VjdGlvbnNJbmZvO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgbG9hZGluZyBzdHJhdGVneSBmb3IgdGhlIG9iamVjdCBwYWdlLlxuXHQgKiBAcmV0dXJucyBUaGUgbG9hZGluZyBzdHJhdGVneSBmb3IgdGhlIG9iamVjdCBwYWdlLlxuXHQgKi9cblx0Z2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmRhdGEoXCJkaXNhYmxlT2JqZWN0UGFnZVJlcXVlc3RPcHRpbWl6YXRpb25cIikgPT09IFwidHJ1ZVwiO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRGaXJzdEVkaXRhYmxlSW5wdXQoKTogVUk1RWxlbWVudCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgZG9tRWRpdGFibGVFbGVtZW50ID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKS5fZ2V0Rmlyc3RFZGl0YWJsZUlucHV0KCk7XG5cdFx0cmV0dXJuIGRvbUVkaXRhYmxlRWxlbWVudCA/IFVJNUVsZW1lbnQuY2xvc2VzdFRvKGRvbUVkaXRhYmxlRWxlbWVudCkgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBmaXJzdCBjbGlja2FibGUgZWxlbWVudCBpbiB0aGUgb2JqZWN0IHBhZ2UuXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSBvYmplY3RQYWdlIE9iamVjdCBQYWdlIExheW91dCBjb250cm9sXG5cdCAqIEByZXR1cm5zIFRoZSBmaXJzdCBjbGlja2FibGUgZWxlbWVudCBmb3VuZFxuXHQgKi9cblx0cHJpdmF0ZSBnZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQob2JqZWN0UGFnZTogT2JqZWN0UGFnZUxheW91dCk6IFVJNUVsZW1lbnQgfCB1bmRlZmluZWQge1xuXHRcdC8vIEluIGRpc3BsYXkgbW9kZSwgaWYgYSB2aXNpYmxlIHByaW1hcnkgYWN0aW9uIHdpdGggdGhlIGVtcGhhc2lzIGV4aXN0cyBpbiB0aGUgZm9vdGVyLCBpdCBtdXN0IGJlIHRoZSBmaXJzdCBjbGlja2FibGUgZWxlbWVudCBvbiB0aGUgcGFnZS5cblx0XHRjb25zdCBmb290ZXIgPSBvYmplY3RQYWdlLmdldEZvb3RlcigpO1xuXHRcdGNvbnN0IGZvb3RlclByaW1hcnlBY3Rpb24gPSBmb290ZXJcblx0XHRcdD8gdGhpcy5fZ2V0UHJpbWFyeUFjdGlvblNob3J0Y3V0Q2FuZGlkYXRlcyhmb290ZXIgYXMgdW5rbm93biBhcyBNYW5hZ2VkT2JqZWN0LCB0cnVlKVswXVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0aWYgKGZvb3RlclByaW1hcnlBY3Rpb24pIHtcblx0XHRcdHJldHVybiBmb290ZXJQcmltYXJ5QWN0aW9uO1xuXHRcdH1cblx0XHQvLyBGYWxsYmFjazogZmlyc3QgdmlzaWJsZSAmIGVuYWJsZWQgaGVhZGVyIGFjdGlvbiAoRWRpdCwgZXRjLilcblx0XHRsZXQgZmlyc3RDbGlja2FibGVFbGVtZW50O1xuXHRcdGNvbnN0IGFjdGlvbnMgPSBvYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkgJiYgKG9iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSBhcyBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlKS5nZXRBY3Rpb25zKCk7XG5cdFx0aWYgKGFjdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0Zmlyc3RDbGlja2FibGVFbGVtZW50ID0gYWN0aW9ucy5maW5kKGZ1bmN0aW9uIChhY3Rpb246IENvbnRyb2wpIHtcblx0XHRcdFx0Ly8gRHVlIHRvIHRoZSBsZWZ0IGFsaWdubWVudCBvZiB0aGUgRHJhZnQgc3dpdGNoIGFuZCB0aGUgY29sbGFib3JhdGl2ZSBkcmFmdCBhdmF0YXIgY29udHJvbHNcblx0XHRcdFx0Ly8gdGhlcmUgaXMgYSBUb29sYmFyU3BhY2VyIGluIHRoZSBhY3Rpb25zIGFnZ3JlZ2F0aW9uIHdoaWNoIHdlIG5lZWQgdG8gZXhjbHVkZSBoZXJlIVxuXHRcdFx0XHQvLyBEdWUgdG8gdGhlIEFDQyByZXBvcnQsIHdlIGFsc28gbmVlZCBub3QgdG8gY2hlY2sgZm9yIHRoZSBJbnZpc2libGVUZXh0IGVsZW1lbnRzXG5cdFx0XHRcdGlmIChhY3Rpb24uaXNBPFN1bW1hcml6YXRpb25CdXR0b24+KFwic2FwLmZlLm1hY3Jvcy5haS5TdW1tYXJpemF0aW9uQnV0dG9uXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGFjdGlvbi5nZXRDb250ZW50KCk/LmdldFZpc2libGUoKSA/PyBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRhY3Rpb24uaXNBPFNoYXJlQVBJPihcInNhcC5mZS5tYWNyb3MuU2hhcmVcIikgfHxcblx0XHRcdFx0XHRhY3Rpb24uaXNBPEVhc3lGaWxsQnV0dG9uPihcInNhcC5mZS5tYWNyb3MuYWkuRWFzeUZpbGxCdXR0b25cIikgfHxcblx0XHRcdFx0XHRhY3Rpb24uaXNBPENvbGxhYm9yYXRpb25EcmFmdD4oXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuY29tcG9uZW50cy5Db2xsYWJvcmF0aW9uRHJhZnRcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gc2luY2UgU2hhcmUgYW5kIENvbGxhYm9yYXRpb25EcmFmdCBkb2VzIG5vdCBoYXZlIGEgZGlzYWJsZSBwcm9wZXJ0eVxuXHRcdFx0XHRcdC8vIGhlbmNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgZGlzYWJsZWQgb3Igbm90XG5cdFx0XHRcdFx0cmV0dXJuIGFjdGlvbi5nZXRWaXNpYmxlKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIWFjdGlvbi5pc0E8SW52aXNpYmxlVGV4dD4oXCJzYXAudWkuY29yZS5JbnZpc2libGVUZXh0XCIpICYmICFhY3Rpb24uaXNBPFRvb2xiYXJTcGFjZXI+KFwic2FwLm0uVG9vbGJhclNwYWNlclwiKSkge1xuXHRcdFx0XHRcdHJldHVybiBhY3Rpb24uZ2V0VmlzaWJsZSgpICYmIChhY3Rpb24gYXMgQnV0dG9uKS5nZXRFbmFibGVkKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gZmlyc3RDbGlja2FibGVFbGVtZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGUgdGhlIGJpbmRpbmdzIG9mIGJsb2NrcyBpbiBPYmplY3QgUGFnZSBMYXlvdXQgYmFzZWQgb24gdGhlIGl0cyBvdmVyYWxsIGNvbnRlbnQuXG5cdCAqIEBwYXJhbSBvYmplY3RQYWdlIE9iamVjdCBQYWdlIExheW91dCBjb250cm9sXG5cdCAqL1xuXHRfZGlzYWJsZUJsb2Nrc0JpbmRpbmdzKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBvYmplY3RQYWdlOiBPYmplY3RQYWdlTGF5b3V0KTogdm9pZCB7XG5cdFx0Y29uc3QgYVNlY3Rpb25zID0gb2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpO1xuXHRcdGNvbnN0IGJVc2VJY29uVGFiQmFyID0gb2JqZWN0UGFnZS5nZXRVc2VJY29uVGFiQmFyKCk7XG5cdFx0bGV0IGlTa2lwID0gMzsgLy8gMyBzZWN0aW9ucy9zdWJzZWN0aW9ucyBhcmUgbG9hZGVkIGluaXRpYWxseSwgdGhlIG90aGVycyBhcmUgbG9hZGVkIGxhemlseVxuXHRcdGNvbnN0IGJJc0luRWRpdE1vZGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKTtcblx0XHRjb25zdCBiRWRpdGFibGVIZWFkZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLmVkaXRhYmxlSGVhZGVyQ29udGVudDtcblx0XHRjb25zdCBmaXJzdFZpc2liaWxpdHlCaW5kaW5nID0gdGhpcy5fZ2V0Zmlyc3RTdWJTZWN0aW9uVmlzaWJpbGl0eUJpbmRpbmcoKTtcblx0XHRmb3IgKGxldCBpU2VjdGlvbiA9IDA7IGlTZWN0aW9uIDwgYVNlY3Rpb25zLmxlbmd0aDsgaVNlY3Rpb24rKykge1xuXHRcdFx0Y29uc3Qgb1NlY3Rpb24gPSBhU2VjdGlvbnNbaVNlY3Rpb25dO1xuXHRcdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gb1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdGZvciAobGV0IGlTdWJTZWN0aW9uID0gMDsgaVN1YlNlY3Rpb24gPCBhU3ViU2VjdGlvbnMubGVuZ3RoOyBpU3ViU2VjdGlvbisrLCBpU2tpcC0tKSB7XG5cdFx0XHRcdC8vIEluIEljb25UYWJCYXIgbW9kZSBrZWVwIHRoZSBzZWNvbmQgc2VjdGlvbiBib3VuZCBpZiB0aGVyZSBpcyBhbiBlZGl0YWJsZSBoZWFkZXIgYW5kIHdlIGFyZSBzd2l0Y2hpbmcgdG8gZGlzcGxheSBtb2RlXG5cdFx0XHRcdGNvbnN0IG9TdWJTZWN0aW9uID0gYVN1YlNlY3Rpb25zW2lTdWJTZWN0aW9uXTtcblx0XHRcdFx0Y29uc3QgZGlzYWJsZUJpbmRpbmdDb250ZXh0Q29uZGl0aW9uID1cblx0XHRcdFx0XHQodGhpcy5nZXREaXNhYmxlT2JqZWN0UGFnZVJlcXVlc3RPcHRpbWl6YXRpb24oKSAmJlxuXHRcdFx0XHRcdFx0KGlTa2lwIDwgMSB8fCAoYlVzZUljb25UYWJCYXIgJiYgKGlTZWN0aW9uID4gMSB8fCAoaVNlY3Rpb24gPT09IDEgJiYgIWJFZGl0YWJsZUhlYWRlciAmJiAhYklzSW5FZGl0TW9kZSkpKSkpIHx8XG5cdFx0XHRcdFx0KCF0aGlzLmdldERpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvbigpICYmXG5cdFx0XHRcdFx0XHQoKCFiVXNlSWNvblRhYkJhciAmJiAoaVNraXAgPCAxIHx8IG9TdWJTZWN0aW9uLmdldEJpbmRpbmcoXCJ2aXNpYmxlXCIpKSkgfHwgLy9pZiB3ZSBhcmUgbm90IGluIEljb25UYWJCYXIgbW9kZSwgYWxsIHNlY3Rpb24gd2l0aCBpbmRleCA+PTMgb3Igd2l0aCB2aXNpYmlsaXR5IGJpbmRpbmcgc2hvdWxkIGJlIGRpc2Nvbm5lY3RlZFxuXHRcdFx0XHRcdFx0XHQoIWJVc2VJY29uVGFiQmFyICYmICFmaXJzdFZpc2liaWxpdHlCaW5kaW5nICYmIGlTa2lwIDwgMSkgfHwgLy8gaWYgbm8gc3Vic2VjdGlvbiBoYXMgdmlzaWJpbGl0eSBiaW5kaW5nIGFuZCB3ZSBhcmUgbm90IGluIEljb25UYWJCYXIgbW9kZVxuXHRcdFx0XHRcdFx0XHQoYlVzZUljb25UYWJCYXIgJiYgKGlTZWN0aW9uID4gMSB8fCAoaVNlY3Rpb24gPT09IDEgJiYgIWJFZGl0YWJsZUhlYWRlciAmJiAhYklzSW5FZGl0TW9kZSkpKSkpO1xuXHRcdFx0XHRpZiAoZGlzYWJsZUJpbmRpbmdDb250ZXh0Q29uZGl0aW9uKSB7XG5cdFx0XHRcdFx0Ly8gU3ViU2VjdGlvbidzIGJpbmRpbmcgaXMgZW5hYmxlZC5cblx0XHRcdFx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dCh1bmRlZmluZWQpO1xuXHRcdFx0XHRcdGNvbnN0IGJsb2NrcyA9IG9TdWJTZWN0aW9uLmdldEJsb2NrcygpO1xuXHRcdFx0XHRcdC8vIFN1YlNlY3Rpb24ncyBjb250ZW50cyBiaW5kaW5nIGlzIGRpc2FibGVkLlxuXHRcdFx0XHRcdGJsb2Nrcy5mb3JFYWNoKChibG9jaykgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKGJsb2NrLmlzQTxTdWJTZWN0aW9uQmxvY2s+KFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLmNvbnRyb2xzLlN1YlNlY3Rpb25CbG9ja1wiKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBTZXQgYmluZGluZyBjb250ZXh0IHRvIG51bGwgb24gYm90aCB0aGUgYmxvY2sgYW5kIGl0cyBjb250ZW50XG5cdFx0XHRcdFx0XHRcdC8vIHRvIHN1cHBvcnQgYm90aDogc3Vic2VjdGlvbnMgd2l0aCBVSS5IaWRkZW4gYW5ub3RhdGlvbiAoY29udGVudCBuZWVkcyB0byBiZSBjbGVhcmVkKVxuXHRcdFx0XHRcdFx0XHQvLyBhbmQgY3VzdG9tZXIgY29udHJvbGxlciBleHRlbnNpb25zIHRoYXQgc2V0IGJpbmRpbmcgY29udGV4dCBvbiB0aGUgYmxvY2sgbGV2ZWxcblx0XHRcdFx0XHRcdFx0YmxvY2suc2V0QmluZGluZ0NvbnRleHQodW5kZWZpbmVkKTtcblx0XHRcdFx0XHRcdFx0YmxvY2suY29udGVudC5zZXRCaW5kaW5nQ29udGV4dD8uKG51bGwpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YmxvY2suc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0b1N1YlNlY3Rpb24uZ2V0TW9yZUJsb2NrcygpLmZvckVhY2goKHN1YkJsb2NrKSA9PiBzdWJCbG9jay5zZXRCaW5kaW5nQ29udGV4dChudWxsKSk7XG5cdFx0XHRcdFx0b1N1YlNlY3Rpb24uZ2V0QWN0aW9ucygpLmZvckVhY2goKGFjdGlvbnMpID0+IGFjdGlvbnMuc2V0QmluZGluZ0NvbnRleHQobnVsbCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2dldEZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZEZyb21TdWJTZWN0aW9uKGFTdWJTZWN0aW9uczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSk6IElucHV0QmFzZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGFTdWJTZWN0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0Zm9yIChjb25zdCBzdWJTZWN0aW9uIG9mIGFTdWJTZWN0aW9ucykge1xuXHRcdFx0Y29uc3QgYUJsb2NrcyA9IHN1YlNlY3Rpb24uZ2V0QmxvY2tzKCkgYXMgKEZvcm0gfCBGb3JtQmxvY2spW107XG5cblx0XHRcdGlmIChhQmxvY2tzKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgYmxvY2tDb250cm9sIG9mIGFCbG9ja3MpIHtcblx0XHRcdFx0XHRpZiAoYmxvY2tDb250cm9sLmdldEJpbmRpbmdDb250ZXh0Py4oKSkge1xuXHRcdFx0XHRcdFx0bGV0IGFGb3JtQ29udGFpbmVycztcblxuXHRcdFx0XHRcdFx0aWYgKGJsb2NrQ29udHJvbC5pc0E8Rm9ybT4oXCJzYXAudWkubGF5b3V0LmZvcm0uRm9ybVwiKSkge1xuXHRcdFx0XHRcdFx0XHRhRm9ybUNvbnRhaW5lcnMgPSBibG9ja0NvbnRyb2wuZ2V0Rm9ybUNvbnRhaW5lcnMoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYmxvY2tDb250cm9sLmdldENvbnRlbnQgJiYgYmxvY2tDb250cm9sLmdldENvbnRlbnQoKT8uaXNBPEZvcm0+KFwic2FwLnVpLmxheW91dC5mb3JtLkZvcm1cIikpIHtcblx0XHRcdFx0XHRcdFx0YUZvcm1Db250YWluZXJzID0gKGJsb2NrQ29udHJvbC5nZXRDb250ZW50KCkgYXMgRm9ybSkuZ2V0Rm9ybUNvbnRhaW5lcnMoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYmxvY2tDb250cm9sPy5nZXRDb250ZW50Py4oKT8uaXNBPEZvcm1CbG9jaz4oXCJzYXAuZmUubWFjcm9zLkZvcm1cIikpIHtcblx0XHRcdFx0XHRcdFx0YUZvcm1Db250YWluZXJzID0gKChibG9ja0NvbnRyb2wuZ2V0Q29udGVudCgpIGFzIEZvcm1CbG9jaykuZ2V0Q29udGVudCgpIGFzIEZvcm0pLmdldEZvcm1Db250YWluZXJzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYUZvcm1Db250YWluZXJzKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgZm9ybUNvbnRhaW5lciBvZiBhRm9ybUNvbnRhaW5lcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBhRm9ybUVsZW1lbnRzID0gZm9ybUNvbnRhaW5lci5nZXRGb3JtRWxlbWVudHMoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoYUZvcm1FbGVtZW50cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBmb3JtRWxlbWVudCBvZiBhRm9ybUVsZW1lbnRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGaWVsZHMgPSBmb3JtRWxlbWVudC5nZXRGaWVsZHMoKSBhcyBJbnB1dEJhc2VbXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZW1wdHlGaWVsZCA9IHRoaXMuZ2V0Rmlyc3RFbXB0eVJlcXVpcmVkRmllbGQoYUZpZWxkcyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbXB0eUZpZWxkKSByZXR1cm4gZW1wdHlGaWVsZDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFZlcmlmeSBpZiB0aGUgZmlyc3QgZmllbGQgaXMgZW1wdHkgYW5kIHJlcXVpcmVkLlxuXHQgKiBAcGFyYW0gZmllbGRzIFRoZSBmaWVsZHMgdG8gY2hlY2tcblx0ICogQHJldHVybnMgVGhlIGZpcnN0IGVtcHR5IHJlcXVpcmVkIGZpZWxkIG9yIHVuZGVmaW5lZCBpZiBubyBzdWNoIGZpZWxkIGV4aXN0c1xuXHQgKi9cblx0Z2V0Rmlyc3RFbXB0eVJlcXVpcmVkRmllbGQoZmllbGRzOiBJbnB1dEJhc2VbXSk6IElucHV0QmFzZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKCFmaWVsZHMgfHwgZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG5cdFx0aWYgKCFmaWVsZHNbMF0uZ2V0UmVxdWlyZWQ/LigpKSByZXR1cm47XG5cblx0XHRsZXQgaXNFbXB0eSA9IGZhbHNlO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChmaWVsZHNbMF0uaXNBKFwic2FwLmZlLm1hY3Jvcy5NdWx0aVZhbHVlRmllbGRcIikpIHtcblx0XHRcdFx0Y29uc3QgaXRlbXMgPSAoZmllbGRzWzBdIGFzIHVua25vd24gYXMgTXVsdGlWYWx1ZUZpZWxkQmxvY2spLmdldE11bHRpVmFsdWVGaWVsZCgpLmdldEl0ZW1zKCk7XG5cdFx0XHRcdGlzRW1wdHkgPSBpdGVtcy5sZW5ndGggPT09IDA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IChmaWVsZHNbMF0gYXMgSW5wdXRCYXNlKS5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRpc0VtcHR5ID0gIXZhbHVlO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoZW4gY2hlY2tpbmcgZmllbGQgcHJvcGVydGllczogJHtlcnJvcn1gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaXNFbXB0eSA/IGZpZWxkc1swXSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGluaXRpYWwgZm9jdXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAcGFyYW0gYVN1YlNlY3Rpb25zIE9iamVjdCBwYWdlIHN1YiBzZWN0aW9uc1xuXHQgKiBAcGFyYW0gZnJvbVRhYk5hdmlnYXRpb24gSW5kaWNhdGVzIGlmIHRoZSBmb2N1cyBpcyBzZXQgYWZ0ZXIgYSB0YWIgbmF2aWdhdGlvblxuXHQgKi9cblx0X3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShhU3ViU2VjdGlvbnM6IE9iamVjdFBhZ2VTdWJTZWN0aW9uW10sIGZyb21UYWJOYXZpZ2F0aW9uID0gZmFsc2UpOiB2b2lkIHtcblx0XHRzZXRUaW1lb3V0KFxuXHRcdFx0ZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKTogdm9pZCB7XG5cdFx0XHRcdC8vIFdlIHNldCB0aGUgZm9jdXMgaW4gYSB0aW1lZW91dCwgb3RoZXJ3aXNlIHRoZSBmb2N1cyBzb21ldGltZXMgZ29lcyB0byB0aGUgVGFiQmFyXG5cdFx0XHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdFx0Y29uc3Qgb01hbmRhdG9yeUZpZWxkID0gdGhpcy5fZ2V0Rmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkRnJvbVN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zKTtcblx0XHRcdFx0bGV0IG9GaWVsZFRvRm9jdXM6IFVJNUVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChvTWFuZGF0b3J5RmllbGQpIHtcblx0XHRcdFx0XHRpZiAob01hbmRhdG9yeUZpZWxkLmlzQShcInNhcC5mZS5tYWNyb3MuTXVsdGlWYWx1ZUZpZWxkXCIpKSB7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzID0gKG9NYW5kYXRvcnlGaWVsZCBhcyB1bmtub3duIGFzIE11bHRpVmFsdWVGaWVsZEJsb2NrKS5nZXRNdWx0aVZhbHVlRmllbGQoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IChcblx0XHRcdFx0XHRcdFx0b01hbmRhdG9yeUZpZWxkIGFzIHVua25vd24gYXMgeyBjb250ZW50OiB7IGdldENvbnRlbnRFZGl0OiBGdW5jdGlvbiB9IH1cblx0XHRcdFx0XHRcdCkuY29udGVudC5nZXRDb250ZW50RWRpdCgpWzBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzID0gdGhpcy5nZXRGaXJzdEVkaXRhYmxlSW5wdXQoKSA/PyB0aGlzLmdldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9GaWVsZFRvRm9jdXMpIHtcblx0XHRcdFx0XHRjb25zdCBmb2N1c0luZm8gPSBvRmllbGRUb0ZvY3VzLmdldEZvY3VzSW5mbygpIGFzIHsgdGFyZ2V0SW5mbzogb2JqZWN0IH07XG5cdFx0XHRcdFx0Zm9jdXNJbmZvLnRhcmdldEluZm8gPSB7IHNpbGVudDogdHJ1ZSB9O1xuXHRcdFx0XHRcdGlmIChvRmllbGRUb0ZvY3VzLmlzQShcInNhcC51aS5tZGMuZmllbGQuRmllbGRJbnB1dFwiKSkge1xuXHRcdFx0XHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IG9GaWVsZFRvRm9jdXMuZ2V0UGFyZW50KCkgYXMgVUk1RWxlbWVudCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzPy5pc0E8U2VhcmNoRmllbGQ+KFwic2FwLm0uU2VhcmNoRmllbGRcIikgJiZcblx0XHRcdFx0XHRcdG9GaWVsZFRvRm9jdXMuZ2V0RW5hYmxlU3VnZ2VzdGlvbnMoKSAmJlxuXHRcdFx0XHRcdFx0IW9GaWVsZFRvRm9jdXMuaXNCb3VuZChcImVuYWJsZVN1Z2dlc3Rpb25zXCIpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBmb2N1cyBpcyBzZXQgb24gYSBzZWFyY2ggZmllbGQgd2l0aCBzdWdnZXN0aW9ucywgd2UgdGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgc3VnZ2VzdGlvbnMgdG8gYXZvaWQgdHJpZ2dlcmluZyB0aGVtIG9uIGZvY3VzXG5cdFx0XHRcdFx0XHQvLyB1bmxlc3MgdGhpcyBwcm9wZXJ0eSBpcyBib3VuZCAodG8gYXZvaWQgbW9kaWZ5aW5nIHNvbWV0aGluZyBpbiBhIG1vZGVsKVxuXHRcdFx0XHRcdFx0b0ZpZWxkVG9Gb2N1cy5zZXRFbmFibGVTdWdnZXN0aW9ucyhmYWxzZSk7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzLmZvY3VzKGZvY3VzSW5mbyk7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzLnNldEVuYWJsZVN1Z2dlc3Rpb25zKHRydWUpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvRmllbGRUb0ZvY3VzPy5mb2N1cyhmb2N1c0luZm8pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fS5iaW5kKHRoaXMpLFxuXHRcdFx0ZnJvbVRhYk5hdmlnYXRpb24gPyAzMDAgOiAwXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGZpcnN0IHN1Yi1zZWN0aW9uIHdpdGggYSB2aXNpYmlsaXR5IGJvdW5kIHRvIHRoZSBtb2RlbCBvZiB0aGUgdmlldy5cblx0ICogU2VjdGlvbnMgd2l0aCBiaW5kaW5ncyBvbiBpbnRlcm5hbCBtb2RlbHMgb25seSBhcmUgaWdub3JlZC5cblx0ICogQHJldHVybnMgVGhlIHZpc2liaWxpdHkgYmluZGluZyBvZiB0aGUgZmlyc3Qgc3ViLXNlY3Rpb24gb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cblx0ICovXG5cdF9nZXRmaXJzdFN1YlNlY3Rpb25WaXNpYmlsaXR5QmluZGluZygpOiBCaW5kaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBhbGxzdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgY3VycmVudE1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRyZXR1cm4gYWxsc3ViU2VjdGlvbnNcblx0XHRcdC5maW5kKFxuXHRcdFx0XHQoc3ViU2VjdGlvbikgPT5cblx0XHRcdFx0XHQoc3ViU2VjdGlvbi5nZXRCaW5kaW5nKFwidmlzaWJsZVwiKSBhcyBDb21wb3NpdGVCaW5kaW5nIHwgdW5kZWZpbmVkKVxuXHRcdFx0XHRcdFx0Py5nZXRCaW5kaW5ncz8uKClcblx0XHRcdFx0XHRcdC5zb21lKChiaW5kaW5nKSA9PiBiaW5kaW5nLmdldE1vZGVsKCkgPT09IGN1cnJlbnRNb2RlbClcblx0XHRcdClcblx0XHRcdD8uZ2V0QmluZGluZyhcInZpc2libGVcIik7XG5cdH1cblxuXHQvKipcblx0ICogV2FpdCBmb3IgYWxsIHN1YnNlY3Rpb24gdmlzaWJpbGl0eSBiaW5kaW5ncyB0byBiZSByZXNvbHZlZC5cblx0ICogVGhpcyBtZXRob2QgbGlzdGVucyBmb3IgdGhlICd2aXNpYmlsaXR5Q2hhbmdlZCcgZXZlbnQgIC4gVGhlIGNoYW5nZSBldmVudCBpcyBmaXJlZCBldmVuIGlmIHRoZSB2YWx1ZXMgYXJlIG5vdCBjaGFuZ2VkIGJ1dCBqdXN0IHJlc29sdmVkLlxuXHQgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBwcm9taXNlcyB0aGF0IHJlc29sdmUgd2hlbiBlYWNoIHZpc2liaWxpdHkgYmluZGluZyBpcyByZXNvbHZlZC5cblx0ICovXG5cdHdhaXRGb3JBbGxTdWJTZWN0aW9uVmlzaWJpbGl0eUJpbmRpbmdzUmVzb2x2ZWQoKTogUHJvbWlzZTx1bmtub3duPltdIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKVxuXHRcdFx0LmZpbHRlcihcblx0XHRcdFx0KHN1YlNlY3Rpb24pID0+IHN1YlNlY3Rpb24uaXNBPFN1YlNlY3Rpb24+KFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5zZWN0aW9uLlN1YlNlY3Rpb25cIikgJiYgc3ViU2VjdGlvbi5nZXRCaW5kaW5nKFwidmlzaWJsZVwiKVxuXHRcdFx0KSAvL2ZpbHRlcmluZyBvbiBGRSBzdWJzZWN0aW9ucyB3aXRoIHZpc2liaWxpdHkgYmluZGluZylcblx0XHRcdC5tYXAoYXN5bmMgKHN1YlNlY3Rpb24pID0+IHtcblx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzdWJTZWN0aW9uLmF0dGFjaEV2ZW50T25jZShcInZpc2liaWxpdHlDaGFuZ2VkXCIsIHJlc29sdmUpKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0X2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQob0V2ZW50OiBVSTVFdmVudDx7IHN1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uIH0+KTogdm9pZCB7XG5cdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3ViU2VjdGlvblwiKTtcblx0XHRpZiAob1N1YlNlY3Rpb24uaXNBPFN1YlNlY3Rpb24+KFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5zZWN0aW9uLlN1YlNlY3Rpb25cIikpIHtcblx0XHRcdG9TdWJTZWN0aW9uLmhhbmRsZVN1YlNlY3Rpb25DcmVhdGVkKHRoaXMuZ2V0VmlldygpKTtcblx0XHR9XG5cdFx0Y29uc3QgYmxvY2tzID0gb1N1YlNlY3Rpb24uZ2V0QmxvY2tzKCk7XG5cdFx0YmxvY2tzLmZvckVhY2goKGJsb2NrKSA9PiB7XG5cdFx0XHRpZiAoYmxvY2suaXNBPFN1YlNlY3Rpb25CbG9jaz4oXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuY29udHJvbHMuU3ViU2VjdGlvbkJsb2NrXCIpKSB7XG5cdFx0XHRcdC8vIFNldCBiaW5kaW5nIGNvbnRleHQgdG8gdW5kZWZpbmVkIG9uIGJvdGggdGhlIGJsb2NrIGFuZCBpdHMgY29udGVudFxuXHRcdFx0XHQvLyB0byBzdXBwb3J0IGJvdGg6IHN1YnNlY3Rpb25zIHdpdGggVUkuSGlkZGVuIGFubm90YXRpb24gKGNvbnRlbnQgbmVlZHMgdG8gYmUgY2xlYXJlZClcblx0XHRcdFx0Ly8gYW5kIGN1c3RvbWVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9ucyB0aGF0IHNldCBiaW5kaW5nIGNvbnRleHQgb24gdGhlIGJsb2NrIGxldmVsXG5cdFx0XHRcdGJsb2NrLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCk7XG5cdFx0XHRcdGJsb2NrLmNvbnRlbnQuc2V0QmluZGluZ0NvbnRleHQ/Lih1bmRlZmluZWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YmxvY2suc2V0QmluZGluZ0NvbnRleHQodW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvU3ViU2VjdGlvbi5nZXRNb3JlQmxvY2tzKCkuZm9yRWFjaCgoc3ViQmxvY2spID0+IHN1YkJsb2NrLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCkpO1xuXHRcdG9TdWJTZWN0aW9uLmdldEFjdGlvbnMoKS5mb3JFYWNoKChhY3Rpb25zKSA9PiBhY3Rpb25zLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCkpO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRfb25BZnRlckJpbmRpbmcoaW5wdXRCaW5kaW5nQ29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQsIG1QYXJhbWV0ZXJzOiBCaW5kaW5nUGFyYW1zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IHZpZXdMZXZlbCA9IHZpZXc/LmdldFZpZXdEYXRhKCk/LnZpZXdMZXZlbDtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKTtcblx0XHRpZiAoW05hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24sIE5hdmlnYXRpb25SZWFzb24uUm93UHJlc3NdLmluY2x1ZGVzKG1QYXJhbWV0ZXJzPy5yZWFzb24gYXMgTmF2aWdhdGlvblJlYXNvbikpIHtcblx0XHRcdHRoaXMuZWRpdEZsb3cuc3RvcmVTaWJsaW5nQ29udGV4dERhdGEoaW5wdXRCaW5kaW5nQ29udGV4dCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zaWRlRWZmZWN0cy5jbGVhckZpZWxkR3JvdXBzVmFsaWRpdHkoKTtcblxuXHRcdC8vIFRPRE86IHRoaXMgaXMgb25seSBhIHRlbXAgc29sdXRpb24gYXMgbG9uZyBhcyB0aGUgbW9kZWwgZml4IHRoZSBjYWNoZSBpc3N1ZSBhbmQgd2UgdXNlIHRoaXMgYWRkaXRpb25hbFxuXHRcdC8vIGJpbmRpbmcgd2l0aCBvd25SZXF1ZXN0XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBvT2JqZWN0UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXG5cdFx0bGV0IGFJQk5BY3Rpb25zOiBVSTVFbGVtZW50W10gPSBbXTtcblx0XHRvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikge1xuXHRcdFx0b1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU3ViU2VjdGlvbjogT2JqZWN0UGFnZVN1YlNlY3Rpb24pIHtcblx0XHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9TdWJTZWN0aW9uLCBhSUJOQWN0aW9ucyk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdC8vIEFzc2lnbiBpbnRlcm5hbCBiaW5kaW5nIGNvbnRleHRzIHRvIG9Gb3JtQ29udGFpbmVyOlxuXHRcdC8vIDEuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhc3NpZ24gdGhlIGludGVybmFsIGJpbmRpbmcgY29udGV4dCB0byB0aGUgWE1MIGZyYWdtZW50XG5cdFx0Ly8gKEZvcm1Db250YWluZXIuZnJhZ21lbnQueG1sKSB5ZXQgLSBpdCBpcyB1c2VkIGFscmVhZHkgZm9yIHRoZSBkYXRhLXN0cnVjdHVyZS5cblx0XHQvLyAyLiBBbm90aGVyIHByb2JsZW0gaXMsIHRoYXQgRm9ybUNvbnRhaW5lcnMgYXNzaWduZWQgdG8gYSAnTW9yZUJsb2NrJyBkb2VzIG5vdCBoYXZlIGFuXG5cdFx0Ly8gaW50ZXJuYWwgbW9kZWwgY29udGV4dCBhdCBhbGwuXG5cblx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogVGFibGUpIHtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0aWYgKG9JbnRlcm5hbE1vZGVsQ29udGV4dCkge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIsIHt9KTtcblxuXHRcdFx0XHRhSUJOQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob1RhYmxlLCBhSUJOQWN0aW9ucyk7XG5cblx0XHRcdFx0Ly8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIEJDUDogMjA4MDIxODAwNFxuXHRcdFx0XHQvLyBOZWVkIHRvIGZpeCB3aXRoIEJMSTogRklPUklURUNIUDEtMTUyNzRcblx0XHRcdFx0Ly8gb25seSBmb3IgZWRpdCBtb2RlLCB3ZSBjbGVhciB0aGUgdGFibGUgY2FjaGVcblx0XHRcdFx0Ly8gV29ya2Fyb3VuZCBzdGFydHMgaGVyZSEhXG5cdFx0XHRcdGNvbnN0IG9UYWJsZVJvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRpZiAob1RhYmxlUm93QmluZGluZykge1xuXHRcdFx0XHRcdGlmIChNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob1RhYmxlUm93QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdFx0Ly8gYXBwbHkgZm9yIGJvdGggZWRpdCBhbmQgZGlzcGxheSBtb2RlIGluIHN0aWNreVxuXHRcdFx0XHRcdFx0KG9UYWJsZVJvd0JpbmRpbmcgYXMgdW5rbm93biBhcyB7IHJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzOiBGdW5jdGlvbiB9KS5yZW1vdmVDYWNoZXNBbmRNZXNzYWdlcyhcIlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gV29ya2Fyb3VuZCBlbmRzIGhlcmUhIVxuXG5cdFx0XHRcdC8vIENsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHRhYmxlIGFuZCB1cGRhdGUgYWN0aW9uIGVuYWJsZW1lbnQgYWNjb3JkaW5nbHlcblx0XHRcdFx0Ly8gV2lsbCB0byBiZSBmaXhlZCB3aXRoIEJMSTogRklPUklURUNIUDEtMjQzMThcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBvVGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0XHRcdGNvbnN0IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgPSB0YWJsZUFQSSA/IEpTT04ucGFyc2UodGFibGVBUEkudGFibGVEZWZpbml0aW9uLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCkgOiB7fTtcblxuXHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQob0ludGVybmFsTW9kZWxDb250ZXh0LCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBbXSwgXCJ0YWJsZVwiKTtcblxuXHRcdFx0XHRvVGFibGUuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvL1JldHJpZXZlIE9iamVjdCBQYWdlIGhlYWRlciBhY3Rpb25zIGZyb20gT2JqZWN0IFBhZ2UgdGl0bGUgY29udHJvbFxuXHRcdGNvbnN0IG9PYmplY3RQYWdlVGl0bGUgPSBvT2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpIGFzIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGU7XG5cdFx0bGV0IGFJQk5IZWFkZXJBY3Rpb25zOiBVSTVFbGVtZW50W10gPSBbXTtcblx0XHRhSUJOSGVhZGVyQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob09iamVjdFBhZ2VUaXRsZSwgYUlCTkhlYWRlckFjdGlvbnMpO1xuXHRcdGFJQk5BY3Rpb25zID0gYUlCTkFjdGlvbnMuY29uY2F0KGFJQk5IZWFkZXJBY3Rpb25zKTtcblx0XHRDb21tb25VdGlscy51cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eShhSUJOQWN0aW9ucywgdGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0bGV0IG9Nb2RlbDogT0RhdGFNb2RlbCxcblx0XHRcdG9GaW5hbFVJU3RhdGU6IFByb21pc2U8dW5rbm93bj4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdC8vIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYXQgdGhlIGFsbFxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvVGFibGVcblx0XHQgKi9cblx0XHRjb25zdCBoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMgPSAob1RhYmxlOiBUYWJsZSk6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcob1RhYmxlKSxcblx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdFRhYmxlSGVscGVyLmVuYWJsZUZhc3RDcmVhdGlvblJvdyhcblx0XHRcdFx0XHRcdG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLFxuXHRcdFx0XHRcdFx0b0JpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0b0JpbmRpbmcuZ2V0Q29udGV4dCgpLFxuXHRcdFx0XHRcdFx0b01vZGVsLFxuXHRcdFx0XHRcdFx0b0ZpbmFsVUlTdGF0ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH07XG5cblx0XHRcdGlmICghb0JpbmRpbmcpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBFeHBlY3RlZCBiaW5kaW5nIG1pc3NpbmcgZm9yIHRhYmxlOiAke29UYWJsZS5nZXRJZCgpfWApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBmbkhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRpZiAob0JpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMoKTtcblx0XHRcdFx0XHRcdG9CaW5kaW5nLmRldGFjaENoYW5nZShmbkhhbmRsZUNoYW5nZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvQmluZGluZy5hdHRhY2hDaGFuZ2UoZm5IYW5kbGVDaGFuZ2UpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoYmluZGluZ0NvbnRleHQpIHtcblx0XHRcdG9Nb2RlbCA9IGJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCk7XG5cblx0XHRcdC8vIFN0b3JlIG5hdmlnYXRpb24gcGFyYW1ldGVycyBpbiBpbnRlcm5hbCBtb2RlbCBmb3IgYWNjZXNzIGJ5IGNvbnRyb2xsZXIgZXh0ZW5zaW9uc1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcIm5hdmlnYXRpb25QYXJhbWV0ZXJzXCIsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tcHV0ZSBFZGl0IE1vZGVcblx0XHRcdG9GaW5hbFVJU3RhdGUgPSB0aGlzLmVkaXRGbG93LmNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZShiaW5kaW5nQ29udGV4dCk7XG5cblx0XHRcdC8vIHVwZGF0ZSByZWxhdGVkIGFwcHNcblx0XHRcdHRoaXMuX3VwZGF0ZVJlbGF0ZWRBcHBzKCk7XG5cblx0XHRcdC8vQXR0YWNoIHRoZSBwYXRjaCBzZW50IGFuZCBwYXRjaCBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gKGJpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcgJiYgYmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKSB8fCBiaW5kaW5nQ29udGV4dDtcblxuXHRcdFx0Ly8gQXR0YWNoIHRoZSBldmVudCBoYW5kbGVyIG9ubHkgb25jZSB0byB0aGUgc2FtZSBiaW5kaW5nXG5cdFx0XHRpZiAodGhpcy5jdXJyZW50QmluZGluZyAhPT0gb0JpbmRpbmcpIHtcblx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJwYXRjaFNlbnRcIiwge30sIHRoaXMuZWRpdEZsb3cuaGFuZGxlUGF0Y2hTZW50LCB0aGlzKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50QmluZGluZyA9IG9CaW5kaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogVGFibGUpOiB2b2lkIHtcblx0XHRcdFx0Ly8gYWNjZXNzIGJpbmRpbmcgb25seSBhZnRlciB0YWJsZSBpcyBib3VuZFxuXHRcdFx0XHRUYWJsZVV0aWxzLndoZW5Cb3VuZChvVGFibGUpXG5cdFx0XHRcdFx0LnRoZW4oaGFuZGxlVGFibGVNb2RpZmljYXRpb25zKVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgdGFibGUgdG8gYmUgYm91bmRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIGJpbmRpbmcgaXMgcmVhZHkgaGVuY2UgY2FsbGluZyBpdCBpbiBvbkFmdGVyQmluZGluZ1xuXHRcdFx0aWYgKHRoaXMuZ2V0RGlzYWJsZU9iamVjdFBhZ2VSZXF1ZXN0T3B0aW1pemF0aW9uKCkpIHtcblx0XHRcdFx0KG9PYmplY3RQYWdlIGFzIHVua25vd24gYXMgeyBfdHJpZ2dlclZpc2libGVTdWJTZWN0aW9uc0V2ZW50czogRnVuY3Rpb24gfSkuX3RyaWdnZXJWaXNpYmxlU3ViU2VjdGlvbnNFdmVudHMoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9UbyBDb21wdXRlIHRoZSBFZGl0IEJpbmRpbmcgb2YgdGhlIHN1Yk9iamVjdCBwYWdlIHVzaW5nIHJvb3Qgb2JqZWN0IHBhZ2UsIGNyZWF0ZSBhIGNvbnRleHQgZm9yIGRyYWZ0IHJvb3QgYW5kIHVwZGF0ZSB0aGUgZWRpdCBidXR0b24gaW4gc3ViIE9QIHVzaW5nIHRoZSBjb250ZXh0XG5cdFx0XHRBY3Rpb25SdW50aW1lLnVwZGF0ZUVkaXRCdXR0b25WaXNpYmlsaXR5QW5kRW5hYmxlbWVudCh0aGlzLmdldFZpZXcoKSk7XG5cblx0XHRcdHRoaXMuX3VwZGF0ZUF2YWlsYWJsZUNhcmRzKFtdKTtcblx0XHR9XG5cdFx0Ly8gd2UgYXJlIGNsZWFyaW5nIGFueSBwcmV2aW91cyBkYXRhIGZyb20gcmVjb21tZW5kYXRpb25zIGV2ZXJ5IHRpbWUgd2UgY29tZSB0byBuZXcgT1Bcblx0XHQvLyBzbyB0aGF0IGNhY2hlZCByZWNvbW1lbmRhdGlvbnMgYXJlIG5vdCBzaG93biB0byB1c2VyXG5cdFx0aWYgKHZpZXdMZXZlbCAmJiB2aWV3TGV2ZWwgPT09IDEpIHtcblx0XHRcdG9GaW5hbFVJU3RhdGU/LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9ucy5jbGVhclJlY29tbWVuZGF0aW9ucygpO1xuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHR0aGlzLmRpc3BsYXlDb2xsYWJvcmF0aW9uTWVzc2FnZShtUGFyYW1ldGVycz8ucmVkaXJlY3RlZFRvTm9uRHJhZnQpO1xuXHRcdHRoaXMuX3NldE9QTWVzc2FnZVN0cmlwSW50ZXJuYWxDb250ZXh0KCk7XG5cblx0XHRjb25zdCBhcHBseUFwcFN0YXRlID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRBcHBTdGF0ZUhhbmRsZXIoKS5hcHBseUFwcFN0YXRlKHZpZXcpO1xuXHRcdHRoaXMucGFnZVJlYWR5LndhaXRGb3IoYXBwbHlBcHBTdGF0ZSk7XG5cblx0XHR0aGlzLnJlY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzKFxuXHRcdFx0dGhpcy5zdWJTZWN0aW9ucyxcblx0XHRcdG9PYmplY3RQYWdlLFxuXHRcdFx0YXBwbHlBcHBTdGF0ZSxcblx0XHRcdHRoaXMucHJldmlvdXNCaW5kaW5nQ29udGV4dFBhdGggIT09IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKVxuXHRcdCk7XG5cblx0XHQvLyBDYXB0dXJlIHN5bmNocm9ub3VzbHkgdG8gYXZvaWQgcmFjZSB3aXRoIHN1YnNlcXVlbnQgbmF2aWdhdGlvbnNcblx0XHRjb25zdCBwZW5kaW5nVGFyZ2V0Q29udHJvbElkID0gdGhpcy5wZW5kaW5nVGFyZ2V0Q29udHJvbElkO1xuXHRcdHRoaXMucGVuZGluZ1RhcmdldENvbnRyb2xJZCA9IHVuZGVmaW5lZDtcblxuXHRcdHRoaXMuaGFuZGxlUGVuZGluZ1RhcmdldENvbnRyb2xJZE5hdmlnYXRpb24oYXBwbHlBcHBTdGF0ZSwgb09iamVjdFBhZ2UsIHBlbmRpbmdUYXJnZXRDb250cm9sSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgbmF2aWdhdGlvbiB0byBhIHRhcmdldCBzZWN0aW9uIG9yIHN1YnNlY3Rpb24gYWZ0ZXIgYXBwIHN0YXRlIGlzIGFwcGxpZWQuXG5cdCAqIFRoaXMgY29vcmRpbmF0ZXMgdGFyZ2V0Q29udHJvbElkIG5hdmlnYXRpb24gZnJvbSB0d28gc291cmNlczpcblx0ICogLSBJbi1hcHAgbmF2aWdhdGlvbjogcGVuZGluZ1RhcmdldENvbnRyb2xJZCBjYXB0dXJlZCBiZWZvcmUgYXBwbHlBcHBTdGF0ZS5cblx0ICogLSBDcm9zcy1hcHAgbmF2aWdhdGlvbjogeEFwcFN0YXRlIHRhcmdldENvbnRyb2xJZCBzdG9yZWQgYnkgQXBwU3RhdGVIYW5kbGVyIGR1cmluZyBMUiB0byBPUCB0cmFuc2l0aW9uLlxuXHQgKiBAcGFyYW0gYXBwbHlBcHBTdGF0ZSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhcHAgc3RhdGUgaGFzIGJlZW4gYXBwbGllZC5cblx0ICogQHBhcmFtIG9PYmplY3RQYWdlIFRoZSBPYmplY3RQYWdlTGF5b3V0IGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBwZW5kaW5nVGFyZ2V0Q29udHJvbElkIFRoZSB0YXJnZXRDb250cm9sSWQgY2FwdHVyZWQgYmVmb3JlIGFwcGx5QXBwU3RhdGUsIGlmIGFueS5cblx0ICovXG5cdHByaXZhdGUgaGFuZGxlUGVuZGluZ1RhcmdldENvbnRyb2xJZE5hdmlnYXRpb24oXG5cdFx0YXBwbHlBcHBTdGF0ZTogUHJvbWlzZTx2b2lkIHwgb2JqZWN0Pixcblx0XHRvT2JqZWN0UGFnZTogT2JqZWN0UGFnZUxheW91dCxcblx0XHRwZW5kaW5nVGFyZ2V0Q29udHJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWRcblx0KTogdm9pZCB7XG5cdFx0YXBwbHlBcHBTdGF0ZVxuXHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB4QXBwU3RhdGVUYXJnZXRDb250cm9sSWQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldEFwcFN0YXRlSGFuZGxlcigpPy5jb25zdW1lUGVuZGluZ1RhcmdldENvbnRyb2xJZCgpO1xuXHRcdFx0XHRjb25zdCB0YXJnZXRDb250cm9sSWQgPSBwZW5kaW5nVGFyZ2V0Q29udHJvbElkID8/IHhBcHBTdGF0ZVRhcmdldENvbnRyb2xJZDtcblx0XHRcdFx0aWYgKCF0YXJnZXRDb250cm9sSWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gUmVzZXQgc3RhbGUgZmxhZyBzbyBWaWV3U3RhdGUuYXBwbHkoKSBpcyBub3QgYmxvY2tlZCB3aGVuIHRoZSBPUCBpcyByZS1hY3RpdmF0ZWRcblx0XHRcdFx0Ly8gdmlhIHNoZWxsIGtlZXAtYWxpdmUgKGNyb3NzLWFwcCByZS1lbnRyeSkgd2l0aG91dCBfb25CZWZvcmVCaW5kaW5nIGZpcmluZy5cblx0XHRcdFx0Ly8gSW50ZW50aW9uYWwgb3JkZXJpbmc6IHJlc2V0IHRvIGZhbHNlIGhlcmUgYmVmb3JlIHBvbGxGb3JTZWN0aW9uU3RhYmlsaXR5IChiZWxvdykgc2V0cyBpdCBiYWNrXG5cdFx0XHRcdC8vIHRvIHRydWUsIHNvIGFueSBjb25jdXJyZW50IFZpZXdTdGF0ZS5hcHBseSgpIHRyaWdnZXJlZCBvbiByZS1lbnRyeSBpcyB1bmJsb2NrZWQgaW1tZWRpYXRlbHkuXG5cdFx0XHRcdGlmICh4QXBwU3RhdGVUYXJnZXRDb250cm9sSWQpIHtcblx0XHRcdFx0XHR0aGlzLnNraXBWaWV3U3RhdGVTZWN0aW9uUmVzdG9yZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2FpdCBmb3IgdmlzaWJpbGl0eSBiaW5kaW5ncyAgKG5lZWRlZCBmb3IgbGF6eSBsb2FkaW5nIHNjZW5hcmlvcylcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCBQcm9taXNlLmFsbCh0aGlzLndhaXRGb3JWaXNpYmlsaXR5QmluZGluZ3MpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvLyBTb21lIHZpc2liaWxpdHkgYmluZGluZ3MgZmFpbGVkIHRvIHJlc29sdmUsIHByb2NlZWRpbmcgYW55d2F5XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXYWl0IGZvciBwYWdlUmVhZHkgdG8gZW5zdXJlIE9iamVjdFBhZ2UgaXMgZnVsbHkgaW5pdGlhbGl6ZWRcblx0XHRcdFx0YXdhaXQgdGhpcy5wYWdlUmVhZHkud2FpdFBhZ2VSZWFkeSgpO1xuXG5cdFx0XHRcdC8vIE5hdmlnYXRlIHRvIHRhcmdldCBzZWN0aW9uXG5cdFx0XHRcdHRoaXMubmF2aWdhdGVUb1RhcmdldFNlY3Rpb24ob09iamVjdFBhZ2UsIHRhcmdldENvbnRyb2xJZCk7XG5cdFx0XHRcdHJldHVybjsgLy8gUmVxdWlyZWQgYnkgbGludGVyIHJ1bGUgcHJvbWlzZS9hbHdheXMtcmV0dXJuXG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0Ly8gYXBwbHlBcHBTdGF0ZSBmYWlsZWQgLSBza2lwIHRhcmdldENvbnRyb2xJZCBuYXZpZ2F0aW9uXG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOYXZpZ2F0ZXMgdG8gYSB0YXJnZXQgc2VjdGlvbiB3aXRoIGF1dG9tYXRpYyByZS1uYXZpZ2F0aW9uIGlmIFVYIHJ1bGVzIHJlc2V0IHRoZSBzZWxlY3Rpb24uXG5cdCAqIFBvbGxzIHRoZSBzZWN0aW9uIHN0YXRlIHNpbmNlIHNldFNlbGVjdGVkU2VjdGlvbigpIGRvZXNuJ3QgZmlyZSB0aGUgbmF2aWdhdGUgZXZlbnQuXG5cdCAqIEBwYXJhbSBvT2JqZWN0UGFnZSBUaGUgT2JqZWN0UGFnZUxheW91dCBjb250cm9sLlxuXHQgKiBAcGFyYW0gdGFyZ2V0Q29udHJvbElkIFRoZSBsb2NhbCBJRCBvZiB0aGUgdGFyZ2V0IHNlY3Rpb24gb3Igc3Vic2VjdGlvbi5cblx0ICovXG5cdHByaXZhdGUgbmF2aWdhdGVUb1RhcmdldFNlY3Rpb24ob09iamVjdFBhZ2U6IE9iamVjdFBhZ2VMYXlvdXQsIHRhcmdldENvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Ly8gRGV0ZXJtaW5lIHRhcmdldCBzZWN0aW9uIElEIGZvciBjb21wYXJpc29uXG5cdFx0Y29uc3QgdGFyZ2V0Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQodGFyZ2V0Q29udHJvbElkKTtcblx0XHRjb25zdCBpc1NlY3Rpb24gPSB0YXJnZXRDb250cm9sPy5pc0EoXCJzYXAudXhhcC5PYmplY3RQYWdlU2VjdGlvblwiKTtcblx0XHRjb25zdCB0YXJnZXRTZWN0aW9uSWQgPSBpc1NlY3Rpb24gPyB0YXJnZXRDb250cm9sPy5nZXRJZCgpIDogKHRhcmdldENvbnRyb2w/LmdldFBhcmVudCgpIGFzIE9iamVjdFBhZ2VTZWN0aW9uKT8uZ2V0SWQoKTtcblxuXHRcdC8vIE5hdmlnYXRlIGZ1bmN0aW9uIHdpdGggZ3VhcmQgdG8gcHJldmVudCBkdXBsaWNhdGUgY2FsbHMgd2hlbiBhbHJlYWR5IG9uIHRhcmdldFxuXHRcdGNvbnN0IG5hdmlnYXRlVG9UYXJnZXQgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRpZiAob09iamVjdFBhZ2UuZ2V0U2VsZWN0ZWRTZWN0aW9uKCkgPT09IHRhcmdldFNlY3Rpb25JZCkge1xuXHRcdFx0XHRyZXR1cm47IC8vIEFscmVhZHkgb24gdGFyZ2V0IHNlY3Rpb25cblx0XHRcdH1cblx0XHRcdHRoaXMubmF2aWdhdGVXaXRoQ29uZmlybWF0aW9uKHRhcmdldENvbnRyb2xJZCk7XG5cdFx0fTtcblxuXHRcdC8vIE5hdmlnYXRlIGltbWVkaWF0ZWx5XG5cdFx0bmF2aWdhdGVUb1RhcmdldCgpO1xuXG5cdFx0Ly8gU2tpcCBwb2xsaW5nIGlmIGFscmVhZHkgb24gdGFyZ2V0IHNlY3Rpb24gKG5hdmlnYXRpb24gd2FzIG5vLW9wIG9yIHN1Y2NlZWRlZCBpbW1lZGlhdGVseSlcblx0XHRpZiAob09iamVjdFBhZ2UuZ2V0U2VsZWN0ZWRTZWN0aW9uKCkgPT09IHRhcmdldFNlY3Rpb25JZCkge1xuXHRcdFx0dGhpcy5za2lwVmlld1N0YXRlU2VjdGlvblJlc3RvcmUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFBvbGwgdG8gZGV0ZWN0IFVYIHJ1bGVzIHJlc2V0LiBUaGUgZ3VhcmQgb24gaXNOZXdCaW5kaW5nQ29udGV4dCB3YXMgcmVtb3ZlZCBiZWNhdXNlXG5cdFx0Ly8gX2FkanVzdFNlbGVjdGVkU2VjdGlvbkJ5VVhSdWxlcygpIGNhbiBhbHNvIHJlc2V0IHRoZSBzZWN0aW9uIG9uIGNyb3NzLWFwcCByZS1lbnRyeSB0b1xuXHRcdC8vIHRoZSBzYW1lIGVudGl0eSAoc2hlbGwga2VlcC1hbGl2ZSkuIFBvbGxpbmcgaXMgbGlnaHR3ZWlnaHQgKG1heCAxMCDDlyA1MCBtcykgYW5kIHNhZmUgdG9cblx0XHQvLyBydW4gdW5jb25kaXRpb25hbGx5IHdoZW5ldmVyIHdlIG5lZWQgdG8gaG9sZCBhIHRhcmdldCBzZWN0aW9uLlxuXHRcdHBvbGxGb3JTZWN0aW9uU3RhYmlsaXR5KHtcblx0XHRcdGdldFNlbGVjdGVkU2VjdGlvbjogKCkgPT4gb09iamVjdFBhZ2UuZ2V0U2VsZWN0ZWRTZWN0aW9uKCksXG5cdFx0XHR0YXJnZXRTZWN0aW9uSWQsXG5cdFx0XHRvblJlc2V0RGV0ZWN0ZWQ6IG5hdmlnYXRlVG9UYXJnZXRcblx0XHR9KVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnNraXBWaWV3U3RhdGVTZWN0aW9uUmVzdG9yZSA9IHRydWU7XG5cdFx0XHRcdHJldHVybjsgLy8gUmVxdWlyZWQgYnkgbGludGVyIHJ1bGUgcHJvbWlzZS9hbHdheXMtcmV0dXJuXG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0Ly8gUmVxdWlyZWQgYnkgbGludGVyIHJ1bGUgcHJvbWlzZS9jYXRjaC1vci1yZXR1cm4gLSBwb2xsaW5nIGZhaWx1cmVzIGFyZSBub24tY3JpdGljYWxcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGFyZ2V0U3ViU2VjdGlvbiBiYXNlZCBvbiB0aGUgdGFyZ2V0IGNvbnRyb2wgSUQgZm9yIGFwcCBzdGF0ZSBwZXJzaXN0ZW5jZS5cblx0ICogQHBhcmFtIHRhcmdldENvbnRyb2xJZCBUaGUgbG9jYWwgSUQgb2YgdGhlIHRhcmdldCBzZWN0aW9uIG9yIHN1YnNlY3Rpb24uXG5cdCAqL1xuXHRwcml2YXRlIHNldFRhcmdldFN1YlNlY3Rpb24odGFyZ2V0Q29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCB0YXJnZXRDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZCh0YXJnZXRDb250cm9sSWQpO1xuXHRcdGlmICh0YXJnZXRDb250cm9sPy5pc0E8T2JqZWN0UGFnZVN1YlNlY3Rpb24+KFwic2FwLnV4YXAuT2JqZWN0UGFnZVN1YlNlY3Rpb25cIikpIHtcblx0XHRcdHRoaXMudGFyZ2V0U3ViU2VjdGlvbiA9IHRhcmdldENvbnRyb2w7XG5cdFx0fSBlbHNlIGlmICh0YXJnZXRDb250cm9sPy5pc0E8T2JqZWN0UGFnZVNlY3Rpb24+KFwic2FwLnV4YXAuT2JqZWN0UGFnZVNlY3Rpb25cIikpIHtcblx0XHRcdGNvbnN0IHN1YlNlY3Rpb25zID0gdGFyZ2V0Q29udHJvbC5nZXRTdWJTZWN0aW9ucygpO1xuXHRcdFx0dGhpcy50YXJnZXRTdWJTZWN0aW9uID0gc3ViU2VjdGlvbnNbMF07XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRyYWNrcyB0ZWxlbWV0cnkgd2hlbiBhIG5ldyB2YXJpYW50IGlzIHNhdmVkLlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIHNhdmUgZXZlbnQuXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIHRyYWNrVmFyaWFudFNhdmVkVGVsZW1ldHJ5KGV2ZW50OiBVSTVFdmVudDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoZXZlbnQuZ2V0UGFyYW1ldGVyKFwib3ZlcndyaXRlXCIpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICghZXZlbnQuZ2V0U291cmNlKCkuaXNBKFwic2FwLmZlLm1hY3Jvcy5UYWJsZVwiKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoIShhd2FpdCB0aGlzLmdldEFwcENvbXBvbmVudCgpPy5nZXRUZWxlbWV0cnlTZXJ2aWNlKCk/LmlzRW5hYmxlZCgpKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB0YWJsZUFQSSA9IGV2ZW50LmdldFNvdXJjZSgpIGFzIHVua25vd24gYXMgVGFibGVBUEk7XG5cdFx0dGhpcy5maXJlVGVsZW1ldHJ5KHRhYmxlQVBJPy5nZXRDb250ZW50Py4oKT8uZ2V0VmFyaWFudD8uKCk/LmdldFZhcmlhbnRzPy4oKT8ubGVuZ3RoID8/IDAsIFZhcmlhbnRUeXBlLk9CSkVDVF9QQUdFX1RBQkxFKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFja3MgdGVsZW1ldHJ5IHdoZW4gdmFyaWFudHMgYXJlIG1hbmFnZWQgKGUuZy4gZGVsZXRlZCkuXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgbWFuYWdlIGV2ZW50LlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyB0cmFja1ZhcmlhbnRNYW5hZ2VkVGVsZW1ldHJ5KGV2ZW50OiBVSTVFdmVudDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBkZWxldGVkQ291bnQ6IG51bWJlciA9ICgoZXZlbnQuZ2V0UGFyYW1ldGVyKFwiZGVsZXRlZFwiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW10pLmxlbmd0aDtcblx0XHRpZiAoZGVsZXRlZENvdW50ID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICghKGF3YWl0IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk/LmdldFRlbGVtZXRyeVNlcnZpY2UoKT8uaXNFbmFibGVkKCkpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuZmlyZVRlbGVtZXRyeShkZWxldGVkQ291bnQsIFZhcmlhbnRUeXBlLk9CSkVDVF9QQUdFX1RBQkxFKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdG9yZXMgYSBGRS5WYXJpYW50IHRlbGVtZXRyeSBldmVudC5cblx0ICogQHBhcmFtIGNvdW50VmFyaWFudHMgTnVtYmVyIG9mIHZhcmlhbnRzIGFmZmVjdGVkIGJ5IHRoZSBhY3Rpb24uXG5cdCAqIEBwYXJhbSB2YXJpYW50VHlwZSBUaGUgdmFyaWFudCB0eXBlIGRpc2NyaW1pbmF0b3IuXG5cdCAqL1xuXHRwcml2YXRlIGZpcmVUZWxlbWV0cnkoY291bnRWYXJpYW50czogbnVtYmVyLCB2YXJpYW50VHlwZTogVGVsZW1ldHJ5VmFyaWFudEV2ZW50W1wicGFyYW1ldGVyc1wiXVtcInZhcmlhbnRUeXBlXCJdKTogdm9pZCB7XG5cdFx0Y29uc3QgdGVsZW1ldHJ5RXZlbnQ6IFRlbGVtZXRyeVZhcmlhbnRFdmVudCA9IHsgdHlwZTogXCJGRS5WYXJpYW50XCIsIHBhcmFtZXRlcnM6IHsgY291bnRWYXJpYW50cywgdmFyaWFudFR5cGUgfSB9O1xuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk/LmdldFRlbGVtZXRyeVNlcnZpY2UoKT8uc3RvcmVBY3Rpb24odGVsZW1ldHJ5RXZlbnQpO1xuXHR9XG5cblx0cHJpdmF0ZSBuYXZpZ2F0ZVdpdGhDb25maXJtYXRpb24odGFyZ2V0Q29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBTZXQgdGFyZ2V0U3ViU2VjdGlvbiBCRUZPUkUgbmF2aWdhdGlvbiBmb3IgYXBwIHN0YXRlIHNhdmluZy5cblx0XHQvLyBzY3JvbGxUb1NlY3Rpb24oKSBkb2Vzbid0IGZpcmUgdGhlIG5hdmlnYXRlIGV2ZW50LCBzbyBvbk5hdmlnYXRlQ2hhbmdlIHdvbid0IGJlIGNhbGxlZC5cblx0XHR0aGlzLnNldFRhcmdldFN1YlNlY3Rpb24odGFyZ2V0Q29udHJvbElkKTtcblxuXHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkubmF2aWdhdGVUb1N1YlNlY3Rpb24odGFyZ2V0Q29udHJvbElkKTtcblxuXHRcdC8vIFdhaXQgZm9yIEV4dGVuc2lvbkFQSSBwb2xsaW5nIHRvIGNvbXBsZXRlICh+MTAwbXMpIHBsdXMgc2Nyb2xsIHRvIGZpbmlzaFxuXHRcdC8vIGJlZm9yZSB1cGRhdGluZyBhcHAgc3RhdGUgYW5kIHNldHRpbmcgZm9jdXMuXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLnZpZXdTdGF0ZS51cGRhdGVBcHBTdGF0ZURlYm91bmNlZCgpO1xuXG5cdFx0XHQvLyBTZXQgZm9jdXMgaWYgaW4gZWRpdCBtb2RlIChmb3IgaW4tYXBwIG5hdmlnYXRpb24gdG8gc3ViLW9iamVjdCBwYWdlIGluIGVkaXQgbW9kZSlcblx0XHRcdC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc2Nyb2xsVG9TZWN0aW9uKCkgZG9lc24ndCBmaXJlIG9uTmF2aWdhdGVDaGFuZ2UsXG5cdFx0XHQvLyBzbyB3ZSBuZWVkIHRvIG1hbnVhbGx5IHRyaWdnZXIgZm9jdXMgc2V0dGluZyBoZXJlXG5cdFx0XHRjb25zdCBpc0luRWRpdE1vZGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdGlmIChpc0luRWRpdE1vZGUgJiYgdGhpcy50YXJnZXRTdWJTZWN0aW9uKSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShbdGhpcy50YXJnZXRTdWJTZWN0aW9uXSwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0sIDE1MCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVjb25uZWN0IHRoZSB2aXNpYmlsaXR5IG9ic2VydmVycyBvZiBhbGwgRkUgc3Vic2VjdGlvbnMgYWZ0ZXIgdGhlIHN1YnNlY3Rpb24gdmlzaWJpbGl0eSBiaW5kaW5ncyBhcmUgcmVzb2x2ZWQgYW5kIHRoZSBhcHAgc3RhdGUgaXMgYXBwbGllZC5cblx0ICogVGhpcyBmdW5jdGlvbiB3YWl0IGZvciB0aGUgYXBwU2F0ZSB0byBiZSBhcHBsaWVkIGJlZm9yZSByZWNvbm5lY3RpbmcgdGhlIG9ic2VydmVycyBhbmQgdGhlIHNjcm9sbGluZyB0byB0aGUgc2VsZWN0ZWQgc2VjdGlvbiBpZiBpdCBjaGFuZ2VkIGR1cmluZyB0aGUgYXBwU3RhdGUgYXBwbGljYXRpb24uXG5cdCAqIEBwYXJhbSBzdWJTZWN0aW9uSW5mbyBTdWJzZWN0aW9ucyBpbmZvcm1hdGlvbiByZXRyaWV2ZWQgZHVyaW5nIGRpc2Nvbm5lY3Rpb25cblx0ICogQHBhcmFtIG9iamVjdFBhZ2VMYXlvdXQgT2JqZWN0IFBhZ2UgTGF5b3V0IGNvbnRyb2xcblx0ICogQHBhcmFtIHdhaXRGb3JBcHBseUFwcHN0YXRlIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhcHAgc3RhdGUgaXMgYXBwbGllZFxuXHQgKiBAcGFyYW0gd2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byB3YWl0IGZvciB2aXNpYmlsaXR5IGJpbmRpbmdzIHRvIGJlIHJlc29sdmVkIGJlZm9yZSByZWNvbm5lY3Rpbmcgb2JzZXJ2ZXJzXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIG9ic2VydmVycyB3ZXJlIHJlY29ubmVjdGVkLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdGFzeW5jIHJlY29ubmVjdFN1YlNlY3Rpb25WaXNpYmlsaXR5T2JzZXJ2ZXJzKFxuXHRcdHN1YlNlY3Rpb25JbmZvOiB7IGZlOiBTdWJTZWN0aW9uW107IG90aGVyczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSB9IHwgdW5kZWZpbmVkLFxuXHRcdG9iamVjdFBhZ2VMYXlvdXQ6IE9iamVjdFBhZ2VMYXlvdXQsXG5cdFx0d2FpdEZvckFwcGx5QXBwc3RhdGU6IFByb21pc2U8dW5rbm93bj4sXG5cdFx0d2FpdEZvclZpc2liaWxpdHlCaW5kaW5ncyA9IHRydWVcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCF0aGlzLmdldERpc2FibGVPYmplY3RQYWdlUmVxdWVzdE9wdGltaXphdGlvbigpICYmIHN1YlNlY3Rpb25JbmZvKSB7XG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yVmlzaWJpbGl0eUJpbmRpbmdzID8gdGhpcy53YWl0Rm9yVmlzaWJpbGl0eUJpbmRpbmdzIDogW10pXG5cdFx0XHRcdC50aGVuKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRvYmplY3RQYWdlTGF5b3V0LnNldFZpc2libGUodHJ1ZSk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdC8vd2FpdGluZyBmb3IgdGhlIGFwcCBzdGF0ZSB0byBiZSBhcHBsaWVkIGJ0byBlbnN1cmUgZm9jdXNpbmcgb24gdGhlIGNvcnJlY3Qgc2VjdGlvbiBpZiByZXF1aXJlZFxuXHRcdFx0XHRcdFx0YXdhaXQgd2FpdEZvckFwcGx5QXBwc3RhdGU7XG5cdFx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0XHRMb2cud2FybmluZyhcIkVycm9yIHdoaWxlIGFwcGx5aW5nIGFwcCBzdGF0ZVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c3ViU2VjdGlvbkluZm8uZmUuZm9yRWFjaCgoc3ViU2VjdGlvbikgPT4gc3ViU2VjdGlvbi5vYnNlcnZlQ3VycmVudFNlY3Rpb24oKSk7XG5cdFx0XHRcdFx0c3ViU2VjdGlvbkluZm8ub3RoZXJzXG5cdFx0XHRcdFx0XHQuZmlsdGVyKChzdWJzZWN0aW9uKSA9PiBzdWJzZWN0aW9uLmdldFZpc2libGUoKSlcblx0XHRcdFx0XHRcdC5mb3JFYWNoKChzdWJTZWN0aW9uKSA9PiBzdWJTZWN0aW9uLmZpcmVFdmVudChcInN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnRcIiwgeyBzdWJTZWN0aW9uOiBzdWJTZWN0aW9uIH0pKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGFwcGx5aW5nIGFwcCBzdGF0ZVwiLCBlIGFzIHN0cmluZyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgdGhlIGNhcmRzIHdoZW4gdGhlIGJpbmRpbmcgaXMgcmVmcmVzaGVkLlxuXHQgKiBAcGFyYW0gY2FyZHMgQXJyYXkgb2YgY2FyZHMgdG8gYmUgdXBkYXRlZFxuXHQgKi9cblx0YXN5bmMgX3VwZGF0ZUF2YWlsYWJsZUNhcmRzKGNhcmRzOiBXcmFwcGVkQ2FyZFtdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgY29sbGFib3JhdGlvbk1hbmFnZXJTZXJ2aWNlID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRDb2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2UoKTtcblx0XHQvLyBPbmx5IGNvbGxlY3QgY2FyZHMgd2hlbiBjb25zdW1lcnMgYXJlIGNvbm5lY3RlZCB0byB0aGUgY2FyZHMgY2hhbm5lbFxuXHRcdGlmIChjb2xsYWJvcmF0aW9uTWFuYWdlclNlcnZpY2UuaGFzQ29sbGFib3JhdGlvbk1hbmFnZXJDb25uZWN0ZWQoKSkge1xuXHRcdFx0YXdhaXQgdGhpcy5jb2xsYWJvcmF0aW9uTWFuYWdlci5jb2xsZWN0QXZhaWxhYmxlQ2FyZHMoY2FyZHMpO1xuXHRcdFx0aWYgKGNhcmRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29uc3QgY2FyZE9iamVjdCA9IHRoaXMuY29sbGFib3JhdGlvbk1hbmFnZXIudXBkYXRlQ2FyZHMoY2FyZHMpO1xuXHRcdFx0XHRjb25zdCBwYXJlbnRBcHBJZCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0SWQoKTtcblx0XHRcdFx0Y29sbGFib3JhdGlvbk1hbmFnZXJTZXJ2aWNlLmFkZENhcmRzVG9Db2xsYWJvcmF0aW9uTWFuYWdlcihjYXJkT2JqZWN0LCBwYXJlbnRBcHBJZCwgdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKSk7XG5cdFx0XHRcdGNvbGxhYm9yYXRpb25NYW5hZ2VyU2VydmljZS5zaGFyZUF2YWlsYWJsZUNhcmRzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgaW50ZXJuYWwgYmluZGluZyBjb250ZXh0IG9mIHRoZSBNZXNzYWdlc3RyaXAgT1AuXG5cdCAqL1xuXHRfc2V0T1BNZXNzYWdlU3RyaXBJbnRlcm5hbENvbnRleHQoKTogdm9pZCB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBpbnRlcm5hbE1vZGVsQ29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJNZXNzYWdlU3RyaXBcIiwgeyAuLi5pbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0UHJvcGVydHkoXCJNZXNzYWdlU3RyaXBcIikgfSk7XG5cdFx0aWYgKGludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHQob09iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSBhcyB1bmtub3duIGFzIENvbnRyb2wpXG5cdFx0XHRcdD8uZmluZEVsZW1lbnRzKHRydWUsIChlbGVtOiBDb250cm9sKSA9PiBlbGVtLmlzQShcInNhcC5tLk1lc3NhZ2VTdHJpcFwiKSlcblx0XHRcdFx0LmZvckVhY2goKG1lc3NhZ2VTdHJpcDogVUk1RWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdG1lc3NhZ2VTdHJpcC5zZXRCaW5kaW5nQ29udGV4dChcblx0XHRcdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0XG5cdFx0XHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5iaW5kQ29udGV4dCh0aGlzLmdldEV4dGVuc2lvbkFQSSgpLl9nZXRNZXNzYWdlU3RyaXBCaW5kaW5nQ29udGV4dFBhdGgoKSlcblx0XHRcdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpISxcblx0XHRcdFx0XHRcdFwiaW50ZXJuYWxcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Ly8gSWYgdGhlIHZpZXcncyBiaW5kaW5nIGNvbnRleHQgYWxyZWFkeSBoYWQgbWVzc2FnZXMgdGhhdCB3ZXJlIG5vdCBjbGVhcmVkLCB3ZSB3b3VsZCBuZWVkIHRvIHJlLWV2YWx1YXRlIHRvIHNob3cgdGhlIG1lc3NhZ2Ugc3RyaXAuXG5cdFx0XHR0aGlzLl9mblNob3dPUE1lc3NhZ2UoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2hvdyBhIG1lc3NhZ2Ugc3RyaXAgaWYgYSByZWRpcmVjdGlvbiB0byBhIG5vbi1kcmFmdCBlbGVtZW50IGhhcyBiZWVuIGRvbmUuXG5cdCAqIFJlbW92ZSB0aGUgbWVzc2FnZSBzdHJpcCBpbiBjYXNlIHdlIG5hdmlnYXRlIHRvIGFub3RoZXIgb2JqZWN0IHBhZ2UuXG5cdCAqIEBwYXJhbSBlbnRpdHlOYW1lIE5hbWUgb2YgdGhlIEVudGl0eSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIG1lc3NhZ2Vcblx0ICovXG5cdGRpc3BsYXlDb2xsYWJvcmF0aW9uTWVzc2FnZShlbnRpdHlOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cblx0XHRpZiAodGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZSkge1xuXHRcdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKFt0aGlzLmNvbGxhYm9yYXRpb25NZXNzYWdlXSk7XG5cdFx0XHRkZWxldGUgdGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZTtcblx0XHR9XG5cblx0XHRpZiAoZW50aXR5TmFtZSkge1xuXHRcdFx0dGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZSA9IG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0bWVzc2FnZTogcmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlJFUk9VVEVEX05BVklHQVRJT05fVE9fU0FWRURfVkVSU0lPTlwiLCBbZW50aXR5TmFtZV0pLFxuXHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5JbmZvcm1hdGlvbixcblx0XHRcdFx0dGFyZ2V0OiB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpXG5cdFx0XHR9KTtcblx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhbdGhpcy5jb2xsYWJvcmF0aW9uTWVzc2FnZV0pO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25QYWdlUmVhZHkobVBhcmFtZXRlcnM6IHsgZm9yY2VGb2N1czogYm9vbGVhbiB9IHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc2V0Rm9jdXMgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHQvLyBTZXQgdGhlIGZvY3VzIHRvIHRoZSBmaXJzdCBhY3Rpb24gYnV0dG9uLCBvciB0byB0aGUgZmlyc3QgZWRpdGFibGUgaW5wdXQgaWYgaW4gZWRpdGFibGUgbW9kZVxuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0Y29uc3QgaXNJbkRpc3BsYXlNb2RlID0gIUNvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0XHRpZiAoaXNJbkRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSB0aGlzLmdldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZSk7XG5cdFx0XHRcdGlmIChvRmlyc3RDbGlja2FibGVFbGVtZW50KSB7XG5cdFx0XHRcdFx0b0ZpcnN0Q2xpY2thYmxlRWxlbWVudC5mb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRTZWN0aW9uID0gVUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSkgYXMgT2JqZWN0UGFnZVNlY3Rpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChvU2VsZWN0ZWRTZWN0aW9uKSB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlRm9jdXNJbkVkaXRNb2RlKG9TZWxlY3RlZFNlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IGN0eHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdC8vIHNldHRpbmcgdGhpcyBtb2RlbCBkYXRhIHRvIGJlIHVzZWQgZm9yIHJlY29tbWVuZGF0aW9ucyBiaW5kaW5nXG5cdFx0dGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKS5zZXRQcm9wZXJ0eShcIi9jdXJyZW50Q3R4dFwiLCBjdHh0KTtcblxuXHRcdC8vIEFwcGx5IGFwcCBzdGF0ZSBvbmx5IGFmdGVyIHRoZSBwYWdlIGlzIHJlYWR5IHdpdGggdGhlIGZpcnN0IHNlY3Rpb24gc2VsZWN0ZWRcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHQvLyBTaG93IHBvcHVwIHdoaWxlIG5hdmlnYXRpbmcgYmFjayBmcm9tIG9iamVjdCBwYWdlIGluIGNhc2Ugb2YgZHJhZnQgKGluY2wuIGhpZGRlbiBkcmFmdCkuXG5cdFx0Ly8gU3RpY2t5J3Mgc2hlbGwgYmFjayBpcyByZWdpc3RlcmVkIGNlbnRyYWxseSBmcm9tIEVkaXRGbG93LnJlZ2lzdGVyRWRpdExpZmVjeWNsZUNhbGxiYWNrcy5cblx0XHRpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRjb25zdCBpc0RyYWZ0U3VwcG9ydGVkID0gTW9kZWxIZWxwZXIuaXNEcmFmdFN1cHBvcnRlZChvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgb0JpbmRpbmdDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRpZiAoaXNEcmFmdFN1cHBvcnRlZCkge1xuXHRcdFx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KG9WaWV3KTtcblx0XHRcdFx0YXdhaXQgb0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKCkgPT4gdGhpcy5lZGl0Rmxvdy5vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdChvQmluZGluZ0NvbnRleHQpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gZG8gbm90IHJlcXVlc3QgcmVjb21tZW5kYXRpb25zIGFjdGlvbiBpZiB3ZSBhcmUgaW4gRGlzcGxheSBtb2RlXG5cdFx0Y29uc3QgaXNFZGl0YWJsZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXHRcdGlmIChpc0VkaXRhYmxlICYmIG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0YXdhaXQgdGhpcy5yZWNvbW1lbmRhdGlvbnMuZmV0Y2hBbmRBcHBseVJlY29tbWVuZGF0aW9ucyhbeyBjb250ZXh0OiBvQmluZGluZ0NvbnRleHQgfV0pO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycz8uZm9yY2VGb2N1cykge1xuXHRcdFx0c2V0Rm9jdXMoKTtcblx0XHR9XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIiwgZmFsc2UpO1xuXHRcdHRoaXMuX2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24oKTtcblxuXHRcdC8vVGhlIGZvbGxvd2luZyBjb2RpbmcgaXMgZG9uZSB0byBtZXJnZSBhbiBvcGVuIFBBVENIIGFuZCB0aGUgZHJhZnRwcmVwYXJlL2RyYWZ0YWN0aXZhdGVcblx0XHQvL3JlcXVlc3QgaW50byBvbmUgJGJhdGNoIHJlcXVlc3Rcblx0XHQvL1RvIGFjaGlldmUgdGhpcyB0aGUgJGF1dG8gcXVldWUgaXMgbG9ja2VkIGF0IHRoZSBtb3VzZWRvd24gZXZlbnQgKGJlZm9yZSBmb2N1c291dCkgaW5cblx0XHQvL29yZGVyIHRvIHdhaXQgZm9yIHRoZSBkcmFmdCByZXF1ZXN0IGlzc3VlZCBpbiB0aGUgc2F2ZSBidXR0b25zIHByZXNzIGV2ZW50IGhhbmRsZXIuXG5cdFx0Ly9UaGUgcXVldWUgaXMgcmVsZWFzZWQgYWdhaW4gZHVyaW5nIG1vdXNldXAgKGJlZm9yZSBwcmVzcykuXG5cdFx0Ly9UaGlzIGlzIG9ubHkgcG9zc2libGUgb24gbm9uIHRvdWNoIGRldmljZXMgYmVjYXVzZSBvbiB0b3VjaCBkZXZpY2VzIHRoZSBmb2N1c291dCBhbmQgcHJlc3Ncblx0XHQvL2V2ZW50cyBhcmUgYm90aCBpbml0aWF0ZWQgYXQgdG91Y2hlbmQgYnkgc2FwLm0uQnV0dG9uLlxuXHRcdC8vbW91c2VIYW5kbGVyU2V0IGlzIHVzZWQgdG8gZW5zdXJlcyB0aGF0IHRoZSBldmVudCBoYW5kbGVycyBhcmUgYXR0YWNoZWQgb25seSBvbmUgdGltZS5cblx0XHQvL1RoZXJlIGNhbiBiZSBtdWx0aXBsZSBvblBhZ2VSZWFkeSBlLmcuIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZWRpdC9kaXNwbGF5IG1vZGVcblx0XHRpZiAoIXRoaXMubWVyZ2VQYXRjaERyYWZ0ICYmICFEZXZpY2Uuc3VwcG9ydC50b3VjaCkge1xuXHRcdFx0Y29uc3Qgc2F2ZUJ1dHRvbiA9IG9WaWV3LmJ5SWQoXCJmZTo6Rm9vdGVyQmFyOjpTdGFuZGFyZEFjdGlvbjo6U2F2ZVwiKSBhcyBCdXR0b247XG5cdFx0XHRjb25zdCBhdXRvUXVldWVVbmxvY2sgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmF1dG9RdWV1ZUxvY2s/LmlzTG9ja2VkKCkpIHtcblx0XHRcdFx0XHR0aGlzLmF1dG9RdWV1ZUxvY2sudW5sb2NrKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2F2ZUJ1dHRvbi5kZXRhY2hCcm93c2VyRXZlbnQoXCJtb3VzZXVwXCIsIGF1dG9RdWV1ZVVubG9jayk7XG5cdFx0XHRcdHNhdmVCdXR0b24uZGV0YWNoQnJvd3NlckV2ZW50KFwiYmx1clwiLCBhdXRvUXVldWVVbmxvY2spO1xuXHRcdFx0fTtcblxuXHRcdFx0c2F2ZUJ1dHRvbj8uYXR0YWNoQnJvd3NlckV2ZW50KFwibW91c2Vkb3duXCIsICgpOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLmF1dG9RdWV1ZUxvY2s/LmlzTG9ja2VkKCkpIHtcblx0XHRcdFx0XHR0aGlzLmF1dG9RdWV1ZUxvY2sgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLmxvY2soXCIkYXV0b1wiKTtcblx0XHRcdFx0XHQvL3doZW4gdGhlIG1vdXNlIGlzIGRyYWdnZWQgYXdheSBmcm9tIHRoZSBzYXZlIGJ1dHRvbiB3aGlsZSBwcmVzc2VkIHRoZW4gdGhlcmUgd2lsbCBiZSBub1xuXHRcdFx0XHRcdC8vbW91c2V1cCBldmVudCBvbiB0aGUgc2F2ZSBidXR0b24uIFRoZXJlZm9yZSwgdGhlIHVubG9ja2luZyBpcyBkb25lIG9uIFwibW91c2V1cFwiIGFuZCBcImJsdXJcIlxuXHRcdFx0XHRcdHNhdmVCdXR0b24uYXR0YWNoQnJvd3NlckV2ZW50KFwibW91c2V1cFwiLCBhdXRvUXVldWVVbmxvY2spO1xuXHRcdFx0XHRcdHNhdmVCdXR0b24uYXR0YWNoQnJvd3NlckV2ZW50KFwiYmx1clwiLCBhdXRvUXVldWVVbmxvY2spO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5tZXJnZVBhdGNoRHJhZnQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBGQ0wgQ2xvc2UgYnV0dG9uIHdoaWxlIGEga2V5IHByb3BlcnR5IGZpZWxkIGhhcyBmb2N1cyxcblx0XHQvLyB0aGUgZmllbGQncyBmb2N1cy1sb3NzIHRyaWdnZXJzIHNpZGUgZWZmZWN0cyB0aGF0IHJlZnJlc2ggdGhlIE9EYXRhIGJpbmRpbmcgYW5kXG5cdFx0Ly8gcmUtcmVuZGVyIHRoZSBPYmplY3RQYWdlIGhlYWRlciB0aXRsZSDigJQgcmVtb3ZpbmcgdGhlIENsb3NlIGJ1dHRvbiBmcm9tIHRoZSBET01cblx0XHQvLyBiZWZvcmUgdGhlIGNsaWNrIGV2ZW50IGZpcmVzLCBzbyB0aGUgcHJlc3MgaXMgc2lsZW50bHkgbG9zdC5cblx0XHQvLyBMaXN0ZW5pbmcgb24gbW91c2Vkb3duICh3aGljaCBmaXJlcyBiZWZvcmUgZm9jdXMtbG9zcykgZW5zdXJlcyBjbG9zZUNvbHVtbigpIGlzXG5cdFx0Ly8gYWx3YXlzIGNhbGxlZCByZWdhcmRsZXNzIG9mIHRoZSBzdWJzZXF1ZW50IHJlLXJlbmRlci5cblx0XHRpZiAoIXRoaXMuZmNsQ2xvc2VIYW5kbGVyU2V0ICYmICFEZXZpY2Uuc3VwcG9ydC50b3VjaCkge1xuXHRcdFx0Y29uc3QgZmNsQ2xvc2VCdXR0b24gPSBvVmlldy5ieUlkKFwiZmU6OkZDTFN0YW5kYXJkQWN0aW9uOjpDbG9zZVwiKTtcblx0XHRcdGlmIChmY2xDbG9zZUJ1dHRvbj8uaXNBPEJ1dHRvbj4oXCJzYXAubS5CdXR0b25cIikpIHtcblx0XHRcdFx0ZmNsQ2xvc2VCdXR0b24uYXR0YWNoQnJvd3NlckV2ZW50KFwibW91c2Vkb3duXCIsICgpOiB2b2lkID0+IHtcblx0XHRcdFx0XHR0aGlzLl9yb3V0aW5nLmNsb3NlQ29sdW1uKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5mY2xDbG9zZUhhbmRsZXJTZXQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHN0YXR1cyBvZiBlZGl0IG1vZGUgZm9yIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcmV0dXJucyBUaGUgc3RhdHVzIG9mIGVkaXQgbW9kZSBmb3Igc3RpY2t5IHNlc3Npb25cblx0ICovXG5cdGdldFN0aWNreUVkaXRNb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0ICYmIHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0bGV0IGJJc1N0aWNreUVkaXRNb2RlID0gZmFsc2U7XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRpZiAoYklzU3RpY2t5TW9kZSkge1xuXHRcdFx0XHRiSXNTdGlja3lFZGl0TW9kZSA9IENvbW1vblV0aWxzLmdldElzRWRpdGFibGUodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYklzU3RpY2t5RWRpdE1vZGU7XG5cdH1cblxuXHRfZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTogT2JqZWN0UGFnZUxheW91dCB7XG5cdFx0cmV0dXJuIHRoaXMuYnlJZChcImZlOjpPYmplY3RQYWdlXCIpIGFzIE9iamVjdFBhZ2VMYXlvdXQ7XG5cdH1cblxuXHRhc3luYyBfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24oKTogUHJvbWlzZTx7IHRpdGxlOiBzdHJpbmc7IHN1YnRpdGxlOiBzdHJpbmc7IGludGVudDogc3RyaW5nOyBpY29uOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfT4ge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZVN1YnRpdGxlID0gb09iamVjdFBhZ2UuZ2V0Q3VzdG9tRGF0YSgpLmZpbmQoZnVuY3Rpb24gKG9DdXN0b21EYXRhKSB7XG5cdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwiT2JqZWN0UGFnZVN1YnRpdGxlXCI7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2VEZXNjcmlwdGlvbiA9IG9PYmplY3RQYWdlLmdldEN1c3RvbURhdGEoKS5maW5kKGZ1bmN0aW9uIChvQ3VzdG9tRGF0YSkge1xuXHRcdFx0cmV0dXJuIG9DdXN0b21EYXRhLmdldEtleSgpID09PSBcIk9iamVjdFBhZ2VEZXNjcmlwdGlvblwiO1xuXHRcdH0pO1xuXHRcdGNvbnN0IGV4dHJhY3RQYXRocyA9IChiaW5kaW5nSW5mbz86IHsgcGFydHM/OiB7IHBhdGg/OiBzdHJpbmc7IG1vZGVsPzogc3RyaW5nIH1bXSB9KTogc3RyaW5nW10gPT5cblx0XHRcdEFycmF5LmZyb20oXG5cdFx0XHRcdG5ldyBTZXQoXG5cdFx0XHRcdFx0KGJpbmRpbmdJbmZvPy5wYXJ0cyB8fCBbXSlcblx0XHRcdFx0XHRcdC5maWx0ZXIoKHBhcnQpID0+ICFwYXJ0Lm1vZGVsKVxuXHRcdFx0XHRcdFx0Lm1hcCgocGFydCkgPT4gcGFydC5wYXRoIHx8IFwiXCIpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKEJvb2xlYW4pXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0Y29uc3Qgc3VidGl0bGVQYXRocyA9IGV4dHJhY3RQYXRocyhvT2JqZWN0UGFnZVN1YnRpdGxlPy5nZXRCaW5kaW5nSW5mbyhcInZhbHVlXCIpKTtcblx0XHRjb25zdCBkZXNjcmlwdGlvblBhdGhzID0gZXh0cmFjdFBhdGhzKG9PYmplY3RQYWdlRGVzY3JpcHRpb24/LmdldEJpbmRpbmdJbmZvKFwidmFsdWVcIikpO1xuXHRcdGNvbnN0IHBhdGhzVG9SZXNvbHZlID0gWy4uLnN1YnRpdGxlUGF0aHMsIC4uLmRlc2NyaXB0aW9uUGF0aHNdO1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gYXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGNvbnN0IGZuQ2xlYXJDYWNoZVRpdGxlID0gKCk6IHZvaWQgPT4ge1xuXHRcdFx0cm9vdFZpZXdDb250cm9sbGVyLmludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlKG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKSBhcyBzdHJpbmcpO1xuXHRcdH07XG5cdFx0aWYgKChvT2JqZWN0UGFnZURlc2NyaXB0aW9uIHx8IG9PYmplY3RQYWdlU3VidGl0bGUpICYmICF0aGlzLmludmFsaWRhdGVUaXRsZUhpZXJhcmNoeUNhY2hlU2V0VXApIHtcblx0XHRcdG9PYmplY3RQYWdlU3VidGl0bGU/LmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uYXR0YWNoQ2hhbmdlKGZuQ2xlYXJDYWNoZVRpdGxlLCB0aGlzKTtcblx0XHRcdG9PYmplY3RQYWdlRGVzY3JpcHRpb24/LmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uYXR0YWNoQ2hhbmdlKGZuQ2xlYXJDYWNoZVRpdGxlLCB0aGlzKTtcblx0XHRcdHRoaXMuaW52YWxpZGF0ZVRpdGxlSGllcmFyY2h5Q2FjaGVTZXRVcCA9IHRydWU7XG5cdFx0fVxuXHRcdGNvbnN0IG9PYmplY3RQYWdlQ29udGV4dCA9IG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgYnVpbGQgPSAoKTogeyB0aXRsZTogc3RyaW5nOyBzdWJ0aXRsZTogc3RyaW5nOyBpbnRlbnQ6IHN0cmluZzsgaWNvbjogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0gPT4gKHtcblx0XHRcdHRpdGxlOiBvT2JqZWN0UGFnZS5kYXRhKFwiT2JqZWN0UGFnZVRpdGxlXCIpID8/IFwiXCIsXG5cdFx0XHRzdWJ0aXRsZTogb09iamVjdFBhZ2VTdWJ0aXRsZT8uZ2V0VmFsdWUoKSA/PyBcIlwiLFxuXHRcdFx0aW50ZW50OiBcIlwiLFxuXHRcdFx0aWNvbjogXCJcIixcblx0XHRcdGRlc2NyaXB0aW9uOiBvT2JqZWN0UGFnZURlc2NyaXB0aW9uPy5nZXRWYWx1ZSgpID8/IFwiXCJcblx0XHR9KTtcblx0XHQvL2lmIG5vIGNvbnRleHQgb3Igbm90aGluZyB0byByZXNvbHZlLCBkaXJlY3QgcmV0dXJuXG5cdFx0aWYgKCFvT2JqZWN0UGFnZUNvbnRleHQgfHwgcGF0aHNUb1Jlc29sdmUubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJ1aWxkKCkpO1xuXHRcdH1cblx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHBhdGhzVG9SZXNvbHZlLm1hcChhc3luYyAocCkgPT4gKG9PYmplY3RQYWdlQ29udGV4dCBhcyBPRGF0YVY0Q29udGV4dCkucmVxdWVzdFByb3BlcnR5KHApLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpXG5cdFx0KTtcblx0XHRyZXR1cm4gYnVpbGQoKTtcblx0fVxuXG5cdF9leGVjdXRlVGFiU2hvcnRDdXQob0V4ZWN1dGlvbjogVUk1RXZlbnQpOiB2b2lkIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCksXG5cdFx0XHRhU2VjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLFxuXHRcdFx0aVNlY3Rpb25JbmRleE1heCA9IGFTZWN0aW9ucy5sZW5ndGggLSAxLFxuXHRcdFx0c0NvbW1hbmQgPSAob0V4ZWN1dGlvbi5nZXRTb3VyY2UoKSBhcyB1bmtub3duIGFzIENvbW1hbmRFeGVjdXRpb24pLmdldENvbW1hbmQoKTtcblx0XHRsZXQgbmV3U2VjdGlvbixcblx0XHRcdGlTZWxlY3RlZFNlY3Rpb25JbmRleCA9IG9PYmplY3RQYWdlLmluZGV4T2ZTZWN0aW9uKHRoaXMuYnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSEpIGFzIE9iamVjdFBhZ2VTZWN0aW9uKTtcblx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4ICE9PSAtMSAmJiBpU2VjdGlvbkluZGV4TWF4ID4gMCkge1xuXHRcdFx0aWYgKHNDb21tYW5kID09PSBcIk5leHRUYWJcIikge1xuXHRcdFx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4IDw9IGlTZWN0aW9uSW5kZXhNYXggLSAxKSB7XG5cdFx0XHRcdFx0bmV3U2VjdGlvbiA9IGFTZWN0aW9uc1srK2lTZWxlY3RlZFNlY3Rpb25JbmRleF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4ICE9PSAwKSB7XG5cdFx0XHRcdC8vIFByZXZpb3VzVGFiXG5cdFx0XHRcdG5ld1NlY3Rpb24gPSBhU2VjdGlvbnNbLS1pU2VsZWN0ZWRTZWN0aW9uSW5kZXhdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3U2VjdGlvbikge1xuXHRcdFx0XHRvT2JqZWN0UGFnZS5zZXRTZWxlY3RlZFNlY3Rpb24obmV3U2VjdGlvbik7XG5cdFx0XHRcdG5ld1NlY3Rpb24uZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZ2V0Rm9vdGVyVmlzaWJpbGl0eSgpOiB2b2lkIHtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiLCBmYWxzZSk7XG5cdFx0Y29uc3QgaXNIaWRkZW5EcmFmdEVuYWJsZWQgPSAodGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpLmdldENhcGFiaWxpdGllcygpLkhpZGRlbkRyYWZ0IGFzIEhpZGRlbkRyYWZ0KVxuXHRcdFx0Py5lbmFibGVkO1xuXHRcdE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKVxuXHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBNZXNzYWdlKTogdm9pZCB7XG5cdFx0XHRcdGNvbnN0IGlzRXJyb3JNZXNzYWdlID0gb01lc3NhZ2UudmFsaWRhdGlvbiAmJiBvTWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiRXJyb3JcIjtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZVZhbGlkYXRpb24gPSBpc0hpZGRlbkRyYWZ0RW5hYmxlZFxuXHRcdFx0XHRcdD8gaXNFcnJvck1lc3NhZ2Vcblx0XHRcdFx0XHQ6IGlzRXJyb3JNZXNzYWdlICYmIG9NZXNzYWdlLmdldFRhcmdldHMoKS5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcyhzVmlld0lkKSk7XG5cdFx0XHRcdGlmIChtZXNzYWdlVmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm1lc3NhZ2VGb290ZXJDb250YWluc0Vycm9yc1wiLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHRfc2hvd01lc3NhZ2VQb3BvdmVyKCk6IHZvaWQge1xuXHRcdGNvbnN0IGlzRWRpdE1vZGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKTtcblx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGNvbnN0IGN1cnJlbnRQYWdlVmlldyA9IHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0PyByb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0VmlldygpXG5cdFx0XHQ6ICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RDb250YWluZXIoKSBhcyBOYXZDb250YWluZXIpLmdldEN1cnJlbnRQYWdlKCk7XG5cdFx0aWYgKGlzRWRpdE1vZGUgJiYgIWN1cnJlbnRQYWdlVmlldy5pc0EoXCJzYXAubS5NZXNzYWdlUGFnZVwiKSkge1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VCdXR0b24gPSB0aGlzLm1lc3NhZ2VCdXR0b24sXG5cdFx0XHRcdG9NZXNzYWdlUG9wb3ZlciA9IG9NZXNzYWdlQnV0dG9uLm9NZXNzYWdlUG9wb3Zlcixcblx0XHRcdFx0b0l0ZW1CaW5kaW5nID0gb01lc3NhZ2VQb3BvdmVyLmdldEJpbmRpbmcoXCJpdGVtc1wiKSBhcyBMaXN0QmluZGluZztcblxuXHRcdFx0aWYgKG9JdGVtQmluZGluZy5nZXRMZW5ndGgoKSA+IDAgJiYgIW9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0XHRvTWVzc2FnZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHQvLyB3b3JrYXJvdW5kIHRvIGVuc3VyZSB0aGF0IG9NZXNzYWdlQnV0dG9uIGlzIHJlbmRlcmVkIHdoZW4gb3BlbkJ5IGlzIGNhbGxlZFxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvTWVzc2FnZVBvcG92ZXIub3BlbkJ5KG9NZXNzYWdlQnV0dG9uKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgX2VkaXREb2N1bWVudCgpOiBQcm9taXNlPHZvaWQgfCBDb250ZXh0PiB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIik7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Nb2RlbCk7XG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuZWRpdERvY3VtZW50LmFwcGx5KHRoaXMuZWRpdEZsb3csIFtvQ29udGV4dF0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sob01vZGVsKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNlbWFudGljIG9iamVjdCBtYXBwaW5nIG9iamVjdC5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgdmFsdWUgb2YgdGhlIGRhdGEgcG9pbnQgcHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0gc2VtYW50aWNPYmplY3QgVGhlIHNlbWFudGljIG9iamVjdFxuXHQgKiBAcmV0dXJucyBUaGUgYXJyYXkgb2YgdGhlIGRlZmF1bHQgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmcgb2JqZWN0XG5cdCAqL1xuXHRfZ2V0SW1wbGljaXRTZW1hbnRpY09iamVjdE1hcHBpbmdGb3JEYXRhUG9pbnRzKFxuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRcdHNlbWFudGljT2JqZWN0OiBzdHJpbmdcblx0KTogTWV0YU1vZGVsVHlwZTxTZW1hbnRpY09iamVjdE1hcHBpbmdUeXBlPltdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRMb2NhbFByb3BlcnR5OiB7XG5cdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogcHJvcGVydHlQYXRoXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFNlbWFudGljT2JqZWN0UHJvcGVydHk6IHNlbWFudGljT2JqZWN0XG5cdFx0XHR9XG5cdFx0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZG9jdW1lbnRcblx0ICogT25lIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBpcyB0cmlnZ2VyZWQgb24gdGhlIGRyYWZ0IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50OlxuXHQgKiAtIG9uIGEgdHJhbnNpZW50IGNvbnRleHQ6XG5cdCAqIC0gaWYgdGhlIGNvbnRleHQgZ2V0cyBkYXRhLCB3YWl0IGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbnRleHQgYW5kIGV4ZWN1dGUgdGhlIGdsb2JhbCB2YWxpZGF0aW9uXG5cdCAqIC0gaWYgbm8gZGF0YSBpcyBmb3VuZCBvbiB0aGlzIGNvbnRleHQsIG9ubHkgdGhlIHByZXBhcmVBY3Rpb24gaXMgcmVxdWVzdGVkXG5cdCAqIC0gb24gYSByZWd1bGFyIGNvbnRleHQsIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBpcyByZXF1ZXN0ZWQuXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugb2YgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIG9yIHVuZGVmaW5lZCBpZiBub3QgZXhlY3V0ZWRcblx0ICovXG5cdGFzeW5jIF92YWxpZGF0ZURvY3VtZW50KCk6IFByb21pc2U8dm9pZCB8IHVua25vd25bXSB8IE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0XHRjb25zdCBjb250cm9sID0gVUk1RWxlbWVudC5nZXRBY3RpdmVFbGVtZW50KCkgYXMgQ29udHJvbDtcblx0XHRjb25zdCBjb250ZXh0ID0gY29udHJvbD8uZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdGlmICghY29udHJvbCB8fCAhY29udGV4dCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0bGV0IGJ5UGFzc1NpZGVFZmZlY3RzID0gZmFsc2U7XG5cdFx0aWYgKGNvbnRleHQuaXNUcmFuc2llbnQoKSkge1xuXHRcdFx0aWYgKGNvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRhd2FpdCBjb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ5UGFzc1NpZGVFZmZlY3RzID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5tZXNzYWdlSGFuZGxlci5ob2xkTWVzc2FnZXNGb3JDb250cm9sKGNvbnRyb2wpO1xuXHRcdGNvbnN0IHJldCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdsb2JhbFZhbGlkYXRpb24oY29udGV4dCwgYnlQYXNzU2lkZUVmZmVjdHMpO1xuXHRcdHRoaXMubWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgY29udHJvbCB9KTtcblx0XHRyZXR1cm4gcmV0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBvZiB0aGUgZHJhZnRcblx0ICogT25lIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBpcyB0cmlnZ2VyZWQgb24gdGhlIGRyYWZ0IHZlcnNpb24gb2YgdGhlIGRvY3VtZW50OlxuXHQgKiAtIHRoZSBnbG9iYWwgc2lkZSBlZmZlY3RzIGFyZSBleGVjdXRlZCBpZiB0aGVzZSBzaWRlIGVmZmVjdHMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbnRleHRcblx0ICogLSB0aGUgZHJhZnQgVmFsaWRhdGlvbiBvbiB0aGUgRHJhZnRSb290IGNvbnRleHQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0XG5cdCAqIEBwYXJhbSBieVBhc3NTaWRlRWZmZWN0cyBPbmx5IHRoZSBkcmFmdCBWYWxpZGF0aW9uIHN0ZXAgaXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSBvZiB0aGUgZ2xvYmFsIHZhbGlkYXRpb25cblx0ICovXG5cdGFzeW5jIGV4ZWN1dGVHbG9iYWxWYWxpZGF0aW9uKGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LCBieVBhc3NTaWRlRWZmZWN0cyA9IGZhbHNlKTogUHJvbWlzZTx2b2lkIHwgdW5rbm93bltdIHwgT0RhdGFDb250ZXh0QmluZGluZz4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Ly8gdGhlIGRyYWZ0IHZhbGlkYXRpb24gaXMgdHJlYXRlZCBhcyBhIHVzZXIgaW50ZXJhY3Rpb24sIGFuZCB0aGUgc2VydmljZSBtdXN0IHJldHVybiB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFnYWluIGlmIHN0aWxsIHZhbGlkXG5cdFx0dGhpcy5tZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRpZiAoIWJ5UGFzc1NpZGVFZmZlY3RzKSB7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c1NlcnZpY2UgPSBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gc2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdGNvbnN0IGdsb2JhbFNpZGVFZmZlY3RzID0gZW50aXR5VHlwZSA/IHNpZGVFZmZlY3RzU2VydmljZS5nZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGUpIDogW107XG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZ2xvYmFsIFNpZGVFZmZlY3RzIGZvciB0aGUgcmVsYXRlZCBlbnRpdHksIGV4ZWN1dGUgaXQvdGhlbVxuXHRcdFx0aWYgKGdsb2JhbFNpZGVFZmZlY3RzLmxlbmd0aCkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmVkaXRGbG93LnN5bmNUYXNrKCk7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChnbG9iYWxTaWRlRWZmZWN0cy5tYXAoYXN5bmMgKHNpZGVFZmZlY3RzKSA9PiB0aGlzLnNpZGVFZmZlY3RzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cywgY29udGV4dCkpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBkcmFmdFJvb3RDb250ZXh0ID0gKGF3YWl0IENvbW1vblV0aWxzLmNyZWF0ZVJvb3RDb250ZXh0KFxuXHRcdFx0UHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCxcblx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0YXBwQ29tcG9uZW50XG5cdFx0KSkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0Ly9FeGVjdXRlIHRoZSBkcmFmdFZhbGlkYXRpb24gaWYgdGhlcmUgaXMgbm8gZ2xvYmFsU2lkZUVmZmVjdHMgKGlnbm9yZSBFVGFncyBpbiBjb2xsYWJvcmF0aW9uIGRyYWZ0KVxuXHRcdGlmIChkcmFmdFJvb3RDb250ZXh0KSB7XG5cdFx0XHRhd2FpdCB0aGlzLmVkaXRGbG93LnN5bmNUYXNrKCk7XG5cdFx0XHRyZXR1cm4gZHJhZnQuZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbihkcmFmdFJvb3RDb250ZXh0LCBhcHBDb21wb25lbnQsIHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZHJhZnQgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnRcblx0ICogSWYgZGF0YSBoYXMgYmVlbiBwcm92aWRlZCBvbiB0aGUgY3JlYXRpb24gcm93cywgdGhlIHJlbGF0ZWQgZG9jdW1lbnRzIGFyZSBjcmVhdGVkXG5cdCAqIGJlZm9yZSBzYXZpbmcgdGhlIGRyYWZ0IHZlcnNpb24uXG5cdCAqIEBwYXJhbSBza2lwQmluZGluZ1RvVmlldyBJbmRpY2F0ZXMgaWYgdGhlIGJpbmRpbmcgdG8gdGhlIHZpZXcgc2hvdWxkIGJlIHNraXBwZWRcblx0ICogQHBhcmFtIHVzZVNhdmVBbmRMZWF2ZSBJbmRpY2F0ZXMgaWYgdGhlIHNhdmUgaXMgdHJpZ2dlcmVkIGZyb20gYSBzYXZlIGFuZCBsZWF2ZSBhY3Rpb25cblx0ICogQHJldHVybnMgUHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgX3NhdmVEb2N1bWVudChza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW4sIHVzZVNhdmVBbmRMZWF2ZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBtb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIiksXG5cdFx0XHRhd2FpdENyZWF0ZURvY3VtZW50czogUHJvbWlzZTx2b2lkIHwgT0RhdGFMaXN0QmluZGluZz5bXSA9IFtdO1xuXHRcdC8vIGluZGljYXRlcyBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgcm93IGluIHRoZSBPUFxuXHRcdGxldCBleGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gZmFsc2U7XG5cdFx0bGV0IG1lc3NhZ2VQb3BvdmVyRXJyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG1vZGVsKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29sbGFib3JhdGlvbkVuYWJsZWQoKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGRpYWxvZ0FjdGlvbiA9IGF3YWl0IG5ldyBDb2xsYWJvcmF0aW9uRGlzY2FyZCh0aGlzLmdldFZpZXcoKSwgdHJ1ZSkuZ2V0VXNlckFjdGlvbigpO1xuXHRcdFx0XHRcdC8vIFdlIGNhbmNlbCB0aGUgYWN0aW9uXG5cdFx0XHRcdFx0aWYgKGRpYWxvZ0FjdGlvbiA9PT0gXCJjYW5jZWxcIikge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBXZSBrZWVwIHRoZSBkcmFmdCBhbmQgbGVhdmUgZm9yIExSXG5cdFx0XHRcdFx0aWYgKGRpYWxvZ0FjdGlvbiA9PT0gXCJrZWVwRHJhZnRcIikge1xuXHRcdFx0XHRcdFx0dGhpcy5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihgU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCBjb2xsYWJvcmF0aW9uIGRpc2NhcmQ6ICR7ZXJyfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc3luY1Rhc2soKTtcblx0XHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5mb3JFYWNoKCh0YWJsZTogVGFibGUpID0+IHtcblx0XHRcdFx0Y29uc3QgY3JlYXRpb25Sb3cgPSB0YWJsZS5nZXRDcmVhdGlvblJvdygpO1xuXHRcdFx0XHRjb25zdCB0YWJsZUJpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcodGFibGUpO1xuXG5cdFx0XHRcdGNvbnN0IGNvbnRleHRLZXlzID0gT2JqZWN0LmtleXMoKGNyZWF0aW9uUm93Py5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkKT8uZ2V0T2JqZWN0KCkgfHwge30pO1xuXHRcdFx0XHRpZiAoY29udGV4dEtleXMuZmlsdGVyKChrZXkpID0+ICFrZXkuc3RhcnRzV2l0aChcIkAkdWk1LlwiKSkubGVuZ3RoKSB7XG5cdFx0XHRcdFx0ZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IHRydWU7XG5cdFx0XHRcdFx0YXdhaXRDcmVhdGVEb2N1bWVudHMucHVzaChcblx0XHRcdFx0XHRcdHRoaXMuZWRpdEZsb3dcblx0XHRcdFx0XHRcdFx0LmNyZWF0ZURvY3VtZW50KHRhYmxlQmluZGluZywge1xuXHRcdFx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogdGFibGUuZGF0YShcImNyZWF0aW9uTW9kZVwiKSxcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGlvblJvdzogY3JlYXRpb25Sb3csXG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6XG5cdFx0XHRcdFx0XHRcdFx0XHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCh0YWJsZS5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSkuZ2V0QWdncmVnYXRpb24oXCJjcmVhdGlvbk1vZGVcIikgYXMgVGFibGVDcmVhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHRcdCk/LmdldFByb3BlcnR5KFwiY3JlYXRlQXRFbmRcIikgPT09IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiB0cnVlIC8vIHRoZSBza2lwU2lkZUVmZmVjdHMgaXMgYSBwYXJhbWV0ZXIgY3JlYXRlZCB3aGVuIHdlIGNsaWNrIHRoZSBzYXZlIGtleS4gSWYgd2UgcHJlc3MgdGhpcyBrZXksIHdlIGRvbid0IGV4ZWN1dGUgdGhlIGhhbmRsZVNpZGVFZmZlY3RzIGZ1bmNpdG9uIHRvIGF2b2lkIGJhdGNoIHJlZHVuZGFuY3lcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LnRoZW4oKCkgPT4gdGFibGVCaW5kaW5nKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0bGV0IGlzU3RhbmRhcmRTYXZlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKHNraXBCaW5kaW5nVG9WaWV3ICYmIHR5cGVvZiBza2lwQmluZGluZ1RvVmlldyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRjb25zdCBjb21tYW5kID0gKHNraXBCaW5kaW5nVG9WaWV3IGFzIENvbW1hbmRFeGVjdXRpb24kRXhlY3V0ZUV2ZW50KT8uZ2V0U291cmNlPy4oKT8uZ2V0Q29tbWFuZD8uKCk7XG5cdFx0XHRcdGlzU3RhbmRhcmRTYXZlID0gY29tbWFuZCA9PT0gXCJTYXZlXCI7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBiaW5kaW5ncyA9IGF3YWl0IFByb21pc2UuYWxsKGF3YWl0Q3JlYXRlRG9jdW1lbnRzKTtcblx0XHRcdC8vIFdlIG5lZWQgdG8gZWl0aGVyIHJlamVjdCBvciByZXNvbHZlIGEgcHJvbWlzZSBoZXJlIGFuZCByZXR1cm4gaXQgc2luY2UgdGhpcyBzYXZlXG5cdFx0XHQvLyBmdW5jdGlvbiBpcyBub3Qgb25seSBjYWxsZWQgd2hlbiBwcmVzc2luZyB0aGUgc2F2ZSBidXR0b24gaW4gdGhlIGZvb3RlciwgYnV0IGFsc29cblx0XHRcdC8vIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBjcmVhdGUgb3Igc2F2ZSBpbiBhIGRhdGFsb3NzIHBvcHVwLlxuXHRcdFx0Ly8gVGhlIGxvZ2ljIG9mIHRoZSBkYXRhbG9zcyBwb3B1cCBuZWVkcyB0byBkZXRlY3QgaWYgdGhlIHNhdmUgaGFkIGVycm9ycyBvciBub3QgaW4gb3JkZXJcblx0XHRcdC8vIHRvIGRlY2lkZSBpZiB0aGUgc3Vic2VxdWVudCBhY3Rpb24gLSBsaWtlIGEgYmFjayBuYXZpZ2F0aW9uIC0gaGFzIHRvIGJlIGV4ZWN1dGVkIG9yIG5vdC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc2F2ZURvY3VtZW50KGNvbnRleHQsIHtcblx0XHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogZXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0XHRiaW5kaW5nczogYmluZGluZ3MgYXMgdW5rbm93biBhcyBPRGF0YUxpc3RCaW5kaW5nW10sXG5cdFx0XHRcdFx0bWVyZ2VQYXRjaERyYWZ0OiB0aGlzLm1lcmdlUGF0Y2hEcmFmdCxcblx0XHRcdFx0XHRza2lwQmluZGluZ1RvVmlldyxcblx0XHRcdFx0XHRpc1N0YW5kYXJkU2F2ZSxcblx0XHRcdFx0XHR1c2VTYXZlQW5kTGVhdmVcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHQvLyBJZiB0aGUgc2F2ZURvY3VtZW50IGluIGVkaXRGbG93IHJldHVybnMgZXJyb3JzIHdlIG5lZWRcblx0XHRcdFx0Ly8gdG8gc2hvdyB0aGUgbWVzc2FnZSBwb3BvdmVyIGhlcmUgYW5kIGVuc3VyZSB0aGF0IHRoZVxuXHRcdFx0XHQvLyBkYXRhbG9zcyBsb2dpYyBkb2VzIG5vdCBwZXJmb3JtIHRoZSBmb2xsb3cgdXAgZnVuY3Rpb25cblx0XHRcdFx0Ly8gbGlrZSBlLmcuIGEgYmFjayBuYXZpZ2F0aW9uIGhlbmNlIHdlIHJldHVybiBhIHByb21pc2UgYW5kIHJlamVjdCBpdFxuXHRcdFx0XHRpZiAoZXJyb3IgIT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0XHRtZXNzYWdlUG9wb3ZlckVyciA9IChlcnJvciBhcyBzdHJpbmcpID8/IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG1vZGVsKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhtb2RlbCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobWVzc2FnZVBvcG92ZXJFcnIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAobWVzc2FnZVBvcG92ZXJFcnIubGVuZ3RoKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKG1lc3NhZ2VQb3BvdmVyRXJyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9zaG93TWVzc2FnZVBvcG92ZXIoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRhc3luYyBfY2FuY2VsRG9jdW1lbnQobVBhcmFtZXRlcnM6IHsgY2FuY2VsQnV0dG9uOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGV4dCB8IHZvaWQ+IHtcblx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgY2FuY2VsQnV0dG9uID0gdGhpcy5nZXRWaWV3KCkuYnlJZChtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24pIGFzIEJ1dHRvbiB8IHVuZGVmaW5lZDsgLy90byBnZXQgdGhlIHJlZmVyZW5jZSBvZiB0aGUgY2FuY2VsIGJ1dHRvbiBmcm9tIGNvbW1hbmQgZXhlY3V0aW9uXG5cdFx0Y29uc3QgbGFzdEZvY3VzZWRDb250cm9sSWQgPSBVSTVFbGVtZW50LmdldEFjdGl2ZUVsZW1lbnQoKT8uZ2V0SWQoKTtcblx0XHRsZXQgc2hvdWxkU2tpcERpc2NhcmRQb3BvdmVyID0gZmFsc2U7XG5cdFx0aWYgKHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29sbGFib3JhdGlvbkVuYWJsZWQoKSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgZGlhbG9nQWN0aW9uID0gYXdhaXQgbmV3IENvbGxhYm9yYXRpb25EaXNjYXJkKHRoaXMuZ2V0VmlldygpLCBmYWxzZSkuZ2V0VXNlckFjdGlvbigpO1xuXHRcdFx0XHQvLyBXZSBjYW5jZWwgdGhlIGFjdGlvblxuXHRcdFx0XHRpZiAoZGlhbG9nQWN0aW9uID09PSBcImNhbmNlbFwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFdlIGtlZXAgdGhlIGRyYWZ0IGFuZCBsZWF2ZSBmb3IgTFJcblx0XHRcdFx0aWYgKGRpYWxvZ0FjdGlvbiA9PT0gXCJrZWVwRHJhZnRcIikge1xuXHRcdFx0XHRcdHRoaXMuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KGNvbnRleHQpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBXZSBoYXZlIGRpc3BsYXllZCB0aGUgZGlhbG9nIGFuZCB0aGUgdXNlciBjb25maXJtZWQgdGhlIGRpc2NhcmQgLT4gV2Ugc2tpcCB0aGUgZGlzY2FyZCBjb25maXJtYXRpb25cblx0XHRcdFx0aWYgKGRpYWxvZ0FjdGlvbiA9PT0gXCJkaXNjYXJkQ29uZmlybWVkXCIpIHtcblx0XHRcdFx0XHRzaG91bGRTa2lwRGlzY2FyZFBvcG92ZXIgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGdldCBjb2xsYWJvcmF0aXZlIHVzZXJzXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBpc0RvY3VtZW50TW9kaWZpZWQgPVxuXHRcdFx0ISF0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCkgfHxcblx0XHRcdCghdGhpcy5nZXRTdGlja3lFZGl0TW9kZSgpICYmIGNvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlKTtcblx0XHRjb25zdCBhZnRlckNhbmNlbDogRnVuY3Rpb24gPSAocHJvbWlzZVJlc3VsdDogT0RhdGFWNENvbnRleHQpID0+IHtcblx0XHRcdC8vIGZvY3VzIGlzIHJldGFpbmVkIG9uIHRoZSBsYXN0IGZvY3VzZWQgZWxlbWVudFxuXHRcdFx0aWYgKGxhc3RGb2N1c2VkQ29udHJvbElkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0VUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZChsYXN0Rm9jdXNlZENvbnRyb2xJZCk/LmZvY3VzKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcHJvbWlzZVJlc3VsdDtcblx0XHR9O1xuXHRcdGlmIChcblx0XHRcdCh0aGlzLmdldEFwcENvbXBvbmVudCgpPy5nZXRFbnZpcm9ubWVudENhcGFiaWxpdGllcygpPy5nZXRDYXBhYmlsaXRpZXMoKT8uSGlkZGVuRHJhZnQgYXMgSGlkZGVuRHJhZnQpPy5lbmFibGVkICYmXG5cdFx0XHRpc0RvY3VtZW50TW9kaWZpZWRcblx0XHQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0YWZ0ZXJDYW5jZWwsXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0Y29udGV4dCxcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGRyYWZ0Lk5hdmlnYXRpb25UeXBlLkJhY2tOYXZpZ2F0aW9uLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lZGl0Rmxvd1xuXHRcdFx0LmNhbmNlbERvY3VtZW50KGNvbnRleHQsIHsgY29udHJvbDogY2FuY2VsQnV0dG9uLCBza2lwRGlzY2FyZFBvcG92ZXI6IHNob3VsZFNraXBEaXNjYXJkUG9wb3ZlciB9KVxuXHRcdFx0LnRoZW4oKHByb21pc2VSZXN1bHQpID0+IHtcblx0XHRcdFx0cmV0dXJuIGFmdGVyQ2FuY2VsKHByb21pc2VSZXN1bHQpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRhc3luYyBfYXBwbHlEb2N1bWVudChvQ29udGV4dDogT0RhdGFWNENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5lZGl0Rmxvdy5hcHBseURvY3VtZW50KG9Db250ZXh0KS5jYXRjaCgoKSA9PiB7XG5cdFx0XHR0aGlzLl9zaG93TWVzc2FnZVBvcG92ZXIoKTtcblx0XHRcdHJldHVybjtcblx0XHR9KTtcblx0fVxuXG5cdF91cGRhdGVSZWxhdGVkQXBwcygpOiB2b2lkIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0Y29uc3Qgc2hvd1JlbGF0ZWRBcHBzID0gb09iamVjdFBhZ2UuZGF0YShcInNob3dSZWxhdGVkQXBwc1wiKTtcblx0XHRpZiAoc2hvd1JlbGF0ZWRBcHBzID09PSBcInRydWVcIiB8fCBzaG93UmVsYXRlZEFwcHMgPT09IHRydWUpIHtcblx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRDb21tb25VdGlscy51cGRhdGVSZWxhdGVkQXBwc0RldGFpbHMob09iamVjdFBhZ2UsIGFwcENvbXBvbmVudCk7XG5cdFx0fVxuXHR9XG5cblx0X2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uKGFQYXJlbnRFbGVtZW50OiBDb250cm9sW10sIGFTdWJzZWN0aW9uOiBPYmplY3RQYWdlU3ViU2VjdGlvbiwgYUNvbnRyb2xzOiBDb250cm9sW10sIGJJc0NoYXJ0PzogYm9vbGVhbik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgaXRlbTEgb2YgYVBhcmVudEVsZW1lbnQpIHtcblx0XHRcdGxldCBvRWxlbWVudCA9IChpdGVtMSBhcyBNYWNyb0FQSSkuZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gKGl0ZW0xIGFzIE1hY3JvQVBJKS5nZXRDb250ZW50KCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoYklzQ2hhcnQpIHtcblx0XHRcdFx0aWYgKG9FbGVtZW50Py5nZXRBZ2dyZWdhdGlvbihcIml0ZW1zXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbXMgPSBvRWxlbWVudC5nZXRBZ2dyZWdhdGlvbihcIml0ZW1zXCIpIGFzIENvbnRyb2xbXTtcblx0XHRcdFx0XHRpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtOiBDb250cm9sKSB7XG5cdFx0XHRcdFx0XHRpZiAoaXRlbS5pc0E8Q2hhcnRCbG9jaz4oXCJzYXAuZmUubWFjcm9zLkNoYXJ0XCIpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoYXJ0Q29udHJvbCA9IGl0ZW0uZ2V0Q2hhcnRDb250cm9sKCk7XG5cdFx0XHRcdFx0XHRcdGFDb250cm9scy5wdXNoKGNoYXJ0Q29udHJvbCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBPER5bmFtaWNTaWRlQ29udGVudD4oXCJzYXAudWkubGF5b3V0LkR5bmFtaWNTaWRlQ29udGVudFwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IG9TdWJFbGVtZW50ID0gb0VsZW1lbnQuZ2V0TWFpbkNvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IG9FbGVtZW50LmdldE1haW5Db250ZW50KCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0aWYgKG9TdWJFbGVtZW50ICYmIG9TdWJFbGVtZW50Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdG9FbGVtZW50ID0gb1N1YkVsZW1lbnRbMF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFRoZSB0YWJsZSBtYXkgY3VycmVudGx5IGJlIHNob3duIGluIGEgZnVsbCBzY3JlZW4gZGlhbG9nLCB3ZSBjYW4gdGhlbiBnZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgVGFibGVBUElcblx0XHRcdFx0Ly8gY29udHJvbCBmcm9tIHRoZSBjdXN0b20gZGF0YSBvZiB0aGUgcGxhY2UgaG9sZGVyIHBhbmVsXG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLm0uUGFuZWxcIikgJiYgb0VsZW1lbnQuZGF0YShcIkZ1bGxTY3JlZW5UYWJsZVBsYWNlSG9sZGVyXCIpKSB7XG5cdFx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudC5kYXRhKFwidGFibGVBUElyZWZlcmVuY2VcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0E8VGFibGVBUEk+KFwic2FwLmZlLm1hY3Jvcy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdGNvbnN0IG9TdWJFbGVtZW50ID0gb0VsZW1lbnQuZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gb0VsZW1lbnQuZ2V0Q29udGVudCgpIDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGlmIChvU3ViRWxlbWVudCAmJiBvU3ViRWxlbWVudC5pc0EgJiYgb1N1YkVsZW1lbnQuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRcdGFDb250cm9scy5wdXNoKG9TdWJFbGVtZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZ2V0QWxsU3ViU2VjdGlvbnMoKTogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdGxldCBhU3ViU2VjdGlvbnM6IE9iamVjdFBhZ2VTdWJTZWN0aW9uW10gPSBbXTtcblx0XHRvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikge1xuXHRcdFx0YVN1YlNlY3Rpb25zID0gYVN1YlNlY3Rpb25zLmNvbmNhdChvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gYVN1YlNlY3Rpb25zO1xuXHR9XG5cblx0X2dldEFsbEJsb2NrcygpOiBFbmhhbmNlV2l0aFVJNTxTdWJTZWN0aW9uQmxvY2s+W10ge1xuXHRcdGxldCBhQmxvY2tzOiBFbmhhbmNlV2l0aFVJNTxTdWJTZWN0aW9uQmxvY2s+W10gPSBbXTtcblx0XHR0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TdWJTZWN0aW9uOiBPYmplY3RQYWdlU3ViU2VjdGlvbikge1xuXHRcdFx0YUJsb2NrcyA9IGFCbG9ja3MuY29uY2F0KG9TdWJTZWN0aW9uLmdldEJsb2NrcygpIGFzIEVuaGFuY2VXaXRoVUk1PFN1YlNlY3Rpb25CbG9jaz5bXSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFCbG9ja3M7XG5cdH1cblxuXHRfZmluZFRhYmxlcygpOiBUYWJsZVtdIHtcblx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSB0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpO1xuXHRcdGNvbnN0IGFUYWJsZXM6IFRhYmxlW10gPSBbXTtcblx0XHRmb3IgKGxldCBzdWJTZWN0aW9uID0gMDsgc3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IHN1YlNlY3Rpb24rKykge1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldEJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFUYWJsZXMpO1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldE1vcmVCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhVGFibGVzKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFUYWJsZXM7XG5cdH1cblxuXHRfZmluZENoYXJ0cygpOiBDaGFydFtdIHtcblx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSB0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpO1xuXHRcdGNvbnN0IGFDaGFydHM6IENoYXJ0W10gPSBbXTtcblx0XHRmb3IgKGxldCBzdWJTZWN0aW9uID0gMDsgc3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IHN1YlNlY3Rpb24rKykge1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldEJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFDaGFydHMsIHRydWUpO1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldE1vcmVCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhQ2hhcnRzLCB0cnVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFDaGFydHM7XG5cdH1cblxuXHRfY2xvc2VTaWRlQ29udGVudCgpOiB2b2lkIHtcblx0XHR0aGlzLl9nZXRBbGxCbG9ja3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChvQmxvY2s6IEVuaGFuY2VXaXRoVUk1PFN1YlNlY3Rpb25CbG9jaz4pOiB2b2lkIHtcblx0XHRcdGNvbnN0IG9Db250ZW50ID0gb0Jsb2NrLmdldENvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvQmxvY2suZ2V0Q29udGVudCgpO1xuXHRcdFx0aWYgKG9Db250ZW50ICYmIG9Db250ZW50LmlzQSAmJiBvQ29udGVudC5pc0E8RHluYW1pY1NpZGVDb250ZW50PihcInNhcC51aS5sYXlvdXQuRHluYW1pY1NpZGVDb250ZW50XCIpKSB7XG5cdFx0XHRcdGlmIChvQ29udGVudC5zZXRTaG93U2lkZUNvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHRcdFx0XHRcdG9Db250ZW50LnNldFNob3dTaWRlQ29udGVudChmYWxzZSwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhcnQgQ29udGV4dCBpcyByZXNvbHZlZCBmb3IgMTpuIG1pY3JvY2hhcnRzLlxuXHQgKiBAcGFyYW0gb0NoYXJ0Q29udGV4dCBUaGUgQ29udGV4dCBvZiB0aGUgTWljcm9DaGFydFxuXHQgKiBAcGFyYW0gc0NoYXJ0UGF0aCBUaGUgY29sbGVjdGlvblBhdGggb2YgdGhlIHRoZSBjaGFydFxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBBdHRyaWJ1dGVzIG9mIHRoZSBjaGFydCBDb250ZXh0XG5cdCAqL1xuXHRfZ2V0Q2hhcnRDb250ZXh0RGF0YShvQ2hhcnRDb250ZXh0OiBDb250ZXh0LCBzQ2hhcnRQYXRoOiBzdHJpbmcpOiB1bmtub3duW10ge1xuXHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9DaGFydENvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IG9DaGFydENvbnRleHREYXRhID0gW29Db250ZXh0RGF0YV07XG5cdFx0aWYgKG9DaGFydENvbnRleHQgJiYgc0NoYXJ0UGF0aCkge1xuXHRcdFx0aWYgKG9Db250ZXh0RGF0YVtzQ2hhcnRQYXRoXSkge1xuXHRcdFx0XHRvQ2hhcnRDb250ZXh0RGF0YSA9IG9Db250ZXh0RGF0YVtzQ2hhcnRQYXRoXTtcblx0XHRcdFx0ZGVsZXRlIG9Db250ZXh0RGF0YVtzQ2hhcnRQYXRoXTtcblx0XHRcdFx0b0NoYXJ0Q29udGV4dERhdGEucHVzaChvQ29udGV4dERhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb0NoYXJ0Q29udGV4dERhdGE7XG5cdH1cblxuXHQvKipcblx0ICogU2Nyb2xsIHRoZSB0YWJsZXMgdG8gdGhlIHJvdyB3aXRoIHRoZSBzUGF0aFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1Jvd1BhdGggJ3NQYXRoIG9mIHRoZSB0YWJsZSByb3cnXG5cdCAqL1xuXG5cdF9zY3JvbGxUYWJsZXNUb1JvdyhzUm93UGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX2ZpbmRUYWJsZXMgJiYgdGhpcy5fZmluZFRhYmxlcygpLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCk7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgYVRhYmxlcykge1xuXHRcdFx0XHRUYWJsZVNjcm9sbGVyLnNjcm9sbFRhYmxlVG9Sb3coaXRlbSwgc1Jvd1BhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gbWVyZ2Ugc2VsZWN0ZWQgY29udGV4dHMgYW5kIGZpbHRlcnMuXG5cdCAqIEBwYXJhbSBvUGFnZUNvbnRleHQgUGFnZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBhTGluZUNvbnRleHQgU2VsZWN0ZWQgQ29udGV4dHNcblx0ICogQHBhcmFtIHNDaGFydFBhdGggQ29sbGVjdGlvbiBuYW1lIG9mIHRoZSBjaGFydFxuXHQgKiBAcmV0dXJucyBTZWxlY3Rpb24gVmFyaWFudCBPYmplY3Rcblx0ICovXG5cdF9tZXJnZU11bHRpcGxlQ29udGV4dHMoXG5cdFx0b1BhZ2VDb250ZXh0OiBDb250ZXh0LFxuXHRcdGFMaW5lQ29udGV4dDogT0RhdGFWNENvbnRleHRbXSxcblx0XHRzQ2hhcnRQYXRoOiBzdHJpbmdcblx0KTogeyBzZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50OyBhdHRyaWJ1dGVzOiB1bmtub3duW10gfSB7XG5cdFx0bGV0IGFBdHRyaWJ1dGVzOiB1bmtub3duW10gPSBbXSxcblx0XHRcdGFQYWdlQXR0cmlidXRlcyA9IFtdLFxuXHRcdFx0b0NvbnRleHQsXG5cdFx0XHRzTWV0YVBhdGhMaW5lOiBzdHJpbmcsXG5cdFx0XHRzUGF0aExpbmU7XG5cblx0XHRjb25zdCBzUGFnZVBhdGggPSBvUGFnZUNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvUGFnZUNvbnRleHQgJiYgb1BhZ2VDb250ZXh0LmdldE1vZGVsKCkgJiYgb1BhZ2VDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgc01ldGFQYXRoUGFnZSA9IG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGFnZVBhdGgpLnJlcGxhY2UoL15cXC8qLywgXCJcIik7XG5cblx0XHQvLyBHZXQgc2luZ2xlIGxpbmUgY29udGV4dCBpZiBuZWNlc3Nhcnlcblx0XHRpZiAoYUxpbmVDb250ZXh0ICYmIGFMaW5lQ29udGV4dC5sZW5ndGgpIHtcblx0XHRcdG9Db250ZXh0ID0gYUxpbmVDb250ZXh0WzBdO1xuXHRcdFx0c1BhdGhMaW5lID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0c01ldGFQYXRoTGluZSA9IG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aExpbmUpLnJlcGxhY2UoL15cXC8qLywgXCJcIik7XG5cblx0XHRcdGFMaW5lQ29udGV4dC5mb3JFYWNoKChvU2luZ2xlQ29udGV4dDogT0RhdGFWNENvbnRleHQpOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKHNDaGFydFBhdGgpIHtcblx0XHRcdFx0XHRjb25zdCBvQ2hhcnRDb250ZXh0RGF0YSA9IHRoaXMuX2dldENoYXJ0Q29udGV4dERhdGEob1NpbmdsZUNvbnRleHQsIHNDaGFydFBhdGgpO1xuXHRcdFx0XHRcdGlmIChvQ2hhcnRDb250ZXh0RGF0YSkge1xuXHRcdFx0XHRcdFx0YUF0dHJpYnV0ZXMgPSBvQ2hhcnRDb250ZXh0RGF0YS5tYXAoZnVuY3Rpb24gKG9TdWJDaGFydENvbnRleHREYXRhOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dERhdGE6IG9TdWJDaGFydENvbnRleHREYXRhLFxuXHRcdFx0XHRcdFx0XHRcdGVudGl0eVNldDogYCR7c01ldGFQYXRoUGFnZX0vJHtzQ2hhcnRQYXRofWBcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhQXR0cmlidXRlcy5wdXNoKHtcblx0XHRcdFx0XHRcdGNvbnRleHREYXRhOiBvU2luZ2xlQ29udGV4dC5nZXRPYmplY3QoKSxcblx0XHRcdFx0XHRcdGVudGl0eVNldDogc01ldGFQYXRoTGluZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0YVBhZ2VBdHRyaWJ1dGVzLnB1c2goe1xuXHRcdFx0Y29udGV4dERhdGE6IG9QYWdlQ29udGV4dC5nZXRPYmplY3QoKSxcblx0XHRcdGVudGl0eVNldDogc01ldGFQYXRoUGFnZVxuXHRcdH0pO1xuXHRcdC8vIEFkZGluZyBQYWdlIENvbnRleHQgdG8gc2VsZWN0aW9uIHZhcmlhbnRcblx0XHRhUGFnZUF0dHJpYnV0ZXMgPSB0aGlzLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ucmVtb3ZlU2Vuc2l0aXZlRGF0YShhUGFnZUF0dHJpYnV0ZXMsIHNNZXRhUGF0aFBhZ2UpO1xuXHRcdGNvbnN0IG9QYWdlTGV2ZWxTViA9IENvbW1vblV0aWxzLmFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50KG5ldyBTZWxlY3Rpb25WYXJpYW50KCksIGFQYWdlQXR0cmlidXRlcywgdGhpcy5nZXRWaWV3KCkpO1xuXHRcdGFBdHRyaWJ1dGVzID0gdGhpcy5faW50ZW50QmFzZWROYXZpZ2F0aW9uLnJlbW92ZVNlbnNpdGl2ZURhdGEoYUF0dHJpYnV0ZXMsIHNNZXRhUGF0aFBhZ2UpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50OiBvUGFnZUxldmVsU1YsXG5cdFx0XHRhdHRyaWJ1dGVzOiBhQXR0cmlidXRlc1xuXHRcdH07XG5cdH1cblxuXHRfZ2V0QmF0Y2hHcm91cHNGb3JWaWV3KCk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBvVmlld0RhdGEgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLFxuXHRcdFx0b0NvbmZpZ3VyYXRpb25zID0gb1ZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRcdFx0YUNvbmZpZ3VyYXRpb25zID0gb0NvbmZpZ3VyYXRpb25zICYmIE9iamVjdC5rZXlzKG9Db25maWd1cmF0aW9ucyksXG5cdFx0XHRhQmF0Y2hHcm91cHMgPSBbXCIkYXV0by5IZXJvZXNcIiwgXCIkYXV0by5EZWNvcmF0aW9uXCIsIFwiJGF1dG8uV29ya2Vyc1wiXTtcblxuXHRcdGlmIChhQ29uZmlndXJhdGlvbnMgJiYgYUNvbmZpZ3VyYXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdGFDb25maWd1cmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0XHRcdGNvbnN0IG9Db25maWd1cmF0aW9uID0gb0NvbmZpZ3VyYXRpb25zW3NLZXldIGFzIE1pY3JvQ2hhcnRNYW5pZmVzdENvbmZpZ3VyYXRpb247XG5cdFx0XHRcdGlmIChvQ29uZmlndXJhdGlvbi5yZXF1ZXN0R3JvdXBJZCA9PT0gXCJMb25nUnVubmVyc1wiKSB7XG5cdFx0XHRcdFx0YUJhdGNoR3JvdXBzLnB1c2goXCIkYXV0by5Mb25nUnVubmVyc1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBhQmF0Y2hHcm91cHM7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGluaXRpYWxpemUgcGFnaW5hdGlvbi5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiBvYmplY3QgcGFnZVxuXHQgKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBJbnRlcm5hbCBtb2RlbFxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgUGFyZW50IGxpc3QgYmluZGluZyB0byB1c2Vcblx0ICovXG5cdF9pbml0aWFsaXplUGFnaW5hdGlvbihjb250ZXh0OiBPRGF0YVY0Q29udGV4dCwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBsaXN0QmluZGluZz86IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRpZiAodmlld0xldmVsID4gMSkge1xuXHRcdFx0Y29uc3QgcGFnaW5hdG9yQ3VycmVudENvbnRleHQgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIpO1xuXHRcdFx0aWYgKHBhZ2luYXRvckN1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdUb1VzZSA9IHBhZ2luYXRvckN1cnJlbnRDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZShiaW5kaW5nVG9Vc2UsIHBhZ2luYXRvckN1cnJlbnRDb250ZXh0KTtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblx0XHRcdH0gZWxzZSBpZiAobGlzdEJpbmRpbmcpIHtcblx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZShsaXN0QmluZGluZywgY29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24oKTogdm9pZCB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IG9EYXRhUG9pbnRzID0gQ29tbW9uVXRpbHMuZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKFxuXHRcdFx0b1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRPdXRib3VuZHMoKVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1NoZWxsU2VydmljZXMgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFNoZWxsU2VydmljZXMoKTtcblx0XHRjb25zdCBvUGFnZUNvbnRleHQgPSBvVmlldyAmJiBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImlzSGVhZGVyRFBMaW5rVmlzaWJsZVwiLCB7fSk7XG5cdFx0aWYgKG9QYWdlQ29udGV4dCkge1xuXHRcdFx0b1BhZ2VDb250ZXh0XG5cdFx0XHRcdC5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9EYXRhOiBvYmplY3QpIHtcblx0XHRcdFx0XHRyZXR1cm4gZm5HZXRMaW5rcyhvRGF0YVBvaW50cywgb0RhdGEpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgbGlua3MgZnJvbSB0aGUgc2hlbGwgc2VydmljZVwiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIG9FcnJvclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZuT25FcnJvcihvRXJyb3I6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0TG9nLmVycm9yKG9FcnJvcik7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZm5TZXRMaW5rRW5hYmxlbWVudChpZDogc3RyaW5nLCBhU3VwcG9ydGVkTGlua3M6IHsgc3VwcG9ydGVkPzogYm9vbGVhbiB9W10pOiB2b2lkIHtcblx0XHRcdGNvbnN0IHNMaW5rSWQgPSBpZDtcblx0XHRcdC8vIHByb2Nlc3MgdmlhYmxlIGxpbmtzIGZyb20gZ2V0TGlua3MgZm9yIGFsbCBkYXRhcG9pbnRzIGhhdmluZyBvdXRib3VuZFxuXHRcdFx0aWYgKGFTdXBwb3J0ZWRMaW5rcyAmJiBhU3VwcG9ydGVkTGlua3MubGVuZ3RoID09PSAxICYmIGFTdXBwb3J0ZWRMaW5rc1swXS5zdXBwb3J0ZWQpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBpc0hlYWRlckRQTGlua1Zpc2libGUvJHtzTGlua0lkfWAsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvU3ViRGF0YVBvaW50c1xuXHRcdCAqIEBwYXJhbSBvUGFnZURhdGFcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBmbkdldExpbmtzKFxuXHRcdFx0b1N1YkRhdGFQb2ludHM6IFJlY29yZDxcblx0XHRcdFx0c3RyaW5nLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IHN0cmluZztcblx0XHRcdFx0XHRhY3Rpb246IHN0cmluZztcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IE1ldGFNb2RlbFR5cGU8U2VtYW50aWNPYmplY3RNYXBwaW5nVHlwZT5bXTtcblx0XHRcdFx0fVxuXHRcdFx0Pixcblx0XHRcdG9QYWdlRGF0YTogb2JqZWN0XG5cdFx0KTogdm9pZCB7XG5cdFx0XHRmb3IgKGNvbnN0IHNJZCBpbiBvU3ViRGF0YVBvaW50cykge1xuXHRcdFx0XHRjb25zdCBvRGF0YVBvaW50ID0gb1N1YkRhdGFQb2ludHNbc0lkXTtcblx0XHRcdFx0Y29uc3Qgb1BhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0XHRcdFx0Y29uc3Qgb0xpbmsgPSBvVmlldy5ieUlkKHNJZCk7XG5cdFx0XHRcdGlmICghb0xpbmspIHtcblx0XHRcdFx0XHQvLyBmb3IgZGF0YSBwb2ludHMgY29uZmlndXJlZCBpbiBhcHAgZGVzY3JpcHRvciBidXQgbm90IGFubm90YXRlZCBpbiB0aGUgaGVhZGVyXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgb0xpbmtDb250ZXh0ID0gb0xpbmsuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgb0xpbmtEYXRhOiBvYmplY3QgPSBvTGlua0NvbnRleHQgJiYgb0xpbmtDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRsZXQgb01peGVkQ29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBtZXJnZSh7fSwgb1BhZ2VEYXRhLCBvTGlua0RhdGEpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0XHQvLyBwcm9jZXNzIHNlbWFudGljIG9iamVjdCBtYXBwaW5nc1xuXHRcdFx0XHRpZiAob0RhdGFQb2ludC5zZW1hbnRpY09iamVjdE1hcHBpbmcpIHtcblx0XHRcdFx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RNYXBwaW5nID0gb0RhdGFQb2ludC5zZW1hbnRpY09iamVjdE1hcHBpbmc7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIGluIGFTZW1hbnRpY09iamVjdE1hcHBpbmcpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9NYXBwaW5nID0gYVNlbWFudGljT2JqZWN0TWFwcGluZ1tpdGVtXTtcblx0XHRcdFx0XHRcdGNvbnN0IHNNYWluUHJvcGVydHkgPSBvTWFwcGluZ1tcIkxvY2FsUHJvcGVydHlcIl0hW1wiJFByb3BlcnR5UGF0aFwiXTtcblx0XHRcdFx0XHRcdGNvbnN0IHNNYXBwZWRQcm9wZXJ0eSA9IG9NYXBwaW5nW1wiU2VtYW50aWNPYmplY3RQcm9wZXJ0eVwiXSE7XG5cdFx0XHRcdFx0XHRpZiAoc01haW5Qcm9wZXJ0eSAhPT0gc01hcHBlZFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvTWl4ZWRDb250ZXh0Lmhhc093blByb3BlcnR5KHNNYWluUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld01hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRcdFx0XHRcdFx0b05ld01hcHBpbmdbc01hcHBlZFByb3BlcnR5XSA9IG9NaXhlZENvbnRleHRbc01haW5Qcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRcdFx0b01peGVkQ29udGV4dCA9IG1lcmdlKHt9LCBvTWl4ZWRDb250ZXh0LCBvTmV3TWFwcGluZykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIG9NaXhlZENvbnRleHRbc01haW5Qcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob01peGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3Qgc0tleSBpbiBvTWl4ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRpZiAoIXNLZXkuc3RhcnRzV2l0aChcIl9cIikgJiYgIXNLZXkuaW5jbHVkZXMoXCJvZGF0YS5jb250ZXh0XCIpKSB7XG5cdFx0XHRcdFx0XHRcdG9QYXJhbXNbc0tleV0gPSBvTWl4ZWRDb250ZXh0W3NLZXldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyB2YWxpZGF0ZSBpZiBhIGxpbmsgbXVzdCBiZSByZW5kZXJlZFxuXHRcdFx0XHRvU2hlbGxTZXJ2aWNlc1xuXHRcdFx0XHRcdC5pc05hdmlnYXRpb25TdXBwb3J0ZWQoW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6IHtcblx0XHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogb0RhdGFQb2ludC5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdFx0XHRhY3Rpb246IG9EYXRhUG9pbnQuYWN0aW9uXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHBhcmFtczogb1BhcmFtc1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0pXG5cdFx0XHRcdFx0LnRoZW4oKGFMaW5rcykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuU2V0TGlua0VuYWJsZW1lbnQoc0lkLCBhTGlua3MpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZuT25FcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2ZpbmRTdW1tYXJpemVCdXR0b24oKTogQnV0dG9uIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBvYmplY3RQYWdlVGl0bGUgPSBvYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkgYXMgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZTtcblx0XHRjb25zdCBhY3Rpb25zID0gb2JqZWN0UGFnZVRpdGxlPy5nZXRBY3Rpb25zKCk7XG5cdFx0bGV0IHN1bW1hcml6ZUJ1dHRvbjogQnV0dG9uIHwgdW5kZWZpbmVkO1xuXG5cdFx0Zm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuXHRcdFx0aWYgKGFjdGlvbi5pc0E8U3VtbWFyaXphdGlvbkJ1dHRvbj4oXCJzYXAuZmUubWFjcm9zLmFpLlN1bW1hcml6YXRpb25CdXR0b25cIikpIHtcblx0XHRcdFx0Y29uc3QgYnV0dG9uID0gYWN0aW9uLmdldENvbnRlbnQoKSBhcyBCdXR0b24gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChidXR0b24gJiYgYnV0dG9uLmdldElkKCkuZW5kc1dpdGgoXCI6OlN1bW1hcml6ZTo6YnV0dG9uXCIpKSB7XG5cdFx0XHRcdFx0c3VtbWFyaXplQnV0dG9uID0gYnV0dG9uO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN1bW1hcml6ZUJ1dHRvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBFdmFsdWF0ZXMgc3RhcnR1cCBwYXJhbWV0ZXJzIGFuZCB0cmlnZ2VycyB0aGUgc21hcnQgc3VtbWFyeSBhY3Rpb24gb24gdGhlIE9iamVjdCBQYWdlIGlmIHJlcXVpcmVkLlxuXHQgKlxuXHQgKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzIGluZGljYXRlIHRoYXQgYSBzbWFydCBzdW1tYXJ5IHNob3VsZCBiZSBwZXJmb3JtZWQgZm9yIHRoZSBjdXJyZW50IE9iamVjdCBQYWdlIGxldmVsLlxuXHQgKiBUaGUgbGV2ZWwgcGFyYW1ldGVyIGRldGVybWluZXMgd2hpY2ggT2JqZWN0IFBhZ2Ugc2hvdWxkIGJlIHN1bW1hcml6ZWQsIHdoaWNoIGlzIHJlbGV2YW50IGluIEZsZXhpYmxlIENvbHVtbiBMYXlvdXQgKEZDTCkgc2NlbmFyaW9zIHdoZXJlXG5cdCAqIG11bHRpcGxlIE9iamVjdCBQYWdlcyBtYXkgYmUgZGlzcGxheWVkIHNpbXVsdGFuZW91c2x5LlxuXHQgKiBJZiBubyBsZXZlbCBpcyBwcm92aWRlZCBpbiB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzLCB0aGUgbWV0aG9kIGRlZmF1bHRzIHRoZSBsZXZlbCB0byAxLlxuXHQgKiBJZiB0aGUgc3VtbWFyeSBhY3Rpb24gaXMgYWxsb3dlZCBhbmQgdGhlIFNtYXJ0U3VtbWFyaXplIGNhcGFiaWxpdHkgaXMgYXZhaWxhYmxlLCBpdCBsb2NhdGVzIHRoZSBzdW1tYXJpemUgYnV0dG9uIGFuZCB0cmlnZ2VycyBpdHMgcHJlc3MgZXZlbnQuXG5cdCAqIFRoZSBtZXRob2QgZW5zdXJlcyB0aGUgc3VtbWFyeSBpcyBvbmx5IGV4ZWN1dGVkIG9uY2UgcGVyIG5hdmlnYXRpb24gYW5kIGxvZ3MgZXJyb3JzIGlmIHByZXJlcXVpc2l0ZXMgYXJlIG5vdCBtZXQgb3IgdGhlIGJ1dHRvbiBpcyB1bmF2YWlsYWJsZS5cblx0ICogQWxsIGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHByb2Nlc3MgYXJlIGNhdWdodCBhbmQgbG9nZ2VkLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2hhbmRsZVNtYXJ0U3VtbWFyeVN0YXJ0dXBBY3Rpb24oKTogdm9pZCB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRhcHBDb21wb25lbnRcblx0XHRcdD8uZ2V0U3RhcnR1cFBhcmFtZXRlcnMoKVxuXHRcdFx0Py50aGVuKChzdGFydHVwUGFyYW1zOiBTdGFydHVwUGFyYW1ldGVycykgPT4ge1xuXHRcdFx0XHRpZiAoIXN0YXJ0dXBQYXJhbXMucHJlZmVycmVkQWN0aW9uIHx8ICFzdGFydHVwUGFyYW1zLnByZWZlcnJlZEFjdGlvblswXS5zdGFydHNXaXRoKFwic3VtbWFyeVwiKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGNoZWNrIGlmIHdlIGFyZSBvbiB0aGUgY29ycmVjdCBPUCBieSBjaGVja2luZyB0aGUgbGV2ZWwgcHJvdmlkZWQgaW4gdGhlIHN0YXJ0dXAgcGFyYW1ldGVyc1xuXHRcdFx0XHRjb25zdCB2aWV3TGV2ZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRcdFx0Y29uc3QgcHJlZmVycmVkQWN0aW9uTGV2ZWwgPVxuXHRcdFx0XHRcdHN0YXJ0dXBQYXJhbXMucHJlZmVycmVkQWN0aW9uWzBdID09PSBcInN1bW1hcnlcIiA/IDEgOiBwYXJzZUludChzdGFydHVwUGFyYW1zLnByZWZlcnJlZEFjdGlvblswXS5zcGxpdChcIi1cIilbMV0sIDEwKTtcblx0XHRcdFx0aWYgKGlzTmFOKHByZWZlcnJlZEFjdGlvbkxldmVsKSB8fCB2aWV3TGV2ZWwgIT09IHByZWZlcnJlZEFjdGlvbkxldmVsKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgc3VtbWFyeSBhY3Rpb24gc2hhbGwgYmUgZXhlY3V0ZWQgbm93IChpdCBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBleGVjdXRlZCBieSBhIGhpZ2hlciBsZXZlbCBPUClcblx0XHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRQcmVmZXJyZWRBY3Rpb25TdGF0dXMoKSA9PT0gUHJlZmVycmVkQWN0aW9uU3RhdHVzLkNhblBlcmZvcm0pIHtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuc2V0UHJlZmVycmVkQWN0aW9uU3RhdHVzKFByZWZlcnJlZEFjdGlvblN0YXR1cy5BbHJlYWR5UGVyZm9ybWVkKTsgLy8gdG8gcHJldmVudCBvdGhlciBPUHMgb24gaGlnaGVyIGxldmVscyB0byBleGVjdXRlIHRoZSBzdW1tYXJ5IGFnYWluXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgU21hcnRTdW1tYXJpemUgY2FwYWJpbGl0eSBpcyBhdmFpbGFibGVcblx0XHRcdFx0Y29uc3QgZW52aXJvbm1lbnRTZXJ2aWNlID0gYXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCk7XG5cdFx0XHRcdGlmICghZW52aXJvbm1lbnRTZXJ2aWNlPy5lbnZpcm9ubWVudENhcGFiaWxpdGllcy5TbWFydFN1bW1hcml6ZSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIlNtYXJ0IFN1bW1hcml6YXRpb24gd2FzIG5vdCB0cmlnZ2VyZWQgYmVjYXVzZSBTbWFydFN1bW1hcml6ZSBjYXBhYmlsaXR5IGlzIG5vdCBhdmFpbGFibGVcIik7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRmluZCB0aGUgU3VtbWFyeSBidXR0b25cblx0XHRcdFx0Y29uc3Qgc3VtbWFyaXplQnV0dG9uID0gdGhpcy5fZmluZFN1bW1hcml6ZUJ1dHRvbigpO1xuXG5cdFx0XHRcdGlmIChzdW1tYXJpemVCdXR0b24gJiYgc3VtbWFyaXplQnV0dG9uLmdldFZpc2libGUoKSAmJiBzdW1tYXJpemVCdXR0b24uZ2V0RW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0c3VtbWFyaXplQnV0dG9uLmZpcmVQcmVzcygpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0XHRcIlNtYXJ0IFN1bW1hcml6YXRpb24gd2FzIG5vdCB0cmlnZ2VyZWQgYmVjYXVzZSB0aGUgU3VtbWFyaXplIGJ1dHRvbiBpcyBlaXRoZXIgbm90IHZpc2libGUgb3Igbm90IGVuYWJsZWQgb3Igbm90IGZvdW5kLlwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgc3RhcnR1cCBwYXJhbWV0ZXJzIG9yIHRyaWdnZXJpbmcgc21hcnQgc3VtbWFyeTpcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0aGFuZGxlcnMgPSB7XG5cdFx0b25QcmltYXJ5QWN0aW9uKFxuXHRcdFx0b0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLFxuXHRcdFx0b1ZpZXc6IEZFVmlldyxcblx0XHRcdG9Db250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdO1xuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdG1vZGVsPzogT0RhdGFNb2RlbDtcblx0XHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRcdGlzTmF2aWdhYmxlPzogYm9vbGVhbjtcblx0XHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA/OiBzdHJpbmc7XG5cdFx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRcdGFwcGxpY2FibGVDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdG5vdEFwcGxpY2FibGVDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdFx0XHRcdGVuYWJsZUF1dG9TY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0XHR9LFxuXHRcdFx0bUNvbmRpdGlvbnM6IHtcblx0XHRcdFx0cG9zaXRpdmVBY3Rpb25WaXNpYmxlOiBib29sZWFuO1xuXHRcdFx0XHRwb3NpdGl2ZUFjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG5cdFx0XHRcdGVkaXRBY3Rpb25WaXNpYmxlOiBib29sZWFuO1xuXHRcdFx0XHRlZGl0QWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcblx0XHRcdH1cblx0XHQpOiB2b2lkIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogSW52b2tlcyB0aGUgcGFnZSBwcmltYXJ5IGFjdGlvbiB3aGVuIHRoZSB1c2VyIHByZXNzZXMgQ3RybCtFbnRlciAoQ21kK0VudGVyIG9uIG1hY09TKS5cblx0XHRcdCAqL1xuXG5cdFx0XHRjb25zdCBwcmltYXJ5Q2FuZGlkYXRlID0gb0NvbnRyb2xsZXIuX2dldFByaW1hcnlBY3Rpb25TaG9ydGN1dENhbmRpZGF0ZXMob1ZpZXcpWzBdO1xuXG5cdFx0XHQvKiBCeSBkZXNpZ24sIHRoZXJlIG11c3QgYmUgYXQgbW9zdCBvbmUgY2FuZGlkYXRlIGR1ZSB0byB0aGUgXCJzaW5nbGUgZW1waGFzaXMgcGVyIHBhZ2VcIiBydWxlLlxuXHRcdFx0ICAgSWYgYSBwcmltYXJ5LWVudGVyIHRhcmdldCBpcyBmb3VuZCwgaXQgbXVzdCBmdWxseSB0YWtlIG92ZXIgQ3RybC9DbWQrRW50ZXIuKi9cblxuXHRcdFx0aWYgKHByaW1hcnlDYW5kaWRhdGUpIHtcblx0XHRcdFx0aWYgKCFwcmltYXJ5Q2FuZGlkYXRlLmdldEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdC8vIFRha2Ugb3ZlciBDdHJsL0NtZCtFbnRlciwgYnV0IGRvIG5vdCB0cmlnZ2VyIGFueXRoaW5nIHdoZW4gdGhlIHByaW1hcnkgYWN0aW9uIGlzIGRpc2FibGVkLlxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJpbWFyeUNhbmRpZGF0ZS5pc0EoXCJzYXAubS5CdXR0b25cIikpIHtcblx0XHRcdFx0XHQocHJpbWFyeUNhbmRpZGF0ZSBhcyBCdXR0b24pLmZpcmVQcmVzcygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgocHJpbWFyeUNhbmRpZGF0ZSBhcyBNZW51QnV0dG9uKS5pc0EoXCJzYXAubS5NZW51QnV0dG9uXCIpKSB7XG5cdFx0XHRcdFx0KHByaW1hcnlDYW5kaWRhdGUgYXMgTWVudUJ1dHRvbikuZmlyZURlZmF1bHRBY3Rpb24oKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpVmlld0xldmVsID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdFx0aWYgKG1Db25kaXRpb25zLnBvc2l0aXZlQWN0aW9uVmlzaWJsZSkge1xuXHRcdFx0XHRpZiAobUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25FbmFibGVkKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIuaGFuZGxlcnMub25DYWxsQWN0aW9uKG9WaWV3LCBzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG1Db25kaXRpb25zLmVkaXRBY3Rpb25WaXNpYmxlKSB7XG5cdFx0XHRcdGlmIChtQ29uZGl0aW9ucy5lZGl0QWN0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0RG9jdW1lbnQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpVmlld0xldmVsID09PSAxICYmIENvbW1vblV0aWxzLmdldElzRWRpdGFibGUob1ZpZXcpKSB7XG5cdFx0XHRcdG9Db250cm9sbGVyLl9zYXZlRG9jdW1lbnQoKTtcblx0XHRcdH0gZWxzZSBpZiAoQ29tbW9uVXRpbHMuZ2V0SXNFZGl0YWJsZShvVmlldykpIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuX2FwcGx5RG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBNYW5hZ2VzIHRoZSBjb250ZXh0IGNoYW5nZSBldmVudCBvbiB0aGUgdGFibGVzLlxuXHRcdCAqIFRoZSBmb2N1cyBpcyBzZXQgaWYgdGhpcyBjaGFuZ2UgaXMgcmVsYXRlZCB0byBhbiBlZGl0RmxvdyBhY3Rpb24gYW5kXG5cdFx0ICogYW4gZXZlbnQgaXMgZmlyZWQgb24gdGhlIG9iamVjdFBhZ2UgbWVzc2FnZUJ1dHRvbi5cblx0XHQgKiBAcGFyYW0gdGhpcyBUaGUgb2JqZWN0UGFnZSBjb250cm9sbGVyXG5cdFx0ICogQHBhcmFtIGV2ZW50IFRoZSBVSTUgZXZlbnRcblx0XHQgKi9cblx0XHRhc3luYyBvblRhYmxlQ29udGV4dENoYW5nZSh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlciwgZXZlbnQ6IFVJNUV2ZW50PHt9LCBUYWJsZUFQST4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdGNvbnN0IHRhYmxlQVBJID0gZXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRjb25zdCB0YWJsZSA9IHRhYmxlQVBJLmNvbnRlbnQ7XG5cdFx0XHRjb25zdCBjdXJyZW50QWN0aW9uUHJvbWlzZSA9IHRoaXMuZWRpdEZsb3cuZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTtcblx0XHRcdGNvbnN0IHRhYmxlQ29udGV4dHMgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcodGFibGUpPy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKTtcblxuXHRcdFx0aWYgKGN1cnJlbnRBY3Rpb25Qcm9taXNlICYmIHRhYmxlQ29udGV4dHM/Lmxlbmd0aCkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGFjdGlvblJlc3BvbnNlID0gYXdhaXQgY3VycmVudEFjdGlvblByb21pc2U7XG5cdFx0XHRcdFx0aWYgKGFjdGlvblJlc3BvbnNlPy5jb250cm9sSWQgPT09IHRhYmxlLmdldElkKCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGFjdGlvbkRhdGEgPSBhY3Rpb25SZXNwb25zZS5vRGF0YTtcblx0XHRcdFx0XHRcdGNvbnN0IGtleXMgPSBhY3Rpb25SZXNwb25zZS5rZXlzO1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV3SXRlbSA9XG5cdFx0XHRcdFx0XHRcdHRhYmxlQ29udGV4dHNcblx0XHRcdFx0XHRcdFx0XHQuZmluZCgodGFibGVDb250ZXh0OiBDb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCB0YWJsZURhdGEgPSB0YWJsZUNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ga2V5cy5ldmVyeSgoa2V5OiBzdHJpbmcpID0+IHRhYmxlRGF0YVtrZXldID09PSBhY3Rpb25EYXRhW2tleV0pO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0Py5nZXRJbmRleCgpID8/IC0xO1xuXHRcdFx0XHRcdFx0aWYgKG5ld0l0ZW0gIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRpYWxvZyA9IEluc3RhbmNlTWFuYWdlci5nZXRPcGVuRGlhbG9ncygpLmZpbmQoKGRpYWxvZykgPT4gZGlhbG9nLmRhdGEoXCJGdWxsU2NyZWVuRGlhbG9nXCIpICE9PSB0cnVlKTtcblx0XHRcdFx0XHRcdFx0aWYgKGRpYWxvZykge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGJ5IGRlc2lnbiwgYSBzYXAubS5kaWFsb2cgc2V0IHRoZSBmb2N1cyB0byB0aGUgcHJldmlvdXMgZm9jdXNlZCBlbGVtZW50IHdoZW4gY2xvc2luZy5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgd2FpdCBmb3IgdGhlIGRpYWxvZyB0byBiZSBjbG9zZWQgYmVmb3JlIHNldCB0aGUgZm9jdXMgdG8gYW5vdGhlciBlbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0ZGlhbG9nLmF0dGFjaEV2ZW50T25jZShcImFmdGVyQ2xvc2VcIiwgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGFibGUuZm9jdXNSb3cobmV3SXRlbSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFibGUuZm9jdXNSb3cobmV3SXRlbSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhpcy5lZGl0Rmxvdy5kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihgQW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNjcm9sbGluZyB0byB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtOiAke2V9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIGZpcmUgTW9kZWxDb250ZXh0Q2hhbmdlIG9uIHRoZSBtZXNzYWdlIGJ1dHRvbiB3aGVuZXZlciB0aGUgdGFibGUgY29udGV4dCBjaGFuZ2VzXG5cdFx0XHR0aGlzLm1lc3NhZ2VCdXR0b24uZmlyZU1vZGVsQ29udGV4dENoYW5nZSgpO1xuXHRcdH0sXG5cblx0XHRvblRhYmxlQmluZGluZ1VwZGF0ZWQodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpOiB2b2lkIHtcblx0XHRcdHRoaXMubWVzc2FnZUJ1dHRvbi5maXJlTW9kZWxDb250ZXh0Q2hhbmdlKCk7XG5cdFx0fSxcblxuXHRcdGFzeW5jIG9uQ2FsbEFjdGlvbihcblx0XHRcdG9WaWV3OiBGRVZpZXcsXG5cdFx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcblx0XHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRcdGNvbnRleHRzPzogT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRcdHJlcXVpcmVzTmF2aWdhdGlvbj86IGJvb2xlYW47XG5cdFx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRcdGJTdGF0aWNBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0XHRub3RBcHBsaWNhYmxlQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0XHRlbmFibGVBdXRvU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0XHRkaXNhYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuO1xuXHRcdFx0fVxuXHRcdCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG5cblx0XHRcdC8vIFdhaXQgZm9yIFZIIHZhbHVlcyB0byBiZSByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyB0aGUgYWN0aW9uXG5cdFx0XHRhd2FpdCBvQ29udHJvbGxlci5lZGl0Rmxvdy5zeW5jVGFzaygpO1xuXG5cdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIuZWRpdEZsb3dcblx0XHRcdFx0Lmludm9rZUFjdGlvbihzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMpXG5cdFx0XHRcdC50aGVuKChyZXMpID0+IHtcblx0XHRcdFx0XHRvQ29udHJvbGxlci5fc2hvd01lc3NhZ2VQb3BvdmVyKCk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlcztcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0XHRvQ29udHJvbGxlci5fc2hvd01lc3NhZ2VQb3BvdmVyKCk7XG5cdFx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0b25EYXRhUG9pbnRUaXRsZVByZXNzZWQoXG5cdFx0XHRvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsXG5cdFx0XHRvU291cmNlOiBDb250cm9sLFxuXHRcdFx0b01hbmlmZXN0T3V0Ym91bmQ6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0T3V0Ym91bmRFbnRyeT4sXG5cdFx0XHRzQ29udHJvbENvbmZpZzogc3RyaW5nLFxuXHRcdFx0c0NvbGxlY3Rpb25QYXRoOiBzdHJpbmdcblx0XHQpOiB2b2lkIHtcblx0XHRcdG9NYW5pZmVzdE91dGJvdW5kID0gdHlwZW9mIG9NYW5pZmVzdE91dGJvdW5kID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShvTWFuaWZlc3RPdXRib3VuZCkgOiBvTWFuaWZlc3RPdXRib3VuZDtcblx0XHRcdGNvbnN0IG9UYXJnZXRJbmZvID0gb01hbmlmZXN0T3V0Ym91bmRbc0NvbnRyb2xDb25maWddLFxuXHRcdFx0XHRvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpISxcblx0XHRcdFx0c01ldGFQYXRoID0gb0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dFxuXHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFQYXRoKG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGxldCBhU2VtYW50aWNPYmplY3RNYXBwaW5nID0gQ29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nKG9UYXJnZXRJbmZvKSxcblx0XHRcdFx0YU5hdmlnYXRpb25EYXRhID0gb0NvbnRyb2xsZXIuX2dldENoYXJ0Q29udGV4dERhdGEob0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCwgc0NvbGxlY3Rpb25QYXRoKSxcblx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzO1xuXG5cdFx0XHRhTmF2aWdhdGlvbkRhdGEgPSBhTmF2aWdhdGlvbkRhdGEubWFwKGZ1bmN0aW9uIChvTmF2aWdhdGlvbkRhdGE6IHVua25vd24pIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRkYXRhOiBvTmF2aWdhdGlvbkRhdGEsXG5cdFx0XHRcdFx0bWV0YVBhdGg6IHNNZXRhUGF0aCArIChzQ29sbGVjdGlvblBhdGggPyBgLyR7c0NvbGxlY3Rpb25QYXRofWAgOiBcIlwiKVxuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAob1RhcmdldEluZm8gJiYgb1RhcmdldEluZm8ucGFyYW1ldGVycykge1xuXHRcdFx0XHRjb25zdCBvUGFyYW1zID0gb1RhcmdldEluZm8ucGFyYW1ldGVycyAmJiBvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLmdldE91dGJvdW5kUGFyYW1zKG9UYXJnZXRJbmZvLnBhcmFtZXRlcnMpO1xuXHRcdFx0XHRpZiAoT2JqZWN0LmtleXMob1BhcmFtcykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9QYXJhbXM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIENoZWNrIGlmIGltcGxpY2l0IHNlbWFudGljIG9iamVjdCBtYXBwaW5nIGlzIG5lZWRlZFxuXHRcdFx0aWYgKGFTZW1hbnRpY09iamVjdE1hcHBpbmcubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGNvbnN0IGN1c3RvbURhdGEgPSBvU291cmNlLmdldEN1c3RvbURhdGEoKS5maW5kKChkYXRhKSA9PiBkYXRhLmdldEtleSgpID09PSBcIlZhbHVlUHJvcGVydHlQYXRoXCIpO1xuXHRcdFx0XHRpZiAoY3VzdG9tRGF0YSkge1xuXHRcdFx0XHRcdGFTZW1hbnRpY09iamVjdE1hcHBpbmcgPSBvQ29udHJvbGxlci5fZ2V0SW1wbGljaXRTZW1hbnRpY09iamVjdE1hcHBpbmdGb3JEYXRhUG9pbnRzKFxuXHRcdFx0XHRcdFx0Y3VzdG9tRGF0YS5nZXRWYWx1ZSgpLFxuXHRcdFx0XHRcdFx0b1RhcmdldEluZm8uc2VtYW50aWNPYmplY3Rcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvVGFyZ2V0SW5mbyAmJiBvVGFyZ2V0SW5mby5zZW1hbnRpY09iamVjdCAmJiBvVGFyZ2V0SW5mby5hY3Rpb24pIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5uYXZpZ2F0ZShvVGFyZ2V0SW5mby5zZW1hbnRpY09iamVjdCwgb1RhcmdldEluZm8uYWN0aW9uLCB7XG5cdFx0XHRcdFx0bmF2aWdhdGlvbkNvbnRleHRzOiBhTmF2aWdhdGlvbkRhdGEsXG5cdFx0XHRcdFx0c2VtYW50aWNPYmplY3RNYXBwaW5nOiBhU2VtYW50aWNPYmplY3RNYXBwaW5nLFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVyczogYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBUcmlnZ2VycyBhbiBvdXRib3VuZCBuYXZpZ2F0aW9uIHdoZW4gYSB1c2VyIGNob29zZXMgdGhlIGNoZXZyb24uXG5cdFx0ICogQHBhcmFtIG9Db250cm9sbGVyXG5cdFx0ICogQHBhcmFtIHNPdXRib3VuZFRhcmdldCBOYW1lIG9mIHRoZSBvdXRib3VuZCB0YXJnZXQgKG5lZWRzIHRvIGJlIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0KVxuXHRcdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIGZvciB0aGUgdGFyZ2V0IGFwcFxuXHRcdCAqIEBwYXJhbSBzQ3JlYXRlUGF0aCBDcmVhdGUgcGF0aCB3aGVuIHRoZSBjaGV2cm9uIGlzIGNyZWF0ZWQuXG5cdFx0ICogQHJldHVybnMgUHJvbWlzZSB3aGljaCBpcyByZXNvbHZlZCBvbmNlIHRoZSBuYXZpZ2F0aW9uIGlzIHRyaWdnZXJlZCAoPz8/IG1heWJlIG9ubHkgb25jZSBmaW5pc2hlZD8pXG5cdFx0ICogQGZpbmFsXG5cdFx0ICovXG5cdFx0YXN5bmMgb25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKFxuXHRcdFx0b0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLFxuXHRcdFx0c091dGJvdW5kVGFyZ2V0OiBzdHJpbmcsXG5cdFx0XHRvQ29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0XHRzQ3JlYXRlUGF0aDogc3RyaW5nXG5cdFx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXIsIHNPdXRib3VuZFRhcmdldCwgb0NvbnRleHQsIHNDcmVhdGVQYXRoKTtcblx0XHR9LFxuXG5cdFx0b25OYXZpZ2F0ZUNoYW5nZSh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlciwgb0V2ZW50OiBVSTVFdmVudDx7IHN1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uIH0+KTogdm9pZCB7XG5cdFx0XHQvL3dpbGwgYmUgY2FsbGVkIGFsd2F5cyB3aGVuIHdlIGNsaWNrIG9uIGEgc2VjdGlvbiB0YWJcblx0XHRcdHRoaXMuYlNlY3Rpb25OYXZpZ2F0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBQcmV2ZW50IFZpZXdTdGF0ZSBmcm9tIG92ZXJyaWRpbmcgdGhlIHVzZXIncyBtYW51YWwgdGFiIHNlbGVjdGlvbi5cblx0XHRcdC8vIFRoaXMgaXMgaW1wb3J0YW50IGFmdGVyIGRpc2NhcmQgd2hlbiBWaWV3U3RhdGUuYXBwbHkgbWlnaHQgdHJ5IHRvIHJlc3RvcmUgdGhlIHByZXZpb3VzIHNlY3Rpb24uXG5cdFx0XHR0aGlzLnNraXBWaWV3U3RhdGVTZWN0aW9uUmVzdG9yZSA9IHRydWU7XG5cblx0XHRcdGNvbnN0IHN1YlNlY3Rpb24gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3ViU2VjdGlvblwiKTtcblx0XHRcdHRoaXMudGFyZ2V0U3ViU2VjdGlvbiA9IHN1YlNlY3Rpb247XG5cblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblxuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHRoaXMuZ2V0VmlldygpKSAmJlxuXHRcdFx0XHR0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLnNlY3Rpb25MYXlvdXQgPT09IFwiVGFic1wiICYmXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImVycm9yTmF2aWdhdGlvblNlY3Rpb25GbGFnXCIpID09PSBmYWxzZVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShbc3ViU2VjdGlvbl0sIHRydWUpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25WYXJpYW50U2VsZWN0ZWQ6IGZ1bmN0aW9uICh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcik6IHZvaWQge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH0sXG5cdFx0b25WYXJpYW50U2F2ZWQ6IGZ1bmN0aW9uICh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlciwgZXZlbnQ6IFVJNUV2ZW50PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IHZvaWQge1xuXHRcdFx0Ly9UT0RPOiBTaG91bGQgcmVtb3ZlIHRoaXMgc2V0VGltZU91dCBvbmNlIFZhcmlhbnQgTWFuYWdlbWVudCBwcm92aWRlcyBhbiBhcGkgdG8gZmV0Y2ggdGhlIGN1cnJlbnQgdmFyaWFudCBrZXkgb24gc2F2ZVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdH0sIDIwMDApO1xuXHRcdFx0dGhpcy50cmFja1ZhcmlhbnRTYXZlZFRlbGVtZXRyeShldmVudCk7XG5cdFx0fSxcblx0XHRvblZhcmlhbnRNYW5hZ2VkOiBmdW5jdGlvbiAodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIGV2ZW50OiBVSTVFdmVudDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiB2b2lkIHtcblx0XHRcdHRoaXMudHJhY2tWYXJpYW50TWFuYWdlZFRlbGVtZXRyeShldmVudCk7XG5cdFx0fSxcblx0XHRuYXZpZ2F0ZVRvU3ViU2VjdGlvbjogZnVuY3Rpb24gKG9Db250cm9sbGVyOiBPYmplY3RQYWdlQ29udHJvbGxlciwgdkRldGFpbENvbmZpZzogc3RyaW5nIHwgb2JqZWN0KTogdm9pZCB7XG5cdFx0XHRjb25zdCBvRGV0YWlsQ29uZmlnID0gdHlwZW9mIHZEZXRhaWxDb25maWcgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHZEZXRhaWxDb25maWcpIDogdkRldGFpbENvbmZpZztcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIHRoZSB0YXJnZXQgSUQgYmFzZWQgb24gaW5wdXQgdHlwZVxuXHRcdFx0bGV0IHRhcmdldElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodHlwZW9mIG9EZXRhaWxDb25maWcgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0dGFyZ2V0SWQgPSBvRGV0YWlsQ29uZmlnO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gUHJpb3JpdHk6IHN1YlNlY3Rpb25JZCA+IHNlY3Rpb25JZFxuXHRcdFx0XHR0YXJnZXRJZCA9IG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkID8/IG9EZXRhaWxDb25maWcuc2VjdGlvbklkO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGFyZ2V0SWQpIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuZ2V0RXh0ZW5zaW9uQVBJKCkubmF2aWdhdGVUb1N1YlNlY3Rpb24odGFyZ2V0SWQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRjbG9zZUNvbGxhYm9yYXRpb25TdHJpcDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKTogdm9pZCB7XG5cdFx0XHR0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpLnNldFByb3BlcnR5KFwiL3Nob3dDb2xsYWJvcmF0aW9uU3RyaXBcIiwgZmFsc2UpO1xuXHRcdH0sXG5cblx0XHRjbG9zZU9QTWVzc2FnZVN0cmlwOiBmdW5jdGlvbiAodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpOiB2b2lkIHtcblx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdGNvbnN0IGJJc0luRWRpdE1vZGUgPSBDb21tb25VdGlscy5nZXRJc0VkaXRhYmxlKHZpZXcpO1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKTtcblx0XHRcdGNvbnN0IG1lc3NhZ2VzdHJpcEludGVybmFsTW9kZWxDb250ZXh0ID0gaW50ZXJuYWxNb2RlbFxuXHRcdFx0XHQuYmluZENvbnRleHQodGhpcy5nZXRFeHRlbnNpb25BUEkoKS5fZ2V0TWVzc2FnZVN0cmlwQmluZGluZ0NvbnRleHRQYXRoKCkpXG5cdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKSE7XG5cdFx0XHQvLyBSZW1vdmUgY29udGV4dCBib3VuZCBtZXNzYWdlcyBhbmQgc2V0IHRoZSBwcm9wZXJ0eSB0byBmYWxzZSBmb3IgdGhlIGJhY2tlbmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBpbiBlZGl0IG1vZGUuXG5cdFx0XHRpZiAoIWJJc0luRWRpdE1vZGUgJiYgbWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJPUEJhY2tlbmRNZXNzYWdlVmlzaWJsZVwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0Qm91bmRNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHRcdFx0KG1lc3NhZ2U6IE1lc3NhZ2UpID0+XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2UuZ2V0VGFyZ2V0cygpWzBdID09PSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCkgJiYgbWVzc2FnZS5nZXRQZXJzaXN0ZW50KCkgPT09IHRydWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoY29udGV4dEJvdW5kTWVzc2FnZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0TWVzc2FnaW5nLnJlbW92ZU1lc3NhZ2VzKGNvbnRleHRCb3VuZE1lc3NhZ2VzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bWVzc2FnZXN0cmlwSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJPUEJhY2tlbmRNZXNzYWdlVmlzaWJsZVwiLCBmYWxzZSk7XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLmhpZGVNZXNzYWdlKCk7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBPYmplY3RQYWdlQ29udHJvbGxlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBd0dBLE1BQU07SUFBRUE7RUFBWSxDQUFDLEdBQUdDLG1CQUFtQjtFQVczQyxNQUFNQyxnQkFBZ0IsR0FBR0MsU0FBUyxDQUFDRCxnQkFBZ0I7RUFDbkQsTUFBTUUscUJBQXFCLEdBQUdELFNBQVMsQ0FBQ0UseUJBQXlCOztFQUVqRTtBQUNBO0FBQ0E7RUFGQSxJQUlNQyxvQkFBb0IsSUFBQUMsSUFBQSxHQUR6QkMsY0FBYyxDQUFDLGtEQUFrRCxDQUFDLEVBQUFDLEtBQUEsR0FJakVDLGNBQWMsQ0FBQ0MsV0FBVyxDQUFDLEVBQUFDLEtBQUEsR0FHM0JGLGNBQWMsQ0FBQ0csS0FBSyxDQUFDQyxRQUFRLENBQUNDLGNBQWMsQ0FBQyxDQUFDLEVBQUFDLEtBQUEsR0FHOUNOLGNBQWMsQ0FBQ08sZUFBZSxDQUFDSCxRQUFRLENBQUNJLHVCQUF1QixDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUdqRVQsY0FBYyxDQUFDVSxTQUFTLENBQUNOLFFBQVEsQ0FBQ08saUJBQWlCLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBR3JEWixjQUFjLENBQUNhLGNBQWMsQ0FBQ1QsUUFBUSxDQUFDVSxzQkFBc0IsQ0FBQyxD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