@magic-xpa/angular 4.800.0-dev480.94 → 4.801.0-dev000.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 (139) hide show
  1. package/esm2020/index.mjs +57 -0
  2. package/{esm2015/magic-xpa-angular.js → esm2020/magic-xpa-angular.mjs} +0 -0
  3. package/esm2020/src/controls.metadata.model.mjs +180 -0
  4. package/{esm2015/src/interfaces/sub-form-definition.iterface.js → esm2020/src/interfaces/sub-form-definition.iterface.mjs} +1 -0
  5. package/esm2020/src/magic.core.module.mjs +157 -0
  6. package/{esm2015/src/services/ISubformMagicService.js → esm2020/src/services/ISubformMagicService.mjs} +1 -0
  7. package/esm2020/src/services/OverlayWindowService.mjs +208 -0
  8. package/esm2020/src/services/StylesMapManager.mjs +28 -0
  9. package/esm2020/src/services/accessor.magic.service.mjs +302 -0
  10. package/{esm2015/src/services/commands-collector.magic.service.js → esm2020/src/services/commands-collector.magic.service.mjs} +7 -4
  11. package/esm2020/src/services/component-list.magic.service.mjs +46 -0
  12. package/{esm2015/src/services/confirmation.components.magic.provider.js → esm2020/src/services/confirmation.components.magic.provider.mjs} +2 -2
  13. package/esm2020/src/services/engine.magic.service.mjs +82 -0
  14. package/{esm2015/src/services/exit.magic.service.js → esm2020/src/services/exit.magic.service.mjs} +2 -2
  15. package/esm2020/src/services/magic.lazy.loader.service.mjs +16 -0
  16. package/{esm2015/src/services/magic.providers.js → esm2020/src/services/magic.providers.mjs} +0 -0
  17. package/{esm2015/src/services/magic.services.js → esm2020/src/services/magic.services.mjs} +2 -2
  18. package/{esm2015/src/services/mg-date-adapter.js → esm2020/src/services/mg-date-adapter.mjs} +2 -2
  19. package/{esm2015/src/services/overlay.conainer.magic.provider.js → esm2020/src/services/overlay.conainer.magic.provider.mjs} +2 -2
  20. package/esm2020/src/services/router-commands.magic.service.mjs +28 -0
  21. package/esm2020/src/services/subform.magic.service.mjs +185 -0
  22. package/{esm2015/src/services/table.magic.service.js → esm2020/src/services/table.magic.service.mjs} +2 -2
  23. package/esm2020/src/services/task.magics.service.mjs +611 -0
  24. package/{esm2015/src/services/title.magic.service.js → esm2020/src/services/title.magic.service.mjs} +2 -2
  25. package/esm2020/src/ui/GuiInteractiveExecutor.mjs +98 -0
  26. package/{esm2015/src/ui/components/base-magic-alert.component.js → esm2020/src/ui/components/base-magic-alert.component.mjs} +2 -2
  27. package/{esm2015/src/ui/components/base-magic-confirm.component.js → esm2020/src/ui/components/base-magic-confirm.component.mjs} +2 -2
  28. package/esm2020/src/ui/components/magic-alert.component.mjs +71 -0
  29. package/esm2020/src/ui/components/magic-confirmation-box.component.mjs +82 -0
  30. package/{esm2015/src/ui/directives/NonMagicControlDirective.js → esm2020/src/ui/directives/NonMagicControlDirective.mjs} +2 -2
  31. package/{esm2015/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.js → esm2020/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.mjs} +2 -2
  32. package/{esm2015/src/ui/directives/magic/checkbox.magic.directive.js → esm2020/src/ui/directives/magic/checkbox.magic.directive.mjs} +2 -2
  33. package/{esm2015/src/ui/directives/magic/combobox.magic.directive.js → esm2020/src/ui/directives/magic/combobox.magic.directive.mjs} +2 -2
  34. package/{esm2015/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.js → esm2020/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.mjs} +3 -4
  35. package/{esm2015/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.js → esm2020/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.mjs} +2 -2
  36. package/{esm2015/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.js → esm2020/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.mjs} +3 -4
  37. package/{esm2015/src/ui/directives/magic/input.noformcontrol.magic.directive.js → esm2020/src/ui/directives/magic/input.noformcontrol.magic.directive.mjs} +2 -2
  38. package/{esm2015/src/ui/directives/magic/nocontrol.magic.directive.js → esm2020/src/ui/directives/magic/nocontrol.magic.directive.mjs} +2 -2
  39. package/esm2020/src/ui/directives/magic/row.magic.directive.mjs +58 -0
  40. package/{esm2015/src/ui/directives/magic-focus.directive.js → esm2020/src/ui/directives/magic-focus.directive.mjs} +2 -2
  41. package/esm2020/src/ui/directives/magic.directive.mjs +207 -0
  42. package/esm2020/src/ui/directives/magicViewContainerRef.directive.mjs +20 -0
  43. package/{esm2015/src/ui/directives/mgformat.magic.directive.js → esm2020/src/ui/directives/mgformat.magic.directive.mjs} +2 -2
  44. package/{esm2015/src/ui/directives/range-validator.magic.directive.js → esm2020/src/ui/directives/range-validator.magic.directive.mjs} +2 -2
  45. package/{esm2015/src/ui/magic-confirmationBox.js → esm2020/src/ui/magic-confirmationBox.mjs} +0 -0
  46. package/{esm2015/src/ui/magic-modal/base-magic-overlay-container.js → esm2020/src/ui/magic-modal/base-magic-overlay-container.mjs} +0 -0
  47. package/{esm2015/src/ui/magic-modal/magic-modal-form.js → esm2020/src/ui/magic-modal/magic-modal-form.mjs} +0 -0
  48. package/{esm2015/src/ui/magic-modal/magic-modal-interface.js → esm2020/src/ui/magic-modal/magic-modal-interface.mjs} +1 -0
  49. package/esm2020/src/ui/magic-modal/magic-overlay-container-wrapper.mjs +135 -0
  50. package/esm2020/src/ui/magic-modal/magic-overlay-container.mjs +165 -0
  51. package/esm2020/src/ui/magic-root.component.mjs +237 -0
  52. package/esm2020/src/ui/mgerror.magic.component.mjs +120 -0
  53. package/esm2020/src/ui/pipes/date.magic.pipe.mjs +105 -0
  54. package/{esm2015/src/ui/pipes/time.magic.pipe.js → esm2020/src/ui/pipes/time.magic.pipe.mjs} +3 -3
  55. package/esm2020/src/ui/router-container.magic.component.mjs +109 -0
  56. package/esm2020/src/ui/subform.magic.component.mjs +52 -0
  57. package/{esm2015/src/ui/task-base.magic.component.js → esm2020/src/ui/task-base.magic.component.mjs} +2 -2
  58. package/{esm2015/src/ui/utils.js → esm2020/src/ui/utils.mjs} +0 -0
  59. package/fesm2015/magic-xpa-angular.mjs +4578 -0
  60. package/fesm2015/magic-xpa-angular.mjs.map +1 -0
  61. package/{fesm2015/magic-xpa-angular.js → fesm2020/magic-xpa-angular.mjs} +834 -764
  62. package/fesm2020/magic-xpa-angular.mjs.map +1 -0
  63. package/index.d.ts +1 -0
  64. package/package.json +28 -15
  65. package/src/magic.core.module.d.ts +3 -8
  66. package/src/services/OverlayWindowService.d.ts +2 -2
  67. package/src/services/accessor.magic.service.d.ts +10 -3
  68. package/src/services/commands-collector.magic.service.d.ts +2 -2
  69. package/src/services/component-list.magic.service.d.ts +3 -0
  70. package/src/services/confirmation.components.magic.provider.d.ts +2 -2
  71. package/src/services/engine.magic.service.d.ts +2 -2
  72. package/src/services/exit.magic.service.d.ts +2 -2
  73. package/src/services/magic.lazy.loader.service.d.ts +6 -0
  74. package/src/services/magic.services.d.ts +2 -2
  75. package/src/services/mg-date-adapter.d.ts +2 -2
  76. package/src/services/overlay.conainer.magic.provider.d.ts +2 -2
  77. package/src/services/router-commands.magic.service.d.ts +2 -2
  78. package/src/services/subform.magic.service.d.ts +9 -4
  79. package/src/services/table.magic.service.d.ts +2 -2
  80. package/src/services/task.magics.service.d.ts +2 -2
  81. package/src/services/title.magic.service.d.ts +2 -2
  82. package/src/ui/GuiInteractiveExecutor.d.ts +1 -0
  83. package/src/ui/components/base-magic-alert.component.d.ts +2 -2
  84. package/src/ui/components/base-magic-confirm.component.d.ts +2 -2
  85. package/src/ui/components/magic-alert.component.d.ts +2 -2
  86. package/src/ui/components/magic-confirmation-box.component.d.ts +2 -2
  87. package/src/ui/directives/NonMagicControlDirective.d.ts +2 -2
  88. package/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.d.ts +2 -2
  89. package/src/ui/directives/magic/checkbox.magic.directive.d.ts +2 -2
  90. package/src/ui/directives/magic/combobox.magic.directive.d.ts +2 -2
  91. package/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.d.ts +2 -2
  92. package/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.d.ts +2 -2
  93. package/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.d.ts +2 -2
  94. package/src/ui/directives/magic/input.noformcontrol.magic.directive.d.ts +2 -2
  95. package/src/ui/directives/magic/nocontrol.magic.directive.d.ts +2 -2
  96. package/src/ui/directives/magic/row.magic.directive.d.ts +2 -2
  97. package/src/ui/directives/magic-focus.directive.d.ts +2 -2
  98. package/src/ui/directives/magic.directive.d.ts +3 -2
  99. package/src/ui/directives/magicViewContainerRef.directive.d.ts +2 -2
  100. package/src/ui/directives/mgformat.magic.directive.d.ts +2 -2
  101. package/src/ui/directives/range-validator.magic.directive.d.ts +2 -2
  102. package/src/ui/magic-modal/magic-overlay-container-wrapper.d.ts +7 -5
  103. package/src/ui/magic-modal/magic-overlay-container.d.ts +2 -2
  104. package/src/ui/magic-root.component.d.ts +2 -2
  105. package/src/ui/mgerror.magic.component.d.ts +2 -2
  106. package/src/ui/pipes/date.magic.pipe.d.ts +2 -2
  107. package/src/ui/pipes/time.magic.pipe.d.ts +2 -2
  108. package/src/ui/router-container.magic.component.d.ts +7 -4
  109. package/src/ui/subform.magic.component.d.ts +2 -2
  110. package/src/ui/task-base.magic.component.d.ts +2 -2
  111. package/bundles/magic-xpa-angular.umd.js +0 -4973
  112. package/bundles/magic-xpa-angular.umd.js.map +0 -1
  113. package/bundles/magic-xpa-angular.umd.min.js +0 -16
  114. package/bundles/magic-xpa-angular.umd.min.js.map +0 -1
  115. package/esm2015/index.js +0 -56
  116. package/esm2015/src/controls.metadata.model.js +0 -180
  117. package/esm2015/src/magic.core.module.js +0 -173
  118. package/esm2015/src/services/OverlayWindowService.js +0 -205
  119. package/esm2015/src/services/StylesMapManager.js +0 -29
  120. package/esm2015/src/services/accessor.magic.service.js +0 -290
  121. package/esm2015/src/services/component-list.magic.service.js +0 -36
  122. package/esm2015/src/services/engine.magic.service.js +0 -82
  123. package/esm2015/src/services/router-commands.magic.service.js +0 -25
  124. package/esm2015/src/services/subform.magic.service.js +0 -161
  125. package/esm2015/src/services/task.magics.service.js +0 -610
  126. package/esm2015/src/ui/GuiInteractiveExecutor.js +0 -91
  127. package/esm2015/src/ui/components/magic-alert.component.js +0 -72
  128. package/esm2015/src/ui/components/magic-confirmation-box.component.js +0 -83
  129. package/esm2015/src/ui/directives/magic/row.magic.directive.js +0 -56
  130. package/esm2015/src/ui/directives/magic.directive.js +0 -205
  131. package/esm2015/src/ui/directives/magicViewContainerRef.directive.js +0 -20
  132. package/esm2015/src/ui/magic-modal/magic-overlay-container-wrapper.js +0 -131
  133. package/esm2015/src/ui/magic-modal/magic-overlay-container.js +0 -169
  134. package/esm2015/src/ui/magic-root.component.js +0 -237
  135. package/esm2015/src/ui/mgerror.magic.component.js +0 -120
  136. package/esm2015/src/ui/pipes/date.magic.pipe.js +0 -106
  137. package/esm2015/src/ui/router-container.magic.component.js +0 -102
  138. package/esm2015/src/ui/subform.magic.component.js +0 -52
  139. package/fesm2015/magic-xpa-angular.js.map +0 -1
@@ -1,161 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { TaskMagicService } from './task.magics.service';
3
- import { List } from '@magic-xpa/mscorelib';
4
- import { isNullOrUndefined } from 'util';
5
- import { ComponentListMagicService } from './component-list.magic.service';
6
- import { ActivatedRoute, Router } from '@angular/router';
7
- import { CommandsCollectorMagicService } from './commands-collector.magic.service';
8
- import { RouterCommandsMagicService } from '../services/router-commands.magic.service';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "./task.magics.service";
11
- import * as i2 from "@angular/router";
12
- import * as i3 from "./component-list.magic.service";
13
- import * as i4 from "./commands-collector.magic.service";
14
- import * as i5 from "../services/router-commands.magic.service";
15
- export class SubformMagicService {
16
- constructor(task, activatedRoute, componentList, pendingCommandsCollector, router, routerCommandsMagicService) {
17
- this.task = task;
18
- this.activatedRoute = activatedRoute;
19
- this.componentList = componentList;
20
- this.pendingCommandsCollector = pendingCommandsCollector;
21
- this.router = router;
22
- this.routerCommandsMagicService = routerCommandsMagicService;
23
- this.subformsDict = {};
24
- this.routesDict = {};
25
- this.currentRouteDefinition = null;
26
- }
27
- mgGetComp(subformName) {
28
- if (subformName in this.subformsDict) {
29
- let formName = this.subformsDict[subformName].formName;
30
- if (formName)
31
- return this.componentList.getComponent(formName);
32
- }
33
- return null;
34
- }
35
- mgGetParameters(subformName) {
36
- if (subformName in this.subformsDict) {
37
- return this.subformsDict[subformName].parameters;
38
- }
39
- else
40
- return "";
41
- }
42
- deleteSubformComp(subformControlName, formName) {
43
- if (Object.keys(this.subformsDict).indexOf(subformControlName) >= 0) {
44
- if (this.subformsDict[subformControlName].formName === formName) {
45
- this.subformsDict[subformControlName] = {};
46
- this.task.refreshView();
47
- }
48
- }
49
- }
50
- addSubformComp(subformControlName, formName, taskId, taskDescription, routerPath, params, inDefaultOutlet) {
51
- this.pendingCommandsCollector.startCollecting();
52
- let refreshNeeded = false;
53
- if (isNullOrUndefined(routerPath)) {
54
- if (Object.keys(this.subformsDict).indexOf(subformControlName) >= 0) {
55
- if (this.subformsDict[subformControlName].formName === formName) {
56
- this.subformsDict[subformControlName] = {};
57
- this.task.refreshView();
58
- }
59
- }
60
- this.subformsDict[subformControlName] = {
61
- formName,
62
- parameters: { taskIdParam: taskId, taskDescription: taskDescription }
63
- };
64
- refreshNeeded = true;
65
- }
66
- else {
67
- if (inDefaultOutlet)
68
- subformControlName = "primary";
69
- let routeParams = new List();
70
- routeParams.push(routerPath);
71
- if (params !== null) {
72
- routeParams = routeParams.concat(params);
73
- }
74
- let routeCommand = {
75
- callerMgSubformServiceRef: this,
76
- routerOutletName: subformControlName,
77
- formName: formName,
78
- parameters: { taskIdParam: taskId, taskDescription: taskDescription },
79
- routeParams: routeParams
80
- };
81
- if (SubformMagicService.currentCallerMgSubformServiceRef === null)
82
- this.ExecuteRouteCommand(routeCommand);
83
- else
84
- this.routerCommandsMagicService.AddRouteCommand(routeCommand);
85
- }
86
- if (refreshNeeded)
87
- this.task.refreshView();
88
- }
89
- ExecuteRouteCommand(routeCommand) {
90
- let reusingComponent = false;
91
- let currentSubformMagicService = routeCommand.callerMgSubformServiceRef;
92
- let relativeRoute = SubformMagicService.getRelativeRoute(currentSubformMagicService.activatedRoute);
93
- if (currentSubformMagicService.routesDict[routeCommand.routerOutletName] === routeCommand.routeParams[0]) {
94
- currentSubformMagicService.router.navigate([{ outlets: { [routeCommand.routerOutletName]: null } }], { relativeTo: relativeRoute })
95
- .then((result) => {
96
- SubformMagicService.currentCallerMgSubformServiceRef = currentSubformMagicService;
97
- currentSubformMagicService.currentRouteDefinition = {
98
- formName: routeCommand.formName,
99
- parameters: routeCommand.parameters
100
- };
101
- currentSubformMagicService.PerformRouterNavigate(routeCommand.routerOutletName, routeCommand.routeParams);
102
- });
103
- }
104
- else {
105
- SubformMagicService.currentCallerMgSubformServiceRef = currentSubformMagicService;
106
- currentSubformMagicService.currentRouteDefinition = {
107
- formName: routeCommand.formName,
108
- parameters: routeCommand.parameters
109
- };
110
- if (SubformMagicService.routerContainers.length > 0) {
111
- let routeContainer = SubformMagicService.routerContainers[0];
112
- SubformMagicService.routerContainers.shift();
113
- routeContainer.initializeComponent();
114
- }
115
- else {
116
- currentSubformMagicService.PerformRouterNavigate(routeCommand.routerOutletName, routeCommand.routeParams);
117
- }
118
- }
119
- }
120
- PerformRouterNavigate(routerOutletName, routeParams) {
121
- let relativeRoute = SubformMagicService.getRelativeRoute(this.activatedRoute);
122
- this.router.navigate([{ outlets: { [routerOutletName]: routeParams } }], { relativeTo: relativeRoute })
123
- .then((result) => {
124
- if (result !== null && !result) {
125
- let subformMagicService = SubformMagicService.currentCallerMgSubformServiceRef;
126
- subformMagicService.currentRouteDefinition = null;
127
- SubformMagicService.currentCallerMgSubformServiceRef = null;
128
- subformMagicService.pendingCommandsCollector.stopCollecting();
129
- subformMagicService.routerCommandsMagicService.ExecuteNextCommand();
130
- }
131
- });
132
- }
133
- init() {
134
- const pendingCommands = this.pendingCommandsCollector.GetCommands(this.task.taskId);
135
- if (pendingCommands.length > 0) {
136
- pendingCommands.forEach(command => { this.task.executeCommand(command); });
137
- this.task.refreshView();
138
- }
139
- this.pendingCommandsCollector.stopCollecting();
140
- }
141
- refreshView() {
142
- this.task.refreshView();
143
- }
144
- static getRelativeRoute(sendActivatedRoute) {
145
- let currentActiveRoute = sendActivatedRoute;
146
- if (currentActiveRoute.snapshot.routeConfig !== null && currentActiveRoute.snapshot.routeConfig.path === '') {
147
- currentActiveRoute = currentActiveRoute.parent;
148
- if (!currentActiveRoute.snapshot.routeConfig.loadChildren)
149
- console.log("getRelativeRoute(): both path and currentActiveRoute.snapshot.routeConfig.loadChildren are empty.");
150
- }
151
- return currentActiveRoute;
152
- }
153
- }
154
- SubformMagicService.currentCallerMgSubformServiceRef = null;
155
- SubformMagicService.routerContainers = new Array();
156
- SubformMagicService.ɵfac = function SubformMagicService_Factory(t) { return new (t || SubformMagicService)(i0.ɵɵinject(i1.TaskMagicService), i0.ɵɵinject(i2.ActivatedRoute), i0.ɵɵinject(i3.ComponentListMagicService), i0.ɵɵinject(i4.CommandsCollectorMagicService), i0.ɵɵinject(i2.Router), i0.ɵɵinject(i5.RouterCommandsMagicService)); };
157
- SubformMagicService.ɵprov = i0.ɵɵdefineInjectable({ token: SubformMagicService, factory: SubformMagicService.ɵfac });
158
- (function () { i0.ɵsetClassMetadata(SubformMagicService, [{
159
- type: Injectable
160
- }], function () { return [{ type: i1.TaskMagicService }, { type: i2.ActivatedRoute }, { type: i3.ComponentListMagicService }, { type: i4.CommandsCollectorMagicService }, { type: i2.Router }, { type: i5.RouterCommandsMagicService }]; }, null); })();
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViZm9ybS5tYWdpYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvc2VydmljZXMvc3ViZm9ybS5tYWdpYy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV6QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRW5GLE9BQU8sRUFBZ0IsMEJBQTBCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7OztBQVNyRyxNQUFNLE9BQU8sbUJBQW1CO0lBVTlCLFlBQW9CLElBQXNCLEVBQ3BCLGNBQThCLEVBQzlCLGFBQXdDLEVBQ3hDLHdCQUF1RCxFQUN2RCxNQUFjLEVBQ2QsMEJBQXNEO1FBTHhELFNBQUksR0FBSixJQUFJLENBQWtCO1FBQ3BCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixrQkFBYSxHQUFiLGFBQWEsQ0FBMkI7UUFDeEMsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUErQjtRQUN2RCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUE0QjtRQWI1RSxpQkFBWSxHQUEyQyxFQUFFLENBQUM7UUFDMUQsZUFBVSxHQUE0QixFQUFFLENBQUM7UUFDekMsMkJBQXNCLEdBQW9CLElBQUksQ0FBQztJQVkv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N0Msb0NBQWdCLEdBQXlDLElBQUksS0FBSyxFQUFFLENBQUM7c0ZBUmpFLG1CQUFtQjsyREFBbkIsbUJBQW1CLFdBQW5CLG1CQUFtQjtvQ0FBbkIsbUJBQW1CO2NBRC9CLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRhc2tNYWdpY1NlcnZpY2UgfSBmcm9tICcuL3Rhc2subWFnaWNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGlzdCB9IGZyb20gJ0BtYWdpYy14cGEvbXNjb3JlbGliJztcbmltcG9ydCB7IGlzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgeyBHdWlDb21tYW5kIH0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xuaW1wb3J0IHsgQ29tcG9uZW50TGlzdE1hZ2ljU2VydmljZSB9IGZyb20gJy4vY29tcG9uZW50LWxpc3QubWFnaWMuc2VydmljZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENvbW1hbmRzQ29sbGVjdG9yTWFnaWNTZXJ2aWNlIH0gZnJvbSAnLi9jb21tYW5kcy1jb2xsZWN0b3IubWFnaWMuc2VydmljZSc7XG5pbXBvcnQgeyBSb3V0ZURlZmluaXRpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzL3N1Yi1mb3JtLWRlZmluaXRpb24uaXRlcmZhY2UnO1xuaW1wb3J0IHsgUm91dGVDb21tYW5kLCBSb3V0ZXJDb21tYW5kc01hZ2ljU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3JvdXRlci1jb21tYW5kcy5tYWdpYy5zZXJ2aWNlJztcbmltcG9ydCB7IElTdWJmb3JtTWFnaWNTZXJ2aWNlIH0gZnJvbSAnLi9JU3ViZm9ybU1hZ2ljU2VydmljZSc7XG5pbXBvcnQgeyBSb3V0ZXJDb250YWluZXJNYWdpY0NvbXBvbmVudCB9IGZyb20gJy4uL3VpL3JvdXRlci1jb250YWluZXIubWFnaWMuY29tcG9uZW50JztcblxuXG4vKipcbiAqIFNlcnZpY2UgZm9yIG1hbmFnaW5nIHN1YmZvcm1zIGFuZCByb3V0aW5nXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTdWJmb3JtTWFnaWNTZXJ2aWNlIGltcGxlbWVudHMgSVN1YmZvcm1NYWdpY1NlcnZpY2V7XG5cbiAgc3ViZm9ybXNEaWN0IC8qOnsgW3g6IHN0cmluZ106IFN1YmZvcm1EZWZpbml0aW9uIH0qLyA9IHt9O1xuICByb3V0ZXNEaWN0OiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9OyAvLyBkaWN0aW9uYXJ5IG9mIHJvdXRlciBvdXRsZXQgdG8gcm91dGVyIHBhdGhcbiAgY3VycmVudFJvdXRlRGVmaW5pdGlvbjogUm91dGVEZWZpbml0aW9uID0gbnVsbDtcblxuICBzdGF0aWMgY3VycmVudENhbGxlck1nU3ViZm9ybVNlcnZpY2VSZWY6IGFueSA9IG51bGw7XG5cbiAgc3RhdGljIHJvdXRlckNvbnRhaW5lcnM6IEFycmF5PFJvdXRlckNvbnRhaW5lck1hZ2ljQ29tcG9uZW50PiA9IG5ldyBBcnJheSgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFzazogVGFza01hZ2ljU2VydmljZSxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGNvbXBvbmVudExpc3Q6IENvbXBvbmVudExpc3RNYWdpY1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBwZW5kaW5nQ29tbWFuZHNDb2xsZWN0b3I6IENvbW1hbmRzQ29sbGVjdG9yTWFnaWNTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCByb3V0ZXJDb21tYW5kc01hZ2ljU2VydmljZTogUm91dGVyQ29tbWFuZHNNYWdpY1NlcnZpY2UpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbmQgcmV0dXJucyB0aGUgY29tcG9uZW50IGFjY29yZGluZyB0byB0aGUgc3ViZm9ybSBuYW1lXG4gICAqIEBwYXJhbSBzdWJmb3JtTmFtZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgbWdHZXRDb21wKHN1YmZvcm1OYW1lOiBzdHJpbmcpOiBDb21wb25lbnQge1xuICAgIGlmIChzdWJmb3JtTmFtZSBpbiB0aGlzLnN1YmZvcm1zRGljdCkge1xuICAgICAgbGV0IGZvcm1OYW1lOiBzdHJpbmcgPSB0aGlzLnN1YmZvcm1zRGljdFtzdWJmb3JtTmFtZV0uZm9ybU5hbWU7XG4gICAgICBpZiAoZm9ybU5hbWUpXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudExpc3QuZ2V0Q29tcG9uZW50KGZvcm1OYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgc3ViZm9ybVxuICAgKiBAcGFyYW0gc3ViZm9ybU5hbWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIG1nR2V0UGFyYW1ldGVycyhzdWJmb3JtTmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoc3ViZm9ybU5hbWUgaW4gdGhpcy5zdWJmb3Jtc0RpY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLnN1YmZvcm1zRGljdFtzdWJmb3JtTmFtZV0ucGFyYW1ldGVycztcbiAgICB9XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZGVsZXRlU3ViZm9ybUNvbXAgKHN1YmZvcm1Db250cm9sTmFtZTogc3RyaW5nLCBmb3JtTmFtZTogc3RyaW5nKSAge1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zdWJmb3Jtc0RpY3QpLmluZGV4T2Yoc3ViZm9ybUNvbnRyb2xOYW1lKSA+PSAwKVxuICAgICAge1xuICAgICAgICBpZiAodGhpcy5zdWJmb3Jtc0RpY3Rbc3ViZm9ybUNvbnRyb2xOYW1lXS5mb3JtTmFtZSA9PT0gZm9ybU5hbWUpIHtcblxuICAgICAgICB0aGlzLnN1YmZvcm1zRGljdFtzdWJmb3JtQ29udHJvbE5hbWVdID0ge307XG4gICAgICAgIHRoaXMudGFzay5yZWZyZXNoVmlldygpO1xuICAgICAgICB9XG4gICAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgYWRkU3ViZm9ybUNvbXAgKHN1YmZvcm1Db250cm9sTmFtZTogc3RyaW5nLCBmb3JtTmFtZTogc3RyaW5nLCB0YXNrSWQ6IHN0cmluZywgdGFza0Rlc2NyaXB0aW9uOiBhbnksIHJvdXRlclBhdGg6IHN0cmluZywgcGFyYW1zOiBMaXN0PGFueT4sIGluRGVmYXVsdE91dGxldDogYm9vbGVhbikgIHtcbiAgICB0aGlzLnBlbmRpbmdDb21tYW5kc0NvbGxlY3Rvci5zdGFydENvbGxlY3RpbmcoKTtcblxuICAgIGxldCByZWZyZXNoTmVlZGVkID0gZmFsc2U7XG4gICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHJvdXRlclBhdGgpKSB7IC8vIGNhbGwgaW4gZGVzdGluYXRpb24gc3ViZm9ybVxuICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc3ViZm9ybXNEaWN0KS5pbmRleE9mKHN1YmZvcm1Db250cm9sTmFtZSkgPj0gMClcbiAgICAgIHtcbiAgICAgICAgaWYgKHRoaXMuc3ViZm9ybXNEaWN0W3N1YmZvcm1Db250cm9sTmFtZV0uZm9ybU5hbWUgPT09IGZvcm1OYW1lKSB7XG5cbiAgICAgICAgICB0aGlzLnN1YmZvcm1zRGljdFtzdWJmb3JtQ29udHJvbE5hbWVdID0ge307XG4gICAgICAgICAgdGhpcy50YXNrLnJlZnJlc2hWaWV3KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICAgdGhpcy5zdWJmb3Jtc0RpY3Rbc3ViZm9ybUNvbnRyb2xOYW1lXSA9IHtcbiAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7dGFza0lkUGFyYW06IHRhc2tJZCwgdGFza0Rlc2NyaXB0aW9uOiB0YXNrRGVzY3JpcHRpb259XG4gICAgICAgIH07XG4gICAgICAvL3RoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHJlZnJlc2hOZWVkZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHsgLy8gY2FsbCByb3V0ZVxuICAgICAgaWYgKGluRGVmYXVsdE91dGxldClcbiAgICAgICAgc3ViZm9ybUNvbnRyb2xOYW1lID0gXCJwcmltYXJ5XCI7XG5cbiAgICAgIGxldCByb3V0ZVBhcmFtczogTGlzdDxhbnk+ID0gbmV3IExpc3QoKTtcbiAgICAgIHJvdXRlUGFyYW1zLnB1c2gocm91dGVyUGF0aCk7XG4gICAgICBpZiAocGFyYW1zICE9PSBudWxsKSB7XG4gICAgICAgIHJvdXRlUGFyYW1zID0gPExpc3Q8YW55Pj5yb3V0ZVBhcmFtcy5jb25jYXQocGFyYW1zKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHJvdXRlQ29tbWFuZDogUm91dGVDb21tYW5kID0ge1xuICAgICAgICBjYWxsZXJNZ1N1YmZvcm1TZXJ2aWNlUmVmOiB0aGlzLFxuICAgICAgICByb3V0ZXJPdXRsZXROYW1lOiBzdWJmb3JtQ29udHJvbE5hbWUsXG4gICAgICAgIGZvcm1OYW1lOiBmb3JtTmFtZSxcbiAgICAgICAgcGFyYW1ldGVyczoge3Rhc2tJZFBhcmFtOiB0YXNrSWQsIHRhc2tEZXNjcmlwdGlvbjogdGFza0Rlc2NyaXB0aW9ufSxcbiAgICAgICAgcm91dGVQYXJhbXM6IHJvdXRlUGFyYW1zXG4gICAgICB9O1xuXG4gICAgICAvLyBJZiBTdWJmb3JtTWFnaWNTZXJ2aWNlLmN1cnJlbnRDYWxsZXJNZ1N1YmZvcm1TZXJ2aWNlUmVmICE9PSBudWxsIG1lYW5zIHRoYXQgcm91dGVyLm5hdmlnYXRlKCkgaXMgYWxyZWFkeVxuICAgICAgLy8gY2FsbGVkIG9uY2UsIGJ1dCBhbmd1bGFyIGhhcyBub3QgeWV0IGV4ZWN1dGVkIGl0IChuZ09uSW5pdCBvZiB0aGUgbmV3IGNvbXBvbmVudCBpcyBub3QgY2FsbGVkKS5cbiAgICAgIC8vIEluIHN1Y2ggYSBjYXNlLCBkbyBub3QgZXhlY3V0ZWQgcm91dGVyLm5hdmlnYXRlKCkgYWdhaW4uIEJlY2F1c2UsIGFuZ3VsYXIgaWdub3JlcyB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgLy8gU28sIHB1dCBhIGNvbW1hbmQgaW4gdGhlIHF1ZXVlIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGZpcnN0IG9uZSBpcyBleGVjdXRlZC5cbiAgICBpZiAoU3ViZm9ybU1hZ2ljU2VydmljZS5jdXJyZW50Q2FsbGVyTWdTdWJmb3JtU2VydmljZVJlZiA9PT0gbnVsbClcbiAgICAgICAgdGhpcy5FeGVjdXRlUm91dGVDb21tYW5kKHJvdXRlQ29tbWFuZCk7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMucm91dGVyQ29tbWFuZHNNYWdpY1NlcnZpY2UuQWRkUm91dGVDb21tYW5kKHJvdXRlQ29tbWFuZCk7XG4gICAgfVxuICAgIGlmICggcmVmcmVzaE5lZWRlZClcbiAgICAgIHRoaXMudGFzay5yZWZyZXNoVmlldygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIHN1YmZvcm0gdXNpbmcgYSByb3V0ZSBjb21tYW5kXG4gICAqL1xuICBFeGVjdXRlUm91dGVDb21tYW5kKHJvdXRlQ29tbWFuZDogUm91dGVDb21tYW5kKVxuICB7XG4gICAgbGV0IHJldXNpbmdDb21wb25lbnQgPSBmYWxzZTtcblxuICAgIGxldCBjdXJyZW50U3ViZm9ybU1hZ2ljU2VydmljZTogU3ViZm9ybU1hZ2ljU2VydmljZSA9IDxTdWJmb3JtTWFnaWNTZXJ2aWNlPnJvdXRlQ29tbWFuZC5jYWxsZXJNZ1N1YmZvcm1TZXJ2aWNlUmVmO1xuICAgIGxldCByZWxhdGl2ZVJvdXRlID0gIFN1YmZvcm1NYWdpY1NlcnZpY2UuZ2V0UmVsYXRpdmVSb3V0ZShjdXJyZW50U3ViZm9ybU1hZ2ljU2VydmljZS5hY3RpdmF0ZWRSb3V0ZSk7XG5cbiAgICBpZiAoY3VycmVudFN1YmZvcm1NYWdpY1NlcnZpY2Uucm91dGVzRGljdFtyb3V0ZUNvbW1hbmQucm91dGVyT3V0bGV0TmFtZV0gPT09IHJvdXRlQ29tbWFuZC5yb3V0ZVBhcmFtc1swXSlcbiAgICB7XG4gICAgICAvLyBJZiB0aGUgc3BlY2lmaWVkIHJvdXRlciBvdXRsZXQgYWxyZWFkeSBob3N0cyB0aGUgc2FtZSByb3V0ZXIgcGF0aCwgcm91dGVyLm5hdmlnYXRlKCkgZG9lc24ndCBhY3R1YWxseSBuYXZpZ2F0ZS5cbiAgICAgIC8vIFNvLCBmaXJzdCBjbGVhciB0aGUgb3V0bGV0IChwYXNzaW5nIG51bGwgcm91dGUgcGFyYW1zLCBjbGVhcnMgdGhlIG91dGxldCkgYW5kIHRoZW4gbmF2aWdhdGUgYWdhaW4uXG4gICAgICBjdXJyZW50U3ViZm9ybU1hZ2ljU2VydmljZS5yb3V0ZXIubmF2aWdhdGUoW3tvdXRsZXRzOiB7W3JvdXRlQ29tbWFuZC5yb3V0ZXJPdXRsZXROYW1lXTogbnVsbH19XSwge3JlbGF0aXZlVG86IHJlbGF0aXZlUm91dGV9KVxuICAgICAgICAudGhlbigocmVzdWx0OmJvb2xlYW4pID0+IHtcbiAgICAgICAgICBTdWJmb3JtTWFnaWNTZXJ2aWNlLmN1cnJlbnRDYWxsZXJNZ1N1YmZvcm1TZXJ2aWNlUmVmID0gY3VycmVudFN1YmZvcm1NYWdpY1NlcnZpY2U7XG4gICAgICAgICAgY3VycmVudFN1YmZvcm1NYWdpY1NlcnZpY2UuY3VycmVudFJvdXRlRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgIGZvcm1OYW1lOiByb3V0ZUNvbW1hbmQuZm9ybU5hbWUsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiByb3V0ZUNvbW1hbmQucGFyYW1ldGVyc1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjdXJyZW50U3ViZm9ybU1hZ2ljU2VydmljZS5QZXJmb3JtUm91dGVyTmF2aWdhdGUocm91dGVDb21tYW5kLnJvdXRlck91dGxldE5hbWUsIHJvdXRlQ29tbWFuZC5yb3V0ZVBhcmFtcyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBTdWJmb3JtTWFnaWNTZXJ2aWNlLmN1cnJlbnRDYWxsZXJNZ1N1YmZvcm1TZXJ2aWNlUmVmID0gY3VycmVudFN1YmZvcm1NYWdpY1NlcnZpY2U7XG4gICAgICBjdXJyZW50U3ViZm9ybU1hZ2ljU2VydmljZS5jdXJyZW50Um91dGVEZWZpbml0aW9uID0ge1xuICAgICAgICBmb3JtTmFtZTogcm91dGVDb21tYW5kLmZvcm1OYW1lLFxuICAgICAgICBwYXJhbWV0ZXJzOiByb3V0ZUNvbW1hbmQucGFyYW1ldGVyc1xuICAgICAgfTtcblxuICAgICAgaWYgKFN1YmZvcm1NYWdpY1NlcnZpY2Uucm91dGVyQ29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCByb3V0ZUNvbnRhaW5lciA9IFN1YmZvcm1NYWdpY1NlcnZpY2Uucm91dGVyQ29udGFpbmVyc1swXTtcbiAgICAgICAgU3ViZm9ybU1hZ2ljU2VydmljZS5yb3V0ZXJDb250YWluZXJzLnNoaWZ0KCk7XG4gICAgICAgIHJvdXRlQ29udGFpbmVyLmluaXRpYWxpemVDb21wb25lbnQoKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjdXJyZW50U3ViZm9ybU1hZ2ljU2VydmljZS5QZXJmb3JtUm91dGVyTmF2aWdhdGUocm91dGVDb21tYW5kLnJvdXRlck91dGxldE5hbWUsIHJvdXRlQ29tbWFuZC5yb3V0ZVBhcmFtcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBQZXJmb3JtUm91dGVyTmF2aWdhdGUocm91dGVyT3V0bGV0TmFtZTogc3RyaW5nLCByb3V0ZVBhcmFtczogTGlzdDxhbnk+KVxuICB7XG4gICAgbGV0IHJlbGF0aXZlUm91dGUgPSAgU3ViZm9ybU1hZ2ljU2VydmljZS5nZXRSZWxhdGl2ZVJvdXRlKHRoaXMuYWN0aXZhdGVkUm91dGUpO1xuXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3sgb3V0bGV0czogeyBbcm91dGVyT3V0bGV0TmFtZV06IHJvdXRlUGFyYW1zIH0gfV0sIHsgcmVsYXRpdmVUbzogcmVsYXRpdmVSb3V0ZSB9KVxuICAgICAgLnRoZW4oKHJlc3VsdDpib29sZWFuKT0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmICFyZXN1bHQpIHtcbiAgICAgICAgICAgIGxldCBzdWJmb3JtTWFnaWNTZXJ2aWNlOiBTdWJmb3JtTWFnaWNTZXJ2aWNlID0gU3ViZm9ybU1hZ2ljU2VydmljZS5jdXJyZW50Q2FsbGVyTWdTdWJmb3JtU2VydmljZVJlZjtcbiAgICAgICAgICAgIHN1YmZvcm1NYWdpY1NlcnZpY2UuY3VycmVudFJvdXRlRGVmaW5pdGlvbiA9IG51bGw7XG5cbiAgICAgICAgICAgIFN1YmZvcm1NYWdpY1NlcnZpY2UuY3VycmVudENhbGxlck1nU3ViZm9ybVNlcnZpY2VSZWYgPSBudWxsO1xuICAgICAgICAgICAgc3ViZm9ybU1hZ2ljU2VydmljZS5wZW5kaW5nQ29tbWFuZHNDb2xsZWN0b3Iuc3RvcENvbGxlY3RpbmcoKTtcbiAgICAgICAgICAgIHN1YmZvcm1NYWdpY1NlcnZpY2Uucm91dGVyQ29tbWFuZHNNYWdpY1NlcnZpY2UuRXhlY3V0ZU5leHRDb21tYW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGluaXQoKVxuICB7XG4gICAgLy8gSWYgY29tbWFuZHMgd2VyZSBpc3N1ZWQgZm9yIHRoaXMgdGFzayBiZWZvcmUgbmdPbkluaXQoKSwgdGhleSB3ZXJlIG5vdCBleGVjdXRlZCBiZWNhdXNlIHRhc2sgaGFkIG5vdCByZWdpc3RlcmVkIGZvciB0aGVtLlxuICAgIC8vIFNvLCBleGVjdXRlIHRoZW0gbm93LlxuICAgIGNvbnN0IHBlbmRpbmdDb21tYW5kczogR3VpQ29tbWFuZFtdID0gdGhpcy5wZW5kaW5nQ29tbWFuZHNDb2xsZWN0b3IuR2V0Q29tbWFuZHModGhpcy50YXNrLnRhc2tJZCk7XG4gICAgaWYgKHBlbmRpbmdDb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nQ29tbWFuZHMuZm9yRWFjaChjb21tYW5kID0+IHt0aGlzLnRhc2suZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7fSk7XG4gICAgICB0aGlzLnRhc2sucmVmcmVzaFZpZXcoKTtcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdDb21tYW5kc0NvbGxlY3Rvci5zdG9wQ29sbGVjdGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHJlZnJlc2hWaWV3KCkge1xuICAgIHRoaXMudGFzay5yZWZyZXNoVmlldygpO1xuICB9XG5cbiAgLy8vXG4gIC8vIHJldHVybiB0aGUgcmVsYXRpdmUgcm91dGVcbiAgLy9cbiAgc3RhdGljIGdldFJlbGF0aXZlUm91dGUoc2VuZEFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSl7XG4gICAgbGV0IGN1cnJlbnRBY3RpdmVSb3V0ZSA9IHNlbmRBY3RpdmF0ZWRSb3V0ZTtcbiAgICBpZiAoY3VycmVudEFjdGl2ZVJvdXRlLnNuYXBzaG90LnJvdXRlQ29uZmlnICE9PSBudWxsICYmIGN1cnJlbnRBY3RpdmVSb3V0ZS5zbmFwc2hvdC5yb3V0ZUNvbmZpZy5wYXRoID09PSAnJykge1xuICAgICAgY3VycmVudEFjdGl2ZVJvdXRlID0gY3VycmVudEFjdGl2ZVJvdXRlLnBhcmVudDtcbiAgICAgIGlmICghY3VycmVudEFjdGl2ZVJvdXRlLnNuYXBzaG90LnJvdXRlQ29uZmlnLmxvYWRDaGlsZHJlbilcbiAgICAgICAgY29uc29sZS5sb2coXCJnZXRSZWxhdGl2ZVJvdXRlKCk6IGJvdGggcGF0aCBhbmQgY3VycmVudEFjdGl2ZVJvdXRlLnNuYXBzaG90LnJvdXRlQ29uZmlnLmxvYWRDaGlsZHJlbiBhcmUgZW1wdHkuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudEFjdGl2ZVJvdXRlO1xuICB9XG59XG4iXX0=