@tiba-spark/client-shared-lib 26.2.0-130 → 26.2.0-141

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.
@@ -1,171 +1,194 @@
1
- import { Injectable } from '@angular/core';
1
+ import { createComponent, Injectable } from '@angular/core';
2
2
  import { MatDialogConfig } from '@angular/material/dialog';
3
3
  import { Subject } from 'rxjs';
4
4
  import { first, takeUntil } from 'rxjs/operators';
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/material/dialog";
7
7
  import * as i2 from "@angular/material/snack-bar";
8
- const BACKDROP_FRONT_ZINDEX_LEVEL = '1000';
9
- const BACKDROP_BACK_ZINDEX_LEVEL = '999';
8
+ const Z_INDEX_FRONT = '1000';
9
+ const Z_INDEX_BACK = '999';
10
10
  export class ModalService {
11
- constructor(dialog, snackBar, appRef, injector, componentFactoryResolver) {
11
+ constructor(dialog, snackBar, appRef, environmentInjector) {
12
12
  this.dialog = dialog;
13
13
  this.snackBar = snackBar;
14
14
  this.appRef = appRef;
15
- this.injector = injector;
16
- this.componentFactoryResolver = componentFactoryResolver;
17
- this.subject = new Subject();
18
- this.componentRef = {};
19
- this.minimizedModals = [];
20
- this.openModalIds = [];
21
- this.addOpenModalToList = (dialogId) => this.openModalIds.push(dialogId);
22
- this.removeOpenModalFromList = (dialogId) => this.openModalIds = this.openModalIds.filter(id => id !== dialogId);
23
- }
24
- // enable subscribing to modal opened observable
15
+ this.environmentInjector = environmentInjector;
16
+ this._modalOpened$ = new Subject();
17
+ this._buttonWrapperRefs = {};
18
+ this._minimizedIds = [];
19
+ this._openIds = [];
20
+ }
25
21
  onModalOpened() {
26
- return this.subject;
22
+ return this._modalOpened$.asObservable();
27
23
  }
28
24
  getOpenDialogs() {
29
25
  return this.dialog.openDialogs;
30
26
  }
31
27
  open(modalComponent, modalConfig) {
32
- // dismisses the currently-visible snack bar, needed to handle expression after change warning.
33
28
  this.snackBar.dismiss();
34
- const dialogConfig = new MatDialogConfig();
35
- dialogConfig.disableClose = modalConfig.disableClose !== false;
36
- dialogConfig.hasBackdrop = false;
37
- dialogConfig.autoFocus = modalConfig.autoFocus !== false;
38
- dialogConfig.panelClass = modalConfig.panelClass;
39
- dialogConfig.position = modalConfig.position;
40
- dialogConfig.data = modalConfig.data;
41
- dialogConfig.id = modalConfig.id;
42
- dialogConfig.height = modalConfig.height;
43
- const dialogRef = this.dialog.open(modalComponent, dialogConfig);
44
- this.displayBackdrop(dialogRef.id);
45
- this.displayModalButtonWrapper(dialogRef, modalConfig);
46
- dialogRef.afterOpened().pipe(first()).subscribe(() => this.afterOpened(dialogRef, modalConfig));
29
+ const dialogRef = this.dialog.open(modalComponent, this.buildDialogConfig(modalConfig));
30
+ this.createBackdrop(dialogRef.id);
31
+ this.attachButtonWrapper(dialogRef, modalConfig);
32
+ dialogRef.afterOpened().pipe(first()).subscribe(() => this.afterOpened(dialogRef));
47
33
  dialogRef.afterClosed().pipe(first()).subscribe(() => this.afterClosed(dialogRef));
48
34
  return dialogRef.afterClosed();
49
35
  }
50
- closeAll({ excludeMinimized } = { excludeMinimized: true }) {
36
+ closeAll({ excludeMinimized = true } = {}) {
51
37
  if (excludeMinimized) {
52
- const openDialogs = this.getOpenDialogs();
53
- for (const openDialog of openDialogs) {
54
- const dialog = this.componentRef[openDialog.id];
55
- if (!dialog || !dialog.instance.isMinimized) {
38
+ for (const openDialog of this.getOpenDialogs()) {
39
+ const wrapper = this._buttonWrapperRefs[openDialog.id];
40
+ if (!wrapper || !wrapper.instance.isMinimized) {
56
41
  openDialog.close();
57
42
  }
58
43
  }
59
44
  }
60
45
  else {
61
- return this.dialog.closeAll();
46
+ this.dialog.closeAll();
62
47
  }
63
48
  }
64
49
  disableClose(disable, dialogId = 0) {
65
50
  this.dialog.openDialogs[dialogId].disableClose = disable;
66
51
  }
67
- afterOpened(dialogRef, modalConfig) {
68
- this.addOpenModalToList(dialogRef.id);
69
- this.updateMinimizedModals();
70
- this.subject.next();
52
+ afterOpened(dialogRef) {
53
+ this.trackModal(dialogRef.id);
54
+ this.setTopModal(dialogRef.id);
55
+ this.repositionMinimizedModals();
56
+ this._modalOpened$.next();
71
57
  }
72
58
  afterClosed(dialogRef) {
73
- this.removeOpenModalFromList(dialogRef.id);
74
- this.updateMinimizedModals(dialogRef.id);
75
- this.removeBackdrop(dialogRef.id);
76
- this.removeModalButtonWrapper(dialogRef.id);
59
+ this.untrackModal(dialogRef.id);
60
+ const newTopId = this._openIds[this._openIds.length - 1];
61
+ if (newTopId) {
62
+ this.setTopModal(newTopId);
63
+ }
64
+ this.repositionMinimizedModals(dialogRef.id);
65
+ this.destroyBackdrop(dialogRef.id);
66
+ this.detachButtonWrapper(dialogRef.id);
67
+ }
68
+ trackModal(dialogId) {
69
+ this._openIds.push(dialogId);
70
+ }
71
+ untrackModal(dialogId) {
72
+ this._openIds = this._openIds.filter(id => id !== dialogId);
73
+ }
74
+ backdropId(dialogId) {
75
+ return 'backdrop-' + dialogId;
76
+ }
77
+ // Relies on the CDK-internal '.cdk-global-overlay-wrapper' class added by MatDialog; may break on Angular Material upgrades.
78
+ getWrapper(dialogId) {
79
+ const dialogEl = document.getElementById(dialogId);
80
+ return dialogEl ? dialogEl.closest('.cdk-global-overlay-wrapper') : null;
81
+ }
82
+ setTopModal(dialogId) {
83
+ this._openIds.forEach(id => {
84
+ const wrapper = this.getWrapper(id);
85
+ const backdrop = document.getElementById(this.backdropId(id));
86
+ if (id === dialogId) {
87
+ if (wrapper)
88
+ wrapper.style.zIndex = Z_INDEX_FRONT;
89
+ if (backdrop)
90
+ backdrop.style.zIndex = Z_INDEX_BACK;
91
+ }
92
+ else {
93
+ if (wrapper)
94
+ wrapper.style.zIndex = Z_INDEX_BACK;
95
+ if (backdrop)
96
+ backdrop.style.zIndex = Z_INDEX_BACK;
97
+ }
98
+ });
77
99
  }
78
100
  minimize(dialogId) {
79
- this.removeOpenModalFromList(dialogId);
80
- document.getElementById('backdrop-' + dialogId).classList.add('tb-d-none');
81
- document.getElementById(dialogId).classList.add('minimize');
82
- this.minimizedModals.push(dialogId);
83
- this.updateMinimizedModals();
101
+ this.untrackModal(dialogId);
102
+ document.getElementById(this.backdropId(dialogId))?.classList.add('tb-d-none');
103
+ document.getElementById(dialogId)?.classList.add('minimize');
104
+ this._minimizedIds.push(dialogId);
105
+ const newTopId = this._openIds[this._openIds.length - 1];
106
+ if (newTopId) {
107
+ this.setTopModal(newTopId);
108
+ }
109
+ this.repositionMinimizedModals();
84
110
  }
85
111
  maximize(dialogId) {
86
- this.addOpenModalToList(dialogId);
87
- const backdropEl = document.getElementById('backdrop-' + dialogId);
88
- backdropEl.classList.remove('tb-d-none');
89
- backdropEl.style.zIndex = BACKDROP_BACK_ZINDEX_LEVEL;
90
- const dialogIdEl = document.getElementById(dialogId);
91
- dialogIdEl.classList.remove('minimize');
92
- dialogIdEl.style.bottom = undefined;
93
- this.updateMinimizedModals(dialogId);
94
- }
95
- updateMinimizedModals(dialogId) {
96
- this.minimizedModals = this.minimizedModals.filter(m => m !== dialogId);
97
- for (let i = 0; i < this.minimizedModals.length; i++) {
98
- const el = document.getElementById(this.minimizedModals[i]);
112
+ this.trackModal(dialogId);
113
+ document.getElementById(this.backdropId(dialogId)).classList.remove('tb-d-none');
114
+ this.setTopModal(dialogId);
115
+ const dialogEl = document.getElementById(dialogId);
116
+ dialogEl.classList.remove('minimize');
117
+ dialogEl.style.bottom = undefined;
118
+ this.repositionMinimizedModals(dialogId);
119
+ }
120
+ repositionMinimizedModals(removedId) {
121
+ this._minimizedIds = this._minimizedIds.filter(id => id !== removedId);
122
+ for (let i = 0; i < this._minimizedIds.length; i++) {
123
+ const el = document.getElementById(this._minimizedIds[i]);
99
124
  if (i === 0) {
100
125
  el.style.bottom = '10px';
101
126
  }
102
127
  else {
103
- const prevElement = document.getElementById(this.minimizedModals[i - 1]);
104
- let height = prevElement.clientHeight;
128
+ const prevEl = document.getElementById(this._minimizedIds[i - 1]);
129
+ const height = prevEl.clientHeight;
105
130
  el.style.bottom = ((height + 10) * i) + 10 + 'px';
106
131
  }
107
132
  el.style.right = '10px';
108
- const minimzeIconEl = el.querySelector('.modal-minimize-icon');
109
- if (this.openModalIds.length) {
110
- minimzeIconEl.classList.add('tb-action-disabled');
133
+ const minimizeIconEl = el.querySelector('.modal-minimize-icon');
134
+ if (this._openIds.length && i !== 0) {
135
+ minimizeIconEl.classList.add('tb-action-disabled');
111
136
  }
112
137
  else {
113
- minimzeIconEl.classList.remove('tb-action-disabled');
138
+ minimizeIconEl.classList.remove('tb-action-disabled');
114
139
  }
115
140
  }
116
- // make sure always the last open modal backdrop is in front
117
- if (this.openModalIds.length > 0) {
118
- const lastOpenModalId = this.openModalIds[this.openModalIds.length - 1];
119
- document.getElementById('backdrop-' + lastOpenModalId).style.zIndex = BACKDROP_BACK_ZINDEX_LEVEL;
120
- }
121
141
  }
122
- displayBackdrop(dialogId) {
123
- document.querySelectorAll('.tb-overlay-backdrop').forEach(el => el['style'].zIndex = BACKDROP_FRONT_ZINDEX_LEVEL);
124
- const divBackdrop = document.createElement('div');
125
- divBackdrop.classList.add('tb-overlay-backdrop');
126
- divBackdrop.id = 'backdrop-' + dialogId;
127
- divBackdrop.style.zIndex = BACKDROP_BACK_ZINDEX_LEVEL;
128
- document.querySelector('.cdk-overlay-container').append(divBackdrop);
129
- }
130
- removeBackdrop(dialogId) {
131
- const el = document.getElementById('backdrop-' + dialogId);
132
- if (el) {
133
- if (el.previousElementSibling) {
134
- el.previousElementSibling['style'].zIndex = null;
135
- }
136
- el.remove();
137
- }
142
+ buildDialogConfig(modalConfig) {
143
+ const config = Object.assign(new MatDialogConfig(), modalConfig);
144
+ config.disableClose = modalConfig?.disableClose !== false;
145
+ config.hasBackdrop = false;
146
+ config.autoFocus = modalConfig?.autoFocus !== false;
147
+ return config;
148
+ }
149
+ createBackdrop(dialogId) {
150
+ const backdrop = document.createElement('div');
151
+ backdrop.classList.add('tb-overlay-backdrop');
152
+ backdrop.id = this.backdropId(dialogId);
153
+ document.querySelector('.cdk-overlay-container').append(backdrop);
154
+ }
155
+ destroyBackdrop(dialogId) {
156
+ document.getElementById(this.backdropId(dialogId))?.remove();
138
157
  }
139
- displayModalButtonWrapper(dialogRef, modalConfig) {
158
+ attachButtonWrapper(dialogRef, modalConfig) {
140
159
  const dialogId = dialogRef.id;
141
160
  import('../components/modal-buttons-wrapper/modal-buttons-wrapper.component').then(res => {
142
- // Guard against modal already closed before import resolved
143
- if (this.dialog.getDialogById(dialogId)) {
144
- const componentFactory = this.componentFactoryResolver.resolveComponentFactory(res.ModalButtonsWrapperComponent);
145
- this.componentRef[dialogId] = componentFactory.create(this.injector);
146
- const instance = this.componentRef[dialogId].instance;
147
- instance.close.pipe(takeUntil(instance.destroy$)).subscribe(() => {
148
- dialogRef.close();
149
- });
150
- instance.minimize.pipe(takeUntil(instance.destroy$)).subscribe((minimize) => minimize ? this.minimize(dialogId) : this.maximize(dialogId));
151
- instance.enabledMinimized = modalConfig.enabledMinimized;
152
- this.appRef.attachView(this.componentRef[dialogId].hostView);
153
- const domElem = this.componentRef[dialogId].hostView.rootNodes[0];
154
- document.querySelector(`.${modalConfig.panelClass} .modal-button-wrapper`)?.appendChild(domElem);
161
+ if (!this.dialog.getDialogById(dialogId))
162
+ return;
163
+ this._buttonWrapperRefs[dialogId] = createComponent(res.ModalButtonsWrapperComponent, { environmentInjector: this.environmentInjector });
164
+ const instance = this._buttonWrapperRefs[dialogId].instance;
165
+ instance.close.pipe(takeUntil(instance.destroy$)).subscribe(() => dialogRef.close());
166
+ instance.minimize.pipe(takeUntil(instance.destroy$)).subscribe((isMinimize) => isMinimize ? this.minimize(dialogId) : this.maximize(dialogId));
167
+ instance.enabledMinimized = modalConfig?.enabledMinimized;
168
+ this.appRef.attachView(this._buttonWrapperRefs[dialogId].hostView);
169
+ const domEl = this._buttonWrapperRefs[dialogId].hostView.rootNodes[0];
170
+ const panelClass = modalConfig?.panelClass;
171
+ const panelSelector = Array.isArray(panelClass)
172
+ ? panelClass.map(c => `.${c}`).join('')
173
+ : panelClass ? `.${panelClass}` : null;
174
+ if (panelSelector) {
175
+ document.querySelector(`${panelSelector} .modal-button-wrapper`)?.appendChild(domEl);
155
176
  }
156
177
  });
157
178
  }
158
- removeModalButtonWrapper(dialogId) {
159
- if (this.componentRef[dialogId]) {
160
- this.appRef.detachView(this.componentRef[dialogId].hostView);
161
- this.componentRef[dialogId].destroy();
162
- this.componentRef[dialogId] = undefined;
179
+ detachButtonWrapper(dialogId) {
180
+ const ref = this._buttonWrapperRefs[dialogId];
181
+ if (ref) {
182
+ this.appRef.detachView(ref.hostView);
183
+ ref.destroy();
184
+ delete this._buttonWrapperRefs[dialogId];
163
185
  }
164
186
  }
165
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModalService, deps: [{ token: i1.MatDialog }, { token: i2.MatSnackBar }, { token: i0.ApplicationRef }, { token: i0.Injector }, { token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Injectable }); }
166
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModalService }); }
187
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModalService, deps: [{ token: i1.MatDialog }, { token: i2.MatSnackBar }, { token: i0.ApplicationRef }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable }); }
188
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModalService, providedIn: 'root' }); }
167
189
  }
168
190
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModalService, decorators: [{
169
- type: Injectable
170
- }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.MatSnackBar }, { type: i0.ApplicationRef }, { type: i0.Injector }, { type: i0.ComponentFactoryResolver }] });
171
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1zaGFyZWQtbGliL3NyYy9saWJyYXJpZXMvc2VydmljZXMvbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTJFLFVBQVUsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDcEksT0FBTyxFQUFhLGVBQWUsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQUVwRixPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFJbEQsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLENBQUM7QUFDM0MsTUFBTSwwQkFBMEIsR0FBRyxLQUFLLENBQUM7QUFHekMsTUFBTSxPQUFPLFlBQVk7SUFPdkIsWUFDVSxNQUFpQixFQUNqQixRQUFxQixFQUNyQixNQUFzQixFQUN0QixRQUFrQixFQUNsQix3QkFBa0Q7UUFKbEQsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQVZwRCxZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUM5QixpQkFBWSxHQUFpQyxFQUFFLENBQUM7UUFDaEQsb0JBQWUsR0FBYSxFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBYSxFQUFFLENBQUM7UUE2RTVCLHVCQUFrQixHQUFHLENBQUMsUUFBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUUsNEJBQXVCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0lBdEU1SCxDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVNLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRU0sSUFBSSxDQUNULGNBQXlCLEVBQ3pCLFdBQW9DO1FBRXBDLCtGQUErRjtRQUMvRixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXhCLE1BQU0sWUFBWSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFDM0MsWUFBWSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsWUFBWSxLQUFLLEtBQUssQ0FBQztRQUMvRCxZQUFZLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUNqQyxZQUFZLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDO1FBQ3pELFlBQVksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztRQUNqRCxZQUFZLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFDN0MsWUFBWSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQ3JDLFlBQVksQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxZQUFZLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFFekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFdkQsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ2hHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFTSxRQUFRLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFO1FBQy9ELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDMUMsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUM1QyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3JCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFTSxZQUFZLENBQUMsT0FBZ0IsRUFBRSxXQUFtQixDQUFDO1FBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7SUFDM0QsQ0FBQztJQUVPLFdBQVcsQ0FBTyxTQUE2QixFQUFFLFdBQW1DO1FBQzFGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU8sV0FBVyxDQUFPLFNBQTZCO1FBQ3JELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFNTyxRQUFRLENBQUMsUUFBZ0I7UUFDL0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLFFBQVEsQ0FBQyxjQUFjLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0UsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTyxRQUFRLENBQUMsUUFBZ0I7UUFDL0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLDBCQUEwQixDQUFDO1FBQ3JELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8scUJBQXFCLENBQUMsUUFBaUI7UUFDN0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQztRQUN4RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyRCxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDWixFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekUsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztnQkFDdEMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1lBQ3BELENBQUM7WUFFRCxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDeEIsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQy9ELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNwRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQztRQUVELDREQUE0RDtRQUM1RCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDeEUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRywwQkFBMEIsQ0FBQztRQUNuRyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxRQUFnQjtRQUN0QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLDJCQUEyQixDQUFDLENBQUM7UUFDbEgsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2pELFdBQVcsQ0FBQyxFQUFFLEdBQUcsV0FBVyxHQUFHLFFBQVEsQ0FBQztRQUN4QyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRywwQkFBMEIsQ0FBQztRQUN0RCxRQUFRLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTyxjQUFjLENBQUMsUUFBZ0I7UUFDckMsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLENBQUM7UUFDM0QsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQzlCLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ25ELENBQUM7WUFDRCxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVPLHlCQUF5QixDQUFPLFNBQTZCLEVBQUUsV0FBbUM7UUFDeEcsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMscUVBQXFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkYsNERBQTREO1lBQzVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7Z0JBQ2pILElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDckUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ3RELFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUMvRCxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3BCLENBQUMsQ0FBQyxDQUFDO2dCQUNILFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUMzSSxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO2dCQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLE9BQU8sR0FBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQWlDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBZ0IsQ0FBQztnQkFDM0csUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxVQUFVLHdCQUF3QixDQUFDLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25HLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxRQUFnQjtRQUMvQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7K0dBbExVLFlBQVk7bUhBQVosWUFBWTs7NEZBQVosWUFBWTtrQkFEeEIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcGxpY2F0aW9uUmVmLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZiwgRW1iZWRkZWRWaWV3UmVmLCBJbmplY3RhYmxlLCBJbmplY3RvciwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dDb25maWcsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVGliYU1hdERpYWxvZ0NvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvdGliYS1tYXQtZGlhbG9nLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSAnLi4vdXRpbHMvbGFuZy51dGlsJztcblxuY29uc3QgQkFDS0RST1BfRlJPTlRfWklOREVYX0xFVkVMID0gJzEwMDAnO1xuY29uc3QgQkFDS0RST1BfQkFDS19aSU5ERVhfTEVWRUwgPSAnOTk5JztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vZGFsU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBzdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBjb21wb25lbnRSZWY6IFN0cmluZ01hcDxDb21wb25lbnRSZWY8YW55Pj4gPSB7fTtcbiAgcHJpdmF0ZSBtaW5pbWl6ZWRNb2RhbHM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgb3Blbk1vZGFsSWRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgcHJpdmF0ZSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcbiAgKSB7XG4gIH1cblxuICAvLyBlbmFibGUgc3Vic2NyaWJpbmcgdG8gbW9kYWwgb3BlbmVkIG9ic2VydmFibGVcbiAgb25Nb2RhbE9wZW5lZCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJqZWN0O1xuICB9XG5cbiAgcHVibGljIGdldE9wZW5EaWFsb2dzKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxvZy5vcGVuRGlhbG9ncztcbiAgfVxuXG4gIHB1YmxpYyBvcGVuPFQsIEogPSBhbnk+KFxuICAgIG1vZGFsQ29tcG9uZW50OiBUeXBlPGFueT4sXG4gICAgbW9kYWxDb25maWc/OiBUaWJhTWF0RGlhbG9nQ29uZmlnPEo+LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAvLyBkaXNtaXNzZXMgdGhlIGN1cnJlbnRseS12aXNpYmxlIHNuYWNrIGJhciwgbmVlZGVkIHRvIGhhbmRsZSBleHByZXNzaW9uIGFmdGVyIGNoYW5nZSB3YXJuaW5nLlxuICAgIHRoaXMuc25hY2tCYXIuZGlzbWlzcygpO1xuXG4gICAgY29uc3QgZGlhbG9nQ29uZmlnID0gbmV3IE1hdERpYWxvZ0NvbmZpZygpO1xuICAgIGRpYWxvZ0NvbmZpZy5kaXNhYmxlQ2xvc2UgPSBtb2RhbENvbmZpZy5kaXNhYmxlQ2xvc2UgIT09IGZhbHNlO1xuICAgIGRpYWxvZ0NvbmZpZy5oYXNCYWNrZHJvcCA9IGZhbHNlO1xuICAgIGRpYWxvZ0NvbmZpZy5hdXRvRm9jdXMgPSBtb2RhbENvbmZpZy5hdXRvRm9jdXMgIT09IGZhbHNlO1xuICAgIGRpYWxvZ0NvbmZpZy5wYW5lbENsYXNzID0gbW9kYWxDb25maWcucGFuZWxDbGFzcztcbiAgICBkaWFsb2dDb25maWcucG9zaXRpb24gPSBtb2RhbENvbmZpZy5wb3NpdGlvbjtcbiAgICBkaWFsb2dDb25maWcuZGF0YSA9IG1vZGFsQ29uZmlnLmRhdGE7XG4gICAgZGlhbG9nQ29uZmlnLmlkID0gbW9kYWxDb25maWcuaWQ7XG4gICAgZGlhbG9nQ29uZmlnLmhlaWdodCA9IG1vZGFsQ29uZmlnLmhlaWdodDtcblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4obW9kYWxDb21wb25lbnQsIGRpYWxvZ0NvbmZpZyk7XG4gICAgdGhpcy5kaXNwbGF5QmFja2Ryb3AoZGlhbG9nUmVmLmlkKTtcbiAgICB0aGlzLmRpc3BsYXlNb2RhbEJ1dHRvbldyYXBwZXIoZGlhbG9nUmVmLCBtb2RhbENvbmZpZyk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJPcGVuZWQoKS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmFmdGVyT3BlbmVkKGRpYWxvZ1JlZiwgbW9kYWxDb25maWcpKTtcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmFmdGVyQ2xvc2VkKGRpYWxvZ1JlZikpO1xuICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZUFsbCh7IGV4Y2x1ZGVNaW5pbWl6ZWQgfSA9IHsgZXhjbHVkZU1pbmltaXplZDogdHJ1ZSB9KSB7XG4gICAgaWYgKGV4Y2x1ZGVNaW5pbWl6ZWQpIHtcbiAgICAgIGNvbnN0IG9wZW5EaWFsb2dzID0gdGhpcy5nZXRPcGVuRGlhbG9ncygpO1xuICAgICAgZm9yIChjb25zdCBvcGVuRGlhbG9nIG9mIG9wZW5EaWFsb2dzKSB7XG4gICAgICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMuY29tcG9uZW50UmVmW29wZW5EaWFsb2cuaWRdO1xuICAgICAgICBpZiAoIWRpYWxvZyB8fCAhZGlhbG9nLmluc3RhbmNlLmlzTWluaW1pemVkKSB7XG4gICAgICAgICAgb3BlbkRpYWxvZy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmRpYWxvZy5jbG9zZUFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlQ2xvc2UoZGlzYWJsZTogYm9vbGVhbiwgZGlhbG9nSWQ6IG51bWJlciA9IDApIHtcbiAgICB0aGlzLmRpYWxvZy5vcGVuRGlhbG9nc1tkaWFsb2dJZF0uZGlzYWJsZUNsb3NlID0gZGlzYWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgYWZ0ZXJPcGVuZWQ8VCwgUj4oZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8VCwgUj4sIG1vZGFsQ29uZmlnOiBUaWJhTWF0RGlhbG9nQ29uZmlnPFQ+KSB7XG4gICAgdGhpcy5hZGRPcGVuTW9kYWxUb0xpc3QoZGlhbG9nUmVmLmlkKTtcbiAgICB0aGlzLnVwZGF0ZU1pbmltaXplZE1vZGFscygpO1xuICAgIHRoaXMuc3ViamVjdC5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIGFmdGVyQ2xvc2VkPFQsIFI+KGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFQsIFI+KSB7XG4gICAgdGhpcy5yZW1vdmVPcGVuTW9kYWxGcm9tTGlzdChkaWFsb2dSZWYuaWQpO1xuICAgIHRoaXMudXBkYXRlTWluaW1pemVkTW9kYWxzKGRpYWxvZ1JlZi5pZCk7XG4gICAgdGhpcy5yZW1vdmVCYWNrZHJvcChkaWFsb2dSZWYuaWQpO1xuICAgIHRoaXMucmVtb3ZlTW9kYWxCdXR0b25XcmFwcGVyKGRpYWxvZ1JlZi5pZCk7XG4gIH1cblxuICBwcml2YXRlIGFkZE9wZW5Nb2RhbFRvTGlzdCA9IChkaWFsb2dJZDogc3RyaW5nKSA9PiB0aGlzLm9wZW5Nb2RhbElkcy5wdXNoKGRpYWxvZ0lkKTtcblxuICBwcml2YXRlIHJlbW92ZU9wZW5Nb2RhbEZyb21MaXN0ID0gKGRpYWxvZ0lkOiBzdHJpbmcpID0+IHRoaXMub3Blbk1vZGFsSWRzID0gdGhpcy5vcGVuTW9kYWxJZHMuZmlsdGVyKGlkID0+IGlkICE9PSBkaWFsb2dJZCk7XG5cbiAgcHJpdmF0ZSBtaW5pbWl6ZShkaWFsb2dJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5yZW1vdmVPcGVuTW9kYWxGcm9tTGlzdChkaWFsb2dJZCk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2tkcm9wLScgKyBkaWFsb2dJZCkuY2xhc3NMaXN0LmFkZCgndGItZC1ub25lJyk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGlhbG9nSWQpLmNsYXNzTGlzdC5hZGQoJ21pbmltaXplJyk7XG4gICAgdGhpcy5taW5pbWl6ZWRNb2RhbHMucHVzaChkaWFsb2dJZCk7XG4gICAgdGhpcy51cGRhdGVNaW5pbWl6ZWRNb2RhbHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgbWF4aW1pemUoZGlhbG9nSWQ6IHN0cmluZykge1xuICAgIHRoaXMuYWRkT3Blbk1vZGFsVG9MaXN0KGRpYWxvZ0lkKTtcbiAgICBjb25zdCBiYWNrZHJvcEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2tkcm9wLScgKyBkaWFsb2dJZCk7XG4gICAgYmFja2Ryb3BFbC5jbGFzc0xpc3QucmVtb3ZlKCd0Yi1kLW5vbmUnKTtcbiAgICBiYWNrZHJvcEVsLnN0eWxlLnpJbmRleCA9IEJBQ0tEUk9QX0JBQ0tfWklOREVYX0xFVkVMO1xuICAgIGNvbnN0IGRpYWxvZ0lkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaWFsb2dJZCk7XG4gICAgZGlhbG9nSWRFbC5jbGFzc0xpc3QucmVtb3ZlKCdtaW5pbWl6ZScpO1xuICAgIGRpYWxvZ0lkRWwuc3R5bGUuYm90dG9tID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudXBkYXRlTWluaW1pemVkTW9kYWxzKGRpYWxvZ0lkKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTWluaW1pemVkTW9kYWxzKGRpYWxvZ0lkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5taW5pbWl6ZWRNb2RhbHMgPSB0aGlzLm1pbmltaXplZE1vZGFscy5maWx0ZXIobSA9PiBtICE9PSBkaWFsb2dJZCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1pbmltaXplZE1vZGFscy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm1pbmltaXplZE1vZGFsc1tpXSk7XG4gICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICBlbC5zdHlsZS5ib3R0b20gPSAnMTBweCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcmV2RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubWluaW1pemVkTW9kYWxzW2kgLSAxXSk7XG4gICAgICAgIGxldCBoZWlnaHQgPSBwcmV2RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIGVsLnN0eWxlLmJvdHRvbSA9ICgoaGVpZ2h0ICsgMTApICogaSkgKyAxMCArICdweCc7XG4gICAgICB9XG5cbiAgICAgIGVsLnN0eWxlLnJpZ2h0ID0gJzEwcHgnO1xuICAgICAgY29uc3QgbWluaW16ZUljb25FbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1taW5pbWl6ZS1pY29uJyk7XG4gICAgICBpZiAodGhpcy5vcGVuTW9kYWxJZHMubGVuZ3RoKSB7XG4gICAgICAgIG1pbmltemVJY29uRWwuY2xhc3NMaXN0LmFkZCgndGItYWN0aW9uLWRpc2FibGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaW5pbXplSWNvbkVsLmNsYXNzTGlzdC5yZW1vdmUoJ3RiLWFjdGlvbi1kaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSBhbHdheXMgdGhlIGxhc3Qgb3BlbiBtb2RhbCBiYWNrZHJvcCBpcyBpbiBmcm9udFxuICAgIGlmICh0aGlzLm9wZW5Nb2RhbElkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0T3Blbk1vZGFsSWQgPSB0aGlzLm9wZW5Nb2RhbElkc1t0aGlzLm9wZW5Nb2RhbElkcy5sZW5ndGggLSAxXTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrZHJvcC0nICsgbGFzdE9wZW5Nb2RhbElkKS5zdHlsZS56SW5kZXggPSBCQUNLRFJPUF9CQUNLX1pJTkRFWF9MRVZFTDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRpc3BsYXlCYWNrZHJvcChkaWFsb2dJZDogc3RyaW5nKSB7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRiLW92ZXJsYXktYmFja2Ryb3AnKS5mb3JFYWNoKGVsID0+IGVsWydzdHlsZSddLnpJbmRleCA9IEJBQ0tEUk9QX0ZST05UX1pJTkRFWF9MRVZFTCk7XG4gICAgY29uc3QgZGl2QmFja2Ryb3AgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXZCYWNrZHJvcC5jbGFzc0xpc3QuYWRkKCd0Yi1vdmVybGF5LWJhY2tkcm9wJyk7XG4gICAgZGl2QmFja2Ryb3AuaWQgPSAnYmFja2Ryb3AtJyArIGRpYWxvZ0lkO1xuICAgIGRpdkJhY2tkcm9wLnN0eWxlLnpJbmRleCA9IEJBQ0tEUk9QX0JBQ0tfWklOREVYX0xFVkVMO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jZGstb3ZlcmxheS1jb250YWluZXInKS5hcHBlbmQoZGl2QmFja2Ryb3ApO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVCYWNrZHJvcChkaWFsb2dJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja2Ryb3AtJyArIGRpYWxvZ0lkKTtcbiAgICBpZiAoZWwpIHtcbiAgICAgIGlmIChlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgICAgIGVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmdbJ3N0eWxlJ10uekluZGV4ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGVsLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGlzcGxheU1vZGFsQnV0dG9uV3JhcHBlcjxULCBSPihkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxULCBSPiwgbW9kYWxDb25maWc6IFRpYmFNYXREaWFsb2dDb25maWc8VD4pIHtcbiAgICBjb25zdCBkaWFsb2dJZCA9IGRpYWxvZ1JlZi5pZDtcbiAgICBpbXBvcnQoJy4uL2NvbXBvbmVudHMvbW9kYWwtYnV0dG9ucy13cmFwcGVyL21vZGFsLWJ1dHRvbnMtd3JhcHBlci5jb21wb25lbnQnKS50aGVuKHJlcyA9PiB7XG4gICAgICAvLyBHdWFyZCBhZ2FpbnN0IG1vZGFsIGFscmVhZHkgY2xvc2VkIGJlZm9yZSBpbXBvcnQgcmVzb2x2ZWRcbiAgICAgIGlmICh0aGlzLmRpYWxvZy5nZXREaWFsb2dCeUlkKGRpYWxvZ0lkKSkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkocmVzLk1vZGFsQnV0dG9uc1dyYXBwZXJDb21wb25lbnQpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZltkaWFsb2dJZF0gPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZSh0aGlzLmluamVjdG9yKTtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudFJlZltkaWFsb2dJZF0uaW5zdGFuY2U7XG4gICAgICAgIGluc3RhbmNlLmNsb3NlLnBpcGUodGFrZVVudGlsKGluc3RhbmNlLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBkaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGluc3RhbmNlLm1pbmltaXplLnBpcGUodGFrZVVudGlsKGluc3RhbmNlLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChtaW5pbWl6ZSkgPT4gbWluaW1pemUgPyB0aGlzLm1pbmltaXplKGRpYWxvZ0lkKSA6IHRoaXMubWF4aW1pemUoZGlhbG9nSWQpKTtcbiAgICAgICAgaW5zdGFuY2UuZW5hYmxlZE1pbmltaXplZCA9IG1vZGFsQ29uZmlnLmVuYWJsZWRNaW5pbWl6ZWQ7XG4gICAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy5jb21wb25lbnRSZWZbZGlhbG9nSWRdLmhvc3RWaWV3KTtcbiAgICAgICAgY29uc3QgZG9tRWxlbSA9ICh0aGlzLmNvbXBvbmVudFJlZltkaWFsb2dJZF0uaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT4pLnJvb3ROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLiR7bW9kYWxDb25maWcucGFuZWxDbGFzc30gLm1vZGFsLWJ1dHRvbi13cmFwcGVyYCk/LmFwcGVuZENoaWxkKGRvbUVsZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVNb2RhbEJ1dHRvbldyYXBwZXIoZGlhbG9nSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudFJlZltkaWFsb2dJZF0pIHtcbiAgICAgIHRoaXMuYXBwUmVmLmRldGFjaFZpZXcodGhpcy5jb21wb25lbnRSZWZbZGlhbG9nSWRdLmhvc3RWaWV3KTtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmW2RpYWxvZ0lkXS5kZXN0cm95KCk7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZltkaWFsb2dJZF0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iXX0=
191
+ type: Injectable,
192
+ args: [{ providedIn: 'root' }]
193
+ }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.MatSnackBar }, { type: i0.ApplicationRef }, { type: i0.EnvironmentInjector }] });
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1zaGFyZWQtbGliL3NyYy9saWJyYXJpZXMvc2VydmljZXMvbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdDLGVBQWUsRUFBd0MsVUFBVSxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBQ3RJLE9BQU8sRUFBYSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFFcEYsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBR2xELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUM3QixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUM7QUFHM0IsTUFBTSxPQUFPLFlBQVk7SUFPdkIsWUFDVSxNQUFpQixFQUNqQixRQUFxQixFQUNyQixNQUFzQixFQUN0QixtQkFBd0M7UUFIeEMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFUMUMsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3BDLHVCQUFrQixHQUFzQyxFQUFFLENBQUM7UUFDM0Qsa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFDN0IsYUFBUSxHQUFhLEVBQUUsQ0FBQztJQU81QixDQUFDO0lBRUwsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksQ0FBYSxjQUF5QixFQUFFLFdB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QUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUM3QyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDekMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLGFBQWEsd0JBQXdCLENBQUMsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkYsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLG1CQUFtQixDQUFDLFFBQWdCO1FBQzFDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNkLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDOytHQXBNVSxZQUFZO21IQUFaLFlBQVksY0FEQyxNQUFNOzs0RkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBsaWNhdGlvblJlZiwgQ29tcG9uZW50UmVmLCBjcmVhdGVDb21wb25lbnQsIEVtYmVkZGVkVmlld1JlZiwgRW52aXJvbm1lbnRJbmplY3RvciwgSW5qZWN0YWJsZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dDb25maWcsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVGliYU1hdERpYWxvZ0NvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvdGliYS1tYXQtZGlhbG9nLWNvbmZpZy5pbnRlcmZhY2UnO1xuXG5jb25zdCBaX0lOREVYX0ZST05UID0gJzEwMDAnO1xuY29uc3QgWl9JTkRFWF9CQUNLID0gJzk5OSc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTW9kYWxTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9tb2RhbE9wZW5lZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9idXR0b25XcmFwcGVyUmVmczogUmVjb3JkPHN0cmluZywgQ29tcG9uZW50UmVmPGFueT4+ID0ge307XG4gIHByaXZhdGUgX21pbmltaXplZElkczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBfb3Blbklkczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICBwcml2YXRlIGVudmlyb25tZW50SW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3JcbiAgKSB7IH1cblxuICBvbk1vZGFsT3BlbmVkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9tb2RhbE9wZW5lZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRPcGVuRGlhbG9ncygpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsb2cub3BlbkRpYWxvZ3M7XG4gIH1cblxuICBvcGVuPFQsIEogPSBhbnk+KG1vZGFsQ29tcG9uZW50OiBUeXBlPGFueT4sIG1vZGFsQ29uZmlnPzogVGliYU1hdERpYWxvZ0NvbmZpZzxKPik6IE9ic2VydmFibGU8VD4ge1xuICAgIHRoaXMuc25hY2tCYXIuZGlzbWlzcygpO1xuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3Blbihtb2RhbENvbXBvbmVudCwgdGhpcy5idWlsZERpYWxvZ0NvbmZpZyhtb2RhbENvbmZpZykpO1xuICAgIHRoaXMuY3JlYXRlQmFja2Ryb3AoZGlhbG9nUmVmLmlkKTtcbiAgICB0aGlzLmF0dGFjaEJ1dHRvbldyYXBwZXIoZGlhbG9nUmVmLCBtb2RhbENvbmZpZyk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJPcGVuZWQoKS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmFmdGVyT3BlbmVkKGRpYWxvZ1JlZikpO1xuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuYWZ0ZXJDbG9zZWQoZGlhbG9nUmVmKSk7XG4gICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpO1xuICB9XG5cbiAgY2xvc2VBbGwoeyBleGNsdWRlTWluaW1pemVkID0gdHJ1ZSB9ID0ge30pIHtcbiAgICBpZiAoZXhjbHVkZU1pbmltaXplZCkge1xuICAgICAgZm9yIChjb25zdCBvcGVuRGlhbG9nIG9mIHRoaXMuZ2V0T3BlbkRpYWxvZ3MoKSkge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5fYnV0dG9uV3JhcHBlclJlZnNbb3BlbkRpYWxvZy5pZF07XG4gICAgICAgIGlmICghd3JhcHBlciB8fCAhd3JhcHBlci5pbnN0YW5jZS5pc01pbmltaXplZCkge1xuICAgICAgICAgIG9wZW5EaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpYWxvZy5jbG9zZUFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIGRpc2FibGVDbG9zZShkaXNhYmxlOiBib29sZWFuLCBkaWFsb2dJZDogbnVtYmVyID0gMCkge1xuICAgIHRoaXMuZGlhbG9nLm9wZW5EaWFsb2dzW2RpYWxvZ0lkXS5kaXNhYmxlQ2xvc2UgPSBkaXNhYmxlO1xuICB9XG5cbiAgcHJpdmF0ZSBhZnRlck9wZW5lZDxULCBSPihkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxULCBSPikge1xuICAgIHRoaXMudHJhY2tNb2RhbChkaWFsb2dSZWYuaWQpO1xuICAgIHRoaXMuc2V0VG9wTW9kYWwoZGlhbG9nUmVmLmlkKTtcbiAgICB0aGlzLnJlcG9zaXRpb25NaW5pbWl6ZWRNb2RhbHMoKTtcbiAgICB0aGlzLl9tb2RhbE9wZW5lZCQubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZnRlckNsb3NlZDxULCBSPihkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxULCBSPikge1xuICAgIHRoaXMudW50cmFja01vZGFsKGRpYWxvZ1JlZi5pZCk7XG4gICAgY29uc3QgbmV3VG9wSWQgPSB0aGlzLl9vcGVuSWRzW3RoaXMuX29wZW5JZHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKG5ld1RvcElkKSB7XG4gICAgICB0aGlzLnNldFRvcE1vZGFsKG5ld1RvcElkKTtcbiAgICB9XG4gICAgdGhpcy5yZXBvc2l0aW9uTWluaW1pemVkTW9kYWxzKGRpYWxvZ1JlZi5pZCk7XG4gICAgdGhpcy5kZXN0cm95QmFja2Ryb3AoZGlhbG9nUmVmLmlkKTtcbiAgICB0aGlzLmRldGFjaEJ1dHRvbldyYXBwZXIoZGlhbG9nUmVmLmlkKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhY2tNb2RhbChkaWFsb2dJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fb3Blbklkcy5wdXNoKGRpYWxvZ0lkKTtcbiAgfVxuXG4gIHByaXZhdGUgdW50cmFja01vZGFsKGRpYWxvZ0lkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9vcGVuSWRzID0gdGhpcy5fb3Blbklkcy5maWx0ZXIoaWQgPT4gaWQgIT09IGRpYWxvZ0lkKTtcbiAgfVxuXG4gIHByaXZhdGUgYmFja2Ryb3BJZChkaWFsb2dJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2JhY2tkcm9wLScgKyBkaWFsb2dJZDtcbiAgfVxuXG4gIC8vIFJlbGllcyBvbiB0aGUgQ0RLLWludGVybmFsICcuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXInIGNsYXNzIGFkZGVkIGJ5IE1hdERpYWxvZzsgbWF5IGJyZWFrIG9uIEFuZ3VsYXIgTWF0ZXJpYWwgdXBncmFkZXMuXG4gIHByaXZhdGUgZ2V0V3JhcHBlcihkaWFsb2dJZDogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBkaWFsb2dFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRpYWxvZ0lkKTtcbiAgICByZXR1cm4gZGlhbG9nRWwgPyBkaWFsb2dFbC5jbG9zZXN0PEhUTUxFbGVtZW50PignLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyJykgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUb3BNb2RhbChkaWFsb2dJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fb3Blbklkcy5mb3JFYWNoKGlkID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmdldFdyYXBwZXIoaWQpO1xuICAgICAgY29uc3QgYmFja2Ryb3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmJhY2tkcm9wSWQoaWQpKTtcbiAgICAgIGlmIChpZCA9PT0gZGlhbG9nSWQpIHtcbiAgICAgICAgaWYgKHdyYXBwZXIpIHdyYXBwZXIuc3R5bGUuekluZGV4ID0gWl9JTkRFWF9GUk9OVDtcbiAgICAgICAgaWYgKGJhY2tkcm9wKSBiYWNrZHJvcC5zdHlsZS56SW5kZXggPSBaX0lOREVYX0JBQ0s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAod3JhcHBlcikgd3JhcHBlci5zdHlsZS56SW5kZXggPSBaX0lOREVYX0JBQ0s7XG4gICAgICAgIGlmIChiYWNrZHJvcCkgYmFja2Ryb3Auc3R5bGUuekluZGV4ID0gWl9JTkRFWF9CQUNLO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtaW5pbWl6ZShkaWFsb2dJZDogc3RyaW5nKSB7XG4gICAgdGhpcy51bnRyYWNrTW9kYWwoZGlhbG9nSWQpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuYmFja2Ryb3BJZChkaWFsb2dJZCkpPy5jbGFzc0xpc3QuYWRkKCd0Yi1kLW5vbmUnKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaWFsb2dJZCk/LmNsYXNzTGlzdC5hZGQoJ21pbmltaXplJyk7XG4gICAgdGhpcy5fbWluaW1pemVkSWRzLnB1c2goZGlhbG9nSWQpO1xuICAgIGNvbnN0IG5ld1RvcElkID0gdGhpcy5fb3Blbklkc1t0aGlzLl9vcGVuSWRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChuZXdUb3BJZCkge1xuICAgICAgdGhpcy5zZXRUb3BNb2RhbChuZXdUb3BJZCk7XG4gICAgfVxuICAgIHRoaXMucmVwb3NpdGlvbk1pbmltaXplZE1vZGFscygpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXhpbWl6ZShkaWFsb2dJZDogc3RyaW5nKSB7XG4gICAgdGhpcy50cmFja01vZGFsKGRpYWxvZ0lkKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmJhY2tkcm9wSWQoZGlhbG9nSWQpKS5jbGFzc0xpc3QucmVtb3ZlKCd0Yi1kLW5vbmUnKTtcbiAgICB0aGlzLnNldFRvcE1vZGFsKGRpYWxvZ0lkKTtcbiAgICBjb25zdCBkaWFsb2dFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRpYWxvZ0lkKTtcbiAgICBkaWFsb2dFbC5jbGFzc0xpc3QucmVtb3ZlKCdtaW5pbWl6ZScpO1xuICAgIGRpYWxvZ0VsLnN0eWxlLmJvdHRvbSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlcG9zaXRpb25NaW5pbWl6ZWRNb2RhbHMoZGlhbG9nSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBvc2l0aW9uTWluaW1pemVkTW9kYWxzKHJlbW92ZWRJZD86IHN0cmluZykge1xuICAgIHRoaXMuX21pbmltaXplZElkcyA9IHRoaXMuX21pbmltaXplZElkcy5maWx0ZXIoaWQgPT4gaWQgIT09IHJlbW92ZWRJZCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9taW5pbWl6ZWRJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5fbWluaW1pemVkSWRzW2ldKTtcbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIGVsLnN0eWxlLmJvdHRvbSA9ICcxMHB4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByZXZFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuX21pbmltaXplZElkc1tpIC0gMV0pO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBwcmV2RWwuY2xpZW50SGVpZ2h0O1xuICAgICAgICBlbC5zdHlsZS5ib3R0b20gPSAoKGhlaWdodCArIDEwKSAqIGkpICsgMTAgKyAncHgnO1xuICAgICAgfVxuICAgICAgZWwuc3R5bGUucmlnaHQgPSAnMTBweCc7XG4gICAgICBjb25zdCBtaW5pbWl6ZUljb25FbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1taW5pbWl6ZS1pY29uJyk7XG4gICAgICBpZiAodGhpcy5fb3Blbklkcy5sZW5ndGggJiYgaSAhPT0gMCkge1xuICAgICAgICBtaW5pbWl6ZUljb25FbC5jbGFzc0xpc3QuYWRkKCd0Yi1hY3Rpb24tZGlzYWJsZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbmltaXplSWNvbkVsLmNsYXNzTGlzdC5yZW1vdmUoJ3RiLWFjdGlvbi1kaXNhYmxlZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREaWFsb2dDb25maWc8Sj4obW9kYWxDb25maWc/OiBUaWJhTWF0RGlhbG9nQ29uZmlnPEo+KTogTWF0RGlhbG9nQ29uZmlnIHtcbiAgICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKG5ldyBNYXREaWFsb2dDb25maWcoKSwgbW9kYWxDb25maWcpO1xuICAgIGNvbmZpZy5kaXNhYmxlQ2xvc2UgPSBtb2RhbENvbmZpZz8uZGlzYWJsZUNsb3NlICE9PSBmYWxzZTtcbiAgICBjb25maWcuaGFzQmFja2Ryb3AgPSBmYWxzZTtcbiAgICBjb25maWcuYXV0b0ZvY3VzID0gbW9kYWxDb25maWc/LmF1dG9Gb2N1cyAhPT0gZmFsc2U7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQmFja2Ryb3AoZGlhbG9nSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGJhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYmFja2Ryb3AuY2xhc3NMaXN0LmFkZCgndGItb3ZlcmxheS1iYWNrZHJvcCcpO1xuICAgIGJhY2tkcm9wLmlkID0gdGhpcy5iYWNrZHJvcElkKGRpYWxvZ0lkKTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2RrLW92ZXJsYXktY29udGFpbmVyJykuYXBwZW5kKGJhY2tkcm9wKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveUJhY2tkcm9wKGRpYWxvZ0lkOiBzdHJpbmcpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmJhY2tkcm9wSWQoZGlhbG9nSWQpKT8ucmVtb3ZlKCk7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaEJ1dHRvbldyYXBwZXI8VCwgUj4oZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8VCwgUj4sIG1vZGFsQ29uZmlnPzogVGliYU1hdERpYWxvZ0NvbmZpZzxUPikge1xuICAgIGNvbnN0IGRpYWxvZ0lkID0gZGlhbG9nUmVmLmlkO1xuICAgIGltcG9ydCgnLi4vY29tcG9uZW50cy9tb2RhbC1idXR0b25zLXdyYXBwZXIvbW9kYWwtYnV0dG9ucy13cmFwcGVyLmNvbXBvbmVudCcpLnRoZW4ocmVzID0+IHtcbiAgICAgIGlmICghdGhpcy5kaWFsb2cuZ2V0RGlhbG9nQnlJZChkaWFsb2dJZCkpIHJldHVybjtcblxuICAgICAgdGhpcy5fYnV0dG9uV3JhcHBlclJlZnNbZGlhbG9nSWRdID0gY3JlYXRlQ29tcG9uZW50KHJlcy5Nb2RhbEJ1dHRvbnNXcmFwcGVyQ29tcG9uZW50LCB7IGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52aXJvbm1lbnRJbmplY3RvciB9KTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5fYnV0dG9uV3JhcHBlclJlZnNbZGlhbG9nSWRdLmluc3RhbmNlO1xuXG4gICAgICBpbnN0YW5jZS5jbG9zZS5waXBlKHRha2VVbnRpbChpbnN0YW5jZS5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiBkaWFsb2dSZWYuY2xvc2UoKSk7XG4gICAgICBpbnN0YW5jZS5taW5pbWl6ZS5waXBlKHRha2VVbnRpbChpbnN0YW5jZS5kZXN0cm95JCkpLnN1YnNjcmliZSgoaXNNaW5pbWl6ZTogYm9vbGVhbikgPT5cbiAgICAgICAgaXNNaW5pbWl6ZSA/IHRoaXMubWluaW1pemUoZGlhbG9nSWQpIDogdGhpcy5tYXhpbWl6ZShkaWFsb2dJZClcbiAgICAgICk7XG4gICAgICBpbnN0YW5jZS5lbmFibGVkTWluaW1pemVkID0gbW9kYWxDb25maWc/LmVuYWJsZWRNaW5pbWl6ZWQ7XG5cbiAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy5fYnV0dG9uV3JhcHBlclJlZnNbZGlhbG9nSWRdLmhvc3RWaWV3KTtcbiAgICAgIGNvbnN0IGRvbUVsID0gKHRoaXMuX2J1dHRvbldyYXBwZXJSZWZzW2RpYWxvZ0lkXS5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgcGFuZWxDbGFzcyA9IG1vZGFsQ29uZmlnPy5wYW5lbENsYXNzO1xuICAgICAgY29uc3QgcGFuZWxTZWxlY3RvciA9IEFycmF5LmlzQXJyYXkocGFuZWxDbGFzcylcbiAgICAgICAgPyBwYW5lbENsYXNzLm1hcChjID0+IGAuJHtjfWApLmpvaW4oJycpXG4gICAgICAgIDogcGFuZWxDbGFzcyA/IGAuJHtwYW5lbENsYXNzfWAgOiBudWxsO1xuICAgICAgaWYgKHBhbmVsU2VsZWN0b3IpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgJHtwYW5lbFNlbGVjdG9yfSAubW9kYWwtYnV0dG9uLXdyYXBwZXJgKT8uYXBwZW5kQ2hpbGQoZG9tRWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRhY2hCdXR0b25XcmFwcGVyKGRpYWxvZ0lkOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLl9idXR0b25XcmFwcGVyUmVmc1tkaWFsb2dJZF07XG4gICAgaWYgKHJlZikge1xuICAgICAgdGhpcy5hcHBSZWYuZGV0YWNoVmlldyhyZWYuaG9zdFZpZXcpO1xuICAgICAgcmVmLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLl9idXR0b25XcmFwcGVyUmVmc1tkaWFsb2dJZF07XG4gICAgfVxuICB9XG59XG4iXX0=