ngx-bimplus-components 0.0.83 → 0.0.84-draggable

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/assets/languages/strings_de.json +3 -36
  2. package/assets/languages/strings_en.json +2 -3
  3. package/assets/languages/strings_us.json +3 -62
  4. package/esm2022/lib/components/bimplus-floating-bar/bimplus-floating-bar.component.mjs +65 -9
  5. package/esm2022/lib/components/bimplus-floating-bar-body/bimplus-floating-bar-body.component.mjs +17 -6
  6. package/esm2022/lib/components/bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component.mjs +16 -12
  7. package/esm2022/lib/components/bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component.mjs +20 -12
  8. package/esm2022/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.mjs +26 -16
  9. package/esm2022/lib/components/bimplus-floating-bar-hide-objects/bimplus-floating-bar-hide-objects.component.mjs +16 -51
  10. package/esm2022/lib/components/bimplus-floating-bar-isolation-objects/bimplus-floating-bar-isolation-objects.component.mjs +12 -36
  11. package/esm2022/lib/components/bimplus-floating-bar-project-navigator/bimplus-floating-bar-project-navigator.component.mjs +18 -37
  12. package/esm2022/lib/components/bimplus-main-menu/bimplus-main-menu.component.mjs +12 -3
  13. package/esm2022/lib/components/bimplus-navbar/bimplus-navbar.component.mjs +3 -3
  14. package/esm2022/lib/components/bimplus-project-menu/bimplus-project-menu.component.mjs +9 -7
  15. package/esm2022/lib/components/bimplus-tool-hub/bimplus-tool-hub.component.mjs +53 -36
  16. package/esm2022/lib/directives/draggable.directive.mjs +8 -2
  17. package/esm2022/lib/directives/resizable.directive.mjs +290 -0
  18. package/esm2022/lib/services/layout-manager.service.mjs +245 -43
  19. package/esm2022/lib/services/local-storage.service.mjs +70 -0
  20. package/esm2022/lib/services/resize-observer.service.mjs +34 -0
  21. package/esm2022/public-api.mjs +2 -1
  22. package/fesm2022/ngx-bimplus-components.mjs +954 -332
  23. package/fesm2022/ngx-bimplus-components.mjs.map +1 -1
  24. package/lib/components/bimplus-floating-bar/bimplus-floating-bar.component.d.ts +22 -4
  25. package/lib/components/bimplus-floating-bar-body/bimplus-floating-bar-body.component.d.ts +8 -3
  26. package/lib/components/bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component.d.ts +6 -3
  27. package/lib/components/bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component.d.ts +6 -3
  28. package/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.d.ts +10 -6
  29. package/lib/components/bimplus-floating-bar-hide-objects/bimplus-floating-bar-hide-objects.component.d.ts +10 -12
  30. package/lib/components/bimplus-floating-bar-isolation-objects/bimplus-floating-bar-isolation-objects.component.d.ts +6 -9
  31. package/lib/components/bimplus-floating-bar-project-navigator/bimplus-floating-bar-project-navigator.component.d.ts +6 -8
  32. package/lib/components/bimplus-main-menu/bimplus-main-menu.component.d.ts +4 -1
  33. package/lib/components/bimplus-project-menu/bimplus-project-menu.component.d.ts +3 -3
  34. package/lib/components/bimplus-tool-hub/bimplus-tool-hub.component.d.ts +18 -11
  35. package/lib/directives/draggable.directive.d.ts +2 -1
  36. package/lib/directives/resizable.directive.d.ts +80 -0
  37. package/lib/services/layout-manager.service.d.ts +60 -3
  38. package/lib/services/local-storage.service.d.ts +18 -0
  39. package/lib/services/resize-observer.service.d.ts +12 -0
  40. package/package.json +2 -2
  41. package/public-api.d.ts +1 -0
@@ -1,50 +1,215 @@
1
1
  import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
2
3
  import * as i0 from "@angular/core";
4
+ import * as i1 from "./resize-observer.service";
5
+ import * as i2 from "./local-storage.service";
3
6
  export class LayoutManagerService {
4
- constructor() { }
5
- checkPosition(elementRef, selector, left, top, deltaX, deltaY, forceCheck = false) {
6
- const parent = document.getElementById("mainViewportContainer");
7
- //const leftPanel = document.getElementsByClassName("left-sidenav-content");
8
- //const leftPanel = document.querySelector(".left-sidenav-content");
9
- //const leftPanel = document.querySelector(".sidenav");
10
- const leftPanel = document.querySelector('lib-bimplus-sidenav')?.shadowRoot?.querySelector('.sidenav');
11
- const topPanel = document.querySelector('lib-bimplus-navbar')?.shadowRoot?.querySelector('.bimplus-navbar');
12
- if (parent && elementRef.nativeElement && leftPanel && topPanel && selector) {
13
- const viewRect = parent.getBoundingClientRect();
14
- const leftPanelRect = leftPanel.getBoundingClientRect();
15
- const topPanelRect = topPanel.getBoundingClientRect();
16
- const elementRect = elementRef.nativeElement?.shadowRoot.querySelector(selector)?.getBoundingClientRect();
17
- console.log(`box: left:${elementRect.left},top:${elementRect.top},right:${elementRect.right},bottom:${elementRect.bottom}`);
18
- //const elementRect:DOMRect = elementRef.nativeElement.getBoundingClientRect();
19
- const parentRect = new DOMRect(viewRect.left + leftPanelRect.right + topPanelRect.left, viewRect.top, viewRect.width - leftPanelRect.width, viewRect.height);
20
- //const parentRect:DOMRect = new DOMRect( viewRect.left,viewRect.top,viewRect.width,viewRect.height);
21
- //console.log(viewRect,elementRect);
22
- let checkBoundaries = true;
23
- if (this._isInsideRect(elementRect, parentRect) === false && !forceCheck) {
24
- checkBoundaries = false;
7
+ constructor(resizeObserverService, localStorageService) {
8
+ this.resizeObserverService = resizeObserverService;
9
+ this.localStorageService = localStorageService;
10
+ this.registeredItems$ = new BehaviorSubject([]);
11
+ this.registeredItems = [];
12
+ this.CONFIG = 'layoutManagerConfig';
13
+ }
14
+ get RegisteredItems() {
15
+ return this.registeredItems;
16
+ }
17
+ /**--------------------------------------------------------------------------
18
+ * register object. object must have unique id or elementId
19
+ --------------------------------------------------------------------------*/
20
+ registerObject(obj, id, selector, rememberPosition, left = 100, top = 100, width = 0, height = 0) {
21
+ let foundIndex = -1;
22
+ if (this.registeredItems.some((item, index) => {
23
+ const retval = item.id === id;
24
+ if (retval) {
25
+ foundIndex = index;
25
26
  }
26
- // copy of real element rectangle to perform calculation over before set to the real element
27
- const elementDOMRect = DOMRect.fromRect(elementRect);
28
- //set the element rectangle by deltas
29
- this._translateRectangle(elementDOMRect, deltaX, deltaY);
30
- if (checkBoundaries) {
31
- if (this._isInsideRect(elementDOMRect, parentRect) === false) {
32
- const newElementPos = this.getAlignedPosition(elementDOMRect, parentRect);
33
- deltaX = newElementPos.x - elementRect.x;
34
- deltaY = newElementPos.y - elementRect.y;
35
- this._translateRectangle(elementDOMRect, deltaX, deltaY);
36
- }
27
+ return retval;
28
+ })) {
29
+ if (foundIndex >= 0) {
30
+ this.registeredItems.splice(foundIndex, 1);
37
31
  }
38
- else {
39
- console.log("not inside!!");
40
- if (this._isInsideLeftTopRect(parentRect, elementDOMRect) === false) {
41
- const newElementPos = this._getAlignedLeftTopPosition(elementDOMRect, parentRect);
42
- deltaX = newElementPos.x - elementRect.x;
43
- deltaY = newElementPos.y - elementRect.y;
44
- this._translateRectangle(elementDOMRect, deltaX, deltaY);
45
- }
32
+ }
33
+ const newItem = {
34
+ element: obj,
35
+ id: id,
36
+ selector: selector,
37
+ rememberPosition: !!rememberPosition,
38
+ left: left,
39
+ top: top,
40
+ width: width,
41
+ height: height,
42
+ isCollapsed: false
43
+ };
44
+ this.registeredItems.push(newItem);
45
+ this.registeredItems$.next(this.registeredItems);
46
+ this._initObject(newItem);
47
+ }
48
+ _initObject(obj) {
49
+ this._adjustObjectByConfig(obj);
50
+ this._adjustObjectByWindowSize(obj);
51
+ }
52
+ /**--------------------------------------------------------------------------
53
+ * get object configuration
54
+ * return {left, top, width, heigth}
55
+ --------------------------------------------------------------------------*/
56
+ _getObjectConfig(obj) {
57
+ if (!obj) {
58
+ return null;
59
+ }
60
+ const configValue = this.localStorageService.getItem(this.CONFIG);
61
+ const config = configValue ? JSON.parse(configValue) : {};
62
+ const objId = obj.id;
63
+ let configObj = config[objId];
64
+ if (!configObj) {
65
+ configObj = { id: objId, left: obj.left, top: obj.top, width: obj.width, height: obj.height };
66
+ }
67
+ return configObj;
68
+ }
69
+ _adjustObjectByConfig(obj) {
70
+ const config = this._getObjectConfig(obj);
71
+ if (!config) {
72
+ return;
73
+ }
74
+ const element = this._getDomElement(obj, '');
75
+ if (!element) {
76
+ return;
77
+ }
78
+ element.style.left = (config.left) + 'px';
79
+ element.style.top = (config.top) + 'px';
80
+ if (config.width && config.width > 0) {
81
+ element.style.width = config.width + 'px';
82
+ }
83
+ if (config.height && config.height > 0) {
84
+ element.style.height = config.height + 'px';
85
+ }
86
+ this.checkPosition(obj.id, "", undefined, 0, 0, true);
87
+ }
88
+ _adjustObjectByWindowSize(obj) {
89
+ this.checkPosition(obj.id, "", undefined, 0, 0, true);
90
+ }
91
+ /**--------------------------------------------------------------------------
92
+ * returns object registered in the layout manager
93
+ --------------------------------------------------------------------------*/
94
+ getItem(id) {
95
+ let foundItem = null;
96
+ this.registeredItems.forEach(item => {
97
+ if (item.id === id) {
98
+ foundItem = item;
99
+ }
100
+ });
101
+ return foundItem;
102
+ }
103
+ /**--------------------------------------------------------------------------
104
+ * set object configuration
105
+ --------------------------------------------------------------------------*/
106
+ _setObjectConfig(obj, left, top, width, height) {
107
+ const objId = obj?.id;
108
+ if (!objId) {
109
+ return;
110
+ }
111
+ let config = this.localStorageService.getObject(this.CONFIG);
112
+ //let config = configValue && JSON.parse(configValue) as LayoutManagerConfig;
113
+ if (!config) {
114
+ config = {};
115
+ }
116
+ if (obj?.isCollapsed) { // do not overtake collapsed size
117
+ if (!config[objId]) {
118
+ config[objId] = obj;
46
119
  }
120
+ config[objId].left = left;
121
+ config[objId].top = top;
122
+ //config[objId].width = width;
123
+ //config[objId].height = height ;
124
+ this.localStorageService.setObject(this.CONFIG, config);
125
+ return;
47
126
  }
127
+ const newItem = {
128
+ id: objId,
129
+ isCollapsed: false,
130
+ left: left,
131
+ top: top,
132
+ width: width,
133
+ height: height
134
+ };
135
+ config[objId] = newItem;
136
+ this.localStorageService.setObject(this.CONFIG, config);
137
+ }
138
+ _getDomElement(item, selector) {
139
+ const element = item.element?.nativeElement?.shadowRoot || item.element?.nativeElement;
140
+ if (!element) {
141
+ console.error('_getDomElement: missing element');
142
+ return null;
143
+ }
144
+ const mySelector = selector && selector?.length > 0 ? selector : item.selector;
145
+ return mySelector ? element.querySelector(mySelector) : element;
146
+ }
147
+ _getElementRect(item, selector, parentRectangle) {
148
+ const selectedObj = this._getDomElement(item, selector);
149
+ if (!selectedObj) {
150
+ return null;
151
+ }
152
+ const parentRect = parentRectangle || this.resizeObserverService.getParentAppRect();
153
+ if (!parentRect || parentRect?.width <= 1 || parentRect?.height <= 1) {
154
+ console.error('_getElementRect: missing parent rect');
155
+ return null;
156
+ }
157
+ const elementRect = selectedObj.getBoundingClientRect();
158
+ return elementRect;
159
+ }
160
+ // checks whether element or element with additional selection of subelement is placed within the give rectangle
161
+ // if not then calculates the offset to be moved to fit in
162
+ checkPosition(id, selector, parentRectangle, deltaX, deltaY, forceCheck = false) {
163
+ if (!id) {
164
+ return { deltaX: 0, deltaY: 0 };
165
+ }
166
+ const e1 = this.getItem(id);
167
+ if (!e1) {
168
+ return { deltaX: 0, deltaY: 0 };
169
+ }
170
+ const parentRect = parentRectangle || this.resizeObserverService.getParentAppRect();
171
+ const elementRect = this._getElementRect(e1, selector, parentRect);
172
+ if (!elementRect) {
173
+ console.error('checkPosition: missing element');
174
+ return { deltaX: 0, deltaY: 0 };
175
+ }
176
+ if (!elementRect?.width || !elementRect?.height) {
177
+ console.error('checkPosition:missing element rect');
178
+ return { deltaX: 0, deltaY: 0 };
179
+ }
180
+ let checkBoundaries = true;
181
+ if (this._isInsideRect(elementRect, parentRect) === false && !forceCheck) {
182
+ checkBoundaries = false;
183
+ }
184
+ // copy of real element rectangle to perform calculation over before set to the real element
185
+ const elementDOMRect = DOMRect.fromRect(elementRect);
186
+ //set the element rectangle by deltas
187
+ this._translateRectangle(elementDOMRect, deltaX, deltaY);
188
+ if (checkBoundaries) {
189
+ if (this._isInsideRect(elementDOMRect, parentRect) === false) {
190
+ const newElementPos = this.getAlignedPosition(elementDOMRect, parentRect);
191
+ deltaX = newElementPos.x - elementRect.x;
192
+ deltaY = newElementPos.y - elementRect.y;
193
+ this._translateRectangle(elementDOMRect, deltaX, deltaY);
194
+ }
195
+ }
196
+ else {
197
+ if (this._isInsideLeftTopRect(parentRect, elementDOMRect) === false) {
198
+ const newElementPos = this._getAlignedLeftTopPosition(elementDOMRect, parentRect);
199
+ deltaX = newElementPos.x - elementRect.x;
200
+ deltaY = newElementPos.y - elementRect.y;
201
+ this._translateRectangle(elementDOMRect, deltaX, deltaY);
202
+ }
203
+ }
204
+ const selectedElement = this._getDomElement(e1, ''); //e1.element.nativeElement;
205
+ if (!selectedElement) {
206
+ return;
207
+ }
208
+ const computedStyle = window.getComputedStyle(selectedElement);
209
+ const top = parseInt(computedStyle.top, 10);
210
+ const left = parseInt(computedStyle.left, 10);
211
+ selectedElement.style.top = (top + deltaY) + 'px';
212
+ selectedElement.style.left = (left + deltaX) + 'px';
48
213
  return { deltaX, deltaY };
49
214
  }
50
215
  /**--------------------------------------------------------------------------
@@ -120,7 +285,44 @@ export class LayoutManagerService {
120
285
  rect.y += translateY;
121
286
  return rect;
122
287
  }
123
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: LayoutManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
288
+ updateCollapsed(value, id = '') {
289
+ const foundItem = this.getItem(id);
290
+ if (!foundItem) {
291
+ return;
292
+ }
293
+ foundItem.isCollapsed = value;
294
+ this.registeredItems$.next(this.registeredItems);
295
+ setTimeout(() => {
296
+ this.checkPosition(foundItem.id, "", undefined, 0, 0, true);
297
+ });
298
+ let s1 = '';
299
+ this.registeredItems.forEach((item) => {
300
+ s1 = s1 + `${item.id}:<${item.isCollapsed ? 1 : 0}> `;
301
+ });
302
+ }
303
+ handleDragEnd(id) {
304
+ this.finalizeObjectChanges(id);
305
+ }
306
+ /**--------------------------------------------------------------------------
307
+ * finalize object changes (position). object must be registered in the layout manager
308
+ * object: object to finalize
309
+ --------------------------------------------------------------------------*/
310
+ finalizeObjectChanges(id) {
311
+ const item = this.getItem(id);
312
+ if (!item) {
313
+ return;
314
+ }
315
+ const element = this._getDomElement(item, '');
316
+ if (!element) {
317
+ return;
318
+ }
319
+ const computedStyle = window.getComputedStyle(element);
320
+ const top = parseInt(computedStyle.top, 10);
321
+ const left = parseInt(computedStyle.left, 10);
322
+ const elementRect = this._getElementRect(item, undefined, undefined);
323
+ this._setObjectConfig(item, left, top, elementRect && elementRect.width > 0 ? elementRect.width : 0, elementRect && elementRect.height > 0 ? elementRect.height : 0);
324
+ }
325
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: LayoutManagerService, deps: [{ token: i1.ResizeObserverService }, { token: i2.LocalStorageService }], target: i0.ɵɵFactoryTarget.Injectable }); }
124
326
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: LayoutManagerService, providedIn: 'root' }); }
125
327
  }
126
328
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: LayoutManagerService, decorators: [{
@@ -128,5 +330,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImpo
128
330
  args: [{
129
331
  providedIn: 'root'
130
332
  }]
131
- }], ctorParameters: () => [] });
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LW1hbmFnZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1iaW1wbHVzLWNvbXBvbmVudHMvc3JjL2xpYi9zZXJ2aWNlcy9sYXlvdXQtbWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBS3RELE1BQU0sT0FBTyxvQkFBb0I7SUFFL0IsZ0JBQWdCLENBQUM7SUFDakIsYUFBYSxDQUFDLFVBQXFCLEVBQUMsUUFBZSxFQUFDLElBQVcsRUFBQyxHQUFVLEVBQUMsTUFBYSxFQUFDLE1BQWEsRUFBQyxhQUFxQixLQUFLO1FBQy9ILE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNoRSw0RUFBNEU7UUFDNUUsb0VBQW9FO1FBQ3BFLHVEQUF1RDtRQUN2RCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RyxNQUFNLFFBQVEsR0FBSSxRQUFRLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdHLElBQUcsTUFBTSxJQUFJLFVBQVUsQ0FBQyxhQUFhLElBQUksU0FBUyxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUMsQ0FBQztZQUMxRSxNQUFNLFFBQVEsR0FBVyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN4RCxNQUFNLGFBQWEsR0FBVSxTQUFTLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvRCxNQUFNLFlBQVksR0FBVyxRQUFRLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM5RCxNQUFNLFdBQVcsR0FBVyxVQUFVLENBQUMsYUFB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QztZQUNULE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7UUFDckIsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOytHQWxJVSxvQkFBb0I7bUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZixJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMYXlvdXRNYW5hZ2VyU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcbiAgY2hlY2tQb3NpdGlvbihlbGVtZW50UmVmOkVsZW1lbnRSZWYsc2VsZWN0b3I6c3RyaW5nLGxlZnQ6bnVtYmVyLHRvcDpudW1iZXIsZGVsdGFYOm51bWJlcixkZWx0YVk6bnVtYmVyLGZvcmNlQ2hlY2s6Ym9vbGVhbiA9IGZhbHNlKXtcclxuICAgIGNvbnN0IHBhcmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFpblZpZXdwb3J0Q29udGFpbmVyXCIpO1xyXG4gICAgLy9jb25zdCBsZWZ0UGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibGVmdC1zaWRlbmF2LWNvbnRlbnRcIik7XHJcbiAgICAvL2NvbnN0IGxlZnRQYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubGVmdC1zaWRlbmF2LWNvbnRlbnRcIik7XHJcbiAgICAvL2NvbnN0IGxlZnRQYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2lkZW5hdlwiKTtcclxuICAgIGNvbnN0IGxlZnRQYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpYi1iaW1wbHVzLXNpZGVuYXYnKT8uc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcignLnNpZGVuYXYnKTtcclxuICAgIGNvbnN0IHRvcFBhbmVsID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpYi1iaW1wbHVzLW5hdmJhcicpPy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yKCcuYmltcGx1cy1uYXZiYXInKTtcclxuICAgIGlmKHBhcmVudCAmJiBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgJiYgbGVmdFBhbmVsICYmIHRvcFBhbmVsICYmIHNlbGVjdG9yKXtcclxuICAgICAgY29uc3Qgdmlld1JlY3Q6RE9NUmVjdCA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgY29uc3QgbGVmdFBhbmVsUmVjdDpET01SZWN0ID1sZWZ0UGFuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGNvbnN0IHRvcFBhbmVsUmVjdDpET01SZWN0ID0gdG9wUGFuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnRSZWN0OkRPTVJlY3QgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ/LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyBcclxuICAgICAgY29uc29sZS5sb2coYGJveDogbGVmdDoke2VsZW1lbnRSZWN0LmxlZnR9LHRvcDoke2VsZW1lbnRSZWN0LnRvcH0scmlnaHQ6JHtlbGVtZW50UmVjdC5yaWdodH0sYm90dG9tOiR7ZWxlbWVudFJlY3QuYm90dG9tfWApO1xyXG4gICAgICAvL2NvbnN0IGVsZW1lbnRSZWN0OkRPTVJlY3QgID0gIGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgY29uc3QgcGFyZW50UmVjdDpET01SZWN0ID0gbmV3IERPTVJlY3QoXHJcbiAgICAgICAgIHZpZXdSZWN0LmxlZnQgKyBsZWZ0UGFuZWxSZWN0LnJpZ2h0ICsgdG9wUGFuZWxSZWN0LmxlZnQsXHJcbiAgICAgICAgIHZpZXdSZWN0LnRvcCwgICAgICAgICBcclxuICAgICAgICAgdmlld1JlY3Qud2lkdGggLSBsZWZ0UGFuZWxSZWN0LiB3aWR0aCxcclxuICAgICAgICAgdmlld1JlY3QuaGVpZ2h0KSA7XHJcbiAgICAgIC8vY29uc3QgcGFyZW50UmVjdDpET01SZWN0ID0gbmV3IERPTVJlY3QoICB2aWV3UmVjdC5sZWZ0LHZpZXdSZWN0LnRvcCx2aWV3UmVjdC53aWR0aCx2aWV3UmVjdC5oZWlnaHQpO1xyXG4gICAgICBcclxuICAgICAgLy9jb25zb2xlLmxvZyh2aWV3UmVjdCxlbGVtZW50UmVjdCk7XHJcbiAgICAgIGxldCBjaGVja0JvdW5kYXJpZXMgPSB0cnVlO1xyXG4gICAgICBpZih0aGlzLl9pc0luc2lkZVJlY3QoZWxlbWVudFJlY3QsIHBhcmVudFJlY3QpID09PSBmYWxzZSAmJiAhZm9yY2VDaGVjaykge1xyXG4gICAgICAgIGNoZWNrQm91bmRhcmllcyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8vIGNvcHkgb2YgcmVhbCBlbGVtZW50IHJlY3RhbmdsZSB0byBwZXJmb3JtIGNhbGN1bGF0aW9uIG92ZXIgYmVmb3JlIHNldCB0byB0aGUgcmVhbCBlbGVtZW50XHJcbiAgICAgIGNvbnN0IGVsZW1lbnRET01SZWN0ID0gRE9NUmVjdC5mcm9tUmVjdChlbGVtZW50UmVjdCk7XHJcbiAgXHJcbiAgICAgIC8vc2V0IHRoZSBlbGVtZW50IHJlY3RhbmdsZSBieSBkZWx0YXNcclxuICAgICAgdGhpcy5fdHJhbnNsYXRlUmVjdGFuZ2xlKGVsZW1lbnRET01SZWN0LCBkZWx0YVgsIGRlbHRhWSk7XHJcbiAgXHJcbiAgICAgIGlmKGNoZWNrQm91bmRhcmllcykge1xyXG4gICAgICAgIGlmKHRoaXMuX2lzSW5zaWRlUmVjdChlbGVtZW50RE9NUmVjdCwgcGFyZW50UmVjdCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICBjb25zdCAgbmV3RWxlbWVudFBvcyA9IHRoaXMuZ2V0QWxpZ25lZFBvc2l0aW9uKGVsZW1lbnRET01SZWN0LCBwYXJlbnRSZWN0KTtcclxuICAgICAgICAgIGRlbHRhWCA9IG5ld0VsZW1lbnRQb3MueCAtIGVsZW1lbnRSZWN0Lng7XHJcbiAgICAgICAgICBkZWx0YVkgPSBuZXdFbGVtZW50UG9zLnkgLSBlbGVtZW50UmVjdC55O1xyXG4gICAgICAgICAgdGhpcy5fdHJhbnNsYXRlUmVjdGFuZ2xlKGVsZW1lbnRET01SZWN0LCBkZWx0YVgsIGRlbHRhWSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibm90IGluc2lkZSEhXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0luc2lkZUxlZnRUb3BSZWN0KHBhcmVudFJlY3QsIGVsZW1lbnRET01SZWN0KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnRQb3MgPSB0aGlzLl9nZXRBbGlnbmVkTGVmdFRvcFBvc2l0aW9uKGVsZW1lbnRET01SZWN0LCBwYXJlbnRSZWN0KTtcclxuICAgICAgICAgIGRlbHRhWCA9IG5ld0VsZW1lbnRQb3MueCAtIGVsZW1lbnRSZWN0Lng7XHJcbiAgICAgICAgICBkZWx0YVkgPSBuZXdFbGVtZW50UG9zLnkgLSBlbGVtZW50UmVjdC55O1xyXG4gICAgICAgICAgdGhpcy5fdHJhbnNsYXRlUmVjdGFuZ2xlKGVsZW1lbnRET01SZWN0LCBkZWx0YVgsIGRlbHRhWSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge2RlbHRhWCxkZWx0YVl9O1xyXG4gIH1cclxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICogZmluZCBpZiByZWN0YW5nbGUgMSBpcyBpbnNpZGUgcmVjdGFuZ2xlIDJcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgX2lzSW5zaWRlUmVjdChyMTpET01SZWN0LCByMjpET01SZWN0KSB7XHJcbiAgICBpZighcjEgfHwgIXIyKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiAgcjIubGVmdCA8PSByMS5sZWZ0ICAmJiByMi50b3AgPD0gcjEudG9wICYmIHIyLnJpZ2h0ID49IHIxLnJpZ2h0ICYmIHIyLmJvdHRvbSA+PSByMS5ib3R0b207XHJcbiAgfVxyXG5cclxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICogZmluZCBpZiByZWN0YW5nbGVzIGRvIG5vdCBvdmVybGFwIHRoZSBsZWZ0IGFuZCB0b3Agc2lkZXNcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgX2lzSW5zaWRlTGVmdFRvcFJlY3QocjE6RE9NUmVjdCwgcjI6RE9NUmVjdCkge1xyXG4gICAgaWYoIXIxIHx8ICFyMikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCAgcjFJbnNpZGUgPSByMi5sZWZ0IDw9IHIxLmxlZnQgICYmIHIyLnRvcCA8PSByMS50b3A7XHJcbiAgICBjb25zdCAgcjJJbnNpZGUgPSByMS5sZWZ0IDw9IHIyLmxlZnQgICYmIHIxLnRvcCA8PSByMi50b3A7XHJcbiAgICByZXR1cm4gcjFJbnNpZGUgfHwgcjJJbnNpZGU7XHJcbiAgfVxyXG5cclxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICogZ2V0IHBvc2l0aW9uIG9mIHIxIGFsaWduZWQgd2l0aCB0aGUgcjIgc2lkZXNcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgZ2V0QWxpZ25lZFBvc2l0aW9uKHIxOkRPTVJlY3QsIHIyOkRPTVJlY3QpIHtcclxuICAgIGlmKCFyMSB8fCAhcjIpIHtcclxuICAgICAgcmV0dXJuIHt4OjAseTowfTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRvID0geyB4OiByMS54LCB5OiByMS55IH07XHJcbiAgICAvL2FsaWduIGxlZnQgb3IgcmlnaHQgc2lkZXMuIHByZWZlcmFibHkgbGVmdFxyXG4gICAgaWYocjEubGVmdCA8IHIyLmxlZnQpIHtcclxuICAgICAgdG8ueCA9IHIyLng7XHJcbiAgICB9IGVsc2UgaWYocjEucmlnaHQgPiByMi5yaWdodCkge1xyXG4gICAgICB0by54ID0gcjIucmlnaHQgLSByMS53aWR0aDtcclxuICAgIH1cclxuICAgIC8vYWxpZ24gdG9wIG9yIGJvdHRvbS4gcHJlZmVyYWJseSB0b3BcclxuICAgIGlmKHIxLnRvcCA8IHIyLnRvcCkge1xyXG4gICAgICB0by55ID0gcjIueTtcclxuICAgIH0gZWxzZSBpZihyMS5ib3R0b20gPiByMi5ib3R0b20pIHtcclxuICAgICAgdG8ueSA9IHIyLmJvdHRvbSAtIHIxLmhlaWdodDtcclxuICAgIH1cclxuICAgIHJldHVybiB0bztcclxuICB9XHJcbiAgXHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIGdldCBwb3NpdGlvbiBvZiByMSBhbGlnbmVkIHdpdGggdGhlIHIyIGxlZnQsIHRvcCBzaWRlc1xyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuICBfZ2V0QWxpZ25lZExlZnRUb3BQb3NpdGlvbihyMTpET01SZWN0LCByMjpET01SZWN0KSB7XHJcbiAgICBpZighcjEgfHwgIXIyKSB7XHJcbiAgICAgIHJldHVybiAge3g6MCx5OjB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0ICB0byA9IHsgeDogcjEueCwgeTogcjEueSB9O1xyXG4gICAgLy9hbGlnbiBsZWZ0XHJcbiAgICBpZihyMS5sZWZ0IDwgcjIubGVmdCkge1xyXG4gICAgICB0by54ID0gcjIueDtcclxuICAgIH1cclxuICAgIC8vYWxpZ24gdG9wXHJcbiAgICBpZihyMS50b3AgPCByMi50b3ApIHtcclxuICAgICAgdG8ueSA9IHIyLnk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG87XHJcbiAgfVxyXG5cclxuICAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIHRyYW5zbGF0ZSByZWN0YW5nbGUgYnkgeCwgeVxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuICBfdHJhbnNsYXRlUmVjdGFuZ2xlKHJlY3Q6RE9NUmVjdCwgdHJhbnNsYXRlWDpudW1iZXIsIHRyYW5zbGF0ZVk6bnVtYmVyKSB7XHJcbiAgICBpZighcmVjdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICByZWN0LnggKz0gdHJhbnNsYXRlWDtcclxuICAgIHJlY3QueSArPSB0cmFuc2xhdGVZO1xyXG4gICAgcmV0dXJuIHJlY3Q7XHJcbiAgfVxyXG59XHJcbiJdfQ==
333
+ }], ctorParameters: () => [{ type: i1.ResizeObserverService }, { type: i2.LocalStorageService }] });
334
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LW1hbmFnZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1iaW1wbHVzLWNvbXBvbmVudHMvc3JjL2xpYi9zZXJ2aWNlcy9sYXlvdXQtbWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQWlDdkMsTUFBTSxPQUFPLG9CQUFvQjtJQUcvQixZQUFvQixxQkFBMkMsRUFDM0MsbUJBQXdDO1FBRHhDLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0I7UUFDM0Msd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUY1RCxxQkFBZ0IsR0FBeUMsSUFBSSxlQUFlLENBQXNCLEVBQUUsQ0FBQyxDQUFBO1FBSTdGLG9CQUFlLEdBQXVCLEVBQUUsQ0FBQztRQUtqRCxXQUFNLEdBQVUscUJBQXFCLENBQUM7SUFObEMsQ0FBQztJQUdMLElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUlIOztrRkFFOEU7SUFDNUUsY0FBYyxDQUFDLEdBQWMsRUFBRSxFQUFTLEVBQUUsUUFBMkIsRUFBRSxnQkFBd0IsRUFBQyxPQUFjLEdBQUcsRUFBRSxNQUFhLEdBQUcsRUFBQyxRQUFlLENBQUMsRUFBRSxTQUFnQixDQUFDO1FBQ3JLLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDOUIsSUFBRyxNQUFNLEVBQUMsQ0FBQztnQkFDVCxVQUFVLEdBQUcsS0FB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QUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBQyxTQUFTLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsR0FBRyxFQUNiLFdBQVcsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUEsQ0FBQyxFQUMxRCxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7K0dBMVZVLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRm5CLE1BQU07OzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlIH0gZnJvbSAnLi9yZXNpemUtb2JzZXJ2ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IExvY2FsU3RvcmFnZVNlcnZpY2UgfSAgIGZyb20gJy4vbG9jYWwtc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbi8vaW1wb3J0IHsgSXRlbXNMaXN0IH0gZnJvbSAnQG5nLXNlbGVjdC9uZy1zZWxlY3QvbGliL2l0ZW1zLWxpc3QnO1xyXG4vL2ltcG9ydCB7IE5vdEZvdW5kRXJyb3IgfSBmcm9tICdyeGpzJztcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExheW91dE1hbmFnZXJJdGVtIHtcclxuICBlbGVtZW50OkVsZW1lbnRSZWY7XHJcbiAgaWQ6IHN0cmluZztcclxuICBzZWxlY3Rvcj86c3RyaW5nO1xyXG4gIGlzQ29sbGFwc2VkOmJvb2xlYW47XHJcbiAgcmVtZW1iZXJQb3NpdGlvbj86Ym9vbGVhblxyXG4gIGxlZnQ/OiBudW1iZXI7XHJcbiAgdG9wPzpudW1iZXI7XHJcbiAgd2lkdGg/Om51bWJlcjtcclxuICBoZWlnaHQ/Om51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRNYW5hZ2VyQ29uZmlnSXRlbSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBpc0NvbGxhcHNlZDpib29sZWFuOyAgXHJcbiAgbGVmdD86IG51bWJlcjtcclxuICB0b3A/Om51bWJlcjsgIFxyXG4gIHdpZHRoPzpudW1iZXI7XHJcbiAgaGVpZ2h0PzpudW1iZXI7XHJcbn1cclxuXHJcblxyXG5pbnRlcmZhY2UgTGF5b3V0TWFuYWdlckNvbmZpZyB7XHJcbiAgW2tleTpzdHJpbmddOiBMYXlvdXRNYW5hZ2VyQ29uZmlnSXRlbVxyXG59XHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIExheW91dE1hbmFnZXJTZXJ2aWNlIHtcclxuXHJcbiAgcmVnaXN0ZXJlZEl0ZW1zJDogQmVoYXZpb3JTdWJqZWN0PExheW91dE1hbmFnZXJJdGVtW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMYXlvdXRNYW5hZ2VySXRlbVtdPihbXSlcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlc2l6ZU9ic2VydmVyU2VydmljZTpSZXNpemVPYnNlcnZlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlIDpMb2NhbFN0b3JhZ2VTZXJ2aWNlIFxyXG4gICkgeyB9XHJcbiAgcHJpdmF0ZSByZWdpc3RlcmVkSXRlbXM6TGF5b3V0TWFuYWdlckl0ZW1bXSA9IFtdO1xyXG4gIFxyXG4gIGdldCBSZWdpc3RlcmVkSXRlbXMoKTogTGF5b3V0TWFuYWdlckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RlcmVkSXRlbXM7XHJcbiAgfVxyXG4gIENPTkZJRzpzdHJpbmcgPSAnbGF5b3V0TWFuYWdlckNvbmZpZyc7XHJcblxyXG4gIFxyXG4vKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICogcmVnaXN0ZXIgb2JqZWN0LiBvYmplY3QgbXVzdCBoYXZlIHVuaXF1ZSBpZCBvciBlbGVtZW50SWRcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgcmVnaXN0ZXJPYmplY3Qob2JqOkVsZW1lbnRSZWYsIGlkOnN0cmluZywgc2VsZWN0b3I6c3RyaW5nIHwgdW5kZWZpbmVkLCByZW1lbWJlclBvc2l0aW9uOmJvb2xlYW4sbGVmdDpudW1iZXIgPSAxMDAsIHRvcDpudW1iZXIgPSAxMDAsd2lkdGg6bnVtYmVyID0gMCwgaGVpZ2h0Om51bWJlciA9IDApIHtcclxuICAgIGxldCBmb3VuZEluZGV4ID0gLTE7XHJcbiAgICBpZih0aGlzLnJlZ2lzdGVyZWRJdGVtcy5zb21lKChpdGVtLGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmV0dmFsID0gaXRlbS5pZCA9PT0gaWQ7XHJcbiAgICAgICAgaWYocmV0dmFsKXtcclxuICAgICAgICAgIGZvdW5kSW5kZXggPSBpbmRleDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldHZhbDtcclxuICAgICAgfSkpe1xyXG4gICAgICBpZihmb3VuZEluZGV4ID49IDApe1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJlZEl0ZW1zLnNwbGljZShmb3VuZEluZGV4LDEpO1xyXG4gICAgICB9ICAgICAgXHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXdJdGVtOiBMYXlvdXRNYW5hZ2VySXRlbSA9IHsgXHJcbiAgICAgIGVsZW1lbnQ6b2JqLFxyXG4gICAgICBpZDppZCxcclxuICAgICAgc2VsZWN0b3I6c2VsZWN0b3IsXHJcbiAgICAgIHJlbWVtYmVyUG9zaXRpb246ISFyZW1lbWJlclBvc2l0aW9uLFxyXG4gICAgICBsZWZ0OmxlZnQsXHJcbiAgICAgIHRvcDp0b3AsXHJcbiAgICAgIHdpZHRoOndpZHRoLFxyXG4gICAgICBoZWlnaHQ6aGVpZ2h0LFxyXG4gICAgICBpc0NvbGxhcHNlZDogZmFsc2UgICAgXHJcbiAgICAgfTtcclxuXHJcbiAgICB0aGlzLnJlZ2lzdGVyZWRJdGVtcy5wdXNoKG5ld0l0ZW0pO1xyXG4gICAgdGhpcy5yZWdpc3RlcmVkSXRlbXMkLm5leHQodGhpcy5yZWdpc3RlcmVkSXRlbXMpO1xyXG4gICAgdGhpcy5faW5pdE9iamVjdChuZXdJdGVtKTtcclxuICB9XHJcbiAgXHJcbiAgX2luaXRPYmplY3Qob2JqOkxheW91dE1hbmFnZXJJdGVtKXtcclxuICAgIHRoaXMuX2FkanVzdE9iamVjdEJ5Q29uZmlnKG9iaik7XHJcbiAgICB0aGlzLl9hZGp1c3RPYmplY3RCeVdpbmRvd1NpemUob2JqKTtcclxuICAgIFxyXG4gIH1cclxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICogZ2V0IG9iamVjdCBjb25maWd1cmF0aW9uXHJcbiAgKiByZXR1cm4ge2xlZnQsIHRvcCwgd2lkdGgsIGhlaWd0aH1cclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgX2dldE9iamVjdENvbmZpZyhvYmo6TGF5b3V0TWFuYWdlckl0ZW0pOkxheW91dE1hbmFnZXJDb25maWdJdGVtfG51bGwge1xyXG4gICAgaWYoIW9iail7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSh0aGlzLkNPTkZJRyk7XHJcbiAgICBjb25zdCAgY29uZmlnID0gY29uZmlnVmFsdWUgPyBKU09OLnBhcnNlKGNvbmZpZ1ZhbHVlKSA6IHt9O1xyXG4gICAgY29uc3QgIG9iaklkID0gb2JqLmlkIDtcclxuICAgIGxldCBjb25maWdPYmogPSBjb25maWdbb2JqSWRdO1xyXG4gICAgaWYoIWNvbmZpZ09iaikge1xyXG4gICAgICBjb25maWdPYmogPSB7aWQ6b2JqSWQsbGVmdDpvYmoubGVmdCx0b3A6b2JqLnRvcCx3aWR0aDpvYmoud2lkdGgsaGVpZ2h0Om9iai5oZWlnaHR9OyAgICAgICAgXHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29uZmlnT2JqO1xyXG4gIH1cclxuXHJcbiAgX2FkanVzdE9iamVjdEJ5Q29uZmlnKG9iajpMYXlvdXRNYW5hZ2VySXRlbSl7XHJcbiAgICBjb25zdCBjb25maWc6TGF5b3V0TWFuYWdlckNvbmZpZ0l0ZW18bnVsbCA9IHRoaXMuX2dldE9iamVjdENvbmZpZyhvYmopO1xyXG4gICAgaWYoIWNvbmZpZyl7XHJcbiAgICAgIHJldHVybjsgICAgICBcclxuICAgIH1cclxuICAgIGNvbnN0ICBlbGVtZW50ID0gdGhpcy5fZ2V0RG9tRWxlbWVudChvYmosJycpO1xyXG4gICAgaWYoIWVsZW1lbnQpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAoY29uZmlnLmxlZnQpICsgJ3B4JztcclxuICAgIGVsZW1lbnQuc3R5bGUudG9wID0gKGNvbmZpZy50b3ApICsgJ3B4JztcclxuICAgIGlmKGNvbmZpZy53aWR0aCAmJiBjb25maWcud2lkdGggPiAwKXtcclxuICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IGNvbmZpZy53aWR0aCArICdweCc7XHJcbiAgICB9XHJcbiAgICBpZihjb25maWcuaGVpZ2h0ICYmIGNvbmZpZy5oZWlnaHQgPiAwKXtcclxuICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBjb25maWcuaGVpZ2h0ICsgJ3B4JztcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5jaGVja1Bvc2l0aW9uKG9iai5pZCxcIlwiLHVuZGVmaW5lZCwwLDAsdHJ1ZSk7ICAgIFxyXG4gIH1cclxuXHJcbiAgX2FkanVzdE9iamVjdEJ5V2luZG93U2l6ZShvYmo6TGF5b3V0TWFuYWdlckl0ZW0pe1xyXG4gICAgdGhpcy5jaGVja1Bvc2l0aW9uKG9iai5pZCxcIlwiLHVuZGVmaW5lZCwwLDAsdHJ1ZSk7ICBcclxuICB9XHJcbiAgXHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIHJldHVybnMgb2JqZWN0ICByZWdpc3RlcmVkIGluIHRoZSBsYXlvdXQgbWFuYWdlciBcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgZ2V0SXRlbShpZDogc3RyaW5nICk6TGF5b3V0TWFuYWdlckl0ZW18bnVsbCB7ICAgXHJcbiAgICBsZXQgZm91bmRJdGVtOkxheW91dE1hbmFnZXJJdGVtfG51bGwgPSBudWxsO1xyXG4gICAgdGhpcy5yZWdpc3RlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+e1xyXG4gICAgICBpZihpdGVtLmlkID09PSBpZCl7XHJcbiAgICAgICAgZm91bmRJdGVtID0gaXRlbTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZm91bmRJdGVtO1xyXG4gIH1cclxuXHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIHNldCBvYmplY3QgY29uZmlndXJhdGlvblxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuICBfc2V0T2JqZWN0Q29uZmlnKG9iajpMYXlvdXRNYW5hZ2VySXRlbSwgbGVmdDpudW1iZXIsdG9wOm51bWJlcix3aWR0aDpudW1iZXIsaGVpZ2h0Om51bWJlcikge1xyXG4gICAgY29uc3Qgb2JqSWQgPSBvYmo/LmlkIDtcclxuICAgIGlmICghb2JqSWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGNvbmZpZyA9IHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5nZXRPYmplY3QodGhpcy5DT05GSUcpIGFzIExheW91dE1hbmFnZXJDb25maWc7XHJcbiAgICAvL2xldCBjb25maWcgPSBjb25maWdWYWx1ZSAmJiBKU09OLnBhcnNlKGNvbmZpZ1ZhbHVlKSBhcyBMYXlvdXRNYW5hZ2VyQ29uZmlnO1xyXG4gICAgaWYgKCFjb25maWcpIHtcclxuICAgICAgY29uZmlnID0ge307XHJcbiAgICB9XHJcbiAgICBpZihvYmo/LmlzQ29sbGFwc2VkKXsgIC8vIGRvIG5vdCBvdmVydGFrZSBjb2xsYXBzZWQgc2l6ZVxyXG4gICAgICBpZiAoIWNvbmZpZ1tvYmpJZF0pIHsgICAgICAgIFxyXG4gICAgICAgIGNvbmZpZ1tvYmpJZF0gPSBvYmo7XHJcbiAgICAgIH1cclxuICAgICAgY29uZmlnW29iaklkXS5sZWZ0ID0gbGVmdDtcclxuICAgICAgY29uZmlnW29iaklkXS50b3AgID0gdG9wO1xyXG4gICAgICAvL2NvbmZpZ1tvYmpJZF0ud2lkdGggPSB3aWR0aDtcclxuICAgICAgLy9jb25maWdbb2JqSWRdLmhlaWdodCA9IGhlaWdodCA7XHJcbiAgICAgIHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5zZXRPYmplY3QodGhpcy5DT05GSUcsIGNvbmZpZyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdJdGVtIDpMYXlvdXRNYW5hZ2VyQ29uZmlnSXRlbSA9IHtcclxuICAgICAgaWQ6IG9iaklkLFxyXG4gICAgICBpc0NvbGxhcHNlZDogZmFsc2UsXHJcbiAgICAgIGxlZnQ6IGxlZnQsXHJcbiAgICAgIHRvcDogdG9wLFxyXG4gICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgIGhlaWdodDogaGVpZ2h0XHJcbiAgICB9O1xyXG4gICAgY29uZmlnW29iaklkXSA9IG5ld0l0ZW07XHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0T2JqZWN0KHRoaXMuQ09ORklHLGNvbmZpZyk7XHJcbiAgfVxyXG4gIF9nZXREb21FbGVtZW50KGl0ZW06TGF5b3V0TWFuYWdlckl0ZW0sc2VsZWN0b3I6c3RyaW5nIHwgdW5kZWZpbmVkICk6SFRNTEVsZW1lbnR8bnVsbCB7XHJcbiAgICBjb25zdCBlbGVtZW50OkhUTUxFbGVtZW50ID0gaXRlbS5lbGVtZW50Py5uYXRpdmVFbGVtZW50Py5zaGFkb3dSb290IHx8IGl0ZW0uZWxlbWVudD8ubmF0aXZlRWxlbWVudDsgICAgXHJcbiAgICBpZighZWxlbWVudCl7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ19nZXREb21FbGVtZW50OiBtaXNzaW5nIGVsZW1lbnQnKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBteVNlbGVjdG9yID1zZWxlY3RvciAmJiBzZWxlY3Rvcj8ubGVuZ3RoID4gMCA/c2VsZWN0b3I6aXRlbS5zZWxlY3RvcjsgICBcclxuICAgIHJldHVybiBteVNlbGVjdG9yP2VsZW1lbnQucXVlcnlTZWxlY3RvcihteVNlbGVjdG9yKTplbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgX2dldEVsZW1lbnRSZWN0KGl0ZW06TGF5b3V0TWFuYWdlckl0ZW0sc2VsZWN0b3I6c3RyaW5nIHwgdW5kZWZpbmVkICxwYXJlbnRSZWN0YW5nbGU6RE9NUmVjdCB8dW5kZWZpbmVkICk6RE9NUmVjdCB8IG51bGx7XHJcbiAgICBjb25zdCBzZWxlY3RlZE9iaiA6IEhUTUxFbGVtZW50fG51bGwgPSB0aGlzLl9nZXREb21FbGVtZW50KGl0ZW0sc2VsZWN0b3IpO1xyXG4gICAgaWYoIXNlbGVjdGVkT2JqKXtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGFyZW50UmVjdDpET01SZWN0ID0gIHBhcmVudFJlY3RhbmdsZSB8fCAgdGhpcy5yZXNpemVPYnNlcnZlclNlcnZpY2UuZ2V0UGFyZW50QXBwUmVjdCgpO1xyXG4gICAgaWYoICFwYXJlbnRSZWN0IHx8ICBwYXJlbnRSZWN0Py53aWR0aDw9MSB8fCBwYXJlbnRSZWN0Py5oZWlnaHQ8PTEgKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ19nZXRFbGVtZW50UmVjdDogbWlzc2luZyBwYXJlbnQgcmVjdCcpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0ICBlbGVtZW50UmVjdDpET01SZWN0fG51bGwgPSBzZWxlY3RlZE9iai5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHJldHVybiBlbGVtZW50UmVjdDtcclxuICB9XHJcblxyXG4gIC8vIGNoZWNrcyB3aGV0aGVyIGVsZW1lbnQgb3IgZWxlbWVudCB3aXRoIGFkZGl0aW9uYWwgc2VsZWN0aW9uIG9mIHN1YmVsZW1lbnQgaXMgcGxhY2VkIHdpdGhpbiB0aGUgZ2l2ZSByZWN0YW5nbGVcclxuICAvLyBpZiBub3QgdGhlbiBjYWxjdWxhdGVzIHRoZSBvZmZzZXQgdG8gYmUgbW92ZWQgdG8gZml0IGluXHJcbiAgY2hlY2tQb3NpdGlvbihpZDpzdHJpbmcsc2VsZWN0b3I6c3RyaW5nLHBhcmVudFJlY3RhbmdsZTpET01SZWN0fHVuZGVmaW5lZCAsZGVsdGFYOm51bWJlcixkZWx0YVk6bnVtYmVyLGZvcmNlQ2hlY2s6Ym9vbGVhbiA9IGZhbHNlKXtcclxuICAgIGlmKCFpZCl7XHJcbiAgICAgIHJldHVybiB7ZGVsdGFYOjAsZGVsdGFZOjB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgZTEgPSB0aGlzLmdldEl0ZW0oaWQpO1xyXG4gICAgaWYoIWUxKXtcclxuICAgICAgcmV0dXJuIHtkZWx0YVg6MCxkZWx0YVk6MH07XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnRSZWN0OkRPTVJlY3QgPSAgcGFyZW50UmVjdGFuZ2xlIHx8ICB0aGlzLnJlc2l6ZU9ic2VydmVyU2VydmljZS5nZXRQYXJlbnRBcHBSZWN0KCk7XHJcbiAgICBjb25zdCBlbGVtZW50UmVjdDpET01SZWN0IHwgbnVsbCA9IHRoaXMuX2dldEVsZW1lbnRSZWN0KGUxLHNlbGVjdG9yLHBhcmVudFJlY3QpO1xyXG4gICAgaWYoIWVsZW1lbnRSZWN0KXtcclxuICAgICAgY29uc29sZS5lcnJvcignY2hlY2tQb3NpdGlvbjogbWlzc2luZyBlbGVtZW50Jyk7XHJcbiAgICAgIHJldHVybiB7ZGVsdGFYOjAsZGVsdGFZOjB9O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZighZWxlbWVudFJlY3Q/LndpZHRoIHx8ICFlbGVtZW50UmVjdD8uaGVpZ2h0KXtcclxuICAgICAgY29uc29sZS5lcnJvcignY2hlY2tQb3NpdGlvbjptaXNzaW5nIGVsZW1lbnQgcmVjdCcpO1xyXG4gICAgICByZXR1cm4ge2RlbHRhWDowLGRlbHRhWTowfTtcclxuICAgIH0gXHJcbiAgICBsZXQgY2hlY2tCb3VuZGFyaWVzID0gdHJ1ZTtcclxuICAgIGlmKHRoaXMuX2lzSW5zaWRlUmVjdChlbGVtZW50UmVjdCwgcGFyZW50UmVjdCkgPT09IGZhbHNlICYmICFmb3JjZUNoZWNrKSB7XHJcbiAgICAgIGNoZWNrQm91bmRhcmllcyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gXHJcbiAgICAvLyBjb3B5IG9mIHJlYWwgZWxlbWVudCByZWN0YW5nbGUgdG8gcGVyZm9ybSBjYWxjdWxhdGlvbiBvdmVyIGJlZm9yZSBzZXQgdG8gdGhlIHJlYWwgZWxlbWVudFxyXG4gICAgY29uc3QgZWxlbWVudERPTVJlY3QgPSBET01SZWN0LmZyb21SZWN0KGVsZW1lbnRSZWN0KTtcclxuXHJcbiAgICAvL3NldCB0aGUgZWxlbWVudCByZWN0YW5nbGUgYnkgZGVsdGFzXHJcbiAgICB0aGlzLl90cmFuc2xhdGVSZWN0YW5nbGUoZWxlbWVudERPTVJlY3QsIGRlbHRhWCwgZGVsdGFZKTtcclxuXHJcbiAgICBpZihjaGVja0JvdW5kYXJpZXMpIHtcclxuICAgICAgaWYodGhpcy5faXNJbnNpZGVSZWN0KGVsZW1lbnRET01SZWN0LCBwYXJlbnRSZWN0KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCAgbmV3RWxlbWVudFBvcyA9IHRoaXMuZ2V0QWxpZ25lZFBvc2l0aW9uKGVsZW1lbnRET01SZWN0LCBwYXJlbnRSZWN0KTtcclxuICAgICAgICBkZWx0YVggPSBuZXdFbGVtZW50UG9zLnggLSBlbGVtZW50UmVjdC54O1xyXG4gICAgICAgIGRlbHRhWSA9IG5ld0VsZW1lbnRQb3MueSAtIGVsZW1lbnRSZWN0Lnk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlUmVjdGFuZ2xlKGVsZW1lbnRET01SZWN0LCBkZWx0YVgsIGRlbHRhWSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9pc0luc2lkZUxlZnRUb3BSZWN0KHBhcmVudFJlY3QsIGVsZW1lbnRET01SZWN0KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBuZXdFbGVtZW50UG9zID0gdGhpcy5fZ2V0QWxpZ25lZExlZnRUb3BQb3NpdGlvbihlbGVtZW50RE9NUmVjdCwgcGFyZW50UmVjdCk7XHJcbiAgICAgICAgZGVsdGFYID0gbmV3RWxlbWVudFBvcy54IC0gZWxlbWVudFJlY3QueDtcclxuICAgICAgICBkZWx0YVkgPSBuZXdFbGVtZW50UG9zLnkgLSBlbGVtZW50UmVjdC55O1xyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZVJlY3RhbmdsZShlbGVtZW50RE9NUmVjdCwgZGVsdGFYLCBkZWx0YVkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSB0aGlzLl9nZXREb21FbGVtZW50KGUxLCcnKTsvL2UxLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIGlmKCFzZWxlY3RlZEVsZW1lbnQpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc2VsZWN0ZWRFbGVtZW50KTtcclxuICAgIGNvbnN0IHRvcCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUudG9wLCAxMCk7XHJcbiAgICBjb25zdCBsZWZ0ID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5sZWZ0LCAxMCk7XHJcbiAgICBzZWxlY3RlZEVsZW1lbnQuc3R5bGUudG9wID0gKHRvcCArIGRlbHRhWSkgKyAncHgnO1xyXG4gICAgc2VsZWN0ZWRFbGVtZW50LnN0eWxlLmxlZnQgPSAobGVmdCArIGRlbHRhWCkgKyAncHgnO1xyXG4gICAgcmV0dXJuIHtkZWx0YVgsZGVsdGFZfTtcclxuICB9XHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIGZpbmQgaWYgcmVjdGFuZ2xlIDEgaXMgaW5zaWRlIHJlY3RhbmdsZSAyXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIF9pc0luc2lkZVJlY3QocjE6RE9NUmVjdCwgcjI6RE9NUmVjdCkge1xyXG4gICAgaWYoIXIxIHx8ICFyMikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gIHIyLmxlZnQgPD0gcjEubGVmdCAgJiYgcjIudG9wIDw9IHIxLnRvcCAmJiByMi5yaWdodCA+PSByMS5yaWdodCAmJiByMi5ib3R0b20gPj0gcjEuYm90dG9tO1xyXG4gIH1cclxuXHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIGZpbmQgaWYgcmVjdGFuZ2xlcyBkbyBub3Qgb3ZlcmxhcCB0aGUgbGVmdCBhbmQgdG9wIHNpZGVzXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIF9pc0luc2lkZUxlZnRUb3BSZWN0KHIxOkRPTVJlY3QsIHIyOkRPTVJlY3QpIHtcclxuICAgIGlmKCFyMSB8fCAhcjIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgIHIxSW5zaWRlID0gcjIubGVmdCA8PSByMS5sZWZ0ICAmJiByMi50b3AgPD0gcjEudG9wO1xyXG4gICAgY29uc3QgIHIySW5zaWRlID0gcjEubGVmdCA8PSByMi5sZWZ0ICAmJiByMS50b3AgPD0gcjIudG9wO1xyXG4gICAgcmV0dXJuIHIxSW5zaWRlIHx8IHIySW5zaWRlO1xyXG4gIH1cclxuXHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIGdldCBwb3NpdGlvbiBvZiByMSBhbGlnbmVkIHdpdGggdGhlIHIyIHNpZGVzXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIGdldEFsaWduZWRQb3NpdGlvbihyMTpET01SZWN0LCByMjpET01SZWN0KSB7XHJcbiAgICBpZighcjEgfHwgIXIyKSB7XHJcbiAgICAgIHJldHVybiB7eDowLHk6MH07XHJcbiAgICB9XHJcbiAgICBjb25zdCB0byA9IHsgeDogcjEueCwgeTogcjEueSB9O1xyXG4gICAgLy9hbGlnbiBsZWZ0IG9yIHJpZ2h0IHNpZGVzLiBwcmVmZXJhYmx5IGxlZnRcclxuICAgIGlmKHIxLmxlZnQgPCByMi5sZWZ0KSB7XHJcbiAgICAgIHRvLnggPSByMi54O1xyXG4gICAgfSBlbHNlIGlmKHIxLnJpZ2h0ID4gcjIucmlnaHQpIHtcclxuICAgICAgdG8ueCA9IHIyLnJpZ2h0IC0gcjEud2lkdGg7XHJcbiAgICB9XHJcbiAgICAvL2FsaWduIHRvcCBvciBib3R0b20uIHByZWZlcmFibHkgdG9wXHJcbiAgICBpZihyMS50b3AgPCByMi50b3ApIHtcclxuICAgICAgdG8ueSA9IHIyLnk7XHJcbiAgICB9IGVsc2UgaWYocjEuYm90dG9tID4gcjIuYm90dG9tKSB7XHJcbiAgICAgIHRvLnkgPSByMi5ib3R0b20gLSByMS5oZWlnaHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG87XHJcbiAgfVxyXG4gIFxyXG4gIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgKiBnZXQgcG9zaXRpb24gb2YgcjEgYWxpZ25lZCB3aXRoIHRoZSByMiBsZWZ0LCB0b3Agc2lkZXNcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgX2dldEFsaWduZWRMZWZ0VG9wUG9zaXRpb24ocjE6RE9NUmVjdCwgcjI6RE9NUmVjdCkge1xyXG4gICAgaWYoIXIxIHx8ICFyMikge1xyXG4gICAgICByZXR1cm4gIHt4OjAseTowfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCAgdG8gPSB7IHg6IHIxLngsIHk6IHIxLnkgfTtcclxuICAgIC8vYWxpZ24gbGVmdFxyXG4gICAgaWYocjEubGVmdCA8IHIyLmxlZnQpIHtcclxuICAgICAgdG8ueCA9IHIyLng7XHJcbiAgICB9XHJcbiAgICAvL2FsaWduIHRvcFxyXG4gICAgaWYocjEudG9wIDwgcjIudG9wKSB7XHJcbiAgICAgIHRvLnkgPSByMi55O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvO1xyXG4gIH1cclxuXHJcbiAgIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgKiB0cmFuc2xhdGUgcmVjdGFuZ2xlIGJ5IHgsIHlcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgX3RyYW5zbGF0ZVJlY3RhbmdsZShyZWN0OkRPTVJlY3QsIHRyYW5zbGF0ZVg6bnVtYmVyLCB0cmFuc2xhdGVZOm51bWJlcikge1xyXG4gICAgaWYoIXJlY3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgcmVjdC54ICs9IHRyYW5zbGF0ZVg7XHJcbiAgICByZWN0LnkgKz0gdHJhbnNsYXRlWTtcclxuICAgIHJldHVybiByZWN0O1xyXG4gIH1cclxuICBcclxuICB1cGRhdGVDb2xsYXBzZWQodmFsdWU6Ym9vbGVhbiwgaWQ6c3RyaW5nID0gJycpOnZvaWR7ICAgIFxyXG4gICAgY29uc3QgIGZvdW5kSXRlbSA9IHRoaXMuZ2V0SXRlbShpZCk7XHJcbiAgICBpZighZm91bmRJdGVtKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZm91bmRJdGVtLmlzQ29sbGFwc2VkID0gdmFsdWU7XHJcbiAgICB0aGlzLnJlZ2lzdGVyZWRJdGVtcyQubmV4dCh0aGlzLnJlZ2lzdGVyZWRJdGVtcyk7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT57ICAgICAgXHJcbiAgICAgIHRoaXMuY2hlY2tQb3NpdGlvbihmb3VuZEl0ZW0uaWQsXCJcIix1bmRlZmluZWQsMCwwLHRydWUpOyAgICAgIFxyXG4gICAgfSk7XHJcbiAgICBsZXQgczE6c3RyaW5nID0nJztcclxuICAgIHRoaXMucmVnaXN0ZXJlZEl0ZW1zLmZvckVhY2goKGl0ZW0pPT57XHJcbiAgICAgIHMxID0gczEgKyBgJHtpdGVtLmlkfTo8JHtpdGVtLmlzQ29sbGFwc2VkPzE6MH0+IGA7XHJcbiAgICB9KTtcclxuICB9ICBcclxuXHJcblxyXG4gIGhhbmRsZURyYWdFbmQoaWQ6c3RyaW5nKXsvL30sbGVmdDpudW1iZXIsdG9wOm51bWJlcil7XHJcbiAgICB0aGlzLmZpbmFsaXplT2JqZWN0Q2hhbmdlcyhpZCk7XHJcbiAgfVxyXG5cclxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICogZmluYWxpemUgb2JqZWN0IGNoYW5nZXMgKHBvc2l0aW9uKS4gb2JqZWN0IG11c3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgbGF5b3V0IG1hbmFnZXJcclxuICAqIG9iamVjdDogb2JqZWN0IHRvIGZpbmFsaXplICBcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgZmluYWxpemVPYmplY3RDaGFuZ2VzKGlkOnN0cmluZyk6dm9pZCB7XHJcbiAgICBjb25zdCBpdGVtOkxheW91dE1hbmFnZXJJdGVtfG51bGwgID0gdGhpcy5nZXRJdGVtKGlkKTtcclxuICAgIGlmKCFpdGVtKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2dldERvbUVsZW1lbnQoaXRlbSwnJyk7XHJcbiAgICBpZighZWxlbWVudCl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTsgIFxyXG4gICAgY29uc3QgdG9wID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS50b3AsIDEwKTtcclxuICAgIGNvbnN0IGxlZnQgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmxlZnQsIDEwKTtcclxuICAgIFxyXG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLl9nZXRFbGVtZW50UmVjdChpdGVtLHVuZGVmaW5lZCx1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5fc2V0T2JqZWN0Q29uZmlnKGl0ZW0sbGVmdCx0b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFJlY3QgJiYgZWxlbWVudFJlY3Qud2lkdGggPiAwID8gZWxlbWVudFJlY3Qud2lkdGg6MCAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFJlY3QgJiYgZWxlbWVudFJlY3QuaGVpZ2h0ID4gMCA/IGVsZW1lbnRSZWN0LmhlaWdodDowKTtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
@@ -0,0 +1,70 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export class LocalStorageService {
5
+ constructor() {
6
+ this.storageSubject = new BehaviorSubject(null);
7
+ }
8
+ // Set a string value in localStorage
9
+ setItem(key, value) {
10
+ try {
11
+ localStorage.setItem(key, value);
12
+ this.storageSubject.next({ key, value });
13
+ }
14
+ catch (e) {
15
+ console.error('Error saving to localStorage', e);
16
+ }
17
+ }
18
+ // Get a string value from localStorage
19
+ getItem(key) {
20
+ try {
21
+ return localStorage.getItem(key);
22
+ }
23
+ catch (e) {
24
+ console.error('Error reading from localStorage', e);
25
+ return null;
26
+ }
27
+ }
28
+ // Remove an item from localStorage
29
+ removeItem(key) {
30
+ try {
31
+ localStorage.removeItem(key);
32
+ this.storageSubject.next({ key, value: null });
33
+ }
34
+ catch (e) {
35
+ console.error('Error removing from localStorage', e);
36
+ }
37
+ }
38
+ // Clear all items in localStorage
39
+ clear() {
40
+ try {
41
+ localStorage.clear();
42
+ this.storageSubject.next(null);
43
+ }
44
+ catch (e) {
45
+ console.error('Error clearing localStorage', e);
46
+ }
47
+ }
48
+ // Set an object in localStorage
49
+ setObject(key, value) {
50
+ this.setItem(key, JSON.stringify(value));
51
+ }
52
+ // Get an object from localStorage
53
+ getObject(key) {
54
+ const value = this.getItem(key);
55
+ return value ? JSON.parse(value) : null;
56
+ }
57
+ // Watch for changes in localStorage
58
+ watchStorage() {
59
+ return this.storageSubject.asObservable();
60
+ }
61
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: LocalStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
62
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: LocalStorageService, providedIn: 'root' }); }
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: LocalStorageService, decorators: [{
65
+ type: Injectable,
66
+ args: [{
67
+ providedIn: 'root'
68
+ }]
69
+ }], ctorParameters: () => [] });
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtc3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7O0FBS25ELE1BQU0sT0FBTyxtQkFBbUI7SUFJOUI7UUFGUSxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUF5QyxJQUFJLENBQUMsQ0FBQztJQUUzRSxDQUFDO0lBRWpCLHFDQUFxQztJQUNyQyxPQUFPLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDaEMsSUFBSSxDQUFDO1lBQ0gsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFRCx1Q0FBdUM7SUFDdkMsT0FBTyxDQUFDLEdBQVc7UUFDakIsSUFBSSxDQUFDO1lBQ0gsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLFVBQVUsQ0FBQyxHQUFXO1FBQ3BCLElBQUksQ0FBQztZQUNILFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLEtBQUs7UUFDSCxJQUFJLENBQUM7WUFDSCxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLFNBQVMsQ0FBQyxHQUFXLEVBQUUsS0FBYztRQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxTQUFTLENBQUMsR0FBVztRQUNuQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDMUMsQ0FBQztJQUVELG9DQUFvQztJQUNwQyxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVDLENBQUM7K0dBNURVLG1CQUFtQjttSEFBbkIsbUJBQW1CLGNBRmxCLE1BQU07OzRGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTG9jYWxTdG9yYWdlU2VydmljZSB7XHJcblxyXG4gIHByaXZhdGUgc3RvcmFnZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duIH0gfCBudWxsPihudWxsKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgLy8gU2V0IGEgc3RyaW5nIHZhbHVlIGluIGxvY2FsU3RvcmFnZVxyXG4gIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTdWJqZWN0Lm5leHQoeyBrZXksIHZhbHVlIH0pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzYXZpbmcgdG8gbG9jYWxTdG9yYWdlJywgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgYSBzdHJpbmcgdmFsdWUgZnJvbSBsb2NhbFN0b3JhZ2VcclxuICBnZXRJdGVtKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVhZGluZyBmcm9tIGxvY2FsU3RvcmFnZScsIGUpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFJlbW92ZSBhbiBpdGVtIGZyb20gbG9jYWxTdG9yYWdlXHJcbiAgcmVtb3ZlSXRlbShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgdGhpcy5zdG9yYWdlU3ViamVjdC5uZXh0KHsga2V5LCB2YWx1ZTogbnVsbCB9KTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVtb3ZpbmcgZnJvbSBsb2NhbFN0b3JhZ2UnLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENsZWFyIGFsbCBpdGVtcyBpbiBsb2NhbFN0b3JhZ2VcclxuICBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5jbGVhcigpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTdWJqZWN0Lm5leHQobnVsbCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNsZWFyaW5nIGxvY2FsU3RvcmFnZScsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gU2V0IGFuIG9iamVjdCBpbiBsb2NhbFN0b3JhZ2VcclxuICBzZXRPYmplY3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0IGFuIG9iamVjdCBmcm9tIGxvY2FsU3RvcmFnZVxyXG4gIGdldE9iamVjdChrZXk6IHN0cmluZyk6IHVua25vd24ge1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldEl0ZW0oa2V5KTtcclxuICAgIHJldHVybiB2YWx1ZSA/IEpTT04ucGFyc2UodmFsdWUpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIFdhdGNoIGZvciBjaGFuZ2VzIGluIGxvY2FsU3RvcmFnZVxyXG4gIHdhdGNoU3RvcmFnZSgpOiBPYnNlcnZhYmxlPHsga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duIH0gfCBudWxsPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,34 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export class ResizeObserverService {
5
+ constructor() {
6
+ this.rectSize$ = new BehaviorSubject(undefined);
7
+ this.internalRectSize = new DOMRect(1, 1, 1, 1);
8
+ // Observable that components can subscribe to
9
+ this.parentAppRect$ = this.rectSize$.asObservable();
10
+ }
11
+ setSize(newValue) {
12
+ this.rectSize$.next(newValue);
13
+ this.internalRectSize = newValue;
14
+ }
15
+ getParentAppRect() {
16
+ if (this.internalRectSize.width <= 1 || this.internalRectSize?.height <= 1) { // not set up with real data yet
17
+ const parentView = document.querySelector('.mainView');
18
+ if (!parentView) {
19
+ return this.internalRectSize;
20
+ }
21
+ return parentView.getBoundingClientRect();
22
+ }
23
+ return this.internalRectSize;
24
+ }
25
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: ResizeObserverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
26
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: ResizeObserverService, providedIn: 'root' }); }
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: ResizeObserverService, decorators: [{
29
+ type: Injectable,
30
+ args: [{
31
+ providedIn: 'root'
32
+ }]
33
+ }], ctorParameters: () => [] });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLW9ic2VydmVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYmltcGx1cy1jb21wb25lbnRzL3NyYy9saWIvc2VydmljZXMvcmVzaXplLW9ic2VydmVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDOztBQUtuRCxNQUFNLE9BQU8scUJBQXFCO0lBT2hDO1FBTFEsY0FBUyxHQUF5QyxJQUFJLGVBQWUsQ0FBb0IsU0FBUyxDQUFDLENBQUM7UUFDcEcscUJBQWdCLEdBQVksSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsOENBQThDO1FBQ3ZDLG1CQUFjLEdBQW9DLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFdkUsQ0FBQztJQUVWLE9BQU8sQ0FBQyxRQUFpQjtRQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxJQUFFLENBQUMsRUFBRyxDQUFDLENBQUMsZ0NBQWdDO1lBQ3pHLE1BQU0sVUFBVSxHQUFvQixRQUFRLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3hFLElBQUcsQ0FBQyxVQUFVLEVBQUMsQ0FBQztnQkFDZCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUMvQixDQUFDO1lBQ0QsT0FBTyxVQUFVLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQzsrR0F2QlUscUJBQXFCO21IQUFyQixxQkFBcUIsY0FGcEIsTUFBTTs7NEZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlclNlcnZpY2Uge1xyXG5cclxuICBwcml2YXRlIHJlY3RTaXplJDogQmVoYXZpb3JTdWJqZWN0PERPTVJlY3QgfHVuZGVmaW5lZCA+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxET01SZWN0fHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcclxuICBwcml2YXRlIGludGVybmFsUmVjdFNpemUgOkRPTVJlY3QgPSBuZXcgRE9NUmVjdCgxLDEsMSwxKTtcclxuICAvLyBPYnNlcnZhYmxlIHRoYXQgY29tcG9uZW50cyBjYW4gc3Vic2NyaWJlIHRvXHJcbiAgcHVibGljIHBhcmVudEFwcFJlY3QkOiBPYnNlcnZhYmxlPERPTVJlY3QgfCB1bmRlZmluZWQ+ID0gdGhpcy5yZWN0U2l6ZSQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIHB1YmxpYyBzZXRTaXplKG5ld1ZhbHVlOiBET01SZWN0KTogdm9pZCB7XHJcbiAgICB0aGlzLnJlY3RTaXplJC5uZXh0KG5ld1ZhbHVlKTsgIFxyXG4gICAgdGhpcy5pbnRlcm5hbFJlY3RTaXplID0gbmV3VmFsdWU7ICAgIFxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFBhcmVudEFwcFJlY3QgKCk6RE9NUmVjdHtcclxuICAgIGlmKCB0aGlzLmludGVybmFsUmVjdFNpemUud2lkdGg8PTEgfHwgdGhpcy5pbnRlcm5hbFJlY3RTaXplPy5oZWlnaHQ8PTEgKSB7IC8vIG5vdCBzZXQgdXAgd2l0aCByZWFsIGRhdGEgeWV0XHJcbiAgICAgIGNvbnN0IHBhcmVudFZpZXc6SFRNTEVsZW1lbnR8bnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tYWluVmlldycpO1xyXG4gICAgICBpZighcGFyZW50Vmlldyl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxSZWN0U2l6ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcGFyZW50Vmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmludGVybmFsUmVjdFNpemU7XHJcbiAgfSAgXHJcbn1cclxuIl19
@@ -41,5 +41,6 @@ export * from './lib/components/bimplus-scrollable-container/bimplus-scrollable-
41
41
  export * from './lib/components/bimplus-touch-menu/bimplus-touch-menu.component';
42
42
  export * from './lib/components/bimplus-project-menu/bimplus-project-menu.component';
43
43
  export * from './lib/services/language-strings.service';
44
+ export * from './lib/services/resize-observer.service';
44
45
  export * from './lib/types/types';
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1iaW1wbHVzLWNvbXBvbmVudHMvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyx1REFBdUQsQ0FBQztBQUN0RSxjQUFjLDBEQUEwRCxDQUFDO0FBQ3pFLGNBQWMsb0ZBQW9GLENBQUM7QUFDbkcsY0FBYyxvRkFBb0YsQ0FBQztBQUNuRyxjQUFjLG9HQUFvRyxDQUFDO0FBQ25ILGNBQWMsb0dBQW9HLENBQUM7QUFDbkgsY0FBYyw0REFBNEQsQ0FBQztBQUMzRSxjQUFjLHNFQUFzRSxDQUFDO0FBQ3JGLGNBQWMsMERBQTBELENBQUM7QUFDekUsY0FBYyxnR0FBZ0csQ0FBQztBQUMvRyxjQUFjLDBHQUEwRyxDQUFDO0FBQ3pILGNBQWMsMEdBQTBHLENBQUM7QUFDekgsY0FBYyx3RUFBd0UsQ0FBQztBQUN2RixjQUFjLDhFQUE4RSxDQUFDO0FBQzdGLGNBQWMsZ0VBQWdFLENBQUM7QUFDL0UsY0FBYywwREFBMEQsQ0FBQztBQUN6RSxjQUFjLGlEQUFpRCxDQUFDO0FBQ2hFLGNBQWMsMERBQTBELENBQUM7QUFDekUsY0FBYyw0REFBNEQsQ0FBQztBQUMzRSxjQUFjLDBGQUEwRixDQUFDO0FBQ3pHLGNBQWMsc0VBQXNFLENBQUM7QUFDckYsY0FBYyw4REFBOEQsQ0FBQztBQUM3RSxjQUFjLDhEQUE4RCxDQUFDO0FBQzdFLGNBQWMsZ0VBQWdFLENBQUM7QUFDL0UsY0FBYyxzREFBc0QsQ0FBQztBQUNyRSxjQUFjLGdFQUFnRSxDQUFDO0FBQy9FLGNBQWMsZ0VBQWdFLENBQUM7QUFDL0UsY0FBYyxzRUFBc0UsQ0FBQztBQUNyRixjQUFjLHNFQUFzRSxDQUFDO0FBQ3JGLGNBQWMsNERBQTRELENBQUM7QUFDM0UsY0FBYyw4RUFBOEUsQ0FBQztBQUM3RixjQUFjLDhFQUE4RSxDQUFDO0FBQzdGLGNBQWMsNEVBQTRFLENBQUM7QUFDM0YsY0FBYyw0RUFBNEUsQ0FBQztBQUMzRixjQUFjLHNGQUFzRixDQUFDO0FBQ3JHLGNBQWMsa0VBQWtFLENBQUM7QUFDakYsY0FBYyxzRUFBc0UsQ0FBQztBQUNyRixjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2Ygbmd4LWJpbXBsdXMtY29tcG9uZW50c1xyXG4gKi9cclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL25neC1iaW1wbHVzLWNvbXBvbmVudHMuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL25neC1iaW1wbHVzLWNvbXBvbmVudHMuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvaW50ZXJmYWNlcy9iaW1wbHVzLW9wYWNpdHktcHJvcGVydGllcy5pbnRlcmZhY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9pbnRlcmZhY2VzL2JpbXBsdXMtdmlzaWJpbGl0eS1wcm9wZXJ0aWVzLmludGVyZmFjZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1jb25uZWN0aW9uLWRlc2lnbmVyL2JpbXBsdXMtY29ubmVjdGlvbi1kZXNpZ25lci5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtY29ubmVjdGlvbi1kZXNpZ25lci9iaW1wbHVzLWNvbm5lY3Rpb24tZGVzaWduZXIuaW50ZXJmYWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLWNvbm5lY3Rpb24tZGVzaWduZXItcmVzdWx0cy9iaW1wbHVzLWNvbm5lY3Rpb24tZGVzaWduZXItcmVzdWx0cy5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtY29ubmVjdGlvbi1kZXNpZ25lci1yZXN1bHRzL2JpbXBsdXMtY29ubmVjdGlvbi1kZXNpZ25lci1yZXN1bHRzLmludGVyZmFjZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1jb250YWN0L2JpbXBsdXMtY29udGFjdC5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtZmxvYXRpbmctYmFyL2JpbXBsdXMtZmxvYXRpbmctYmFyLmludGVyZmFjZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvcHJvamVjdC1tb2RlbHMvcHJvamVjdC1tb2RlbHMuaW50ZXJmYWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLWZsb2F0aW5nLWJhci1oaWRlLW9iamVjdHMvYmltcGx1cy1mbG9hdGluZy1iYXItaGlkZS1vYmplY3RzLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1mbG9hdGluZy1iYXItaXNvbGF0aW9uLW9iamVjdHMvYmltcGx1cy1mbG9hdGluZy1iYXItaXNvbGF0aW9uLW9iamVjdHMuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLWZsb2F0aW5nLWJhci1wcm9qZWN0LW5hdmlnYXRvci9iaW1wbHVzLWZsb2F0aW5nLWJhci1wcm9qZWN0LW5hdmlnYXRvci5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtbGFuZ3VhZ2UtbWVudS9iaW1wbHVzLWxhbmd1YWdlLW1lbnUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLWxvY2FsaXplZC13aWRnZXQvYmltcGx1cy1sb2NhbGl6ZWQtd2lkZ2V0LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1tYWluLW1lbnUvYmltcGx1cy1tYWluLW1lbnUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLW5hdmJhci9iaW1wbHVzLW5hdmJhci5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtbmF2YmFyL2xvZ28tc3RhdGUuZW51bSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1ub3RpZnkvYmltcGx1cy1ub3RpZnkuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLXNpZGVuYXYvYmltcGx1cy1zaWRlbmF2LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1zaWRlbmF2LWRyYXdlci1jb250ZW50L2JpbXBsdXMtc2lkZW5hdi1kcmF3ZXItY29udGVudC5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtc3RvcmFnZS1pbmZvL2JpbXBsdXMtc3RvcmFnZS1pbmZvLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy10b29sLWh1Yi9iaW1wbHVzLXRvb2wtaHViLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy10b29sLWh1Yi9iaW1wbHVzLXRvb2wtaHViLmludGVyZmFjZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy11c2VyLW1lbnUvYmltcGx1cy11c2VyLW1lbnUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLXpvb20vYmltcGx1cy16b29tLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1mbGF0LXRyZWUvYmltcGx1cy1mbGF0LXRyZWUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLWZsYXQtdHJlZS9iaW1wbHVzLWZsYXQtdHJlZS5pbnRlcmZhY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtY29udGV4dC1tZW51L2JpbXBsdXMtY29udGV4dC1tZW51LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1jb250ZXh0LW1lbnUvYmltcGx1cy1jb250ZXh0LW1lbnUuaW50ZXJmYWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9sb2FkaW5nLXNwaW5uZXIvbG9hZGluZy1zcGlubmVyLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1vYmplY3QtbmF2aWdhdG9yL2JpbXBsdXMtb2JqZWN0LW5hdmlnYXRvci5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtb2JqZWN0LW5hdmlnYXRvci9iaW1wbHVzLW9iamVjdC1uYXZpZ2F0b3IuaW50ZXJmYWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLXRvb2x0aXAtbWVzc2FnZS9iaW1wbHVzLXRvb2x0aXAtbWVzc2FnZS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtdG9vbHRpcC1tZXNzYWdlL2JpbXBsdXMtdG9vbHRpcC1tZXNzYWdlLmludGVyZmFjZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1zY3JvbGxhYmxlLWNvbnRhaW5lci9iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy10b3VjaC1tZW51L2JpbXBsdXMtdG91Y2gtbWVudS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtcHJvamVjdC1tZW51L2JpbXBsdXMtcHJvamVjdC1tZW51LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL2xhbmd1YWdlLXN0cmluZ3Muc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3R5cGVzL3R5cGVzJztcclxuIl19
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1iaW1wbHVzLWNvbXBvbmVudHMvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyx1REFBdUQsQ0FBQztBQUN0RSxjQUFjLDBEQUEwRCxDQUFDO0FBQ3pFLGNBQWMsb0ZBQW9GLENBQUM7QUFDbkcsY0FBYyxvRkFBb0YsQ0FBQztBQUNuRyxjQUFjLG9HQUFvRyxDQUFDO0FBQ25ILGNBQWMsb0dBQW9HLENBQUM7QUFDbkgsY0FBYyw0REFBNEQsQ0FBQztBQUMzRSxjQUFjLHNFQUFzRSxDQUFDO0FBQ3JGLGNBQWMsMERBQTBELENBQUM7QUFDekUsY0FBYyxnR0FBZ0csQ0FBQztBQUMvRyxjQUFjLDBHQUEwRyxDQUFDO0FBQ3pILGNBQWMsMEdBQTBHLENBQUM7QUFDekgsY0FBYyx3RUFBd0UsQ0FBQztBQUN2RixjQUFjLDhFQUE4RSxDQUFDO0FBQzdGLGNBQWMsZ0VBQWdFLENBQUM7QUFDL0UsY0FBYywwREFBMEQsQ0FBQztBQUN6RSxjQUFjLGlEQUFpRCxDQUFDO0FBQ2hFLGNBQWMsMERBQTBELENBQUM7QUFDekUsY0FBYyw0REFBNEQsQ0FBQztBQUMzRSxjQUFjLDBGQUEwRixDQUFDO0FBQ3pHLGNBQWMsc0VBQXNFLENBQUM7QUFDckYsY0FBYyw4REFBOEQsQ0FBQztBQUM3RSxjQUFjLDhEQUE4RCxDQUFDO0FBQzdFLGNBQWMsZ0VBQWdFLENBQUM7QUFDL0UsY0FBYyxzREFBc0QsQ0FBQztBQUNyRSxjQUFjLGdFQUFnRSxDQUFDO0FBQy9FLGNBQWMsZ0VBQWdFLENBQUM7QUFDL0UsY0FBYyxzRUFBc0UsQ0FBQztBQUNyRixjQUFjLHNFQUFzRSxDQUFDO0FBQ3JGLGNBQWMsNERBQTRELENBQUM7QUFDM0UsY0FBYyw4RUFBOEUsQ0FBQztBQUM3RixjQUFjLDhFQUE4RSxDQUFDO0FBQzdGLGNBQWMsNEVBQTRFLENBQUM7QUFDM0YsY0FBYyw0RUFBNEUsQ0FBQztBQUMzRixjQUFjLHNGQUFzRixDQUFDO0FBQ3JHLGNBQWMsa0VBQWtFLENBQUM7QUFDakYsY0FBYyxzRUFBc0UsQ0FBQztBQUNyRixjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBuZ3gtYmltcGx1cy1jb21wb25lbnRzXHJcbiAqL1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbmd4LWJpbXBsdXMtY29tcG9uZW50cy5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbmd4LWJpbXBsdXMtY29tcG9uZW50cy5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9pbnRlcmZhY2VzL2JpbXBsdXMtb3BhY2l0eS1wcm9wZXJ0aWVzLmludGVyZmFjZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ludGVyZmFjZXMvYmltcGx1cy12aXNpYmlsaXR5LXByb3BlcnRpZXMuaW50ZXJmYWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLWNvbm5lY3Rpb24tZGVzaWduZXIvYmltcGx1cy1jb25uZWN0aW9uLWRlc2lnbmVyLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1jb25uZWN0aW9uLWRlc2lnbmVyL2JpbXBsdXMtY29ubmVjdGlvbi1kZXNpZ25lci5pbnRlcmZhY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtY29ubmVjdGlvbi1kZXNpZ25lci1yZXN1bHRzL2JpbXBsdXMtY29ubmVjdGlvbi1kZXNpZ25lci1yZXN1bHRzLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1jb25uZWN0aW9uLWRlc2lnbmVyLXJlc3VsdHMvYmltcGx1cy1jb25uZWN0aW9uLWRlc2lnbmVyLXJlc3VsdHMuaW50ZXJmYWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLWNvbnRhY3QvYmltcGx1cy1jb250YWN0LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1mbG9hdGluZy1iYXIvYmltcGx1cy1mbG9hdGluZy1iYXIuaW50ZXJmYWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9wcm9qZWN0LW1vZGVscy9wcm9qZWN0LW1vZGVscy5pbnRlcmZhY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtZmxvYXRpbmctYmFyLWhpZGUtb2JqZWN0cy9iaW1wbHVzLWZsb2F0aW5nLWJhci1oaWRlLW9iamVjdHMuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLWZsb2F0aW5nLWJhci1pc29sYXRpb24tb2JqZWN0cy9iaW1wbHVzLWZsb2F0aW5nLWJhci1pc29sYXRpb24tb2JqZWN0cy5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtZmxvYXRpbmctYmFyLXByb2plY3QtbmF2aWdhdG9yL2JpbXBsdXMtZmxvYXRpbmctYmFyLXByb2plY3QtbmF2aWdhdG9yLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1sYW5ndWFnZS1tZW51L2JpbXBsdXMtbGFuZ3VhZ2UtbWVudS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtbG9jYWxpemVkLXdpZGdldC9iaW1wbHVzLWxvY2FsaXplZC13aWRnZXQuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLW1haW4tbWVudS9iaW1wbHVzLW1haW4tbWVudS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtbmF2YmFyL2JpbXBsdXMtbmF2YmFyLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1uYXZiYXIvbG9nby1zdGF0ZS5lbnVtJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLW5vdGlmeS9iaW1wbHVzLW5vdGlmeS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtc2lkZW5hdi9iaW1wbHVzLXNpZGVuYXYuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLXNpZGVuYXYtZHJhd2VyLWNvbnRlbnQvYmltcGx1cy1zaWRlbmF2LWRyYXdlci1jb250ZW50LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1zdG9yYWdlLWluZm8vYmltcGx1cy1zdG9yYWdlLWluZm8uY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLXRvb2wtaHViL2JpbXBsdXMtdG9vbC1odWIuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLXRvb2wtaHViL2JpbXBsdXMtdG9vbC1odWIuaW50ZXJmYWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLXVzZXItbWVudS9iaW1wbHVzLXVzZXItbWVudS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtem9vbS9iaW1wbHVzLXpvb20uY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLWZsYXQtdHJlZS9iaW1wbHVzLWZsYXQtdHJlZS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtZmxhdC10cmVlL2JpbXBsdXMtZmxhdC10cmVlLmludGVyZmFjZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1jb250ZXh0LW1lbnUvYmltcGx1cy1jb250ZXh0LW1lbnUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLWNvbnRleHQtbWVudS9iaW1wbHVzLWNvbnRleHQtbWVudS5pbnRlcmZhY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2xvYWRpbmctc3Bpbm5lci9sb2FkaW5nLXNwaW5uZXIuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLW9iamVjdC1uYXZpZ2F0b3IvYmltcGx1cy1vYmplY3QtbmF2aWdhdG9yLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1vYmplY3QtbmF2aWdhdG9yL2JpbXBsdXMtb2JqZWN0LW5hdmlnYXRvci5pbnRlcmZhY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2JpbXBsdXMtdG9vbHRpcC1tZXNzYWdlL2JpbXBsdXMtdG9vbHRpcC1tZXNzYWdlLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy10b29sdGlwLW1lc3NhZ2UvYmltcGx1cy10b29sdGlwLW1lc3NhZ2UuaW50ZXJmYWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyL2JpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXIuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9iaW1wbHVzLXRvdWNoLW1lbnUvYmltcGx1cy10b3VjaC1tZW51LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvYmltcGx1cy1wcm9qZWN0LW1lbnUvYmltcGx1cy1wcm9qZWN0LW1lbnUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvbGFuZ3VhZ2Utc3RyaW5ncy5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvcmVzaXplLW9ic2VydmVyLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi90eXBlcy90eXBlcyc7XHJcbiJdfQ==