codefoxcore 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +24 -0
  2. package/esm2022/codefoxcore.mjs +5 -0
  3. package/esm2022/lib/classes/dialog.config.class.mjs +22 -0
  4. package/esm2022/lib/classes/dialog.injector.class.mjs +14 -0
  5. package/esm2022/lib/classes/dialog.ref.class.mjs +72 -0
  6. package/esm2022/lib/classes/index.mjs +4 -0
  7. package/esm2022/lib/interfaces.mjs +28 -0
  8. package/esm2022/lib/services/api.service.mjs +84 -0
  9. package/esm2022/lib/services/dialog.service.mjs +324 -0
  10. package/esm2022/lib/services/index.mjs +5 -0
  11. package/esm2022/lib/services/logger.service.mjs +62 -0
  12. package/esm2022/lib/services/message.service.mjs +174 -0
  13. package/esm2022/lib/tokens/alert.token.mjs +20 -0
  14. package/esm2022/lib/tokens/confirm.token.mjs +7 -0
  15. package/esm2022/lib/tokens/dialog.token.mjs +7 -0
  16. package/esm2022/lib/tokens/index.mjs +6 -0
  17. package/esm2022/lib/tokens/loglevel.token.mjs +8 -0
  18. package/esm2022/lib/tokens/message.token.mjs +14 -0
  19. package/esm2022/public-api.mjs +5 -0
  20. package/fesm2022/codefoxcore.mjs +820 -0
  21. package/fesm2022/codefoxcore.mjs.map +1 -0
  22. package/index.d.ts +5 -0
  23. package/lib/classes/dialog.config.class.d.ts +22 -0
  24. package/lib/classes/dialog.injector.class.d.ts +8 -0
  25. package/lib/classes/dialog.ref.class.d.ts +24 -0
  26. package/lib/classes/index.d.ts +3 -0
  27. package/lib/interfaces.d.ts +121 -0
  28. package/lib/services/api.service.d.ts +24 -0
  29. package/lib/services/dialog.service.d.ts +34 -0
  30. package/lib/services/index.d.ts +4 -0
  31. package/lib/services/logger.service.d.ts +17 -0
  32. package/lib/services/message.service.d.ts +76 -0
  33. package/lib/tokens/alert.token.d.ts +6 -0
  34. package/lib/tokens/confirm.token.d.ts +5 -0
  35. package/lib/tokens/dialog.token.d.ts +3 -0
  36. package/lib/tokens/index.d.ts +5 -0
  37. package/lib/tokens/loglevel.token.d.ts +3 -0
  38. package/lib/tokens/message.token.d.ts +3 -0
  39. package/package.json +25 -0
  40. package/public-api.d.ts +4 -0
@@ -0,0 +1,324 @@
1
+ import { isPlatformBrowser } from '@angular/common';
2
+ import { ApplicationRef, createComponent, inject, Injectable, Injector, PLATFORM_ID } from '@angular/core';
3
+ import { Title } from '@angular/platform-browser';
4
+ import { filter } from 'rxjs';
5
+ import { DialogConfig, DialogInjector, DialogRef } from '../classes';
6
+ import { ALERT_CONFIGURATIONS, CF_PREDEFINED_DIALOGS, CONFIRM_CONFIGURATIONS } from '../tokens';
7
+ import { MessageService } from '../services';
8
+ import * as i0 from "@angular/core";
9
+ export class DialogService {
10
+ constructor() {
11
+ this.injector = inject(Injector);
12
+ this.predefinedConfirmConfigurations = inject(CONFIRM_CONFIGURATIONS);
13
+ this.predefinedAlertConfigurations = inject(ALERT_CONFIGURATIONS);
14
+ this.predefinedDialogs = inject(CF_PREDEFINED_DIALOGS);
15
+ this.title = inject(Title);
16
+ this.messageService = inject(MessageService);
17
+ this.dialogs = new Map();
18
+ this.openIndex = 1;
19
+ this.platformId = inject(PLATFORM_ID);
20
+ if (isPlatformBrowser(this.platformId)) {
21
+ document.addEventListener("keyup", (keyboardEvent) => {
22
+ if (keyboardEvent.key.toLowerCase() === 'escape') {
23
+ let lastOpenIndex = 0;
24
+ let lastOpenedDialogRef = null;
25
+ for (const [dialogRef, cfDialogComponentRefContainer] of this.dialogs.entries()) {
26
+ if (cfDialogComponentRefContainer.openIndex > lastOpenIndex) {
27
+ lastOpenIndex = cfDialogComponentRefContainer.openIndex;
28
+ lastOpenedDialogRef = dialogRef;
29
+ }
30
+ }
31
+ if (lastOpenedDialogRef !== null && lastOpenedDialogRef.dialogConfig !== null) {
32
+ if (lastOpenedDialogRef.dialogConfig.ignoreKeyUp || document.activeElement instanceof HTMLInputElement || document.activeElement instanceof HTMLTextAreaElement) {
33
+ return;
34
+ }
35
+ lastOpenedDialogRef.close();
36
+ }
37
+ }
38
+ });
39
+ }
40
+ }
41
+ async openPredefined(name, dialogConfiguration = {}) {
42
+ if (this.predefinedDialogs[name] === undefined) {
43
+ throw Error('Dialog with name "' + name + '" not found!');
44
+ }
45
+ const predefinedDialog = this.predefinedDialogs[name];
46
+ if (typeof predefinedDialog === 'function') {
47
+ return this.openImport(predefinedDialog, dialogConfiguration);
48
+ }
49
+ return this.openImport(predefinedDialog.component, { ...predefinedDialog.configuration, ...dialogConfiguration });
50
+ }
51
+ async openImport(component, dialogConfiguration = {}) {
52
+ return new Promise(async (resolve) => {
53
+ resolve(this.open(await component(), dialogConfiguration));
54
+ });
55
+ }
56
+ open(component, dialogConfiguration = {}) {
57
+ for (let dialog of this.dialogs.entries()) {
58
+ if ((dialogConfiguration.single && dialog[1].componentRef.componentType.name === component.name) ||
59
+ (dialog[0].dialogConfig !== null && dialog[0].dialogConfig.single && dialog[1].componentRef.componentType.name === component.name)) {
60
+ return dialog[0];
61
+ }
62
+ }
63
+ const dialogConfig = this.createDialogConfig(dialogConfiguration);
64
+ if (!dialogConfig.keepActiveElement) {
65
+ if (document.activeElement instanceof HTMLElement) {
66
+ document.activeElement.blur();
67
+ }
68
+ }
69
+ const dialogRef = this.appendToBody(component, dialogConfig);
70
+ dialogRef.messageService = this.messageService;
71
+ dialogRef.dialogConfig = dialogConfig;
72
+ this.changeAndStoreTitle(dialogRef);
73
+ return dialogRef;
74
+ }
75
+ changeAndStoreTitle(dialogRef) {
76
+ dialogRef.savedTitle = this.title.getTitle();
77
+ if (dialogRef.dialogConfig !== null && dialogRef.dialogConfig.title !== null) {
78
+ this.title.setTitle(dialogRef.dialogConfig.title);
79
+ }
80
+ }
81
+ createDialogConfig(dialogConfiguration) {
82
+ const dialogConfig = new DialogConfig();
83
+ if (dialogConfiguration.showCloseIcon !== undefined) {
84
+ dialogConfig.showCloseIcon = dialogConfiguration.showCloseIcon;
85
+ }
86
+ if (dialogConfiguration.beforeClose !== undefined) {
87
+ dialogConfig.beforeClose = dialogConfiguration.beforeClose;
88
+ }
89
+ if (dialogConfiguration.ignoreKeyUp !== undefined) {
90
+ dialogConfig.ignoreKeyUp = dialogConfiguration.ignoreKeyUp;
91
+ }
92
+ if (dialogConfiguration.data !== undefined) {
93
+ dialogConfig.data = dialogConfiguration.data;
94
+ }
95
+ if (dialogConfiguration.noPadding !== undefined) {
96
+ dialogConfig.noPadding = dialogConfiguration.noPadding;
97
+ }
98
+ if (dialogConfiguration.keepActiveElement !== undefined) {
99
+ dialogConfig.keepActiveElement = dialogConfiguration.keepActiveElement;
100
+ }
101
+ if (dialogConfiguration.containerClasses !== undefined) {
102
+ dialogConfig.containerClasses = dialogConfiguration.containerClasses;
103
+ }
104
+ if (dialogConfiguration.dialogClasses !== undefined) {
105
+ dialogConfig.dialogClasses = dialogConfiguration.dialogClasses;
106
+ }
107
+ if (dialogConfiguration.title !== undefined) {
108
+ dialogConfig.title = dialogConfiguration.title;
109
+ }
110
+ if (dialogConfiguration.contentElement !== undefined) {
111
+ dialogConfig.contentElement = dialogConfiguration.contentElement;
112
+ }
113
+ if (dialogConfiguration.single !== undefined) {
114
+ dialogConfig.single = dialogConfiguration.single;
115
+ }
116
+ if (dialogConfiguration.width !== undefined) {
117
+ dialogConfig.width = dialogConfiguration.width;
118
+ }
119
+ if (dialogConfiguration.height !== undefined) {
120
+ dialogConfig.height = dialogConfiguration.height;
121
+ }
122
+ return dialogConfig;
123
+ }
124
+ appendToBody(component, dialogConfig) {
125
+ const appRef = this.injector.get(ApplicationRef);
126
+ // CREATE INJECTION TOKENS
127
+ const tokens = new WeakMap();
128
+ // CREATE DIALOG CONFIGURATION CLASS
129
+ tokens.set(DialogConfig, dialogConfig);
130
+ // CREATE DIALOG REFERENCE CLASS
131
+ const dialogRef = new DialogRef();
132
+ tokens.set(DialogRef, dialogRef);
133
+ // LISTEN ON DIALOG CLOSE
134
+ const closeSub = dialogRef.onClose.subscribe(() => {
135
+ this.removeFromBody(dialogRef);
136
+ closeSub.unsubscribe();
137
+ });
138
+ // CREATE COMPONENT REF
139
+ const componentRef = createComponent(component, {
140
+ environmentInjector: appRef.injector,
141
+ elementInjector: new DialogInjector(this.injector, tokens)
142
+ });
143
+ // ATTACH VIEW TO ANGULAR
144
+ appRef.attachView(componentRef.hostView);
145
+ // CREATE DIALOG CONTAINER ELEMENT
146
+ const dialogContainer = document.createElement('div');
147
+ dialogContainer.classList.add('cf-dialog-container');
148
+ if (dialogConfig.containerClasses.length > 0) {
149
+ dialogContainer.classList.add(...dialogConfig.containerClasses);
150
+ }
151
+ // APPEND DOM ELEMENT TO DIALOG
152
+ const childDomElem = componentRef.hostView.rootNodes[0];
153
+ childDomElem.classList.add('cf-dialog');
154
+ if (dialogConfig.width !== null) {
155
+ childDomElem.style.width = dialogConfig.width;
156
+ }
157
+ if (dialogConfig.height !== null) {
158
+ childDomElem.style.height = dialogConfig.height;
159
+ }
160
+ if (dialogConfig.noPadding) {
161
+ childDomElem.classList.add('no-padding');
162
+ }
163
+ if (dialogConfig.dialogClasses.length > 0) {
164
+ childDomElem.classList.add(...dialogConfig.dialogClasses);
165
+ }
166
+ if (dialogConfig.contentElement !== null) {
167
+ childDomElem.appendChild(dialogConfig.contentElement);
168
+ }
169
+ dialogContainer.appendChild(childDomElem);
170
+ // CLOSEABLE? APPEND BUTTON
171
+ if (dialogConfig.showCloseIcon) {
172
+ const closeElement = document.createElement('div');
173
+ closeElement.classList.add(...['cf-dialog-close', 'remixicon', 'close-line']);
174
+ closeElement.onclick = () => {
175
+ dialogRef.close();
176
+ };
177
+ childDomElem.appendChild(closeElement);
178
+ }
179
+ // APPEND DIALOG CONTAINER TO BODY
180
+ document.body.appendChild(dialogContainer);
181
+ this.dialogs.set(dialogRef, {
182
+ componentRef,
183
+ container: dialogContainer,
184
+ openIndex: this.openIndex
185
+ });
186
+ this.openIndex++;
187
+ return dialogRef;
188
+ }
189
+ removeFromBody(dialogRef) {
190
+ const appRef = this.injector.get(ApplicationRef);
191
+ if (!dialogRef || !this.dialogs.has(dialogRef)) {
192
+ return;
193
+ }
194
+ const dialogComponentRefContainer = this.dialogs.get(dialogRef);
195
+ if (dialogComponentRefContainer == undefined) {
196
+ return;
197
+ }
198
+ appRef.detachView(dialogComponentRefContainer.componentRef.hostView);
199
+ if (dialogComponentRefContainer.container !== null) {
200
+ dialogComponentRefContainer.container.remove();
201
+ }
202
+ dialogComponentRefContainer.componentRef.destroy();
203
+ this.dialogs.delete(dialogRef);
204
+ if (this.dialogs.size === 0) {
205
+ this.openIndex = 1;
206
+ }
207
+ // Restore title
208
+ if (this.dialogs.size === 0) {
209
+ this.title.setTitle(dialogRef.savedTitle);
210
+ }
211
+ else {
212
+ let latestOpenedDialogRef = null;
213
+ this.dialogs.forEach((_, dialogRef) => {
214
+ if (latestOpenedDialogRef === null) {
215
+ latestOpenedDialogRef = dialogRef;
216
+ }
217
+ else {
218
+ if (latestOpenedDialogRef.opened < dialogRef.opened) {
219
+ latestOpenedDialogRef = dialogRef;
220
+ }
221
+ }
222
+ });
223
+ if (latestOpenedDialogRef !== null) {
224
+ //this.title.setTitle(latestOpenedDialogRef.savedTitle);
225
+ }
226
+ else {
227
+ this.title.setTitle(dialogRef.savedTitle);
228
+ }
229
+ }
230
+ }
231
+ confirm(configuration, dialogConfiguration = {}, component) {
232
+ if (typeof configuration === 'string') {
233
+ const predefinedConfirmConfiguration = this.predefinedConfirmConfigurations[configuration];
234
+ if (predefinedConfirmConfiguration === undefined) {
235
+ throw new Error('Predefined confirm configuration not found for: ' + configuration);
236
+ }
237
+ configuration = predefinedConfirmConfiguration;
238
+ }
239
+ return new Promise((resolve, reject) => {
240
+ this.open(component, {
241
+ ...dialogConfiguration,
242
+ data: {
243
+ configuration
244
+ },
245
+ ignoreKeyUp: true,
246
+ showCloseIcon: false
247
+ }).onClose.pipe(filter(value => value !== undefined)).subscribe((accepted) => {
248
+ if (accepted) {
249
+ resolve(true);
250
+ }
251
+ else {
252
+ reject(true);
253
+ }
254
+ });
255
+ });
256
+ }
257
+ async confirmAsync(configuration, dialogConfiguration = {}, component) {
258
+ return await new Promise((resolve) => {
259
+ this.confirm(configuration, dialogConfiguration, component).then(() => {
260
+ resolve(true);
261
+ }).catch(() => {
262
+ resolve(false);
263
+ });
264
+ });
265
+ }
266
+ confirmAccept(configuration, dialogConfiguration = {}, component) {
267
+ return new Promise((resolve) => {
268
+ this.confirm(configuration, dialogConfiguration, component).then(() => resolve(true)).catch(() => { });
269
+ });
270
+ }
271
+ confirmDecline(configuration, dialogConfiguration = {}, component) {
272
+ return new Promise((resolve) => {
273
+ this.confirm(configuration, dialogConfiguration, component).then(() => { }).catch(() => resolve(true));
274
+ });
275
+ }
276
+ showLoading(configuration, dialogConfiguration = {}, component) {
277
+ return this.open(component, {
278
+ ...dialogConfiguration,
279
+ showCloseIcon: false,
280
+ ignoreKeyUp: true,
281
+ data: {
282
+ configuration
283
+ }
284
+ });
285
+ }
286
+ showAlert(configuration, dialogConfiguration = {}, component) {
287
+ if (typeof configuration === 'string') {
288
+ const predefinedAlertConfiguration = this.predefinedAlertConfigurations[configuration];
289
+ if (predefinedAlertConfiguration === undefined) {
290
+ throw new Error('Predefined alert configuration not found for: ' + configuration);
291
+ }
292
+ configuration = predefinedAlertConfiguration;
293
+ }
294
+ return new Promise((resolve) => {
295
+ return this.open(component, {
296
+ ...dialogConfiguration,
297
+ data: {
298
+ configuration
299
+ },
300
+ ignoreKeyUp: true,
301
+ showCloseIcon: false
302
+ }).onClose.subscribe(() => {
303
+ resolve();
304
+ });
305
+ });
306
+ }
307
+ showModalWithButtons(configuration, dialogConfiguration = {}, component) {
308
+ return this.open(component, {
309
+ ...dialogConfiguration,
310
+ data: {
311
+ configuration
312
+ }
313
+ });
314
+ }
315
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
316
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DialogService, providedIn: 'root' }); }
317
+ }
318
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DialogService, decorators: [{
319
+ type: Injectable,
320
+ args: [{
321
+ providedIn: 'root'
322
+ }]
323
+ }], ctorParameters: function () { return []; } });
324
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2RlZm94Y29yZS9zcmMvbGliL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFDSCxjQUFjLEVBRWQsZUFBZSxFQUVmLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLFdBQVcsRUFFZCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDOztBQUs3QyxNQUFNLE9BQU8sYUFBYTtJQWN0QjtRQVpLLGFBQVEsR0FBYSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsb0NBQStCLEdBQTBDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3hHLGtDQUE2QixHQUF3QyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNsRyxzQkFBaUIsR0FBc0IsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFN0UsVUFBSyxHQUFVLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFtQixNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFeEQsWUFBTyxHQUFnRCxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2pFLGNBQVMsR0FBVyxDQUFD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Q0QsQ0FBQyxDQUFDO0lBQ0osQ0FBQzsrR0E1WFcsYUFBYTttSEFBYixhQUFhLGNBRlYsTUFBTTs7NEZBRVQsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgICBBcHBsaWNhdGlvblJlZixcclxuICAgIENvbXBvbmVudFJlZixcclxuICAgIGNyZWF0ZUNvbXBvbmVudCxcclxuICAgIEVtYmVkZGVkVmlld1JlZixcclxuICAgIGluamVjdCxcclxuICAgIEluamVjdGFibGUsXHJcbiAgICBJbmplY3RvcixcclxuICAgIFBMQVRGT1JNX0lELFxyXG4gICAgVHlwZVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBbGVydENvbmZpZ3VyYXRpb24sIERpYWxvZ0NvbmZpZ3VyYXRpb24sIENvbmZpcm1Db25maWd1cmF0aW9uLCBMb2FkaW5nQ29uZmlndXJhdGlvbiwgTW9kYWxXaXRoQnV0dG9uc0NvbmZpZ3VyYXRpb24sIFByZWRlZmluZWREaWFsb2dzLCBEaWFsb2dDb21wb25lbnRSZWZDb250YWluZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgRGlhbG9nQ29uZmlnLCBEaWFsb2dJbmplY3RvciwgRGlhbG9nUmVmIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XHJcbmltcG9ydCB7IEFMRVJUX0NPTkZJR1VSQVRJT05TLCBDRl9QUkVERUZJTkVEX0RJQUxPR1MsIENPTkZJUk1fQ09ORklHVVJBVElPTlMgfSBmcm9tICcuLi90b2tlbnMnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRGlhbG9nU2VydmljZSB7XHJcblxyXG5cdHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcclxuXHRwcml2YXRlIHByZWRlZmluZWRDb25maXJtQ29uZmlndXJhdGlvbnM6IHtba2V5OiBzdHJpbmddOiBDb25maXJtQ29uZmlndXJhdGlvbn0gPSBpbmplY3QoQ09ORklSTV9DT05GSUdVUkFUSU9OUyk7XHJcblx0cHJpdmF0ZSBwcmVkZWZpbmVkQWxlcnRDb25maWd1cmF0aW9uczoge1trZXk6IHN0cmluZ106IEFsZXJ0Q29uZmlndXJhdGlvbn0gPSBpbmplY3QoQUxFUlRfQ09ORklHVVJBVElPTlMpO1xyXG5cdHByaXZhdGUgcHJlZGVmaW5lZERpYWxvZ3M6IFByZWRlZmluZWREaWFsb2dzID0gaW5qZWN0KENGX1BSRURFRklORURfRElBTE9HUyk7XHJcblxyXG5cdHRpdGxlOiBUaXRsZSA9IGluamVjdChUaXRsZSk7XHJcblx0bWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlID0gaW5qZWN0KE1lc3NhZ2VTZXJ2aWNlKTtcclxuXHJcblx0ZGlhbG9nczogTWFwPERpYWxvZ1JlZiwgRGlhbG9nQ29tcG9uZW50UmVmQ29udGFpbmVyPiA9IG5ldyBNYXAoKTtcclxuXHRvcGVuSW5kZXg6IG51bWJlciA9IDE7XHJcblx0cGxhdGZvcm1JZDogT2JqZWN0ID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHRcdGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCAoa2V5Ym9hcmRFdmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG5cdFx0XHRcdGlmIChrZXlib2FyZEV2ZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSAnZXNjYXBlJykge1xyXG5cdFx0XHRcdFx0bGV0IGxhc3RPcGVuSW5kZXg6IG51bWJlciA9IDA7XHJcblx0XHRcdFx0XHRsZXQgbGFzdE9wZW5lZERpYWxvZ1JlZjogRGlhbG9nUmVmIHwgbnVsbCA9IG51bGw7XHJcblx0XHRcdFx0XHRmb3IgKGNvbnN0IFtkaWFsb2dSZWYsIGNmRGlhbG9nQ29tcG9uZW50UmVmQ29udGFpbmVyXSBvZiB0aGlzLmRpYWxvZ3MuZW50cmllcygpKSB7XHJcblx0XHRcdFx0XHRcdGlmIChjZkRpYWxvZ0NvbXBvbmVudFJlZkNvbnRhaW5lci5vcGVuSW5kZXggPiBsYXN0T3BlbkluZGV4KSB7XHJcblx0XHRcdFx0XHRcdFx0bGFzdE9wZW5JbmRleCA9IGNmRGlhbG9nQ29tcG9uZW50UmVmQ29udGFpbmVyLm9wZW5JbmRleDtcclxuXHRcdFx0XHRcdFx0XHRsYXN0T3BlbmVkRGlhbG9nUmVmID0gZGlhbG9nUmVmO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHJcblx0XHRcdFx0XHRpZiAobGFzdE9wZW5lZERpYWxvZ1JlZiAhPT0gbnVsbCAmJiBsYXN0T3BlbmVkRGlhbG9nUmVmLmRpYWxvZ0NvbmZpZyAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRpZiAobGFzdE9wZW5lZERpYWxvZ1JlZi5kaWFsb2dDb25maWcuaWdub3JlS2V5VXAgfHwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcclxuXHRcdFx0XHRcdFx0bGFzdE9wZW5lZERpYWxvZ1JlZi5jbG9zZSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBvcGVuUHJlZGVmaW5lZDxUID0gYW55PihuYW1lOiBzdHJpbmcsIGRpYWxvZ0NvbmZpZ3VyYXRpb246IERpYWxvZ0NvbmZpZ3VyYXRpb24gPSB7fSk6IFByb21pc2U8RGlhbG9nUmVmPFQ+PiB7XHJcblx0XHRpZiAodGhpcy5wcmVkZWZpbmVkRGlhbG9nc1tuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHRocm93IEVycm9yKCdEaWFsb2cgd2l0aCBuYW1lIFwiJyArIG5hbWUgKyAnXCIgbm90IGZvdW5kIScpO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgcHJlZGVmaW5lZERpYWxvZyA9IHRoaXMucHJlZGVmaW5lZERpYWxvZ3NbbmFtZV07XHJcblx0XHRpZiAodHlwZW9mIHByZWRlZmluZWREaWFsb2cgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMub3BlbkltcG9ydChwcmVkZWZpbmVkRGlhbG9nLCBkaWFsb2dDb25maWd1cmF0aW9uKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzLm9wZW5JbXBvcnQocHJlZGVmaW5lZERpYWxvZy5jb21wb25lbnQsIHsuLi5wcmVkZWZpbmVkRGlhbG9nLmNvbmZpZ3VyYXRpb24sIC4uLmRpYWxvZ0NvbmZpZ3VyYXRpb259KTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9wZW5JbXBvcnQ8VCA9IGFueT4oY29tcG9uZW50OiAoKSA9PiBQcm9taXNlPFR5cGU8YW55Pj4sIGRpYWxvZ0NvbmZpZ3VyYXRpb246IERpYWxvZ0NvbmZpZ3VyYXRpb24gPSB7fSk6IFByb21pc2U8RGlhbG9nUmVmPFQ+PiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcclxuXHRcdFx0cmVzb2x2ZSh0aGlzLm9wZW48VD4oYXdhaXQgY29tcG9uZW50KCksIGRpYWxvZ0NvbmZpZ3VyYXRpb24pKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcbiAgICBvcGVuPFQgPSBhbnk+KGNvbXBvbmVudDogVHlwZTxhbnk+LCBkaWFsb2dDb25maWd1cmF0aW9uOiBEaWFsb2dDb25maWd1cmF0aW9uID0ge30pOiBEaWFsb2dSZWY8VD4ge1xyXG5cclxuXHRcdGZvciAobGV0IGRpYWxvZyBvZiB0aGlzLmRpYWxvZ3MuZW50cmllcygpKSB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHQoZGlhbG9nQ29uZmlndXJhdGlvbi5zaW5nbGUgJiYgZGlhbG9nWzFdLmNvbXBvbmVudFJlZi5jb21wb25lbnRUeXBlLm5hbWUgPT09IGNvbXBvbmVudC5uYW1lKSB8fFxyXG5cdFx0XHRcdChkaWFsb2dbMF0uZGlhbG9nQ29uZmlnICE9PSBudWxsICYmIGRpYWxvZ1swXS5kaWFsb2dDb25maWcuc2luZ2xlICYmIGRpYWxvZ1sxXS5jb21wb25lbnRSZWYuY29tcG9uZW50VHlwZS5uYW1lID09PSBjb21wb25lbnQubmFtZSlcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0cmV0dXJuIGRpYWxvZ1swXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuICAgICAgICBjb25zdCBkaWFsb2dDb25maWc6IERpYWxvZ0NvbmZpZyA9IHRoaXMuY3JlYXRlRGlhbG9nQ29uZmlnKGRpYWxvZ0NvbmZpZ3VyYXRpb24pO1xyXG5cclxuXHRcdGlmICghZGlhbG9nQ29uZmlnLmtlZXBBY3RpdmVFbGVtZW50KSB7XHJcblx0XHRcdGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuXHRcdFx0XHRkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IERpYWxvZ1JlZjxUPiA9IHRoaXMuYXBwZW5kVG9Cb2R5KGNvbXBvbmVudCwgZGlhbG9nQ29uZmlnKTtcclxuXHRcdGRpYWxvZ1JlZi5tZXNzYWdlU2VydmljZSA9IHRoaXMubWVzc2FnZVNlcnZpY2U7XHJcblx0XHRkaWFsb2dSZWYuZGlhbG9nQ29uZmlnID0gZGlhbG9nQ29uZmlnO1xyXG5cclxuXHRcdHRoaXMuY2hhbmdlQW5kU3RvcmVUaXRsZShkaWFsb2dSZWYpO1xyXG5cclxuICAgICAgICByZXR1cm4gZGlhbG9nUmVmO1xyXG4gICAgfVxyXG5cclxuXHRjaGFuZ2VBbmRTdG9yZVRpdGxlKGRpYWxvZ1JlZjogRGlhbG9nUmVmKTogdm9pZCB7XHJcblx0XHRkaWFsb2dSZWYuc2F2ZWRUaXRsZSA9IHRoaXMudGl0bGUuZ2V0VGl0bGUoKTtcclxuXHRcdGlmIChkaWFsb2dSZWYuZGlhbG9nQ29uZmlnICE9PSBudWxsICYmIGRpYWxvZ1JlZi5kaWFsb2dDb25maWcudGl0bGUgIT09IG51bGwpIHtcclxuXHRcdFx0dGhpcy50aXRsZS5zZXRUaXRsZShkaWFsb2dSZWYuZGlhbG9nQ29uZmlnLnRpdGxlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG4gICAgY3JlYXRlRGlhbG9nQ29uZmlnKGRpYWxvZ0NvbmZpZ3VyYXRpb246IERpYWxvZ0NvbmZpZ3VyYXRpb24pOiBEaWFsb2dDb25maWcge1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ0NvbmZpZzogRGlhbG9nQ29uZmlnID0gbmV3IERpYWxvZ0NvbmZpZygpO1xyXG4gICAgICAgIGlmIChkaWFsb2dDb25maWd1cmF0aW9uLnNob3dDbG9zZUljb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkaWFsb2dDb25maWcuc2hvd0Nsb3NlSWNvbiA9IGRpYWxvZ0NvbmZpZ3VyYXRpb24uc2hvd0Nsb3NlSWNvbjtcclxuICAgICAgICB9XHJcblx0XHRpZiAoZGlhbG9nQ29uZmlndXJhdGlvbi5iZWZvcmVDbG9zZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbmZpZy5iZWZvcmVDbG9zZSA9IGRpYWxvZ0NvbmZpZ3VyYXRpb24uYmVmb3JlQ2xvc2U7XHJcbiAgICAgICAgfVxyXG5cdFx0aWYgKGRpYWxvZ0NvbmZpZ3VyYXRpb24uaWdub3JlS2V5VXAgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkaWFsb2dDb25maWcuaWdub3JlS2V5VXAgPSBkaWFsb2dDb25maWd1cmF0aW9uLmlnbm9yZUtleVVwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGlhbG9nQ29uZmlndXJhdGlvbi5kYXRhICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgZGlhbG9nQ29uZmlnLmRhdGEgPSBkaWFsb2dDb25maWd1cmF0aW9uLmRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaWFsb2dDb25maWd1cmF0aW9uLm5vUGFkZGluZyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbmZpZy5ub1BhZGRpbmcgPSBkaWFsb2dDb25maWd1cmF0aW9uLm5vUGFkZGluZztcclxuICAgICAgICB9XHJcblx0XHRpZiAoZGlhbG9nQ29uZmlndXJhdGlvbi5rZWVwQWN0aXZlRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGRpYWxvZ0NvbmZpZy5rZWVwQWN0aXZlRWxlbWVudCA9IGRpYWxvZ0NvbmZpZ3VyYXRpb24ua2VlcEFjdGl2ZUVsZW1lbnQ7XHJcblx0XHR9XHJcblx0XHRpZiAoZGlhbG9nQ29uZmlndXJhdGlvbi5jb250YWluZXJDbGFzc2VzICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0ZGlhbG9nQ29uZmlnLmNvbnRhaW5lckNsYXNzZXMgPSBkaWFsb2dDb25maWd1cmF0aW9uLmNvbnRhaW5lckNsYXNzZXM7XHJcblx0XHR9XHJcblx0XHRpZiAoZGlhbG9nQ29uZmlndXJhdGlvbi5kaWFsb2dDbGFzc2VzICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0ZGlhbG9nQ29uZmlnLmRpYWxvZ0NsYXNzZXMgPSBkaWFsb2dDb25maWd1cmF0aW9uLmRpYWxvZ0NsYXNzZXM7XHJcblx0XHR9XHJcblx0XHRpZiAoZGlhbG9nQ29uZmlndXJhdGlvbi50aXRsZSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGRpYWxvZ0NvbmZpZy50aXRsZSA9IGRpYWxvZ0NvbmZpZ3VyYXRpb24udGl0bGU7XHJcblx0XHR9XHJcblx0XHRpZiAoZGlhbG9nQ29uZmlndXJhdGlvbi5jb250ZW50RWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGRpYWxvZ0NvbmZpZy5jb250ZW50RWxlbWVudCA9IGRpYWxvZ0NvbmZpZ3VyYXRpb24uY29udGVudEVsZW1lbnQ7XHJcblx0XHR9XHJcblx0XHRpZiAoZGlhbG9nQ29uZmlndXJhdGlvbi5zaW5nbGUgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRkaWFsb2dDb25maWcuc2luZ2xlID0gZGlhbG9nQ29uZmlndXJhdGlvbi5zaW5nbGU7XHJcblx0XHR9XHJcblx0XHRpZiAoZGlhbG9nQ29uZmlndXJhdGlvbi53aWR0aCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGRpYWxvZ0NvbmZpZy53aWR0aCA9IGRpYWxvZ0NvbmZpZ3VyYXRpb24ud2lkdGg7XHJcblx0XHR9XHJcblx0XHRpZiAoZGlhbG9nQ29uZmlndXJhdGlvbi5oZWlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRkaWFsb2dDb25maWcuaGVpZ2h0ID0gZGlhbG9nQ29uZmlndXJhdGlvbi5oZWlnaHQ7XHJcblx0XHR9XHJcbiAgICAgICAgcmV0dXJuIGRpYWxvZ0NvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRUb0JvZHkoY29tcG9uZW50OiBUeXBlPGFueT4sIGRpYWxvZ0NvbmZpZzogRGlhbG9nQ29uZmlnKTogRGlhbG9nUmVmIHtcclxuXHJcblx0XHRjb25zdCBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmID0gdGhpcy5pbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpO1xyXG5cclxuICAgICAgICAvLyBDUkVBVEUgSU5KRUNUSU9OIFRPS0VOU1xyXG4gICAgICAgIGNvbnN0IHRva2VuczogV2Vha01hcDxhbnksIGFueT4gPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuICAgICAgICAvLyBDUkVBVEUgRElBTE9HIENPTkZJR1VSQVRJT04gQ0xBU1NcclxuICAgICAgICB0b2tlbnMuc2V0KERpYWxvZ0NvbmZpZywgZGlhbG9nQ29uZmlnKTtcclxuXHJcbiAgICAgICAgLy8gQ1JFQVRFIERJQUxPRyBSRUZFUkVOQ0UgQ0xBU1NcclxuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IERpYWxvZ1JlZiA9IG5ldyBEaWFsb2dSZWYoKTtcclxuICAgICAgICB0b2tlbnMuc2V0KERpYWxvZ1JlZiwgZGlhbG9nUmVmKTtcclxuXHJcbiAgICAgICAgLy8gTElTVEVOIE9OIERJQUxPRyBDTE9TRVxyXG4gICAgICAgIGNvbnN0IGNsb3NlU3ViOiBTdWJzY3JpcHRpb24gPSBkaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZyb21Cb2R5KGRpYWxvZ1JlZik7XHJcbiAgICAgICAgICAgIGNsb3NlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENSRUFURSBDT01QT05FTlQgUkVGXHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IGNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHtcclxuXHRcdFx0ZW52aXJvbm1lbnRJbmplY3RvcjogYXBwUmVmLmluamVjdG9yLFxyXG5cdFx0XHRlbGVtZW50SW5qZWN0b3I6IG5ldyBEaWFsb2dJbmplY3Rvcih0aGlzLmluamVjdG9yLCB0b2tlbnMpXHJcblx0XHR9KTtcclxuXHJcbiAgICAgICAgLy8gQVRUQUNIIFZJRVcgVE8gQU5HVUxBUlxyXG4gICAgICAgIGFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XHJcblxyXG4gICAgICAgIC8vIENSRUFURSBESUFMT0cgQ09OVEFJTkVSIEVMRU1FTlRcclxuICAgICAgICBjb25zdCBkaWFsb2dDb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZGlhbG9nQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2NmLWRpYWxvZy1jb250YWluZXInKTtcclxuXHRcdGlmIChkaWFsb2dDb25maWcuY29udGFpbmVyQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGRpYWxvZ0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKC4uLmRpYWxvZ0NvbmZpZy5jb250YWluZXJDbGFzc2VzKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBBUFBFTkQgRE9NIEVMRU1FTlQgVE8gRElBTE9HXHJcblx0XHRjb25zdCBjaGlsZERvbUVsZW0gPSAoY29tcG9uZW50UmVmLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHRjaGlsZERvbUVsZW0uY2xhc3NMaXN0LmFkZCgnY2YtZGlhbG9nJyk7XHJcblx0XHRcclxuXHRcdGlmIChkaWFsb2dDb25maWcud2lkdGggIT09IG51bGwpIHtcclxuXHRcdFx0Y2hpbGREb21FbGVtLnN0eWxlLndpZHRoID0gZGlhbG9nQ29uZmlnLndpZHRoO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGRpYWxvZ0NvbmZpZy5oZWlnaHQgIT09IG51bGwpIHtcclxuXHRcdFx0Y2hpbGREb21FbGVtLnN0eWxlLmhlaWdodCA9IGRpYWxvZ0NvbmZpZy5oZWlnaHQ7XHJcblx0XHR9XHJcblx0XHRpZiAoZGlhbG9nQ29uZmlnLm5vUGFkZGluZykge1xyXG4gICAgICAgICAgICBjaGlsZERvbUVsZW0uY2xhc3NMaXN0LmFkZCgnbm8tcGFkZGluZycpO1xyXG4gICAgICAgIH1cclxuXHRcdGlmIChkaWFsb2dDb25maWcuZGlhbG9nQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGNoaWxkRG9tRWxlbS5jbGFzc0xpc3QuYWRkKC4uLmRpYWxvZ0NvbmZpZy5kaWFsb2dDbGFzc2VzKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoZGlhbG9nQ29uZmlnLmNvbnRlbnRFbGVtZW50ICE9PSBudWxsKSB7XHJcblx0XHRcdGNoaWxkRG9tRWxlbS5hcHBlbmRDaGlsZChkaWFsb2dDb25maWcuY29udGVudEVsZW1lbnQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGRpYWxvZ0NvbnRhaW5lci5hcHBlbmRDaGlsZChjaGlsZERvbUVsZW0pO1xyXG5cclxuICAgICAgICAvLyBDTE9TRUFCTEU/IEFQUEVORCBCVVRUT05cclxuICAgICAgICBpZiAoZGlhbG9nQ29uZmlnLnNob3dDbG9zZUljb24pIHtcclxuICAgICAgICAgICAgY29uc3QgY2xvc2VFbGVtZW50OiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICBjbG9zZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi5bJ2NmLWRpYWxvZy1jbG9zZScsICdyZW1peGljb24nLCAnY2xvc2UtbGluZSddKTtcclxuICAgICAgICAgICAgY2xvc2VFbGVtZW50Lm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkaWFsb2dSZWYuY2xvc2UoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY2hpbGREb21FbGVtLmFwcGVuZENoaWxkKGNsb3NlRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBUFBFTkQgRElBTE9HIENPTlRBSU5FUiBUTyBCT0RZXHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaWFsb2dDb250YWluZXIpO1xyXG5cclxuICAgICAgICB0aGlzLmRpYWxvZ3Muc2V0KGRpYWxvZ1JlZiwge1xyXG4gICAgICAgICAgICBjb21wb25lbnRSZWYsXHJcbiAgICAgICAgICAgIGNvbnRhaW5lcjogZGlhbG9nQ29udGFpbmVyLFxyXG5cdFx0XHRvcGVuSW5kZXg6IHRoaXMub3BlbkluZGV4IFxyXG4gICAgICAgIH0pO1xyXG5cclxuXHRcdHRoaXMub3BlbkluZGV4Kys7XHJcblxyXG4gICAgICAgIHJldHVybiBkaWFsb2dSZWY7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRnJvbUJvZHkoZGlhbG9nUmVmOiBEaWFsb2dSZWYpOiB2b2lkIHtcclxuXHJcblx0XHRjb25zdCBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmID0gdGhpcy5pbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpO1xyXG5cclxuICAgICAgICBpZiAoIWRpYWxvZ1JlZiB8fCAhdGhpcy5kaWFsb2dzLmhhcyhkaWFsb2dSZWYpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGlhbG9nQ29tcG9uZW50UmVmQ29udGFpbmVyOiBEaWFsb2dDb21wb25lbnRSZWZDb250YWluZXIgfCB1bmRlZmluZWQgPSB0aGlzLmRpYWxvZ3MuZ2V0KGRpYWxvZ1JlZik7XHJcbiAgICAgICAgaWYgKGRpYWxvZ0NvbXBvbmVudFJlZkNvbnRhaW5lciA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHRcdFxyXG4gICAgICAgIGFwcFJlZi5kZXRhY2hWaWV3KGRpYWxvZ0NvbXBvbmVudFJlZkNvbnRhaW5lci5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG5cclxuICAgICAgICBpZiAoZGlhbG9nQ29tcG9uZW50UmVmQ29udGFpbmVyLmNvbnRhaW5lciAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBkaWFsb2dDb21wb25lbnRSZWZDb250YWluZXIuY29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkaWFsb2dDb21wb25lbnRSZWZDb250YWluZXIuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLmRpYWxvZ3MuZGVsZXRlKGRpYWxvZ1JlZik7XHJcblxyXG5cdFx0aWYgKHRoaXMuZGlhbG9ncy5zaXplID09PSAwKSB7XHJcblx0XHRcdHRoaXMub3BlbkluZGV4ID0gMTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBSZXN0b3JlIHRpdGxlXHJcblx0XHRpZiAodGhpcy5kaWFsb2dzLnNpemUgPT09IDApIHtcclxuXHRcdFx0dGhpcy50aXRsZS5zZXRUaXRsZShkaWFsb2dSZWYuc2F2ZWRUaXRsZSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRsZXQgbGF0ZXN0T3BlbmVkRGlhbG9nUmVmOiBEaWFsb2dSZWYgfCBudWxsID0gbnVsbDtcclxuXHRcdFx0dGhpcy5kaWFsb2dzLmZvckVhY2goKF8sIGRpYWxvZ1JlZjogRGlhbG9nUmVmKSA9PiB7XHJcblx0XHRcdFx0aWYgKGxhdGVzdE9wZW5lZERpYWxvZ1JlZiA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0bGF0ZXN0T3BlbmVkRGlhbG9nUmVmID0gZGlhbG9nUmVmO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRpZiAobGF0ZXN0T3BlbmVkRGlhbG9nUmVmLm9wZW5lZCA8IGRpYWxvZ1JlZi5vcGVuZWQpIHtcclxuXHRcdFx0XHRcdFx0bGF0ZXN0T3BlbmVkRGlhbG9nUmVmID0gZGlhbG9nUmVmO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdGlmIChsYXRlc3RPcGVuZWREaWFsb2dSZWYgIT09IG51bGwpIHtcclxuXHRcdFx0XHQvL3RoaXMudGl0bGUuc2V0VGl0bGUobGF0ZXN0T3BlbmVkRGlhbG9nUmVmLnNhdmVkVGl0bGUpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMudGl0bGUuc2V0VGl0bGUoZGlhbG9nUmVmLnNhdmVkVGl0bGUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcbiAgICB9XHJcblxyXG5cdGNvbmZpcm0oXHJcblx0XHRjb25maWd1cmF0aW9uOiBDb25maXJtQ29uZmlndXJhdGlvbiB8IHN0cmluZyxcclxuXHRcdGRpYWxvZ0NvbmZpZ3VyYXRpb246IERpYWxvZ0NvbmZpZ3VyYXRpb24gPSB7fSxcclxuXHRcdGNvbXBvbmVudDogVHlwZTxhbnk+XHJcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XHJcblx0XHRpZiAodHlwZW9mIGNvbmZpZ3VyYXRpb24gPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdGNvbnN0IHByZWRlZmluZWRDb25maXJtQ29uZmlndXJhdGlvbjogQ29uZmlybUNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQgPSB0aGlzLnByZWRlZmluZWRDb25maXJtQ29uZmlndXJhdGlvbnNbY29uZmlndXJhdGlvbl07XHJcblx0XHRcdGlmIChwcmVkZWZpbmVkQ29uZmlybUNvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignUHJlZGVmaW5lZCBjb25maXJtIGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kIGZvcjogJyArIGNvbmZpZ3VyYXRpb24pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbmZpZ3VyYXRpb24gPSBwcmVkZWZpbmVkQ29uZmlybUNvbmZpZ3VyYXRpb247XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cdFx0XHR0aGlzLm9wZW4oY29tcG9uZW50LCB7XHJcblx0XHRcdFx0Li4uZGlhbG9nQ29uZmlndXJhdGlvbixcclxuXHRcdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0XHRjb25maWd1cmF0aW9uXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRpZ25vcmVLZXlVcDogdHJ1ZSxcclxuXHRcdFx0XHRzaG93Q2xvc2VJY29uOiBmYWxzZVxyXG5cdFx0XHR9KS5vbkNsb3NlLnBpcGUoZmlsdGVyKHZhbHVlID0+IHZhbHVlICE9PSB1bmRlZmluZWQpKS5zdWJzY3JpYmUoKGFjY2VwdGVkOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0aWYgKGFjY2VwdGVkKSB7XHJcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZWplY3QodHJ1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcbiAgICBhc3luYyBjb25maXJtQXN5bmMoXHJcblx0XHRjb25maWd1cmF0aW9uOiBDb25maXJtQ29uZmlndXJhdGlvbiB8IHN0cmluZyxcclxuXHRcdGRpYWxvZ0NvbmZpZ3VyYXRpb246IERpYWxvZ0NvbmZpZ3VyYXRpb24gPSB7fSxcclxuXHRcdGNvbXBvbmVudDogVHlwZTxhbnk+XHJcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlybShjb25maWd1cmF0aW9uLCBkaWFsb2dDb25maWd1cmF0aW9uLCBjb21wb25lbnQpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cdFxyXG5cdGNvbmZpcm1BY2NlcHQoXHJcblx0XHRjb25maWd1cmF0aW9uOiBDb25maXJtQ29uZmlndXJhdGlvbiB8IHN0cmluZyxcclxuXHRcdGRpYWxvZ0NvbmZpZ3VyYXRpb246IERpYWxvZ0NvbmZpZ3VyYXRpb24gPSB7fSxcclxuXHRcdGNvbXBvbmVudDogVHlwZTxhbnk+XHJcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuXHRcdFx0dGhpcy5jb25maXJtKGNvbmZpZ3VyYXRpb24sIGRpYWxvZ0NvbmZpZ3VyYXRpb24sIGNvbXBvbmVudCkudGhlbigoKSA9PiByZXNvbHZlKHRydWUpKS5jYXRjaCgoKSA9PiB7fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0XHJcblx0Y29uZmlybURlY2xpbmUoXHJcblx0XHRjb25maWd1cmF0aW9uOiBDb25maXJtQ29uZmlndXJhdGlvbiB8IHN0cmluZyxcclxuXHRcdGRpYWxvZ0NvbmZpZ3VyYXRpb246IERpYWxvZ0NvbmZpZ3VyYXRpb24gPSB7fSxcclxuXHRcdGNvbXBvbmVudDogVHlwZTxhbnk+XHJcblx0KTogUHJvbWlzZTxib29sZWFuPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuXHRcdFx0dGhpcy5jb25maXJtKGNvbmZpZ3VyYXRpb24sIGRpYWxvZ0NvbmZpZ3VyYXRpb24sIGNvbXBvbmVudCkudGhlbigoKSA9PiB7fSkuY2F0Y2goKCkgPT4gcmVzb2x2ZSh0cnVlKSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHNob3dMb2FkaW5nKFxyXG5cdFx0Y29uZmlndXJhdGlvbjogTG9hZGluZ0NvbmZpZ3VyYXRpb24sXHJcblx0XHRkaWFsb2dDb25maWd1cmF0aW9uOiBEaWFsb2dDb25maWd1cmF0aW9uID0ge30sXHJcblx0XHRjb21wb25lbnQ6IFR5cGU8YW55PlxyXG5cdCk6IERpYWxvZ1JlZiB7XHJcblx0XHRyZXR1cm4gdGhpcy5vcGVuKGNvbXBvbmVudCwge1xyXG5cdFx0XHQuLi5kaWFsb2dDb25maWd1cmF0aW9uLFxyXG5cdFx0XHRzaG93Q2xvc2VJY29uOiBmYWxzZSxcclxuXHRcdFx0aWdub3JlS2V5VXA6IHRydWUsXHJcblx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRjb25maWd1cmF0aW9uXHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0c2hvd0FsZXJ0KFxyXG5cdFx0Y29uZmlndXJhdGlvbjogQWxlcnRDb25maWd1cmF0aW9uIHwgc3RyaW5nLFxyXG5cdFx0ZGlhbG9nQ29uZmlndXJhdGlvbjogRGlhbG9nQ29uZmlndXJhdGlvbiA9IHt9LFxyXG5cdFx0Y29tcG9uZW50OiBUeXBlPGFueT5cclxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGlmICh0eXBlb2YgY29uZmlndXJhdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0Y29uc3QgcHJlZGVmaW5lZEFsZXJ0Q29uZmlndXJhdGlvbjogQWxlcnRDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5wcmVkZWZpbmVkQWxlcnRDb25maWd1cmF0aW9uc1tjb25maWd1cmF0aW9uXTtcclxuXHRcdFx0aWYgKHByZWRlZmluZWRBbGVydENvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignUHJlZGVmaW5lZCBhbGVydCBjb25maWd1cmF0aW9uIG5vdCBmb3VuZCBmb3I6ICcgKyBjb25maWd1cmF0aW9uKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25maWd1cmF0aW9uID0gcHJlZGVmaW5lZEFsZXJ0Q29uZmlndXJhdGlvbjtcclxuXHRcdH1cclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5vcGVuKGNvbXBvbmVudCwge1xyXG5cdFx0XHRcdC4uLmRpYWxvZ0NvbmZpZ3VyYXRpb24sXHJcblx0XHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdFx0Y29uZmlndXJhdGlvblxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0aWdub3JlS2V5VXA6IHRydWUsXHJcblx0XHRcdFx0c2hvd0Nsb3NlSWNvbjogZmFsc2VcclxuXHRcdFx0fSkub25DbG9zZS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHNob3dNb2RhbFdpdGhCdXR0b25zKFxyXG5cdFx0Y29uZmlndXJhdGlvbjogTW9kYWxXaXRoQnV0dG9uc0NvbmZpZ3VyYXRpb24sXHJcblx0XHRkaWFsb2dDb25maWd1cmF0aW9uOiBEaWFsb2dDb25maWd1cmF0aW9uID0ge30sXHJcblx0XHRjb21wb25lbnQ6IFR5cGU8YW55PlxyXG5cdCk6IERpYWxvZ1JlZiB7XHJcblx0XHRyZXR1cm4gdGhpcy5vcGVuKGNvbXBvbmVudCwge1xyXG5cdFx0XHQuLi5kaWFsb2dDb25maWd1cmF0aW9uLFxyXG5cdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0Y29uZmlndXJhdGlvblxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuIl19
@@ -0,0 +1,5 @@
1
+ export * from './dialog.service';
2
+ export * from './message.service';
3
+ export * from './api.service';
4
+ export * from './logger.service';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2RlZm94Y29yZS9zcmMvbGliL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kaWFsb2cuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnZS5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9hcGkuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbG9nZ2VyLnNlcnZpY2UnO1xyXG4iXX0=
@@ -0,0 +1,62 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { LogLevel } from '../interfaces';
3
+ import { LOG_LEVEL } from '../tokens';
4
+ import * as i0 from "@angular/core";
5
+ export class LoggerService {
6
+ constructor() {
7
+ this._logLevel = inject(LOG_LEVEL);
8
+ this.logLevelColors = [
9
+ '',
10
+ 'background-color: #D2BDF3; padding: 5px 10px;',
11
+ 'background-color: #A2DDFF; padding: 5px 10px;',
12
+ 'background-color: #FFD5C5; padding: 5px 10px;',
13
+ 'background-color: #EA4331; color: #FFFFFF; padding: 5px 10px;',
14
+ 'background-color: #F71900; color: #FFFFFF; padding: 5px 10px;',
15
+ ''
16
+ ];
17
+ }
18
+ debug(log, group = false) {
19
+ this.log({ log, logLevel: LogLevel.Debug, group });
20
+ }
21
+ info(log, group = false) {
22
+ this.log({ log, logLevel: LogLevel.Info, group });
23
+ }
24
+ warn(log, group = false) {
25
+ this.log({ log, logLevel: LogLevel.Warn, group });
26
+ }
27
+ error(log, group = false) {
28
+ this.log({ log, logLevel: LogLevel.Error, group });
29
+ }
30
+ fatal(log, group = false) {
31
+ this.log({ log, logLevel: LogLevel.Fatal, group });
32
+ }
33
+ groupEnd() {
34
+ console.groupEnd();
35
+ }
36
+ log(configuration) {
37
+ if (this._logLevel === null || this._logLevel === LogLevel.Off || this._logLevel > configuration.logLevel) {
38
+ return;
39
+ }
40
+ if (configuration.group) {
41
+ console.group(configuration.log);
42
+ }
43
+ else {
44
+ console.log('%c' + configuration.log, this.logLevelColors[configuration.logLevel]);
45
+ }
46
+ }
47
+ set logLevel(logLevel) {
48
+ this._logLevel = logLevel;
49
+ }
50
+ get logLevel() {
51
+ return this._logLevel;
52
+ }
53
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LoggerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
54
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LoggerService, providedIn: 'root' }); }
55
+ }
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LoggerService, decorators: [{
57
+ type: Injectable,
58
+ args: [{
59
+ providedIn: 'root'
60
+ }]
61
+ }] });
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2RlZm94Y29yZS9zcmMvbGliL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7QUFLdEMsTUFBTSxPQUFPLGFBQWE7SUFIMUI7UUFLUyxjQUFTLEdBQW9CLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUvQyxtQkFBYyxHQUFhO1lBQ2xDLEVBQUU7WUFDRiwrQ0FBK0M7WUFDL0MsK0NBQStDO1lBQy9DLCtDQUErQztZQUMvQywrREFBK0Q7WUFDL0QsK0RBQStEO1lBQy9ELEVBQUU7U0FDRixDQUFDO0tBZ0RGO0lBOUNPLEtBQUssQ0FBQyxHQUFRLEVBQUUsUUFBaUIsS0FBSztRQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVNLElBQUksQ0FBQyxHQUFRLEVBQUUsUUFBaUIsS0FBSztRQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVNLElBQUksQ0FBQyxHQUFRLEVBQUUsUUFBaUIsS0FBSztRQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFRLEVBQUUsUUFBaUIsS0FBSztRQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFRLEVBQUUsUUFBaUIsS0FBSztRQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVNLFFBQVE7UUFDZCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVPLEdBQUcsQ0FBQyxhQUlYO1FBQ0EsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFO1lBQzFHLE9BQU87U0FDUDtRQUNELElBQUksYUFBYSxDQUFDLEtBQUssRUFBRTtZQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNqQzthQUFNO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ25GO0lBQ0YsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLFFBQXlCO1FBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDWCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDdkIsQ0FBQzsrR0EzRFcsYUFBYTttSEFBYixhQUFhLGNBRmIsTUFBTTs7NEZBRU4sYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgTE9HX0xFVkVMIH0gZnJvbSAnLi4vdG9rZW5zJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuXHRwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIExvZ2dlclNlcnZpY2Uge1xyXG5cclxuXHRwcml2YXRlIF9sb2dMZXZlbDogTG9nTGV2ZWwgfCBudWxsID0gaW5qZWN0KExPR19MRVZFTCk7XHJcblxyXG5cdHByaXZhdGUgbG9nTGV2ZWxDb2xvcnM6IHN0cmluZ1tdID0gW1xyXG5cdFx0JycsXHJcblx0XHQnYmFja2dyb3VuZC1jb2xvcjogI0QyQkRGMzsgcGFkZGluZzogNXB4IDEwcHg7JyxcclxuXHRcdCdiYWNrZ3JvdW5kLWNvbG9yOiAjQTJEREZGOyBwYWRkaW5nOiA1cHggMTBweDsnLFxyXG5cdFx0J2JhY2tncm91bmQtY29sb3I6ICNGRkQ1QzU7IHBhZGRpbmc6IDVweCAxMHB4OycsXHJcblx0XHQnYmFja2dyb3VuZC1jb2xvcjogI0VBNDMzMTsgY29sb3I6ICNGRkZGRkY7IHBhZGRpbmc6IDVweCAxMHB4OycsXHJcblx0XHQnYmFja2dyb3VuZC1jb2xvcjogI0Y3MTkwMDsgY29sb3I6ICNGRkZGRkY7IHBhZGRpbmc6IDVweCAxMHB4OycsXHJcblx0XHQnJ1xyXG5cdF07XHJcblxyXG5cdHB1YmxpYyBkZWJ1Zyhsb2c6IGFueSwgZ3JvdXA6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG5cdFx0dGhpcy5sb2coeyBsb2csIGxvZ0xldmVsOiBMb2dMZXZlbC5EZWJ1ZywgZ3JvdXAgfSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgaW5mbyhsb2c6IGFueSwgZ3JvdXA6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG5cdFx0dGhpcy5sb2coeyBsb2csIGxvZ0xldmVsOiBMb2dMZXZlbC5JbmZvLCBncm91cCB9KTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyB3YXJuKGxvZzogYW55LCBncm91cDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcblx0XHR0aGlzLmxvZyh7IGxvZywgbG9nTGV2ZWw6IExvZ0xldmVsLldhcm4sIGdyb3VwIH0pO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGVycm9yKGxvZzogYW55LCBncm91cDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcblx0XHR0aGlzLmxvZyh7IGxvZywgbG9nTGV2ZWw6IExvZ0xldmVsLkVycm9yLCBncm91cCB9KTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBmYXRhbChsb2c6IGFueSwgZ3JvdXA6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG5cdFx0dGhpcy5sb2coeyBsb2csIGxvZ0xldmVsOiBMb2dMZXZlbC5GYXRhbCwgZ3JvdXAgfSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZ3JvdXBFbmQoKTogdm9pZCB7XHJcblx0XHRjb25zb2xlLmdyb3VwRW5kKCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGxvZyhjb25maWd1cmF0aW9uOiB7XHJcblx0XHRsb2c6IGFueSxcclxuXHRcdGxvZ0xldmVsOiBMb2dMZXZlbCxcclxuXHRcdGdyb3VwOiBib29sZWFuXHJcblx0fSk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuX2xvZ0xldmVsID09PSBudWxsIHx8IHRoaXMuX2xvZ0xldmVsID09PSBMb2dMZXZlbC5PZmYgfHwgdGhpcy5fbG9nTGV2ZWwgPiBjb25maWd1cmF0aW9uLmxvZ0xldmVsKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGlmIChjb25maWd1cmF0aW9uLmdyb3VwKSB7XHJcblx0XHRcdGNvbnNvbGUuZ3JvdXAoY29uZmlndXJhdGlvbi5sb2cpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc29sZS5sb2coJyVjJyArIGNvbmZpZ3VyYXRpb24ubG9nLCB0aGlzLmxvZ0xldmVsQ29sb3JzW2NvbmZpZ3VyYXRpb24ubG9nTGV2ZWxdKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHNldCBsb2dMZXZlbChsb2dMZXZlbDogTG9nTGV2ZWwgfCBudWxsKSB7XHJcblx0XHR0aGlzLl9sb2dMZXZlbCA9IGxvZ0xldmVsO1xyXG5cdH1cclxuXHJcblx0Z2V0IGxvZ0xldmVsKCk6IExvZ0xldmVsIHwgbnVsbCB7XHJcblx0XHRyZXR1cm4gdGhpcy5fbG9nTGV2ZWw7XHJcblx0fVxyXG59XHJcbiJdfQ==