@sapui5/sap.fe.templates 1.109.0 → 1.110.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 (83) hide show
  1. package/README.md +5 -1
  2. package/package.json +11 -8
  3. package/src/sap/fe/templates/.library +26 -27
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.js +1 -7
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +1 -4
  6. package/src/sap/fe/templates/ListComponent.js +45 -62
  7. package/src/sap/fe/templates/ListComponent.ts +43 -43
  8. package/src/sap/fe/templates/ListReport/Component.js +11 -19
  9. package/src/sap/fe/templates/ListReport/Component.ts +6 -0
  10. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +11 -37
  11. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +1 -1
  12. package/src/sap/fe/templates/ListReport/LRMessageStrip.js +196 -0
  13. package/src/sap/fe/templates/ListReport/LRMessageStrip.ts +216 -0
  14. package/src/sap/fe/templates/ListReport/ListReport.view.xml +31 -0
  15. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +140 -247
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +49 -14
  17. package/src/sap/fe/templates/ListReport/ListReportTemplating.js +2 -7
  18. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +21 -108
  19. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +9 -17
  20. package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -25
  21. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +51 -122
  22. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +1 -23
  23. package/src/sap/fe/templates/ObjectPage/Component.js +19 -40
  24. package/src/sap/fe/templates/ObjectPage/Component.ts +9 -2
  25. package/src/sap/fe/templates/ObjectPage/ExtendPageDefinition.js +64 -0
  26. package/src/sap/fe/templates/ObjectPage/ExtendPageDefinition.ts +80 -0
  27. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +21 -58
  28. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +4 -4
  29. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +2 -1
  30. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +173 -459
  31. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +13 -18
  32. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +129 -208
  33. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +62 -14
  34. package/src/sap/fe/templates/ObjectPage/components/DraftHandlerButton.js +1 -32
  35. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +9 -37
  36. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +1 -7
  37. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +9 -31
  38. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +1 -1
  39. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +2 -4
  40. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
  41. package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.js +4 -5
  42. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +4 -4
  43. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +3 -3
  44. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +4 -4
  45. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +3 -3
  46. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +16 -21
  47. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +1 -1
  48. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +19 -1
  49. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +21 -0
  50. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +1 -1
  51. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +4 -5
  52. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +19 -69
  53. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +1 -1
  54. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +5 -20
  55. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +6 -6
  56. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +4 -3
  57. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +3 -3
  58. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActions.fragment.xml +1 -1
  59. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderContent.fragment.xml +1 -1
  60. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPoint.fragment.xml +1 -1
  61. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +4 -3
  62. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacetCustomContainer.fragment.xml +7 -5
  63. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingAvatar.fragment.xml +1 -1
  64. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderContact.fragment.xml +3 -2
  65. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +2 -1
  66. package/src/sap/fe/templates/ObjectPage/view/fragments/SideContentCustomContainer.fragment.xml +7 -7
  67. package/src/sap/fe/templates/TableScroller.js +1 -6
  68. package/src/sap/fe/templates/library.js +4 -7
  69. package/src/sap/fe/templates/library.ts +1 -2
  70. package/src/sap/fe/templates/messagebundle.properties +30 -29
  71. package/src/sap/fe/templates/messagebundle_bg.properties +2 -2
  72. package/src/sap/fe/templates/messagebundle_cs.properties +1 -1
  73. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +1 -1
  74. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +1 -1
  75. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +1 -1
  76. package/src/sap/fe/templates/messagebundle_no.properties +3 -3
  77. package/src/sap/fe/templates/messagebundle_sl.properties +7 -7
  78. package/ui5.yaml +0 -1
  79. package/src/sap/fe/templates/Feedback.js +0 -80
  80. package/src/sap/fe/templates/Feedback.ts +0 -64
  81. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActionButtons.fragment.xml +0 -82
  82. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +0 -20
  83. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +0 -20
@@ -2,11 +2,10 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/KPIManagement", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/SideEffects", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/MessageStrip", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/fe/core/PageController", "sap/fe/macros/chart/ChartRuntime", "sap/fe/macros/chart/ChartUtils", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/filter/FilterUtils", "sap/fe/macros/table/TableHelper", "sap/fe/templates/ListReport/ExtensionAPI", "sap/fe/templates/RootContainer/overrides/EditFlow", "sap/fe/templates/TableScroller", "sap/ui/core/Component", "sap/ui/core/mvc/OverrideExecution", "sap/ui/Device", "sap/ui/mdc/p13n/StateUtil", "sap/ui/thirdparty/hasher", "./ListReportTemplating", "./overrides/IntentBasedNavigation", "./overrides/Share", "./overrides/ViewState"], function (Log, ObjectPath, ActionRuntime, CommonUtils, EditFlow, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, KPIManagement, MassEdit, Placeholder, Share, SideEffects, ViewState, ClassSupport, EditState, MessageStrip, StableIdHelper, CoreLibrary, PageController, ChartRuntime, ChartUtils, CommonHelper, DelegateUtil, FilterUtils, TableHelper, ExtensionAPI, EditFlowOverrides, TableScroller, Component, OverrideExecution, Device, StateUtil, hasher, ListReportTemplating, IntentBasedNavigationOverride, ShareOverrides, ViewStateOverrides) {
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/KPIManagement", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/SideEffects", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/MessageStrip", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/fe/core/PageController", "sap/fe/macros/chart/ChartRuntime", "sap/fe/macros/chart/ChartUtils", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/filter/FilterUtils", "sap/fe/macros/table/TableHelper", "sap/fe/templates/ListReport/ExtensionAPI", "sap/fe/templates/TableScroller", "sap/ui/core/mvc/OverrideExecution", "sap/ui/Device", "sap/ui/mdc/p13n/StateUtil", "sap/ui/thirdparty/hasher", "./ListReportTemplating", "./overrides/IntentBasedNavigation", "./overrides/Share", "./overrides/ViewState"], function (Log, ObjectPath, ActionRuntime, CommonUtils, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, KPIManagement, MassEdit, Placeholder, Share, SideEffects, ViewState, ClassSupport, EditState, MessageStrip, StableIdHelper, CoreLibrary, PageController, ChartRuntime, ChartUtils, CommonHelper, DelegateUtil, FilterUtils, TableHelper, ExtensionAPI, TableScroller, OverrideExecution, Device, StateUtil, hasher, ListReportTemplating, IntentBasedNavigationOverride, 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, _dec16, _dec17, _dec18, _dec19, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10;
9
-
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9;
10
9
  var system = Device.system;
11
10
  var usingExtension = ClassSupport.usingExtension;
12
11
  var publicExtension = ClassSupport.publicExtension;
@@ -14,21 +13,24 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
14
13
  var finalExtension = ClassSupport.finalExtension;
15
14
  var extensible = ClassSupport.extensible;
16
15
  var defineUI5Class = ClassSupport.defineUI5Class;
17
-
16
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
17
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
18
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
18
19
  function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
19
-
20
20
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
21
-
22
21
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
23
-
24
22
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
25
-
26
23
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
27
-
28
24
  function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
29
-
30
25
  var TemplateContentView = CoreLibrary.TemplateContentView,
31
- InitialLoadMode = CoreLibrary.InitialLoadMode;
26
+ InitialLoadMode = CoreLibrary.InitialLoadMode;
27
+
28
+ /**
29
+ * Controller class for the list report page, used inside an SAP Fiori elements application.
30
+ *
31
+ * @hideconstructor
32
+ * @public
33
+ */
32
34
  var ListReportController = (_dec = defineUI5Class("sap.fe.templates.ListReport.ListReportController"), _dec2 = usingExtension(InternalRouting.override({
33
35
  onAfterBinding: function () {
34
36
  this.getView().getController()._onAfterBinding();
@@ -37,51 +39,34 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
37
39
  getEntitySet: function () {
38
40
  return this.base.getCurrentEntitySet();
39
41
  }
40
- })), _dec4 = usingExtension(SideEffects), _dec5 = usingExtension(IntentBasedNavigation.override(IntentBasedNavigationOverride)), _dec6 = usingExtension(Share.override(ShareOverrides)), _dec7 = usingExtension(EditFlow.override(EditFlowOverrides)), _dec8 = usingExtension(ViewState.override(ViewStateOverrides)), _dec9 = usingExtension(KPIManagement), _dec10 = usingExtension(Placeholder), _dec11 = usingExtension(MassEdit), _dec12 = publicExtension(), _dec13 = finalExtension(), _dec14 = privateExtension(), _dec15 = extensible(OverrideExecution.After), _dec16 = publicExtension(), _dec17 = extensible(OverrideExecution.After), _dec18 = publicExtension(), _dec19 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
42
+ })), _dec4 = usingExtension(SideEffects), _dec5 = usingExtension(IntentBasedNavigation.override(IntentBasedNavigationOverride)), _dec6 = usingExtension(Share.override(ShareOverrides)), _dec7 = usingExtension(ViewState.override(ViewStateOverrides)), _dec8 = usingExtension(KPIManagement), _dec9 = usingExtension(Placeholder), _dec10 = usingExtension(MassEdit), _dec11 = publicExtension(), _dec12 = finalExtension(), _dec13 = privateExtension(), _dec14 = extensible(OverrideExecution.After), _dec15 = publicExtension(), _dec16 = extensible(OverrideExecution.After), _dec17 = publicExtension(), _dec18 = extensible(OverrideExecution.After), _dec19 = publicExtension(), _dec20 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
41
43
  _inheritsLoose(ListReportController, _PageController);
42
-
43
44
  function ListReportController() {
44
45
  var _this;
45
-
46
46
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
47
47
  args[_key] = arguments[_key];
48
48
  }
49
-
50
49
  _this = _PageController.call.apply(_PageController, [this].concat(args)) || this;
51
-
52
50
  _initializerDefineProperty(_this, "_routing", _descriptor, _assertThisInitialized(_this));
53
-
54
51
  _initializerDefineProperty(_this, "_intentBasedNavigation", _descriptor2, _assertThisInitialized(_this));
55
-
56
52
  _initializerDefineProperty(_this, "sideEffects", _descriptor3, _assertThisInitialized(_this));
57
-
58
53
  _initializerDefineProperty(_this, "intentBasedNavigation", _descriptor4, _assertThisInitialized(_this));
59
-
60
54
  _initializerDefineProperty(_this, "share", _descriptor5, _assertThisInitialized(_this));
61
-
62
- _initializerDefineProperty(_this, "editFlow", _descriptor6, _assertThisInitialized(_this));
63
-
64
- _initializerDefineProperty(_this, "viewState", _descriptor7, _assertThisInitialized(_this));
65
-
66
- _initializerDefineProperty(_this, "kpiManagement", _descriptor8, _assertThisInitialized(_this));
67
-
68
- _initializerDefineProperty(_this, "placeholder", _descriptor9, _assertThisInitialized(_this));
69
-
70
- _initializerDefineProperty(_this, "massEdit", _descriptor10, _assertThisInitialized(_this));
71
-
55
+ _initializerDefineProperty(_this, "viewState", _descriptor6, _assertThisInitialized(_this));
56
+ _initializerDefineProperty(_this, "kpiManagement", _descriptor7, _assertThisInitialized(_this));
57
+ _initializerDefineProperty(_this, "placeholder", _descriptor8, _assertThisInitialized(_this));
58
+ _initializerDefineProperty(_this, "massEdit", _descriptor9, _assertThisInitialized(_this));
72
59
  _this.handlers = {
73
60
  onFilterSearch: function () {
74
61
  this._getFilterBarControl().triggerSearch();
75
62
  },
76
63
  onFiltersChanged: function (oEvent) {
77
64
  var oFilterBar = this._getFilterBarControl();
78
-
79
65
  if (oFilterBar) {
80
- var oInternalModelContext = this.getView().getBindingContext("internal"); // Pending filters into FilterBar to be used for custom views
81
-
66
+ var oInternalModelContext = this.getView().getBindingContext("internal");
67
+ // Pending filters into FilterBar to be used for custom views
82
68
  this.onPendingFilters();
83
69
  oInternalModelContext.setProperty("appliedFilters", oFilterBar.getAssignedFiltersText().filtersText);
84
-
85
70
  if (oEvent.getParameter("conditionsBased")) {
86
71
  oInternalModelContext.setProperty("hasPendingFilters", true);
87
72
  }
@@ -89,15 +74,37 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
89
74
  },
90
75
  onVariantSelected: function (oEvent) {
91
76
  var _this2 = this;
92
-
93
77
  var oVM = oEvent.getSource();
94
78
  var currentVariantKey = oEvent.getParameter("key");
95
-
96
79
  var oMultiModeControl = this._getMultiModeControl();
97
-
80
+ var initialControlStatesMapper = this.viewState.initialControlStatesMapper;
98
81
  oMultiModeControl === null || oMultiModeControl === void 0 ? void 0 : oMultiModeControl.invalidateContent();
99
- oMultiModeControl === null || oMultiModeControl === void 0 ? void 0 : oMultiModeControl.setFreezeContent(true); // setTimeout cause the variant needs to be applied before judging the auto search or updating the app state
82
+ oMultiModeControl === null || oMultiModeControl === void 0 ? void 0 : oMultiModeControl.setFreezeContent(true);
83
+ // Reset the Controls Mapped to the selected VM
84
+ var vmAssociatedControlsToReset = oVM.getFor();
85
+ Object.keys(initialControlStatesMapper).forEach(function (controlKey) {
86
+ var found = false;
87
+ var _iterator = _createForOfIteratorHelper(vmAssociatedControlsToReset),
88
+ _step;
89
+ try {
90
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
91
+ var vmAssociatedcontrolKey = _step.value;
92
+ if (vmAssociatedcontrolKey.indexOf(controlKey) > -1) {
93
+ found = true;
94
+ break;
95
+ }
96
+ }
97
+ } catch (err) {
98
+ _iterator.e(err);
99
+ } finally {
100
+ _iterator.f();
101
+ }
102
+ if (found) {
103
+ initialControlStatesMapper[controlKey] = {};
104
+ }
105
+ });
100
106
 
107
+ // setTimeout cause the variant needs to be applied before judging the auto search or updating the app state
101
108
  setTimeout(function () {
102
109
  if (_this2._shouldAutoTriggerSearch(oVM)) {
103
110
  // the app state will be updated via onSearch handler
@@ -109,6 +116,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
109
116
  },
110
117
  onVariantSaved: function () {
111
118
  var _this3 = this;
119
+ this.viewState.initialControlStatesMapper = {};
112
120
 
113
121
  //TODO: Should remove this setTimeOut once Variant Management provides an api to fetch the current variant key on save!!!
114
122
  setTimeout(function () {
@@ -117,52 +125,41 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
117
125
  },
118
126
  onSearch: function () {
119
127
  var _this4 = this;
120
-
121
128
  var oFilterBar = this._getFilterBarControl();
122
-
123
129
  var oInternalModelContext = this.getView().getBindingContext("internal");
124
130
  var oMdcChart = this.getChartControl();
125
131
  var bHideDraft = FilterUtils.getEditStateIsHideDraft(oFilterBar.getConditions());
126
132
  oInternalModelContext.setProperty("hasPendingFilters", false);
127
133
  oInternalModelContext.setProperty("hideDraftInfo", bHideDraft);
128
-
129
134
  if (!this._getMultiModeControl()) {
130
135
  this._updateALPNotApplicableFields(oInternalModelContext, oFilterBar);
131
136
  }
132
-
133
137
  if (oMdcChart) {
134
138
  // disable bound actions TODO: this clears everything for the chart?
135
139
  oMdcChart.getBindingContext("internal").setProperty("", {});
136
140
  var oPageInternalModelContext = oMdcChart.getBindingContext("pageInternal");
137
141
  var sTemplateContentView = oPageInternalModelContext.getProperty("".concat(oPageInternalModelContext.getPath(), "/alpContentView"));
138
-
139
142
  if (sTemplateContentView === TemplateContentView.Chart) {
140
143
  this.hasPendingChartChanges = true;
141
144
  }
142
-
143
145
  if (sTemplateContentView === TemplateContentView.Table) {
144
146
  this.hasPendingTableChanges = true;
145
147
  }
146
- } // store filter bar conditions to use later while navigation
147
-
148
-
148
+ }
149
+ // store filter bar conditions to use later while navigation
149
150
  StateUtil.retrieveExternalState(oFilterBar).then(function (oExternalState) {
150
151
  _this4.filterBarConditions = oExternalState.filter;
151
152
  }).catch(function (oError) {
152
153
  Log.error("Error while retrieving the external state", oError);
153
154
  });
154
-
155
155
  if (this.getView().getViewData().liveMode === false) {
156
156
  this.getExtensionAPI().updateAppState();
157
157
  }
158
-
159
158
  if (system.phone) {
160
159
  var oDynamicPage = this._getDynamicListReportControl();
161
-
162
160
  oDynamicPage.setHeaderExpanded(false);
163
161
  }
164
162
  },
165
-
166
163
  /**
167
164
  * Triggers an outbound navigation when a user chooses the chevron.
168
165
  *
@@ -179,19 +176,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
179
176
  },
180
177
  onChartSelectionChanged: function (oEvent) {
181
178
  var oMdcChart = oEvent.getSource().getContent(),
182
- oTable = this._getTable(),
183
- aData = oEvent.getParameter("data"),
184
- oInternalModelContext = this.getView().getBindingContext("internal");
185
-
179
+ oTable = this._getTable(),
180
+ aData = oEvent.getParameter("data"),
181
+ oInternalModelContext = this.getView().getBindingContext("internal");
186
182
  if (aData) {
187
183
  // update action buttons enablement / disablement
188
- ChartRuntime.fnUpdateChart(oEvent); // update selections on selection or deselection
189
-
184
+ ChartRuntime.fnUpdateChart(oEvent);
185
+ // update selections on selection or deselection
190
186
  ChartUtils.setChartFilters(oMdcChart);
191
187
  }
192
-
193
188
  var sTemplateContentView = oInternalModelContext.getProperty("".concat(oInternalModelContext.getPath(), "/alpContentView"));
194
-
195
189
  if (sTemplateContentView === TemplateContentView.Chart) {
196
190
  this.hasPendingChartChanges = true;
197
191
  } else if (oTable) {
@@ -204,9 +198,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
204
198
  var oInternalModelContext = this.getView().getBindingContext("internal");
205
199
  oInternalModelContext.setProperty("alpContentView", sSelectedKey);
206
200
  var oChart = this.getChartControl();
207
-
208
201
  var oTable = this._getTable();
209
-
210
202
  var oSegmentedButtonDelegate = {
211
203
  onAfterRendering: function () {
212
204
  var aItems = oSegmentedButton.getItems();
@@ -219,40 +211,28 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
219
211
  }
220
212
  };
221
213
  var oSegmentedButton = sSelectedKey === TemplateContentView.Table ? this._getSegmentedButton("Table") : this._getSegmentedButton("Chart");
222
-
223
214
  if (oSegmentedButton !== oEvent.getSource()) {
224
215
  oSegmentedButton.addEventDelegate(oSegmentedButtonDelegate);
225
216
  }
226
-
227
217
  switch (sSelectedKey) {
228
218
  case TemplateContentView.Table:
229
219
  this._updateTable(oTable);
230
-
231
220
  break;
232
-
233
221
  case TemplateContentView.Chart:
234
222
  this._updateChart(oChart);
235
-
236
223
  break;
237
-
238
224
  case TemplateContentView.Hybrid:
239
225
  this._updateTable(oTable);
240
-
241
226
  this._updateChart(oChart);
242
-
243
227
  break;
244
-
245
228
  default:
246
229
  break;
247
230
  }
248
-
249
231
  this.getExtensionAPI().updateAppState();
250
232
  },
251
233
  onFiltersSegmentedButtonPressed: function (oEvent) {
252
234
  var isCompact = oEvent.getParameter("key") === "Compact";
253
-
254
235
  this._getFilterBarControl().setVisible(isCompact);
255
-
256
236
  this._getVisualFilterBarControl().setVisible(!isCompact);
257
237
  },
258
238
  onStateChange: function () {
@@ -260,7 +240,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
260
240
  },
261
241
  onDynamicPageTitleStateChanged: function (oEvent) {
262
242
  var filterBar = this._getFilterBarControl();
263
-
264
243
  if (filterBar && filterBar.getSegmentedButton()) {
265
244
  if (oEvent.getParameter("isExpanded")) {
266
245
  filterBar.getSegmentedButton().setVisible(true);
@@ -274,9 +253,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
274
253
  setALPControlMessageStrip: function (aIgnoredFields, bIsChart, oApplySupported) {
275
254
  var sText = "";
276
255
  bIsChart = bIsChart === "true" || bIsChart === true;
277
-
278
256
  var oFilterBar = this._getFilterBarControl();
279
-
280
257
  if (oFilterBar && Array.isArray(aIgnoredFields) && aIgnoredFields.length > 0 && bIsChart) {
281
258
  var aIgnoredLabels = MessageStrip.getLabels(aIgnoredFields, oFilterBar.data("entityType"), oFilterBar, this.oResourceBundle);
282
259
  var bIsSearchIgnored = !oApplySupported.enableSearch;
@@ -287,17 +264,19 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
287
264
  };
288
265
  return _this;
289
266
  }
290
-
291
267
  var _proto = ListReportController.prototype;
292
-
268
+ /**
269
+ * Get the extension API for the current page.
270
+ *
271
+ * @public
272
+ * @returns The extension API.
273
+ */
293
274
  _proto.getExtensionAPI = function getExtensionAPI() {
294
275
  if (!this.extensionAPI) {
295
276
  this.extensionAPI = new ExtensionAPI(this);
296
277
  }
297
-
298
278
  return this.extensionAPI;
299
279
  };
300
-
301
280
  _proto.onInit = function onInit() {
302
281
  PageController.prototype.onInit.apply(this);
303
282
  var oInternalModelContext = this.getView().getBindingContext("internal");
@@ -308,48 +287,39 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
308
287
  oInternalModelContext.setProperty("scalefactor", {});
309
288
  oInternalModelContext.setProperty("scalefactorNumber", {});
310
289
  oInternalModelContext.setProperty("currency", {});
311
-
312
290
  if (this._hasMultiVisualizations()) {
313
291
  var alpContentView = this._getDefaultPath();
314
-
315
292
  if (!system.desktop && alpContentView === TemplateContentView.Hybrid) {
316
293
  alpContentView = TemplateContentView.Chart;
317
294
  }
318
-
319
295
  oInternalModelContext.setProperty("alpContentView", alpContentView);
320
- } // Store conditions from filter bar
321
- // this is later used before navigation to get conditions applied on the filter bar
296
+ }
322
297
 
298
+ // Store conditions from filter bar
299
+ // this is later used before navigation to get conditions applied on the filter bar
300
+ this.filterBarConditions = {};
323
301
 
324
- this.filterBarConditions = {}; // As AppStateHandler.applyAppState triggers a navigation we want to make sure it will
302
+ // As AppStateHandler.applyAppState triggers a navigation we want to make sure it will
325
303
  // happen after the routeMatch event has been processed (otherwise the router gets broken)
304
+ this.getAppComponent().getRouterProxy().waitForRouteMatchBeforeNavigation();
326
305
 
327
- this.getAppComponent().getRouterProxy().waitForRouteMatchBeforeNavigation(); // Configure the initial load settings
328
-
306
+ // Configure the initial load settings
329
307
  this._setInitLoad();
330
308
  };
331
-
332
309
  _proto.onExit = function onExit() {
333
310
  delete this.filterBarConditions;
334
-
335
311
  if (this.extensionAPI) {
336
312
  this.extensionAPI.destroy();
337
313
  }
338
-
339
314
  delete this.extensionAPI;
340
315
  };
341
-
342
316
  _proto._onAfterBinding = function _onAfterBinding() {
343
317
  var _this5 = this;
344
-
345
318
  var aTables = this._getControls("table");
346
-
347
319
  if (EditState.isEditStateDirty()) {
348
320
  var _this$_getMultiModeCo, _this$_getTable;
349
-
350
321
  (_this$_getMultiModeCo = this._getMultiModeControl()) === null || _this$_getMultiModeCo === void 0 ? void 0 : _this$_getMultiModeCo.invalidateContent();
351
322
  var oTableBinding = (_this$_getTable = this._getTable()) === null || _this$_getTable === void 0 ? void 0 : _this$_getTable.getRowBinding();
352
-
353
323
  if (oTableBinding) {
354
324
  if (CommonUtils.getAppComponent(this.getView())._isFclEnabled()) {
355
325
  // there is an issue if we use a timeout with a kept alive context used on another page
@@ -360,43 +330,37 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
360
330
  oTableBinding.refresh();
361
331
  delete _this5.sUpdateTimer;
362
332
  }, 0);
363
- } // Update action enablement and visibility upon table data update.
364
-
333
+ }
365
334
 
335
+ // Update action enablement and visibility upon table data update.
366
336
  var fnUpdateTableActions = function () {
367
337
  _this5._updateTableActions(aTables);
368
-
369
338
  oTableBinding.detachDataReceived(fnUpdateTableActions);
370
339
  };
371
-
372
340
  oTableBinding.attachDataReceived(fnUpdateTableActions);
373
341
  }
374
342
  }
375
-
376
343
  EditState.setEditStateProcessed();
377
344
  }
378
-
379
345
  if (!this.sUpdateTimer) {
380
346
  this._updateTableActions(aTables);
381
347
  }
382
-
383
- this.pageReady.waitFor(this.getAppComponent().getAppStateHandler().applyAppState());
348
+ var internalModelContext = this.getView().getBindingContext("internal");
349
+ if (!internalModelContext.getProperty("initialVariantApplied")) {
350
+ var viewId = this.getView().getId();
351
+ this.pageReady.waitFor(this.getAppComponent().getAppStateHandler().applyAppState(viewId, this.getView()));
352
+ internalModelContext.setProperty("initialVariantApplied", true);
353
+ }
384
354
  };
385
-
386
355
  _proto.onBeforeRendering = function onBeforeRendering() {
387
356
  PageController.prototype.onBeforeRendering.apply(this);
388
357
  };
389
-
390
358
  _proto.onAfterRendering = function onAfterRendering() {
391
359
  var _this6 = this;
392
-
393
360
  this.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (response) {
394
361
  _this6.oResourceBundle = response;
395
-
396
362
  var aTables = _this6._getControls();
397
-
398
363
  var sEntitySet = _this6.getView().getViewData().entitySet;
399
-
400
364
  var sText = CommonUtils.getTranslatedText("T_TABLE_AND_CHART_NO_DATA_TEXT", _this6.oResourceBundle, undefined, sEntitySet);
401
365
  aTables.forEach(function (oTable) {
402
366
  oTable.setNoData(sText);
@@ -405,17 +369,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
405
369
  Log.error("Error while retrieving the resource bundle", oError);
406
370
  });
407
371
  };
408
-
409
372
  _proto.onPageReady = function onPageReady(mParameters) {
410
373
  if (mParameters.forceFocus) {
411
374
  this._setInitialFocus();
412
- } // Remove the handler on back navigation that displays Draft confirmation
413
-
414
-
375
+ }
376
+ // Remove the handler on back navigation that displays Draft confirmation
415
377
  this.getAppComponent().getShellServices().setBackNavigation(undefined);
416
378
  }
379
+
417
380
  /**
418
- * Method called when the content of a list report view needs to be refreshed.
381
+ * Method called when the content of a custom view used in a list report needs to be refreshed.
419
382
  * This happens either when there is a change on the FilterBar and the search is triggered,
420
383
  * or when a tab with custom content is selected.
421
384
  * This method can be overwritten by the controller extension in case of customization.
@@ -441,13 +404,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
441
404
  * }
442
405
  * </pre></code>
443
406
  * @public
444
- */
445
- ;
446
-
447
- _proto. // eslint-disable-next-line @typescript-eslint/no-unused-vars
407
+ */;
408
+ _proto.
409
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
448
410
  onViewNeedsRefresh = function onViewNeedsRefresh(mParameters) {
449
411
  /* To be overriden */
450
412
  }
413
+
451
414
  /**
452
415
  * Method called when a filter or search value has been changed in the FilterBar,
453
416
  * but has not been validated yet by the end user (with the 'Go' or 'Search' button).
@@ -455,35 +418,39 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
455
418
  * This method can be overwritten by the controller extension in case of customization.
456
419
  *
457
420
  * @public
458
- */
459
- ;
460
-
421
+ */;
461
422
  _proto.onPendingFilters = function onPendingFilters() {
462
423
  /* To be overriden */
463
424
  };
464
-
465
425
  _proto.getCurrentEntitySet = function getCurrentEntitySet() {
466
426
  var _this$_getTable2;
467
-
468
427
  return (_this$_getTable2 = this._getTable()) === null || _this$_getTable2 === void 0 ? void 0 : _this$_getTable2.data("targetCollectionPath").slice(1);
469
428
  }
429
+
430
+ /**
431
+ * Method called when the 'Clear' button on the FilterBar is pressed.
432
+ *
433
+ * @public
434
+ */;
435
+ _proto.onAfterClear = function onAfterClear() {
436
+ /* To be overriden */
437
+ }
438
+
470
439
  /**
471
440
  * This method initiates the update of the enabled state of the DataFieldForAction and the visible state of the DataFieldForIBN buttons.
472
441
  *
473
442
  * @param aTables Array of tables in the list report
474
443
  * @private
475
- */
476
- ;
477
-
444
+ */;
478
445
  _proto._updateTableActions = function _updateTableActions(aTables) {
479
446
  var aIBNActions = [];
480
447
  aTables.forEach(function (oTable) {
481
- aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions); // Update 'enabled' property of DataFieldForAction buttons on table toolbar
448
+ aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions);
449
+ // Update 'enabled' property of DataFieldForAction buttons on table toolbar
482
450
  // The same is also performed on Table selectionChange event
483
-
484
451
  var oInternalModelContext = oTable.getBindingContext("internal"),
485
- oActionOperationAvailableMap = JSON.parse(CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))),
486
- aSelectedContexts = oTable.getSelectedContexts();
452
+ oActionOperationAvailableMap = JSON.parse(CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))),
453
+ aSelectedContexts = oTable.getSelectedContexts();
487
454
  oInternalModelContext.setProperty("selectedContexts", aSelectedContexts);
488
455
  oInternalModelContext.setProperty("numberOfSelectedContexts", aSelectedContexts.length);
489
456
  TableHelper.handleTableDeleteEnablementForSideEffects(oTable, oInternalModelContext);
@@ -491,162 +458,126 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
491
458
  });
492
459
  CommonUtils.updateDataFieldForIBNButtonsVisibility(aIBNActions, this.getView());
493
460
  }
461
+
494
462
  /**
495
463
  * This method scrolls to a specific row on all the available tables.
496
464
  *
497
465
  * @function
498
466
  * @name sap.fe.templates.ListReport.ListReportController.controller#_scrollTablesToRow
499
467
  * @param sRowPath The path of the table row context to be scrolled to
500
- */
501
- ;
502
-
468
+ */;
503
469
  _proto._scrollTablesToRow = function _scrollTablesToRow(sRowPath) {
504
470
  this._getControls("table").forEach(function (oTable) {
505
471
  TableScroller.scrollTableToRow(oTable, sRowPath);
506
472
  });
507
473
  }
474
+
508
475
  /**
509
476
  * This method set the initial focus within the List Report according to the UX guide lines.
510
477
  *
511
478
  * @function
512
479
  * @name sap.fe.templates.ListReport.ListReportController.controller#_setInitialFocus
513
- */
514
- ;
515
-
480
+ */;
516
481
  _proto._setInitialFocus = function _setInitialFocus() {
517
482
  var dynamicPage = this._getDynamicListReportControl(),
518
- isHeaderExpanded = dynamicPage.getHeaderExpanded(),
519
- filterBar = this._getFilterBarControl();
520
-
483
+ isHeaderExpanded = dynamicPage.getHeaderExpanded(),
484
+ filterBar = this._getFilterBarControl();
521
485
  if (filterBar) {
522
486
  if (isHeaderExpanded) {
523
487
  //Enabling mandatory filter fields message dialog
524
488
  if (!filterBar.getShowMessages()) {
525
489
  filterBar.setShowMessages(true);
526
490
  }
527
-
528
491
  var firstEmptyMandatoryField = filterBar.getFilterItems().find(function (oFilterItem) {
529
492
  return oFilterItem.getRequired() && oFilterItem.getConditions().length === 0;
530
- }); //Focusing on the first empty mandatory filter field, or on the first filter field if the table data is loaded
531
-
493
+ });
494
+ //Focusing on the first empty mandatory filter field, or on the first filter field if the table data is loaded
532
495
  if (firstEmptyMandatoryField) {
533
496
  firstEmptyMandatoryField.focus();
534
497
  } else if (this._isInitLoadEnabled()) {
535
498
  filterBar.getFilterItems()[0].focus();
536
499
  } else {
537
500
  var _this$getView$byId;
538
-
539
501
  //Focusing on the Go button
540
502
  (_this$getView$byId = this.getView().byId("".concat(this._getFilterBarControlId(), "-btnSearch"))) === null || _this$getView$byId === void 0 ? void 0 : _this$getView$byId.focus();
541
503
  }
542
504
  } else if (this._isInitLoadEnabled()) {
543
505
  var _this$_getTable3;
544
-
545
506
  (_this$_getTable3 = this._getTable()) === null || _this$_getTable3 === void 0 ? void 0 : _this$_getTable3.focusRow(0);
546
507
  }
547
508
  } else {
548
509
  var _this$_getTable4;
549
-
550
510
  (_this$_getTable4 = this._getTable()) === null || _this$_getTable4 === void 0 ? void 0 : _this$_getTable4.focusRow(0);
551
511
  }
552
512
  };
553
-
554
513
  _proto._getPageTitleInformation = function _getPageTitleInformation() {
555
514
  var oManifestEntry = this.getAppComponent().getManifestEntry("sap.app");
556
515
  return {
557
516
  title: oManifestEntry.title,
558
- subtitle: oManifestEntry.appSubTitle || "",
517
+ subtitle: oManifestEntry.subTitle || "",
559
518
  intent: "",
560
519
  icon: ""
561
520
  };
562
521
  };
563
-
564
522
  _proto._getFilterBarControl = function _getFilterBarControl() {
565
523
  return this.getView().byId(this._getFilterBarControlId());
566
524
  };
567
-
568
525
  _proto._getDynamicListReportControl = function _getDynamicListReportControl() {
569
526
  return this.getView().byId(this._getDynamicListReportControlId());
570
527
  };
571
-
572
528
  _proto._getAdaptationFilterBarControl = function _getAdaptationFilterBarControl() {
573
529
  // If the adaptation filter bar is part of the DOM tree, the "Adapt Filter" dialog is open,
574
530
  // and we return the adaptation filter bar as an active control (visible for the user)
575
531
  var adaptationFilterBar = this._getFilterBarControl().getInbuiltFilter();
576
-
577
532
  return adaptationFilterBar !== null && adaptationFilterBar !== void 0 && adaptationFilterBar.getParent() ? adaptationFilterBar : undefined;
578
533
  };
579
-
580
534
  _proto._getSegmentedButton = function _getSegmentedButton(sControl) {
581
535
  var _ref;
582
-
583
536
  var sSegmentedButtonId = (_ref = sControl === "Chart" ? this.getChartControl() : this._getTable()) === null || _ref === void 0 ? void 0 : _ref.data("segmentedButtonId");
584
537
  return this.getView().byId(sSegmentedButtonId);
585
538
  };
586
-
587
539
  _proto._getControlFromPageModelProperty = function _getControlFromPageModelProperty(sPath) {
588
540
  var _this$_getPageModel;
589
-
590
541
  var controlId = (_this$_getPageModel = this._getPageModel()) === null || _this$_getPageModel === void 0 ? void 0 : _this$_getPageModel.getProperty(sPath);
591
542
  return controlId && this.getView().byId(controlId);
592
543
  };
593
-
594
- _proto._getPageModel = function _getPageModel() {
595
- var pageComponent = Component.getOwnerComponentFor(this.getView());
596
- return pageComponent.getModel("_pageModel");
597
- };
598
-
599
544
  _proto._getDynamicListReportControlId = function _getDynamicListReportControlId() {
600
545
  var _this$_getPageModel2;
601
-
602
546
  return ((_this$_getPageModel2 = this._getPageModel()) === null || _this$_getPageModel2 === void 0 ? void 0 : _this$_getPageModel2.getProperty("/dynamicListReportId")) || "";
603
547
  };
604
-
605
548
  _proto._getFilterBarControlId = function _getFilterBarControlId() {
606
549
  var _this$_getPageModel3;
607
-
608
550
  return ((_this$_getPageModel3 = this._getPageModel()) === null || _this$_getPageModel3 === void 0 ? void 0 : _this$_getPageModel3.getProperty("/filterBarId")) || "";
609
551
  };
610
-
611
552
  _proto.getChartControl = function getChartControl() {
612
553
  return this._getControlFromPageModelProperty("/singleChartId");
613
554
  };
614
-
615
555
  _proto._getVisualFilterBarControl = function _getVisualFilterBarControl() {
616
556
  var sVisualFilterBarId = StableIdHelper.generate(["visualFilter", this._getFilterBarControlId()]);
617
557
  return sVisualFilterBarId && this.getView().byId(sVisualFilterBarId);
618
558
  };
619
-
620
559
  _proto._getFilterBarVariantControl = function _getFilterBarVariantControl() {
621
560
  return this._getControlFromPageModelProperty("/variantManagement/id");
622
561
  };
623
-
624
562
  _proto._getMultiModeControl = function _getMultiModeControl() {
625
563
  return this.getView().byId("fe::TabMultipleMode::Control");
626
564
  };
627
-
628
565
  _proto._getTable = function _getTable() {
629
566
  if (this._isMultiMode()) {
630
567
  var _this$_getMultiModeCo2, _this$_getMultiModeCo3;
631
-
632
568
  var oControl = (_this$_getMultiModeCo2 = this._getMultiModeControl()) === null || _this$_getMultiModeCo2 === void 0 ? void 0 : (_this$_getMultiModeCo3 = _this$_getMultiModeCo2.getSelectedInnerControl()) === null || _this$_getMultiModeCo3 === void 0 ? void 0 : _this$_getMultiModeCo3.content;
633
569
  return oControl !== null && oControl !== void 0 && oControl.isA("sap.ui.mdc.Table") ? oControl : undefined;
634
570
  } else {
635
571
  return this._getControlFromPageModelProperty("/singleTableId");
636
572
  }
637
573
  };
638
-
639
574
  _proto._getControls = function _getControls(sKey) {
640
575
  var _this7 = this;
641
-
642
576
  if (this._isMultiMode()) {
643
577
  var aControls = [];
644
-
645
578
  var oTabMultiMode = this._getMultiModeControl().content;
646
-
647
579
  oTabMultiMode.getItems().forEach(function (oItem) {
648
580
  var oControl = _this7.getView().byId(oItem.getKey());
649
-
650
581
  if (oControl && sKey) {
651
582
  if (oItem.getKey().indexOf("fe::".concat(sKey)) > -1) {
652
583
  aControls.push(oControl);
@@ -661,119 +592,103 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
661
592
  return oChart ? [oChart] : [];
662
593
  } else {
663
594
  var oTable = this._getTable();
664
-
665
595
  return oTable ? [oTable] : [];
666
596
  }
667
597
  };
668
-
669
598
  _proto._getDefaultPath = function _getDefaultPath() {
670
599
  var _this$_getPageModel4;
671
-
672
600
  var defaultPath = ListReportTemplating.getDefaultPath(((_this$_getPageModel4 = this._getPageModel()) === null || _this$_getPageModel4 === void 0 ? void 0 : _this$_getPageModel4.getProperty("/views")) || []);
673
-
674
601
  switch (defaultPath) {
675
602
  case "primary":
676
603
  return TemplateContentView.Chart;
677
-
678
604
  case "secondary":
679
605
  return TemplateContentView.Table;
680
-
681
606
  case "both":
682
607
  default:
683
608
  return TemplateContentView.Hybrid;
684
609
  }
685
610
  }
611
+
686
612
  /**
687
613
  * Method to know if ListReport is configured with Multiple Table mode.
688
614
  *
689
615
  * @function
690
616
  * @name _isMultiMode
691
617
  * @returns Is Multiple Table mode set?
692
- */
693
- ;
694
-
618
+ */;
695
619
  _proto._isMultiMode = function _isMultiMode() {
696
620
  var _this$_getPageModel5;
697
-
698
621
  return !!((_this$_getPageModel5 = this._getPageModel()) !== null && _this$_getPageModel5 !== void 0 && _this$_getPageModel5.getProperty("/multiViewsControl"));
699
622
  }
623
+
700
624
  /**
701
625
  * Method to know if ListReport is configured to load data at start up.
702
626
  *
703
627
  * @function
704
628
  * @name _isInitLoadDisabled
705
629
  * @returns Is InitLoad enabled?
706
- */
707
- ;
708
-
630
+ */;
709
631
  _proto._isInitLoadEnabled = function _isInitLoadEnabled() {
710
632
  var initLoadMode = this.getView().getViewData().initialLoad;
711
633
  return initLoadMode === InitialLoadMode.Enabled;
712
634
  };
713
-
714
635
  _proto._hasMultiVisualizations = function _hasMultiVisualizations() {
715
636
  var _this$_getPageModel6;
716
-
717
637
  return (_this$_getPageModel6 = this._getPageModel()) === null || _this$_getPageModel6 === void 0 ? void 0 : _this$_getPageModel6.getProperty("/hasMultiVisualizations");
718
638
  }
639
+
719
640
  /**
720
641
  * Method to suspend search on the filter bar. The initial loading of data is disabled based on the manifest configuration InitLoad - Disabled/Auto.
721
642
  * It is enabled later when the view state is set, when it is possible to realize if there are default filters.
722
- */
723
- ;
724
-
643
+ */;
725
644
  _proto._disableInitLoad = function _disableInitLoad() {
726
- var filterBar = this._getFilterBarControl(); // check for filter bar hidden
727
-
728
-
645
+ var filterBar = this._getFilterBarControl();
646
+ // check for filter bar hidden
729
647
  if (filterBar) {
730
648
  filterBar.setSuspendSelection(true);
731
649
  }
732
650
  }
651
+
733
652
  /**
734
653
  * Method called by flex to determine if the applyAutomatically setting on the variant is valid.
735
654
  * Called only for Standard Variant and only when there is display text set for applyAutomatically (FE only sets it for Auto).
736
655
  *
737
656
  * @returns Boolean true if data should be loaded automatically, false otherwise
738
- */
739
- ;
740
-
657
+ */;
741
658
  _proto._applyAutomaticallyOnStandardVariant = function _applyAutomaticallyOnStandardVariant() {
742
659
  // We always return false and take care of it when view state is set
743
660
  return false;
744
661
  }
662
+
745
663
  /**
746
664
  * Configure the settings for initial load based on
747
665
  * - manifest setting initLoad - Enabled/Disabled/Auto
748
666
  * - user's setting of applyAutomatically on variant
749
667
  * - if there are default filters
750
668
  * We disable the filter bar search at the beginning and enable it when view state is set.
751
- */
752
- ;
753
-
669
+ */;
754
670
  _proto._setInitLoad = function _setInitLoad() {
755
671
  // if initLoad is Disabled or Auto, switch off filter bar search temporarily at start
756
672
  if (!this._isInitLoadEnabled()) {
757
673
  this._disableInitLoad();
758
- } // set hook for flex for when standard variant is set (at start or by user at runtime)
674
+ }
675
+ // set hook for flex for when standard variant is set (at start or by user at runtime)
759
676
  // required to override the user setting 'apply automatically' behaviour if there are no filters
760
-
761
-
762
677
  var variantManagementId = ListReportTemplating.getVariantBackReference(this.getView().getViewData(), this._getPageModel());
763
678
  var variantManagement = variantManagementId && this.getView().byId(variantManagementId);
764
-
765
679
  if (variantManagement) {
766
680
  variantManagement.registerApplyAutomaticallyOnStandardVariant(this._applyAutomaticallyOnStandardVariant.bind(this));
767
681
  }
768
682
  };
769
-
770
683
  _proto._setShareModel = function _setShareModel() {
771
684
  // TODO: deactivated for now - currently there is no _templPriv anymore, to be discussed
772
685
  // this method is currently not called anymore from the init method
773
- var fnGetUser = ObjectPath.get("sap.ushell.Container.getUser"); //var oManifest = this.getOwnerComponent().getAppComponent().getMetadata().getManifestEntry("sap.ui");
686
+
687
+ var fnGetUser = ObjectPath.get("sap.ushell.Container.getUser");
688
+ //var oManifest = this.getOwnerComponent().getAppComponent().getMetadata().getManifestEntry("sap.ui");
774
689
  //var sBookmarkIcon = (oManifest && oManifest.icons && oManifest.icons.icon) || "";
775
- //shareModel: Holds all the sharing relevant information and info used in XML view
776
690
 
691
+ //shareModel: Holds all the sharing relevant information and info used in XML view
777
692
  var oShareInfo = {
778
693
  bookmarkTitle: document.title,
779
694
  //To name the bookmark according to the app title.
@@ -781,7 +696,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
781
696
  var sHash = hasher.getHash();
782
697
  return sHash ? "#".concat(sHash) : window.location.href;
783
698
  },
784
-
785
699
  /*
786
700
  To be activated once the FLP shows the count - see comment above
787
701
  bookmarkServiceUrl: function() {
@@ -795,64 +709,53 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
795
709
  var oTemplatePrivateModel = this.getOwnerComponent().getModel("_templPriv");
796
710
  oTemplatePrivateModel.setProperty("/listReport/share", oShareInfo);
797
711
  }
712
+
798
713
  /**
799
714
  * Method to update the local UI model of the page with the fields that are not applicable to the filter bar (this is specific to the ALP scenario).
800
715
  *
801
716
  * @param oInternalModelContext The internal model context
802
717
  * @param oFilterBar MDC filter bar
803
- */
804
- ;
805
-
718
+ */;
806
719
  _proto._updateALPNotApplicableFields = function _updateALPNotApplicableFields(oInternalModelContext, oFilterBar) {
807
720
  var mCache = {};
808
-
809
721
  var ignoredFields = {},
810
- aTables = this._getControls("table"),
811
- aCharts = this._getControls("Chart");
812
-
722
+ aTables = this._getControls("table"),
723
+ aCharts = this._getControls("Chart");
813
724
  if (!aTables.length || !aCharts.length) {
814
725
  // If there's not a table and a chart, we're not in the ALP case
815
726
  return;
816
- } // For the moment, there's nothing for tables...
817
-
727
+ }
818
728
 
729
+ // For the moment, there's nothing for tables...
819
730
  aCharts.forEach(function (oChart) {
820
731
  var sChartEntityPath = oChart.data("targetCollectionPath"),
821
- sChartEntitySet = sChartEntityPath.slice(1),
822
- sCacheKey = "".concat(sChartEntitySet, "Chart");
823
-
732
+ sChartEntitySet = sChartEntityPath.slice(1),
733
+ sCacheKey = "".concat(sChartEntitySet, "Chart");
824
734
  if (!mCache[sCacheKey]) {
825
735
  mCache[sCacheKey] = FilterUtils.getNotApplicableFilters(oFilterBar, oChart);
826
736
  }
827
-
828
737
  ignoredFields[sCacheKey] = mCache[sCacheKey];
829
738
  });
830
739
  oInternalModelContext.setProperty("controls/ignoredFields", ignoredFields);
831
740
  };
832
-
833
741
  _proto._isFilterBarHidden = function _isFilterBarHidden() {
834
742
  return this.getView().getViewData().hideFilterBar;
835
743
  };
836
-
837
744
  _proto._getApplyAutomaticallyOnVariant = function _getApplyAutomaticallyOnVariant(VariantManagement, key) {
838
745
  if (!VariantManagement || !key) {
839
746
  return false;
840
747
  }
841
-
842
748
  var variants = VariantManagement.getVariants();
843
749
  var currentVariant = variants.find(function (variant) {
844
750
  return variant && variant.key === key;
845
751
  });
846
752
  return currentVariant && currentVariant.executeOnSelect || false;
847
753
  };
848
-
849
754
  _proto._shouldAutoTriggerSearch = function _shouldAutoTriggerSearch(oVM) {
850
755
  if (this.getView().getViewData().initialLoad === InitialLoadMode.Auto && (!oVM || oVM.getStandardVariantKey() === oVM.getCurrentVariantKey())) {
851
756
  var oFilterBar = this._getFilterBarControl();
852
-
853
757
  if (oFilterBar) {
854
758
  var oConditions = oFilterBar.getConditions();
855
-
856
759
  for (var sKey in oConditions) {
857
760
  // ignore filters starting with $ (e.g. $search, $editState)
858
761
  if (!sKey.startsWith("$") && Array.isArray(oConditions[sKey]) && oConditions[sKey].length) {
@@ -865,26 +768,21 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
865
768
  }
866
769
  }
867
770
  }
868
-
869
771
  return false;
870
772
  };
871
-
872
773
  _proto._updateTable = function _updateTable(oTable) {
873
774
  if (!oTable.isTableBound() || this.hasPendingChartChanges) {
874
775
  oTable.rebind();
875
776
  this.hasPendingChartChanges = false;
876
777
  }
877
778
  };
878
-
879
779
  _proto._updateChart = function _updateChart(oChart) {
880
780
  var oInnerChart = oChart.getControlDelegate()._getChart(oChart);
881
-
882
781
  if (!(oInnerChart && oInnerChart.isBound("data")) || this.hasPendingTableChanges) {
883
782
  oChart.getControlDelegate().rebind(oChart, oInnerChart.getBindingInfo("data"));
884
783
  this.hasPendingTableChanges = false;
885
784
  }
886
785
  };
887
-
888
786
  return ListReportController;
889
787
  }(PageController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "_routing", [_dec2], {
890
788
  configurable: true,
@@ -911,32 +809,27 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/fe/core/ActionRu
911
809
  enumerable: true,
912
810
  writable: true,
913
811
  initializer: null
914
- }), _descriptor6 = _applyDecoratedDescriptor(_class2.prototype, "editFlow", [_dec7], {
915
- configurable: true,
916
- enumerable: true,
917
- writable: true,
918
- initializer: null
919
- }), _descriptor7 = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec8], {
812
+ }), _descriptor6 = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec7], {
920
813
  configurable: true,
921
814
  enumerable: true,
922
815
  writable: true,
923
816
  initializer: null
924
- }), _descriptor8 = _applyDecoratedDescriptor(_class2.prototype, "kpiManagement", [_dec9], {
817
+ }), _descriptor7 = _applyDecoratedDescriptor(_class2.prototype, "kpiManagement", [_dec8], {
925
818
  configurable: true,
926
819
  enumerable: true,
927
820
  writable: true,
928
821
  initializer: null
929
- }), _descriptor9 = _applyDecoratedDescriptor(_class2.prototype, "placeholder", [_dec10], {
822
+ }), _descriptor8 = _applyDecoratedDescriptor(_class2.prototype, "placeholder", [_dec9], {
930
823
  configurable: true,
931
824
  enumerable: true,
932
825
  writable: true,
933
826
  initializer: null
934
- }), _descriptor10 = _applyDecoratedDescriptor(_class2.prototype, "massEdit", [_dec11], {
827
+ }), _descriptor9 = _applyDecoratedDescriptor(_class2.prototype, "massEdit", [_dec10], {
935
828
  configurable: true,
936
829
  enumerable: true,
937
830
  writable: true,
938
831
  initializer: null
939
- }), _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), _applyDecoratedDescriptor(_class2.prototype, "onViewNeedsRefresh", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onViewNeedsRefresh"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPendingFilters", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "onPendingFilters"), _class2.prototype)), _class2)) || _class);
832
+ }), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onViewNeedsRefresh", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "onViewNeedsRefresh"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPendingFilters", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onPendingFilters"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterClear", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterClear"), _class2.prototype)), _class2)) || _class);
940
833
  return ListReportController;
941
834
  }, false);
942
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZW1wbGF0ZUNvbnRlbnRWaWV3IiwiQ29yZUxpYnJhcnkiLCJJbml0aWFsTG9hZE1vZGUiLCJMaXN0UmVwb3J0Q29udHJvbGxlciIsImRlZmluZVVJNUNsYXNzIiwidXNpbmdFeHRlbnNpb24iLCJJbnRlcm5hbFJvdXRpbmciLCJvdmVycmlkZSIsIm9uQWZ0ZXJCaW5kaW5nIiwiZ2V0VmlldyIsImdldENvbnRyb2xsZXIiLCJfb25BZnRlckJpbmRpbmciLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldEVudGl0eVNldCIsImJhc2UiLCJnZXRDdXJyZW50RW50aXR5U2V0IiwiU2lkZUVmZmVjdHMiLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsIlNoYXJlIiwiU2hhcmVPdmVycmlkZXMiLCJFZGl0RmxvdyIsIkVkaXRGbG93T3ZlcnJpZGVzIiwiVmlld1N0YXRlIiwiVmlld1N0YXRlT3ZlcnJpZGVzIiwiS1BJTWFuYWdlbWVudCIsIlBsYWNlaG9sZGVyIiwiTWFzc0VkaXQiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsInByaXZhdGVFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsImhhbmRsZXJzIiwib25GaWx0ZXJTZWFyY2giLCJfZ2V0RmlsdGVyQmFyQ29udHJvbCIsInRyaWdnZXJTZWFyY2giLCJvbkZpbHRlcnNDaGFuZ2VkIiwib0V2ZW50Iiwib0ZpbHRlckJhciIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib25QZW5kaW5nRmlsdGVycyIsInNldFByb3BlcnR5IiwiZ2V0QXNzaWduZWRGaWx0ZXJzVGV4dCIsImZpbHRlcnNUZXh0IiwiZ2V0UGFyYW1ldGVyIiwib25WYXJpYW50U2VsZWN0ZWQiLCJvVk0iLCJnZXRTb3VyY2UiLCJjdXJyZW50VmFyaWFudEtleSIsIm9NdWx0aU1vZGVDb250cm9sIiwiX2dldE11bHRpTW9kZUNvbnRyb2wiLCJpbnZhbGlkYXRlQ29udGVudCIsInNldEZyZWV6ZUNvbnRlbnQiLCJzZXRUaW1lb3V0IiwiX3Nob3VsZEF1dG9UcmlnZ2VyU2VhcmNoIiwiX2dldEFwcGx5QXV0b21hdGljYWxseU9uVmFyaWFudCIsImdldEV4dGVuc2lvbkFQSSIsInVwZGF0ZUFwcFN0YXRlIiwib25WYXJpYW50U2F2ZWQiLCJvblNlYXJjaCIsIm9NZGNDaGFydCIsImdldENoYXJ0Q29udHJvbCIsImJIaWRlRHJhZnQiLCJGaWx0ZXJVdGlscyIsImdldEVkaXRTdGF0ZUlzSGlkZURyYWZ0IiwiZ2V0Q29uZGl0aW9ucyIsIl91cGRhdGVBTFBOb3RBcHBsaWNhYmxlRmllbGRzIiwib1BhZ2VJbnRlcm5hbE1vZGVsQ29udGV4dCIsInNUZW1wbGF0ZUNvbnRlbnRWaWV3IiwiZ2V0UHJvcGVydHkiLCJnZXRQYXRoIiwiQ2hhcnQiLCJoYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzIiwiVGFibGUiLCJoYXNQZW5kaW5nVGFibGVDaGFuZ2VzIiwiU3RhdGVVdGlsIiwicmV0cmlldmVFeHRlcm5hbFN0YXRlIiwidGhlbiIsIm9FeHRlcm5hbFN0YXRlIiwiZmlsdGVyQmFyQ29uZGl0aW9ucyIsImZpbHRlciIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJnZXRWaWV3RGF0YSIsImxpdmVNb2RlIiwic3lzdGVtIiwicGhvbmUiLCJvRHluYW1pY1BhZ2UiLCJfZ2V0RHluYW1pY0xpc3RSZXBvcnRDb250cm9sIiwic2V0SGVhZGVyRXhwYW5kZWQiLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJvQ29udHJvbGxlciIsInNPdXRib3VuZFRhcmdldCIsIm9Db250ZXh0Iiwic0NyZWF0ZVBhdGgiLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwib25DaGFydFNlbGVjdGlvbkNoYW5nZWQiLCJnZXRDb250ZW50Iiwib1RhYmxlIiwiX2dldFRhYmxlIiwiYURhdGEiLCJDaGFydFJ1bnRpbWUiLCJmblVwZGF0ZUNoYXJ0IiwiQ2hhcnRVdGlscyIsInNldENoYXJ0RmlsdGVycyIsInJlYmluZCIsIm9uU2VnbWVudGVkQnV0dG9uUHJlc3NlZCIsInNTZWxlY3RlZEtleSIsIm1QYXJhbWV0ZXJzIiwia2V5Iiwib0NoYXJ0Iiwib1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlIiwib25BZnRlclJlbmRlcmluZyIsImFJdGVtcyIsIm9TZWdtZW50ZWRCdXR0b24iLCJnZXRJdGVtcyIsImZvckVhY2giLCJvSXRlbSIsImdldEtleSIsImZvY3VzIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsIl9nZXRTZWdtZW50ZWRCdXR0b24iLCJhZGRFdmVudERlbGVnYXRlIiwiX3VwZGF0ZVRhYmxlIiwiX3VwZGF0ZUNoYXJ0IiwiSHlicmlkIiwib25GaWx0ZXJzU2VnbWVudGVkQnV0dG9uUHJlc3NlZCIsImlzQ29tcGFjdCIsInNldFZpc2libGUiLCJfZ2V0VmlzdWFsRmlsdGVyQmFyQ29udHJvbCIsIm9uU3RhdGVDaGFuZ2UiLCJvbkR5bmFtaWNQYWdlVGl0bGVTdGF0ZUNoYW5nZWQiLCJmaWx0ZXJCYXIiLCJnZXRTZWdtZW50ZWRCdXR0b24iLCJmb3JtYXR0ZXJzIiwic2V0QUxQQ29udHJvbE1lc3NhZ2VTdHJpcCIsImFJZ25vcmVkRmllbGRzIiwiYklzQ2hhcnQiLCJvQXBwbHlTdXBwb3J0ZWQiLCJzVGV4dCIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsImFJZ25vcmVkTGFiZWxzIiwiTWVzc2FnZVN0cmlwIiwiZ2V0TGFiZWxzIiwiZGF0YSIsIm9SZXNvdXJjZUJ1bmRsZSIsImJJc1NlYXJjaElnbm9yZWQiLCJlbmFibGVTZWFyY2giLCJnZXRBTFBUZXh0IiwiZ2V0VGV4dCIsIkRlbGVnYXRlVXRpbCIsImdldExvY2FsaXplZFRleHQiLCJleHRlbnNpb25BUEkiLCJFeHRlbnNpb25BUEkiLCJvbkluaXQiLCJQYWdlQ29udHJvbGxlciIsInByb3RvdHlwZSIsImFwcGx5IiwiX2hhc011bHRpVmlzdWFsaXphdGlvbnMiLCJhbHBDb250ZW50VmlldyIsIl9nZXREZWZhdWx0UGF0aCIsImRlc2t0b3AiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRSb3V0ZXJQcm94eSIsIndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbiIsIl9zZXRJbml0TG9hZCIsIm9uRXhpdCIsImRlc3Ryb3kiLCJhVGFibGVzIiwiX2dldENvbnRyb2xzIiwiRWRpdFN0YXRlIiwiaXNFZGl0U3RhdGVEaXJ0eSIsIm9UYWJsZUJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwiQ29tbW9uVXRpbHMiLCJfaXNGY2xFbmFibGVkIiwicmVmcmVzaCIsInNVcGRhdGVUaW1lciIsImZuVXBkYXRlVGFibGVBY3Rpb25zIiwiX3VwZGF0ZVRhYmxlQWN0aW9ucyIsImRldGFjaERhdGFSZWNlaXZlZCIsImF0dGFjaERhdGFSZWNlaXZlZCIsInNldEVkaXRTdGF0ZVByb2Nlc3NlZCIsInBhZ2VSZWFkeSIsIndhaXRGb3IiLCJnZXRBcHBTdGF0ZUhhbmRsZXIiLCJhcHBseUFwcFN0YXRlIiwib25CZWZvcmVSZW5kZXJpbmciLCJnZXRNb2RlbCIsImdldFJlc291cmNlQnVuZGxlIiwicmVzcG9uc2UiLCJzRW50aXR5U2V0IiwiZW50aXR5U2V0IiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJ1bmRlZmluZWQiLCJzZXROb0RhdGEiLCJvblBhZ2VSZWFkeSIsImZvcmNlRm9jdXMiLCJfc2V0SW5pdGlhbEZvY3VzIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwib25WaWV3TmVlZHNSZWZyZXNoIiwic2xpY2UiLCJhSUJOQWN0aW9ucyIsImdldElCTkFjdGlvbnMiLCJvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiSlNPTiIsInBhcnNlIiwiQ29tbW9uSGVscGVyIiwicGFyc2VDdXN0b21EYXRhIiwiZ2V0Q3VzdG9tRGF0YSIsImFTZWxlY3RlZENvbnRleHRzIiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIlRhYmxlSGVscGVyIiwiaGFuZGxlVGFibGVEZWxldGVFbmFibGVtZW50Rm9yU2lkZUVmZmVjdHMiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudCIsInVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5IiwiX3Njcm9sbFRhYmxlc1RvUm93Iiwic1Jvd1BhdGgiLCJUYWJsZVNjcm9sbGVyIiwic2Nyb2xsVGFibGVUb1JvdyIsImR5bmFtaWNQYWdlIiwiaXNIZWFkZXJFeHBhbmRlZCIsImdldEhlYWRlckV4cGFuZGVkIiwiZ2V0U2hvd01lc3NhZ2VzIiwic2V0U2hvd01lc3NhZ2VzIiwiZmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkIiwiZ2V0RmlsdGVySXRlbXMiLCJmaW5kIiwib0ZpbHRlckl0ZW0iLCJnZXRSZXF1aXJlZCIsIl9pc0luaXRMb2FkRW5hYmxlZCIsImJ5SWQiLCJfZ2V0RmlsdGVyQmFyQ29udHJvbElkIiwiZm9jdXNSb3ciLCJfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24iLCJvTWFuaWZlc3RFbnRyeSIsImdldE1hbmlmZXN0RW50cnkiLCJ0aXRsZSIsInN1YnRpdGxlIiwiYXBwU3ViVGl0bGUiLCJpbnRlbnQiLCJpY29uIiwiX2dldER5bmFtaWNMaXN0UmVwb3J0Q29udHJvbElkIiwiX2dldEFkYXB0YXRpb25GaWx0ZXJCYXJDb250cm9sIiwiYWRhcHRhdGlvbkZpbHRlckJhciIsImdldEluYnVpbHRGaWx0ZXIiLCJnZXRQYXJlbnQiLCJzQ29udHJvbCIsInNTZWdtZW50ZWRCdXR0b25JZCIsIl9nZXRDb250cm9sRnJvbVBhZ2VNb2RlbFByb3BlcnR5Iiwic1BhdGgiLCJjb250cm9sSWQiLCJfZ2V0UGFnZU1vZGVsIiwicGFnZUNvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwic1Zpc3VhbEZpbHRlckJhcklkIiwiU3RhYmxlSWRIZWxwZXIiLCJnZW5lcmF0ZSIsIl9nZXRGaWx0ZXJCYXJWYXJpYW50Q29udHJvbCIsIl9pc011bHRpTW9kZSIsIm9Db250cm9sIiwiZ2V0U2VsZWN0ZWRJbm5lckNvbnRyb2wiLCJjb250ZW50IiwiaXNBIiwic0tleSIsImFDb250cm9scyIsIm9UYWJNdWx0aU1vZGUiLCJpbmRleE9mIiwicHVzaCIsImRlZmF1bHRQYXRoIiwiTGlzdFJlcG9ydFRlbXBsYXRpbmciLCJnZXREZWZhdWx0UGF0aCIsImluaXRMb2FkTW9kZSIsImluaXRpYWxMb2FkIiwiRW5hYmxlZCIsIl9kaXNhYmxlSW5pdExvYWQiLCJzZXRTdXNwZW5kU2VsZWN0aW9uIiwiX2FwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50IiwidmFyaWFudE1hbmFnZW1lbnRJZCIsImdldFZhcmlhbnRCYWNrUmVmZXJlbmNlIiwidmFyaWFudE1hbmFnZW1lbnQiLCJyZWdpc3RlckFwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50IiwiYmluZCIsIl9zZXRTaGFyZU1vZGVsIiwiZm5HZXRVc2VyIiwiT2JqZWN0UGF0aCIsImdldCIsIm9TaGFyZUluZm8iLCJib29rbWFya1RpdGxlIiwiZG9jdW1lbnQiLCJib29rbWFya0N1c3RvbVVybCIsInNIYXNoIiwiaGFzaGVyIiwiZ2V0SGFzaCIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsImlzU2hhcmVJbkphbUFjdGl2ZSIsImlzSmFtQWN0aXZlIiwib1RlbXBsYXRlUHJpdmF0ZU1vZGVsIiwiZ2V0T3duZXJDb21wb25lbnQiLCJtQ2FjaGUiLCJpZ25vcmVkRmllbGRzIiwiYUNoYXJ0cyIsInNDaGFydEVudGl0eVBhdGgiLCJzQ2hhcnRFbnRpdHlTZXQiLCJzQ2FjaGVLZXkiLCJnZXROb3RBcHBsaWNhYmxlRmlsdGVycyIsIl9pc0ZpbHRlckJhckhpZGRlbiIsImhpZGVGaWx0ZXJCYXIiLCJWYXJpYW50TWFuYWdlbWVudCIsInZhcmlhbnRzIiwiZ2V0VmFyaWFudHMiLCJjdXJyZW50VmFyaWFudCIsInZhcmlhbnQiLCJleGVjdXRlT25TZWxlY3QiLCJBdXRvIiwiZ2V0U3RhbmRhcmRWYXJpYW50S2V5IiwiZ2V0Q3VycmVudFZhcmlhbnRLZXkiLCJvQ29uZGl0aW9ucyIsInN0YXJ0c1dpdGgiLCJzdGFuZGFyZFZhcmlhbnQiLCJpc1RhYmxlQm91bmQiLCJvSW5uZXJDaGFydCIsImdldENvbnRyb2xEZWxlZ2F0ZSIsIl9nZXRDaGFydCIsImlzQm91bmQiLCJnZXRCaW5kaW5nSW5mbyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTGlzdFJlcG9ydENvbnRyb2xsZXIuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgT2JqZWN0UGF0aCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9PYmplY3RQYXRoXCI7XG5pbXBvcnQgdHlwZSBEeW5hbWljUGFnZSBmcm9tIFwic2FwL2YvRHluYW1pY1BhZ2VcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCJzYXAvZmUvY29yZS9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgRWRpdEZsb3cgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0VkaXRGbG93XCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IEtQSU1hbmFnZW1lbnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0tQSU1hbmFnZW1lbnRcIjtcbmltcG9ydCBNYXNzRWRpdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWFzc0VkaXRcIjtcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGxhY2Vob2xkZXJcIjtcbmltcG9ydCBTaGFyZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2hhcmVcIjtcbmltcG9ydCBTaWRlRWZmZWN0cyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2lkZUVmZmVjdHNcIjtcbmltcG9ydCBWaWV3U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1ZpZXdTdGF0ZVwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9scy9GaWx0ZXJCYXJcIjtcbmltcG9ydCB7XG5cdGRlZmluZVVJNUNsYXNzLFxuXHRleHRlbnNpYmxlLFxuXHRmaW5hbEV4dGVuc2lvbixcblx0cHJpdmF0ZUV4dGVuc2lvbixcblx0cHVibGljRXh0ZW5zaW9uLFxuXHR1c2luZ0V4dGVuc2lvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgTWVzc2FnZVN0cmlwIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01lc3NhZ2VTdHJpcFwiO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0ICogYXMgU3RhYmxlSWRIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCBDb3JlTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IENoYXJ0UnVudGltZSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jaGFydC9DaGFydFJ1bnRpbWVcIjtcbmltcG9ydCBDaGFydFV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NoYXJ0L0NoYXJ0VXRpbHNcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgRGVsZWdhdGVVdGlsIGZyb20gXCJzYXAvZmUvbWFjcm9zL0RlbGVnYXRlVXRpbFwiO1xuaW1wb3J0IEZpbHRlclV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpbHRlci9GaWx0ZXJVdGlsc1wiO1xuaW1wb3J0IFRhYmxlSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlSGVscGVyXCI7XG5pbXBvcnQgTXVsdGlwbGVNb2RlQ29udHJvbCBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9MaXN0UmVwb3J0L2NvbnRyb2xzL011bHRpcGxlTW9kZUNvbnRyb2xcIjtcbmltcG9ydCBFeHRlbnNpb25BUEkgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvTGlzdFJlcG9ydC9FeHRlbnNpb25BUElcIjtcbmltcG9ydCBFZGl0Rmxvd092ZXJyaWRlcyBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9Sb290Q29udGFpbmVyL292ZXJyaWRlcy9FZGl0Rmxvd1wiO1xuaW1wb3J0IFRhYmxlU2Nyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvVGFibGVTY3JvbGxlclwiO1xuaW1wb3J0IHR5cGUgU2VnbWVudGVkQnV0dG9uIGZyb20gXCJzYXAvbS9TZWdtZW50ZWRCdXR0b25cIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB7IHN5c3RlbSB9IGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgU3RhdGVVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3AxM24vU3RhdGVVdGlsXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgaGFzaGVyIGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9oYXNoZXJcIjtcbmltcG9ydCB0eXBlIHsgVjRDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0ICogYXMgTGlzdFJlcG9ydFRlbXBsYXRpbmcgZnJvbSBcIi4vTGlzdFJlcG9ydFRlbXBsYXRpbmdcIjtcbmltcG9ydCBJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgU2hhcmVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9WaWV3U3RhdGVcIjtcblxuY29uc3QgVGVtcGxhdGVDb250ZW50VmlldyA9IENvcmVMaWJyYXJ5LlRlbXBsYXRlQ29udGVudFZpZXcsXG5cdEluaXRpYWxMb2FkTW9kZSA9IENvcmVMaWJyYXJ5LkluaXRpYWxMb2FkTW9kZTtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0Lkxpc3RSZXBvcnRDb250cm9sbGVyXCIpXG5jbGFzcyBMaXN0UmVwb3J0Q29udHJvbGxlciBleHRlbmRzIFBhZ2VDb250cm9sbGVyIHtcblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdEludGVybmFsUm91dGluZy5vdmVycmlkZSh7XG5cdFx0XHRvbkFmdGVyQmluZGluZzogZnVuY3Rpb24gKHRoaXM6IEludGVybmFsUm91dGluZykge1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIExpc3RSZXBvcnRDb250cm9sbGVyKS5fb25BZnRlckJpbmRpbmcoKTtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9yb3V0aW5nITogSW50ZXJuYWxSb3V0aW5nO1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0SW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoe1xuXHRcdFx0Z2V0RW50aXR5U2V0OiBmdW5jdGlvbiAodGhpczogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0cmV0dXJuICh0aGlzLmJhc2UgYXMgTGlzdFJlcG9ydENvbnRyb2xsZXIpLmdldEN1cnJlbnRFbnRpdHlTZXQoKTtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9pbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbjtcblx0QHVzaW5nRXh0ZW5zaW9uKFNpZGVFZmZlY3RzKVxuXHRzaWRlRWZmZWN0cyE6IFNpZGVFZmZlY3RzO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUpKVxuXHRpbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFNoYXJlLm92ZXJyaWRlKFNoYXJlT3ZlcnJpZGVzKSlcblx0c2hhcmUhOiBTaGFyZTtcblxuXHRAdXNpbmdFeHRlbnNpb24oRWRpdEZsb3cub3ZlcnJpZGUoRWRpdEZsb3dPdmVycmlkZXMpKVxuXHRlZGl0RmxvdyE6IEVkaXRGbG93O1xuXG5cdEB1c2luZ0V4dGVuc2lvbihWaWV3U3RhdGUub3ZlcnJpZGUoVmlld1N0YXRlT3ZlcnJpZGVzKSlcblx0dmlld1N0YXRlITogVmlld1N0YXRlO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihLUElNYW5hZ2VtZW50KVxuXHRrcGlNYW5hZ2VtZW50ITogS1BJTWFuYWdlbWVudDtcblx0QHVzaW5nRXh0ZW5zaW9uKFBsYWNlaG9sZGVyKVxuXHRwbGFjZWhvbGRlciE6IFBsYWNlaG9sZGVyO1xuXHRAdXNpbmdFeHRlbnNpb24oTWFzc0VkaXQpXG5cdG1hc3NFZGl0ITogTWFzc0VkaXQ7XG5cdHByb3RlY3RlZCBleHRlbnNpb25BUEk/OiBFeHRlbnNpb25BUEk7XG5cdHByaXZhdGUgZmlsdGVyQmFyQ29uZGl0aW9ucz86IGFueTtcblx0cHJpdmF0ZSBzVXBkYXRlVGltZXI/OiBhbnk7XG5cdHByaXZhdGUgb1Jlc291cmNlQnVuZGxlPzogUmVzb3VyY2VCdW5kbGU7XG5cdHByaXZhdGUgaGFzUGVuZGluZ0NoYXJ0Q2hhbmdlcz86IGJvb2xlYW47XG5cdHByaXZhdGUgaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcz86IGJvb2xlYW47XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEV4dGVuc2lvbkFQSSgpOiBFeHRlbnNpb25BUEkge1xuXHRcdGlmICghdGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJID0gbmV3IEV4dGVuc2lvbkFQSSh0aGlzKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXHR9XG5cblx0b25Jbml0KCkge1xuXHRcdFBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5vbkluaXQuYXBwbHkodGhpcyk7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhhc1BlbmRpbmdGaWx0ZXJzXCIsIHRydWUpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImFwcGxpZWRGaWx0ZXJzXCIsIFwiXCIpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhpZGVEcmFmdEluZm9cIiwgZmFsc2UpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInVvbVwiLCB7fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2NhbGVmYWN0b3JcIiwge30pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNjYWxlZmFjdG9yTnVtYmVyXCIsIHt9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjdXJyZW5jeVwiLCB7fSk7XG5cblx0XHRpZiAodGhpcy5faGFzTXVsdGlWaXN1YWxpemF0aW9ucygpKSB7XG5cdFx0XHRsZXQgYWxwQ29udGVudFZpZXcgPSB0aGlzLl9nZXREZWZhdWx0UGF0aCgpO1xuXHRcdFx0aWYgKCFzeXN0ZW0uZGVza3RvcCAmJiBhbHBDb250ZW50VmlldyA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5IeWJyaWQpIHtcblx0XHRcdFx0YWxwQ29udGVudFZpZXcgPSBUZW1wbGF0ZUNvbnRlbnRWaWV3LkNoYXJ0O1xuXHRcdFx0fVxuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiYWxwQ29udGVudFZpZXdcIiwgYWxwQ29udGVudFZpZXcpO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIGNvbmRpdGlvbnMgZnJvbSBmaWx0ZXIgYmFyXG5cdFx0Ly8gdGhpcyBpcyBsYXRlciB1c2VkIGJlZm9yZSBuYXZpZ2F0aW9uIHRvIGdldCBjb25kaXRpb25zIGFwcGxpZWQgb24gdGhlIGZpbHRlciBiYXJcblx0XHR0aGlzLmZpbHRlckJhckNvbmRpdGlvbnMgPSB7fTtcblxuXHRcdC8vIEFzIEFwcFN0YXRlSGFuZGxlci5hcHBseUFwcFN0YXRlIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBpdCB3aWxsXG5cdFx0Ly8gaGFwcGVuIGFmdGVyIHRoZSByb3V0ZU1hdGNoIGV2ZW50IGhhcyBiZWVuIHByb2Nlc3NlZCAob3RoZXJ3aXNlIHRoZSByb3V0ZXIgZ2V0cyBicm9rZW4pXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLndhaXRGb3JSb3V0ZU1hdGNoQmVmb3JlTmF2aWdhdGlvbigpO1xuXG5cdFx0Ly8gQ29uZmlndXJlIHRoZSBpbml0aWFsIGxvYWQgc2V0dGluZ3Ncblx0XHR0aGlzLl9zZXRJbml0TG9hZCgpO1xuXHR9XG5cblx0b25FeGl0KCkge1xuXHRcdGRlbGV0ZSB0aGlzLmZpbHRlckJhckNvbmRpdGlvbnM7XG5cdFx0aWYgKHRoaXMuZXh0ZW5zaW9uQVBJKSB7XG5cdFx0XHR0aGlzLmV4dGVuc2lvbkFQSS5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdGRlbGV0ZSB0aGlzLmV4dGVuc2lvbkFQSTtcblx0fVxuXG5cdF9vbkFmdGVyQmluZGluZygpIHtcblx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZ2V0Q29udHJvbHMoXCJ0YWJsZVwiKTtcblx0XHRpZiAoRWRpdFN0YXRlLmlzRWRpdFN0YXRlRGlydHkoKSkge1xuXHRcdFx0dGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpPy5pbnZhbGlkYXRlQ29udGVudCgpO1xuXHRcdFx0Y29uc3Qgb1RhYmxlQmluZGluZyA9IHRoaXMuX2dldFRhYmxlKCk/LmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGlmIChvVGFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdGlmIChDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdC8vIHRoZXJlIGlzIGFuIGlzc3VlIGlmIHdlIHVzZSBhIHRpbWVvdXQgd2l0aCBhIGtlcHQgYWxpdmUgY29udGV4dCB1c2VkIG9uIGFub3RoZXIgcGFnZVxuXHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICghdGhpcy5zVXBkYXRlVGltZXIpIHtcblx0XHRcdFx0XHRcdHRoaXMuc1VwZGF0ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5zVXBkYXRlVGltZXI7XG5cdFx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgYWN0aW9uIGVuYWJsZW1lbnQgYW5kIHZpc2liaWxpdHkgdXBvbiB0YWJsZSBkYXRhIHVwZGF0ZS5cblx0XHRcdFx0XHRjb25zdCBmblVwZGF0ZVRhYmxlQWN0aW9ucyA9ICgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzKTtcblx0XHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcuZGV0YWNoRGF0YVJlY2VpdmVkKGZuVXBkYXRlVGFibGVBY3Rpb25zKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdG9UYWJsZUJpbmRpbmcuYXR0YWNoRGF0YVJlY2VpdmVkKGZuVXBkYXRlVGFibGVBY3Rpb25zKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZVByb2Nlc3NlZCgpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5zVXBkYXRlVGltZXIpIHtcblx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzKTtcblx0XHR9XG5cblx0XHR0aGlzLnBhZ2VSZWFkeS53YWl0Rm9yKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0QXBwU3RhdGVIYW5kbGVyKCkuYXBwbHlBcHBTdGF0ZSgpKTtcblx0fVxuXG5cdG9uQmVmb3JlUmVuZGVyaW5nKCkge1xuXHRcdFBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcmluZy5hcHBseSh0aGlzKTtcblx0fVxuXG5cdG9uQWZ0ZXJSZW5kZXJpbmcoKSB7XG5cdFx0KCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpIGFzIFJlc291cmNlTW9kZWwpLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pXG5cdFx0XHQudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSA9IHJlc3BvbnNlO1xuXHRcdFx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZ2V0Q29udHJvbHMoKSBhcyBUYWJsZVtdO1xuXHRcdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdFx0XHRcdGNvbnN0IHNUZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJUX1RBQkxFX0FORF9DSEFSVF9OT19EQVRBX1RFWFRcIixcblx0XHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSBhcyBSZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogVGFibGUpIHtcblx0XHRcdFx0XHRvVGFibGUuc2V0Tm9EYXRhKHNUZXh0KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSByZXNvdXJjZSBidW5kbGVcIiwgb0Vycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25QYWdlUmVhZHkobVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGlmIChtUGFyYW1ldGVycy5mb3JjZUZvY3VzKSB7XG5cdFx0XHR0aGlzLl9zZXRJbml0aWFsRm9jdXMoKTtcblx0XHR9XG5cdFx0Ly8gUmVtb3ZlIHRoZSBoYW5kbGVyIG9uIGJhY2sgbmF2aWdhdGlvbiB0aGF0IGRpc3BsYXlzIERyYWZ0IGNvbmZpcm1hdGlvblxuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHVuZGVmaW5lZCk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBjb250ZW50IG9mIGEgbGlzdCByZXBvcnQgdmlldyBuZWVkcyB0byBiZSByZWZyZXNoZWQuXG5cdCAqIFRoaXMgaGFwcGVucyBlaXRoZXIgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSBvbiB0aGUgRmlsdGVyQmFyIGFuZCB0aGUgc2VhcmNoIGlzIHRyaWdnZXJlZCxcblx0ICogb3Igd2hlbiBhIHRhYiB3aXRoIGN1c3RvbSBjb250ZW50IGlzIHNlbGVjdGVkLlxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGluIGNhc2Ugb2YgY3VzdG9taXphdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIE1hcCBjb250YWluaW5nIHRoZSBmaWx0ZXIgY29uZGl0aW9ucyBvZiB0aGUgRmlsdGVyQmFyLCB0aGUgY3VycmVudFRhYklEXG5cdCAqIGFuZCB0aGUgdmlldyByZWZyZXNoIGNhdXNlICh0YWJDaGFuZ2VkIG9yIHNlYXJjaCkuXG5cdCAqIFRoZSBtYXAgbG9va3MgbGlrZSB0aGlzOlxuXHQgKiA8Y29kZT48cHJlPlxuXHQgKiBcdHtcblx0ICogXHRcdGZpbHRlckNvbmRpdGlvbnM6IHtcblx0ICogXHRcdFx0Q291bnRyeTogW1xuXHQgKiBcdFx0XHRcdHtcblx0ICogXHRcdFx0XHRcdG9wZXJhdG9yOiBcIkVRXCJcblx0ICpcdFx0XHRcdFx0dmFsaWRhdGVkOiBcIk5vdFZhbGlkYXRlZFwiXG5cdCAqXHRcdFx0XHRcdHZhbHVlczogW1wiR2VybWFueVwiLCAuLi5dXG5cdCAqIFx0XHRcdFx0fSxcblx0ICogXHRcdFx0XHQuLi5cblx0ICogXHRcdFx0XVxuXHQgKiBcdFx0XHQuLi5cblx0ICogXHRcdH0sXG5cdCAqXHRcdGN1cnJlbnRUYWJJZDogXCJmZTo6Q3VzdG9tVGFiOjp0YWIxXCIsXG5cdCAqXHRcdHJlZnJlc2hDYXVzZTogXCJ0YWJDaGFuZ2VkXCIgfCBcInNlYXJjaFwiXG5cdCAqXHR9XG5cdCAqIDwvcHJlPjwvY29kZT5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdG9uVmlld05lZWRzUmVmcmVzaChtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0LyogVG8gYmUgb3ZlcnJpZGVuICovXG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIGNhbGxlZCB3aGVuIGEgZmlsdGVyIG9yIHNlYXJjaCB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGluIHRoZSBGaWx0ZXJCYXIsXG5cdCAqIGJ1dCBoYXMgbm90IGJlZW4gdmFsaWRhdGVkIHlldCBieSB0aGUgZW5kIHVzZXIgKHdpdGggdGhlICdHbycgb3IgJ1NlYXJjaCcgYnV0dG9uKS5cblx0ICogVHlwaWNhbGx5LCB0aGUgY29udGVudCBvZiB0aGUgY3VycmVudCB0YWIgaXMgZ3JleWVkIG91dCB1bnRpbCB0aGUgZmlsdGVycyBhcmUgdmFsaWRhdGVkLlxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGluIGNhc2Ugb2YgY3VzdG9taXphdGlvbi5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblBlbmRpbmdGaWx0ZXJzKCkge1xuXHRcdC8qIFRvIGJlIG92ZXJyaWRlbiAqL1xuXHR9XG5cblx0Z2V0Q3VycmVudEVudGl0eVNldCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0VGFibGUoKT8uZGF0YShcInRhcmdldENvbGxlY3Rpb25QYXRoXCIpLnNsaWNlKDEpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGluaXRpYXRlcyB0aGUgdXBkYXRlIG9mIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBEYXRhRmllbGRGb3JBY3Rpb24gYW5kIHRoZSB2aXNpYmxlIHN0YXRlIG9mIHRoZSBEYXRhRmllbGRGb3JJQk4gYnV0dG9ucy5cblx0ICpcblx0ICogQHBhcmFtIGFUYWJsZXMgQXJyYXkgb2YgdGFibGVzIGluIHRoZSBsaXN0IHJlcG9ydFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3VwZGF0ZVRhYmxlQWN0aW9ucyhhVGFibGVzOiBhbnkpIHtcblx0XHRsZXQgYUlCTkFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0YVRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9UYWJsZSwgYUlCTkFjdGlvbnMpO1xuXHRcdFx0Ly8gVXBkYXRlICdlbmFibGVkJyBwcm9wZXJ0eSBvZiBEYXRhRmllbGRGb3JBY3Rpb24gYnV0dG9ucyBvbiB0YWJsZSB0b29sYmFyXG5cdFx0XHQvLyBUaGUgc2FtZSBpcyBhbHNvIHBlcmZvcm1lZCBvbiBUYWJsZSBzZWxlY3Rpb25DaGFuZ2UgZXZlbnRcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpLFxuXHRcdFx0XHRvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gSlNPTi5wYXJzZShcblx0XHRcdFx0XHRDb21tb25IZWxwZXIucGFyc2VDdXN0b21EYXRhKERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhKG9UYWJsZSwgXCJvcGVyYXRpb25BdmFpbGFibGVNYXBcIikpXG5cdFx0XHRcdCksXG5cdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzID0gb1RhYmxlLmdldFNlbGVjdGVkQ29udGV4dHMoKTtcblxuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2VsZWN0ZWRDb250ZXh0c1wiLCBhU2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgYVNlbGVjdGVkQ29udGV4dHMubGVuZ3RoKTtcblx0XHRcdFRhYmxlSGVscGVyLmhhbmRsZVRhYmxlRGVsZXRlRW5hYmxlbWVudEZvclNpZGVFZmZlY3RzKG9UYWJsZSwgb0ludGVybmFsTW9kZWxDb250ZXh0KTtcblx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAsIGFTZWxlY3RlZENvbnRleHRzLCBcInRhYmxlXCIpO1xuXHRcdH0pO1xuXHRcdENvbW1vblV0aWxzLnVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5KGFJQk5BY3Rpb25zLCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2Qgc2Nyb2xscyB0byBhIHNwZWNpZmljIHJvdyBvbiBhbGwgdGhlIGF2YWlsYWJsZSB0YWJsZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLkxpc3RSZXBvcnQuTGlzdFJlcG9ydENvbnRyb2xsZXIuY29udHJvbGxlciNfc2Nyb2xsVGFibGVzVG9Sb3dcblx0ICogQHBhcmFtIHNSb3dQYXRoIFRoZSBwYXRoIG9mIHRoZSB0YWJsZSByb3cgY29udGV4dCB0byBiZSBzY3JvbGxlZCB0b1xuXHQgKi9cblx0X3Njcm9sbFRhYmxlc1RvUm93KHNSb3dQYXRoOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9nZXRDb250cm9scyhcInRhYmxlXCIpLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRUYWJsZVNjcm9sbGVyLnNjcm9sbFRhYmxlVG9Sb3cob1RhYmxlLCBzUm93UGF0aCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2Qgc2V0IHRoZSBpbml0aWFsIGZvY3VzIHdpdGhpbiB0aGUgTGlzdCBSZXBvcnQgYWNjb3JkaW5nIHRvIHRoZSBVWCBndWlkZSBsaW5lcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5MaXN0UmVwb3J0Q29udHJvbGxlci5jb250cm9sbGVyI19zZXRJbml0aWFsRm9jdXNcblx0ICovXG5cdF9zZXRJbml0aWFsRm9jdXMoKSB7XG5cdFx0Y29uc3QgZHluYW1pY1BhZ2UgPSB0aGlzLl9nZXREeW5hbWljTGlzdFJlcG9ydENvbnRyb2woKSxcblx0XHRcdGlzSGVhZGVyRXhwYW5kZWQgPSBkeW5hbWljUGFnZS5nZXRIZWFkZXJFeHBhbmRlZCgpLFxuXHRcdFx0ZmlsdGVyQmFyID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpIGFzIGFueTtcblx0XHRpZiAoZmlsdGVyQmFyKSB7XG5cdFx0XHRpZiAoaXNIZWFkZXJFeHBhbmRlZCkge1xuXHRcdFx0XHQvL0VuYWJsaW5nIG1hbmRhdG9yeSBmaWx0ZXIgZmllbGRzIG1lc3NhZ2UgZGlhbG9nXG5cdFx0XHRcdGlmICghZmlsdGVyQmFyLmdldFNob3dNZXNzYWdlcygpKSB7XG5cdFx0XHRcdFx0ZmlsdGVyQmFyLnNldFNob3dNZXNzYWdlcyh0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBmaXJzdEVtcHR5TWFuZGF0b3J5RmllbGQgPSBmaWx0ZXJCYXIuZ2V0RmlsdGVySXRlbXMoKS5maW5kKGZ1bmN0aW9uIChvRmlsdGVySXRlbTogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9GaWx0ZXJJdGVtLmdldFJlcXVpcmVkKCkgJiYgb0ZpbHRlckl0ZW0uZ2V0Q29uZGl0aW9ucygpLmxlbmd0aCA9PT0gMDtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdC8vRm9jdXNpbmcgb24gdGhlIGZpcnN0IGVtcHR5IG1hbmRhdG9yeSBmaWx0ZXIgZmllbGQsIG9yIG9uIHRoZSBmaXJzdCBmaWx0ZXIgZmllbGQgaWYgdGhlIHRhYmxlIGRhdGEgaXMgbG9hZGVkXG5cdFx0XHRcdGlmIChmaXJzdEVtcHR5TWFuZGF0b3J5RmllbGQpIHtcblx0XHRcdFx0XHRmaXJzdEVtcHR5TWFuZGF0b3J5RmllbGQuZm9jdXMoKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl9pc0luaXRMb2FkRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0ZmlsdGVyQmFyLmdldEZpbHRlckl0ZW1zKClbMF0uZm9jdXMoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvL0ZvY3VzaW5nIG9uIHRoZSBHbyBidXR0b25cblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKS5ieUlkKGAke3RoaXMuX2dldEZpbHRlckJhckNvbnRyb2xJZCgpfS1idG5TZWFyY2hgKT8uZm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLl9pc0luaXRMb2FkRW5hYmxlZCgpKSB7XG5cdFx0XHRcdHRoaXMuX2dldFRhYmxlKCk/LmZvY3VzUm93KDApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9nZXRUYWJsZSgpPy5mb2N1c1JvdygwKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24oKSB7XG5cdFx0Y29uc3Qgb01hbmlmZXN0RW50cnkgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAuYXBwXCIpO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0aXRsZTogb01hbmlmZXN0RW50cnkudGl0bGUsXG5cdFx0XHRzdWJ0aXRsZTogb01hbmlmZXN0RW50cnkuYXBwU3ViVGl0bGUgfHwgXCJcIixcblx0XHRcdGludGVudDogXCJcIixcblx0XHRcdGljb246IFwiXCJcblx0XHR9O1xuXHR9XG5cblx0X2dldEZpbHRlckJhckNvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQodGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbElkKCkpIGFzIEZpbHRlckJhcjtcblx0fVxuXG5cdF9nZXREeW5hbWljTGlzdFJlcG9ydENvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQodGhpcy5fZ2V0RHluYW1pY0xpc3RSZXBvcnRDb250cm9sSWQoKSkgYXMgRHluYW1pY1BhZ2U7XG5cdH1cblxuXHRfZ2V0QWRhcHRhdGlvbkZpbHRlckJhckNvbnRyb2woKSB7XG5cdFx0Ly8gSWYgdGhlIGFkYXB0YXRpb24gZmlsdGVyIGJhciBpcyBwYXJ0IG9mIHRoZSBET00gdHJlZSwgdGhlIFwiQWRhcHQgRmlsdGVyXCIgZGlhbG9nIGlzIG9wZW4sXG5cdFx0Ly8gYW5kIHdlIHJldHVybiB0aGUgYWRhcHRhdGlvbiBmaWx0ZXIgYmFyIGFzIGFuIGFjdGl2ZSBjb250cm9sICh2aXNpYmxlIGZvciB0aGUgdXNlcilcblx0XHRjb25zdCBhZGFwdGF0aW9uRmlsdGVyQmFyID0gKHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKSBhcyBhbnkpLmdldEluYnVpbHRGaWx0ZXIoKTtcblx0XHRyZXR1cm4gYWRhcHRhdGlvbkZpbHRlckJhcj8uZ2V0UGFyZW50KCkgPyBhZGFwdGF0aW9uRmlsdGVyQmFyIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0X2dldFNlZ21lbnRlZEJ1dHRvbihzQ29udHJvbDogYW55KSB7XG5cdFx0Y29uc3Qgc1NlZ21lbnRlZEJ1dHRvbklkID0gKHNDb250cm9sID09PSBcIkNoYXJ0XCIgPyB0aGlzLmdldENoYXJ0Q29udHJvbCgpIDogdGhpcy5fZ2V0VGFibGUoKSk/LmRhdGEoXCJzZWdtZW50ZWRCdXR0b25JZFwiKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZChzU2VnbWVudGVkQnV0dG9uSWQpO1xuXHR9XG5cblx0X2dldENvbnRyb2xGcm9tUGFnZU1vZGVsUHJvcGVydHkoc1BhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IGNvbnRyb2xJZCA9IHRoaXMuX2dldFBhZ2VNb2RlbCgpPy5nZXRQcm9wZXJ0eShzUGF0aCk7XG5cdFx0cmV0dXJuIGNvbnRyb2xJZCAmJiB0aGlzLmdldFZpZXcoKS5ieUlkKGNvbnRyb2xJZCk7XG5cdH1cblxuXHRfZ2V0UGFnZU1vZGVsKCk6IEpTT05Nb2RlbCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgcGFnZUNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzLmdldFZpZXcoKSkgYXMgYW55O1xuXHRcdHJldHVybiBwYWdlQ29tcG9uZW50LmdldE1vZGVsKFwiX3BhZ2VNb2RlbFwiKTtcblx0fVxuXG5cdF9nZXREeW5hbWljTGlzdFJlcG9ydENvbnRyb2xJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLl9nZXRQYWdlTW9kZWwoKT8uZ2V0UHJvcGVydHkoXCIvZHluYW1pY0xpc3RSZXBvcnRJZFwiKSB8fCBcIlwiO1xuXHR9XG5cblx0X2dldEZpbHRlckJhckNvbnRyb2xJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLl9nZXRQYWdlTW9kZWwoKT8uZ2V0UHJvcGVydHkoXCIvZmlsdGVyQmFySWRcIikgfHwgXCJcIjtcblx0fVxuXG5cdGdldENoYXJ0Q29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0Q29udHJvbEZyb21QYWdlTW9kZWxQcm9wZXJ0eShcIi9zaW5nbGVDaGFydElkXCIpO1xuXHR9XG5cblx0X2dldFZpc3VhbEZpbHRlckJhckNvbnRyb2woKSB7XG5cdFx0Y29uc3Qgc1Zpc3VhbEZpbHRlckJhcklkID0gU3RhYmxlSWRIZWxwZXIuZ2VuZXJhdGUoW1widmlzdWFsRmlsdGVyXCIsIHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2xJZCgpXSk7XG5cdFx0cmV0dXJuIHNWaXN1YWxGaWx0ZXJCYXJJZCAmJiB0aGlzLmdldFZpZXcoKS5ieUlkKHNWaXN1YWxGaWx0ZXJCYXJJZCk7XG5cdH1cblx0X2dldEZpbHRlckJhclZhcmlhbnRDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLl9nZXRDb250cm9sRnJvbVBhZ2VNb2RlbFByb3BlcnR5KFwiL3ZhcmlhbnRNYW5hZ2VtZW50L2lkXCIpO1xuXHR9XG5cblx0X2dldE11bHRpTW9kZUNvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQoXCJmZTo6VGFiTXVsdGlwbGVNb2RlOjpDb250cm9sXCIpIGFzIE11bHRpcGxlTW9kZUNvbnRyb2w7XG5cdH1cblxuXHRfZ2V0VGFibGUoKTogVGFibGUgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9pc011bHRpTW9kZSgpKSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbCA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKT8uZ2V0U2VsZWN0ZWRJbm5lckNvbnRyb2woKT8uY29udGVudDtcblx0XHRcdHJldHVybiBvQ29udHJvbD8uaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSA/IChvQ29udHJvbCBhcyBUYWJsZSkgOiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9nZXRDb250cm9sRnJvbVBhZ2VNb2RlbFByb3BlcnR5KFwiL3NpbmdsZVRhYmxlSWRcIikgYXMgVGFibGU7XG5cdFx0fVxuXHR9XG5cdF9nZXRDb250cm9scyhzS2V5PzogYW55KSB7XG5cdFx0aWYgKHRoaXMuX2lzTXVsdGlNb2RlKCkpIHtcblx0XHRcdGNvbnN0IGFDb250cm9sczogYW55W10gPSBbXTtcblx0XHRcdGNvbnN0IG9UYWJNdWx0aU1vZGUgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCkuY29udGVudDtcblx0XHRcdG9UYWJNdWx0aU1vZGUuZ2V0SXRlbXMoKS5mb3JFYWNoKChvSXRlbTogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChvSXRlbS5nZXRLZXkoKSk7XG5cdFx0XHRcdGlmIChvQ29udHJvbCAmJiBzS2V5KSB7XG5cdFx0XHRcdFx0aWYgKG9JdGVtLmdldEtleSgpLmluZGV4T2YoYGZlOjoke3NLZXl9YCkgPiAtMSkge1xuXHRcdFx0XHRcdFx0YUNvbnRyb2xzLnB1c2gob0NvbnRyb2wpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChvQ29udHJvbCAhPT0gdW5kZWZpbmVkICYmIG9Db250cm9sICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0YUNvbnRyb2xzLnB1c2gob0NvbnRyb2wpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBhQ29udHJvbHM7XG5cdFx0fSBlbHNlIGlmIChzS2V5ID09PSBcIkNoYXJ0XCIpIHtcblx0XHRcdGNvbnN0IG9DaGFydCA9IHRoaXMuZ2V0Q2hhcnRDb250cm9sKCk7XG5cdFx0XHRyZXR1cm4gb0NoYXJ0ID8gW29DaGFydF0gOiBbXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb1RhYmxlID0gdGhpcy5fZ2V0VGFibGUoKTtcblx0XHRcdHJldHVybiBvVGFibGUgPyBbb1RhYmxlXSA6IFtdO1xuXHRcdH1cblx0fVxuXG5cdF9nZXREZWZhdWx0UGF0aCgpIHtcblx0XHRjb25zdCBkZWZhdWx0UGF0aCA9IExpc3RSZXBvcnRUZW1wbGF0aW5nLmdldERlZmF1bHRQYXRoKHRoaXMuX2dldFBhZ2VNb2RlbCgpPy5nZXRQcm9wZXJ0eShcIi92aWV3c1wiKSB8fCBbXSk7XG5cdFx0c3dpdGNoIChkZWZhdWx0UGF0aCkge1xuXHRcdFx0Y2FzZSBcInByaW1hcnlcIjpcblx0XHRcdFx0cmV0dXJuIFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQ7XG5cdFx0XHRjYXNlIFwic2Vjb25kYXJ5XCI6XG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZUNvbnRlbnRWaWV3LlRhYmxlO1xuXHRcdFx0Y2FzZSBcImJvdGhcIjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZUNvbnRlbnRWaWV3Lkh5YnJpZDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGtub3cgaWYgTGlzdFJlcG9ydCBpcyBjb25maWd1cmVkIHdpdGggTXVsdGlwbGUgVGFibGUgbW9kZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9pc011bHRpTW9kZVxuXHQgKiBAcmV0dXJucyBJcyBNdWx0aXBsZSBUYWJsZSBtb2RlIHNldD9cblx0ICovXG5cdF9pc011bHRpTW9kZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISF0aGlzLl9nZXRQYWdlTW9kZWwoKT8uZ2V0UHJvcGVydHkoXCIvbXVsdGlWaWV3c0NvbnRyb2xcIik7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGtub3cgaWYgTGlzdFJlcG9ydCBpcyBjb25maWd1cmVkIHRvIGxvYWQgZGF0YSBhdCBzdGFydCB1cC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9pc0luaXRMb2FkRGlzYWJsZWRcblx0ICogQHJldHVybnMgSXMgSW5pdExvYWQgZW5hYmxlZD9cblx0ICovXG5cdF9pc0luaXRMb2FkRW5hYmxlZCgpOiBib29sZWFuIHtcblx0XHRjb25zdCBpbml0TG9hZE1vZGUgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmluaXRpYWxMb2FkO1xuXHRcdHJldHVybiBpbml0TG9hZE1vZGUgPT09IEluaXRpYWxMb2FkTW9kZS5FbmFibGVkO1xuXHR9XG5cblx0X2hhc011bHRpVmlzdWFsaXphdGlvbnMoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2dldFBhZ2VNb2RlbCgpPy5nZXRQcm9wZXJ0eShcIi9oYXNNdWx0aVZpc3VhbGl6YXRpb25zXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBzdXNwZW5kIHNlYXJjaCBvbiB0aGUgZmlsdGVyIGJhci4gVGhlIGluaXRpYWwgbG9hZGluZyBvZiBkYXRhIGlzIGRpc2FibGVkIGJhc2VkIG9uIHRoZSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIEluaXRMb2FkIC0gRGlzYWJsZWQvQXV0by5cblx0ICogSXQgaXMgZW5hYmxlZCBsYXRlciB3aGVuIHRoZSB2aWV3IHN0YXRlIGlzIHNldCwgd2hlbiBpdCBpcyBwb3NzaWJsZSB0byByZWFsaXplIGlmIHRoZXJlIGFyZSBkZWZhdWx0IGZpbHRlcnMuXG5cdCAqL1xuXHRfZGlzYWJsZUluaXRMb2FkKCkge1xuXHRcdGNvbnN0IGZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHQvLyBjaGVjayBmb3IgZmlsdGVyIGJhciBoaWRkZW5cblx0XHRpZiAoZmlsdGVyQmFyKSB7XG5cdFx0XHRmaWx0ZXJCYXIuc2V0U3VzcGVuZFNlbGVjdGlvbih0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIGNhbGxlZCBieSBmbGV4IHRvIGRldGVybWluZSBpZiB0aGUgYXBwbHlBdXRvbWF0aWNhbGx5IHNldHRpbmcgb24gdGhlIHZhcmlhbnQgaXMgdmFsaWQuXG5cdCAqIENhbGxlZCBvbmx5IGZvciBTdGFuZGFyZCBWYXJpYW50IGFuZCBvbmx5IHdoZW4gdGhlcmUgaXMgZGlzcGxheSB0ZXh0IHNldCBmb3IgYXBwbHlBdXRvbWF0aWNhbGx5IChGRSBvbmx5IHNldHMgaXQgZm9yIEF1dG8pLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBCb29sZWFuIHRydWUgaWYgZGF0YSBzaG91bGQgYmUgbG9hZGVkIGF1dG9tYXRpY2FsbHksIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0X2FwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50KCkge1xuXHRcdC8vIFdlIGFsd2F5cyByZXR1cm4gZmFsc2UgYW5kIHRha2UgY2FyZSBvZiBpdCB3aGVuIHZpZXcgc3RhdGUgaXMgc2V0XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbmZpZ3VyZSB0aGUgc2V0dGluZ3MgZm9yIGluaXRpYWwgbG9hZCBiYXNlZCBvblxuXHQgKiAtIG1hbmlmZXN0IHNldHRpbmcgaW5pdExvYWQgLSBFbmFibGVkL0Rpc2FibGVkL0F1dG9cblx0ICogLSB1c2VyJ3Mgc2V0dGluZyBvZiBhcHBseUF1dG9tYXRpY2FsbHkgb24gdmFyaWFudFxuXHQgKiAtIGlmIHRoZXJlIGFyZSBkZWZhdWx0IGZpbHRlcnNcblx0ICogV2UgZGlzYWJsZSB0aGUgZmlsdGVyIGJhciBzZWFyY2ggYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5hYmxlIGl0IHdoZW4gdmlldyBzdGF0ZSBpcyBzZXQuXG5cdCAqL1xuXHRfc2V0SW5pdExvYWQoKSB7XG5cdFx0Ly8gaWYgaW5pdExvYWQgaXMgRGlzYWJsZWQgb3IgQXV0bywgc3dpdGNoIG9mZiBmaWx0ZXIgYmFyIHNlYXJjaCB0ZW1wb3JhcmlseSBhdCBzdGFydFxuXHRcdGlmICghdGhpcy5faXNJbml0TG9hZEVuYWJsZWQoKSkge1xuXHRcdFx0dGhpcy5fZGlzYWJsZUluaXRMb2FkKCk7XG5cdFx0fVxuXHRcdC8vIHNldCBob29rIGZvciBmbGV4IGZvciB3aGVuIHN0YW5kYXJkIHZhcmlhbnQgaXMgc2V0IChhdCBzdGFydCBvciBieSB1c2VyIGF0IHJ1bnRpbWUpXG5cdFx0Ly8gcmVxdWlyZWQgdG8gb3ZlcnJpZGUgdGhlIHVzZXIgc2V0dGluZyAnYXBwbHkgYXV0b21hdGljYWxseScgYmVoYXZpb3VyIGlmIHRoZXJlIGFyZSBubyBmaWx0ZXJzXG5cdFx0Y29uc3QgdmFyaWFudE1hbmFnZW1lbnRJZDogYW55ID0gTGlzdFJlcG9ydFRlbXBsYXRpbmcuZ2V0VmFyaWFudEJhY2tSZWZlcmVuY2UodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSwgdGhpcy5fZ2V0UGFnZU1vZGVsKCkpO1xuXHRcdGNvbnN0IHZhcmlhbnRNYW5hZ2VtZW50ID0gdmFyaWFudE1hbmFnZW1lbnRJZCAmJiB0aGlzLmdldFZpZXcoKS5ieUlkKHZhcmlhbnRNYW5hZ2VtZW50SWQpO1xuXHRcdGlmICh2YXJpYW50TWFuYWdlbWVudCkge1xuXHRcdFx0dmFyaWFudE1hbmFnZW1lbnQucmVnaXN0ZXJBcHBseUF1dG9tYXRpY2FsbHlPblN0YW5kYXJkVmFyaWFudCh0aGlzLl9hcHBseUF1dG9tYXRpY2FsbHlPblN0YW5kYXJkVmFyaWFudC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdH1cblxuXHRfc2V0U2hhcmVNb2RlbCgpIHtcblx0XHQvLyBUT0RPOiBkZWFjdGl2YXRlZCBmb3Igbm93IC0gY3VycmVudGx5IHRoZXJlIGlzIG5vIF90ZW1wbFByaXYgYW55bW9yZSwgdG8gYmUgZGlzY3Vzc2VkXG5cdFx0Ly8gdGhpcyBtZXRob2QgaXMgY3VycmVudGx5IG5vdCBjYWxsZWQgYW55bW9yZSBmcm9tIHRoZSBpbml0IG1ldGhvZFxuXG5cdFx0Y29uc3QgZm5HZXRVc2VyID0gT2JqZWN0UGF0aC5nZXQoXCJzYXAudXNoZWxsLkNvbnRhaW5lci5nZXRVc2VyXCIpO1xuXHRcdC8vdmFyIG9NYW5pZmVzdCA9IHRoaXMuZ2V0T3duZXJDb21wb25lbnQoKS5nZXRBcHBDb21wb25lbnQoKS5nZXRNZXRhZGF0YSgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAudWlcIik7XG5cdFx0Ly92YXIgc0Jvb2ttYXJrSWNvbiA9IChvTWFuaWZlc3QgJiYgb01hbmlmZXN0Lmljb25zICYmIG9NYW5pZmVzdC5pY29ucy5pY29uKSB8fCBcIlwiO1xuXG5cdFx0Ly9zaGFyZU1vZGVsOiBIb2xkcyBhbGwgdGhlIHNoYXJpbmcgcmVsZXZhbnQgaW5mb3JtYXRpb24gYW5kIGluZm8gdXNlZCBpbiBYTUwgdmlld1xuXHRcdGNvbnN0IG9TaGFyZUluZm8gPSB7XG5cdFx0XHRib29rbWFya1RpdGxlOiBkb2N1bWVudC50aXRsZSwgLy9UbyBuYW1lIHRoZSBib29rbWFyayBhY2NvcmRpbmcgdG8gdGhlIGFwcCB0aXRsZS5cblx0XHRcdGJvb2ttYXJrQ3VzdG9tVXJsOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbnN0IHNIYXNoID0gaGFzaGVyLmdldEhhc2goKTtcblx0XHRcdFx0cmV0dXJuIHNIYXNoID8gYCMke3NIYXNofWAgOiB3aW5kb3cubG9jYXRpb24uaHJlZjtcblx0XHRcdH0sXG5cdFx0XHQvKlxuXHRcdFx0XHRcdFx0XHRUbyBiZSBhY3RpdmF0ZWQgb25jZSB0aGUgRkxQIHNob3dzIHRoZSBjb3VudCAtIHNlZSBjb21tZW50IGFib3ZlXG5cdFx0XHRcdFx0XHRcdGJvb2ttYXJrU2VydmljZVVybDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly92YXIgb1RhYmxlID0gb1RhYmxlLmdldElubmVyVGFibGUoKTsgb1RhYmxlIGlzIGFscmVhZHkgdGhlIHNhcC5mZSB0YWJsZSAoYnV0IG5vdCB0aGUgaW5uZXIgb25lKVxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIHNob3VsZCB1c2UgdGFibGUuZ2V0TGlzdEJpbmRpbmdJbmZvIGluc3RlYWQgb2YgdGhlIGJpbmRpbmdcblx0XHRcdFx0XHRcdFx0XHR2YXIgb0JpbmRpbmcgPSBvVGFibGUuZ2V0QmluZGluZyhcInJvd3NcIikgfHwgb1RhYmxlLmdldEJpbmRpbmcoXCJpdGVtc1wiKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0JpbmRpbmcgPyBmbkdldERvd25sb2FkVXJsKG9CaW5kaW5nKSA6IFwiXCI7XG5cdFx0XHRcdFx0XHRcdH0sKi9cblx0XHRcdGlzU2hhcmVJbkphbUFjdGl2ZTogISFmbkdldFVzZXIgJiYgZm5HZXRVc2VyKCkuaXNKYW1BY3RpdmUoKVxuXHRcdH07XG5cblx0XHRjb25zdCBvVGVtcGxhdGVQcml2YXRlTW9kZWwgPSB0aGlzLmdldE93bmVyQ29tcG9uZW50KCkuZ2V0TW9kZWwoXCJfdGVtcGxQcml2XCIpIGFzIEpTT05Nb2RlbDtcblx0XHRvVGVtcGxhdGVQcml2YXRlTW9kZWwuc2V0UHJvcGVydHkoXCIvbGlzdFJlcG9ydC9zaGFyZVwiLCBvU2hhcmVJbmZvKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gdXBkYXRlIHRoZSBsb2NhbCBVSSBtb2RlbCBvZiB0aGUgcGFnZSB3aXRoIHRoZSBmaWVsZHMgdGhhdCBhcmUgbm90IGFwcGxpY2FibGUgdG8gdGhlIGZpbHRlciBiYXIgKHRoaXMgaXMgc3BlY2lmaWMgdG8gdGhlIEFMUCBzY2VuYXJpbykuXG5cdCAqXG5cdCAqIEBwYXJhbSBvSW50ZXJuYWxNb2RlbENvbnRleHQgVGhlIGludGVybmFsIG1vZGVsIGNvbnRleHRcblx0ICogQHBhcmFtIG9GaWx0ZXJCYXIgTURDIGZpbHRlciBiYXJcblx0ICovXG5cdF91cGRhdGVBTFBOb3RBcHBsaWNhYmxlRmllbGRzKG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsIG9GaWx0ZXJCYXI6IEZpbHRlckJhcikge1xuXHRcdGNvbnN0IG1DYWNoZTogYW55ID0ge307XG5cdFx0Y29uc3QgaWdub3JlZEZpZWxkczogYW55ID0ge30sXG5cdFx0XHRhVGFibGVzID0gdGhpcy5fZ2V0Q29udHJvbHMoXCJ0YWJsZVwiKSxcblx0XHRcdGFDaGFydHMgPSB0aGlzLl9nZXRDb250cm9scyhcIkNoYXJ0XCIpO1xuXG5cdFx0aWYgKCFhVGFibGVzLmxlbmd0aCB8fCAhYUNoYXJ0cy5sZW5ndGgpIHtcblx0XHRcdC8vIElmIHRoZXJlJ3Mgbm90IGEgdGFibGUgYW5kIGEgY2hhcnQsIHdlJ3JlIG5vdCBpbiB0aGUgQUxQIGNhc2Vcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGb3IgdGhlIG1vbWVudCwgdGhlcmUncyBub3RoaW5nIGZvciB0YWJsZXMuLi5cblx0XHRhQ2hhcnRzLmZvckVhY2goZnVuY3Rpb24gKG9DaGFydDogYW55KSB7XG5cdFx0XHRjb25zdCBzQ2hhcnRFbnRpdHlQYXRoID0gb0NoYXJ0LmRhdGEoXCJ0YXJnZXRDb2xsZWN0aW9uUGF0aFwiKSxcblx0XHRcdFx0c0NoYXJ0RW50aXR5U2V0ID0gc0NoYXJ0RW50aXR5UGF0aC5zbGljZSgxKSxcblx0XHRcdFx0c0NhY2hlS2V5ID0gYCR7c0NoYXJ0RW50aXR5U2V0fUNoYXJ0YDtcblx0XHRcdGlmICghbUNhY2hlW3NDYWNoZUtleV0pIHtcblx0XHRcdFx0bUNhY2hlW3NDYWNoZUtleV0gPSBGaWx0ZXJVdGlscy5nZXROb3RBcHBsaWNhYmxlRmlsdGVycyhvRmlsdGVyQmFyLCBvQ2hhcnQpO1xuXHRcdFx0fVxuXHRcdFx0aWdub3JlZEZpZWxkc1tzQ2FjaGVLZXldID0gbUNhY2hlW3NDYWNoZUtleV07XG5cdFx0fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY29udHJvbHMvaWdub3JlZEZpZWxkc1wiLCBpZ25vcmVkRmllbGRzKTtcblx0fVxuXG5cdF9pc0ZpbHRlckJhckhpZGRlbigpIHtcblx0XHRyZXR1cm4gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5oaWRlRmlsdGVyQmFyO1xuXHR9XG5cblx0X2dldEFwcGx5QXV0b21hdGljYWxseU9uVmFyaWFudChWYXJpYW50TWFuYWdlbWVudDogYW55LCBrZXk6IHN0cmluZyk6IEJvb2xlYW4ge1xuXHRcdGlmICghVmFyaWFudE1hbmFnZW1lbnQgfHwgIWtleSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCB2YXJpYW50cyA9IFZhcmlhbnRNYW5hZ2VtZW50LmdldFZhcmlhbnRzKCk7XG5cdFx0Y29uc3QgY3VycmVudFZhcmlhbnQgPSB2YXJpYW50cy5maW5kKGZ1bmN0aW9uICh2YXJpYW50OiBhbnkpIHtcblx0XHRcdHJldHVybiB2YXJpYW50ICYmIHZhcmlhbnQua2V5ID09PSBrZXk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIChjdXJyZW50VmFyaWFudCAmJiBjdXJyZW50VmFyaWFudC5leGVjdXRlT25TZWxlY3QpIHx8IGZhbHNlO1xuXHR9XG5cblx0X3Nob3VsZEF1dG9UcmlnZ2VyU2VhcmNoKG9WTTogYW55KSB7XG5cdFx0aWYgKFxuXHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5pbml0aWFsTG9hZCA9PT0gSW5pdGlhbExvYWRNb2RlLkF1dG8gJiZcblx0XHRcdCghb1ZNIHx8IG9WTS5nZXRTdGFuZGFyZFZhcmlhbnRLZXkoKSA9PT0gb1ZNLmdldEN1cnJlbnRWYXJpYW50S2V5KCkpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBvRmlsdGVyQmFyID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdFx0aWYgKG9GaWx0ZXJCYXIpIHtcblx0XHRcdFx0Y29uc3Qgb0NvbmRpdGlvbnMgPSBvRmlsdGVyQmFyLmdldENvbmRpdGlvbnMoKTtcblx0XHRcdFx0Zm9yIChjb25zdCBzS2V5IGluIG9Db25kaXRpb25zKSB7XG5cdFx0XHRcdFx0Ly8gaWdub3JlIGZpbHRlcnMgc3RhcnRpbmcgd2l0aCAkIChlLmcuICRzZWFyY2gsICRlZGl0U3RhdGUpXG5cdFx0XHRcdFx0aWYgKCFzS2V5LnN0YXJ0c1dpdGgoXCIkXCIpICYmIEFycmF5LmlzQXJyYXkob0NvbmRpdGlvbnNbc0tleV0pICYmIG9Db25kaXRpb25zW3NLZXldLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Ly8gbG9hZCBkYXRhIGFzIHBlciB1c2VyJ3Mgc2V0dGluZyBvZiBhcHBseUF1dG9tYXRpY2FsbHkgb24gdGhlIHZhcmlhbnRcblx0XHRcdFx0XHRcdGNvbnN0IHN0YW5kYXJkVmFyaWFudDogYW55ID0gb1ZNLmdldFZhcmlhbnRzKCkuZmluZCgodmFyaWFudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YXJpYW50LmtleSA9PT0gb1ZNLmdldEN1cnJlbnRWYXJpYW50S2V5KCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHJldHVybiBzdGFuZGFyZFZhcmlhbnQgJiYgc3RhbmRhcmRWYXJpYW50LmV4ZWN1dGVPblNlbGVjdDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0X3VwZGF0ZVRhYmxlKG9UYWJsZTogYW55KSB7XG5cdFx0aWYgKCFvVGFibGUuaXNUYWJsZUJvdW5kKCkgfHwgdGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzKSB7XG5cdFx0XHRvVGFibGUucmViaW5kKCk7XG5cdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRfdXBkYXRlQ2hhcnQob0NoYXJ0OiBhbnkpIHtcblx0XHRjb25zdCBvSW5uZXJDaGFydCA9IG9DaGFydC5nZXRDb250cm9sRGVsZWdhdGUoKS5fZ2V0Q2hhcnQob0NoYXJ0KTtcblx0XHRpZiAoIShvSW5uZXJDaGFydCAmJiBvSW5uZXJDaGFydC5pc0JvdW5kKFwiZGF0YVwiKSkgfHwgdGhpcy5oYXNQZW5kaW5nVGFibGVDaGFuZ2VzKSB7XG5cdFx0XHRvQ2hhcnQuZ2V0Q29udHJvbERlbGVnYXRlKCkucmViaW5kKG9DaGFydCwgb0lubmVyQ2hhcnQuZ2V0QmluZGluZ0luZm8oXCJkYXRhXCIpKTtcblx0XHRcdHRoaXMuaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcyA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGhhbmRsZXJzID0ge1xuXHRcdG9uRmlsdGVyU2VhcmNoKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyKSB7XG5cdFx0XHR0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkudHJpZ2dlclNlYXJjaCgpO1xuXHRcdH0sXG5cdFx0b25GaWx0ZXJzQ2hhbmdlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRpZiAob0ZpbHRlckJhcikge1xuXHRcdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0XHQvLyBQZW5kaW5nIGZpbHRlcnMgaW50byBGaWx0ZXJCYXIgdG8gYmUgdXNlZCBmb3IgY3VzdG9tIHZpZXdzXG5cdFx0XHRcdHRoaXMub25QZW5kaW5nRmlsdGVycygpO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJhcHBsaWVkRmlsdGVyc1wiLCBvRmlsdGVyQmFyLmdldEFzc2lnbmVkRmlsdGVyc1RleHQoKS5maWx0ZXJzVGV4dCk7XG5cdFx0XHRcdGlmIChvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29uZGl0aW9uc0Jhc2VkXCIpKSB7XG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGFzUGVuZGluZ0ZpbHRlcnNcIiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uVmFyaWFudFNlbGVjdGVkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1ZNID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdFx0Y29uc3QgY3VycmVudFZhcmlhbnRLZXkgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwia2V5XCIpO1xuXHRcdFx0Y29uc3Qgb011bHRpTW9kZUNvbnRyb2wgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk7XG5cblx0XHRcdG9NdWx0aU1vZGVDb250cm9sPy5pbnZhbGlkYXRlQ29udGVudCgpO1xuXHRcdFx0b011bHRpTW9kZUNvbnRyb2w/LnNldEZyZWV6ZUNvbnRlbnQodHJ1ZSk7XG5cdFx0XHQvLyBzZXRUaW1lb3V0IGNhdXNlIHRoZSB2YXJpYW50IG5lZWRzIHRvIGJlIGFwcGxpZWQgYmVmb3JlIGp1ZGdpbmcgdGhlIGF1dG8gc2VhcmNoIG9yIHVwZGF0aW5nIHRoZSBhcHAgc3RhdGVcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5fc2hvdWxkQXV0b1RyaWdnZXJTZWFyY2gob1ZNKSkge1xuXHRcdFx0XHRcdC8vIHRoZSBhcHAgc3RhdGUgd2lsbCBiZSB1cGRhdGVkIHZpYSBvblNlYXJjaCBoYW5kbGVyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKS50cmlnZ2VyU2VhcmNoKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIXRoaXMuX2dldEFwcGx5QXV0b21hdGljYWxseU9uVmFyaWFudChvVk0sIGN1cnJlbnRWYXJpYW50S2V5KSkge1xuXHRcdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgMCk7XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTYXZlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlcikge1xuXHRcdFx0Ly9UT0RPOiBTaG91bGQgcmVtb3ZlIHRoaXMgc2V0VGltZU91dCBvbmNlIFZhcmlhbnQgTWFuYWdlbWVudCBwcm92aWRlcyBhbiBhcGkgdG8gZmV0Y2ggdGhlIGN1cnJlbnQgdmFyaWFudCBrZXkgb24gc2F2ZSEhIVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdH0sIDEwMDApO1xuXHRcdH0sXG5cdFx0b25TZWFyY2godGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIpIHtcblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0Y29uc3Qgb01kY0NoYXJ0ID0gdGhpcy5nZXRDaGFydENvbnRyb2woKTtcblx0XHRcdGNvbnN0IGJIaWRlRHJhZnQgPSBGaWx0ZXJVdGlscy5nZXRFZGl0U3RhdGVJc0hpZGVEcmFmdChvRmlsdGVyQmFyLmdldENvbmRpdGlvbnMoKSk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJoYXNQZW5kaW5nRmlsdGVyc1wiLCBmYWxzZSk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJoaWRlRHJhZnRJbmZvXCIsIGJIaWRlRHJhZnQpO1xuXG5cdFx0XHRpZiAoIXRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKSkge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVBTFBOb3RBcHBsaWNhYmxlRmllbGRzKG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgb0ZpbHRlckJhcik7XG5cdFx0XHR9XG5cdFx0XHRpZiAob01kY0NoYXJ0KSB7XG5cdFx0XHRcdC8vIGRpc2FibGUgYm91bmQgYWN0aW9ucyBUT0RPOiB0aGlzIGNsZWFycyBldmVyeXRoaW5nIGZvciB0aGUgY2hhcnQ/XG5cdFx0XHRcdChvTWRjQ2hhcnQuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCkuc2V0UHJvcGVydHkoXCJcIiwge30pO1xuXG5cdFx0XHRcdGNvbnN0IG9QYWdlSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvTWRjQ2hhcnQuZ2V0QmluZGluZ0NvbnRleHQoXCJwYWdlSW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdGNvbnN0IHNUZW1wbGF0ZUNvbnRlbnRWaWV3ID0gb1BhZ2VJbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShgJHtvUGFnZUludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vYWxwQ29udGVudFZpZXdgKTtcblx0XHRcdFx0aWYgKHNUZW1wbGF0ZUNvbnRlbnRWaWV3ID09PSBUZW1wbGF0ZUNvbnRlbnRWaWV3LkNoYXJ0KSB7XG5cdFx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc1RlbXBsYXRlQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuVGFibGUpIHtcblx0XHRcdFx0XHR0aGlzLmhhc1BlbmRpbmdUYWJsZUNoYW5nZXMgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBzdG9yZSBmaWx0ZXIgYmFyIGNvbmRpdGlvbnMgdG8gdXNlIGxhdGVyIHdoaWxlIG5hdmlnYXRpb25cblx0XHRcdFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUob0ZpbHRlckJhcilcblx0XHRcdFx0LnRoZW4oKG9FeHRlcm5hbFN0YXRlOiBhbnkpID0+IHtcblx0XHRcdFx0XHR0aGlzLmZpbHRlckJhckNvbmRpdGlvbnMgPSBvRXh0ZXJuYWxTdGF0ZS5maWx0ZXI7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSBleHRlcm5hbCBzdGF0ZVwiLCBvRXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHRcdGlmICgodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmxpdmVNb2RlID09PSBmYWxzZSkge1xuXHRcdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzeXN0ZW0ucGhvbmUpIHtcblx0XHRcdFx0Y29uc3Qgb0R5bmFtaWNQYWdlID0gdGhpcy5fZ2V0RHluYW1pY0xpc3RSZXBvcnRDb250cm9sKCk7XG5cdFx0XHRcdG9EeW5hbWljUGFnZS5zZXRIZWFkZXJFeHBhbmRlZChmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBUcmlnZ2VycyBhbiBvdXRib3VuZCBuYXZpZ2F0aW9uIHdoZW4gYSB1c2VyIGNob29zZXMgdGhlIGNoZXZyb24uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0gb0NvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gc091dGJvdW5kVGFyZ2V0IE5hbWUgb2YgdGhlIG91dGJvdW5kIHRhcmdldCAobmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpXG5cdFx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yIHRoZSB0YXJnZXQgYXBwXG5cdFx0ICogQHBhcmFtIHNDcmVhdGVQYXRoIENyZWF0ZSBwYXRoIHdoZW4gdGhlIGNoZXZyb24gaXMgY3JlYXRlZC5cblx0XHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkXG5cdFx0ICogQHVpNS1yZXN0cmljdGVkXG5cdFx0ICogQGZpbmFsXG5cdFx0ICovXG5cdFx0b25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKFxuXHRcdFx0b0NvbnRyb2xsZXI6IExpc3RSZXBvcnRDb250cm9sbGVyLFxuXHRcdFx0c091dGJvdW5kVGFyZ2V0OiBzdHJpbmcsXG5cdFx0XHRvQ29udGV4dDogVjRDb250ZXh0LFxuXHRcdFx0c0NyZWF0ZVBhdGg6IHN0cmluZ1xuXHRcdCkge1xuXHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQsIG9Db250ZXh0LCBzQ3JlYXRlUGF0aCk7XG5cdFx0fSxcblx0XHRvbkNoYXJ0U2VsZWN0aW9uQ2hhbmdlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9NZGNDaGFydCA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRDb250ZW50KCksXG5cdFx0XHRcdG9UYWJsZSA9IHRoaXMuX2dldFRhYmxlKCksXG5cdFx0XHRcdGFEYXRhID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImRhdGFcIiksXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRpZiAoYURhdGEpIHtcblx0XHRcdFx0Ly8gdXBkYXRlIGFjdGlvbiBidXR0b25zIGVuYWJsZW1lbnQgLyBkaXNhYmxlbWVudFxuXHRcdFx0XHRDaGFydFJ1bnRpbWUuZm5VcGRhdGVDaGFydChvRXZlbnQpO1xuXHRcdFx0XHQvLyB1cGRhdGUgc2VsZWN0aW9ucyBvbiBzZWxlY3Rpb24gb3IgZGVzZWxlY3Rpb25cblx0XHRcdFx0Q2hhcnRVdGlscy5zZXRDaGFydEZpbHRlcnMob01kY0NoYXJ0KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNUZW1wbGF0ZUNvbnRlbnRWaWV3ID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke29JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQYXRoKCl9L2FscENvbnRlbnRWaWV3YCk7XG5cdFx0XHRpZiAoc1RlbXBsYXRlQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQpIHtcblx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSBpZiAob1RhYmxlKSB7XG5cdFx0XHRcdChvVGFibGUgYXMgYW55KS5yZWJpbmQoKTtcblx0XHRcdFx0dGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblNlZ21lbnRlZEJ1dHRvblByZXNzZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBzU2VsZWN0ZWRLZXkgPSBvRXZlbnQubVBhcmFtZXRlcnMua2V5ID8gb0V2ZW50Lm1QYXJhbWV0ZXJzLmtleSA6IG51bGw7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiYWxwQ29udGVudFZpZXdcIiwgc1NlbGVjdGVkS2V5KTtcblx0XHRcdGNvbnN0IG9DaGFydCA9IHRoaXMuZ2V0Q2hhcnRDb250cm9sKCk7XG5cdFx0XHRjb25zdCBvVGFibGUgPSB0aGlzLl9nZXRUYWJsZSgpO1xuXHRcdFx0Y29uc3Qgb1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlID0ge1xuXHRcdFx0XHRvbkFmdGVyUmVuZGVyaW5nKCkge1xuXHRcdFx0XHRcdGNvbnN0IGFJdGVtcyA9IG9TZWdtZW50ZWRCdXR0b24uZ2V0SXRlbXMoKTtcblx0XHRcdFx0XHRhSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAob0l0ZW06IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKG9JdGVtLmdldEtleSgpID09PSBzU2VsZWN0ZWRLZXkpIHtcblx0XHRcdFx0XHRcdFx0b0l0ZW0uZm9jdXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRvU2VnbWVudGVkQnV0dG9uLnJlbW92ZUV2ZW50RGVsZWdhdGUob1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IG9TZWdtZW50ZWRCdXR0b24gPSAoXG5cdFx0XHRcdHNTZWxlY3RlZEtleSA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZSA/IHRoaXMuX2dldFNlZ21lbnRlZEJ1dHRvbihcIlRhYmxlXCIpIDogdGhpcy5fZ2V0U2VnbWVudGVkQnV0dG9uKFwiQ2hhcnRcIilcblx0XHRcdCkgYXMgU2VnbWVudGVkQnV0dG9uO1xuXHRcdFx0aWYgKG9TZWdtZW50ZWRCdXR0b24gIT09IG9FdmVudC5nZXRTb3VyY2UoKSkge1xuXHRcdFx0XHRvU2VnbWVudGVkQnV0dG9uLmFkZEV2ZW50RGVsZWdhdGUob1NlZ21lbnRlZEJ1dHRvbkRlbGVnYXRlKTtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAoc1NlbGVjdGVkS2V5KSB7XG5cdFx0XHRcdGNhc2UgVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZTpcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVUYWJsZShvVGFibGUpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQ6XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlQ2hhcnQob0NoYXJ0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBUZW1wbGF0ZUNvbnRlbnRWaWV3Lkh5YnJpZDpcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVUYWJsZShvVGFibGUpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZUNoYXJ0KG9DaGFydCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvbkZpbHRlcnNTZWdtZW50ZWRCdXR0b25QcmVzc2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3QgaXNDb21wYWN0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImtleVwiKSA9PT0gXCJDb21wYWN0XCI7XG5cdFx0XHR0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkuc2V0VmlzaWJsZShpc0NvbXBhY3QpO1xuXHRcdFx0KHRoaXMuX2dldFZpc3VhbEZpbHRlckJhckNvbnRyb2woKSBhcyBDb250cm9sKS5zZXRWaXNpYmxlKCFpc0NvbXBhY3QpO1xuXHRcdH0sXG5cdFx0b25TdGF0ZUNoYW5nZSh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlcikge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH0sXG5cdFx0b25EeW5hbWljUGFnZVRpdGxlU3RhdGVDaGFuZ2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3QgZmlsdGVyQmFyOiBhbnkgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRpZiAoZmlsdGVyQmFyICYmIGZpbHRlckJhci5nZXRTZWdtZW50ZWRCdXR0b24oKSkge1xuXHRcdFx0XHRpZiAob0V2ZW50LmdldFBhcmFtZXRlcihcImlzRXhwYW5kZWRcIikpIHtcblx0XHRcdFx0XHRmaWx0ZXJCYXIuZ2V0U2VnbWVudGVkQnV0dG9uKCkuc2V0VmlzaWJsZSh0cnVlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmaWx0ZXJCYXIuZ2V0U2VnbWVudGVkQnV0dG9uKCkuc2V0VmlzaWJsZShmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGZvcm1hdHRlcnMgPSB7XG5cdFx0c2V0QUxQQ29udHJvbE1lc3NhZ2VTdHJpcCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgYUlnbm9yZWRGaWVsZHM6IGFueVtdLCBiSXNDaGFydDogYW55LCBvQXBwbHlTdXBwb3J0ZWQ/OiBhbnkpIHtcblx0XHRcdGxldCBzVGV4dCA9IFwiXCI7XG5cdFx0XHRiSXNDaGFydCA9IGJJc0NoYXJ0ID09PSBcInRydWVcIiB8fCBiSXNDaGFydCA9PT0gdHJ1ZTtcblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRpZiAob0ZpbHRlckJhciAmJiBBcnJheS5pc0FycmF5KGFJZ25vcmVkRmllbGRzKSAmJiBhSWdub3JlZEZpZWxkcy5sZW5ndGggPiAwICYmIGJJc0NoYXJ0KSB7XG5cdFx0XHRcdGNvbnN0IGFJZ25vcmVkTGFiZWxzID0gTWVzc2FnZVN0cmlwLmdldExhYmVscyhcblx0XHRcdFx0XHRhSWdub3JlZEZpZWxkcyxcblx0XHRcdFx0XHRvRmlsdGVyQmFyLmRhdGEoXCJlbnRpdHlUeXBlXCIpLFxuXHRcdFx0XHRcdG9GaWx0ZXJCYXIsXG5cdFx0XHRcdFx0dGhpcy5vUmVzb3VyY2VCdW5kbGUgYXMgUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgYklzU2VhcmNoSWdub3JlZCA9ICFvQXBwbHlTdXBwb3J0ZWQuZW5hYmxlU2VhcmNoO1xuXHRcdFx0XHRzVGV4dCA9IGJJc0NoYXJ0XG5cdFx0XHRcdFx0PyBNZXNzYWdlU3RyaXAuZ2V0QUxQVGV4dChhSWdub3JlZExhYmVscywgb0ZpbHRlckJhciwgYklzU2VhcmNoSWdub3JlZClcblx0XHRcdFx0XHQ6IE1lc3NhZ2VTdHJpcC5nZXRUZXh0KGFJZ25vcmVkTGFiZWxzLCBvRmlsdGVyQmFyLCBcIlwiLCBEZWxlZ2F0ZVV0aWwuZ2V0TG9jYWxpemVkVGV4dCk7XG5cdFx0XHRcdHJldHVybiBzVGV4dDtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpc3RSZXBvcnRDb250cm9sbGVyO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXlEQSxJQUFNQSxtQkFBbUIsR0FBR0MsV0FBVyxDQUFDRCxtQkFBeEM7RUFBQSxJQUNDRSxlQUFlLEdBQUdELFdBQVcsQ0FBQ0MsZUFEL0I7TUFJTUMsb0IsV0FETEMsY0FBYyxDQUFDLGtEQUFELEMsVUFFYkMsY0FBYyxDQUNkQyxlQUFlLENBQUNDLFFBQWhCLENBQXlCO0lBQ3hCQyxjQUFjLEVBQUUsWUFBaUM7TUFDL0MsS0FBS0MsT0FBTCxHQUFlQyxhQUFmLEVBQUQsQ0FBeURDLGVBQXpEO0lBQ0E7RUFIdUIsQ0FBekIsQ0FEYyxDLFVBUWROLGNBQWMsQ0FDZE8sNkJBQTZCLENBQUNMLFFBQTlCLENBQXVDO0lBQ3RDTSxZQUFZLEVBQUUsWUFBK0M7TUFDNUQsT0FBUSxLQUFLQyxJQUFOLENBQW9DQyxtQkFBcEMsRUFBUDtJQUNBO0VBSHFDLENBQXZDLENBRGMsQyxVQVFkVixjQUFjLENBQUNXLFdBQUQsQyxVQUdkWCxjQUFjLENBQUNZLHFCQUFxQixDQUFDVixRQUF0QixDQUErQlcsNkJBQS9CLENBQUQsQyxVQUdkYixjQUFjLENBQUNjLEtBQUssQ0FBQ1osUUFBTixDQUFlYSxjQUFmLENBQUQsQyxVQUdkZixjQUFjLENBQUNnQixRQUFRLENBQUNkLFFBQVQsQ0FBa0JlLGlCQUFsQixDQUFELEMsVUFHZGpCLGNBQWMsQ0FBQ2tCLFNBQVMsQ0FBQ2hCLFFBQVYsQ0FBbUJpQixrQkFBbkIsQ0FBRCxDLFVBR2RuQixjQUFjLENBQUNvQixhQUFELEMsV0FFZHBCLGNBQWMsQ0FBQ3FCLFdBQUQsQyxXQUVkckIsY0FBYyxDQUFDc0IsUUFBRCxDLFdBU2RDLGVBQWUsRSxXQUNmQyxjQUFjLEUsV0E0R2RDLGdCQUFnQixFLFdBQ2hCQyxVQUFVLENBQUNDLGlCQUFpQixDQUFDQyxLQUFuQixDLFdBcUNWTCxlQUFlLEUsV0FDZkcsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQyxXQWNWTCxlQUFlLEUsV0FDZkcsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ0MsS0FBbkIsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUF5WFhDLFEsR0FBVztRQUNWQyxjQURVLGNBQ2lDO1VBQzFDLEtBQUtDLG9CQUFMLEdBQTRCQyxhQUE1QjtRQUNBLENBSFM7UUFJVkMsZ0JBSlUsWUFJbUNDLE1BSm5DLEVBSWdEO1VBQ3pELElBQU1DLFVBQVUsR0FBRyxLQUFLSixvQkFBTCxFQUFuQjs7VUFDQSxJQUFJSSxVQUFKLEVBQWdCO1lBQ2YsSUFBTUMscUJBQXFCLEdBQUcsS0FBS2hDLE9BQUwsR0FBZWlDLGlCQUFmLENBQWlDLFVBQWpDLENBQTlCLENBRGUsQ0FFZjs7WUFDQSxLQUFLQyxnQkFBTDtZQUNBRixxQkFBcUIsQ0FBQ0csV0FBdEIsQ0FBa0MsZ0JBQWxDLEVBQW9ESixVQUFVLENBQUNLLHNCQUFYLEdBQW9DQyxXQUF4Rjs7WUFDQSxJQUFJUCxNQUFNLENBQUNRLFlBQVAsQ0FBb0IsaUJBQXBCLENBQUosRUFBNEM7Y0FDM0NOLHFCQUFxQixDQUFDRyxXQUF0QixDQUFrQyxtQkFBbEMsRUFBdUQsSUFBdkQ7WUFDQTtVQUNEO1FBQ0QsQ0FmUztRQWdCVkksaUJBaEJVLFlBZ0JvQ1QsTUFoQnBDLEVBZ0JpRDtVQUFBOztVQUMxRCxJQUFNVSxHQUFHLEdBQUdWLE1BQU0sQ0FBQ1csU0FBUCxFQUFaO1VBQ0EsSUFBTUMsaUJBQWlCLEdBQUdaLE1BQU0sQ0FBQ1EsWUFBUCxDQUFvQixLQUFwQixDQUExQjs7VUFDQSxJQUFNSyxpQkFBaUIsR0FBRyxLQUFLQyxvQkFBTCxFQUExQjs7VUFFQUQsaUJBQWlCLFNBQWpCLElBQUFBLGlCQUFpQixXQUFqQixZQUFBQSxpQkFBaUIsQ0FBRUUsaUJBQW5CO1VBQ0FGLGlCQUFpQixTQUFqQixJQUFBQSxpQkFBaUIsV0FBakIsWUFBQUEsaUJBQWlCLENBQUVHLGdCQUFuQixDQUFvQyxJQUFwQyxFQU4wRCxDQU8xRDs7VUFDQUMsVUFBVSxDQUFDLFlBQU07WUFDaEIsSUFBSSxNQUFJLENBQUNDLHdCQUFMLENBQThCUixHQUE5QixDQUFKLEVBQXdDO2NBQ3ZDO2NBQ0EsT0FBTyxNQUFJLENBQUNiLG9CQUFMLEdBQTRCQyxhQUE1QixFQUFQO1lBQ0EsQ0FIRCxNQUdPLElBQUksQ0FBQyxNQUFJLENBQUNxQiwrQkFBTCxDQUFxQ1QsR0FBckMsRUFBMENFLGlCQUExQyxDQUFMLEVBQW1FO2NBQ3pFLE1BQUksQ0FBQ1EsZUFBTCxHQUF1QkMsY0FBdkI7WUFDQTtVQUNELENBUFMsRUFPUCxDQVBPLENBQVY7UUFRQSxDQWhDUztRQWlDVkMsY0FqQ1UsY0FpQ2lDO1VBQUE7O1VBQzFDO1VBQ0FMLFVBQVUsQ0FBQyxZQUFNO1lBQ2hCLE1BQUksQ0FBQ0csZUFBTCxHQUF1QkMsY0FBdkI7VUFDQSxDQUZTLEVBRVAsSUFGTyxDQUFWO1FBR0EsQ0F0Q1M7UUF1Q1ZFLFFBdkNVLGNBdUMyQjtVQUFBOztVQUNwQyxJQUFNdEIsVUFBVSxHQUFHLEtBQUtKLG9CQUFMLEVBQW5COztVQUNBLElBQU1LLHFCQUFxQixHQUFHLEtBQUtoQyxPQUFMLEdBQWVpQyxpQkFBZixDQUFpQyxVQUFqQyxDQUE5QjtVQUNBLElBQU1xQixTQUFTLEdBQUcsS0FBS0MsZUFBTCxFQUFsQjtVQUNBLElBQU1DLFVBQVUsR0FBR0MsV0FBVyxDQUFDQyx1QkFBWixDQUFvQzNCLFVBQVUsQ0FBQzRCLGFBQVgsRUFBcEMsQ0FBbkI7VUFDQTNCLHFCQUFxQixDQUFDRyxXQUF0QixDQUFrQyxtQkFBbEMsRUFBdUQsS0FBdkQ7VUFDQUgscUJBQXFCLENBQUNHLFdBQXRCLENBQWtDLGVBQWxDLEVBQW1EcUIsVUFBbkQ7O1VBRUEsSUFBSSxDQUFDLEtBQUtaLG9CQUFMLEVBQUwsRUFBa0M7WUFDakMsS0FBS2dCLDZCQUFMLENBQW1DNUIscUJBQW5DLEVBQTBERCxVQUExRDtVQUNBOztVQUNELElBQUl1QixTQUFKLEVBQWU7WUFDZDtZQUNDQSxTQUFTLENBQUNyQixpQkFBVixDQUE0QixVQUE1QixDQUFELENBQWtFRSxXQUFsRSxDQUE4RSxFQUE5RSxFQUFrRixFQUFsRjtZQUVBLElBQU0wQix5QkFBeUIsR0FBR1AsU0FBUyxDQUFDckIsaUJBQVYsQ0FBNEIsY0FBNUIsQ0FBbEM7WUFDQSxJQUFNNkIsb0JBQW9CLEdBQUdELHlCQUF5QixDQUFDRSxXQUExQixXQUF5Q0YseUJBQXlCLENBQUNHLE9BQTFCLEVBQXpDLHFCQUE3Qjs7WUFDQSxJQUFJRixvQkFBb0IsS0FBS3ZFLG1CQUFtQixDQUFDMEUsS0FBakQsRUFBd0Q7Y0FDdkQsS0FBS0Msc0JBQUwsR0FBOEIsSUFBOUI7WUFDQTs7WUFDRCxJQUFJSixvQkFBb0IsS0FBS3ZFLG1CQUFtQixDQUFDNEUsS0FBakQsRUFBd0Q7Y0FDdkQsS0FBS0Msc0JBQUwsR0FBOEIsSUFBOUI7WUFDQTtVQUNELENBdkJtQyxDQXdCcEM7OztVQUNBQyxTQUFTLENBQUNDLHFCQUFWLENBQWdDdkMsVUFBaEMsRUFDRXdDLElBREYsQ0FDTyxVQUFDQyxjQUFELEVBQXlCO1lBQzlCLE1BQUksQ0FBQ0MsbUJBQUwsR0FBMkJELGNBQWMsQ0FBQ0UsTUFBMUM7VUFDQSxDQUhGLEVBSUVDLEtBSkYsQ0FJUSxVQUFVQyxNQUFWLEVBQXVCO1lBQzdCQyxHQUFHLENBQUNDLEtBQUosQ0FBVSwyQ0FBVixFQUF1REYsTUFBdkQ7VUFDQSxDQU5GOztVQU9BLElBQUssS0FBSzVFLE9BQUwsR0FBZStFLFdBQWYsRUFBRCxDQUFzQ0MsUUFBdEMsS0FBbUQsS0FBdkQsRUFBOEQ7WUFDN0QsS0FBSzlCLGVBQUwsR0FBdUJDLGNBQXZCO1VBQ0E7O1VBRUQsSUFBSThCLE1BQU0sQ0FBQ0MsS0FBWCxFQUFrQjtZQUNqQixJQUFNQyxZQUFZLEdBQUcsS0FBS0MsNEJBQUwsRUFBckI7O1lBQ0FELFlBQVksQ0FBQ0UsaUJBQWIsQ0FBK0IsS0FBL0I7VUFDQTtRQUNELENBL0VTOztRQWdGVjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO1FBQ0VDLDhCQTNGVSxZQTRGVEMsV0E1RlMsRUE2RlRDLGVBN0ZTLEVBOEZUQyxRQTlGUyxFQStGVEMsV0EvRlMsRUFnR1I7VUFDRCxPQUFPSCxXQUFXLENBQUNJLHNCQUFaLENBQW1DTCw4QkFBbkMsQ0FBa0VDLFdBQWxFLEVBQStFQyxlQUEvRSxFQUFnR0MsUUFBaEcsRUFBMEdDLFdBQTFHLENBQVA7UUFDQSxDQWxHUztRQW1HVkUsdUJBbkdVLFlBbUcwQzlELE1BbkcxQyxFQW1HdUQ7VUFDaEUsSUFBTXdCLFNBQVMsR0FBR3hCLE1BQU0sQ0FBQ1csU0FBUCxHQUFtQm9ELFVBQW5CLEVBQWxCO1VBQUEsSUFDQ0MsTUFBTSxHQUFHLEtBQUtDLFNBQUwsRUFEVjtVQUFBLElBRUNDLEtBQUssR0FBR2xFLE1BQU0sQ0FBQ1EsWUFBUCxDQUFvQixNQUFwQixDQUZUO1VBQUEsSUFHQ04scUJBQXFCLEdBQUcsS0FBS2hDLE9BQUwsR0FBZWlDLGlCQUFmLENBQWlDLFVBQWpDLENBSHpCOztVQUlBLElBQUkrRCxLQUFKLEVBQVc7WUFDVjtZQUNBQyxZQUFZLENBQUNDLGFBQWIsQ0FBMkJwRSxNQUEzQixFQUZVLENBR1Y7O1lBQ0FxRSxVQUFVLENBQUNDLGVBQVgsQ0FBMkI5QyxTQUEzQjtVQUNBOztVQUNELElBQU1RLG9CQUFvQixHQUFHOUIscUJBQXFCLENBQUMrQixXQUF0QixXQUFxQy9CLHFCQUFxQixDQUFDZ0MsT0FBdEIsRUFBckMscUJBQTdCOztVQUNBLElBQUlGLG9CQUFvQixLQUFLdkUsbUJBQW1CLENBQUMwRSxLQUFqRCxFQUF3RDtZQUN2RCxLQUFLQyxzQkFBTCxHQUE4QixJQUE5QjtVQUNBLENBRkQsTUFFTyxJQUFJNEIsTUFBSixFQUFZO1lBQ2pCQSxNQUFELENBQWdCTyxNQUFoQjtZQUNBLEtBQUtuQyxzQkFBTCxHQUE4QixLQUE5QjtVQUNBO1FBQ0QsQ0FySFM7UUFzSFZvQyx3QkF0SFUsWUFzSDJDeEUsTUF0SDNDLEVBc0h3RDtVQUNqRSxJQUFNeUUsWUFBWSxHQUFHekUsTUFBTSxDQUFDMEUsV0FBUCxDQUFtQkMsR0FBbkIsR0FBeUIzRSxNQUFNLENBQUMwRSxXQUFQLENBQW1CQyxHQUE1QyxHQUFrRCxJQUF2RTtVQUNBLElBQU16RSxxQkFBcUIsR0FBRyxLQUFLaEMsT0FBTCxHQUFlaUMsaUJBQWYsQ0FBaUMsVUFBakMsQ0FBOUI7VUFDQUQscUJBQXFCLENBQUNHLFdBQXRCLENBQWtDLGdCQUFsQyxFQUFvRG9FLFlBQXBEO1VBQ0EsSUFBTUcsTUFBTSxHQUFHLEtBQUtuRCxlQUFMLEVBQWY7O1VBQ0EsSUFBTXVDLE1BQU0sR0FBRyxLQUFLQyxTQUFMLEVBQWY7O1VBQ0EsSUFBTVksd0JBQXdCLEdBQUc7WUFDaENDLGdCQURnQyxjQUNiO2NBQ2xCLElBQU1DLE1BQU0sR0FBR0MsZ0JBQWdCLENBQUNDLFFBQWpCLEVBQWY7Y0FDQUYsTUFBTSxDQUFDRyxPQUFQLENBQWUsVUFBVUMsS0FBVixFQUFzQjtnQkFDcEMsSUFBSUEsS0FBSyxDQUFDQyxNQUFOLE9BQW1CWCxZQUF2QixFQUFxQztrQkFDcENVLEtBQUssQ0FBQ0UsS0FBTjtnQkFDQTtjQUNELENBSkQ7Y0FLQUwsZ0JBQWdCLENBQUNNLG1CQUFqQixDQUFxQ1Qsd0JBQXJDO1lBQ0E7VUFUK0IsQ0FBakM7VUFXQSxJQUFNRyxnQkFBZ0IsR0FDckJQLFlBQVksS0FBS2hILG1CQUFtQixDQUFDNEUsS0FBckMsR0FBNkMsS0FBS2tELG1CQUFMLENBQXlCLE9BQXpCLENBQTdDLEdBQWlGLEtBQUtBLG1CQUFMLENBQXlCLE9BQXpCLENBRGxGOztVQUdBLElBQUlQLGdCQUFnQixLQUFLaEYsTUFBTSxDQUFDVyxTQUFQLEVBQXpCLEVBQTZDO1lBQzVDcUUsZ0JBQWdCLENBQUNRLGdCQUFqQixDQUFrQ1gsd0JBQWxDO1VBQ0E7O1VBQ0QsUUFBUUosWUFBUjtZQUNDLEtBQUtoSCxtQkFBbUIsQ0FBQzRFLEtBQXpCO2NBQ0MsS0FBS29ELFlBQUwsQ0FBa0J6QixNQUFsQjs7Y0FDQTs7WUFDRCxLQUFLdkcsbUJBQW1CLENBQUMwRSxLQUF6QjtjQUNDLEtBQUt1RCxZQUFMLENBQWtCZCxNQUFsQjs7Y0FDQTs7WUFDRCxLQUFLbkgsbUJBQW1CLENBQUNrSSxNQUF6QjtjQUNDLEtBQUtGLFlBQUwsQ0FBa0J6QixNQUFsQjs7Y0FDQSxLQUFLMEIsWUFBTCxDQUFrQmQsTUFBbEI7O2NBQ0E7O1lBQ0Q7Y0FDQztVQVpGOztVQWNBLEtBQUt4RCxlQUFMLEdBQXVCQyxjQUF2QjtRQUNBLENBNUpTO1FBNkpWdUUsK0JBN0pVLFlBNkprRDVGLE1BN0psRCxFQTZKK0Q7VUFDeEUsSUFBTTZGLFNBQVMsR0FBRzdGLE1BQU0sQ0FBQ1EsWUFBUCxDQUFvQixLQUFwQixNQUErQixTQUFqRDs7VUFDQSxLQUFLWCxvQkFBTCxHQUE0QmlHLFVBQTVCLENBQXVDRCxTQUF2Qzs7VUFDQyxLQUFLRSwwQkFBTCxFQUFELENBQStDRCxVQUEvQyxDQUEwRCxDQUFDRCxTQUEzRDtRQUNBLENBaktTO1FBa0tWRyxhQWxLVSxjQWtLZ0M7VUFDekMsS0FBSzVFLGVBQUwsR0FBdUJDLGNBQXZCO1FBQ0EsQ0FwS1M7UUFxS1Y0RSw4QkFyS1UsWUFxS2lEakcsTUFyS2pELEVBcUs4RDtVQUN2RSxJQUFNa0csU0FBYyxHQUFHLEtBQUtyRyxvQkFBTCxFQUF2Qjs7VUFDQSxJQUFJcUcsU0FBUyxJQUFJQSxTQUFTLENBQUNDLGtCQUFWLEVBQWpCLEVBQWlEO1lBQ2hELElBQUluRyxNQUFNLENBQUNRLFlBQVAsQ0FBb0IsWUFBcEIsQ0FBSixFQUF1QztjQUN0QzBGLFNBQVMsQ0FBQ0Msa0JBQVYsR0FBK0JMLFVBQS9CLENBQTBDLElBQTFDO1lBQ0EsQ0FGRCxNQUVPO2NBQ05JLFNBQVMsQ0FBQ0Msa0JBQVYsR0FBK0JMLFVBQS9CLENBQTBDLEtBQTFDO1lBQ0E7VUFDRDtRQUNEO01BOUtTLEM7WUFnTFhNLFUsR0FBYTtRQUNaQyx5QkFEWSxZQUMwQ0MsY0FEMUMsRUFDaUVDLFFBRGpFLEVBQ2dGQyxlQURoRixFQUN1RztVQUNsSCxJQUFJQyxLQUFLLEdBQUcsRUFBWjtVQUNBRixRQUFRLEdBQUdBLFFBQVEsS0FBSyxNQUFiLElBQXVCQSxRQUFRLEtBQUssSUFBL0M7O1VBQ0EsSUFBTXRHLFVBQVUsR0FBRyxLQUFLSixvQkFBTCxFQUFuQjs7VUFDQSxJQUFJSSxVQUFVLElBQUl5RyxLQUFLLENBQUNDLE9BQU4sQ0FBY0wsY0FBZCxDQUFkLElBQStDQSxjQUFjLENBQUNNLE1BQWYsR0FBd0IsQ0FBdkUsSUFBNEVMLFFBQWhGLEVBQTBGO1lBQ3pGLElBQU1NLGNBQWMsR0FBR0MsWUFBWSxDQUFDQyxTQUFiLENBQ3RCVCxjQURzQixFQUV0QnJHLFVBQVUsQ0FBQytHLElBQVgsQ0FBZ0IsWUFBaEIsQ0FGc0IsRUFHdEIvRyxVQUhzQixFQUl0QixLQUFLZ0gsZUFKaUIsQ0FBdkI7WUFNQSxJQUFNQyxnQkFBZ0IsR0FBRyxDQUFDVixlQUFlLENBQUNXLFlBQTFDO1lBQ0FWLEtBQUssR0FBR0YsUUFBUSxHQUNiTyxZQUFZLENBQUNNLFVBQWIsQ0FBd0JQLGNBQXhCLEVBQXdDNUcsVUFBeEMsRUFBb0RpSCxnQkFBcEQsQ0FEYSxHQUViSixZQUFZLENBQUNPLE9BQWIsQ0FBcUJSLGNBQXJCLEVBQXFDNUcsVUFBckMsRUFBaUQsRUFBakQsRUFBcURxSCxZQUFZLENBQUNDLGdCQUFsRSxDQUZIO1lBR0EsT0FBT2QsS0FBUDtVQUNBO1FBQ0Q7TUFsQlcsQzs7Ozs7O1dBMXNCYnJGLGUsR0FGQSwyQkFFZ0M7TUFDL0IsSUFBSSxDQUFDLEtBQUtvRyxZQUFWLEVBQXdCO1FBQ3ZCLEtBQUtBLFlBQUwsR0FBb0IsSUFBSUMsWUFBSixDQUFpQixJQUFqQixDQUFwQjtNQUNBOztNQUNELE9BQU8sS0FBS0QsWUFBWjtJQUNBLEM7O1dBRURFLE0sR0FBQSxrQkFBUztNQUNSQyxjQUFjLENBQUNDLFNBQWYsQ0FBeUJGLE1BQXpCLENBQWdDRyxLQUFoQyxDQUFzQyxJQUF0QztNQUNBLElBQU0zSCxxQkFBcUIsR0FBRyxLQUFLaEMsT0FBTCxHQUFlaUMsaUJBQWYsQ0FBaUMsVUFBakMsQ0FBOUI7TUFFQUQscUJBQXFCLENBQUNHLFdBQXRCLENBQWtDLG1CQUFsQyxFQUF1RCxJQUF2RDtNQUNBSCxxQkFBcUIsQ0FBQ0csV0FBdEIsQ0FBa0MsZ0JBQWxDLEVBQW9ELEVBQXBEO01BQ0FILHFCQUFxQixDQUFDRyxXQUF0QixDQUFrQyxlQUFsQyxFQUFtRCxLQUFuRDtNQUNBSCxxQkFBcUIsQ0FBQ0csV0FBdEIsQ0FBa0MsS0FBbEMsRUFBeUMsRUFBekM7TUFDQUgscUJBQXFCLENBQUNHLFdBQXRCLENBQWtDLGFBQWxDLEVBQWlELEVBQWpEO01BQ0FILHFCQUFxQixDQUFDRyxXQUF0QixDQUFrQyxtQkFBbEMsRUFBdUQsRUFBdkQ7TUFDQUgscUJBQXFCLENBQUNHLFdBQXRCLENBQWtDLFVBQWxDLEVBQThDLEVBQTlDOztNQUVBLElBQUksS0FBS3lILHVCQUFMLEVBQUosRUFBb0M7UUFDbkMsSUFBSUMsY0FBYyxHQUFHLEtBQUtDLGVBQUwsRUFBckI7O1FBQ0EsSUFBSSxDQUFDN0UsTUFBTSxDQUFDOEUsT0FBUixJQUFtQkYsY0FBYyxLQUFLdEssbUJBQW1CLENBQUNrSSxNQUE5RCxFQUFzRTtVQUNyRW9DLGNBQWMsR0FBR3RLLG1CQUFtQixDQUFDMEUsS0FBckM7UUFDQTs7UUFDRGpDLHFCQUFxQixDQUFDRyxXQUF0QixDQUFrQyxnQkFBbEMsRUFBb0QwSCxjQUFwRDtNQUNBLENBbEJPLENBb0JSO01BQ0E7OztNQUNBLEtBQUtwRixtQkFBTCxHQUEyQixFQUEzQixDQXRCUSxDQXdCUjtNQUNBOztNQUNBLEtBQUt1RixlQUFMLEdBQXVCQyxjQUF2QixHQUF3Q0MsaUNBQXhDLEdBMUJRLENBNEJSOztNQUNBLEtBQUtDLFlBQUw7SUFDQSxDOztXQUVEQyxNLEdBQUEsa0JBQVM7TUFDUixPQUFPLEtBQUszRixtQkFBWjs7TUFDQSxJQUFJLEtBQUs2RSxZQUFULEVBQXVCO1FBQ3RCLEtBQUtBLFlBQUwsQ0FBa0JlLE9BQWxCO01BQ0E7O01BQ0QsT0FBTyxLQUFLZixZQUFaO0lBQ0EsQzs7V0FFRHBKLGUsR0FBQSwyQkFBa0I7TUFBQTs7TUFDakIsSUFBTW9LLE9BQU8sR0FBRyxLQUFLQyxZQUFMLENBQWtCLE9BQWxCLENBQWhCOztNQUNBLElBQUlDLFNBQVMsQ0FBQ0MsZ0JBQVYsRUFBSixFQUFrQztRQUFBOztRQUNqQyw4QkFBSzdILG9CQUFMLGtGQUE2QkMsaUJBQTdCO1FBQ0EsSUFBTTZILGFBQWEsc0JBQUcsS0FBSzNFLFNBQUwsRUFBSCxvREFBRyxnQkFBa0I0RSxhQUFsQixFQUF0Qjs7UUFDQSxJQUFJRCxhQUFKLEVBQW1CO1VBQ2xCLElBQUlFLFdBQVcsQ0FBQ1osZUFBWixDQUE0QixLQUFLaEssT0FBTCxFQUE1QixFQUE0QzZLLGFBQTVDLEVBQUosRUFBaUU7WUFDaEU7WUFDQUgsYUFBYSxDQUFDSSxPQUFkO1VBQ0EsQ0FIRCxNQUdPO1lBQ04sSUFBSSxDQUFDLEtBQUtDLFlBQVYsRUFBd0I7Y0FDdkIsS0FBS0EsWUFBTCxHQUFvQmhJLFVBQVUsQ0FBQyxZQUFNO2dCQUNwQzJILGFBQWEsQ0FBQ0ksT0FBZDtnQkFDQSxPQUFPLE1BQUksQ0FBQ0MsWUFBWjtjQUNBLENBSDZCLEVBRzNCLENBSDJCLENBQTlCO1lBSUEsQ0FOSyxDQVFOOzs7WUFDQSxJQUFNQyxvQkFBb0IsR0FBRyxZQUFNO2NBQ2xDLE1BQUksQ0FBQ0MsbUJBQUwsQ0FBeUJYLE9BQXpCOztjQUNBSSxhQUFhLENBQUNRLGtCQUFkLENBQWlDRixvQkFBakM7WUFDQSxDQUhEOztZQUlBTixhQUFhLENBQUNTLGtCQUFkLENBQWlDSCxvQkFBakM7VUFDQTtRQUNEOztRQUNEUixTQUFTLENBQUNZLHFCQUFWO01BQ0E7O01BRUQsSUFBSSxDQUFDLEtBQUtMLFlBQVYsRUFBd0I7UUFDdkIsS0FBS0UsbUJBQUwsQ0FBeUJYLE9BQXpCO01BQ0E7O01BRUQsS0FBS2UsU0FBTCxDQUFlQyxPQUFmLENBQXVCLEtBQUt0QixlQUFMLEdBQXVCdUIsa0JBQXZCLEdBQTRDQyxhQUE1QyxFQUF2QjtJQUNBLEM7O1dBRURDLGlCLEdBQUEsNkJBQW9CO01BQ25CaEMsY0FBYyxDQUFDQyxTQUFmLENBQXlCK0IsaUJBQXpCLENBQTJDOUIsS0FBM0MsQ0FBaUQsSUFBakQ7SUFDQSxDOztXQUVEL0MsZ0IsR0FBQSw0QkFBbUI7TUFBQTs7TUFDaEIsS0FBSzVHLE9BQUwsR0FBZTBMLFFBQWYsQ0FBd0IsYUFBeEIsQ0FBRCxDQUEwREMsaUJBQTFELEVBQUQsQ0FDRXBILElBREYsQ0FDTyxVQUFDcUgsUUFBRCxFQUFtQjtRQUN4QixNQUFJLENBQUM3QyxlQUFMLEdBQXVCNkMsUUFBdkI7O1FBQ0EsSUFBTXRCLE9BQU8sR0FBRyxNQUFJLENBQUNDLFlBQUwsRUFBaEI7O1FBQ0EsSUFBTXNCLFVBQVUsR0FBSSxNQUFJLENBQUM3TCxPQUFMLEdBQWUrRSxXQUFmLEVBQUQsQ0FBc0MrRyxTQUF6RDs7UUFDQSxJQUFNdkQsS0FBSyxHQUFHcUMsV0FBVyxDQUFDbUIsaUJBQVosQ0FDYixnQ0FEYSxFQUViLE1BQUksQ0FBQ2hELGVBRlEsRUFHYmlELFNBSGEsRUFJYkgsVUFKYSxDQUFkO1FBTUF2QixPQUFPLENBQUN0RCxPQUFSLENBQWdCLFVBQVVsQixNQUFWLEVBQXlCO1VBQ3hDQSxNQUFNLENBQUNtRyxTQUFQLENBQWlCMUQsS0FBakI7UUFDQSxDQUZEO01BR0EsQ0FkRixFQWVFNUQsS0FmRixDQWVRLFVBQVVDLE1BQVYsRUFBdUI7UUFDN0JDLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLDRDQUFWLEVBQXdERixNQUF4RDtNQUNBLENBakJGO0lBa0JBLEM7O1dBSURzSCxXLEdBRkEscUJBRVkxRixXQUZaLEVBRThCO01BQzdCLElBQUlBLFdBQVcsQ0FBQzJGLFVBQWhCLEVBQTRCO1FBQzNCLEtBQUtDLGdCQUFMO01BQ0EsQ0FINEIsQ0FJN0I7OztNQUNBLEtBQUtwQyxlQUFMLEdBQXVCcUMsZ0JBQXZCLEdBQTBDQyxpQkFBMUMsQ0FBNEROLFNBQTVEO0lBQ0E7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1lBR0M7SUFDQU8sa0IsR0FIQSw0QkFHbUIvRixXQUhuQixFQUdxQztNQUNwQztJQUNBO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBR0N0RSxnQixHQUZBLDRCQUVtQjtNQUNsQjtJQUNBLEM7O1dBRUQ1QixtQixHQUFBLCtCQUFzQjtNQUFBOztNQUNyQiwyQkFBTyxLQUFLeUYsU0FBTCxFQUFQLHFEQUFPLGlCQUFrQitDLElBQWxCLENBQXVCLHNCQUF2QixFQUErQzBELEtBQS9DLENBQXFELENBQXJELENBQVA7SUFDQTtJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0N2QixtQixHQUFBLDZCQUFvQlgsT0FBcEIsRUFBa0M7TUFDakMsSUFBSW1DLFdBQWtCLEdBQUcsRUFBekI7TUFDQW5DLE9BQU8sQ0FBQ3RELE9BQVIsQ0FBZ0IsVUFBVWxCLE1BQVYsRUFBdUI7UUFDdEMyRyxXQUFXLEdBQUc3QixXQUFXLENBQUM4QixhQUFaLENBQTBCNUcsTUFBMUIsRUFBa0MyRyxXQUFsQyxDQUFkLENBRHNDLENBRXRDO1FBQ0E7O1FBQ0EsSUFBTXpLLHFCQUFxQixHQUFHOEQsTUFBTSxDQUFDN0QsaUJBQVAsQ0FBeUIsVUFBekIsQ0FBOUI7UUFBQSxJQUNDMEssNEJBQTRCLEdBQUdDLElBQUksQ0FBQ0MsS0FBTCxDQUM5QkMsWUFBWSxDQUFDQyxlQUFiLENBQTZCM0QsWUFBWSxDQUFDNEQsYUFBYixDQUEyQmxILE1BQTNCLEVBQW1DLHVCQUFuQyxDQUE3QixDQUQ4QixDQURoQztRQUFBLElBSUNtSCxpQkFBaUIsR0FBR25ILE1BQU0sQ0FBQ29ILG1CQUFQLEVBSnJCO1FBTUFsTCxxQkFBcUIsQ0FBQ0csV0FBdEIsQ0FBa0Msa0JBQWxDLEVBQXNEOEssaUJBQXREO1FBQ0FqTCxxQkFBcUIsQ0FBQ0csV0FBdEIsQ0FBa0MsMEJBQWxDLEVBQThEOEssaUJBQWlCLENBQUN2RSxNQUFoRjtRQUNBeUUsV0FBVyxDQUFDQyx5Q0FBWixDQUFzRHRILE1BQXRELEVBQThEOUQscUJBQTlEO1FBQ0FxTCxhQUFhLENBQUNDLG1CQUFkLENBQWtDdEwscUJBQWxDLEVBQXlEMkssNEJBQXpELEVBQXVGTSxpQkFBdkYsRUFBMEcsT0FBMUc7TUFDQSxDQWREO01BZUFyQyxXQUFXLENBQUMyQyxzQ0FBWixDQUFtRGQsV0FBbkQsRUFBZ0UsS0FBS3pNLE9BQUwsRUFBaEU7SUFDQTtJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ3dOLGtCLEdBQUEsNEJBQW1CQyxRQUFuQixFQUFxQztNQUNwQyxLQUFLbEQsWUFBTCxDQUFrQixPQUFsQixFQUEyQnZELE9BQTNCLENBQW1DLFVBQVVsQixNQUFWLEVBQXVCO1FBQ3pENEgsYUFBYSxDQUFDQyxnQkFBZCxDQUErQjdILE1BQS9CLEVBQXVDMkgsUUFBdkM7TUFDQSxDQUZEO0lBR0E7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNDckIsZ0IsR0FBQSw0QkFBbUI7TUFDbEIsSUFBTXdCLFdBQVcsR0FBRyxLQUFLeEksNEJBQUwsRUFBcEI7TUFBQSxJQUNDeUksZ0JBQWdCLEdBQUdELFdBQVcsQ0FBQ0UsaUJBQVosRUFEcEI7TUFBQSxJQUVDOUYsU0FBUyxHQUFHLEtBQUtyRyxvQkFBTCxFQUZiOztNQUdBLElBQUlxRyxTQUFKLEVBQWU7UUFDZCxJQUFJNkYsZ0JBQUosRUFBc0I7VUFDckI7VUFDQSxJQUFJLENBQUM3RixTQUFTLENBQUMrRixlQUFWLEVBQUwsRUFBa0M7WUFDakMvRixTQUFTLENBQUNnRyxlQUFWLENBQTBCLElBQTFCO1VBQ0E7O1VBQ0QsSUFBTUMsd0JBQXdCLEdBQUdqRyxTQUFTLENBQUNrRyxjQUFWLEdBQTJCQyxJQUEzQixDQUFnQyxVQUFVQyxXQUFWLEVBQTRCO1lBQzVGLE9BQU9BLFdBQVcsQ0FBQ0MsV0FBWixNQUE2QkQsV0FBVyxDQUFDekssYUFBWixHQUE0QitFLE1BQTVCLEtBQXVDLENBQTNFO1VBQ0EsQ0FGZ0MsQ0FBakMsQ0FMcUIsQ0FRckI7O1VBQ0EsSUFBSXVGLHdCQUFKLEVBQThCO1lBQzdCQSx3QkFBd0IsQ0FBQzlHLEtBQXpCO1VBQ0EsQ0FGRCxNQUVPLElBQUksS0FBS21ILGtCQUFMLEVBQUosRUFBK0I7WUFDckN0RyxTQUFTLENBQUNrRyxjQUFWLEdBQTJCLENBQTNCLEVBQThCL0csS0FBOUI7VUFDQSxDQUZNLE1BRUE7WUFBQTs7WUFDTjtZQUNBLDJCQUFLbkgsT0FBTCxHQUFldU8sSUFBZixXQUF1QixLQUFLQyxzQkFBTCxFQUF2QiwwRkFBbUVySCxLQUFuRTtVQUNBO1FBQ0QsQ0FqQkQsTUFpQk8sSUFBSSxLQUFLbUgsa0JBQUwsRUFBSixFQUErQjtVQUFBOztVQUNyQyx5QkFBS3ZJLFNBQUwsd0VBQWtCMEksUUFBbEIsQ0FBMkIsQ0FBM0I7UUFDQTtNQUNELENBckJELE1BcUJPO1FBQUE7O1FBQ04seUJBQUsxSSxTQUFMLHdFQUFrQjBJLFFBQWxCLENBQTJCLENBQTNCO01BQ0E7SUFDRCxDOztXQUVEQyx3QixHQUFBLG9DQUEyQjtNQUMxQixJQUFNQyxjQUFjLEdBQUcsS0FBSzNFLGVBQUwsR0FBdUI0RSxnQkFBdkIsQ0FBd0MsU0FBeEMsQ0FBdkI7TUFDQSxPQUFPO1FBQ05DLEtBQUssRUFBRUYsY0FBYyxDQUFDRSxLQURoQjtRQUVOQyxRQUFRLEVBQUVILGNBQWMsQ0FBQ0ksV0FBZixJQUE4QixFQUZsQztRQUdOQyxNQUFNLEVBQUUsRUFIRjtRQUlOQyxJQUFJLEVBQUU7TUFKQSxDQUFQO0lBTUEsQzs7V0FFRHROLG9CLEdBQUEsZ0NBQXVCO01BQ3RCLE9BQU8sS0FBSzNCLE9BQUwsR0FBZXVPLElBQWYsQ0FBb0IsS0FBS0Msc0JBQUwsRUFBcEIsQ0FBUDtJQUNBLEM7O1dBRURwSiw0QixHQUFBLHdDQUErQjtNQUM5QixPQUFPLEtBQUtwRixPQUFMLEdBQWV1TyxJQUFmLENBQW9CLEtBQUtXLDhCQUFMLEVBQXBCLENBQVA7SUFDQSxDOztXQUVEQyw4QixHQUFBLDBDQUFpQztNQUNoQztNQUNBO01BQ0EsSUFBTUMsbUJBQW1CLEdBQUksS0FBS3pOLG9CQUFMLEVBQUQsQ0FBcUMwTixnQkFBckMsRUFBNUI7O01BQ0EsT0FBT0QsbUJBQW1CLFNBQW5CLElBQUFBLG1CQUFtQixXQUFuQixJQUFBQSxtQkFBbUIsQ0FBRUUsU0FBckIsS0FBbUNGLG1CQUFuQyxHQUF5RHBELFNBQWhFO0lBQ0EsQzs7V0FFRDNFLG1CLEdBQUEsNkJBQW9Ca0ksUUFBcEIsRUFBbUM7TUFBQTs7TUFDbEMsSUFBTUMsa0JBQWtCLFdBQUlELFFBQVEsS0FBSyxPQUFiLEdBQXVCLEtBQUtoTSxlQUFMLEVBQXZCLEdBQWdELEtBQUt3QyxTQUFMLEVBQXBELHlDQUFHLEtBQW9FK0MsSUFBcEUsQ0FBeUUsbUJBQXpFLENBQTNCO01BQ0EsT0FBTyxLQUFLOUksT0FBTCxHQUFldU8sSUFBZixDQUFvQmlCLGtCQUFwQixDQUFQO0lBQ0EsQzs7V0FFREMsZ0MsR0FBQSwwQ0FBaUNDLEtBQWpDLEVBQWdEO01BQUE7O01BQy9DLElBQU1DLFNBQVMsMEJBQUcsS0FBS0MsYUFBTCxFQUFILHdEQUFHLG9CQUFzQjdMLFdBQXRCLENBQWtDMkwsS0FBbEMsQ0FBbEI7TUFDQSxPQUFPQyxTQUFTLElBQUksS0FBSzNQLE9BQUwsR0FBZXVPLElBQWYsQ0FBb0JvQixTQUFwQixDQUFwQjtJQUNBLEM7O1dBRURDLGEsR0FBQSx5QkFBdUM7TUFDdEMsSUFBTUMsYUFBYSxHQUFHQyxTQUFTLENBQUNDLG9CQUFWLENBQStCLEtBQUsvUCxPQUFMLEVBQS9CLENBQXRCO01BQ0EsT0FBTzZQLGFBQWEsQ0FBQ25FLFFBQWQsQ0FBdUIsWUFBdkIsQ0FBUDtJQUNBLEM7O1dBRUR3RCw4QixHQUFBLDBDQUF5QztNQUFBOztNQUN4QyxPQUFPLDhCQUFLVSxhQUFMLGdGQUFzQjdMLFdBQXRCLENBQWtDLHNCQUFsQyxNQUE2RCxFQUFwRTtJQUNBLEM7O1dBRUR5SyxzQixHQUFBLGtDQUFpQztNQUFBOztNQUNoQyxPQUFPLDhCQUFLb0IsYUFBTCxnRkFBc0I3TCxXQUF0QixDQUFrQyxjQUFsQyxNQUFxRCxFQUE1RDtJQUNBLEM7O1dBRURSLGUsR0FBQSwyQkFBa0I7TUFDakIsT0FBTyxLQUFLa00sZ0NBQUwsQ0FBc0MsZ0JBQXRDLENBQVA7SUFDQSxDOztXQUVENUgsMEIsR0FBQSxzQ0FBNkI7TUFDNUIsSUFBTW1JLGtCQUFrQixHQUFHQyxjQUFjLENBQUNDLFFBQWYsQ0FBd0IsQ0FBQyxjQUFELEVBQWlCLEtBQUsxQixzQkFBTCxFQUFqQixDQUF4QixDQUEzQjtNQUNBLE9BQU93QixrQkFBa0IsSUFBSSxLQUFLaFEsT0FBTCxHQUFldU8sSUFBZixDQUFvQnlCLGtCQUFwQixDQUE3QjtJQUNBLEM7O1dBQ0RHLDJCLEdBQUEsdUNBQThCO01BQzdCLE9BQU8sS0FBS1YsZ0NBQUwsQ0FBc0MsdUJBQXRDLENBQVA7SUFDQSxDOztXQUVEN00sb0IsR0FBQSxnQ0FBdUI7TUFDdEIsT0FBTyxLQUFLNUMsT0FBTCxHQUFldU8sSUFBZixDQUFvQiw4QkFBcEIsQ0FBUDtJQUNBLEM7O1dBRUR4SSxTLEdBQUEscUJBQStCO01BQzlCLElBQUksS0FBS3FLLFlBQUwsRUFBSixFQUF5QjtRQUFBOztRQUN4QixJQUFNQyxRQUFRLDZCQUFHLEtBQUt6TixvQkFBTCxFQUFILHFGQUFHLHVCQUE2QjBOLHVCQUE3QixFQUFILDJEQUFHLHVCQUF3REMsT0FBekU7UUFDQSxPQUFPRixRQUFRLFNBQVIsSUFBQUEsUUFBUSxXQUFSLElBQUFBLFFBQVEsQ0FBRUcsR0FBVixDQUFjLGtCQUFkLElBQXFDSCxRQUFyQyxHQUEwRHJFLFNBQWpFO01BQ0EsQ0FIRCxNQUdPO1FBQ04sT0FBTyxLQUFLeUQsZ0NBQUwsQ0FBc0MsZ0JBQXRDLENBQVA7TUFDQTtJQUNELEM7O1dBQ0RsRixZLEdBQUEsc0JBQWFrRyxJQUFiLEVBQXlCO01BQUE7O01BQ3hCLElBQUksS0FBS0wsWUFBTCxFQUFKLEVBQXlCO1FBQ3hCLElBQU1NLFNBQWdCLEdBQUcsRUFBekI7O1FBQ0EsSUFBTUMsYUFBYSxHQUFHLEtBQUsvTixvQkFBTCxHQUE0QjJOLE9BQWxEOztRQUNBSSxhQUFhLENBQUM1SixRQUFkLEdBQXlCQyxPQUF6QixDQUFpQyxVQUFDQyxLQUFELEVBQWdCO1VBQ2hELElBQU1vSixRQUFRLEdBQUcsTUFBSSxDQUFDclEsT0FBTCxHQUFldU8sSUFBZixDQUFvQnRILEtBQUssQ0FBQ0MsTUFBTixFQUFwQixDQUFqQjs7VUFDQSxJQUFJbUosUUFBUSxJQUFJSSxJQUFoQixFQUFzQjtZQUNyQixJQUFJeEosS0FBSyxDQUFDQyxNQUFOLEdBQWUwSixPQUFmLGVBQThCSCxJQUE5QixLQUF3QyxDQUFDLENBQTdDLEVBQWdEO2NBQy9DQyxTQUFTLENBQUNHLElBQVYsQ0FBZVIsUUFBZjtZQUNBO1VBQ0QsQ0FKRCxNQUlPLElBQUlBLFFBQVEsS0FBS3JFLFNBQWIsSUFBMEJxRSxRQUFRLEtBQUssSUFBM0MsRUFBaUQ7WUFDdkRLLFNBQVMsQ0FBQ0csSUFBVixDQUFlUixRQUFmO1VBQ0E7UUFDRCxDQVREO1FBVUEsT0FBT0ssU0FBUDtNQUNBLENBZEQsTUFjTyxJQUFJRCxJQUFJLEtBQUssT0FBYixFQUFzQjtRQUM1QixJQUFNL0osTUFBTSxHQUFHLEtBQUtuRCxlQUFMLEVBQWY7UUFDQSxPQUFPbUQsTUFBTSxHQUFHLENBQUNBLE1BQUQsQ0FBSCxHQUFjLEVBQTNCO01BQ0EsQ0FITSxNQUdBO1FBQ04sSUFBTVosTUFBTSxHQUFHLEtBQUtDLFNBQUwsRUFBZjs7UUFDQSxPQUFPRCxNQUFNLEdBQUcsQ0FBQ0EsTUFBRCxDQUFILEdBQWMsRUFBM0I7TUFDQTtJQUNELEM7O1dBRURnRSxlLEdBQUEsMkJBQWtCO01BQUE7O01BQ2pCLElBQU1nSCxXQUFXLEdBQUdDLG9CQUFvQixDQUFDQyxjQUFyQixDQUFvQyw4QkFBS3BCLGFBQUwsZ0ZBQXNCN0wsV0FBdEIsQ0FBa0MsUUFBbEMsTUFBK0MsRUFBbkYsQ0FBcEI7O01BQ0EsUUFBUStNLFdBQVI7UUFDQyxLQUFLLFNBQUw7VUFDQyxPQUFPdlIsbUJBQW1CLENBQUMwRSxLQUEzQjs7UUFDRCxLQUFLLFdBQUw7VUFDQyxPQUFPMUUsbUJBQW1CLENBQUM0RSxLQUEzQjs7UUFDRCxLQUFLLE1BQUw7UUFDQTtVQUNDLE9BQU81RSxtQkFBbUIsQ0FBQ2tJLE1BQTNCO01BUEY7SUFTQTtJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQzJJLFksR0FBQSx3QkFBd0I7TUFBQTs7TUFDdkIsT0FBTyxDQUFDLDBCQUFDLEtBQUtSLGFBQUwsRUFBRCxpREFBQyxxQkFBc0I3TCxXQUF0QixDQUFrQyxvQkFBbEMsQ0FBRCxDQUFSO0lBQ0E7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0N1SyxrQixHQUFBLDhCQUE4QjtNQUM3QixJQUFNMkMsWUFBWSxHQUFJLEtBQUtqUixPQUFMLEdBQWUrRSxXQUFmLEVBQUQsQ0FBc0NtTSxXQUEzRDtNQUNBLE9BQU9ELFlBQVksS0FBS3hSLGVBQWUsQ0FBQzBSLE9BQXhDO0lBQ0EsQzs7V0FFRHZILHVCLEdBQUEsbUNBQW1DO01BQUE7O01BQ2xDLCtCQUFPLEtBQUtnRyxhQUFMLEVBQVAseURBQU8scUJBQXNCN0wsV0FBdEIsQ0FBa0MseUJBQWxDLENBQVA7SUFDQTtJQUVEO0FBQ0Q7QUFDQTtBQUNBOzs7V0FDQ3FOLGdCLEdBQUEsNEJBQW1CO01BQ2xCLElBQU1wSixTQUFTLEdBQUcsS0FBS3JHLG9CQUFMLEVBQWxCLENBRGtCLENBRWxCOzs7TUFDQSxJQUFJcUcsU0FBSixFQUFlO1FBQ2RBLFNBQVMsQ0FBQ3FKLG1CQUFWLENBQThCLElBQTlCO01BQ0E7SUFDRDtJQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0NDLG9DLEdBQUEsZ0RBQXVDO01BQ3RDO01BQ0EsT0FBTyxLQUFQO0lBQ0E7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0NuSCxZLEdBQUEsd0JBQWU7TUFDZDtNQUNBLElBQUksQ0FBQyxLQUFLbUUsa0JBQUwsRUFBTCxFQUFnQztRQUMvQixLQUFLOEMsZ0JBQUw7TUFDQSxDQUphLENBS2Q7TUFDQTs7O01BQ0EsSUFBTUcsbUJBQXdCLEdBQUdSLG9CQUFvQixDQUFDUyx1QkFBckIsQ0FBNkMsS0FBS3hSLE9BQUwsR0FBZStFLFdBQWYsRUFBN0MsRUFBMkUsS0FBSzZLLGFBQUwsRUFBM0UsQ0FBakM7TUFDQSxJQUFNNkIsaUJBQWlCLEdBQUdGLG1CQUFtQixJQUFJLEtBQUt2UixPQUFMLEdBQWV1TyxJQUFmLENBQW9CZ0QsbUJBQXBCLENBQWpEOztNQUNBLElBQUlFLGlCQUFKLEVBQXVCO1FBQ3RCQSxpQkFBaUIsQ0FBQ0MsMkNBQWxCLENBQThELEtBQUtKLG9DQUFMLENBQTBDSyxJQUExQyxDQUErQyxJQUEvQyxDQUE5RDtNQUNBO0lBQ0QsQzs7V0FFREMsYyxHQUFBLDBCQUFpQjtNQUNoQjtNQUNBO01BRUEsSUFBTUMsU0FBUyxHQUFHQyxVQUFVLENBQUNDLEdBQVgsQ0FBZSw4QkFBZixDQUFsQixDQUpnQixDQUtoQjtNQUNBO01BRUE7O01BQ0EsSUFBTUMsVUFBVSxHQUFHO1FBQ2xCQyxhQUFhLEVBQUVDLFFBQVEsQ0FBQ3JELEtBRE47UUFDYTtRQUMvQnNELGlCQUFpQixFQUFFLFlBQVk7VUFDOUIsSUFBTUMsS0FBSyxHQUFHQyxNQUFNLENBQUNDLE9BQVAsRUFBZDtVQUNBLE9BQU9GLEtBQUssY0FBT0EsS0FBUCxJQUFpQkcsTUFBTSxDQUFDQyxRQUFQLENBQWdCQyxJQUE3QztRQUNBLENBTGlCOztRQU1sQjtBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO1FBQ0dDLGtCQUFrQixFQUFFLENBQUMsQ0FBQ2IsU0FBRixJQUFlQSxTQUFTLEdBQUdjLFdBQVo7TUFkakIsQ0FBbkI7TUFpQkEsSUFBTUMscUJBQXFCLEdBQUcsS0FBS0MsaUJBQUwsR0FBeUJuSCxRQUF6QixDQUFrQyxZQUFsQyxDQUE5QjtNQUNBa0gscUJBQXFCLENBQUN6USxXQUF0QixDQUFrQyxtQkFBbEMsRUFBdUQ2UCxVQUF2RDtJQUNBO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ3BPLDZCLEdBQUEsdUNBQThCNUIscUJBQTlCLEVBQTJFRCxVQUEzRSxFQUFrRztNQUNqRyxJQUFNK1EsTUFBVyxHQUFHLEVBQXBCOztNQUNBLElBQU1DLGFBQWtCLEdBQUcsRUFBM0I7TUFBQSxJQUNDekksT0FBTyxHQUFHLEtBQUtDLFlBQUwsQ0FBa0IsT0FBbEIsQ0FEWDtNQUFBLElBRUN5SSxPQUFPLEdBQUcsS0FBS3pJLFlBQUwsQ0FBa0IsT0FBbEIsQ0FGWDs7TUFJQSxJQUFJLENBQUNELE9BQU8sQ0FBQzVCLE1BQVQsSUFBbUIsQ0FBQ3NLLE9BQU8sQ0FBQ3RLLE1BQWhDLEVBQXdDO1FBQ3ZDO1FBQ0E7TUFDQSxDQVRnRyxDQVdqRzs7O01BQ0FzSyxPQUFPLENBQUNoTSxPQUFSLENBQWdCLFVBQVVOLE1BQVYsRUFBdUI7UUFDdEMsSUFBTXVNLGdCQUFnQixHQUFHdk0sTUFBTSxDQUFDb0MsSUFBUCxDQUFZLHNCQUFaLENBQXpCO1FBQUEsSUFDQ29LLGVBQWUsR0FBR0QsZ0JBQWdCLENBQUN6RyxLQUFqQixDQUF1QixDQUF2QixDQURuQjtRQUFBLElBRUMyRyxTQUFTLGFBQU1ELGVBQU4sVUFGVjs7UUFHQSxJQUFJLENBQUNKLE1BQU0sQ0FBQ0ssU0FBRCxDQUFYLEVBQXdCO1VBQ3ZCTCxNQUFNLENBQUNLLFNBQUQsQ0FBTixHQUFvQjFQLFdBQVcsQ0FBQzJQLHVCQUFaLENBQW9DclIsVUFBcEMsRUFBZ0QyRSxNQUFoRCxDQUFwQjtRQUNBOztRQUNEcU0sYUFBYSxDQUFDSSxTQUFELENBQWIsR0FBMkJMLE1BQU0sQ0FBQ0ssU0FBRCxDQUFqQztNQUNBLENBUkQ7TUFTQW5SLHFCQUFxQixDQUFDRyxXQUF0QixDQUFrQyx3QkFBbEMsRUFBNEQ0USxhQUE1RDtJQUNBLEM7O1dBRURNLGtCLEdBQUEsOEJBQXFCO01BQ3BCLE9BQVEsS0FBS3JULE9BQUwsR0FBZStFLFdBQWYsRUFBRCxDQUFzQ3VPLGFBQTdDO0lBQ0EsQzs7V0FFRHJRLCtCLEdBQUEseUNBQWdDc1EsaUJBQWhDLEVBQXdEOU0sR0FBeEQsRUFBOEU7TUFDN0UsSUFBSSxDQUFDOE0saUJBQUQsSUFBc0IsQ0FBQzlNLEdBQTNCLEVBQWdDO1FBQy9CLE9BQU8sS0FBUDtNQUNBOztNQUNELElBQU0rTSxRQUFRLEdBQUdELGlCQUFpQixDQUFDRSxXQUFsQixFQUFqQjtNQUNBLElBQU1DLGNBQWMsR0FBR0YsUUFBUSxDQUFDckYsSUFBVCxDQUFjLFVBQVV3RixPQUFWLEVBQXdCO1FBQzVELE9BQU9BLE9BQU8sSUFBSUEsT0FBTyxDQUFDbE4sR0FBUixLQUFnQkEsR0FBbEM7TUFDQSxDQUZzQixDQUF2QjtNQUdBLE9BQVFpTixjQUFjLElBQUlBLGNBQWMsQ0FBQ0UsZUFBbEMsSUFBc0QsS0FBN0Q7SUFDQSxDOztXQUVENVEsd0IsR0FBQSxrQ0FBeUJSLEdBQXpCLEVBQW1DO01BQ2xDLElBQ0UsS0FBS3hDLE9BQUwsR0FBZStFLFdBQWYsRUFBRCxDQUFzQ21NLFdBQXRDLEtBQXNEelIsZUFBZSxDQUFDb1UsSUFBdEUsS0FDQyxDQUFDclIsR0FBRCxJQUFRQSxHQUFHLENBQUNzUixxQkFBSixPQUFnQ3RSLEdBQUcsQ0FBQ3VSLG9CQUFKLEVBRHpDLENBREQsRUFHRTtRQUNELElBQU1oUyxVQUFVLEdBQUcsS0FBS0osb0JBQUwsRUFBbkI7O1FBQ0EsSUFBSUksVUFBSixFQUFnQjtVQUNmLElBQU1pUyxXQUFXLEdBQUdqUyxVQUFVLENBQUM0QixhQUFYLEVBQXBCOztVQUNBLEtBQUssSUFBTThNLElBQVgsSUFBbUJ1RCxXQUFuQixFQUFnQztZQUMvQjtZQUNBLElBQUksQ0FBQ3ZELElBQUksQ0FBQ3dELFVBQUwsQ0FBZ0IsR0FBaEIsQ0FBRCxJQUF5QnpMLEtBQUssQ0FBQ0MsT0FBTixDQUFjdUwsV0FBVyxDQUFDdkQsSUFBRCxDQUF6QixDQUF6QixJQUE2RHVELFdBQVcsQ0FBQ3ZELElBQUQsQ0FBWCxDQUFrQi9ILE1BQW5GLEVBQTJGO2NBQzFGO2NBQ0EsSUFBTXdMLGVBQW9CLEdBQUcxUixHQUFHLENBQUNpUixXQUFKLEdBQWtCdEYsSUFBbEIsQ0FBdUIsVUFBQ3dGLE9BQUQsRUFBa0I7Z0JBQ3JFLE9BQU9BLE9BQU8sQ0FBQ2xOLEdBQVIsS0FBZ0JqRSxHQUFHLENBQUN1UixvQkFBSixFQUF2QjtjQUNBLENBRjRCLENBQTdCO2NBR0EsT0FBT0csZUFBZSxJQUFJQSxlQUFlLENBQUNOLGVBQTFDO1lBQ0E7VUFDRDtRQUNEO01BQ0Q7O01BQ0QsT0FBTyxLQUFQO0lBQ0EsQzs7V0FFRHJNLFksR0FBQSxzQkFBYXpCLE1BQWIsRUFBMEI7TUFDekIsSUFBSSxDQUFDQSxNQUFNLENBQUNxTyxZQUFQLEVBQUQsSUFBMEIsS0FBS2pRLHNCQUFuQyxFQUEyRDtRQUMxRDRCLE1BQU0sQ0FBQ08sTUFBUDtRQUNBLEtBQUtuQyxzQkFBTCxHQUE4QixLQUE5QjtNQUNBO0lBQ0QsQzs7V0FFRHNELFksR0FBQSxzQkFBYWQsTUFBYixFQUEwQjtNQUN6QixJQUFNME4sV0FBVyxHQUFHMU4sTUFBTSxDQUFDMk4sa0JBQVAsR0FBNEJDLFNBQTVCLENBQXNDNU4sTUFBdEMsQ0FBcEI7O01BQ0EsSUFBSSxFQUFFME4sV0FBVyxJQUFJQSxXQUFXLENBQUNHLE9BQVosQ0FBb0IsTUFBcEIsQ0FBakIsS0FBaUQsS0FBS25RLHNCQUExRCxFQUFrRjtRQUNqRnNDLE1BQU0sQ0FBQzJOLGtCQUFQLEdBQTRCaE8sTUFBNUIsQ0FBbUNLLE1BQW5DLEVBQTJDME4sV0FBVyxDQUFDSSxjQUFaLENBQTJCLE1BQTNCLENBQTNDO1FBQ0EsS0FBS3BRLHNCQUFMLEdBQThCLEtBQTlCO01BQ0E7SUFDRCxDOzs7SUF2a0JpQ3FGLGM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQSt3QnBCL0osb0IifQ==
835
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUZW1wbGF0ZUNvbnRlbnRWaWV3IiwiQ29yZUxpYnJhcnkiLCJJbml0aWFsTG9hZE1vZGUiLCJMaXN0UmVwb3J0Q29udHJvbGxlciIsImRlZmluZVVJNUNsYXNzIiwidXNpbmdFeHRlbnNpb24iLCJJbnRlcm5hbFJvdXRpbmciLCJvdmVycmlkZSIsIm9uQWZ0ZXJCaW5kaW5nIiwiZ2V0VmlldyIsImdldENvbnRyb2xsZXIiLCJfb25BZnRlckJpbmRpbmciLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldEVudGl0eVNldCIsImJhc2UiLCJnZXRDdXJyZW50RW50aXR5U2V0IiwiU2lkZUVmZmVjdHMiLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsIlNoYXJlIiwiU2hhcmVPdmVycmlkZXMiLCJWaWV3U3RhdGUiLCJWaWV3U3RhdGVPdmVycmlkZXMiLCJLUElNYW5hZ2VtZW50IiwiUGxhY2Vob2xkZXIiLCJNYXNzRWRpdCIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwicHJpdmF0ZUV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiaGFuZGxlcnMiLCJvbkZpbHRlclNlYXJjaCIsIl9nZXRGaWx0ZXJCYXJDb250cm9sIiwidHJpZ2dlclNlYXJjaCIsIm9uRmlsdGVyc0NoYW5nZWQiLCJvRXZlbnQiLCJvRmlsdGVyQmFyIiwib0ludGVybmFsTW9kZWxDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvblBlbmRpbmdGaWx0ZXJzIiwic2V0UHJvcGVydHkiLCJnZXRBc3NpZ25lZEZpbHRlcnNUZXh0IiwiZmlsdGVyc1RleHQiLCJnZXRQYXJhbWV0ZXIiLCJvblZhcmlhbnRTZWxlY3RlZCIsIm9WTSIsImdldFNvdXJjZSIsImN1cnJlbnRWYXJpYW50S2V5Iiwib011bHRpTW9kZUNvbnRyb2wiLCJfZ2V0TXVsdGlNb2RlQ29udHJvbCIsImluaXRpYWxDb250cm9sU3RhdGVzTWFwcGVyIiwidmlld1N0YXRlIiwiaW52YWxpZGF0ZUNvbnRlbnQiLCJzZXRGcmVlemVDb250ZW50Iiwidm1Bc3NvY2lhdGVkQ29udHJvbHNUb1Jlc2V0IiwiZ2V0Rm9yIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJjb250cm9sS2V5IiwiZm91bmQiLCJ2bUFzc29jaWF0ZWRjb250cm9sS2V5IiwiaW5kZXhPZiIsInNldFRpbWVvdXQiLCJfc2hvdWxkQXV0b1RyaWdnZXJTZWFyY2giLCJfZ2V0QXBwbHlBdXRvbWF0aWNhbGx5T25WYXJpYW50IiwiZ2V0RXh0ZW5zaW9uQVBJIiwidXBkYXRlQXBwU3RhdGUiLCJvblZhcmlhbnRTYXZlZCIsIm9uU2VhcmNoIiwib01kY0NoYXJ0IiwiZ2V0Q2hhcnRDb250cm9sIiwiYkhpZGVEcmFmdCIsIkZpbHRlclV0aWxzIiwiZ2V0RWRpdFN0YXRlSXNIaWRlRHJhZnQiLCJnZXRDb25kaXRpb25zIiwiX3VwZGF0ZUFMUE5vdEFwcGxpY2FibGVGaWVsZHMiLCJvUGFnZUludGVybmFsTW9kZWxDb250ZXh0Iiwic1RlbXBsYXRlQ29udGVudFZpZXciLCJnZXRQcm9wZXJ0eSIsImdldFBhdGgiLCJDaGFydCIsImhhc1BlbmRpbmdDaGFydENoYW5nZXMiLCJUYWJsZSIsImhhc1BlbmRpbmdUYWJsZUNoYW5nZXMiLCJTdGF0ZVV0aWwiLCJyZXRyaWV2ZUV4dGVybmFsU3RhdGUiLCJ0aGVuIiwib0V4dGVybmFsU3RhdGUiLCJmaWx0ZXJCYXJDb25kaXRpb25zIiwiZmlsdGVyIiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImdldFZpZXdEYXRhIiwibGl2ZU1vZGUiLCJzeXN0ZW0iLCJwaG9uZSIsIm9EeW5hbWljUGFnZSIsIl9nZXREeW5hbWljTGlzdFJlcG9ydENvbnRyb2wiLCJzZXRIZWFkZXJFeHBhbmRlZCIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsIm9Db250cm9sbGVyIiwic091dGJvdW5kVGFyZ2V0Iiwib0NvbnRleHQiLCJzQ3JlYXRlUGF0aCIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJvbkNoYXJ0U2VsZWN0aW9uQ2hhbmdlZCIsImdldENvbnRlbnQiLCJvVGFibGUiLCJfZ2V0VGFibGUiLCJhRGF0YSIsIkNoYXJ0UnVudGltZSIsImZuVXBkYXRlQ2hhcnQiLCJDaGFydFV0aWxzIiwic2V0Q2hhcnRGaWx0ZXJzIiwicmViaW5kIiwib25TZWdtZW50ZWRCdXR0b25QcmVzc2VkIiwic1NlbGVjdGVkS2V5IiwibVBhcmFtZXRlcnMiLCJrZXkiLCJvQ2hhcnQiLCJvU2VnbWVudGVkQnV0dG9uRGVsZWdhdGUiLCJvbkFmdGVyUmVuZGVyaW5nIiwiYUl0ZW1zIiwib1NlZ21lbnRlZEJ1dHRvbiIsImdldEl0ZW1zIiwib0l0ZW0iLCJnZXRLZXkiLCJmb2N1cyIsInJlbW92ZUV2ZW50RGVsZWdhdGUiLCJfZ2V0U2VnbWVudGVkQnV0dG9uIiwiYWRkRXZlbnREZWxlZ2F0ZSIsIl91cGRhdGVUYWJsZSIsIl91cGRhdGVDaGFydCIsIkh5YnJpZCIsIm9uRmlsdGVyc1NlZ21lbnRlZEJ1dHRvblByZXNzZWQiLCJpc0NvbXBhY3QiLCJzZXRWaXNpYmxlIiwiX2dldFZpc3VhbEZpbHRlckJhckNvbnRyb2wiLCJvblN0YXRlQ2hhbmdlIiwib25EeW5hbWljUGFnZVRpdGxlU3RhdGVDaGFuZ2VkIiwiZmlsdGVyQmFyIiwiZ2V0U2VnbWVudGVkQnV0dG9uIiwiZm9ybWF0dGVycyIsInNldEFMUENvbnRyb2xNZXNzYWdlU3RyaXAiLCJhSWdub3JlZEZpZWxkcyIsImJJc0NoYXJ0Iiwib0FwcGx5U3VwcG9ydGVkIiwic1RleHQiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJhSWdub3JlZExhYmVscyIsIk1lc3NhZ2VTdHJpcCIsImdldExhYmVscyIsImRhdGEiLCJvUmVzb3VyY2VCdW5kbGUiLCJiSXNTZWFyY2hJZ25vcmVkIiwiZW5hYmxlU2VhcmNoIiwiZ2V0QUxQVGV4dCIsImdldFRleHQiLCJEZWxlZ2F0ZVV0aWwiLCJnZXRMb2NhbGl6ZWRUZXh0IiwiZXh0ZW5zaW9uQVBJIiwiRXh0ZW5zaW9uQVBJIiwib25Jbml0IiwiUGFnZUNvbnRyb2xsZXIiLCJwcm90b3R5cGUiLCJhcHBseSIsIl9oYXNNdWx0aVZpc3VhbGl6YXRpb25zIiwiYWxwQ29udGVudFZpZXciLCJfZ2V0RGVmYXVsdFBhdGgiLCJkZXNrdG9wIiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJ3YWl0Rm9yUm91dGVNYXRjaEJlZm9yZU5hdmlnYXRpb24iLCJfc2V0SW5pdExvYWQiLCJvbkV4aXQiLCJkZXN0cm95IiwiYVRhYmxlcyIsIl9nZXRDb250cm9scyIsIkVkaXRTdGF0ZSIsImlzRWRpdFN0YXRlRGlydHkiLCJvVGFibGVCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsIkNvbW1vblV0aWxzIiwiX2lzRmNsRW5hYmxlZCIsInJlZnJlc2giLCJzVXBkYXRlVGltZXIiLCJmblVwZGF0ZVRhYmxlQWN0aW9ucyIsIl91cGRhdGVUYWJsZUFjdGlvbnMiLCJkZXRhY2hEYXRhUmVjZWl2ZWQiLCJhdHRhY2hEYXRhUmVjZWl2ZWQiLCJzZXRFZGl0U3RhdGVQcm9jZXNzZWQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsInZpZXdJZCIsImdldElkIiwicGFnZVJlYWR5Iiwid2FpdEZvciIsImdldEFwcFN0YXRlSGFuZGxlciIsImFwcGx5QXBwU3RhdGUiLCJvbkJlZm9yZVJlbmRlcmluZyIsImdldE1vZGVsIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJyZXNwb25zZSIsInNFbnRpdHlTZXQiLCJlbnRpdHlTZXQiLCJnZXRUcmFuc2xhdGVkVGV4dCIsInVuZGVmaW5lZCIsInNldE5vRGF0YSIsIm9uUGFnZVJlYWR5IiwiZm9yY2VGb2N1cyIsIl9zZXRJbml0aWFsRm9jdXMiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJvblZpZXdOZWVkc1JlZnJlc2giLCJzbGljZSIsIm9uQWZ0ZXJDbGVhciIsImFJQk5BY3Rpb25zIiwiZ2V0SUJOQWN0aW9ucyIsIm9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAiLCJKU09OIiwicGFyc2UiLCJDb21tb25IZWxwZXIiLCJwYXJzZUN1c3RvbURhdGEiLCJnZXRDdXN0b21EYXRhIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiVGFibGVIZWxwZXIiLCJoYW5kbGVUYWJsZURlbGV0ZUVuYWJsZW1lbnRGb3JTaWRlRWZmZWN0cyIsIkFjdGlvblJ1bnRpbWUiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwidXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkiLCJfc2Nyb2xsVGFibGVzVG9Sb3ciLCJzUm93UGF0aCIsIlRhYmxlU2Nyb2xsZXIiLCJzY3JvbGxUYWJsZVRvUm93IiwiZHluYW1pY1BhZ2UiLCJpc0hlYWRlckV4cGFuZGVkIiwiZ2V0SGVhZGVyRXhwYW5kZWQiLCJnZXRTaG93TWVzc2FnZXMiLCJzZXRTaG93TWVzc2FnZXMiLCJmaXJzdEVtcHR5TWFuZGF0b3J5RmllbGQiLCJnZXRGaWx0ZXJJdGVtcyIsImZpbmQiLCJvRmlsdGVySXRlbSIsImdldFJlcXVpcmVkIiwiX2lzSW5pdExvYWRFbmFibGVkIiwiYnlJZCIsIl9nZXRGaWx0ZXJCYXJDb250cm9sSWQiLCJmb2N1c1JvdyIsIl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbiIsIm9NYW5pZmVzdEVudHJ5IiwiZ2V0TWFuaWZlc3RFbnRyeSIsInRpdGxlIiwic3VidGl0bGUiLCJzdWJUaXRsZSIsImludGVudCIsImljb24iLCJfZ2V0RHluYW1pY0xpc3RSZXBvcnRDb250cm9sSWQiLCJfZ2V0QWRhcHRhdGlvbkZpbHRlckJhckNvbnRyb2wiLCJhZGFwdGF0aW9uRmlsdGVyQmFyIiwiZ2V0SW5idWlsdEZpbHRlciIsImdldFBhcmVudCIsInNDb250cm9sIiwic1NlZ21lbnRlZEJ1dHRvbklkIiwiX2dldENvbnRyb2xGcm9tUGFnZU1vZGVsUHJvcGVydHkiLCJzUGF0aCIsImNvbnRyb2xJZCIsIl9nZXRQYWdlTW9kZWwiLCJzVmlzdWFsRmlsdGVyQmFySWQiLCJTdGFibGVJZEhlbHBlciIsImdlbmVyYXRlIiwiX2dldEZpbHRlckJhclZhcmlhbnRDb250cm9sIiwiX2lzTXVsdGlNb2RlIiwib0NvbnRyb2wiLCJnZXRTZWxlY3RlZElubmVyQ29udHJvbCIsImNvbnRlbnQiLCJpc0EiLCJzS2V5IiwiYUNvbnRyb2xzIiwib1RhYk11bHRpTW9kZSIsInB1c2giLCJkZWZhdWx0UGF0aCIsIkxpc3RSZXBvcnRUZW1wbGF0aW5nIiwiZ2V0RGVmYXVsdFBhdGgiLCJpbml0TG9hZE1vZGUiLCJpbml0aWFsTG9hZCIsIkVuYWJsZWQiLCJfZGlzYWJsZUluaXRMb2FkIiwic2V0U3VzcGVuZFNlbGVjdGlvbiIsIl9hcHBseUF1dG9tYXRpY2FsbHlPblN0YW5kYXJkVmFyaWFudCIsInZhcmlhbnRNYW5hZ2VtZW50SWQiLCJnZXRWYXJpYW50QmFja1JlZmVyZW5jZSIsInZhcmlhbnRNYW5hZ2VtZW50IiwicmVnaXN0ZXJBcHBseUF1dG9tYXRpY2FsbHlPblN0YW5kYXJkVmFyaWFudCIsImJpbmQiLCJfc2V0U2hhcmVNb2RlbCIsImZuR2V0VXNlciIsIk9iamVjdFBhdGgiLCJnZXQiLCJvU2hhcmVJbmZvIiwiYm9va21hcmtUaXRsZSIsImRvY3VtZW50IiwiYm9va21hcmtDdXN0b21VcmwiLCJzSGFzaCIsImhhc2hlciIsImdldEhhc2giLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhyZWYiLCJpc1NoYXJlSW5KYW1BY3RpdmUiLCJpc0phbUFjdGl2ZSIsIm9UZW1wbGF0ZVByaXZhdGVNb2RlbCIsImdldE93bmVyQ29tcG9uZW50IiwibUNhY2hlIiwiaWdub3JlZEZpZWxkcyIsImFDaGFydHMiLCJzQ2hhcnRFbnRpdHlQYXRoIiwic0NoYXJ0RW50aXR5U2V0Iiwic0NhY2hlS2V5IiwiZ2V0Tm90QXBwbGljYWJsZUZpbHRlcnMiLCJfaXNGaWx0ZXJCYXJIaWRkZW4iLCJoaWRlRmlsdGVyQmFyIiwiVmFyaWFudE1hbmFnZW1lbnQiLCJ2YXJpYW50cyIsImdldFZhcmlhbnRzIiwiY3VycmVudFZhcmlhbnQiLCJ2YXJpYW50IiwiZXhlY3V0ZU9uU2VsZWN0IiwiQXV0byIsImdldFN0YW5kYXJkVmFyaWFudEtleSIsImdldEN1cnJlbnRWYXJpYW50S2V5Iiwib0NvbmRpdGlvbnMiLCJzdGFydHNXaXRoIiwic3RhbmRhcmRWYXJpYW50IiwiaXNUYWJsZUJvdW5kIiwib0lubmVyQ2hhcnQiLCJnZXRDb250cm9sRGVsZWdhdGUiLCJfZ2V0Q2hhcnQiLCJpc0JvdW5kIiwiZ2V0QmluZGluZ0luZm8iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkxpc3RSZXBvcnRDb250cm9sbGVyLmNvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IE9iamVjdFBhdGggZnJvbSBcInNhcC9iYXNlL3V0aWwvT2JqZWN0UGF0aFwiO1xuaW1wb3J0IHR5cGUgRHluYW1pY1BhZ2UgZnJvbSBcInNhcC9mL0R5bmFtaWNQYWdlXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwic2FwL2ZlL2NvcmUvQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBLUElNYW5hZ2VtZW50IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9LUElNYW5hZ2VtZW50XCI7XG5pbXBvcnQgTWFzc0VkaXQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01hc3NFZGl0XCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgU2hhcmUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NoYXJlXCI7XG5pbXBvcnQgU2lkZUVmZmVjdHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NpZGVFZmZlY3RzXCI7XG5pbXBvcnQgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbHMvRmlsdGVyQmFyXCI7XG5pbXBvcnQge1xuXHRkZWZpbmVVSTVDbGFzcyxcblx0ZXh0ZW5zaWJsZSxcblx0ZmluYWxFeHRlbnNpb24sXG5cdHByaXZhdGVFeHRlbnNpb24sXG5cdHB1YmxpY0V4dGVuc2lvbixcblx0dXNpbmdFeHRlbnNpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgRWRpdFN0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0VkaXRTdGF0ZVwiO1xuaW1wb3J0IE1lc3NhZ2VTdHJpcCBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXNzYWdlU3RyaXBcIjtcbmltcG9ydCB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCAqIGFzIFN0YWJsZUlkSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgQ29yZUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDaGFydFJ1bnRpbWUgZnJvbSBcInNhcC9mZS9tYWNyb3MvY2hhcnQvQ2hhcnRSdW50aW1lXCI7XG5pbXBvcnQgQ2hhcnRVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9jaGFydC9DaGFydFV0aWxzXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IERlbGVnYXRlVXRpbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9EZWxlZ2F0ZVV0aWxcIjtcbmltcG9ydCBGaWx0ZXJVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9maWx0ZXIvRmlsdGVyVXRpbHNcIjtcbmltcG9ydCBUYWJsZUhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUhlbHBlclwiO1xuaW1wb3J0IE11bHRpcGxlTW9kZUNvbnRyb2wgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvTGlzdFJlcG9ydC9jb250cm9scy9NdWx0aXBsZU1vZGVDb250cm9sXCI7XG5pbXBvcnQgRXh0ZW5zaW9uQVBJIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL0xpc3RSZXBvcnQvRXh0ZW5zaW9uQVBJXCI7XG5pbXBvcnQgVGFibGVTY3JvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9UYWJsZVNjcm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBTZWdtZW50ZWRCdXR0b24gZnJvbSBcInNhcC9tL1NlZ21lbnRlZEJ1dHRvblwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB7IHN5c3RlbSB9IGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgU3RhdGVVdGlsIGZyb20gXCJzYXAvdWkvbWRjL3AxM24vU3RhdGVVdGlsXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9yZXNvdXJjZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgaGFzaGVyIGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9oYXNoZXJcIjtcbmltcG9ydCB0eXBlIHsgVjRDb250ZXh0IH0gZnJvbSBcInR5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0ICogYXMgTGlzdFJlcG9ydFRlbXBsYXRpbmcgZnJvbSBcIi4vTGlzdFJlcG9ydFRlbXBsYXRpbmdcIjtcbmltcG9ydCBJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgU2hhcmVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9WaWV3U3RhdGVcIjtcblxuY29uc3QgVGVtcGxhdGVDb250ZW50VmlldyA9IENvcmVMaWJyYXJ5LlRlbXBsYXRlQ29udGVudFZpZXcsXG5cdEluaXRpYWxMb2FkTW9kZSA9IENvcmVMaWJyYXJ5LkluaXRpYWxMb2FkTW9kZTtcblxuLyoqXG4gKiBDb250cm9sbGVyIGNsYXNzIGZvciB0aGUgbGlzdCByZXBvcnQgcGFnZSwgdXNlZCBpbnNpZGUgYW4gU0FQIEZpb3JpIGVsZW1lbnRzIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0Lkxpc3RSZXBvcnRDb250cm9sbGVyXCIpXG5jbGFzcyBMaXN0UmVwb3J0Q29udHJvbGxlciBleHRlbmRzIFBhZ2VDb250cm9sbGVyIHtcblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdEludGVybmFsUm91dGluZy5vdmVycmlkZSh7XG5cdFx0XHRvbkFmdGVyQmluZGluZzogZnVuY3Rpb24gKHRoaXM6IEludGVybmFsUm91dGluZykge1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIExpc3RSZXBvcnRDb250cm9sbGVyKS5fb25BZnRlckJpbmRpbmcoKTtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9yb3V0aW5nITogSW50ZXJuYWxSb3V0aW5nO1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0SW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoe1xuXHRcdFx0Z2V0RW50aXR5U2V0OiBmdW5jdGlvbiAodGhpczogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0cmV0dXJuICh0aGlzLmJhc2UgYXMgTGlzdFJlcG9ydENvbnRyb2xsZXIpLmdldEN1cnJlbnRFbnRpdHlTZXQoKTtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9pbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbjtcblx0QHVzaW5nRXh0ZW5zaW9uKFNpZGVFZmZlY3RzKVxuXHRzaWRlRWZmZWN0cyE6IFNpZGVFZmZlY3RzO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUpKVxuXHRpbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFNoYXJlLm92ZXJyaWRlKFNoYXJlT3ZlcnJpZGVzKSlcblx0c2hhcmUhOiBTaGFyZTtcblxuXHRAdXNpbmdFeHRlbnNpb24oVmlld1N0YXRlLm92ZXJyaWRlKFZpZXdTdGF0ZU92ZXJyaWRlcykpXG5cdHZpZXdTdGF0ZSE6IFZpZXdTdGF0ZTtcblxuXHRAdXNpbmdFeHRlbnNpb24oS1BJTWFuYWdlbWVudClcblx0a3BpTWFuYWdlbWVudCE6IEtQSU1hbmFnZW1lbnQ7XG5cdEB1c2luZ0V4dGVuc2lvbihQbGFjZWhvbGRlcilcblx0cGxhY2Vob2xkZXIhOiBQbGFjZWhvbGRlcjtcblx0QHVzaW5nRXh0ZW5zaW9uKE1hc3NFZGl0KVxuXHRtYXNzRWRpdCE6IE1hc3NFZGl0O1xuXHRwcm90ZWN0ZWQgZXh0ZW5zaW9uQVBJPzogRXh0ZW5zaW9uQVBJO1xuXHRwcml2YXRlIGZpbHRlckJhckNvbmRpdGlvbnM/OiBhbnk7XG5cdHByaXZhdGUgc1VwZGF0ZVRpbWVyPzogYW55O1xuXHRwcml2YXRlIG9SZXNvdXJjZUJ1bmRsZT86IFJlc291cmNlQnVuZGxlO1xuXHRwcml2YXRlIGhhc1BlbmRpbmdDaGFydENoYW5nZXM/OiBib29sZWFuO1xuXHRwcml2YXRlIGhhc1BlbmRpbmdUYWJsZUNoYW5nZXM/OiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGV4dGVuc2lvbiBBUEkgZm9yIHRoZSBjdXJyZW50IHBhZ2UuXG5cdCAqXG5cdCAqIEBwdWJsaWNcblx0ICogQHJldHVybnMgVGhlIGV4dGVuc2lvbiBBUEkuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0RXh0ZW5zaW9uQVBJKCk6IEV4dGVuc2lvbkFQSSB7XG5cdFx0aWYgKCF0aGlzLmV4dGVuc2lvbkFQSSkge1xuXHRcdFx0dGhpcy5leHRlbnNpb25BUEkgPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25BUEk7XG5cdH1cblxuXHRvbkluaXQoKSB7XG5cdFx0UGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLm9uSW5pdC5hcHBseSh0aGlzKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGFzUGVuZGluZ0ZpbHRlcnNcIiwgdHJ1ZSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiYXBwbGllZEZpbHRlcnNcIiwgXCJcIik7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGlkZURyYWZ0SW5mb1wiLCBmYWxzZSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwidW9tXCIsIHt9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzY2FsZWZhY3RvclwiLCB7fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic2NhbGVmYWN0b3JOdW1iZXJcIiwge30pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImN1cnJlbmN5XCIsIHt9KTtcblxuXHRcdGlmICh0aGlzLl9oYXNNdWx0aVZpc3VhbGl6YXRpb25zKCkpIHtcblx0XHRcdGxldCBhbHBDb250ZW50VmlldyA9IHRoaXMuX2dldERlZmF1bHRQYXRoKCk7XG5cdFx0XHRpZiAoIXN5c3RlbS5kZXNrdG9wICYmIGFscENvbnRlbnRWaWV3ID09PSBUZW1wbGF0ZUNvbnRlbnRWaWV3Lkh5YnJpZCkge1xuXHRcdFx0XHRhbHBDb250ZW50VmlldyA9IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQ7XG5cdFx0XHR9XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJhbHBDb250ZW50Vmlld1wiLCBhbHBDb250ZW50Vmlldyk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgY29uZGl0aW9ucyBmcm9tIGZpbHRlciBiYXJcblx0XHQvLyB0aGlzIGlzIGxhdGVyIHVzZWQgYmVmb3JlIG5hdmlnYXRpb24gdG8gZ2V0IGNvbmRpdGlvbnMgYXBwbGllZCBvbiB0aGUgZmlsdGVyIGJhclxuXHRcdHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucyA9IHt9O1xuXG5cdFx0Ly8gQXMgQXBwU3RhdGVIYW5kbGVyLmFwcGx5QXBwU3RhdGUgdHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGl0IHdpbGxcblx0XHQvLyBoYXBwZW4gYWZ0ZXIgdGhlIHJvdXRlTWF0Y2ggZXZlbnQgaGFzIGJlZW4gcHJvY2Vzc2VkIChvdGhlcndpc2UgdGhlIHJvdXRlciBnZXRzIGJyb2tlbilcblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkud2FpdEZvclJvdXRlTWF0Y2hCZWZvcmVOYXZpZ2F0aW9uKCk7XG5cblx0XHQvLyBDb25maWd1cmUgdGhlIGluaXRpYWwgbG9hZCBzZXR0aW5nc1xuXHRcdHRoaXMuX3NldEluaXRMb2FkKCk7XG5cdH1cblxuXHRvbkV4aXQoKSB7XG5cdFx0ZGVsZXRlIHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucztcblx0XHRpZiAodGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJLmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0ZGVsZXRlIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXHR9XG5cblx0X29uQWZ0ZXJCaW5kaW5nKCkge1xuXHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9nZXRDb250cm9scyhcInRhYmxlXCIpO1xuXHRcdGlmIChFZGl0U3RhdGUuaXNFZGl0U3RhdGVEaXJ0eSgpKSB7XG5cdFx0XHR0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk/LmludmFsaWRhdGVDb250ZW50KCk7XG5cdFx0XHRjb25zdCBvVGFibGVCaW5kaW5nID0gdGhpcy5fZ2V0VGFibGUoKT8uZ2V0Um93QmluZGluZygpO1xuXHRcdFx0aWYgKG9UYWJsZUJpbmRpbmcpIHtcblx0XHRcdFx0aWYgKENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLmdldFZpZXcoKSkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlcmUgaXMgYW4gaXNzdWUgaWYgd2UgdXNlIGEgdGltZW91dCB3aXRoIGEga2VwdCBhbGl2ZSBjb250ZXh0IHVzZWQgb24gYW5vdGhlciBwYWdlXG5cdFx0XHRcdFx0b1RhYmxlQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLnNVcGRhdGVUaW1lcikge1xuXHRcdFx0XHRcdFx0dGhpcy5zVXBkYXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRcdFx0b1RhYmxlQmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnNVcGRhdGVUaW1lcjtcblx0XHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFVwZGF0ZSBhY3Rpb24gZW5hYmxlbWVudCBhbmQgdmlzaWJpbGl0eSB1cG9uIHRhYmxlIGRhdGEgdXBkYXRlLlxuXHRcdFx0XHRcdGNvbnN0IGZuVXBkYXRlVGFibGVBY3Rpb25zID0gKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlVGFibGVBY3Rpb25zKGFUYWJsZXMpO1xuXHRcdFx0XHRcdFx0b1RhYmxlQmluZGluZy5kZXRhY2hEYXRhUmVjZWl2ZWQoZm5VcGRhdGVUYWJsZUFjdGlvbnMpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0b1RhYmxlQmluZGluZy5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5VcGRhdGVUYWJsZUFjdGlvbnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlUHJvY2Vzc2VkKCk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLnNVcGRhdGVUaW1lcikge1xuXHRcdFx0dGhpcy5fdXBkYXRlVGFibGVBY3Rpb25zKGFUYWJsZXMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRpZiAoIWludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiaW5pdGlhbFZhcmlhbnRBcHBsaWVkXCIpKSB7XG5cdFx0XHRjb25zdCB2aWV3SWQgPSB0aGlzLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdFx0dGhpcy5wYWdlUmVhZHkud2FpdEZvcih0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldEFwcFN0YXRlSGFuZGxlcigpLmFwcGx5QXBwU3RhdGUodmlld0lkLCB0aGlzLmdldFZpZXcoKSkpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJpbml0aWFsVmFyaWFudEFwcGxpZWRcIiwgdHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0b25CZWZvcmVSZW5kZXJpbmcoKSB7XG5cdFx0UGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLm9uQmVmb3JlUmVuZGVyaW5nLmFwcGx5KHRoaXMpO1xuXHR9XG5cblx0b25BZnRlclJlbmRlcmluZygpIHtcblx0XHQoKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdC50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdHRoaXMub1Jlc291cmNlQnVuZGxlID0gcmVzcG9uc2U7XG5cdFx0XHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9nZXRDb250cm9scygpIGFzIFRhYmxlW107XG5cdFx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmVudGl0eVNldDtcblx0XHRcdFx0Y29uc3Qgc1RleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcIlRfVEFCTEVfQU5EX0NIQVJUX05PX0RBVEFfVEVYVFwiLFxuXHRcdFx0XHRcdHRoaXMub1Jlc291cmNlQnVuZGxlIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRzRW50aXR5U2V0XG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFUYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAob1RhYmxlOiBUYWJsZSkge1xuXHRcdFx0XHRcdG9UYWJsZS5zZXROb0RhdGEoc1RleHQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblBhZ2VSZWFkeShtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmZvcmNlRm9jdXMpIHtcblx0XHRcdHRoaXMuX3NldEluaXRpYWxGb2N1cygpO1xuXHRcdH1cblx0XHQvLyBSZW1vdmUgdGhlIGhhbmRsZXIgb24gYmFjayBuYXZpZ2F0aW9uIHRoYXQgZGlzcGxheXMgRHJhZnQgY29uZmlybWF0aW9uXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odW5kZWZpbmVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlIGNvbnRlbnQgb2YgYSBjdXN0b20gdmlldyB1c2VkIGluIGEgbGlzdCByZXBvcnQgbmVlZHMgdG8gYmUgcmVmcmVzaGVkLlxuXHQgKiBUaGlzIGhhcHBlbnMgZWl0aGVyIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2Ugb24gdGhlIEZpbHRlckJhciBhbmQgdGhlIHNlYXJjaCBpcyB0cmlnZ2VyZWQsXG5cdCAqIG9yIHdoZW4gYSB0YWIgd2l0aCBjdXN0b20gY29udGVudCBpcyBzZWxlY3RlZC5cblx0ICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbiBpbiBjYXNlIG9mIGN1c3RvbWl6YXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBNYXAgY29udGFpbmluZyB0aGUgZmlsdGVyIGNvbmRpdGlvbnMgb2YgdGhlIEZpbHRlckJhciwgdGhlIGN1cnJlbnRUYWJJRFxuXHQgKiBhbmQgdGhlIHZpZXcgcmVmcmVzaCBjYXVzZSAodGFiQ2hhbmdlZCBvciBzZWFyY2gpLlxuXHQgKiBUaGUgbWFwIGxvb2tzIGxpa2UgdGhpczpcblx0ICogPGNvZGU+PHByZT5cblx0ICogXHR7XG5cdCAqIFx0XHRmaWx0ZXJDb25kaXRpb25zOiB7XG5cdCAqIFx0XHRcdENvdW50cnk6IFtcblx0ICogXHRcdFx0XHR7XG5cdCAqIFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiXG5cdCAqXHRcdFx0XHRcdHZhbGlkYXRlZDogXCJOb3RWYWxpZGF0ZWRcIlxuXHQgKlx0XHRcdFx0XHR2YWx1ZXM6IFtcIkdlcm1hbnlcIiwgLi4uXVxuXHQgKiBcdFx0XHRcdH0sXG5cdCAqIFx0XHRcdFx0Li4uXG5cdCAqIFx0XHRcdF1cblx0ICogXHRcdFx0Li4uXG5cdCAqIFx0XHR9LFxuXHQgKlx0XHRjdXJyZW50VGFiSWQ6IFwiZmU6OkN1c3RvbVRhYjo6dGFiMVwiLFxuXHQgKlx0XHRyZWZyZXNoQ2F1c2U6IFwidGFiQ2hhbmdlZFwiIHwgXCJzZWFyY2hcIlxuXHQgKlx0fVxuXHQgKiA8L3ByZT48L2NvZGU+XG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRvblZpZXdOZWVkc1JlZnJlc2gobVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdC8qIFRvIGJlIG92ZXJyaWRlbiAqL1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCBjYWxsZWQgd2hlbiBhIGZpbHRlciBvciBzZWFyY2ggdmFsdWUgaGFzIGJlZW4gY2hhbmdlZCBpbiB0aGUgRmlsdGVyQmFyLFxuXHQgKiBidXQgaGFzIG5vdCBiZWVuIHZhbGlkYXRlZCB5ZXQgYnkgdGhlIGVuZCB1c2VyICh3aXRoIHRoZSAnR28nIG9yICdTZWFyY2gnIGJ1dHRvbikuXG5cdCAqIFR5cGljYWxseSwgdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgdGFiIGlzIGdyZXllZCBvdXQgdW50aWwgdGhlIGZpbHRlcnMgYXJlIHZhbGlkYXRlZC5cblx0ICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbiBpbiBjYXNlIG9mIGN1c3RvbWl6YXRpb24uXG5cdCAqXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25QZW5kaW5nRmlsdGVycygpIHtcblx0XHQvKiBUbyBiZSBvdmVycmlkZW4gKi9cblx0fVxuXG5cdGdldEN1cnJlbnRFbnRpdHlTZXQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2dldFRhYmxlKCk/LmRhdGEoXCJ0YXJnZXRDb2xsZWN0aW9uUGF0aFwiKS5zbGljZSgxKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlICdDbGVhcicgYnV0dG9uIG9uIHRoZSBGaWx0ZXJCYXIgaXMgcHJlc3NlZC5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkFmdGVyQ2xlYXIoKSB7XG5cdFx0LyogVG8gYmUgb3ZlcnJpZGVuICovXG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaW5pdGlhdGVzIHRoZSB1cGRhdGUgb2YgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIERhdGFGaWVsZEZvckFjdGlvbiBhbmQgdGhlIHZpc2libGUgc3RhdGUgb2YgdGhlIERhdGFGaWVsZEZvcklCTiBidXR0b25zLlxuXHQgKlxuXHQgKiBAcGFyYW0gYVRhYmxlcyBBcnJheSBvZiB0YWJsZXMgaW4gdGhlIGxpc3QgcmVwb3J0XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfdXBkYXRlVGFibGVBY3Rpb25zKGFUYWJsZXM6IGFueSkge1xuXHRcdGxldCBhSUJOQWN0aW9uczogYW55W10gPSBbXTtcblx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRhSUJOQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob1RhYmxlLCBhSUJOQWN0aW9ucyk7XG5cdFx0XHQvLyBVcGRhdGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIERhdGFGaWVsZEZvckFjdGlvbiBidXR0b25zIG9uIHRhYmxlIHRvb2xiYXJcblx0XHRcdC8vIFRoZSBzYW1lIGlzIGFsc28gcGVyZm9ybWVkIG9uIFRhYmxlIHNlbGVjdGlvbkNoYW5nZSBldmVudFxuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIiksXG5cdFx0XHRcdG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgPSBKU09OLnBhcnNlKFxuXHRcdFx0XHRcdENvbW1vbkhlbHBlci5wYXJzZUN1c3RvbURhdGEoRGVsZWdhdGVVdGlsLmdldEN1c3RvbURhdGEob1RhYmxlLCBcIm9wZXJhdGlvbkF2YWlsYWJsZU1hcFwiKSlcblx0XHRcdFx0KSxcblx0XHRcdFx0YVNlbGVjdGVkQ29udGV4dHMgPSBvVGFibGUuZ2V0U2VsZWN0ZWRDb250ZXh0cygpO1xuXG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJzZWxlY3RlZENvbnRleHRzXCIsIGFTZWxlY3RlZENvbnRleHRzKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1wiLCBhU2VsZWN0ZWRDb250ZXh0cy5sZW5ndGgpO1xuXHRcdFx0VGFibGVIZWxwZXIuaGFuZGxlVGFibGVEZWxldGVFbmFibGVtZW50Rm9yU2lkZUVmZmVjdHMob1RhYmxlLCBvSW50ZXJuYWxNb2RlbENvbnRleHQpO1xuXHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgYVNlbGVjdGVkQ29udGV4dHMsIFwidGFibGVcIik7XG5cdFx0fSk7XG5cdFx0Q29tbW9uVXRpbHMudXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkoYUlCTkFjdGlvbnMsIHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBzY3JvbGxzIHRvIGEgc3BlY2lmaWMgcm93IG9uIGFsbCB0aGUgYXZhaWxhYmxlIHRhYmxlcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuTGlzdFJlcG9ydC5MaXN0UmVwb3J0Q29udHJvbGxlci5jb250cm9sbGVyI19zY3JvbGxUYWJsZXNUb1Jvd1xuXHQgKiBAcGFyYW0gc1Jvd1BhdGggVGhlIHBhdGggb2YgdGhlIHRhYmxlIHJvdyBjb250ZXh0IHRvIGJlIHNjcm9sbGVkIHRvXG5cdCAqL1xuXHRfc2Nyb2xsVGFibGVzVG9Sb3coc1Jvd1BhdGg6IHN0cmluZykge1xuXHRcdHRoaXMuX2dldENvbnRyb2xzKFwidGFibGVcIikuZm9yRWFjaChmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRcdFRhYmxlU2Nyb2xsZXIuc2Nyb2xsVGFibGVUb1JvdyhvVGFibGUsIHNSb3dQYXRoKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBzZXQgdGhlIGluaXRpYWwgZm9jdXMgd2l0aGluIHRoZSBMaXN0IFJlcG9ydCBhY2NvcmRpbmcgdG8gdGhlIFVYIGd1aWRlIGxpbmVzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5MaXN0UmVwb3J0Lkxpc3RSZXBvcnRDb250cm9sbGVyLmNvbnRyb2xsZXIjX3NldEluaXRpYWxGb2N1c1xuXHQgKi9cblx0X3NldEluaXRpYWxGb2N1cygpIHtcblx0XHRjb25zdCBkeW5hbWljUGFnZSA9IHRoaXMuX2dldER5bmFtaWNMaXN0UmVwb3J0Q29udHJvbCgpLFxuXHRcdFx0aXNIZWFkZXJFeHBhbmRlZCA9IGR5bmFtaWNQYWdlLmdldEhlYWRlckV4cGFuZGVkKCksXG5cdFx0XHRmaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkgYXMgYW55O1xuXHRcdGlmIChmaWx0ZXJCYXIpIHtcblx0XHRcdGlmIChpc0hlYWRlckV4cGFuZGVkKSB7XG5cdFx0XHRcdC8vRW5hYmxpbmcgbWFuZGF0b3J5IGZpbHRlciBmaWVsZHMgbWVzc2FnZSBkaWFsb2dcblx0XHRcdFx0aWYgKCFmaWx0ZXJCYXIuZ2V0U2hvd01lc3NhZ2VzKCkpIHtcblx0XHRcdFx0XHRmaWx0ZXJCYXIuc2V0U2hvd01lc3NhZ2VzKHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZCA9IGZpbHRlckJhci5nZXRGaWx0ZXJJdGVtcygpLmZpbmQoZnVuY3Rpb24gKG9GaWx0ZXJJdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0ZpbHRlckl0ZW0uZ2V0UmVxdWlyZWQoKSAmJiBvRmlsdGVySXRlbS5nZXRDb25kaXRpb25zKCkubGVuZ3RoID09PSAwO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0Ly9Gb2N1c2luZyBvbiB0aGUgZmlyc3QgZW1wdHkgbWFuZGF0b3J5IGZpbHRlciBmaWVsZCwgb3Igb24gdGhlIGZpcnN0IGZpbHRlciBmaWVsZCBpZiB0aGUgdGFibGUgZGF0YSBpcyBsb2FkZWRcblx0XHRcdFx0aWYgKGZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZCkge1xuXHRcdFx0XHRcdGZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZC5mb2N1cygpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuX2lzSW5pdExvYWRFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRmaWx0ZXJCYXIuZ2V0RmlsdGVySXRlbXMoKVswXS5mb2N1cygpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vRm9jdXNpbmcgb24gdGhlIEdvIGJ1dHRvblxuXHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLmJ5SWQoYCR7dGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbElkKCl9LWJ0blNlYXJjaGApPy5mb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuX2lzSW5pdExvYWRFbmFibGVkKCkpIHtcblx0XHRcdFx0dGhpcy5fZ2V0VGFibGUoKT8uZm9jdXNSb3coMCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX2dldFRhYmxlKCk/LmZvY3VzUm93KDApO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbigpIHtcblx0XHRjb25zdCBvTWFuaWZlc3RFbnRyeSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5hcHBcIik7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRpdGxlOiBvTWFuaWZlc3RFbnRyeS50aXRsZSxcblx0XHRcdHN1YnRpdGxlOiBvTWFuaWZlc3RFbnRyeS5zdWJUaXRsZSB8fCBcIlwiLFxuXHRcdFx0aW50ZW50OiBcIlwiLFxuXHRcdFx0aWNvbjogXCJcIlxuXHRcdH07XG5cdH1cblxuXHRfZ2V0RmlsdGVyQmFyQ29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sSWQoKSkgYXMgRmlsdGVyQmFyO1xuXHR9XG5cblx0X2dldER5bmFtaWNMaXN0UmVwb3J0Q29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuYnlJZCh0aGlzLl9nZXREeW5hbWljTGlzdFJlcG9ydENvbnRyb2xJZCgpKSBhcyBEeW5hbWljUGFnZTtcblx0fVxuXG5cdF9nZXRBZGFwdGF0aW9uRmlsdGVyQmFyQ29udHJvbCgpIHtcblx0XHQvLyBJZiB0aGUgYWRhcHRhdGlvbiBmaWx0ZXIgYmFyIGlzIHBhcnQgb2YgdGhlIERPTSB0cmVlLCB0aGUgXCJBZGFwdCBGaWx0ZXJcIiBkaWFsb2cgaXMgb3Blbixcblx0XHQvLyBhbmQgd2UgcmV0dXJuIHRoZSBhZGFwdGF0aW9uIGZpbHRlciBiYXIgYXMgYW4gYWN0aXZlIGNvbnRyb2wgKHZpc2libGUgZm9yIHRoZSB1c2VyKVxuXHRcdGNvbnN0IGFkYXB0YXRpb25GaWx0ZXJCYXIgPSAodGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpIGFzIGFueSkuZ2V0SW5idWlsdEZpbHRlcigpO1xuXHRcdHJldHVybiBhZGFwdGF0aW9uRmlsdGVyQmFyPy5nZXRQYXJlbnQoKSA/IGFkYXB0YXRpb25GaWx0ZXJCYXIgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZ2V0U2VnbWVudGVkQnV0dG9uKHNDb250cm9sOiBhbnkpIHtcblx0XHRjb25zdCBzU2VnbWVudGVkQnV0dG9uSWQgPSAoc0NvbnRyb2wgPT09IFwiQ2hhcnRcIiA/IHRoaXMuZ2V0Q2hhcnRDb250cm9sKCkgOiB0aGlzLl9nZXRUYWJsZSgpKT8uZGF0YShcInNlZ21lbnRlZEJ1dHRvbklkXCIpO1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5ieUlkKHNTZWdtZW50ZWRCdXR0b25JZCk7XG5cdH1cblxuXHRfZ2V0Q29udHJvbEZyb21QYWdlTW9kZWxQcm9wZXJ0eShzUGF0aDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgY29udHJvbElkID0gdGhpcy5fZ2V0UGFnZU1vZGVsKCk/LmdldFByb3BlcnR5KHNQYXRoKTtcblx0XHRyZXR1cm4gY29udHJvbElkICYmIHRoaXMuZ2V0VmlldygpLmJ5SWQoY29udHJvbElkKTtcblx0fVxuXG5cdF9nZXREeW5hbWljTGlzdFJlcG9ydENvbnRyb2xJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLl9nZXRQYWdlTW9kZWwoKT8uZ2V0UHJvcGVydHkoXCIvZHluYW1pY0xpc3RSZXBvcnRJZFwiKSB8fCBcIlwiO1xuXHR9XG5cblx0X2dldEZpbHRlckJhckNvbnRyb2xJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLl9nZXRQYWdlTW9kZWwoKT8uZ2V0UHJvcGVydHkoXCIvZmlsdGVyQmFySWRcIikgfHwgXCJcIjtcblx0fVxuXG5cdGdldENoYXJ0Q29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0Q29udHJvbEZyb21QYWdlTW9kZWxQcm9wZXJ0eShcIi9zaW5nbGVDaGFydElkXCIpO1xuXHR9XG5cblx0X2dldFZpc3VhbEZpbHRlckJhckNvbnRyb2woKSB7XG5cdFx0Y29uc3Qgc1Zpc3VhbEZpbHRlckJhcklkID0gU3RhYmxlSWRIZWxwZXIuZ2VuZXJhdGUoW1widmlzdWFsRmlsdGVyXCIsIHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2xJZCgpXSk7XG5cdFx0cmV0dXJuIHNWaXN1YWxGaWx0ZXJCYXJJZCAmJiB0aGlzLmdldFZpZXcoKS5ieUlkKHNWaXN1YWxGaWx0ZXJCYXJJZCk7XG5cdH1cblx0X2dldEZpbHRlckJhclZhcmlhbnRDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLl9nZXRDb250cm9sRnJvbVBhZ2VNb2RlbFByb3BlcnR5KFwiL3ZhcmlhbnRNYW5hZ2VtZW50L2lkXCIpO1xuXHR9XG5cblx0X2dldE11bHRpTW9kZUNvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmJ5SWQoXCJmZTo6VGFiTXVsdGlwbGVNb2RlOjpDb250cm9sXCIpIGFzIE11bHRpcGxlTW9kZUNvbnRyb2w7XG5cdH1cblxuXHRfZ2V0VGFibGUoKTogVGFibGUgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLl9pc011bHRpTW9kZSgpKSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbCA9IHRoaXMuX2dldE11bHRpTW9kZUNvbnRyb2woKT8uZ2V0U2VsZWN0ZWRJbm5lckNvbnRyb2woKT8uY29udGVudDtcblx0XHRcdHJldHVybiBvQ29udHJvbD8uaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSA/IChvQ29udHJvbCBhcyBUYWJsZSkgOiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLl9nZXRDb250cm9sRnJvbVBhZ2VNb2RlbFByb3BlcnR5KFwiL3NpbmdsZVRhYmxlSWRcIikgYXMgVGFibGU7XG5cdFx0fVxuXHR9XG5cdF9nZXRDb250cm9scyhzS2V5PzogYW55KSB7XG5cdFx0aWYgKHRoaXMuX2lzTXVsdGlNb2RlKCkpIHtcblx0XHRcdGNvbnN0IGFDb250cm9sczogYW55W10gPSBbXTtcblx0XHRcdGNvbnN0IG9UYWJNdWx0aU1vZGUgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCkuY29udGVudDtcblx0XHRcdG9UYWJNdWx0aU1vZGUuZ2V0SXRlbXMoKS5mb3JFYWNoKChvSXRlbTogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9Db250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChvSXRlbS5nZXRLZXkoKSk7XG5cdFx0XHRcdGlmIChvQ29udHJvbCAmJiBzS2V5KSB7XG5cdFx0XHRcdFx0aWYgKG9JdGVtLmdldEtleSgpLmluZGV4T2YoYGZlOjoke3NLZXl9YCkgPiAtMSkge1xuXHRcdFx0XHRcdFx0YUNvbnRyb2xzLnB1c2gob0NvbnRyb2wpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChvQ29udHJvbCAhPT0gdW5kZWZpbmVkICYmIG9Db250cm9sICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0YUNvbnRyb2xzLnB1c2gob0NvbnRyb2wpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBhQ29udHJvbHM7XG5cdFx0fSBlbHNlIGlmIChzS2V5ID09PSBcIkNoYXJ0XCIpIHtcblx0XHRcdGNvbnN0IG9DaGFydCA9IHRoaXMuZ2V0Q2hhcnRDb250cm9sKCk7XG5cdFx0XHRyZXR1cm4gb0NoYXJ0ID8gW29DaGFydF0gOiBbXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb1RhYmxlID0gdGhpcy5fZ2V0VGFibGUoKTtcblx0XHRcdHJldHVybiBvVGFibGUgPyBbb1RhYmxlXSA6IFtdO1xuXHRcdH1cblx0fVxuXG5cdF9nZXREZWZhdWx0UGF0aCgpIHtcblx0XHRjb25zdCBkZWZhdWx0UGF0aCA9IExpc3RSZXBvcnRUZW1wbGF0aW5nLmdldERlZmF1bHRQYXRoKHRoaXMuX2dldFBhZ2VNb2RlbCgpPy5nZXRQcm9wZXJ0eShcIi92aWV3c1wiKSB8fCBbXSk7XG5cdFx0c3dpdGNoIChkZWZhdWx0UGF0aCkge1xuXHRcdFx0Y2FzZSBcInByaW1hcnlcIjpcblx0XHRcdFx0cmV0dXJuIFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQ7XG5cdFx0XHRjYXNlIFwic2Vjb25kYXJ5XCI6XG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZUNvbnRlbnRWaWV3LlRhYmxlO1xuXHRcdFx0Y2FzZSBcImJvdGhcIjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZUNvbnRlbnRWaWV3Lkh5YnJpZDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGtub3cgaWYgTGlzdFJlcG9ydCBpcyBjb25maWd1cmVkIHdpdGggTXVsdGlwbGUgVGFibGUgbW9kZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9pc011bHRpTW9kZVxuXHQgKiBAcmV0dXJucyBJcyBNdWx0aXBsZSBUYWJsZSBtb2RlIHNldD9cblx0ICovXG5cdF9pc011bHRpTW9kZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISF0aGlzLl9nZXRQYWdlTW9kZWwoKT8uZ2V0UHJvcGVydHkoXCIvbXVsdGlWaWV3c0NvbnRyb2xcIik7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGtub3cgaWYgTGlzdFJlcG9ydCBpcyBjb25maWd1cmVkIHRvIGxvYWQgZGF0YSBhdCBzdGFydCB1cC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9pc0luaXRMb2FkRGlzYWJsZWRcblx0ICogQHJldHVybnMgSXMgSW5pdExvYWQgZW5hYmxlZD9cblx0ICovXG5cdF9pc0luaXRMb2FkRW5hYmxlZCgpOiBib29sZWFuIHtcblx0XHRjb25zdCBpbml0TG9hZE1vZGUgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmluaXRpYWxMb2FkO1xuXHRcdHJldHVybiBpbml0TG9hZE1vZGUgPT09IEluaXRpYWxMb2FkTW9kZS5FbmFibGVkO1xuXHR9XG5cblx0X2hhc011bHRpVmlzdWFsaXphdGlvbnMoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2dldFBhZ2VNb2RlbCgpPy5nZXRQcm9wZXJ0eShcIi9oYXNNdWx0aVZpc3VhbGl6YXRpb25zXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBzdXNwZW5kIHNlYXJjaCBvbiB0aGUgZmlsdGVyIGJhci4gVGhlIGluaXRpYWwgbG9hZGluZyBvZiBkYXRhIGlzIGRpc2FibGVkIGJhc2VkIG9uIHRoZSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIEluaXRMb2FkIC0gRGlzYWJsZWQvQXV0by5cblx0ICogSXQgaXMgZW5hYmxlZCBsYXRlciB3aGVuIHRoZSB2aWV3IHN0YXRlIGlzIHNldCwgd2hlbiBpdCBpcyBwb3NzaWJsZSB0byByZWFsaXplIGlmIHRoZXJlIGFyZSBkZWZhdWx0IGZpbHRlcnMuXG5cdCAqL1xuXHRfZGlzYWJsZUluaXRMb2FkKCkge1xuXHRcdGNvbnN0IGZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHQvLyBjaGVjayBmb3IgZmlsdGVyIGJhciBoaWRkZW5cblx0XHRpZiAoZmlsdGVyQmFyKSB7XG5cdFx0XHRmaWx0ZXJCYXIuc2V0U3VzcGVuZFNlbGVjdGlvbih0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIGNhbGxlZCBieSBmbGV4IHRvIGRldGVybWluZSBpZiB0aGUgYXBwbHlBdXRvbWF0aWNhbGx5IHNldHRpbmcgb24gdGhlIHZhcmlhbnQgaXMgdmFsaWQuXG5cdCAqIENhbGxlZCBvbmx5IGZvciBTdGFuZGFyZCBWYXJpYW50IGFuZCBvbmx5IHdoZW4gdGhlcmUgaXMgZGlzcGxheSB0ZXh0IHNldCBmb3IgYXBwbHlBdXRvbWF0aWNhbGx5IChGRSBvbmx5IHNldHMgaXQgZm9yIEF1dG8pLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBCb29sZWFuIHRydWUgaWYgZGF0YSBzaG91bGQgYmUgbG9hZGVkIGF1dG9tYXRpY2FsbHksIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0X2FwcGx5QXV0b21hdGljYWxseU9uU3RhbmRhcmRWYXJpYW50KCkge1xuXHRcdC8vIFdlIGFsd2F5cyByZXR1cm4gZmFsc2UgYW5kIHRha2UgY2FyZSBvZiBpdCB3aGVuIHZpZXcgc3RhdGUgaXMgc2V0XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbmZpZ3VyZSB0aGUgc2V0dGluZ3MgZm9yIGluaXRpYWwgbG9hZCBiYXNlZCBvblxuXHQgKiAtIG1hbmlmZXN0IHNldHRpbmcgaW5pdExvYWQgLSBFbmFibGVkL0Rpc2FibGVkL0F1dG9cblx0ICogLSB1c2VyJ3Mgc2V0dGluZyBvZiBhcHBseUF1dG9tYXRpY2FsbHkgb24gdmFyaWFudFxuXHQgKiAtIGlmIHRoZXJlIGFyZSBkZWZhdWx0IGZpbHRlcnNcblx0ICogV2UgZGlzYWJsZSB0aGUgZmlsdGVyIGJhciBzZWFyY2ggYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5hYmxlIGl0IHdoZW4gdmlldyBzdGF0ZSBpcyBzZXQuXG5cdCAqL1xuXHRfc2V0SW5pdExvYWQoKSB7XG5cdFx0Ly8gaWYgaW5pdExvYWQgaXMgRGlzYWJsZWQgb3IgQXV0bywgc3dpdGNoIG9mZiBmaWx0ZXIgYmFyIHNlYXJjaCB0ZW1wb3JhcmlseSBhdCBzdGFydFxuXHRcdGlmICghdGhpcy5faXNJbml0TG9hZEVuYWJsZWQoKSkge1xuXHRcdFx0dGhpcy5fZGlzYWJsZUluaXRMb2FkKCk7XG5cdFx0fVxuXHRcdC8vIHNldCBob29rIGZvciBmbGV4IGZvciB3aGVuIHN0YW5kYXJkIHZhcmlhbnQgaXMgc2V0IChhdCBzdGFydCBvciBieSB1c2VyIGF0IHJ1bnRpbWUpXG5cdFx0Ly8gcmVxdWlyZWQgdG8gb3ZlcnJpZGUgdGhlIHVzZXIgc2V0dGluZyAnYXBwbHkgYXV0b21hdGljYWxseScgYmVoYXZpb3VyIGlmIHRoZXJlIGFyZSBubyBmaWx0ZXJzXG5cdFx0Y29uc3QgdmFyaWFudE1hbmFnZW1lbnRJZDogYW55ID0gTGlzdFJlcG9ydFRlbXBsYXRpbmcuZ2V0VmFyaWFudEJhY2tSZWZlcmVuY2UodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSwgdGhpcy5fZ2V0UGFnZU1vZGVsKCkpO1xuXHRcdGNvbnN0IHZhcmlhbnRNYW5hZ2VtZW50ID0gdmFyaWFudE1hbmFnZW1lbnRJZCAmJiB0aGlzLmdldFZpZXcoKS5ieUlkKHZhcmlhbnRNYW5hZ2VtZW50SWQpO1xuXHRcdGlmICh2YXJpYW50TWFuYWdlbWVudCkge1xuXHRcdFx0dmFyaWFudE1hbmFnZW1lbnQucmVnaXN0ZXJBcHBseUF1dG9tYXRpY2FsbHlPblN0YW5kYXJkVmFyaWFudCh0aGlzLl9hcHBseUF1dG9tYXRpY2FsbHlPblN0YW5kYXJkVmFyaWFudC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdH1cblxuXHRfc2V0U2hhcmVNb2RlbCgpIHtcblx0XHQvLyBUT0RPOiBkZWFjdGl2YXRlZCBmb3Igbm93IC0gY3VycmVudGx5IHRoZXJlIGlzIG5vIF90ZW1wbFByaXYgYW55bW9yZSwgdG8gYmUgZGlzY3Vzc2VkXG5cdFx0Ly8gdGhpcyBtZXRob2QgaXMgY3VycmVudGx5IG5vdCBjYWxsZWQgYW55bW9yZSBmcm9tIHRoZSBpbml0IG1ldGhvZFxuXG5cdFx0Y29uc3QgZm5HZXRVc2VyID0gT2JqZWN0UGF0aC5nZXQoXCJzYXAudXNoZWxsLkNvbnRhaW5lci5nZXRVc2VyXCIpO1xuXHRcdC8vdmFyIG9NYW5pZmVzdCA9IHRoaXMuZ2V0T3duZXJDb21wb25lbnQoKS5nZXRBcHBDb21wb25lbnQoKS5nZXRNZXRhZGF0YSgpLmdldE1hbmlmZXN0RW50cnkoXCJzYXAudWlcIik7XG5cdFx0Ly92YXIgc0Jvb2ttYXJrSWNvbiA9IChvTWFuaWZlc3QgJiYgb01hbmlmZXN0Lmljb25zICYmIG9NYW5pZmVzdC5pY29ucy5pY29uKSB8fCBcIlwiO1xuXG5cdFx0Ly9zaGFyZU1vZGVsOiBIb2xkcyBhbGwgdGhlIHNoYXJpbmcgcmVsZXZhbnQgaW5mb3JtYXRpb24gYW5kIGluZm8gdXNlZCBpbiBYTUwgdmlld1xuXHRcdGNvbnN0IG9TaGFyZUluZm8gPSB7XG5cdFx0XHRib29rbWFya1RpdGxlOiBkb2N1bWVudC50aXRsZSwgLy9UbyBuYW1lIHRoZSBib29rbWFyayBhY2NvcmRpbmcgdG8gdGhlIGFwcCB0aXRsZS5cblx0XHRcdGJvb2ttYXJrQ3VzdG9tVXJsOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbnN0IHNIYXNoID0gaGFzaGVyLmdldEhhc2goKTtcblx0XHRcdFx0cmV0dXJuIHNIYXNoID8gYCMke3NIYXNofWAgOiB3aW5kb3cubG9jYXRpb24uaHJlZjtcblx0XHRcdH0sXG5cdFx0XHQvKlxuXHRcdFx0XHRcdFx0XHRUbyBiZSBhY3RpdmF0ZWQgb25jZSB0aGUgRkxQIHNob3dzIHRoZSBjb3VudCAtIHNlZSBjb21tZW50IGFib3ZlXG5cdFx0XHRcdFx0XHRcdGJvb2ttYXJrU2VydmljZVVybDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly92YXIgb1RhYmxlID0gb1RhYmxlLmdldElubmVyVGFibGUoKTsgb1RhYmxlIGlzIGFscmVhZHkgdGhlIHNhcC5mZSB0YWJsZSAoYnV0IG5vdCB0aGUgaW5uZXIgb25lKVxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIHNob3VsZCB1c2UgdGFibGUuZ2V0TGlzdEJpbmRpbmdJbmZvIGluc3RlYWQgb2YgdGhlIGJpbmRpbmdcblx0XHRcdFx0XHRcdFx0XHR2YXIgb0JpbmRpbmcgPSBvVGFibGUuZ2V0QmluZGluZyhcInJvd3NcIikgfHwgb1RhYmxlLmdldEJpbmRpbmcoXCJpdGVtc1wiKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0JpbmRpbmcgPyBmbkdldERvd25sb2FkVXJsKG9CaW5kaW5nKSA6IFwiXCI7XG5cdFx0XHRcdFx0XHRcdH0sKi9cblx0XHRcdGlzU2hhcmVJbkphbUFjdGl2ZTogISFmbkdldFVzZXIgJiYgZm5HZXRVc2VyKCkuaXNKYW1BY3RpdmUoKVxuXHRcdH07XG5cblx0XHRjb25zdCBvVGVtcGxhdGVQcml2YXRlTW9kZWwgPSB0aGlzLmdldE93bmVyQ29tcG9uZW50KCkuZ2V0TW9kZWwoXCJfdGVtcGxQcml2XCIpIGFzIEpTT05Nb2RlbDtcblx0XHRvVGVtcGxhdGVQcml2YXRlTW9kZWwuc2V0UHJvcGVydHkoXCIvbGlzdFJlcG9ydC9zaGFyZVwiLCBvU2hhcmVJbmZvKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gdXBkYXRlIHRoZSBsb2NhbCBVSSBtb2RlbCBvZiB0aGUgcGFnZSB3aXRoIHRoZSBmaWVsZHMgdGhhdCBhcmUgbm90IGFwcGxpY2FibGUgdG8gdGhlIGZpbHRlciBiYXIgKHRoaXMgaXMgc3BlY2lmaWMgdG8gdGhlIEFMUCBzY2VuYXJpbykuXG5cdCAqXG5cdCAqIEBwYXJhbSBvSW50ZXJuYWxNb2RlbENvbnRleHQgVGhlIGludGVybmFsIG1vZGVsIGNvbnRleHRcblx0ICogQHBhcmFtIG9GaWx0ZXJCYXIgTURDIGZpbHRlciBiYXJcblx0ICovXG5cdF91cGRhdGVBTFBOb3RBcHBsaWNhYmxlRmllbGRzKG9JbnRlcm5hbE1vZGVsQ29udGV4dDogSW50ZXJuYWxNb2RlbENvbnRleHQsIG9GaWx0ZXJCYXI6IEZpbHRlckJhcikge1xuXHRcdGNvbnN0IG1DYWNoZTogYW55ID0ge307XG5cdFx0Y29uc3QgaWdub3JlZEZpZWxkczogYW55ID0ge30sXG5cdFx0XHRhVGFibGVzID0gdGhpcy5fZ2V0Q29udHJvbHMoXCJ0YWJsZVwiKSxcblx0XHRcdGFDaGFydHMgPSB0aGlzLl9nZXRDb250cm9scyhcIkNoYXJ0XCIpO1xuXG5cdFx0aWYgKCFhVGFibGVzLmxlbmd0aCB8fCAhYUNoYXJ0cy5sZW5ndGgpIHtcblx0XHRcdC8vIElmIHRoZXJlJ3Mgbm90IGEgdGFibGUgYW5kIGEgY2hhcnQsIHdlJ3JlIG5vdCBpbiB0aGUgQUxQIGNhc2Vcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGb3IgdGhlIG1vbWVudCwgdGhlcmUncyBub3RoaW5nIGZvciB0YWJsZXMuLi5cblx0XHRhQ2hhcnRzLmZvckVhY2goZnVuY3Rpb24gKG9DaGFydDogYW55KSB7XG5cdFx0XHRjb25zdCBzQ2hhcnRFbnRpdHlQYXRoID0gb0NoYXJ0LmRhdGEoXCJ0YXJnZXRDb2xsZWN0aW9uUGF0aFwiKSxcblx0XHRcdFx0c0NoYXJ0RW50aXR5U2V0ID0gc0NoYXJ0RW50aXR5UGF0aC5zbGljZSgxKSxcblx0XHRcdFx0c0NhY2hlS2V5ID0gYCR7c0NoYXJ0RW50aXR5U2V0fUNoYXJ0YDtcblx0XHRcdGlmICghbUNhY2hlW3NDYWNoZUtleV0pIHtcblx0XHRcdFx0bUNhY2hlW3NDYWNoZUtleV0gPSBGaWx0ZXJVdGlscy5nZXROb3RBcHBsaWNhYmxlRmlsdGVycyhvRmlsdGVyQmFyLCBvQ2hhcnQpO1xuXHRcdFx0fVxuXHRcdFx0aWdub3JlZEZpZWxkc1tzQ2FjaGVLZXldID0gbUNhY2hlW3NDYWNoZUtleV07XG5cdFx0fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY29udHJvbHMvaWdub3JlZEZpZWxkc1wiLCBpZ25vcmVkRmllbGRzKTtcblx0fVxuXG5cdF9pc0ZpbHRlckJhckhpZGRlbigpIHtcblx0XHRyZXR1cm4gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5oaWRlRmlsdGVyQmFyO1xuXHR9XG5cblx0X2dldEFwcGx5QXV0b21hdGljYWxseU9uVmFyaWFudChWYXJpYW50TWFuYWdlbWVudDogYW55LCBrZXk6IHN0cmluZyk6IEJvb2xlYW4ge1xuXHRcdGlmICghVmFyaWFudE1hbmFnZW1lbnQgfHwgIWtleSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCB2YXJpYW50cyA9IFZhcmlhbnRNYW5hZ2VtZW50LmdldFZhcmlhbnRzKCk7XG5cdFx0Y29uc3QgY3VycmVudFZhcmlhbnQgPSB2YXJpYW50cy5maW5kKGZ1bmN0aW9uICh2YXJpYW50OiBhbnkpIHtcblx0XHRcdHJldHVybiB2YXJpYW50ICYmIHZhcmlhbnQua2V5ID09PSBrZXk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIChjdXJyZW50VmFyaWFudCAmJiBjdXJyZW50VmFyaWFudC5leGVjdXRlT25TZWxlY3QpIHx8IGZhbHNlO1xuXHR9XG5cblx0X3Nob3VsZEF1dG9UcmlnZ2VyU2VhcmNoKG9WTTogYW55KSB7XG5cdFx0aWYgKFxuXHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5pbml0aWFsTG9hZCA9PT0gSW5pdGlhbExvYWRNb2RlLkF1dG8gJiZcblx0XHRcdCghb1ZNIHx8IG9WTS5nZXRTdGFuZGFyZFZhcmlhbnRLZXkoKSA9PT0gb1ZNLmdldEN1cnJlbnRWYXJpYW50S2V5KCkpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBvRmlsdGVyQmFyID0gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpO1xuXHRcdFx0aWYgKG9GaWx0ZXJCYXIpIHtcblx0XHRcdFx0Y29uc3Qgb0NvbmRpdGlvbnMgPSBvRmlsdGVyQmFyLmdldENvbmRpdGlvbnMoKTtcblx0XHRcdFx0Zm9yIChjb25zdCBzS2V5IGluIG9Db25kaXRpb25zKSB7XG5cdFx0XHRcdFx0Ly8gaWdub3JlIGZpbHRlcnMgc3RhcnRpbmcgd2l0aCAkIChlLmcuICRzZWFyY2gsICRlZGl0U3RhdGUpXG5cdFx0XHRcdFx0aWYgKCFzS2V5LnN0YXJ0c1dpdGgoXCIkXCIpICYmIEFycmF5LmlzQXJyYXkob0NvbmRpdGlvbnNbc0tleV0pICYmIG9Db25kaXRpb25zW3NLZXldLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Ly8gbG9hZCBkYXRhIGFzIHBlciB1c2VyJ3Mgc2V0dGluZyBvZiBhcHBseUF1dG9tYXRpY2FsbHkgb24gdGhlIHZhcmlhbnRcblx0XHRcdFx0XHRcdGNvbnN0IHN0YW5kYXJkVmFyaWFudDogYW55ID0gb1ZNLmdldFZhcmlhbnRzKCkuZmluZCgodmFyaWFudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YXJpYW50LmtleSA9PT0gb1ZNLmdldEN1cnJlbnRWYXJpYW50S2V5KCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHJldHVybiBzdGFuZGFyZFZhcmlhbnQgJiYgc3RhbmRhcmRWYXJpYW50LmV4ZWN1dGVPblNlbGVjdDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0X3VwZGF0ZVRhYmxlKG9UYWJsZTogYW55KSB7XG5cdFx0aWYgKCFvVGFibGUuaXNUYWJsZUJvdW5kKCkgfHwgdGhpcy5oYXNQZW5kaW5nQ2hhcnRDaGFuZ2VzKSB7XG5cdFx0XHRvVGFibGUucmViaW5kKCk7XG5cdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRfdXBkYXRlQ2hhcnQob0NoYXJ0OiBhbnkpIHtcblx0XHRjb25zdCBvSW5uZXJDaGFydCA9IG9DaGFydC5nZXRDb250cm9sRGVsZWdhdGUoKS5fZ2V0Q2hhcnQob0NoYXJ0KTtcblx0XHRpZiAoIShvSW5uZXJDaGFydCAmJiBvSW5uZXJDaGFydC5pc0JvdW5kKFwiZGF0YVwiKSkgfHwgdGhpcy5oYXNQZW5kaW5nVGFibGVDaGFuZ2VzKSB7XG5cdFx0XHRvQ2hhcnQuZ2V0Q29udHJvbERlbGVnYXRlKCkucmViaW5kKG9DaGFydCwgb0lubmVyQ2hhcnQuZ2V0QmluZGluZ0luZm8oXCJkYXRhXCIpKTtcblx0XHRcdHRoaXMuaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcyA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGhhbmRsZXJzID0ge1xuXHRcdG9uRmlsdGVyU2VhcmNoKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyKSB7XG5cdFx0XHR0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCkudHJpZ2dlclNlYXJjaCgpO1xuXHRcdH0sXG5cdFx0b25GaWx0ZXJzQ2hhbmdlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9GaWx0ZXJCYXIgPSB0aGlzLl9nZXRGaWx0ZXJCYXJDb250cm9sKCk7XG5cdFx0XHRpZiAob0ZpbHRlckJhcikge1xuXHRcdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0XHQvLyBQZW5kaW5nIGZpbHRlcnMgaW50byBGaWx0ZXJCYXIgdG8gYmUgdXNlZCBmb3IgY3VzdG9tIHZpZXdzXG5cdFx0XHRcdHRoaXMub25QZW5kaW5nRmlsdGVycygpO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJhcHBsaWVkRmlsdGVyc1wiLCBvRmlsdGVyQmFyLmdldEFzc2lnbmVkRmlsdGVyc1RleHQoKS5maWx0ZXJzVGV4dCk7XG5cdFx0XHRcdGlmIChvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29uZGl0aW9uc0Jhc2VkXCIpKSB7XG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaGFzUGVuZGluZ0ZpbHRlcnNcIiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uVmFyaWFudFNlbGVjdGVkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1ZNID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdFx0Y29uc3QgY3VycmVudFZhcmlhbnRLZXkgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwia2V5XCIpO1xuXHRcdFx0Y29uc3Qgb011bHRpTW9kZUNvbnRyb2wgPSB0aGlzLl9nZXRNdWx0aU1vZGVDb250cm9sKCk7XG5cdFx0XHRjb25zdCBpbml0aWFsQ29udHJvbFN0YXRlc01hcHBlciA9IHRoaXMudmlld1N0YXRlLmluaXRpYWxDb250cm9sU3RhdGVzTWFwcGVyO1xuXG5cdFx0XHRvTXVsdGlNb2RlQ29udHJvbD8uaW52YWxpZGF0ZUNvbnRlbnQoKTtcblx0XHRcdG9NdWx0aU1vZGVDb250cm9sPy5zZXRGcmVlemVDb250ZW50KHRydWUpO1xuXHRcdFx0Ly8gUmVzZXQgdGhlIENvbnRyb2xzIE1hcHBlZCB0byB0aGUgc2VsZWN0ZWQgVk1cblx0XHRcdGNvbnN0IHZtQXNzb2NpYXRlZENvbnRyb2xzVG9SZXNldCA9IG9WTS5nZXRGb3IoKTtcblx0XHRcdE9iamVjdC5rZXlzKGluaXRpYWxDb250cm9sU3RhdGVzTWFwcGVyKS5mb3JFYWNoKChjb250cm9sS2V5KSA9PiB7XG5cdFx0XHRcdGxldCBmb3VuZCA9IGZhbHNlO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHZtQXNzb2NpYXRlZGNvbnRyb2xLZXkgb2Ygdm1Bc3NvY2lhdGVkQ29udHJvbHNUb1Jlc2V0KSB7XG5cdFx0XHRcdFx0aWYgKHZtQXNzb2NpYXRlZGNvbnRyb2xLZXkuaW5kZXhPZihjb250cm9sS2V5KSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGZvdW5kKSB7XG5cdFx0XHRcdFx0aW5pdGlhbENvbnRyb2xTdGF0ZXNNYXBwZXJbY29udHJvbEtleV0gPSB7fTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIHNldFRpbWVvdXQgY2F1c2UgdGhlIHZhcmlhbnQgbmVlZHMgdG8gYmUgYXBwbGllZCBiZWZvcmUganVkZ2luZyB0aGUgYXV0byBzZWFyY2ggb3IgdXBkYXRpbmcgdGhlIGFwcCBzdGF0ZVxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl9zaG91bGRBdXRvVHJpZ2dlclNlYXJjaChvVk0pKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGFwcCBzdGF0ZSB3aWxsIGJlIHVwZGF0ZWQgdmlhIG9uU2VhcmNoIGhhbmRsZXJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5fZ2V0RmlsdGVyQmFyQ29udHJvbCgpLnRyaWdnZXJTZWFyY2goKTtcblx0XHRcdFx0fSBlbHNlIGlmICghdGhpcy5fZ2V0QXBwbHlBdXRvbWF0aWNhbGx5T25WYXJpYW50KG9WTSwgY3VycmVudFZhcmlhbnRLZXkpKSB7XG5cdFx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCAwKTtcblx0XHR9LFxuXHRcdG9uVmFyaWFudFNhdmVkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyKSB7XG5cdFx0XHR0aGlzLnZpZXdTdGF0ZS5pbml0aWFsQ29udHJvbFN0YXRlc01hcHBlciA9IHt9O1xuXG5cdFx0XHQvL1RPRE86IFNob3VsZCByZW1vdmUgdGhpcyBzZXRUaW1lT3V0IG9uY2UgVmFyaWFudCBNYW5hZ2VtZW50IHByb3ZpZGVzIGFuIGFwaSB0byBmZXRjaCB0aGUgY3VycmVudCB2YXJpYW50IGtleSBvbiBzYXZlISEhXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0fSwgMTAwMCk7XG5cdFx0fSxcblx0XHRvblNlYXJjaCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlcikge1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRjb25zdCBvTWRjQ2hhcnQgPSB0aGlzLmdldENoYXJ0Q29udHJvbCgpO1xuXHRcdFx0Y29uc3QgYkhpZGVEcmFmdCA9IEZpbHRlclV0aWxzLmdldEVkaXRTdGF0ZUlzSGlkZURyYWZ0KG9GaWx0ZXJCYXIuZ2V0Q29uZGl0aW9ucygpKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhhc1BlbmRpbmdGaWx0ZXJzXCIsIGZhbHNlKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImhpZGVEcmFmdEluZm9cIiwgYkhpZGVEcmFmdCk7XG5cblx0XHRcdGlmICghdGhpcy5fZ2V0TXVsdGlNb2RlQ29udHJvbCgpKSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUFMUE5vdEFwcGxpY2FibGVGaWVsZHMob0ludGVybmFsTW9kZWxDb250ZXh0LCBvRmlsdGVyQmFyKTtcblx0XHRcdH1cblx0XHRcdGlmIChvTWRjQ2hhcnQpIHtcblx0XHRcdFx0Ly8gZGlzYWJsZSBib3VuZCBhY3Rpb25zIFRPRE86IHRoaXMgY2xlYXJzIGV2ZXJ5dGhpbmcgZm9yIHRoZSBjaGFydD9cblx0XHRcdFx0KG9NZGNDaGFydC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KS5zZXRQcm9wZXJ0eShcIlwiLCB7fSk7XG5cblx0XHRcdFx0Y29uc3Qgb1BhZ2VJbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9NZGNDaGFydC5nZXRCaW5kaW5nQ29udGV4dChcInBhZ2VJbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdFx0Y29uc3Qgc1RlbXBsYXRlQ29udGVudFZpZXcgPSBvUGFnZUludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KGAke29QYWdlSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UGF0aCgpfS9hbHBDb250ZW50Vmlld2ApO1xuXHRcdFx0XHRpZiAoc1RlbXBsYXRlQ29udGVudFZpZXcgPT09IFRlbXBsYXRlQ29udGVudFZpZXcuQ2hhcnQpIHtcblx0XHRcdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzVGVtcGxhdGVDb250ZW50VmlldyA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5UYWJsZSkge1xuXHRcdFx0XHRcdHRoaXMuaGFzUGVuZGluZ1RhYmxlQ2hhbmdlcyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIHN0b3JlIGZpbHRlciBiYXIgY29uZGl0aW9ucyB0byB1c2UgbGF0ZXIgd2hpbGUgbmF2aWdhdGlvblxuXHRcdFx0U3RhdGVVdGlsLnJldHJpZXZlRXh0ZXJuYWxTdGF0ZShvRmlsdGVyQmFyKVxuXHRcdFx0XHQudGhlbigob0V4dGVybmFsU3RhdGU6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZmlsdGVyQmFyQ29uZGl0aW9ucyA9IG9FeHRlcm5hbFN0YXRlLmZpbHRlcjtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIGV4dGVybmFsIHN0YXRlXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0aWYgKCh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkubGl2ZU1vZGUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN5c3RlbS5waG9uZSkge1xuXHRcdFx0XHRjb25zdCBvRHluYW1pY1BhZ2UgPSB0aGlzLl9nZXREeW5hbWljTGlzdFJlcG9ydENvbnRyb2woKTtcblx0XHRcdFx0b0R5bmFtaWNQYWdlLnNldEhlYWRlckV4cGFuZGVkKGZhbHNlKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIFRyaWdnZXJzIGFuIG91dGJvdW5kIG5hdmlnYXRpb24gd2hlbiBhIHVzZXIgY2hvb3NlcyB0aGUgY2hldnJvbi5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBvQ29udHJvbGxlclxuXHRcdCAqIEBwYXJhbSBzT3V0Ym91bmRUYXJnZXQgTmFtZSBvZiB0aGUgb3V0Ym91bmQgdGFyZ2V0IChuZWVkcyB0byBiZSBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdClcblx0XHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb3IgdGhlIHRhcmdldCBhcHBcblx0XHQgKiBAcGFyYW0gc0NyZWF0ZVBhdGggQ3JlYXRlIHBhdGggd2hlbiB0aGUgY2hldnJvbiBpcyBjcmVhdGVkLlxuXHRcdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWRcblx0XHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoXG5cdFx0XHRvQ29udHJvbGxlcjogTGlzdFJlcG9ydENvbnRyb2xsZXIsXG5cdFx0XHRzT3V0Ym91bmRUYXJnZXQ6IHN0cmluZyxcblx0XHRcdG9Db250ZXh0OiBWNENvbnRleHQsXG5cdFx0XHRzQ3JlYXRlUGF0aDogc3RyaW5nXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXIsIHNPdXRib3VuZFRhcmdldCwgb0NvbnRleHQsIHNDcmVhdGVQYXRoKTtcblx0XHR9LFxuXHRcdG9uQ2hhcnRTZWxlY3Rpb25DaGFuZ2VkKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb01kY0NoYXJ0ID0gb0V2ZW50LmdldFNvdXJjZSgpLmdldENvbnRlbnQoKSxcblx0XHRcdFx0b1RhYmxlID0gdGhpcy5fZ2V0VGFibGUoKSxcblx0XHRcdFx0YURhdGEgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiZGF0YVwiKSxcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdGlmIChhRGF0YSkge1xuXHRcdFx0XHQvLyB1cGRhdGUgYWN0aW9uIGJ1dHRvbnMgZW5hYmxlbWVudCAvIGRpc2FibGVtZW50XG5cdFx0XHRcdENoYXJ0UnVudGltZS5mblVwZGF0ZUNoYXJ0KG9FdmVudCk7XG5cdFx0XHRcdC8vIHVwZGF0ZSBzZWxlY3Rpb25zIG9uIHNlbGVjdGlvbiBvciBkZXNlbGVjdGlvblxuXHRcdFx0XHRDaGFydFV0aWxzLnNldENoYXJ0RmlsdGVycyhvTWRjQ2hhcnQpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc1RlbXBsYXRlQ29udGVudFZpZXcgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoYCR7b0ludGVybmFsTW9kZWxDb250ZXh0LmdldFBhdGgoKX0vYWxwQ29udGVudFZpZXdgKTtcblx0XHRcdGlmIChzVGVtcGxhdGVDb250ZW50VmlldyA9PT0gVGVtcGxhdGVDb250ZW50Vmlldy5DaGFydCkge1xuXHRcdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmIChvVGFibGUpIHtcblx0XHRcdFx0KG9UYWJsZSBhcyBhbnkpLnJlYmluZCgpO1xuXHRcdFx0XHR0aGlzLmhhc1BlbmRpbmdDaGFydENoYW5nZXMgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uU2VnbWVudGVkQnV0dG9uUHJlc3NlZCh0aGlzOiBMaXN0UmVwb3J0Q29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IHNTZWxlY3RlZEtleSA9IG9FdmVudC5tUGFyYW1ldGVycy5rZXkgPyBvRXZlbnQubVBhcmFtZXRlcnMua2V5IDogbnVsbDtcblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJhbHBDb250ZW50Vmlld1wiLCBzU2VsZWN0ZWRLZXkpO1xuXHRcdFx0Y29uc3Qgb0NoYXJ0ID0gdGhpcy5nZXRDaGFydENvbnRyb2woKTtcblx0XHRcdGNvbnN0IG9UYWJsZSA9IHRoaXMuX2dldFRhYmxlKCk7XG5cdFx0XHRjb25zdCBvU2VnbWVudGVkQnV0dG9uRGVsZWdhdGUgPSB7XG5cdFx0XHRcdG9uQWZ0ZXJSZW5kZXJpbmcoKSB7XG5cdFx0XHRcdFx0Y29uc3QgYUl0ZW1zID0gb1NlZ21lbnRlZEJ1dHRvbi5nZXRJdGVtcygpO1xuXHRcdFx0XHRcdGFJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChvSXRlbTogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAob0l0ZW0uZ2V0S2V5KCkgPT09IHNTZWxlY3RlZEtleSkge1xuXHRcdFx0XHRcdFx0XHRvSXRlbS5mb2N1cygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG9TZWdtZW50ZWRCdXR0b24ucmVtb3ZlRXZlbnREZWxlZ2F0ZShvU2VnbWVudGVkQnV0dG9uRGVsZWdhdGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0Y29uc3Qgb1NlZ21lbnRlZEJ1dHRvbiA9IChcblx0XHRcdFx0c1NlbGVjdGVkS2V5ID09PSBUZW1wbGF0ZUNvbnRlbnRWaWV3LlRhYmxlID8gdGhpcy5fZ2V0U2VnbWVudGVkQnV0dG9uKFwiVGFibGVcIikgOiB0aGlzLl9nZXRTZWdtZW50ZWRCdXR0b24oXCJDaGFydFwiKVxuXHRcdFx0KSBhcyBTZWdtZW50ZWRCdXR0b247XG5cdFx0XHRpZiAob1NlZ21lbnRlZEJ1dHRvbiAhPT0gb0V2ZW50LmdldFNvdXJjZSgpKSB7XG5cdFx0XHRcdG9TZWdtZW50ZWRCdXR0b24uYWRkRXZlbnREZWxlZ2F0ZShvU2VnbWVudGVkQnV0dG9uRGVsZWdhdGUpO1xuXHRcdFx0fVxuXHRcdFx0c3dpdGNoIChzU2VsZWN0ZWRLZXkpIHtcblx0XHRcdFx0Y2FzZSBUZW1wbGF0ZUNvbnRlbnRWaWV3LlRhYmxlOlxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlKG9UYWJsZSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgVGVtcGxhdGVDb250ZW50Vmlldy5DaGFydDpcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVDaGFydChvQ2hhcnQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFRlbXBsYXRlQ29udGVudFZpZXcuSHlicmlkOlxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVRhYmxlKG9UYWJsZSk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlQ2hhcnQob0NoYXJ0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHR9LFxuXHRcdG9uRmlsdGVyc1NlZ21lbnRlZEJ1dHRvblByZXNzZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBpc0NvbXBhY3QgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwia2V5XCIpID09PSBcIkNvbXBhY3RcIjtcblx0XHRcdHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKS5zZXRWaXNpYmxlKGlzQ29tcGFjdCk7XG5cdFx0XHQodGhpcy5fZ2V0VmlzdWFsRmlsdGVyQmFyQ29udHJvbCgpIGFzIENvbnRyb2wpLnNldFZpc2libGUoIWlzQ29tcGFjdCk7XG5cdFx0fSxcblx0XHRvblN0YXRlQ2hhbmdlKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyKSB7XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvbkR5bmFtaWNQYWdlVGl0bGVTdGF0ZUNoYW5nZWQodGhpczogTGlzdFJlcG9ydENvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHRjb25zdCBmaWx0ZXJCYXI6IGFueSA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGlmIChmaWx0ZXJCYXIgJiYgZmlsdGVyQmFyLmdldFNlZ21lbnRlZEJ1dHRvbigpKSB7XG5cdFx0XHRcdGlmIChvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaXNFeHBhbmRlZFwiKSkge1xuXHRcdFx0XHRcdGZpbHRlckJhci5nZXRTZWdtZW50ZWRCdXR0b24oKS5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZpbHRlckJhci5nZXRTZWdtZW50ZWRCdXR0b24oKS5zZXRWaXNpYmxlKGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Zm9ybWF0dGVycyA9IHtcblx0XHRzZXRBTFBDb250cm9sTWVzc2FnZVN0cmlwKHRoaXM6IExpc3RSZXBvcnRDb250cm9sbGVyLCBhSWdub3JlZEZpZWxkczogYW55W10sIGJJc0NoYXJ0OiBhbnksIG9BcHBseVN1cHBvcnRlZD86IGFueSkge1xuXHRcdFx0bGV0IHNUZXh0ID0gXCJcIjtcblx0XHRcdGJJc0NoYXJ0ID0gYklzQ2hhcnQgPT09IFwidHJ1ZVwiIHx8IGJJc0NoYXJ0ID09PSB0cnVlO1xuXHRcdFx0Y29uc3Qgb0ZpbHRlckJhciA9IHRoaXMuX2dldEZpbHRlckJhckNvbnRyb2woKTtcblx0XHRcdGlmIChvRmlsdGVyQmFyICYmIEFycmF5LmlzQXJyYXkoYUlnbm9yZWRGaWVsZHMpICYmIGFJZ25vcmVkRmllbGRzLmxlbmd0aCA+IDAgJiYgYklzQ2hhcnQpIHtcblx0XHRcdFx0Y29uc3QgYUlnbm9yZWRMYWJlbHMgPSBNZXNzYWdlU3RyaXAuZ2V0TGFiZWxzKFxuXHRcdFx0XHRcdGFJZ25vcmVkRmllbGRzLFxuXHRcdFx0XHRcdG9GaWx0ZXJCYXIuZGF0YShcImVudGl0eVR5cGVcIiksXG5cdFx0XHRcdFx0b0ZpbHRlckJhcixcblx0XHRcdFx0XHR0aGlzLm9SZXNvdXJjZUJ1bmRsZSBhcyBSZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBiSXNTZWFyY2hJZ25vcmVkID0gIW9BcHBseVN1cHBvcnRlZC5lbmFibGVTZWFyY2g7XG5cdFx0XHRcdHNUZXh0ID0gYklzQ2hhcnRcblx0XHRcdFx0XHQ/IE1lc3NhZ2VTdHJpcC5nZXRBTFBUZXh0KGFJZ25vcmVkTGFiZWxzLCBvRmlsdGVyQmFyLCBiSXNTZWFyY2hJZ25vcmVkKVxuXHRcdFx0XHRcdDogTWVzc2FnZVN0cmlwLmdldFRleHQoYUlnbm9yZWRMYWJlbHMsIG9GaWx0ZXJCYXIsIFwiXCIsIERlbGVnYXRlVXRpbC5nZXRMb2NhbGl6ZWRUZXh0KTtcblx0XHRcdFx0cmV0dXJuIHNUZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTGlzdFJlcG9ydENvbnRyb2xsZXI7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXNEQSxJQUFNQSxtQkFBbUIsR0FBR0MsV0FBVyxDQUFDRCxtQkFBbUI7SUFDMURFLGVBQWUsR0FBR0QsV0FBVyxDQUFDQyxlQUFlOztFQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQSxJQU9NQyxvQkFBb0IsV0FEekJDLGNBQWMsQ0FBQyxrREFBa0QsQ0FBQyxVQUVqRUMsY0FBYyxDQUNkQyxlQUFlLENBQUNDLFFBQVEsQ0FBQztJQUN4QkMsY0FBYyxFQUFFLFlBQWlDO01BQy9DLElBQUksQ0FBQ0MsT0FBTyxFQUFFLENBQUNDLGFBQWEsRUFBRSxDQUEwQkMsZUFBZSxFQUFFO0lBQzNFO0VBQ0QsQ0FBQyxDQUFDLENBQ0YsVUFFQU4sY0FBYyxDQUNkTyw2QkFBNkIsQ0FBQ0wsUUFBUSxDQUFDO0lBQ3RDTSxZQUFZLEVBQUUsWUFBK0M7TUFDNUQsT0FBUSxJQUFJLENBQUNDLElBQUksQ0FBMEJDLG1CQUFtQixFQUFFO0lBQ2pFO0VBQ0QsQ0FBQyxDQUFDLENBQ0YsVUFFQVYsY0FBYyxDQUFDVyxXQUFXLENBQUMsVUFHM0JYLGNBQWMsQ0FBQ1kscUJBQXFCLENBQUNWLFFBQVEsQ0FBQ1csNkJBQTZCLENBQUMsQ0FBQyxVQUc3RWIsY0FBYyxDQUFDYyxLQUFLLENBQUNaLFFBQVEsQ0FBQ2EsY0FBYyxDQUFDLENBQUMsVUFHOUNmLGNBQWMsQ0FBQ2dCLFNBQVMsQ0FBQ2QsUUFBUSxDQUFDZSxrQkFBa0IsQ0FBQyxDQUFDLFVBR3REakIs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