@schneideress/dashboardframework 13.0.0 → 17.0.1
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/README.md +7 -7
- package/esm2022/gridster/index.mjs +12 -0
- package/esm2022/gridster/lib/gridster.component.mjs +627 -0
- package/esm2022/gridster/lib/gridster.interface.mjs +3 -0
- package/esm2022/gridster/lib/gridster.module.mjs +17 -0
- package/esm2022/gridster/lib/gridsterCompact.service.mjs +126 -0
- package/esm2022/gridster/lib/gridsterConfig.constant.mjs +118 -0
- package/esm2022/gridster/lib/gridsterConfig.interface.mjs +37 -0
- package/esm2022/gridster/lib/gridsterConfigS.interface.mjs +2 -0
- package/esm2022/gridster/lib/gridsterDraggable.service.mjs +405 -0
- package/esm2022/gridster/lib/gridsterEmptyCell.service.mjs +255 -0
- package/esm2022/gridster/lib/gridsterItem.component.mjs +228 -0
- package/esm2022/gridster/lib/gridsterItem.interface.mjs +3 -0
- package/esm2022/gridster/lib/gridsterPreview.component.mjs +36 -0
- package/esm2022/gridster/lib/gridsterPush.service.mjs +316 -0
- package/esm2022/gridster/lib/gridsterPushResize.service.mjs +225 -0
- package/esm2022/gridster/lib/gridsterRenderer.interface.mjs +2 -0
- package/esm2022/gridster/lib/gridsterRenderer.service.mjs +274 -0
- package/esm2022/gridster/lib/gridsterResizable.service.mjs +470 -0
- package/esm2022/gridster/lib/gridsterResizeEventType.interface.mjs +2 -0
- package/esm2022/gridster/lib/gridsterScroll.service.mjs +134 -0
- package/esm2022/gridster/lib/gridsterSwap.service.mjs +87 -0
- package/esm2022/gridster/lib/gridsterUtils.service.mjs +92 -0
- package/esm2022/lib/custom.notifier.options.mjs +41 -0
- package/esm2022/lib/ra-dashboard-area/ra.dashboard.area.mjs +460 -0
- package/esm2022/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +43 -0
- package/esm2022/lib/ra-widget-container/ra.widget.container.component.mjs +767 -0
- package/esm2022/lib/ra.base.dashboard.filter.mjs +41 -0
- package/esm2022/lib/ra.base.dashboard.template.mjs +33 -0
- package/esm2022/lib/ra.dashbard.event.bus.mjs +46 -0
- package/esm2022/lib/ra.dashboard.module.mjs +55 -0
- package/esm2022/lib/ra.dashboard.responsive.service.mjs +139 -0
- package/esm2022/lib/ra.dashboard.service.mjs +77 -0
- package/esm2022/lib/ra.event.enum.mjs +60 -0
- package/esm2022/lib/ra.gridster.config.mjs +56 -0
- package/esm2022/public-api.mjs +13 -0
- package/esm2022/schneideress-dashboardframework.mjs +5 -0
- package/fesm2022/schneideress-dashboardframework.mjs +5198 -0
- package/fesm2022/schneideress-dashboardframework.mjs.map +1 -0
- package/gridster/index.d.ts +9 -0
- package/gridster/lib/gridster.component.d.ts +79 -0
- package/gridster/lib/gridster.interface.d.ts +49 -0
- package/gridster/lib/gridster.module.d.ts +8 -0
- package/gridster/lib/gridsterCompact.service.d.ts +11 -0
- package/gridster/lib/gridsterConfig.constant.d.ts +2 -0
- package/gridster/lib/gridsterConfig.interface.d.ts +155 -0
- package/gridster/lib/gridsterConfigS.interface.d.ts +107 -0
- package/gridster/lib/gridsterDraggable.service.d.ts +68 -0
- package/gridster/lib/gridsterEmptyCell.service.d.ts +31 -0
- package/gridster/lib/gridsterItem.component.d.ts +61 -0
- package/gridster/lib/gridsterItem.interface.d.ts +64 -0
- package/gridster/lib/gridsterPreview.component.d.ts +17 -0
- package/gridster/lib/gridsterPush.service.d.ts +34 -0
- package/gridster/lib/gridsterPushResize.service.d.ts +26 -0
- package/gridster/lib/gridsterRenderer.interface.d.ts +14 -0
- package/gridster/lib/gridsterRenderer.service.d.ts +37 -0
- package/gridster/lib/gridsterResizable.service.d.ts +86 -0
- package/gridster/lib/gridsterResizeEventType.interface.d.ts +6 -0
- package/gridster/lib/gridsterScroll.service.d.ts +7 -0
- package/gridster/lib/gridsterSwap.service.d.ts +13 -0
- package/gridster/lib/gridsterUtils.service.d.ts +16 -0
- package/{schneideress-dashboardframework.d.ts → index.d.ts} +5 -5
- package/lib/custom.notifier.options.d.ts +2 -2
- package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +88 -88
- package/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.d.ts +20 -20
- package/lib/ra-widget-container/ra.widget.container.component.d.ts +142 -142
- package/lib/ra.base.dashboard.filter.d.ts +17 -17
- package/lib/ra.base.dashboard.template.d.ts +18 -18
- package/lib/ra.dashbard.event.bus.d.ts +23 -23
- package/lib/ra.dashboard.module.d.ts +16 -17
- package/lib/ra.dashboard.responsive.service.d.ts +24 -24
- package/lib/ra.dashboard.service.d.ts +25 -25
- package/lib/ra.event.enum.d.ts +57 -57
- package/lib/ra.gridster.config.d.ts +2 -2
- package/package.json +11 -17
- package/public-api.d.ts +9 -9
- package/esm2020/lib/custom.notifier.options.mjs +0 -41
- package/esm2020/lib/ra-dashboard-area/ra.dashboard.area.mjs +0 -445
- package/esm2020/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +0 -43
- package/esm2020/lib/ra-widget-container/ra.widget.container.component.mjs +0 -767
- package/esm2020/lib/ra.base.dashboard.filter.mjs +0 -44
- package/esm2020/lib/ra.base.dashboard.template.mjs +0 -36
- package/esm2020/lib/ra.dashbard.event.bus.mjs +0 -46
- package/esm2020/lib/ra.dashboard.module.mjs +0 -64
- package/esm2020/lib/ra.dashboard.responsive.service.mjs +0 -136
- package/esm2020/lib/ra.dashboard.service.mjs +0 -77
- package/esm2020/lib/ra.event.enum.mjs +0 -60
- package/esm2020/lib/ra.gridster.config.mjs +0 -56
- package/esm2020/public-api.mjs +0 -15
- package/esm2020/schneideress-dashboardframework.mjs +0 -5
- package/fesm2015/schneideress-dashboardframework.mjs +0 -1800
- package/fesm2015/schneideress-dashboardframework.mjs.map +0 -1
- package/fesm2020/schneideress-dashboardframework.mjs +0 -1790
- package/fesm2020/schneideress-dashboardframework.mjs.map +0 -1
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
import { Input, Component, ViewChild, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import { RAEvent } from '../ra.event.enum';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "../ra.dashboard.service";
|
|
5
|
-
import * as i2 from "ngx-ui-loader";
|
|
6
|
-
import * as i3 from "@schneideress/ra-common";
|
|
7
|
-
import * as i4 from "angular-notifier";
|
|
8
|
-
import * as i5 from "../ra.dashboard.responsive.service";
|
|
9
|
-
import * as i6 from "angular-gridster2";
|
|
10
|
-
import * as i7 from "../ra-widget-container/ra.widget.container.component";
|
|
11
|
-
import * as i8 from "@angular/common";
|
|
12
|
-
export class RADashboardArea {
|
|
13
|
-
constructor(dashboardService, ngZone, ngxService, translateService, notifier, responsiveService, permissionService) {
|
|
14
|
-
this.dashboardService = dashboardService;
|
|
15
|
-
this.ngZone = ngZone;
|
|
16
|
-
this.ngxService = ngxService;
|
|
17
|
-
this.translateService = translateService;
|
|
18
|
-
this.notifier = notifier;
|
|
19
|
-
this.responsiveService = responsiveService;
|
|
20
|
-
this.permissionService = permissionService;
|
|
21
|
-
this.widgetList = Array();
|
|
22
|
-
this.gridheight = 300;
|
|
23
|
-
this.gridcellHeight = 0;
|
|
24
|
-
this.userWidgets = [];
|
|
25
|
-
this.PAMWidgets = [];
|
|
26
|
-
this.isWidgetLoaded = false;
|
|
27
|
-
this.domResized = false;
|
|
28
|
-
this.showEmptyDashboard = false;
|
|
29
|
-
this.isWidgetMgmnt = false;
|
|
30
|
-
this.widgetHeight = 2;
|
|
31
|
-
this.widgetWidth = 4;
|
|
32
|
-
this.hideDashboardBanner = new EventEmitter();
|
|
33
|
-
}
|
|
34
|
-
ngOnInit() {
|
|
35
|
-
this.isWidgetMgmnt = this.permissionService.hasPermission('ra.widgetmanagement');
|
|
36
|
-
this.initiateGridsterConfig();
|
|
37
|
-
this.lastViewType = this.responsiveService.IsDesktopView ? 'desktop' : 'mobile';
|
|
38
|
-
this.responsiveService.resized.subscribe((isDesktop) => {
|
|
39
|
-
if (this.lastViewType != (isDesktop ? 'desktop' : 'mobile') || !isDesktop) {
|
|
40
|
-
this.lastViewType = (isDesktop ? 'desktop' : 'mobile');
|
|
41
|
-
this.widgetList = [];
|
|
42
|
-
setTimeout(() => {
|
|
43
|
-
this.initiateGridsterConfig();
|
|
44
|
-
if (this.options && this.options.api && this.options.api.optionsChanged)
|
|
45
|
-
this.options.api.optionsChanged();
|
|
46
|
-
if (this.userWidgets) {
|
|
47
|
-
this.widgetList = this.mapObjectListToGridsterItemList(this.userWidgets);
|
|
48
|
-
setTimeout(() => {
|
|
49
|
-
this.setAreaHeight();
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
this.loadWidgets(this.userDashboardId, this.areaKey);
|
|
54
|
-
}
|
|
55
|
-
this.domResized = !this.domResized;
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
setTimeout(() => {
|
|
60
|
-
this.domResized = !this.domResized;
|
|
61
|
-
this.setAreaHeight();
|
|
62
|
-
}, 100);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
ngOnChanges(changes) {
|
|
67
|
-
this.isWidgetMgmnt = this.permissionService.hasPermission('ra.widgetmanagement');
|
|
68
|
-
if (this.raDashboardEventBus && this.appConfig && !this.isWidgetLoaded) {
|
|
69
|
-
this.isWidgetLoaded = true;
|
|
70
|
-
this.loadWidgets(this.userDashboardId, this.areaKey);
|
|
71
|
-
}
|
|
72
|
-
if (changes['raDashboardEventBus'] && changes['raDashboardEventBus'].currentValue != changes['raDashboardEventBus'].previousValue) {
|
|
73
|
-
this.inititateEventBusSubscritions();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
/**To set GridsterConfig */
|
|
77
|
-
initiateGridsterConfig() {
|
|
78
|
-
/**To override default configuration values to the gridster control */
|
|
79
|
-
this.options = this.responsiveService.getGridsterConfig(this.isWidgetMgmnt);
|
|
80
|
-
this.options.initCallback = (gridster) => {
|
|
81
|
-
if (gridster && gridster.curColWidth) {
|
|
82
|
-
this.gridcellHeight = gridster.curColWidth;
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
this.options.itemChangeCallback = (item) => {
|
|
86
|
-
if (this.responsiveService.IsDesktopView) {
|
|
87
|
-
// if (item.widgetInfo && item.widgetInfo.widgetInstanceId) {
|
|
88
|
-
// this.updateWidgetPosition(item.widgetInfo.widgetInstanceId);
|
|
89
|
-
// }
|
|
90
|
-
}
|
|
91
|
-
this.setAreaHeight();
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
/** To initiate eventbus subsctiptions */
|
|
95
|
-
inititateEventBusSubscritions() {
|
|
96
|
-
this.widgetDeleteEvent = this.raDashboardEventBus.subscribe(RAEvent.WidgetDelete).subscribe((instanceId) => {
|
|
97
|
-
this.ngZone.run(() => {
|
|
98
|
-
this.deleteWidget(instanceId, true);
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
this.widgetAddEvent = this.raDashboardEventBus.subscribe(RAEvent.AddWidget).subscribe((widgetInfo) => {
|
|
102
|
-
this.ngZone.run(() => {
|
|
103
|
-
this.copyWidget(widgetInfo);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
this.conifgAddClick = this.raDashboardEventBus.subscribe(RAEvent.ConfigAddClick).subscribe((e) => {
|
|
107
|
-
this.ngZone.run(() => {
|
|
108
|
-
this.addWidget(e);
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
this.rearrangeWidgetClick = this.raDashboardEventBus.subscribe(RAEvent.RearrangeClicked).subscribe((e) => {
|
|
112
|
-
this.ngZone.run(() => {
|
|
113
|
-
this.rearrangeWidgets();
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
this.widgetLibraryDoneClick = this.raDashboardEventBus.subscribe(RAEvent.widgetLibraryDoneClick).subscribe((widgetList) => {
|
|
117
|
-
this.ngZone.run(() => {
|
|
118
|
-
if (widgetList) {
|
|
119
|
-
this.addWidgetListToGridster(widgetList, 0);
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* temp fix- recursive method to iterate over the list of items
|
|
126
|
-
* and add them to gridster in the given order
|
|
127
|
-
* @param widgetList -list of widgets
|
|
128
|
-
* @param index -index of the current value to be added
|
|
129
|
-
*/
|
|
130
|
-
addWidgetListToGridster(widgetList, index) {
|
|
131
|
-
let areaContext = this;
|
|
132
|
-
let indexVal = index + 1;
|
|
133
|
-
if (index > widgetList.length - 1)
|
|
134
|
-
return;
|
|
135
|
-
else {
|
|
136
|
-
if (index == 0) {
|
|
137
|
-
areaContext.addWidget(widgetList[index]);
|
|
138
|
-
areaContext.addWidgetListToGridster(widgetList, indexVal);
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
setTimeout(() => {
|
|
142
|
-
areaContext.addWidget(widgetList[index]);
|
|
143
|
-
areaContext.addWidgetListToGridster(widgetList, indexVal);
|
|
144
|
-
}, 1000);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
ngOnDestroy() {
|
|
149
|
-
if (this.conifgAddClick)
|
|
150
|
-
this.conifgAddClick.unsubscribe();
|
|
151
|
-
if (this.widgetAddEvent)
|
|
152
|
-
this.widgetAddEvent.unsubscribe();
|
|
153
|
-
if (this.widgetDeleteEvent)
|
|
154
|
-
this.widgetDeleteEvent.unsubscribe();
|
|
155
|
-
if (this.widgetLibraryDoneClick)
|
|
156
|
-
this.widgetLibraryDoneClick.unsubscribe();
|
|
157
|
-
if (this.rearrangeWidgetClick)
|
|
158
|
-
this.rearrangeWidgetClick.unsubscribe();
|
|
159
|
-
}
|
|
160
|
-
/**To update position/dimention of all widgets in the area */
|
|
161
|
-
updateWidgets() {
|
|
162
|
-
this.dashboardService.updateWidgets(this.formatWidgetDataForPositionDetails(this.mapGridsterListToObject(this.widgetList)), this.appConfig).subscribe(widgets => {
|
|
163
|
-
});
|
|
164
|
-
return true;
|
|
165
|
-
}
|
|
166
|
-
/**To update widget dimensions */
|
|
167
|
-
updateWidgetPosition(widgetInstanceId) {
|
|
168
|
-
let widgetFilteredList = [];
|
|
169
|
-
let widget = this.widgetList.filter(filtered => filtered['widgetInfo'] && filtered['widgetInfo'].widgetInstanceId == widgetInstanceId);
|
|
170
|
-
if (widget && widget.length > 0) {
|
|
171
|
-
widgetFilteredList.push(widget[0]);
|
|
172
|
-
let widgetList = this.mapGridsterListToObject(widgetFilteredList);
|
|
173
|
-
this.dashboardService.updateWidgets(this.formatWidgetDataForPositionDetails(widgetList), this.appConfig).subscribe(widgets => {
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
/**To restrict request payload to be of min size (position & size details) */
|
|
179
|
-
formatWidgetDataForPositionDetails(widgetItemList) {
|
|
180
|
-
let itemList = [];
|
|
181
|
-
widgetItemList.forEach(function (widgetItem) {
|
|
182
|
-
let item = {};
|
|
183
|
-
item.widgetInstanceId = widgetItem.widgetInstanceId;
|
|
184
|
-
item.position_x = widgetItem.position_x;
|
|
185
|
-
item.position_y = widgetItem.position_y;
|
|
186
|
-
item.width = widgetItem.width;
|
|
187
|
-
item.height = widgetItem.height;
|
|
188
|
-
itemList.push(item);
|
|
189
|
-
});
|
|
190
|
-
return itemList;
|
|
191
|
-
}
|
|
192
|
-
/** To retrieve widgets based on userDashboardid and area name */
|
|
193
|
-
loadWidgets(userDashboarId, areaKey) {
|
|
194
|
-
let widgetInfo = {
|
|
195
|
-
dashboardId: userDashboarId.toString(),
|
|
196
|
-
dashboardAreaKey: areaKey
|
|
197
|
-
};
|
|
198
|
-
this.widgetList = [];
|
|
199
|
-
this.dashboardService.getWidgetsByDashboardArea(widgetInfo, this.appConfig).subscribe(widgets => {
|
|
200
|
-
this.userWidgets = widgets;
|
|
201
|
-
this.PAMWidgets = [];
|
|
202
|
-
widgets.forEach((element) => {
|
|
203
|
-
var settings = undefined;
|
|
204
|
-
if (element.widgetSettings) {
|
|
205
|
-
settings = JSON.parse(element.widgetSettings);
|
|
206
|
-
if (settings && settings.isPAMWidget)
|
|
207
|
-
this.PAMWidgets.push(element.widgetInstanceId);
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
this.checkPAMWidgets();
|
|
211
|
-
if (widgets && widgets.length > 0) {
|
|
212
|
-
this.widgetList = this.mapObjectListToGridsterItemList(widgets);
|
|
213
|
-
this.setAreaHeight();
|
|
214
|
-
this.raDashboardEventBus.publish(RAEvent.HideDashboardBanner, false);
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
this.showEmptyDashboard = true;
|
|
218
|
-
this.raDashboardEventBus.publish(RAEvent.HideDashboardBanner, this.showEmptyDashboard);
|
|
219
|
-
}
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
/** To set Area(Gridster) height dynamically as widgets are added/removed */
|
|
223
|
-
setAreaHeight() {
|
|
224
|
-
setTimeout(() => {
|
|
225
|
-
let isMobile = false;
|
|
226
|
-
if (this.options.mobileBreakpoint && (this.options.mobileBreakpoint > this.gridWrapper.nativeElement.clientWidth)) {
|
|
227
|
-
isMobile = true;
|
|
228
|
-
}
|
|
229
|
-
let areaScrollHeight = 0;
|
|
230
|
-
let areaHeight = 0;
|
|
231
|
-
this.showEmptyDashboard = this.userWidgets.length > 0 ? false : true;
|
|
232
|
-
this.widgetList.forEach((t) => {
|
|
233
|
-
let currentHeight = t.y + t.rows;
|
|
234
|
-
if (currentHeight > areaScrollHeight) {
|
|
235
|
-
areaScrollHeight = currentHeight;
|
|
236
|
-
}
|
|
237
|
-
t['widgetInfo'].rowHeight = this.gridcellHeight;
|
|
238
|
-
});
|
|
239
|
-
if (this.gridcellHeight > 0) {
|
|
240
|
-
areaHeight = areaScrollHeight * this.gridcellHeight + 100;
|
|
241
|
-
}
|
|
242
|
-
let areaScrollHeightMob = 0;
|
|
243
|
-
if (isMobile) {
|
|
244
|
-
areaScrollHeightMob = this.widgetList.length * 300 + 200;
|
|
245
|
-
areaHeight = areaScrollHeightMob;
|
|
246
|
-
}
|
|
247
|
-
if (areaHeight < 600) {
|
|
248
|
-
areaHeight = 600;
|
|
249
|
-
}
|
|
250
|
-
this.gridheight = areaHeight;
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
/** To remove a widget instance from dashboard and to save info in database */
|
|
254
|
-
deleteWidget(widgetInstanceId, isalertDisabled = false) {
|
|
255
|
-
let gridsterItem = this.widgetList.filter((item) => {
|
|
256
|
-
return item['widgetInfo'].widgetInstanceId === widgetInstanceId;
|
|
257
|
-
});
|
|
258
|
-
if (gridsterItem.length > 0) {
|
|
259
|
-
let widget = this.userWidgets.filter((item) => {
|
|
260
|
-
return item.widgetInstanceId === widgetInstanceId;
|
|
261
|
-
});
|
|
262
|
-
if (widget.length > 0) {
|
|
263
|
-
this.userWidgets.splice(this.userWidgets.indexOf(widget[0]), 1);
|
|
264
|
-
}
|
|
265
|
-
if (this.PAMWidgets.length > 0) {
|
|
266
|
-
var indx = this.PAMWidgets.indexOf(widgetInstanceId);
|
|
267
|
-
if (indx > -1)
|
|
268
|
-
this.PAMWidgets.splice(indx, 1);
|
|
269
|
-
this.checkPAMWidgets();
|
|
270
|
-
}
|
|
271
|
-
this.widgetList.splice(this.widgetList.indexOf(gridsterItem[0]), 1);
|
|
272
|
-
this.setAreaHeight();
|
|
273
|
-
if (!isalertDisabled) {
|
|
274
|
-
this.notifier.notify('success', " " + this.translateService.translate('Common.Widgettext') + " " + gridsterItem[0]['widgetInfo'].widgetTitle + " " + this.translateService.translate('Common.deletedSuccesfully') + " ");
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
this.showEmptyDashboard = this.userWidgets.length > 0 ? false : true;
|
|
278
|
-
if (this.showEmptyDashboard == true) {
|
|
279
|
-
this.raDashboardEventBus.publish(RAEvent.HideDashboardBanner, this.showEmptyDashboard);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
/**To rearrange widgets position in the dashboard, compactLeft&Up,compactLeft,compactUp,etc*/
|
|
283
|
-
rearrangeWidgets() {
|
|
284
|
-
for (let i = 0; i < this.userWidgets.length; i++) {
|
|
285
|
-
this.userWidgets[i].position_x = 0;
|
|
286
|
-
this.userWidgets[i].position_y = 0;
|
|
287
|
-
}
|
|
288
|
-
this.widgetList = this.mapObjectListToGridsterItemList(this.userWidgets);
|
|
289
|
-
if (this.widgetList.length > 0)
|
|
290
|
-
this.updateWidgetPosition(this.widgetList[0]['widgetInfo'].widgetInstanceId);
|
|
291
|
-
setTimeout(() => {
|
|
292
|
-
this.setAreaHeight();
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
/**To add widget instance to the database with the next available position and to make changes in
|
|
296
|
-
* dashboard area.
|
|
297
|
-
*/
|
|
298
|
-
addWidget(data) {
|
|
299
|
-
data.height = this.widgetHeight;
|
|
300
|
-
data.width = this.widgetWidth;
|
|
301
|
-
this.raDashboardEventBus.publish(RAEvent.HideDashboardBanner, false);
|
|
302
|
-
if (data.widgetSettings) {
|
|
303
|
-
if (typeof data.widgetSettings === 'string')
|
|
304
|
-
data.widgetSettings = JSON.parse(data.widgetSettings);
|
|
305
|
-
if (data.widgetSettings.defaultCols) {
|
|
306
|
-
data.width = data.widgetSettings.defaultCols;
|
|
307
|
-
}
|
|
308
|
-
if (data.widgetSettings.defaultRows) {
|
|
309
|
-
data.height = data.widgetSettings.defaultRows;
|
|
310
|
-
}
|
|
311
|
-
data.widgetSettings = null;
|
|
312
|
-
}
|
|
313
|
-
data = this.setPositions(data);
|
|
314
|
-
/** to find the available position in gridster, temp commenting the code-returning higher y value than normal */
|
|
315
|
-
data.dashboardAreaKey = this.areaKey;
|
|
316
|
-
data.dashboardId = this.userDashboardId;
|
|
317
|
-
this.ngxService.start();
|
|
318
|
-
this.dashboardService.addWidget(data, this.appConfig).subscribe(widget => {
|
|
319
|
-
this.userWidgets.push(widget);
|
|
320
|
-
let gridsterItem = this.responsiveService.getGridsterItem(widget);
|
|
321
|
-
this.widgetList.push(gridsterItem);
|
|
322
|
-
this.setAreaHeight();
|
|
323
|
-
widget.rowHeight = this.gridcellHeight;
|
|
324
|
-
var widgetInstanceId = 0;
|
|
325
|
-
if (widget && widget.widgetInstanceId) {
|
|
326
|
-
widgetInstanceId = widget.widgetInstanceId;
|
|
327
|
-
/**To save added widget position in db */
|
|
328
|
-
if (this.responsiveService.IsDesktopView) {
|
|
329
|
-
setTimeout(() => {
|
|
330
|
-
this.updateWidgetPosition(widgetInstanceId);
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
if (widget.settings && widget.settings.isPAMWidget) {
|
|
335
|
-
this.PAMWidgets.push(widget.widgetInstanceId);
|
|
336
|
-
this.checkPAMWidgets();
|
|
337
|
-
}
|
|
338
|
-
this.raDashboardEventBus.publish(RAEvent.WidgetAdded, widget);
|
|
339
|
-
});
|
|
340
|
-
}
|
|
341
|
-
setPositions(data) {
|
|
342
|
-
data.position_x = 0;
|
|
343
|
-
data.position_y = 0;
|
|
344
|
-
if (!this.responsiveService.IsDesktopView) {
|
|
345
|
-
if (this.userWidgets.length > 0) {
|
|
346
|
-
let widget = this.userWidgets[this.userWidgets.length - 1];
|
|
347
|
-
if (widget.position_x + widget.width > (this.responsiveService.maxColsDesktop / 2)) {
|
|
348
|
-
data.position_y = widget.position_y + 1;
|
|
349
|
-
}
|
|
350
|
-
else {
|
|
351
|
-
data.position_y = widget.position_y;
|
|
352
|
-
data.position_x = this.responsiveService.maxColsDesktop - (widget.position_x + widget.width);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
return data;
|
|
357
|
-
}
|
|
358
|
-
/** To add widget to current widget list ,invoked from copy widget window*/
|
|
359
|
-
copyWidget(data) {
|
|
360
|
-
data = this.setPositions(data);
|
|
361
|
-
if (!this.responsiveService.IsDesktopView) {
|
|
362
|
-
this.dashboardService.updateWidgets(this.formatWidgetDataForPositionDetails([data]), this.appConfig).subscribe(widgets => {
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
this.userWidgets.push(data);
|
|
366
|
-
let gridsterItem = this.responsiveService.getGridsterItem(data);
|
|
367
|
-
this.widgetList.push(gridsterItem);
|
|
368
|
-
this.setAreaHeight();
|
|
369
|
-
if (data.settings && data.settings.isPAMWidget) {
|
|
370
|
-
this.PAMWidgets.push(data.widgetInstanceId);
|
|
371
|
-
this.checkPAMWidgets();
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
mapObjectListToGridsterItemList(widgetList) {
|
|
375
|
-
let widgetArray = Array();
|
|
376
|
-
widgetList.forEach(widget => {
|
|
377
|
-
widgetArray.push(this.responsiveService.getGridsterItem(widget));
|
|
378
|
-
});
|
|
379
|
-
return widgetArray;
|
|
380
|
-
}
|
|
381
|
-
mapGridsterItemToObject(widgetItem) {
|
|
382
|
-
let widget;
|
|
383
|
-
widget = widgetItem['widgetInfo'];
|
|
384
|
-
widget.height = widgetItem.rows;
|
|
385
|
-
widget.width = widgetItem.cols;
|
|
386
|
-
widget.position_x = widgetItem.x;
|
|
387
|
-
widget.position_y = widgetItem.y;
|
|
388
|
-
//widget.rowHeight = <any>widgetItem.curRowHeight;
|
|
389
|
-
return widget;
|
|
390
|
-
}
|
|
391
|
-
mapGridsterListToObject(widgetItemList) {
|
|
392
|
-
let widgetListArray = Array();
|
|
393
|
-
widgetItemList.forEach(widget => {
|
|
394
|
-
widgetListArray.push(this.mapGridsterItemToObject(widget));
|
|
395
|
-
});
|
|
396
|
-
return widgetListArray;
|
|
397
|
-
}
|
|
398
|
-
addNewWidget() {
|
|
399
|
-
this.raDashboardEventBus.publish(RAEvent.AddNewWidgetToDashboard, null);
|
|
400
|
-
}
|
|
401
|
-
updateAppliedFilters(data) {
|
|
402
|
-
this.raDashboardEventBus.publish(RAEvent.UpdateAppledFiterForInapplicableFilter, data);
|
|
403
|
-
}
|
|
404
|
-
checkPAMWidgets() {
|
|
405
|
-
if (this.PAMWidgets.length > 0) {
|
|
406
|
-
this.raDashboardEventBus.publish(RAEvent.ShowInapplicableFilterMessage, true);
|
|
407
|
-
}
|
|
408
|
-
else {
|
|
409
|
-
this.raDashboardEventBus.publish(RAEvent.ShowInapplicableFilterMessage, false);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
RADashboardArea.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: RADashboardArea, deps: [{ token: i1.RaDashboardService }, { token: i0.NgZone }, { token: i2.NgxUiLoaderService }, { token: i3.RATranslateService }, { token: i4.NotifierService }, { token: i5.RADashboardResponsiveService }, { token: i3.RAPermissionService }], target: i0.ɵɵFactoryTarget.Component });
|
|
414
|
-
RADashboardArea.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: RADashboardArea, selector: "ra-dashboard-area", inputs: { userDashboardId: ["user-dashboard-id", "userDashboardId"], areaKey: ["area-key", "areaKey"], globalFilter: ["global-filter", "globalFilter"], raDashboardEventBus: ["event-bus", "raDashboardEventBus"], widgetHeight: ["widget-height", "widgetHeight"], widgetWidth: ["widget-width", "widgetWidth"], appConfig: ["app-config", "appConfig"] }, outputs: { hideDashboardBanner: "hideDashboardBanner" }, viewQueries: [{ propertyName: "gridWrapper", first: true, predicate: ["gridWrapper"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #gridWrapper class=\"wrap gridster gridster-mobile\" [ngStyle]=\"{'height': userWidgets.length > 0 ? (gridheight + 'px') : 'unset'}\">\r\n <!-- <div #gridWrapper class=\"wrap gridster\"> -->\r\n <gridster [options]=\"options\" style=\"height:100%;\" *ngIf=\"userWidgets.length > 0\">\r\n <gridster-item [item]=\"item\" *ngFor=\"let item of widgetList\">\r\n <ra-widget-container [app-config]=\"appConfig\" [event-bus]=\"raDashboardEventBus\"\r\n (widgetDeleted)=\"deleteWidget($event)\" [data]=\"item\" [global-filter]=\"globalFilter\"\r\n [grid-cell-height]=\"gridcellHeight\" *ngIf=\"gridcellHeight && gridcellHeight > 0\" [widget-width]=\"item.cols\"\r\n [widget-height]=\"item.rows\" [widget-instance-id]=\"item['widgetInstanceId']\" [dom-resized]=\"domResized\"\r\n (updateAppliedFilters)=\"updateAppliedFilters($event)\">\r\n </ra-widget-container>\r\n </gridster-item>\r\n </gridster>\r\n\r\n <div class=\"empty-padding kiosk-hide\" *ngIf=\"showEmptyDashboard\">\r\n <div class=\"empty-wrapper\">\r\n <div></div>\r\n <div class=\"m-1 empty-prefix\">\r\n <i class=\"fal fa-edit edit-icon\"></i>\r\n <span class=\"empty-title\">{{'dashboard.emptydashboard'|translate}}</span>\r\n </div>\r\n <div class=\"empty-content light\">\r\n <div>\r\n <div class=\"col-sm-12 empty-msg\">\r\n {{'dashboard.emptydashboardmessage'|translate}} <br />\r\n {{'dashboard.emptydashboardmessage2'|translate}}\r\n </div>\r\n <button *ngIf=\"isWidgetMgmnt\" class=\"btn btnLib btn-sm m-1 dashboard-button light\" (click)=\"addNewWidget()\">\r\n <i class=\"fal fa-plus m-1\"></i>{{'dashboard.addawidgets'|translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <notifier-container></notifier-container>\r\n</div>", styles: ["gridster{width:inherit;resize:height;display:flex;background-color:#ededed;overflow-y:hidden!important}.dvheader{width:100%;height:35px;background:black;color:#fff;padding:7px 3px 5px 6px;text-transform:uppercase}gridster-item{box-sizing:border-box;z-index:1;position:absolute;overflow:hidden;transition:.3s;display:none;background:#fff;-webkit-user-select:text;user-select:text;box-shadow:0 1px 10px #0000000d}gridster-item:hover{box-shadow:0 1px 10px #00000026}@media screen and (max-width: 685px){.gridster-mobile{height:auto!important;margin-bottom:50px!important}}@media screen and (max-width: 350px){.gridster-mobile{min-height:330px!important;margin-bottom:0!important}}.empty-padding{padding:40px 20px 20px;background-color:#ededed;display:flex;justify-content:center;align-content:center}.empty-wrapper{display:flex;background-color:#fff;border-radius:8px;min-height:125px;width:72%}.empty-prefix{color:#32ad3c;font-size:18px;display:flex;align-items:center;padding:10px 30px;min-width:max-content;min-width:-moz-max-content}.empty-content{color:#333;border-left:solid 1px #a9afb1;width:100%;display:flex;align-items:center;padding:15px 30px 10px 40px}.empty-msg{padding:0 0 5px;font-size:16px}.dashboard-button{padding:5px 10px 5px 5px!important}.btnLib{background-color:#ededed;color:#333!important}.btn-sm,.btn-group-sm>.btn{padding:5px 20px 5px 5px}.edit-icon{color:#32ad3c;font-size:24px;margin-right:15px}.empty-title{margin-top:10px}@media screen and (max-width: 600px){.empty-padding{padding:10px;background-color:#ededed;width:100%;display:block}.empty-wrapper{display:flex;background-color:#fff;border-radius:8px;min-height:125px;width:100%}.empty-prefix{color:#32ad3c;font-size:16px;display:flex;height:40px;padding:6px 10px 8px}.empty-content{color:#333;display:flex;padding:5px 10px 10px;margin-top:44px;margin-left:-185px;border-left:none}.empty-msg{padding:12px 10px 10px 5px;font-size:14px;border-top:solid 1px #a9afb1}.edit-icon{color:#32ad3c;font-size:20px;margin-right:6px}.empty-title{margin-top:6px}}\n"], components: [{ type: i6.GridsterComponent, selector: "gridster", inputs: ["options"] }, { type: i6.GridsterItemComponent, selector: "gridster-item", inputs: ["item"], outputs: ["itemInit", "itemChange", "itemResize"] }, { type: i7.RAWidgetContainer, selector: "ra-widget-container", inputs: ["widget-instance-id", "global-filter", "data", "event-bus", "app-config", "widget-width", "widget-height", "grid-cell-height", "dom-resized"], outputs: ["widgetDeleted", "updateAppliedFilters"] }, { type: i4.NotifierContainerComponent, selector: "notifier-container" }], directives: [{ type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "translate": i3.RATranslatePipe } });
|
|
415
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: RADashboardArea, decorators: [{
|
|
416
|
-
type: Component,
|
|
417
|
-
args: [{ selector: 'ra-dashboard-area', template: "<div #gridWrapper class=\"wrap gridster gridster-mobile\" [ngStyle]=\"{'height': userWidgets.length > 0 ? (gridheight + 'px') : 'unset'}\">\r\n <!-- <div #gridWrapper class=\"wrap gridster\"> -->\r\n <gridster [options]=\"options\" style=\"height:100%;\" *ngIf=\"userWidgets.length > 0\">\r\n <gridster-item [item]=\"item\" *ngFor=\"let item of widgetList\">\r\n <ra-widget-container [app-config]=\"appConfig\" [event-bus]=\"raDashboardEventBus\"\r\n (widgetDeleted)=\"deleteWidget($event)\" [data]=\"item\" [global-filter]=\"globalFilter\"\r\n [grid-cell-height]=\"gridcellHeight\" *ngIf=\"gridcellHeight && gridcellHeight > 0\" [widget-width]=\"item.cols\"\r\n [widget-height]=\"item.rows\" [widget-instance-id]=\"item['widgetInstanceId']\" [dom-resized]=\"domResized\"\r\n (updateAppliedFilters)=\"updateAppliedFilters($event)\">\r\n </ra-widget-container>\r\n </gridster-item>\r\n </gridster>\r\n\r\n <div class=\"empty-padding kiosk-hide\" *ngIf=\"showEmptyDashboard\">\r\n <div class=\"empty-wrapper\">\r\n <div></div>\r\n <div class=\"m-1 empty-prefix\">\r\n <i class=\"fal fa-edit edit-icon\"></i>\r\n <span class=\"empty-title\">{{'dashboard.emptydashboard'|translate}}</span>\r\n </div>\r\n <div class=\"empty-content light\">\r\n <div>\r\n <div class=\"col-sm-12 empty-msg\">\r\n {{'dashboard.emptydashboardmessage'|translate}} <br />\r\n {{'dashboard.emptydashboardmessage2'|translate}}\r\n </div>\r\n <button *ngIf=\"isWidgetMgmnt\" class=\"btn btnLib btn-sm m-1 dashboard-button light\" (click)=\"addNewWidget()\">\r\n <i class=\"fal fa-plus m-1\"></i>{{'dashboard.addawidgets'|translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <notifier-container></notifier-container>\r\n</div>", styles: ["gridster{width:inherit;resize:height;display:flex;background-color:#ededed;overflow-y:hidden!important}.dvheader{width:100%;height:35px;background:black;color:#fff;padding:7px 3px 5px 6px;text-transform:uppercase}gridster-item{box-sizing:border-box;z-index:1;position:absolute;overflow:hidden;transition:.3s;display:none;background:#fff;-webkit-user-select:text;user-select:text;box-shadow:0 1px 10px #0000000d}gridster-item:hover{box-shadow:0 1px 10px #00000026}@media screen and (max-width: 685px){.gridster-mobile{height:auto!important;margin-bottom:50px!important}}@media screen and (max-width: 350px){.gridster-mobile{min-height:330px!important;margin-bottom:0!important}}.empty-padding{padding:40px 20px 20px;background-color:#ededed;display:flex;justify-content:center;align-content:center}.empty-wrapper{display:flex;background-color:#fff;border-radius:8px;min-height:125px;width:72%}.empty-prefix{color:#32ad3c;font-size:18px;display:flex;align-items:center;padding:10px 30px;min-width:max-content;min-width:-moz-max-content}.empty-content{color:#333;border-left:solid 1px #a9afb1;width:100%;display:flex;align-items:center;padding:15px 30px 10px 40px}.empty-msg{padding:0 0 5px;font-size:16px}.dashboard-button{padding:5px 10px 5px 5px!important}.btnLib{background-color:#ededed;color:#333!important}.btn-sm,.btn-group-sm>.btn{padding:5px 20px 5px 5px}.edit-icon{color:#32ad3c;font-size:24px;margin-right:15px}.empty-title{margin-top:10px}@media screen and (max-width: 600px){.empty-padding{padding:10px;background-color:#ededed;width:100%;display:block}.empty-wrapper{display:flex;background-color:#fff;border-radius:8px;min-height:125px;width:100%}.empty-prefix{color:#32ad3c;font-size:16px;display:flex;height:40px;padding:6px 10px 8px}.empty-content{color:#333;display:flex;padding:5px 10px 10px;margin-top:44px;margin-left:-185px;border-left:none}.empty-msg{padding:12px 10px 10px 5px;font-size:14px;border-top:solid 1px #a9afb1}.edit-icon{color:#32ad3c;font-size:20px;margin-right:6px}.empty-title{margin-top:6px}}\n"] }]
|
|
418
|
-
}], ctorParameters: function () { return [{ type: i1.RaDashboardService }, { type: i0.NgZone }, { type: i2.NgxUiLoaderService }, { type: i3.RATranslateService }, { type: i4.NotifierService }, { type: i5.RADashboardResponsiveService }, { type: i3.RAPermissionService }]; }, propDecorators: { userDashboardId: [{
|
|
419
|
-
type: Input,
|
|
420
|
-
args: ['user-dashboard-id']
|
|
421
|
-
}], areaKey: [{
|
|
422
|
-
type: Input,
|
|
423
|
-
args: ['area-key']
|
|
424
|
-
}], globalFilter: [{
|
|
425
|
-
type: Input,
|
|
426
|
-
args: ['global-filter']
|
|
427
|
-
}], raDashboardEventBus: [{
|
|
428
|
-
type: Input,
|
|
429
|
-
args: ['event-bus']
|
|
430
|
-
}], widgetHeight: [{
|
|
431
|
-
type: Input,
|
|
432
|
-
args: ['widget-height']
|
|
433
|
-
}], widgetWidth: [{
|
|
434
|
-
type: Input,
|
|
435
|
-
args: ['widget-width']
|
|
436
|
-
}], appConfig: [{
|
|
437
|
-
type: Input,
|
|
438
|
-
args: ['app-config']
|
|
439
|
-
}], hideDashboardBanner: [{
|
|
440
|
-
type: Output
|
|
441
|
-
}], gridWrapper: [{
|
|
442
|
-
type: ViewChild,
|
|
443
|
-
args: ['gridWrapper', { static: false }]
|
|
444
|
-
}] } });
|
|
445
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmEuZGFzaGJvYXJkLmFyZWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXNoYm9hcmQtZnJhbWV3b3JrL3NyYy9saWIvcmEtZGFzaGJvYXJkLWFyZWEvcmEuZGFzaGJvYXJkLmFyZWEudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXNoYm9hcmQtZnJhbWV3b3JrL3NyYy9saWIvcmEtZGFzaGJvYXJkLWFyZWEvcmEuZGFzaGJvYXJkLmFyZWEuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBK0MsU0FBUyxFQUE0QixNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBS2pLLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7Ozs7OztBQVkzQyxNQUFNLE9BQU8sZUFBZTtJQStCMUIsWUFBb0IsZ0JBQW9DLEVBQzlDLE1BQWMsRUFDZCxVQUE4QixFQUM5QixnQkFBb0MsRUFDcEMsUUFBeUIsRUFDekIsaUJBQStDLEVBQy9DLGlCQUFzQztRQU41QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW9CO1FBQzlDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxlQUFVLEdBQVYsVUFBVSxDQUFvQjtRQUM5QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW9CO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBOEI7UUFDL0Msc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFxQjtRQW5DekMsZUFBVSxHQUFHLEtBQUssRUFBZ0IsQ0FBQztRQUVuQyxlQUFVLEdBQVcsR0FBRyxDQUFDO1FBQ3pCLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLGdCQUFXLEdBQVUsRUFBRSxDQUFDO1FBQ3hCLGVBQVUsR0FBUSxFQUFFLENBQUM7UUFPcEIsbUJBQWMsR0FBWSxLQUFLLENB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WTtzQkFBbkMsS0FBSzt1QkFBQyxlQUFlO2dCQUNDLFdBQVc7c0JBQWpDLEtBQUs7dUJBQUMsY0FBYztnQkFDQSxTQUFTO3NCQUE3QixLQUFLO3VCQUFDLFlBQVk7Z0JBQ1QsbUJBQW1CO3NCQUE1QixNQUFNO2dCQUVzQyxXQUFXO3NCQUF2RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnB1dCwgT25Jbml0LCBDb21wb25lbnQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgTmdab25lLCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgR3JpZHN0ZXJDb25maWcsIEdyaWRzdGVySXRlbSB9IGZyb20gJ2FuZ3VsYXItZ3JpZHN0ZXIyJztcclxuaW1wb3J0IHsgUmFEYXNoYm9hcmRTZXJ2aWNlIH0gZnJvbSAnLi4vcmEuZGFzaGJvYXJkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSQURhc2hib2FyZEV2ZW50QnVzIH0gZnJvbSAnLi4vcmEuZGFzaGJhcmQuZXZlbnQuYnVzJztcclxuaW1wb3J0IHsgUkFFdmVudCB9IGZyb20gJy4uL3JhLmV2ZW50LmVudW0nO1xyXG5pbXBvcnQgeyBJV2lkZ2V0SW5mbywgSUFwcENvbmZpZyB9IGZyb20gJ0BzY2huZWlkZXJlc3Mvd2lkZ2V0ZnJhbWV3b3JrJztcclxuaW1wb3J0IHsgTmd4VWlMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnbmd4LXVpLWxvYWRlcic7XHJcbmltcG9ydCB7IE5vdGlmaWVyU2VydmljZSB9IGZyb20gJ2FuZ3VsYXItbm90aWZpZXInO1xyXG5pbXBvcnQgeyBSQVRyYW5zbGF0ZVNlcnZpY2UsIFJBUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tICdAc2NobmVpZGVyZXNzL3JhLWNvbW1vbic7XHJcbmltcG9ydCB7IFJBRGFzaGJvYXJkUmVzcG9uc2l2ZVNlcnZpY2UgfSBmcm9tICcuLi9yYS5kYXNoYm9hcmQucmVzcG9uc2l2ZS5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncmEtZGFzaGJvYXJkLWFyZWEnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yYS5kYXNoYm9hcmQuYXJlYS5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yYS5kYXNoYm9hcmQuYXJlYS5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUkFEYXNoYm9hcmRBcmVhIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyB3aWRnZXRMaXN0ID0gQXJyYXk8R3JpZHN0ZXJJdGVtPigpO1xyXG4gIHB1YmxpYyBvcHRpb25zOiBHcmlkc3RlckNvbmZpZztcclxuICBwdWJsaWMgZ3JpZGhlaWdodDogbnVtYmVyID0gMzAwO1xyXG4gIHB1YmxpYyBncmlkY2VsbEhlaWdodDogbnVtYmVyID0gMDtcclxuICBwdWJsaWMgdXNlcldpZGdldHM6IGFueVtdID0gW107XHJcbiAgcHVibGljIFBBTVdpZGdldHM6IGFueSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGNvbmlmZ0FkZENsaWNrOiBhbnk7XHJcbiAgcHJpdmF0ZSByZWFycmFuZ2VXaWRnZXRDbGljazogYW55O1xyXG4gIHByaXZhdGUgd2lkZ2V0RGVsZXRlRXZlbnQ6IGFueTtcclxuICBwcml2YXRlIHdpZGdldEFkZEV2ZW50OiBhbnk7XHJcbiAgcHJpdmF0ZSB3aWRnZXRMaWJyYXJ5RG9uZUNsaWNrOiBhbnk7XHJcbiAgcHJpdmF0ZSBpc1dpZGdldExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkb21SZXNpemVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dFbXB0eURhc2hib2FyZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpc1dpZGdldE1nbW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxhc3RWaWV3VHlwZTogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoJ3VzZXItZGFzaGJvYXJkLWlkJykgdXNlckRhc2hib2FyZElkOiBudW1iZXI7XHJcbiAgQElucHV0KCdhcmVhLWtleScpIGFyZWFLZXk6IHN0cmluZztcclxuICBASW5wdXQoJ2dsb2JhbC1maWx0ZXInKSBnbG9iYWxGaWx0ZXI6IGFueTtcclxuICBASW5wdXQoJ2V2ZW50LWJ1cycpIHJhRGFzaGJvYXJkRXZlbnRCdXM6IFJBRGFzaGJvYXJkRXZlbnRCdXM7XHJcbiAgQElucHV0KCd3aWRnZXQtaGVpZ2h0Jykgd2lkZ2V0SGVpZ2h0OiBudW1iZXIgPSAyO1xyXG4gIEBJbnB1dCgnd2lkZ2V0LXdpZHRoJykgd2lkZ2V0V2lkdGg6IG51bWJlciA9IDQ7XHJcbiAgQElucHV0KCdhcHAtY29uZmlnJykgYXBwQ29uZmlnOiBJQXBwQ29uZmlnO1xyXG4gIEBPdXRwdXQoKSBoaWRlRGFzaGJvYXJkQmFubmVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdncmlkV3JhcHBlcicsIHsgc3RhdGljOiBmYWxzZSB9KSBncmlkV3JhcHBlcjogRWxlbWVudFJlZjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXNoYm9hcmRTZXJ2aWNlOiBSYURhc2hib2FyZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSBuZ3hTZXJ2aWNlOiBOZ3hVaUxvYWRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFJBVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgbm90aWZpZXI6IE5vdGlmaWVyU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVzcG9uc2l2ZVNlcnZpY2U6IFJBRGFzaGJvYXJkUmVzcG9uc2l2ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBlcm1pc3Npb25TZXJ2aWNlOiBSQVBlcm1pc3Npb25TZXJ2aWNlKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNXaWRnZXRNZ21udCA9IHRoaXMucGVybWlzc2lvblNlcnZpY2UuaGFzUGVybWlzc2lvbigncmEud2lkZ2V0bWFuYWdlbWVudCcpO1xyXG4gICAgdGhpcy5pbml0aWF0ZUdyaWRzdGVyQ29uZmlnKCk7XHJcbiAgICB0aGlzLmxhc3RWaWV3VHlwZSA9IHRoaXMucmVzcG9uc2l2ZVNlcnZpY2UuSXNEZXNrdG9wVmlldyA/ICdkZXNrdG9wJyA6ICdtb2JpbGUnO1xyXG4gICAgdGhpcy5yZXNwb25zaXZlU2VydmljZS5yZXNpemVkLnN1YnNjcmliZSgoaXNEZXNrdG9wKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmxhc3RWaWV3VHlwZSAhPSAoaXNEZXNrdG9wID8gJ2Rlc2t0b3AnIDogJ21vYmlsZScpIHx8ICFpc0Rlc2t0b3ApIHtcclxuICAgICAgICB0aGlzLmxhc3RWaWV3VHlwZSA9IChpc0Rlc2t0b3AgPyAnZGVza3RvcCcgOiAnbW9iaWxlJyk7XHJcbiAgICAgICAgdGhpcy53aWRnZXRMaXN0ID0gW107XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmluaXRpYXRlR3JpZHN0ZXJDb25maWcoKTtcclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmFwaSAmJiB0aGlzLm9wdGlvbnMuYXBpLm9wdGlvbnNDaGFuZ2VkKVxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuYXBpLm9wdGlvbnNDaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMudXNlcldpZGdldHMpIHtcclxuICAgICAgICAgICAgdGhpcy53aWRnZXRMaXN0ID0gdGhpcy5tYXBPYmplY3RMaXN0VG9Hcmlkc3Rlckl0ZW1MaXN0KHRoaXMudXNlcldpZGdldHMpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnNldEFyZWFIZWlnaHQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkV2lkZ2V0cyh0aGlzLnVzZXJEYXNoYm9hcmRJZCwgdGhpcy5hcmVhS2V5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZG9tUmVzaXplZCA9ICF0aGlzLmRvbVJlc2l6ZWQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7ICAgICAgICAgIFxyXG4gICAgICAgICAgdGhpcy5kb21SZXNpemVkID0gIXRoaXMuZG9tUmVzaXplZDtcclxuICAgICAgICAgIHRoaXMuc2V0QXJlYUhlaWdodCgpO1xyXG4gICAgICAgIH0sIDEwMCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1dpZGdldE1nbW50ID0gdGhpcy5wZXJtaXNzaW9uU2VydmljZS5oYXNQZXJtaXNzaW9uKCdyYS53aWRnZXRtYW5hZ2VtZW50Jyk7XHJcbiAgICBpZiAodGhpcy5yYURhc2hib2FyZEV2ZW50QnVzICYmIHRoaXMuYXBwQ29uZmlnICYmICF0aGlzLmlzV2lkZ2V0TG9hZGVkKSB7XHJcbiAgICAgIHRoaXMuaXNXaWRnZXRMb2FkZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmxvYWRXaWRnZXRzKHRoaXMudXNlckRhc2hib2FyZElkLCB0aGlzLmFyZWFLZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzWydyYURhc2hib2FyZEV2ZW50QnVzJ10gJiYgY2hhbmdlc1sncmFEYXNoYm9hcmRFdmVudEJ1cyddLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzWydyYURhc2hib2FyZEV2ZW50QnVzJ10ucHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICB0aGlzLmluaXRpdGF0ZUV2ZW50QnVzU3Vic2NyaXRpb25zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipUbyBzZXQgR3JpZHN0ZXJDb25maWcgKi9cclxuICBwdWJsaWMgaW5pdGlhdGVHcmlkc3RlckNvbmZpZygpIHtcclxuICAgIC8qKlRvIG92ZXJyaWRlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB2YWx1ZXMgdG8gdGhlIGdyaWRzdGVyIGNvbnRyb2wgKi9cclxuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMucmVzcG9uc2l2ZVNlcnZpY2UuZ2V0R3JpZHN0ZXJDb25maWcodGhpcy5pc1dpZGdldE1nbW50KTtcclxuICAgIHRoaXMub3B0aW9ucy5pbml0Q2FsbGJhY2sgPSAoZ3JpZHN0ZXI6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZ3JpZHN0ZXIgJiYgZ3JpZHN0ZXIuY3VyQ29sV2lkdGgpIHtcclxuICAgICAgICB0aGlzLmdyaWRjZWxsSGVpZ2h0ID0gZ3JpZHN0ZXIuY3VyQ29sV2lkdGg7XHJcbiAgICAgIH0gICAgIFxyXG4gICAgfTtcclxuICAgIHRoaXMub3B0aW9ucy5pdGVtQ2hhbmdlQ2FsbGJhY2sgPSAoaXRlbTogR3JpZHN0ZXJJdGVtKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnJlc3BvbnNpdmVTZXJ2aWNlLklzRGVza3RvcFZpZXcpIHtcclxuICAgICAgICAvLyBpZiAoaXRlbS53aWRnZXRJbmZvICYmIGl0ZW0ud2lkZ2V0SW5mby53aWRnZXRJbnN0YW5jZUlkKSB7XHJcbiAgICAgICAgLy8gICB0aGlzLnVwZGF0ZVdpZGdldFBvc2l0aW9uKGl0ZW0ud2lkZ2V0SW5mby53aWRnZXRJbnN0YW5jZUlkKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRBcmVhSGVpZ2h0KCk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFRvIGluaXRpYXRlIGV2ZW50YnVzIHN1YnNjdGlwdGlvbnMgKi9cclxuICBpbml0aXRhdGVFdmVudEJ1c1N1YnNjcml0aW9ucygpIHtcclxuICAgIHRoaXMud2lkZ2V0RGVsZXRlRXZlbnQgPSB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMuc3Vic2NyaWJlKFJBRXZlbnQuV2lkZ2V0RGVsZXRlKS5zdWJzY3JpYmUoKGluc3RhbmNlSWQpID0+IHtcclxuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLmRlbGV0ZVdpZGdldChpbnN0YW5jZUlkLCB0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLndpZGdldEFkZEV2ZW50ID0gdGhpcy5yYURhc2hib2FyZEV2ZW50QnVzLnN1YnNjcmliZShSQUV2ZW50LkFkZFdpZGdldCkuc3Vic2NyaWJlKCh3aWRnZXRJbmZvKSA9PiB7XHJcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb3B5V2lkZ2V0KHdpZGdldEluZm8pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY29uaWZnQWRkQ2xpY2sgPSB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMuc3Vic2NyaWJlKFJBRXZlbnQuQ29uZmlnQWRkQ2xpY2spLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYWRkV2lkZ2V0KGUpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucmVhcnJhbmdlV2lkZ2V0Q2xpY2sgPSB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMuc3Vic2NyaWJlKFJBRXZlbnQuUmVhcnJhbmdlQ2xpY2tlZCkuc3Vic2NyaWJlKChlKSA9PiB7XHJcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZWFycmFuZ2VXaWRnZXRzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy53aWRnZXRMaWJyYXJ5RG9uZUNsaWNrID0gdGhpcy5yYURhc2hib2FyZEV2ZW50QnVzLnN1YnNjcmliZShSQUV2ZW50LndpZGdldExpYnJhcnlEb25lQ2xpY2spLnN1YnNjcmliZSgod2lkZ2V0TGlzdCkgPT4ge1xyXG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgIGlmICh3aWRnZXRMaXN0KSB7XHJcbiAgICAgICAgICB0aGlzLmFkZFdpZGdldExpc3RUb0dyaWRzdGVyKHdpZGdldExpc3QsIDApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHRlbXAgZml4LSByZWN1cnNpdmUgbWV0aG9kIHRvIGl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBvZiBpdGVtc1xyXG4gICAqIGFuZCBhZGQgdGhlbSB0byBncmlkc3RlciBpbiB0aGUgZ2l2ZW4gb3JkZXJcclxuICAgKiBAcGFyYW0gd2lkZ2V0TGlzdCAgLWxpc3Qgb2Ygd2lkZ2V0c1xyXG4gICAqIEBwYXJhbSBpbmRleCAtaW5kZXggb2YgdGhlIGN1cnJlbnQgdmFsdWUgdG8gYmUgYWRkZWRcclxuICAgKi9cclxuICBhZGRXaWRnZXRMaXN0VG9Hcmlkc3Rlcih3aWRnZXRMaXN0OiBhbnksIGluZGV4OiBudW1iZXIpIHtcclxuICAgIGxldCBhcmVhQ29udGV4dCA9IHRoaXM7XHJcbiAgICBsZXQgaW5kZXhWYWwgPSBpbmRleCArIDE7XHJcbiAgICBpZiAoaW5kZXggPiB3aWRnZXRMaXN0Lmxlbmd0aCAtIDEpXHJcbiAgICAgIHJldHVybjtcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoaW5kZXggPT0gMCkge1xyXG4gICAgICAgIGFyZWFDb250ZXh0LmFkZFdpZGdldCh3aWRnZXRMaXN0W2luZGV4XSk7XHJcbiAgICAgICAgYXJlYUNvbnRleHQuYWRkV2lkZ2V0TGlzdFRvR3JpZHN0ZXIod2lkZ2V0TGlzdCwgaW5kZXhWYWwpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgYXJlYUNvbnRleHQuYWRkV2lkZ2V0KHdpZGdldExpc3RbaW5kZXhdKTtcclxuICAgICAgICAgIGFyZWFDb250ZXh0LmFkZFdpZGdldExpc3RUb0dyaWRzdGVyKHdpZGdldExpc3QsIGluZGV4VmFsKTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb25pZmdBZGRDbGljaylcclxuICAgICAgdGhpcy5jb25pZmdBZGRDbGljay51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLndpZGdldEFkZEV2ZW50KVxyXG4gICAgICB0aGlzLndpZGdldEFkZEV2ZW50LnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMud2lkZ2V0RGVsZXRlRXZlbnQpXHJcbiAgICAgIHRoaXMud2lkZ2V0RGVsZXRlRXZlbnQudW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBpZiAodGhpcy53aWRnZXRMaWJyYXJ5RG9uZUNsaWNrKVxyXG4gICAgICB0aGlzLndpZGdldExpYnJhcnlEb25lQ2xpY2sudW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBpZiAodGhpcy5yZWFycmFuZ2VXaWRnZXRDbGljaylcclxuICAgICAgdGhpcy5yZWFycmFuZ2VXaWRnZXRDbGljay51bnN1YnNjcmliZSgpO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlRvIHVwZGF0ZSBwb3NpdGlvbi9kaW1lbnRpb24gb2YgYWxsIHdpZGdldHMgaW4gdGhlIGFyZWEgKi9cclxuICB1cGRhdGVXaWRnZXRzKCkge1xyXG4gICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLnVwZGF0ZVdpZGdldHModGhpcy5mb3JtYXRXaWRnZXREYXRhRm9yUG9zaXRpb25EZXRhaWxzKHRoaXMubWFwR3JpZHN0ZXJMaXN0VG9PYmplY3QodGhpcy53aWRnZXRMaXN0KSksXHJcbiAgICAgIHRoaXMuYXBwQ29uZmlnKS5zdWJzY3JpYmUod2lkZ2V0cyA9PiB7XHJcbiAgICAgIH0pO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipUbyB1cGRhdGUgd2lkZ2V0IGRpbWVuc2lvbnMgKi9cclxuICB1cGRhdGVXaWRnZXRQb3NpdGlvbih3aWRnZXRJbnN0YW5jZUlkOiBudW1iZXIpIHtcclxuXHJcbiAgICBsZXQgd2lkZ2V0RmlsdGVyZWRMaXN0ID0gW107XHJcbiAgICBsZXQgd2lkZ2V0ID0gdGhpcy53aWRnZXRMaXN0LmZpbHRlcihmaWx0ZXJlZCA9PiBmaWx0ZXJlZFsnd2lkZ2V0SW5mbyddICYmIGZpbHRlcmVkWyd3aWRnZXRJbmZvJ10ud2lkZ2V0SW5zdGFuY2VJZCA9PSB3aWRnZXRJbnN0YW5jZUlkKTtcclxuICAgIGlmICh3aWRnZXQgJiYgd2lkZ2V0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgd2lkZ2V0RmlsdGVyZWRMaXN0LnB1c2god2lkZ2V0WzBdKTtcclxuICAgICAgbGV0IHdpZGdldExpc3QgPSB0aGlzLm1hcEdyaWRzdGVyTGlzdFRvT2JqZWN0KHdpZGdldEZpbHRlcmVkTGlzdCk7XHJcbiAgICAgIHRoaXMuZGFzaGJvYXJkU2VydmljZS51cGRhdGVXaWRnZXRzKHRoaXMuZm9ybWF0V2lkZ2V0RGF0YUZvclBvc2l0aW9uRGV0YWlscyh3aWRnZXRMaXN0KSwgdGhpcy5hcHBDb25maWcpLnN1YnNjcmliZSh3aWRnZXRzID0+IHtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlRvIHJlc3RyaWN0IHJlcXVlc3QgcGF5bG9hZCB0byBiZSBvZiBtaW4gc2l6ZSAocG9zaXRpb24gJiBzaXplIGRldGFpbHMpICovXHJcbiAgZm9ybWF0V2lkZ2V0RGF0YUZvclBvc2l0aW9uRGV0YWlscyh3aWRnZXRJdGVtTGlzdDogSVdpZGdldEluZm9bXSkge1xyXG4gICAgbGV0IGl0ZW1MaXN0OiBhbnkgPSBbXTtcclxuICAgIHdpZGdldEl0ZW1MaXN0LmZvckVhY2goZnVuY3Rpb24gKHdpZGdldEl0ZW0pIHtcclxuICAgICAgbGV0IGl0ZW0gPSB7fSBhcyBJV2lkZ2V0SW5mbztcclxuICAgICAgaXRlbS53aWRnZXRJbnN0YW5jZUlkID0gd2lkZ2V0SXRlbS53aWRnZXRJbnN0YW5jZUlkO1xyXG4gICAgICBpdGVtLnBvc2l0aW9uX3ggPSB3aWRnZXRJdGVtLnBvc2l0aW9uX3g7XHJcbiAgICAgIGl0ZW0ucG9zaXRpb25feSA9IHdpZGdldEl0ZW0ucG9zaXRpb25feTtcclxuICAgICAgaXRlbS53aWR0aCA9IHdpZGdldEl0ZW0ud2lkdGg7XHJcbiAgICAgIGl0ZW0uaGVpZ2h0ID0gd2lkZ2V0SXRlbS5oZWlnaHQ7XHJcbiAgICAgIGl0ZW1MaXN0LnB1c2goaXRlbSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBpdGVtTGlzdDtcclxuICB9XHJcblxyXG4gIC8qKiBUbyByZXRyaWV2ZSB3aWRnZXRzIGJhc2VkIG9uIHVzZXJEYXNoYm9hcmRpZCBhbmQgYXJlYSBuYW1lICovXHJcbiAgbG9hZFdpZGdldHModXNlckRhc2hib2FySWQ6IG51bWJlciwgYXJlYUtleTogc3RyaW5nKSB7XHJcblxyXG4gICAgbGV0IHdpZGdldEluZm8gPSA8SVdpZGdldEluZm8+e1xyXG4gICAgICBkYXNoYm9hcmRJZDogdXNlckRhc2hib2FySWQudG9TdHJpbmcoKSxcclxuICAgICAgZGFzaGJvYXJkQXJlYUtleTogYXJlYUtleVxyXG4gICAgfVxyXG4gICAgdGhpcy53aWRnZXRMaXN0ID0gW107XHJcbiAgICB0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0V2lkZ2V0c0J5RGFzaGJvYXJkQXJlYSh3aWRnZXRJbmZvLCB0aGlzLmFwcENvbmZpZykuc3Vic2NyaWJlKHdpZGdldHMgPT4ge1xyXG4gICAgICB0aGlzLnVzZXJXaWRnZXRzID0gd2lkZ2V0cztcclxuICAgICAgdGhpcy5QQU1XaWRnZXRzID0gW107XHJcbiAgICAgIHdpZGdldHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgdmFyIHNldHRpbmdzOiBhbnkgPSB1bmRlZmluZWRcclxuICAgICAgICBpZiAoZWxlbWVudC53aWRnZXRTZXR0aW5ncykge1xyXG4gICAgICAgICAgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGVsZW1lbnQud2lkZ2V0U2V0dGluZ3MpO1xyXG4gICAgICAgICAgaWYgKHNldHRpbmdzICYmIHNldHRpbmdzLmlzUEFNV2lkZ2V0KVxyXG4gICAgICAgICAgICB0aGlzLlBBTVdpZGdldHMucHVzaChlbGVtZW50LndpZGdldEluc3RhbmNlSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuY2hlY2tQQU1XaWRnZXRzKCk7XHJcblxyXG4gICAgICBpZiAod2lkZ2V0cyAmJiB3aWRnZXRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLndpZGdldExpc3QgPSB0aGlzLm1hcE9iamVjdExpc3RUb0dyaWRzdGVySXRlbUxpc3Qod2lkZ2V0cyk7XHJcbiAgICAgICAgdGhpcy5zZXRBcmVhSGVpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5yYURhc2hib2FyZEV2ZW50QnVzLnB1Ymxpc2goUkFFdmVudC5IaWRlRGFzaGJvYXJkQmFubmVyLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zaG93RW1wdHlEYXNoYm9hcmQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuSGlkZURhc2hib2FyZEJhbm5lciwgdGhpcy5zaG93RW1wdHlEYXNoYm9hcmQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICAvKiogVG8gc2V0IEFyZWEoR3JpZHN0ZXIpIGhlaWdodCBkeW5hbWljYWxseSBhcyB3aWRnZXRzIGFyZSBhZGRlZC9yZW1vdmVkICovXHJcbiAgc2V0QXJlYUhlaWdodCgpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBsZXQgaXNNb2JpbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2JpbGVCcmVha3BvaW50ICYmICh0aGlzLm9wdGlvbnMubW9iaWxlQnJlYWtwb2ludCA+IHRoaXMuZ3JpZFdyYXBwZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCkpIHtcclxuICAgICAgICBpc01vYmlsZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGFyZWFTY3JvbGxIZWlnaHQgPSAwO1xyXG4gICAgICBsZXQgYXJlYUhlaWdodCA9IDA7XHJcbiAgICAgIFxyXG5cclxuICAgICAgdGhpcy5zaG93RW1wdHlEYXNoYm9hcmQgPSB0aGlzLnVzZXJXaWRnZXRzLmxlbmd0aCA+IDAgPyBmYWxzZSA6IHRydWU7XHJcblxyXG4gICAgICB0aGlzLndpZGdldExpc3QuZm9yRWFjaCgodCkgPT4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50SGVpZ2h0OiBhbnkgPSB0LnkgKyB0LnJvd3M7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRIZWlnaHQgPiBhcmVhU2Nyb2xsSGVpZ2h0KSB7XHJcbiAgICAgICAgICBhcmVhU2Nyb2xsSGVpZ2h0ID0gY3VycmVudEhlaWdodDtcclxuICAgICAgICB9ICAgICAgXHJcbiAgICAgICAgdFsnd2lkZ2V0SW5mbyddLnJvd0hlaWdodCA9IHRoaXMuZ3JpZGNlbGxIZWlnaHQ7XHJcbiAgICAgIH0pOyAgICAgIFxyXG4gICAgICBpZiAodGhpcy5ncmlkY2VsbEhlaWdodCA+IDApIHsgICAgICAgIFxyXG4gICAgICAgICAgIGFyZWFIZWlnaHQgPSBhcmVhU2Nyb2xsSGVpZ2h0ICogdGhpcy5ncmlkY2VsbEhlaWdodCArIDEwMDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgYXJlYVNjcm9sbEhlaWdodE1vYiA9IDA7XHJcbiAgICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICAgIGFyZWFTY3JvbGxIZWlnaHRNb2IgPSB0aGlzLndpZGdldExpc3QubGVuZ3RoICogMzAwICsgMjAwO1xyXG4gICAgICAgIGFyZWFIZWlnaHQgPSBhcmVhU2Nyb2xsSGVpZ2h0TW9iO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChhcmVhSGVpZ2h0IDwgNjAwKSB7XHJcbiAgICAgICAgYXJlYUhlaWdodCA9IDYwMDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdyaWRoZWlnaHQgPSBhcmVhSGVpZ2h0O1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8qKiBUbyByZW1vdmUgYSB3aWRnZXQgaW5zdGFuY2UgZnJvbSBkYXNoYm9hcmQgYW5kIHRvIHNhdmUgaW5mbyBpbiBkYXRhYmFzZSAqL1xyXG4gIGRlbGV0ZVdpZGdldCh3aWRnZXRJbnN0YW5jZUlkOiBhbnksIGlzYWxlcnREaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBsZXQgZ3JpZHN0ZXJJdGVtID0gdGhpcy53aWRnZXRMaXN0LmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICByZXR1cm4gaXRlbVsnd2lkZ2V0SW5mbyddLndpZGdldEluc3RhbmNlSWQgPT09IHdpZGdldEluc3RhbmNlSWQ7XHJcbiAgICB9KTtcclxuICAgIGlmIChncmlkc3Rlckl0ZW0ubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgd2lkZ2V0ID0gdGhpcy51c2VyV2lkZ2V0cy5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4gaXRlbS53aWRnZXRJbnN0YW5jZUlkID09PSB3aWRnZXRJbnN0YW5jZUlkO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHdpZGdldC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy51c2VyV2lkZ2V0cy5zcGxpY2UodGhpcy51c2VyV2lkZ2V0cy5pbmRleE9mKHdpZGdldFswXSksIDEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5QQU1XaWRnZXRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB2YXIgaW5keCA9IHRoaXMuUEFNV2lkZ2V0cy5pbmRleE9mKHdpZGdldEluc3RhbmNlSWQpO1xyXG4gICAgICAgIGlmIChpbmR4ID4gLTEpXHJcbiAgICAgICAgICB0aGlzLlBBTVdpZGdldHMuc3BsaWNlKGluZHgsIDEpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tQQU1XaWRnZXRzKCk7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICB0aGlzLndpZGdldExpc3Quc3BsaWNlKHRoaXMud2lkZ2V0TGlzdC5pbmRleE9mKGdyaWRzdGVySXRlbVswXSksIDEpO1xyXG4gICAgICB0aGlzLnNldEFyZWFIZWlnaHQoKTtcclxuICAgICAgaWYgKCFpc2FsZXJ0RGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLm5vdGlmaWVyLm5vdGlmeSgnc3VjY2VzcycsIFwiIFwiICsgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnQ29tbW9uLldpZGdldHRleHQnKSArIFwiIFwiICsgZ3JpZHN0ZXJJdGVtWzBdWyd3aWRnZXRJbmZvJ10ud2lkZ2V0VGl0bGUgKyBcIiBcIiArIHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0NvbW1vbi5kZWxldGVkU3VjY2VzZnVsbHknKSArIFwiIFwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zaG93RW1wdHlEYXNoYm9hcmQgPSB0aGlzLnVzZXJXaWRnZXRzLmxlbmd0aCA+IDAgPyBmYWxzZSA6IHRydWU7XHJcbiAgICBpZiAodGhpcy5zaG93RW1wdHlEYXNoYm9hcmQgPT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMucHVibGlzaChSQUV2ZW50LkhpZGVEYXNoYm9hcmRCYW5uZXIsIHRoaXMuc2hvd0VtcHR5RGFzaGJvYXJkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlRvIHJlYXJyYW5nZSB3aWRnZXRzIHBvc2l0aW9uIGluIHRoZSBkYXNoYm9hcmQsIGNvbXBhY3RMZWZ0JlVwLGNvbXBhY3RMZWZ0LGNvbXBhY3RVcCxldGMqL1xyXG4gIHJlYXJyYW5nZVdpZGdldHMoKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudXNlcldpZGdldHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy51c2VyV2lkZ2V0c1tpXS5wb3NpdGlvbl94ID0gMDtcclxuICAgICAgdGhpcy51c2VyV2lkZ2V0c1tpXS5wb3NpdGlvbl95ID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMud2lkZ2V0TGlzdCA9IHRoaXMubWFwT2JqZWN0TGlzdFRvR3JpZHN0ZXJJdGVtTGlzdCh0aGlzLnVzZXJXaWRnZXRzKTtcclxuICAgIGlmICh0aGlzLndpZGdldExpc3QubGVuZ3RoID4gMClcclxuICAgICAgdGhpcy51cGRhdGVXaWRnZXRQb3NpdGlvbih0aGlzLndpZGdldExpc3RbMF1bJ3dpZGdldEluZm8nXS53aWRnZXRJbnN0YW5jZUlkKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNldEFyZWFIZWlnaHQoKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlRvIGFkZCB3aWRnZXQgaW5zdGFuY2UgdG8gdGhlIGRhdGFiYXNlIHdpdGggdGhlIG5leHQgYXZhaWxhYmxlIHBvc2l0aW9uIGFuZCB0byBtYWtlIGNoYW5nZXMgaW5cclxuICAgKiBkYXNoYm9hcmQgYXJlYS5cclxuICAgKi9cclxuICBhZGRXaWRnZXQoZGF0YTogYW55KSB7XHJcbiAgICBkYXRhLmhlaWdodCA9IHRoaXMud2lkZ2V0SGVpZ2h0O1xyXG4gICAgZGF0YS53aWR0aCA9IHRoaXMud2lkZ2V0V2lkdGg7XHJcbiAgICB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMucHVibGlzaChSQUV2ZW50LkhpZGVEYXNoYm9hcmRCYW5uZXIsIGZhbHNlKTtcclxuICAgIGlmIChkYXRhLndpZGdldFNldHRpbmdzKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgZGF0YS53aWRnZXRTZXR0aW5ncyA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgZGF0YS53aWRnZXRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZGF0YS53aWRnZXRTZXR0aW5ncyk7XHJcblxyXG4gICAgICBpZiAoZGF0YS53aWRnZXRTZXR0aW5ncy5kZWZhdWx0Q29scykge1xyXG4gICAgICAgIGRhdGEud2lkdGggPSBkYXRhLndpZGdldFNldHRpbmdzLmRlZmF1bHRDb2xzO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChkYXRhLndpZGdldFNldHRpbmdzLmRlZmF1bHRSb3dzKSB7XHJcbiAgICAgICAgZGF0YS5oZWlnaHQgPSBkYXRhLndpZGdldFNldHRpbmdzLmRlZmF1bHRSb3dzO1xyXG4gICAgICB9XHJcbiAgICAgIGRhdGEud2lkZ2V0U2V0dGluZ3MgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgZGF0YSA9IHRoaXMuc2V0UG9zaXRpb25zKGRhdGEpO1xyXG5cclxuICAgIC8qKiB0byBmaW5kIHRoZSBhdmFpbGFibGUgcG9zaXRpb24gaW4gZ3JpZHN0ZXIsIHRlbXAgY29tbWVudGluZyB0aGUgY29kZS1yZXR1cm5pbmcgaGlnaGVyIHkgdmFsdWUgdGhhbiBub3JtYWwgKi9cclxuICAgIGRhdGEuZGFzaGJvYXJkQXJlYUtleSA9IHRoaXMuYXJlYUtleTtcclxuICAgIGRhdGEuZGFzaGJvYXJkSWQgPSB0aGlzLnVzZXJEYXNoYm9hcmRJZDtcclxuICAgIHRoaXMubmd4U2VydmljZS5zdGFydCgpO1xyXG4gICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmFkZFdpZGdldChkYXRhLCB0aGlzLmFwcENvbmZpZykuc3Vic2NyaWJlKHdpZGdldCA9PiB7XHJcbiAgICAgIHRoaXMudXNlcldpZGdldHMucHVzaCh3aWRnZXQpO1xyXG4gICAgICBsZXQgZ3JpZHN0ZXJJdGVtID0gdGhpcy5yZXNwb25zaXZlU2VydmljZS5nZXRHcmlkc3Rlckl0ZW0od2lkZ2V0KTtcclxuICAgICAgdGhpcy53aWRnZXRMaXN0LnB1c2goZ3JpZHN0ZXJJdGVtKTtcclxuICAgICAgdGhpcy5zZXRBcmVhSGVpZ2h0KCk7XHJcbiAgICAgIHdpZGdldC5yb3dIZWlnaHQ9dGhpcy5ncmlkY2VsbEhlaWdodDtcclxuICAgICAgdmFyIHdpZGdldEluc3RhbmNlSWQgPSAwO1xyXG4gICAgICBpZiAod2lkZ2V0ICYmIHdpZGdldC53aWRnZXRJbnN0YW5jZUlkKSB7XHJcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2VJZCA9IHdpZGdldC53aWRnZXRJbnN0YW5jZUlkO1xyXG4gICAgICAgIC8qKlRvIHNhdmUgYWRkZWQgd2lkZ2V0IHBvc2l0aW9uIGluIGRiICovXHJcbiAgICAgICAgaWYgKHRoaXMucmVzcG9uc2l2ZVNlcnZpY2UuSXNEZXNrdG9wVmlldykge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0UG9zaXRpb24od2lkZ2V0SW5zdGFuY2VJZCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHdpZGdldC5zZXR0aW5ncyAmJiB3aWRnZXQuc2V0dGluZ3MuaXNQQU1XaWRnZXQpIHtcclxuICAgICAgICB0aGlzLlBBTVdpZGdldHMucHVzaCh3aWRnZXQud2lkZ2V0SW5zdGFuY2VJZCk7XHJcbiAgICAgICAgdGhpcy5jaGVja1BBTVdpZGdldHMoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMucHVibGlzaChSQUV2ZW50LldpZGdldEFkZGVkLCB3aWRnZXQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFBvc2l0aW9ucyhkYXRhOiBhbnkpIHtcclxuICAgIGRhdGEucG9zaXRpb25feCA9IDA7XHJcbiAgICBkYXRhLnBvc2l0aW9uX3kgPSAwO1xyXG4gICAgaWYgKCF0aGlzLnJlc3BvbnNpdmVTZXJ2aWNlLklzRGVza3RvcFZpZXcpIHtcclxuICAgICAgaWYgKHRoaXMudXNlcldpZGdldHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCB3aWRnZXQgPSB0aGlzLnVzZXJXaWRnZXRzW3RoaXMudXNlcldpZGdldHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgaWYgKHdpZGdldC5wb3NpdGlvbl94ICsgd2lkZ2V0LndpZHRoID4gKHRoaXMucmVzcG9uc2l2ZVNlcnZpY2UubWF4Q29sc0Rlc2t0b3AgLyAyKSkge1xyXG4gICAgICAgICAgZGF0YS5wb3NpdGlvbl95ID0gd2lkZ2V0LnBvc2l0aW9uX3kgKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGRhdGEucG9zaXRpb25feSA9IHdpZGdldC5wb3NpdGlvbl95O1xyXG4gICAgICAgICAgZGF0YS5wb3NpdGlvbl94ID0gdGhpcy5yZXNwb25zaXZlU2VydmljZS5tYXhDb2xzRGVza3RvcCAtICh3aWRnZXQucG9zaXRpb25feCArIHdpZGdldC53aWR0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIC8qKiBUbyBhZGQgd2lkZ2V0IHRvIGN1cnJlbnQgd2lkZ2V0IGxpc3QgLGludm9rZWQgZnJvbSBjb3B5IHdpZGdldCB3aW5kb3cqL1xyXG4gIGNvcHlXaWRnZXQoZGF0YTogYW55KSB7XHJcbiAgICBkYXRhID0gdGhpcy5zZXRQb3NpdGlvbnMoZGF0YSk7XHJcbiAgICBpZiAoIXRoaXMucmVzcG9uc2l2ZVNlcnZpY2UuSXNEZXNrdG9wVmlldykge1xyXG4gICAgICB0aGlzLmRhc2hib2FyZFNlcnZpY2UudXBkYXRlV2lkZ2V0cyh0aGlzLmZvcm1hdFdpZGdldERhdGFGb3JQb3NpdGlvbkRldGFpbHMoW2RhdGFdKSwgdGhpcy5hcHBDb25maWcpLnN1YnNjcmliZSh3aWRnZXRzID0+IHtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVzZXJXaWRnZXRzLnB1c2goZGF0YSk7XHJcbiAgICBsZXQgZ3JpZHN0ZXJJdGVtID0gdGhpcy5yZXNwb25zaXZlU2VydmljZS5nZXRHcmlkc3Rlckl0ZW0oZGF0YSk7XHJcbiAgICB0aGlzLndpZGdldExpc3QucHVzaChncmlkc3Rlckl0ZW0pO1xyXG4gICAgdGhpcy5zZXRBcmVhSGVpZ2h0KCk7XHJcbiAgICBpZiAoZGF0YS5zZXR0aW5ncyAmJiBkYXRhLnNldHRpbmdzLmlzUEFNV2lkZ2V0KSB7XHJcbiAgICAgIHRoaXMuUEFNV2lkZ2V0cy5wdXNoKGRhdGEud2lkZ2V0SW5zdGFuY2VJZCk7XHJcbiAgICAgIHRoaXMuY2hlY2tQQU1XaWRnZXRzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtYXBPYmplY3RMaXN0VG9Hcmlkc3Rlckl0ZW1MaXN0KHdpZGdldExpc3Q6IEFycmF5PElXaWRnZXRJbmZvPikge1xyXG4gICAgbGV0IHdpZGdldEFycmF5ID0gQXJyYXk8R3JpZHN0ZXJJdGVtPigpO1xyXG4gICAgd2lkZ2V0TGlzdC5mb3JFYWNoKHdpZGdldCA9PiB7XHJcbiAgICAgIHdpZGdldEFycmF5LnB1c2godGhpcy5yZXNwb25zaXZlU2VydmljZS5nZXRHcmlkc3Rlckl0ZW0od2lkZ2V0KSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB3aWRnZXRBcnJheTtcclxuICB9XHJcblxyXG4gIG1hcEdyaWRzdGVySXRlbVRvT2JqZWN0KHdpZGdldEl0ZW06IEdyaWRzdGVySXRlbSkge1xyXG4gICAgbGV0IHdpZGdldDogSVdpZGdldEluZm87XHJcbiAgICB3aWRnZXQgPSB3aWRnZXRJdGVtWyd3aWRnZXRJbmZvJ107XHJcbiAgICB3aWRnZXQuaGVpZ2h0ID0gd2lkZ2V0SXRlbS5yb3dzO1xyXG4gICAgd2lkZ2V0LndpZHRoID0gd2lkZ2V0SXRlbS5jb2xzO1xyXG4gICAgd2lkZ2V0LnBvc2l0aW9uX3ggPSB3aWRnZXRJdGVtLng7XHJcbiAgICB3aWRnZXQucG9zaXRpb25feSA9IHdpZGdldEl0ZW0ueTtcclxuICAgIC8vd2lkZ2V0LnJvd0hlaWdodCA9IDxhbnk+d2lkZ2V0SXRlbS5jdXJSb3dIZWlnaHQ7XHJcbiAgICByZXR1cm4gd2lkZ2V0O1xyXG4gIH1cclxuXHJcbiAgbWFwR3JpZHN0ZXJMaXN0VG9PYmplY3Qod2lkZ2V0SXRlbUxpc3Q6IEFycmF5PEdyaWRzdGVySXRlbT4pIHtcclxuICAgIGxldCB3aWRnZXRMaXN0QXJyYXkgPSBBcnJheTxJV2lkZ2V0SW5mbz4oKTtcclxuICAgIHdpZGdldEl0ZW1MaXN0LmZvckVhY2god2lkZ2V0ID0+IHtcclxuICAgICAgd2lkZ2V0TGlzdEFycmF5LnB1c2godGhpcy5tYXBHcmlkc3Rlckl0ZW1Ub09iamVjdCh3aWRnZXQpKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHdpZGdldExpc3RBcnJheTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGROZXdXaWRnZXQoKSB7XHJcbiAgICB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMucHVibGlzaChSQUV2ZW50LkFkZE5ld1dpZGdldFRvRGFzaGJvYXJkLCBudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVBcHBsaWVkRmlsdGVycyhkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuVXBkYXRlQXBwbGVkRml0ZXJGb3JJbmFwcGxpY2FibGVGaWx0ZXIsIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrUEFNV2lkZ2V0cygpIHtcclxuICAgIGlmICh0aGlzLlBBTVdpZGdldHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMucHVibGlzaChSQUV2ZW50LlNob3dJbmFwcGxpY2FibGVGaWx0ZXJNZXNzYWdlLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMucHVibGlzaChSQUV2ZW50LlNob3dJbmFwcGxpY2FibGVGaWx0ZXJNZXNzYWdlLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufSIsIjxkaXYgI2dyaWRXcmFwcGVyIGNsYXNzPVwid3JhcCBncmlkc3RlciBncmlkc3Rlci1tb2JpbGVcIiBbbmdTdHlsZV09XCJ7J2hlaWdodCc6IHVzZXJXaWRnZXRzLmxlbmd0aCA+IDAgPyAoZ3JpZGhlaWdodCArICdweCcpIDogJ3Vuc2V0J31cIj5cclxuICA8IS0tIDxkaXYgI2dyaWRXcmFwcGVyIGNsYXNzPVwid3JhcCBncmlkc3RlclwiPiAtLT5cclxuICA8Z3JpZHN0ZXIgW29wdGlvbnNdPVwib3B0aW9uc1wiIHN0eWxlPVwiaGVpZ2h0OjEwMCU7XCIgKm5nSWY9XCJ1c2VyV2lkZ2V0cy5sZW5ndGggPiAwXCI+XHJcbiAgICA8Z3JpZHN0ZXItaXRlbSBbaXRlbV09XCJpdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygd2lkZ2V0TGlzdFwiPlxyXG4gICAgICA8cmEtd2lkZ2V0LWNvbnRhaW5lciBbYXBwLWNvbmZpZ109XCJhcHBDb25maWdcIiBbZXZlbnQtYnVzXT1cInJhRGFzaGJvYXJkRXZlbnRCdXNcIlxyXG4gICAgICAgICh3aWRnZXREZWxldGVkKT1cImRlbGV0ZVdpZGdldCgkZXZlbnQpXCIgW2RhdGFdPVwiaXRlbVwiIFtnbG9iYWwtZmlsdGVyXT1cImdsb2JhbEZpbHRlclwiXHJcbiAgICAgICAgW2dyaWQtY2VsbC1oZWlnaHRdPVwiZ3JpZGNlbGxIZWlnaHRcIiAqbmdJZj1cImdyaWRjZWxsSGVpZ2h0ICYmIGdyaWRjZWxsSGVpZ2h0ID4gMFwiIFt3aWRnZXQtd2lkdGhdPVwiaXRlbS5jb2xzXCJcclxuICAgICAgICBbd2lkZ2V0LWhlaWdodF09XCJpdGVtLnJvd3NcIiBbd2lkZ2V0LWluc3RhbmNlLWlkXT1cIml0ZW1bJ3dpZGdldEluc3RhbmNlSWQnXVwiIFtkb20tcmVzaXplZF09XCJkb21SZXNpemVkXCJcclxuICAgICAgICAodXBkYXRlQXBwbGllZEZpbHRlcnMpPVwidXBkYXRlQXBwbGllZEZpbHRlcnMoJGV2ZW50KVwiPlxyXG4gICAgICA8L3JhLXdpZGdldC1jb250YWluZXI+XHJcbiAgICA8L2dyaWRzdGVyLWl0ZW0+XHJcbiAgPC9ncmlkc3Rlcj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImVtcHR5LXBhZGRpbmcga2lvc2staGlkZVwiICpuZ0lmPVwic2hvd0VtcHR5RGFzaGJvYXJkXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZW1wdHktd3JhcHBlclwiPlxyXG4gICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibS0xIGVtcHR5LXByZWZpeFwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmFsIGZhLWVkaXQgZWRpdC1pY29uXCI+PC9pPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktdGl0bGVcIj57eydkYXNoYm9hcmQuZW1wdHlkYXNoYm9hcmQnfHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LWNvbnRlbnQgbGlnaHRcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMiBlbXB0eS1tc2dcIj5cclxuICAgICAgICAgICAge3snZGFzaGJvYXJkLmVtcHR5ZGFzaGJvYXJkbWVzc2FnZSd8dHJhbnNsYXRlfX0gPGJyIC8+XHJcbiAgICAgICAgICAgIHt7J2Rhc2hib2FyZC5lbXB0eWRhc2hib2FyZG1lc3NhZ2UyJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNXaWRnZXRNZ21udFwiIGNsYXNzPVwiYnRuIGJ0bkxpYiBidG4tc20gbS0xIGRhc2hib2FyZC1idXR0b24gbGlnaHRcIiAoY2xpY2spPVwiYWRkTmV3V2lkZ2V0KClcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYWwgZmEtcGx1cyBtLTFcIj48L2k+e3snZGFzaGJvYXJkLmFkZGF3aWRnZXRzJ3x0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bm90aWZpZXItY29udGFpbmVyPjwvbm90aWZpZXItY29udGFpbmVyPlxyXG48L2Rpdj4iXX0=
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "@schneideress/ra-common";
|
|
4
|
-
import * as i2 from "@angular/common";
|
|
5
|
-
export class LockTooltip {
|
|
6
|
-
constructor(domService) {
|
|
7
|
-
this.domService = domService;
|
|
8
|
-
}
|
|
9
|
-
ngOnInit() {
|
|
10
|
-
if (this.element) {
|
|
11
|
-
this.setPopupPosition();
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
setPopupPosition() {
|
|
15
|
-
let rect = this.element.getBoundingClientRect();
|
|
16
|
-
if ((rect.left + 250) > window.innerWidth) {
|
|
17
|
-
this.containerLeft = (rect.left - ((rect.left + 270) - window.innerWidth)) + 'px';
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
this.containerLeft = rect.left + 'px';
|
|
21
|
-
}
|
|
22
|
-
if (rect.bottom + 100 < window.innerHeight) {
|
|
23
|
-
this.containerTop = (rect.bottom) + 'px';
|
|
24
|
-
this.containerBottom = null;
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
this.containerTop = null;
|
|
28
|
-
this.containerBottom = (window.innerHeight - rect.top) + 'px';
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
removeMe(comp) {
|
|
32
|
-
setTimeout(() => {
|
|
33
|
-
this.domService.removeComponent(comp);
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
LockTooltip.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: LockTooltip, deps: [{ token: i1.DomService }], target: i0.ɵɵFactoryTarget.Component });
|
|
38
|
-
LockTooltip.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: LockTooltip, selector: "ra-lock-tooltip", ngImport: i0, template: "<div class=\"lock-popup-content light widget-config-item\"\r\n [ngStyle]=\"{'top': containerTop,'bottom':containerBottom,'position':'fixed','left':containerLeft,'z-index': '9999','width':'250px','min-height':'fit-content'}\">\r\n <div *ngIf=\"data && !template\">\r\n <label style=\"color: #D9F0FA;\">\r\n {{title}}:\r\n </label>\r\n <div style=\"color: white;\">\r\n <label class=\"bold\" style=\"margin-bottom: 0px;width: 100%;\" *ngFor=\"let item of data\">\r\n {{item}}\r\n </label>\r\n </div>\r\n <hr style=\"background-color: white;\">\r\n <div style=\"color: #D9F0FA;\">\r\n <label>{{footer}}</label>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!data && template\">\r\n <ng-container *ngTemplateOutlet=\"template\">\r\n </ng-container>\r\n </div>\r\n</div>", styles: [".lock-popup-content{margin-top:8px;position:absolute;right:0;top:79%;box-shadow:0 8px 16px 8px #0003;z-index:899;font-size:12px;min-width:220px!important;min-height:112px;background-color:#219bfd;opacity:.9;padding:15px;color:#fff}.widget-config-item i{font-size:17px;color:#42b4e6}.widget-config-item span{font-size:12px;font:inherit;padding-left:12px;color:#42b4e6}\n"], directives: [{ type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
|
39
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: LockTooltip, decorators: [{
|
|
40
|
-
type: Component,
|
|
41
|
-
args: [{ selector: 'ra-lock-tooltip', template: "<div class=\"lock-popup-content light widget-config-item\"\r\n [ngStyle]=\"{'top': containerTop,'bottom':containerBottom,'position':'fixed','left':containerLeft,'z-index': '9999','width':'250px','min-height':'fit-content'}\">\r\n <div *ngIf=\"data && !template\">\r\n <label style=\"color: #D9F0FA;\">\r\n {{title}}:\r\n </label>\r\n <div style=\"color: white;\">\r\n <label class=\"bold\" style=\"margin-bottom: 0px;width: 100%;\" *ngFor=\"let item of data\">\r\n {{item}}\r\n </label>\r\n </div>\r\n <hr style=\"background-color: white;\">\r\n <div style=\"color: #D9F0FA;\">\r\n <label>{{footer}}</label>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!data && template\">\r\n <ng-container *ngTemplateOutlet=\"template\">\r\n </ng-container>\r\n </div>\r\n</div>", styles: [".lock-popup-content{margin-top:8px;position:absolute;right:0;top:79%;box-shadow:0 8px 16px 8px #0003;z-index:899;font-size:12px;min-width:220px!important;min-height:112px;background-color:#219bfd;opacity:.9;padding:15px;color:#fff}.widget-config-item i{font-size:17px;color:#42b4e6}.widget-config-item span{font-size:12px;font:inherit;padding-left:12px;color:#42b4e6}\n"] }]
|
|
42
|
-
}], ctorParameters: function () { return [{ type: i1.DomService }]; } });
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jay50b29sdGlwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rhc2hib2FyZC1mcmFtZXdvcmsvc3JjL2xpYi9yYS13aWRnZXQtY29udGFpbmVyL2xvY2stdG9vbHRpcC9sb2NrLnRvb2x0aXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGFzaGJvYXJkLWZyYW1ld29yay9zcmMvbGliL3JhLXdpZGdldC1jb250YWluZXIvbG9jay10b29sdGlwL2xvY2sudG9vbHRpcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7O0FBT2xELE1BQU0sT0FBTyxXQUFXO0lBV3BCLFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFDMUMsQ0FBQztJQUNELFFBQVE7UUFDSixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUMzQjtJQUNMLENBQUM7SUFDTyxnQkFBZ0I7UUFDcEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUksSUFBSSxDQUFDO1NBQ3BGO2FBQ0k7WUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1NBQy9CO2FBQ0k7WUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ2pFO0lBQ0wsQ0FBQztJQUVNLFFBQVEsQ0FBQyxJQUFTO1FBQ3JCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7O3dHQXhDUSxXQUFXOzRGQUFYLFdBQVcsdURDUHhCLGk0QkFvQk07MkZEYk8sV0FBVztrQkFMdkIsU0FBUzsrQkFDSSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TZXJ2aWNlIH0gZnJvbSAnQHNjaG5laWRlcmVzcy9yYS1jb21tb24nO1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAncmEtbG9jay10b29sdGlwJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9sb2NrLnRvb2x0aXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbG9jay50b29sdGlwLmNvbXBvbmVudC5jc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIExvY2tUb29sdGlwIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBwdWJsaWMgZWxlbWVudDogYW55O1xyXG4gICAgcHVibGljIHRpdGxlOiBhbnk7XHJcbiAgICBwdWJsaWMgZGF0YTogYW55O1xyXG4gICAgcHVibGljIGZvb3RlcjogYW55O1xyXG4gICAgcHVibGljIHRlbXBsYXRlOiBhbnk7XHJcblxyXG4gICAgcHVibGljIGNvbnRhaW5lckxlZnQ6IGFueTtcclxuICAgIHB1YmxpYyBjb250YWluZXJUb3A6IGFueTtcclxuICAgIHB1YmxpYyBjb250YWluZXJCb3R0b206IGFueTtcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZG9tU2VydmljZTogRG9tU2VydmljZSkge1xyXG4gICAgfVxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFBvcHVwUG9zaXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHNldFBvcHVwUG9zaXRpb24oKSB7XHJcbiAgICAgICAgbGV0IHJlY3QgPSB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgaWYgKChyZWN0LmxlZnQgKyAyNTApID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJMZWZ0ID0gKHJlY3QubGVmdCAtICgocmVjdC5sZWZ0ICsgMjcwKS13aW5kb3cuaW5uZXJXaWR0aCkpICArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lckxlZnQgPSByZWN0LmxlZnQgKyAncHgnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVjdC5ib3R0b20gKyAxMDAgPCB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJUb3AgPSAocmVjdC5ib3R0b20pICsgJ3B4JztcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJCb3R0b20gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJUb3AgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lckJvdHRvbSA9ICh3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LnRvcCkgKyAncHgnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlTWUoY29tcDogYW55KSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZG9tU2VydmljZS5yZW1vdmVDb21wb25lbnQoY29tcCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwibG9jay1wb3B1cC1jb250ZW50IGxpZ2h0IHdpZGdldC1jb25maWctaXRlbVwiXHJcbiAgICBbbmdTdHlsZV09XCJ7J3RvcCc6IGNvbnRhaW5lclRvcCwnYm90dG9tJzpjb250YWluZXJCb3R0b20sJ3Bvc2l0aW9uJzonZml4ZWQnLCdsZWZ0Jzpjb250YWluZXJMZWZ0LCd6LWluZGV4JzogJzk5OTknLCd3aWR0aCc6JzI1MHB4JywnbWluLWhlaWdodCc6J2ZpdC1jb250ZW50J31cIj5cclxuICAgIDxkaXYgKm5nSWY9XCJkYXRhICYmICF0ZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImNvbG9yOiAjRDlGMEZBO1wiPlxyXG4gICAgICAgICAgICB7e3RpdGxlfX06XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHdoaXRlO1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJib2xkXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAwcHg7d2lkdGg6IDEwMCU7XCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAge3tpdGVtfX1cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8aHIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcIj5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6ICNEOUYwRkE7XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbD57e2Zvb3Rlcn19PC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cIiFkYXRhICYmIHRlbXBsYXRlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
|