@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.
- package/esm2020/index.mjs +57 -0
- package/{esm2015/magic-xpa-angular.js → esm2020/magic-xpa-angular.mjs} +0 -0
- package/esm2020/src/controls.metadata.model.mjs +180 -0
- package/{esm2015/src/interfaces/sub-form-definition.iterface.js → esm2020/src/interfaces/sub-form-definition.iterface.mjs} +1 -0
- package/esm2020/src/magic.core.module.mjs +157 -0
- package/{esm2015/src/services/ISubformMagicService.js → esm2020/src/services/ISubformMagicService.mjs} +1 -0
- package/esm2020/src/services/OverlayWindowService.mjs +208 -0
- package/esm2020/src/services/StylesMapManager.mjs +28 -0
- package/esm2020/src/services/accessor.magic.service.mjs +302 -0
- package/{esm2015/src/services/commands-collector.magic.service.js → esm2020/src/services/commands-collector.magic.service.mjs} +7 -4
- package/esm2020/src/services/component-list.magic.service.mjs +46 -0
- package/{esm2015/src/services/confirmation.components.magic.provider.js → esm2020/src/services/confirmation.components.magic.provider.mjs} +2 -2
- package/esm2020/src/services/engine.magic.service.mjs +82 -0
- package/{esm2015/src/services/exit.magic.service.js → esm2020/src/services/exit.magic.service.mjs} +2 -2
- package/esm2020/src/services/magic.lazy.loader.service.mjs +16 -0
- package/{esm2015/src/services/magic.providers.js → esm2020/src/services/magic.providers.mjs} +0 -0
- package/{esm2015/src/services/magic.services.js → esm2020/src/services/magic.services.mjs} +2 -2
- package/{esm2015/src/services/mg-date-adapter.js → esm2020/src/services/mg-date-adapter.mjs} +2 -2
- package/{esm2015/src/services/overlay.conainer.magic.provider.js → esm2020/src/services/overlay.conainer.magic.provider.mjs} +2 -2
- package/esm2020/src/services/router-commands.magic.service.mjs +28 -0
- package/esm2020/src/services/subform.magic.service.mjs +185 -0
- package/{esm2015/src/services/table.magic.service.js → esm2020/src/services/table.magic.service.mjs} +2 -2
- package/esm2020/src/services/task.magics.service.mjs +611 -0
- package/{esm2015/src/services/title.magic.service.js → esm2020/src/services/title.magic.service.mjs} +2 -2
- package/esm2020/src/ui/GuiInteractiveExecutor.mjs +98 -0
- package/{esm2015/src/ui/components/base-magic-alert.component.js → esm2020/src/ui/components/base-magic-alert.component.mjs} +2 -2
- package/{esm2015/src/ui/components/base-magic-confirm.component.js → esm2020/src/ui/components/base-magic-confirm.component.mjs} +2 -2
- package/esm2020/src/ui/components/magic-alert.component.mjs +71 -0
- package/esm2020/src/ui/components/magic-confirmation-box.component.mjs +82 -0
- package/{esm2015/src/ui/directives/NonMagicControlDirective.js → esm2020/src/ui/directives/NonMagicControlDirective.mjs} +2 -2
- package/{esm2015/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.js → esm2020/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/directives/magic/checkbox.magic.directive.js → esm2020/src/ui/directives/magic/checkbox.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/directives/magic/combobox.magic.directive.js → esm2020/src/ui/directives/magic/combobox.magic.directive.mjs} +2 -2
- 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
- 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
- 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
- package/{esm2015/src/ui/directives/magic/input.noformcontrol.magic.directive.js → esm2020/src/ui/directives/magic/input.noformcontrol.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/directives/magic/nocontrol.magic.directive.js → esm2020/src/ui/directives/magic/nocontrol.magic.directive.mjs} +2 -2
- package/esm2020/src/ui/directives/magic/row.magic.directive.mjs +58 -0
- package/{esm2015/src/ui/directives/magic-focus.directive.js → esm2020/src/ui/directives/magic-focus.directive.mjs} +2 -2
- package/esm2020/src/ui/directives/magic.directive.mjs +207 -0
- package/esm2020/src/ui/directives/magicViewContainerRef.directive.mjs +20 -0
- package/{esm2015/src/ui/directives/mgformat.magic.directive.js → esm2020/src/ui/directives/mgformat.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/directives/range-validator.magic.directive.js → esm2020/src/ui/directives/range-validator.magic.directive.mjs} +2 -2
- package/{esm2015/src/ui/magic-confirmationBox.js → esm2020/src/ui/magic-confirmationBox.mjs} +0 -0
- package/{esm2015/src/ui/magic-modal/base-magic-overlay-container.js → esm2020/src/ui/magic-modal/base-magic-overlay-container.mjs} +0 -0
- package/{esm2015/src/ui/magic-modal/magic-modal-form.js → esm2020/src/ui/magic-modal/magic-modal-form.mjs} +0 -0
- package/{esm2015/src/ui/magic-modal/magic-modal-interface.js → esm2020/src/ui/magic-modal/magic-modal-interface.mjs} +1 -0
- package/esm2020/src/ui/magic-modal/magic-overlay-container-wrapper.mjs +135 -0
- package/esm2020/src/ui/magic-modal/magic-overlay-container.mjs +165 -0
- package/esm2020/src/ui/magic-root.component.mjs +237 -0
- package/esm2020/src/ui/mgerror.magic.component.mjs +120 -0
- package/esm2020/src/ui/pipes/date.magic.pipe.mjs +105 -0
- package/{esm2015/src/ui/pipes/time.magic.pipe.js → esm2020/src/ui/pipes/time.magic.pipe.mjs} +3 -3
- package/esm2020/src/ui/router-container.magic.component.mjs +109 -0
- package/esm2020/src/ui/subform.magic.component.mjs +52 -0
- package/{esm2015/src/ui/task-base.magic.component.js → esm2020/src/ui/task-base.magic.component.mjs} +2 -2
- package/{esm2015/src/ui/utils.js → esm2020/src/ui/utils.mjs} +0 -0
- package/fesm2015/magic-xpa-angular.mjs +4578 -0
- package/fesm2015/magic-xpa-angular.mjs.map +1 -0
- package/{fesm2015/magic-xpa-angular.js → fesm2020/magic-xpa-angular.mjs} +834 -764
- package/fesm2020/magic-xpa-angular.mjs.map +1 -0
- package/index.d.ts +1 -0
- package/package.json +28 -15
- package/src/magic.core.module.d.ts +3 -8
- package/src/services/OverlayWindowService.d.ts +2 -2
- package/src/services/accessor.magic.service.d.ts +10 -3
- package/src/services/commands-collector.magic.service.d.ts +2 -2
- package/src/services/component-list.magic.service.d.ts +3 -0
- package/src/services/confirmation.components.magic.provider.d.ts +2 -2
- package/src/services/engine.magic.service.d.ts +2 -2
- package/src/services/exit.magic.service.d.ts +2 -2
- package/src/services/magic.lazy.loader.service.d.ts +6 -0
- package/src/services/magic.services.d.ts +2 -2
- package/src/services/mg-date-adapter.d.ts +2 -2
- package/src/services/overlay.conainer.magic.provider.d.ts +2 -2
- package/src/services/router-commands.magic.service.d.ts +2 -2
- package/src/services/subform.magic.service.d.ts +9 -4
- package/src/services/table.magic.service.d.ts +2 -2
- package/src/services/task.magics.service.d.ts +2 -2
- package/src/services/title.magic.service.d.ts +2 -2
- package/src/ui/GuiInteractiveExecutor.d.ts +1 -0
- package/src/ui/components/base-magic-alert.component.d.ts +2 -2
- package/src/ui/components/base-magic-confirm.component.d.ts +2 -2
- package/src/ui/components/magic-alert.component.d.ts +2 -2
- package/src/ui/components/magic-confirmation-box.component.d.ts +2 -2
- package/src/ui/directives/NonMagicControlDirective.d.ts +2 -2
- package/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.d.ts +2 -2
- package/src/ui/directives/magic/checkbox.magic.directive.d.ts +2 -2
- package/src/ui/directives/magic/combobox.magic.directive.d.ts +2 -2
- package/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.d.ts +2 -2
- package/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.d.ts +2 -2
- package/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.d.ts +2 -2
- package/src/ui/directives/magic/input.noformcontrol.magic.directive.d.ts +2 -2
- package/src/ui/directives/magic/nocontrol.magic.directive.d.ts +2 -2
- package/src/ui/directives/magic/row.magic.directive.d.ts +2 -2
- package/src/ui/directives/magic-focus.directive.d.ts +2 -2
- package/src/ui/directives/magic.directive.d.ts +3 -2
- package/src/ui/directives/magicViewContainerRef.directive.d.ts +2 -2
- package/src/ui/directives/mgformat.magic.directive.d.ts +2 -2
- package/src/ui/directives/range-validator.magic.directive.d.ts +2 -2
- package/src/ui/magic-modal/magic-overlay-container-wrapper.d.ts +7 -5
- package/src/ui/magic-modal/magic-overlay-container.d.ts +2 -2
- package/src/ui/magic-root.component.d.ts +2 -2
- package/src/ui/mgerror.magic.component.d.ts +2 -2
- package/src/ui/pipes/date.magic.pipe.d.ts +2 -2
- package/src/ui/pipes/time.magic.pipe.d.ts +2 -2
- package/src/ui/router-container.magic.component.d.ts +7 -4
- package/src/ui/subform.magic.component.d.ts +2 -2
- package/src/ui/task-base.magic.component.d.ts +2 -2
- package/bundles/magic-xpa-angular.umd.js +0 -4973
- package/bundles/magic-xpa-angular.umd.js.map +0 -1
- package/bundles/magic-xpa-angular.umd.min.js +0 -16
- package/bundles/magic-xpa-angular.umd.min.js.map +0 -1
- package/esm2015/index.js +0 -56
- package/esm2015/src/controls.metadata.model.js +0 -180
- package/esm2015/src/magic.core.module.js +0 -173
- package/esm2015/src/services/OverlayWindowService.js +0 -205
- package/esm2015/src/services/StylesMapManager.js +0 -29
- package/esm2015/src/services/accessor.magic.service.js +0 -290
- package/esm2015/src/services/component-list.magic.service.js +0 -36
- package/esm2015/src/services/engine.magic.service.js +0 -82
- package/esm2015/src/services/router-commands.magic.service.js +0 -25
- package/esm2015/src/services/subform.magic.service.js +0 -161
- package/esm2015/src/services/task.magics.service.js +0 -610
- package/esm2015/src/ui/GuiInteractiveExecutor.js +0 -91
- package/esm2015/src/ui/components/magic-alert.component.js +0 -72
- package/esm2015/src/ui/components/magic-confirmation-box.component.js +0 -83
- package/esm2015/src/ui/directives/magic/row.magic.directive.js +0 -56
- package/esm2015/src/ui/directives/magic.directive.js +0 -205
- package/esm2015/src/ui/directives/magicViewContainerRef.directive.js +0 -20
- package/esm2015/src/ui/magic-modal/magic-overlay-container-wrapper.js +0 -131
- package/esm2015/src/ui/magic-modal/magic-overlay-container.js +0 -169
- package/esm2015/src/ui/magic-root.component.js +0 -237
- package/esm2015/src/ui/mgerror.magic.component.js +0 -120
- package/esm2015/src/ui/pipes/date.magic.pipe.js +0 -106
- package/esm2015/src/ui/router-container.magic.component.js +0 -102
- package/esm2015/src/ui/subform.magic.component.js +0 -52
- 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=
|