@sumaris-net/ngx-components 2.7.6 → 2.8.0-rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/doc/changelog.md +8 -0
- package/esm2022/public_api.mjs +7 -3
- package/esm2022/src/app/admin/users/users.mjs +5 -3
- package/esm2022/src/app/core/account/new-token.modal.mjs +4 -4
- package/esm2022/src/app/core/auth/auth.form.mjs +2 -2
- package/esm2022/src/app/core/core.testing.module.mjs +2 -2
- package/esm2022/src/app/core/form/entity/editor.class.mjs +33 -487
- package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +14 -26
- package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +5 -4
- package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +194 -0
- package/esm2022/src/app/core/form/form-container.class.mjs +312 -0
- package/esm2022/src/app/core/form/form.class.mjs +27 -36
- package/esm2022/src/app/core/form/form.utils.mjs +1 -1
- package/esm2022/src/app/core/menu/testing/menu.testing.mjs +2 -2
- package/esm2022/src/app/core/services/model/settings.model.mjs +2 -1
- package/esm2022/src/app/core/settings/settings.page.mjs +5 -9
- package/esm2022/src/app/core/table/table.class.mjs +9 -5
- package/esm2022/src/app/core/table/table.module.mjs +16 -3
- package/esm2022/src/app/core/table/table.pipes.mjs +74 -0
- package/esm2022/src/app/core/table/testing/table.testing.mjs +39 -17
- package/esm2022/src/app/core/table/testing/table2.testing.mjs +40 -22
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +3 -3
- package/esm2022/src/app/shared/pipes/form.pipes.mjs +10 -10
- package/esm2022/src/app/shared/pipes/pipes.module.mjs +28 -3
- package/esm2022/src/app/shared/pipes/selection.pipes.mjs +176 -0
- package/esm2022/src/app/shared/validator/validators.mjs +3 -2
- package/fesm2022/sumaris-net.ngx-components.mjs +655 -321
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +6 -2
- package/src/app/core/account/new-token.modal.d.ts +1 -1
- package/src/app/core/form/entity/editor.class.d.ts +18 -177
- package/src/app/core/form/entity/entity-editor-modal.class.d.ts +9 -12
- package/src/app/core/form/entity/entity-editor.class.d.ts +10 -6
- package/src/app/core/form/entity/tab-editor.class.d.ts +70 -0
- package/src/app/core/form/form-container.class.d.ts +123 -0
- package/src/app/core/form/form.class.d.ts +11 -21
- package/src/app/core/form/form.utils.d.ts +38 -23
- package/src/app/core/menu/testing/menu.testing.d.ts +1 -1
- package/src/app/core/services/model/settings.model.d.ts +1 -0
- package/src/app/core/settings/settings.page.d.ts +1 -2
- package/src/app/core/table/table.module.d.ts +4 -3
- package/src/app/core/table/table.pipes.d.ts +28 -0
- package/src/app/core/table/testing/table.testing.d.ts +9 -5
- package/src/app/core/table/testing/table2.testing.d.ts +10 -5
- package/src/app/shared/pipes/form.pipes.d.ts +1 -1
- package/src/app/shared/pipes/pipes.module.d.ts +5 -4
- package/src/app/shared/pipes/selection.pipes.d.ts +62 -0
- package/src/app/shared/validator/validators.d.ts +1 -0
- package/src/assets/manifest.json +1 -1
- package/src/theme/_ngx-components.scss +4 -0
- package/src/theme/_ngx-components.table.scss +4 -14
|
@@ -1,154 +1,47 @@
|
|
|
1
|
-
import { Directive,
|
|
1
|
+
import { Directive, ViewChild } from '@angular/core';
|
|
2
2
|
import { IonContent } from '@ionic/angular';
|
|
3
|
-
import { BehaviorSubject
|
|
3
|
+
import { BehaviorSubject } from 'rxjs';
|
|
4
4
|
import { AppTable } from '../../table/table.class';
|
|
5
5
|
import { AppForm } from '../form.class';
|
|
6
6
|
import { FormButtonsBarToken } from '../buttons/form-buttons-bar.component';
|
|
7
|
-
import { AppFormProvider, AppFormUtils } from '../form.utils';
|
|
8
7
|
import { Toasts } from '../../../shared/toast/toasts';
|
|
9
8
|
import { ToolbarToken } from '../../../shared/toolbar/toolbar';
|
|
10
|
-
import {
|
|
11
|
-
import { AbstractControl } from '@angular/forms';
|
|
12
|
-
import { waitForFalse, waitForTrue } from '../../../shared/observables';
|
|
9
|
+
import { toNumber } from '../../../shared/functions';
|
|
13
10
|
import { throttleTime } from 'rxjs/operators';
|
|
11
|
+
import { AppFormContainer } from '../form-container.class';
|
|
14
12
|
import * as i0 from "@angular/core";
|
|
15
13
|
import * as i1 from "@angular/router";
|
|
16
14
|
import * as i2 from "@ionic/angular";
|
|
17
15
|
import * as i3 from "@ngx-translate/core";
|
|
18
|
-
export class AppTabEditorOptions {
|
|
19
|
-
/**
|
|
20
|
-
* Number of tab. 1 by default
|
|
21
|
-
*/
|
|
22
|
-
tabCount;
|
|
23
|
-
/**
|
|
24
|
-
* '200ms' by default
|
|
25
|
-
*/
|
|
26
|
-
tabGroupAnimationDuration;
|
|
27
|
-
/**
|
|
28
|
-
* Should enable swipe between tab, on touch screen
|
|
29
|
-
*/
|
|
30
|
-
enableSwipe; // true by default
|
|
31
|
-
}
|
|
32
16
|
// eslint-disable-next-line @angular-eslint/directive-class-suffix
|
|
33
|
-
export class AppEditor {
|
|
17
|
+
export class AppEditor extends AppFormContainer {
|
|
34
18
|
route;
|
|
35
19
|
router;
|
|
36
20
|
navController;
|
|
37
21
|
alertCtrl;
|
|
38
22
|
translate;
|
|
39
|
-
_children;
|
|
40
|
-
_subscription = new Subscription();
|
|
41
|
-
_enabled = false;
|
|
42
23
|
toastController;
|
|
43
|
-
destroySubject = new Subject();
|
|
44
|
-
// TODO use RxState instead
|
|
45
|
-
readySubject = new BehaviorSubject(false);
|
|
46
|
-
dirtySubject = new BehaviorSubject(false);
|
|
47
|
-
loadingSubject = new BehaviorSubject(true);
|
|
48
|
-
errorSubject = new BehaviorSubject(undefined);
|
|
49
24
|
savingSubject = new BehaviorSubject(false);
|
|
50
|
-
touchedSubject = new BehaviorSubject(false);
|
|
51
|
-
debug = false;
|
|
52
|
-
previousDataId;
|
|
53
25
|
submitted = false;
|
|
54
26
|
queryParams;
|
|
55
27
|
i18nContext;
|
|
56
|
-
/**
|
|
57
|
-
* @deprecated
|
|
58
|
-
*/
|
|
59
|
-
set _loading(value) {
|
|
60
|
-
this.loadingSubject.next(value);
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* @deprecated
|
|
64
|
-
*/
|
|
65
|
-
get _loading() {
|
|
66
|
-
return this.loadingSubject.value;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* @deprecated
|
|
70
|
-
*/
|
|
71
|
-
get _$ready() {
|
|
72
|
-
return this.readySubject;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* @deprecated
|
|
76
|
-
*/
|
|
77
|
-
get _$loading() {
|
|
78
|
-
return this.loadingSubject;
|
|
79
|
-
}
|
|
80
|
-
get error() {
|
|
81
|
-
return this.errorSubject.value;
|
|
82
|
-
}
|
|
83
|
-
set error(error) {
|
|
84
|
-
this.setError(error);
|
|
85
|
-
}
|
|
86
28
|
get saving() {
|
|
87
29
|
return this.savingSubject.value || this.editors?.some((e) => e.saving);
|
|
88
30
|
}
|
|
89
|
-
get destroyed() {
|
|
90
|
-
return this.destroySubject?.closed !== false;
|
|
91
|
-
}
|
|
92
31
|
toolbar = null;
|
|
93
32
|
formButtonsBar = null;
|
|
94
33
|
content;
|
|
95
|
-
get tables() {
|
|
96
|
-
return this._children && this._children.filter((c) => c instanceof AppTable);
|
|
97
|
-
}
|
|
98
|
-
get forms() {
|
|
99
|
-
return this._children && this._children.filter((c) => c instanceof AppForm);
|
|
100
|
-
}
|
|
101
|
-
get editors() {
|
|
102
|
-
return this._children && this._children.filter((c) => c instanceof AppEditor);
|
|
103
|
-
}
|
|
104
|
-
get dirty() {
|
|
105
|
-
return this.dirtySubject.value || (this._children && this._children.findIndex((c) => c.enabled && c.dirty) !== -1) || false;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Is valid (tables and forms)
|
|
109
|
-
*/
|
|
110
|
-
get valid() {
|
|
111
|
-
// Important: Should be not invalid AND not pending, so use '!valid' (DO NOT use 'invalid')
|
|
112
|
-
return !this._children || this._children.findIndex((c) => c.enabled && !c.valid) === -1;
|
|
113
|
-
}
|
|
114
|
-
get invalid() {
|
|
115
|
-
return (this._children && this._children.findIndex((c) => c.enabled && c.invalid) !== -1) || false;
|
|
116
|
-
}
|
|
117
|
-
get pending() {
|
|
118
|
-
return (this._children && this._children.findIndex((c) => c.enabled && c.pending) !== -1) || false;
|
|
119
|
-
}
|
|
120
|
-
get loading() {
|
|
121
|
-
return this.loadingSubject.value || (this._children && this._children.findIndex((c) => c.enabled && c.loading) !== -1) || false;
|
|
122
|
-
}
|
|
123
|
-
get loaded() {
|
|
124
|
-
return (!this.loadingSubject.value && (!this._children || this._children.findIndex((c) => c.enabled && c.loading) === -1)) || false;
|
|
125
|
-
}
|
|
126
|
-
get touched() {
|
|
127
|
-
return this.touchedSubject.value || (this._children && this._children.findIndex((c) => c.enabled && c.touched) !== -1) || false;
|
|
128
|
-
}
|
|
129
|
-
get untouched() {
|
|
130
|
-
return (!this.touchedSubject.value && (!this._children || this._children.findIndex((c) => c.enabled && c.touched) === -1)) || false;
|
|
131
|
-
}
|
|
132
|
-
get enabled() {
|
|
133
|
-
return this._enabled;
|
|
134
|
-
}
|
|
135
|
-
get disabled() {
|
|
136
|
-
return !this._enabled;
|
|
137
|
-
}
|
|
138
|
-
get children() {
|
|
139
|
-
return this._children;
|
|
140
|
-
}
|
|
141
|
-
get empty() {
|
|
142
|
-
return !this._enabled;
|
|
143
|
-
}
|
|
144
34
|
constructor(route, router, navController, alertCtrl, translate) {
|
|
35
|
+
super();
|
|
145
36
|
this.route = route;
|
|
146
37
|
this.router = router;
|
|
147
38
|
this.navController = navController;
|
|
148
39
|
this.alertCtrl = alertCtrl;
|
|
149
40
|
this.translate = translate;
|
|
41
|
+
this._logPrefix = '[editor] ';
|
|
150
42
|
}
|
|
151
43
|
ngOnInit() {
|
|
44
|
+
super.ngOnInit();
|
|
152
45
|
if (this.formButtonsBar) {
|
|
153
46
|
this.registerSubscription(this.formButtonsBar.onBack
|
|
154
47
|
.pipe(throttleTime(200)) // Avoid to be called twice
|
|
@@ -160,129 +53,29 @@ export class AppEditor {
|
|
|
160
53
|
// Can be overridden by subclasses
|
|
161
54
|
}
|
|
162
55
|
ngOnDestroy() {
|
|
163
|
-
|
|
164
|
-
this.
|
|
165
|
-
this.loadingSubject.unsubscribe();
|
|
166
|
-
this.errorSubject.unsubscribe();
|
|
167
|
-
this.destroySubject.next();
|
|
168
|
-
this.destroySubject.unsubscribe();
|
|
56
|
+
super.ngOnDestroy();
|
|
57
|
+
this.savingSubject.unsubscribe();
|
|
169
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* @deprecated Use addForm(path, form)
|
|
61
|
+
* @param form
|
|
62
|
+
*/
|
|
170
63
|
addChildForm(form) {
|
|
171
|
-
|
|
172
|
-
throw new Error('Trying to register an undefined child form');
|
|
173
|
-
this._children = this._children || [];
|
|
174
|
-
if (typeof form === 'function') {
|
|
175
|
-
this._children.push(new AppFormProvider(form));
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
this._children.push(form);
|
|
179
|
-
}
|
|
180
|
-
return this;
|
|
64
|
+
this.addForm(null, form);
|
|
181
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* @deprecated Use addForms()
|
|
68
|
+
* @param forms
|
|
69
|
+
*/
|
|
182
70
|
addChildForms(forms) {
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
removeChildForm(form) {
|
|
186
|
-
if (!form)
|
|
187
|
-
throw new Error('Trying to remove an undefined child form');
|
|
188
|
-
const index = (this._children || []).findIndex((c) => c === form);
|
|
189
|
-
if (index !== -1) {
|
|
190
|
-
return this._children.splice(index, 1)[0];
|
|
191
|
-
}
|
|
192
|
-
return undefined;
|
|
193
|
-
}
|
|
194
|
-
disable(opts) {
|
|
195
|
-
this._enabled = false;
|
|
196
|
-
this._children?.forEach((c) => c.disable(opts));
|
|
197
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
198
|
-
this.markForCheck();
|
|
199
|
-
}
|
|
200
|
-
enable(opts) {
|
|
201
|
-
this._enabled = true;
|
|
202
|
-
this._children?.forEach((c) => c.enable(opts));
|
|
203
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
204
|
-
this.markForCheck();
|
|
205
|
-
}
|
|
206
|
-
markAsPristine(opts) {
|
|
207
|
-
this.error = null;
|
|
208
|
-
this.submitted = false;
|
|
209
|
-
if (this.dirtySubject.value !== false) {
|
|
210
|
-
this.dirtySubject.next(false);
|
|
211
|
-
}
|
|
212
|
-
this._children?.forEach((c) => c.markAsPristine(opts));
|
|
213
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
214
|
-
this.markForCheck();
|
|
215
|
-
}
|
|
216
|
-
markAsUntouched(opts) {
|
|
217
|
-
if (this.touchedSubject.value !== false) {
|
|
218
|
-
this.touchedSubject.next(false);
|
|
219
|
-
}
|
|
220
|
-
this._children?.forEach((c) => c.markAsUntouched());
|
|
221
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
222
|
-
this.markForCheck();
|
|
71
|
+
this.addForms(forms);
|
|
223
72
|
}
|
|
224
73
|
/**
|
|
225
|
-
* @deprecated
|
|
226
|
-
* @param
|
|
74
|
+
* @deprecated Use removeForm()
|
|
75
|
+
* @param form
|
|
227
76
|
*/
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
this.touchedSubject.next(true);
|
|
231
|
-
}
|
|
232
|
-
this._children?.forEach((c) => c.markAsTouched(opts));
|
|
233
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
234
|
-
this.markForCheck();
|
|
235
|
-
}
|
|
236
|
-
markAllAsTouched(opts) {
|
|
237
|
-
if (this.touchedSubject.value !== true) {
|
|
238
|
-
this.touchedSubject.next(true);
|
|
239
|
-
}
|
|
240
|
-
this._children?.forEach((c) => c.markAllAsTouched(opts));
|
|
241
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
242
|
-
this.markForCheck();
|
|
243
|
-
}
|
|
244
|
-
markAsDirty(opts) {
|
|
245
|
-
if (!this.dirtySubject.value) {
|
|
246
|
-
this.dirtySubject.next(true);
|
|
247
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
248
|
-
this.markForCheck();
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
markAsLoading(opts) {
|
|
252
|
-
if (!this.loadingSubject.value) {
|
|
253
|
-
this.loadingSubject.next(true);
|
|
254
|
-
if (!opts || opts.emitEvent !== false)
|
|
255
|
-
this.markForCheck();
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
markAsLoaded(opts) {
|
|
259
|
-
if (!this.loadingSubject.closed && this.loadingSubject.value) {
|
|
260
|
-
this.loadingSubject.next(false);
|
|
261
|
-
if (!opts || opts.onlySelf !== true) {
|
|
262
|
-
// Emit to children forms and editors
|
|
263
|
-
// note: tables should be changed by parent
|
|
264
|
-
this.forms?.forEach((f) => f.markAsLoaded(opts));
|
|
265
|
-
this.editors?.forEach((e) => e.markAsLoaded(opts));
|
|
266
|
-
}
|
|
267
|
-
if (!opts || opts.emitEvent !== false) {
|
|
268
|
-
this.markForCheck();
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
markAsReady(opts) {
|
|
273
|
-
this._children?.forEach((c) => c.markAsReady(opts));
|
|
274
|
-
if (!this.readySubject.closed && !this.readySubject.value)
|
|
275
|
-
this.readySubject.next(true);
|
|
276
|
-
}
|
|
277
|
-
ready(opts) {
|
|
278
|
-
if (this.readySubject.value)
|
|
279
|
-
return Promise.resolve();
|
|
280
|
-
return waitForTrue(this.readySubject, { stop: this.destroySubject, ...opts });
|
|
281
|
-
}
|
|
282
|
-
waitIdle(opts) {
|
|
283
|
-
if (!this.loadingSubject.value)
|
|
284
|
-
return Promise.resolve();
|
|
285
|
-
return waitForFalse(this.loadingSubject, { stop: this.destroySubject, ...opts });
|
|
77
|
+
removeChildForm(form) {
|
|
78
|
+
return this.removeForm(form);
|
|
286
79
|
}
|
|
287
80
|
markAsSaving(opts) {
|
|
288
81
|
if (this.savingSubject.value !== true) {
|
|
@@ -312,9 +105,9 @@ export class AppEditor {
|
|
|
312
105
|
* @param opts
|
|
313
106
|
*/
|
|
314
107
|
async unload(opts) {
|
|
315
|
-
console.debug('
|
|
108
|
+
console.debug(this._logPrefix + 'Unloading data...');
|
|
316
109
|
this.markAsLoading();
|
|
317
|
-
this.
|
|
110
|
+
this.children?.forEach((f) => {
|
|
318
111
|
if (f instanceof AppForm) {
|
|
319
112
|
// Fix error when 'null' is pass (default value = {} was not applied)
|
|
320
113
|
f.reset(undefined, opts);
|
|
@@ -377,11 +170,6 @@ export class AppEditor {
|
|
|
377
170
|
return this.navController.navigateBack('/');
|
|
378
171
|
}
|
|
379
172
|
}
|
|
380
|
-
logFormErrors(prefix) {
|
|
381
|
-
if (this.debug)
|
|
382
|
-
console.debug('[editor] Editor not valid. Checking where (forms, tables)...');
|
|
383
|
-
this._children?.forEach((c) => this.logChildrenErrors(c, prefix));
|
|
384
|
-
}
|
|
385
173
|
/* -- protected methods -- */
|
|
386
174
|
async scrollToTop(duration) {
|
|
387
175
|
duration = toNumber(duration, 500);
|
|
@@ -401,12 +189,6 @@ export class AppEditor {
|
|
|
401
189
|
}
|
|
402
190
|
return this.content.scrollToTop(duration);
|
|
403
191
|
}
|
|
404
|
-
registerSubscription(sub) {
|
|
405
|
-
this._subscription.add(sub);
|
|
406
|
-
}
|
|
407
|
-
unregisterSubscription(sub) {
|
|
408
|
-
this._subscription.remove(sub);
|
|
409
|
-
}
|
|
410
192
|
async saveIfDirtyAndConfirm(event, opts) {
|
|
411
193
|
if (!this.dirty)
|
|
412
194
|
return true;
|
|
@@ -453,76 +235,18 @@ export class AppEditor {
|
|
|
453
235
|
}
|
|
454
236
|
return await this.save(event, opts);
|
|
455
237
|
}
|
|
238
|
+
async saveDirtyChildren() {
|
|
239
|
+
// Save all dirty tables
|
|
240
|
+
const results = await Promise.all([...this.tables, ...this.editors].filter((c) => c.dirty).map((c) => c.save()));
|
|
241
|
+
return !results.some((saved) => saved !== true);
|
|
242
|
+
}
|
|
456
243
|
async showToast(opts) {
|
|
457
244
|
if (!this.toastController)
|
|
458
245
|
throw new Error("Missing toastController in component's constructor");
|
|
459
246
|
await Toasts.show(this.toastController, this.translate, opts);
|
|
460
247
|
}
|
|
461
|
-
logChildrenErrors(c, prefix, path) {
|
|
462
|
-
prefix = prefix || '[app-tab-editor] ';
|
|
463
|
-
// If editor
|
|
464
|
-
if (c instanceof AppEditor) {
|
|
465
|
-
if (!c.empty && !c.valid) {
|
|
466
|
-
if (c.pending) {
|
|
467
|
-
const path = c.constructor.name.toLowerCase();
|
|
468
|
-
console.warn(`${prefix} -> ${path}: waiting while pending...`);
|
|
469
|
-
AppFormUtils.waitWhilePending(c, { timeout: 1000 }).then(() => c.logFormErrors(prefix));
|
|
470
|
-
}
|
|
471
|
-
else {
|
|
472
|
-
c.logFormErrors(prefix);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
// Angular form control
|
|
477
|
-
else if (c instanceof AbstractControl) {
|
|
478
|
-
AppFormUtils.logFormErrors(c, prefix, path);
|
|
479
|
-
}
|
|
480
|
-
// If form provider: get delegate
|
|
481
|
-
else if (c instanceof AppFormProvider) {
|
|
482
|
-
if (!c.empty && !c.valid) {
|
|
483
|
-
c.waitDelegate({ timeout: 1000 }).then((delegate) => this.logChildrenErrors(delegate, prefix, 'provider'));
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
// If table
|
|
487
|
-
else if (c instanceof AppTable) {
|
|
488
|
-
if (c.invalid && c.editedRow && c.editedRow.validator) {
|
|
489
|
-
const path = c.constructor.name.toLowerCase();
|
|
490
|
-
AppFormUtils.logFormErrors(c.editedRow.validator, prefix, path);
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
// If form
|
|
494
|
-
else if (c instanceof AppForm) {
|
|
495
|
-
if (!c.empty && !c.valid) {
|
|
496
|
-
if (c.pending) {
|
|
497
|
-
const path = c.constructor.name.toLowerCase();
|
|
498
|
-
console.warn(`${prefix} -> ${path}: waiting while pending...`);
|
|
499
|
-
AppFormUtils.waitWhilePending(c, { timeout: 1000 }).then(() => this.logChildrenErrors(c.form, prefix, path));
|
|
500
|
-
}
|
|
501
|
-
else {
|
|
502
|
-
AppFormUtils.logFormErrors(c.form, prefix);
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
else {
|
|
507
|
-
console.warn(`${prefix} Unknown children sub-form: `, c);
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
setError(value, opts) {
|
|
511
|
-
// Compare using '!=' to detect null and undefined as same value
|
|
512
|
-
if (this.errorSubject.value != value) {
|
|
513
|
-
this.errorSubject.next(value);
|
|
514
|
-
if (!opts || opts.emitEvent !== false)
|
|
515
|
-
this.markForCheck();
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
resetError(opts) {
|
|
519
|
-
this.setError(undefined, opts);
|
|
520
|
-
}
|
|
521
|
-
markForCheck() {
|
|
522
|
-
// Should be override by subclasses, if change detection is Push
|
|
523
|
-
}
|
|
524
248
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppEditor, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.NavController }, { token: i2.AlertController }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
525
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.2.4", type: AppEditor, viewQueries: [{ propertyName: "toolbar", first: true, predicate: ToolbarToken, descendants: true }, { propertyName: "formButtonsBar", first: true, predicate: FormButtonsBarToken, descendants: true, static: true }, { propertyName: "content", first: true, predicate: IonContent, descendants: true, static: true }], ngImport: i0 });
|
|
249
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.2.4", type: AppEditor, viewQueries: [{ propertyName: "toolbar", first: true, predicate: ToolbarToken, descendants: true }, { propertyName: "formButtonsBar", first: true, predicate: FormButtonsBarToken, descendants: true, static: true }, { propertyName: "content", first: true, predicate: IonContent, descendants: true, static: true }], usesInheritance: true, ngImport: i0 });
|
|
526
250
|
}
|
|
527
251
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppEditor, decorators: [{
|
|
528
252
|
type: Directive
|
|
@@ -536,182 +260,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
|
|
|
536
260
|
type: ViewChild,
|
|
537
261
|
args: [IonContent, { static: true }]
|
|
538
262
|
}] } });
|
|
539
|
-
// eslint-disable-next-line @angular-eslint/directive-class-suffix
|
|
540
|
-
export class AppTabEditor extends AppEditor {
|
|
541
|
-
route;
|
|
542
|
-
router;
|
|
543
|
-
navController;
|
|
544
|
-
alertCtrl;
|
|
545
|
-
translate;
|
|
546
|
-
_selectedTabIndex = 0;
|
|
547
|
-
// Editor options
|
|
548
|
-
tabCount;
|
|
549
|
-
enableSwipe;
|
|
550
|
-
tabGroupAnimationDuration;
|
|
551
|
-
queryTabIndexParamName;
|
|
552
|
-
set selectedTabIndex(value) {
|
|
553
|
-
this.setSelectedTabIndex(value);
|
|
554
|
-
}
|
|
555
|
-
get selectedTabIndex() {
|
|
556
|
-
return this._selectedTabIndex;
|
|
557
|
-
}
|
|
558
|
-
selectedTabIndexChange = new EventEmitter();
|
|
559
|
-
tabGroup;
|
|
560
|
-
constructor(route, // Modal editor give 'null'
|
|
561
|
-
router, navController, alertCtrl, translate, options) {
|
|
562
|
-
super(route, router, navController, alertCtrl, translate);
|
|
563
|
-
this.route = route;
|
|
564
|
-
this.router = router;
|
|
565
|
-
this.navController = navController;
|
|
566
|
-
this.alertCtrl = alertCtrl;
|
|
567
|
-
this.translate = translate;
|
|
568
|
-
options = {
|
|
569
|
-
tabCount: 1,
|
|
570
|
-
enableSwipe: true,
|
|
571
|
-
tabGroupAnimationDuration: '200ms',
|
|
572
|
-
...options,
|
|
573
|
-
};
|
|
574
|
-
this.tabCount = options.tabCount;
|
|
575
|
-
this.enableSwipe = options.enableSwipe;
|
|
576
|
-
this.tabGroupAnimationDuration = options.tabGroupAnimationDuration;
|
|
577
|
-
this.queryTabIndexParamName = 'tab';
|
|
578
|
-
}
|
|
579
|
-
ngOnInit() {
|
|
580
|
-
super.ngOnInit();
|
|
581
|
-
// Read the selected tab index, from path query params
|
|
582
|
-
if (this.tabGroup && this.route && this.queryTabIndexParamName) {
|
|
583
|
-
this.registerSubscription(this.route.queryParams.subscribe((queryParams) => {
|
|
584
|
-
this.queryParams = { ...queryParams };
|
|
585
|
-
// Parse tab param
|
|
586
|
-
if (this.tabCount > 1 && this.queryTabIndexParamName) {
|
|
587
|
-
const tabIndex = toNumber(queryParams[this.queryTabIndexParamName], 0);
|
|
588
|
-
this.queryParams[this.queryTabIndexParamName] = tabIndex !== 0 ? tabIndex : undefined;
|
|
589
|
-
if (this.selectedTabIndex !== tabIndex) {
|
|
590
|
-
this.selectedTabIndex = tabIndex;
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
// Realign tab, after a delay because the tab can be disabled when component is created
|
|
594
|
-
setTimeout(() => this.tabGroup.realignInkBar(), 500);
|
|
595
|
-
}));
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
ngOnDestroy() {
|
|
599
|
-
super.ngOnDestroy();
|
|
600
|
-
this.selectedTabIndexChange.complete();
|
|
601
|
-
this.loadingSubject.unsubscribe();
|
|
602
|
-
this.errorSubject.unsubscribe();
|
|
603
|
-
}
|
|
604
|
-
setSelectedTabIndex(value, opts) {
|
|
605
|
-
// Fix value
|
|
606
|
-
if (value < 0) {
|
|
607
|
-
value = 0;
|
|
608
|
-
}
|
|
609
|
-
else if (value > this.tabCount - 1) {
|
|
610
|
-
console.warn(`[tab-editor] Invalid tab index ${value}. Max value is ${this.tabCount - 1}`);
|
|
611
|
-
value = this._selectedTabIndex;
|
|
612
|
-
}
|
|
613
|
-
this._selectedTabIndex = value;
|
|
614
|
-
this.selectedTabIndexChange.next(value);
|
|
615
|
-
if (this.tabGroup && (!opts || opts.realignInkBar !== false)) {
|
|
616
|
-
this.tabGroup.selectedIndex = value;
|
|
617
|
-
this.markForCheck();
|
|
618
|
-
// Wait tab change in UI, before realign ink tab
|
|
619
|
-
setTimeout(() => this.tabGroup.realignInkBar(), 200);
|
|
620
|
-
}
|
|
621
|
-
else if (!opts || opts.emitEvent !== false) {
|
|
622
|
-
this.markForCheck();
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
realignInkBar() {
|
|
626
|
-
this.tabGroup?.realignInkBar();
|
|
627
|
-
}
|
|
628
|
-
onTabChange(event, queryTabIndexParamName) {
|
|
629
|
-
queryTabIndexParamName = queryTabIndexParamName || this.queryTabIndexParamName;
|
|
630
|
-
if (!queryTabIndexParamName || !this.route)
|
|
631
|
-
return true; // Skip if tab query param not set, or no route
|
|
632
|
-
if (!this.queryParams || +this.queryParams[queryTabIndexParamName] !== event.index) {
|
|
633
|
-
this.queryParams = this.queryParams || {};
|
|
634
|
-
this.queryParams[queryTabIndexParamName] = event.index !== 0 ? event.index : undefined;
|
|
635
|
-
if (queryTabIndexParamName === 'tab' && isNotNil(this.queryParams['subtab'])) {
|
|
636
|
-
delete this.queryParams.subtab; // clean subtab
|
|
637
|
-
}
|
|
638
|
-
this.router.navigate(['.'], {
|
|
639
|
-
relativeTo: this.route,
|
|
640
|
-
queryParams: this.queryParams,
|
|
641
|
-
replaceUrl: true,
|
|
642
|
-
state: { animated: false },
|
|
643
|
-
});
|
|
644
|
-
return true;
|
|
645
|
-
}
|
|
646
|
-
return false;
|
|
647
|
-
}
|
|
648
|
-
/**
|
|
649
|
-
* Action triggered when user swipes
|
|
650
|
-
*/
|
|
651
|
-
onSwipeTab(event) {
|
|
652
|
-
// DEBUG
|
|
653
|
-
// if (this.debug) console.debug("[tab-page] onSwipeTab()");
|
|
654
|
-
// Skip, if not a valid swipe event
|
|
655
|
-
if (!this.enableSwipe ||
|
|
656
|
-
!event ||
|
|
657
|
-
event.defaultPrevented ||
|
|
658
|
-
(event.srcEvent && event.srcEvent.defaultPrevented) ||
|
|
659
|
-
event.pointerType !== 'touch') {
|
|
660
|
-
return false;
|
|
661
|
-
}
|
|
662
|
-
// DEBUG
|
|
663
|
-
//if (this.debug)
|
|
664
|
-
//console.debug("[tab-page] Detected swipe: " + event.type, event);
|
|
665
|
-
let selectTabIndex = this.selectedTabIndex;
|
|
666
|
-
switch (event.type) {
|
|
667
|
-
// Open next tab
|
|
668
|
-
case 'swipeleft':
|
|
669
|
-
selectTabIndex = selectTabIndex >= this.tabCount - 1 ? 0 : selectTabIndex + 1;
|
|
670
|
-
break;
|
|
671
|
-
// Open previous tab
|
|
672
|
-
case 'swiperight':
|
|
673
|
-
selectTabIndex = selectTabIndex <= 0 ? this.tabCount : selectTabIndex - 1;
|
|
674
|
-
break;
|
|
675
|
-
// Other case
|
|
676
|
-
default:
|
|
677
|
-
console.error('[tab-page] Unknown swipe action: ' + event.type);
|
|
678
|
-
return false;
|
|
679
|
-
}
|
|
680
|
-
setTimeout(() => {
|
|
681
|
-
this.selectedTabIndex = selectTabIndex;
|
|
682
|
-
this.markForCheck();
|
|
683
|
-
});
|
|
684
|
-
return true;
|
|
685
|
-
}
|
|
686
|
-
onSubTabChange(event) {
|
|
687
|
-
this.onTabChange(event, 'subtab');
|
|
688
|
-
}
|
|
689
|
-
async unload(opts) {
|
|
690
|
-
this.selectedTabIndex = 0;
|
|
691
|
-
await super.unload(opts);
|
|
692
|
-
}
|
|
693
|
-
async saveDirtyChildren() {
|
|
694
|
-
// Save all dirty tables
|
|
695
|
-
const results = await Promise.all([...this.tables, ...this.editors].filter((c) => c.dirty).map((c) => c.save()));
|
|
696
|
-
return !results.some((saved) => saved !== true);
|
|
697
|
-
}
|
|
698
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppTabEditor, deps: [{ token: i1.ActivatedRoute, optional: true }, { token: i1.Router }, { token: i2.NavController }, { token: i2.AlertController }, { token: i3.TranslateService }, { token: AppTabEditorOptions, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
699
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.2.4", type: AppTabEditor, inputs: { queryTabIndexParamName: "queryTabIndexParamName", selectedTabIndex: "selectedTabIndex" }, outputs: { selectedTabIndexChange: "selectedTabIndexChange" }, viewQueries: [{ propertyName: "tabGroup", first: true, predicate: ["tabGroup"], descendants: true, static: true }], usesInheritance: true, ngImport: i0 });
|
|
700
|
-
}
|
|
701
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: AppTabEditor, decorators: [{
|
|
702
|
-
type: Directive
|
|
703
|
-
}], ctorParameters: () => [{ type: i1.ActivatedRoute, decorators: [{
|
|
704
|
-
type: Optional
|
|
705
|
-
}] }, { type: i1.Router }, { type: i2.NavController }, { type: i2.AlertController }, { type: i3.TranslateService }, { type: AppTabEditorOptions, decorators: [{
|
|
706
|
-
type: Optional
|
|
707
|
-
}] }], propDecorators: { queryTabIndexParamName: [{
|
|
708
|
-
type: Input
|
|
709
|
-
}], selectedTabIndex: [{
|
|
710
|
-
type: Input
|
|
711
|
-
}], selectedTabIndexChange: [{
|
|
712
|
-
type: Output
|
|
713
|
-
}], tabGroup: [{
|
|
714
|
-
type: ViewChild,
|
|
715
|
-
args: ['tabGroup', { static: true }]
|
|
716
|
-
}] } });
|
|
717
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vZW50aXR5L2VkaXRvci5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc5SCxPQUFPLEVBQW1CLFVBQVUsRUFBa0MsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQWlCLE1BQU0sTUFBTSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQW9CLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXhFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFrQixXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBZTlDLE1BQU0sT0FBTyxtQkFBbUI7SUFDOUI7O09BRUc7SUFDSCxRQUFRLENBQVU7SUFFbEI7O09BRUc7SUFDSCx5QkFBeUIsQ0FBVTtJQUVu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QUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDOUgsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxLQUFLO1FBQ1AsMkZBQTJGO1FBQzNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDckcsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNyRyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ2xJLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUN0SSxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ2xJLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUN0SSxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLENBQUMsSUFB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QUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFakgsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO3VHQTNMbUIsWUFBWTsyRkFBWixZQUFZOzsyRkFBWixZQUFZO2tCQUZqQyxTQUFTOzswQkF3QkwsUUFBUTs7MEJBS1IsUUFBUTt5Q0FuQkYsc0JBQXNCO3NCQUE5QixLQUFLO2dCQUVPLGdCQUFnQjtzQkFBNUIsS0FBSztnQkFPYSxzQkFBc0I7c0JBQXhDLE1BQU07Z0JBRWtDLFFBQVE7c0JBQWhELFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFBhcmFtcywgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE1hdFRhYkNoYW5nZUV2ZW50LCBNYXRUYWJHcm91cCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyLCBJb25Db250ZW50LCBOYXZDb250cm9sbGVyLCBUb2FzdENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgVGVhcmRvd25Mb2dpYyB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwVGFibGUgfSBmcm9tICcuLi8uLi90YWJsZS90YWJsZS5jbGFzcyc7XG5pbXBvcnQgeyBBcHBGb3JtIH0gZnJvbSAnLi4vZm9ybS5jbGFzcyc7XG5pbXBvcnQgeyBGb3JtQnV0dG9uc0JhclRva2VuIH0gZnJvbSAnLi4vYnV0dG9ucy9mb3JtLWJ1dHRvbnMtYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBcHBGb3JtUHJvdmlkZXIsIEFwcEZvcm1VdGlscywgSUFwcEZvcm0sIElBcHBGb3JtR2V0dGVyIH0gZnJvbSAnLi4vZm9ybS51dGlscyc7XG5pbXBvcnQgeyBTaG93VG9hc3RPcHRpb25zLCBUb2FzdHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdG9hc3QvdG9hc3RzJztcbmltcG9ydCB7IEhhbW1lclN3aXBlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZ2VzdHVyZS9oYW1tZXIudXRpbHMnO1xuaW1wb3J0IHsgVG9vbGJhclRva2VuIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3Rvb2xiYXIvdG9vbGJhcic7XG5pbXBvcnQgeyBpc05vdE5pbCwgdG9OdW1iZXIgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IENhbkxlYXZlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2d1YXJkL2NvbXBvbmVudC1kaXJ0eS5ndWFyZCc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB3YWl0Rm9yRmFsc2UsIFdhaXRGb3JPcHRpb25zLCB3YWl0Rm9yVHJ1ZSB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5pbXBvcnQgeyB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFwcEVkaXRvciBleHRlbmRzIENhbkxlYXZlLCBJQXBwRm9ybSB7XG4gIHNhdmUoZXZlbnQ/OiBFdmVudCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8Ym9vbGVhbj47XG4gIGNhbmNlbChldmVudD86IEV2ZW50KTogUHJvbWlzZTx2b2lkPjtcbiAgYWRkQ2hpbGRGb3JtKGZvcm06IElBcHBGb3JtIHwgSUFwcEZvcm1HZXR0ZXIpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBcHBUYWJFZGl0b3IgZXh0ZW5kcyBJQXBwRWRpdG9yIHtcbiAgc2VsZWN0ZWRUYWJJbmRleDogbnVtYmVyO1xuICBzZXRTZWxlY3RlZFRhYkluZGV4KHZhbHVlOiBudW1iZXIsIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW47IHJlYWxpZ25JbmtCYXI/OiBib29sZWFuIH0pOiB2b2lkO1xuICB1bmxvYWQob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPjtcbiAgcmVhbGlnbklua0JhcigpO1xufVxuXG5leHBvcnQgY2xhc3MgQXBwVGFiRWRpdG9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgdGFiLiAxIGJ5IGRlZmF1bHRcbiAgICovXG4gIHRhYkNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiAnMjAwbXMnIGJ5IGRlZmF1bHRcbiAgICovXG4gIHRhYkdyb3VwQW5pbWF0aW9uRHVyYXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNob3VsZCBlbmFibGUgc3dpcGUgYmV0d2VlbiB0YWIsIG9uIHRvdWNoIHNjcmVlblxuICAgKi9cbiAgZW5hYmxlU3dpcGU/OiBib29sZWFuOyAvLyB0cnVlIGJ5IGRlZmF1bHRcbn1cblxuQERpcmVjdGl2ZSgpXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBcHBFZGl0b3I8VCA9IGFueSwgSUQgPSBudW1iZXIsIE8gPSBhbnk+IGltcGxlbWVudHMgSUFwcEVkaXRvciwgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIF9jaGlsZHJlbjogSUFwcEZvcm1bXTtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIHByb3RlY3RlZCBfZW5hYmxlZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgdG9hc3RDb250cm9sbGVyOiBUb2FzdENvbnRyb2xsZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZXN0cm95U3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gVE9ETyB1c2UgUnhTdGF0ZSBpbnN0ZWFkXG4gIHJlYWRvbmx5IHJlYWR5U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBkaXJ0eVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBlcnJvclN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgc2F2aW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSB0b3VjaGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGRlYnVnID0gZmFsc2U7XG4gIHByZXZpb3VzRGF0YUlkOiBJRDtcbiAgc3VibWl0dGVkID0gZmFsc2U7XG4gIHF1ZXJ5UGFyYW1zOiBQYXJhbXM7XG4gIGkxOG5Db250ZXh0OiB7XG4gICAgcHJlZml4OiBzdHJpbmc7XG4gICAgc3VmZml4OiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqXG4gICAqICBAZGVwcmVjYXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBfbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogIEBkZXByZWNhdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IF9sb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiAgQGRlcHJlY2F0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgXyRyZWFkeSgpOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlYWR5U3ViamVjdDtcbiAgfVxuICAvKipcbiAgICogIEBkZXByZWNhdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IF8kbG9hZGluZygpOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0O1xuICB9XG5cbiAgZ2V0IGVycm9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgc2V0IGVycm9yKGVycm9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldEVycm9yKGVycm9yKTtcbiAgfVxuXG4gIGdldCBzYXZpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2F2aW5nU3ViamVjdC52YWx1ZSB8fCB0aGlzLmVkaXRvcnM/LnNvbWUoKGUpID0+IGUuc2F2aW5nKTtcbiAgfVxuXG4gIGdldCBkZXN0cm95ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGVzdHJveVN1YmplY3Q/LmNsb3NlZCAhPT0gZmFsc2U7XG4gIH1cblxuICBAVmlld0NoaWxkKFRvb2xiYXJUb2tlbikgdG9vbGJhcjogVG9vbGJhclRva2VuIHwgbnVsbCA9IG51bGw7XG4gIEBWaWV3Q2hpbGQoRm9ybUJ1dHRvbnNCYXJUb2tlbiwgeyBzdGF0aWM6IHRydWUgfSkgZm9ybUJ1dHRvbnNCYXI6IEZvcm1CdXR0b25zQmFyVG9rZW4gfCBudWxsID0gbnVsbDtcbiAgQFZpZXdDaGlsZChJb25Db250ZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBjb250ZW50OiBJb25Db250ZW50O1xuXG4gIGdldCB0YWJsZXMoKTogQXBwVGFibGU8YW55PltdIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW4gJiYgKHRoaXMuX2NoaWxkcmVuLmZpbHRlcigoYykgPT4gYyBpbnN0YW5jZW9mIEFwcFRhYmxlKSBhcyBBcHBUYWJsZTxhbnk+W10pO1xuICB9XG4gIGdldCBmb3JtcygpOiBBcHBGb3JtPGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuICYmICh0aGlzLl9jaGlsZHJlbi5maWx0ZXIoKGMpID0+IGMgaW5zdGFuY2VvZiBBcHBGb3JtKSBhcyBBcHBGb3JtPGFueT5bXSk7XG4gIH1cbiAgZ2V0IGVkaXRvcnMoKTogQXBwRWRpdG9yPGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuICYmICh0aGlzLl9jaGlsZHJlbi5maWx0ZXIoKGMpID0+IGMgaW5zdGFuY2VvZiBBcHBFZGl0b3IpIGFzIEFwcEVkaXRvcltdKTtcbiAgfVxuICBnZXQgZGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlydHlTdWJqZWN0LnZhbHVlIHx8ICh0aGlzLl9jaGlsZHJlbiAmJiB0aGlzLl9jaGlsZHJlbi5maW5kSW5kZXgoKGMpID0+IGMuZW5hYmxlZCAmJiBjLmRpcnR5KSAhPT0gLTEpIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIHZhbGlkICh0YWJsZXMgYW5kIGZvcm1zKVxuICAgKi9cbiAgZ2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIC8vIEltcG9ydGFudDogU2hvdWxkIGJlIG5vdCBpbnZhbGlkIEFORCBub3QgcGVuZGluZywgc28gdXNlICchdmFsaWQnIChETyBOT1QgdXNlICdpbnZhbGlkJylcbiAgICByZXR1cm4gIXRoaXMuX2NoaWxkcmVuIHx8IHRoaXMuX2NoaWxkcmVuLmZpbmRJbmRleCgoYykgPT4gYy5lbmFibGVkICYmICFjLnZhbGlkKSA9PT0gLTE7XG4gIH1cblxuICBnZXQgaW52YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuX2NoaWxkcmVuICYmIHRoaXMuX2NoaWxkcmVuLmZpbmRJbmRleCgoYykgPT4gYy5lbmFibGVkICYmIGMuaW52YWxpZCkgIT09IC0xKSB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldCBwZW5kaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5fY2hpbGRyZW4gJiYgdGhpcy5fY2hpbGRyZW4uZmluZEluZGV4KChjKSA9PiBjLmVuYWJsZWQgJiYgYy5wZW5kaW5nKSAhPT0gLTEpIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1N1YmplY3QudmFsdWUgfHwgKHRoaXMuX2NoaWxkcmVuICYmIHRoaXMuX2NoaWxkcmVuLmZpbmRJbmRleCgoYykgPT4gYy5lbmFibGVkICYmIGMubG9hZGluZykgIT09IC0xKSB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldCBsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICghdGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSAmJiAoIXRoaXMuX2NoaWxkcmVuIHx8IHRoaXMuX2NoaWxkcmVuLmZpbmRJbmRleCgoYykgPT4gYy5lbmFibGVkICYmIGMubG9hZGluZykgPT09IC0xKSkgfHwgZmFsc2U7XG4gIH1cblxuICBnZXQgdG91Y2hlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b3VjaGVkU3ViamVjdC52YWx1ZSB8fCAodGhpcy5fY2hpbGRyZW4gJiYgdGhpcy5fY2hpbGRyZW4uZmluZEluZGV4KChjKSA9PiBjLmVuYWJsZWQgJiYgYy50b3VjaGVkKSAhPT0gLTEpIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHVudG91Y2hlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKCF0aGlzLnRvdWNoZWRTdWJqZWN0LnZhbHVlICYmICghdGhpcy5fY2hpbGRyZW4gfHwgdGhpcy5fY2hpbGRyZW4uZmluZEluZGV4KChjKSA9PiBjLmVuYWJsZWQgJiYgYy50b3VjaGVkKSA9PT0gLTEpKSB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIGdldCBjaGlsZHJlbigpOiBJQXBwRm9ybVtdIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gIH1cblxuICBnZXQgZW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl9lbmFibGVkO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IGlzTmV3RGF0YSgpOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcbiAgICBwcm90ZWN0ZWQgbmF2Q29udHJvbGxlcjogTmF2Q29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgYWxlcnRDdHJsOiBBbGVydENvbnRyb2xsZXIsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuZm9ybUJ1dHRvbnNCYXIpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICAgIHRoaXMuZm9ybUJ1dHRvbnNCYXIub25CYWNrXG4gICAgICAgICAgLnBpcGUodGhyb3R0bGVUaW1lKDIwMCkpIC8vIEF2b2lkIHRvIGJlIGNhbGxlZCB0d2ljZVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB0aGlzLmdvQmFjayhldmVudCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tZW1wdHktbGlmZWN5Y2xlLW1ldGhvZFxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlc1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLnJlYWR5U3ViamVjdC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmVycm9yU3ViamVjdC51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5kZXN0cm95U3ViamVjdC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95U3ViamVjdC51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgYWRkQ2hpbGRGb3JtKGZvcm06IElBcHBGb3JtIHwgSUFwcEZvcm1HZXR0ZXIpIHtcbiAgICBpZiAoIWZvcm0pIHRocm93IG5ldyBFcnJvcignVHJ5aW5nIHRvIHJlZ2lzdGVyIGFuIHVuZGVmaW5lZCBjaGlsZCBmb3JtJyk7XG4gICAgdGhpcy5fY2hpbGRyZW4gPSB0aGlzLl9jaGlsZHJlbiB8fCBbXTtcbiAgICBpZiAodHlwZW9mIGZvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2gobmV3IEFwcEZvcm1Qcm92aWRlcihmb3JtKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goZm9ybSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQ2hpbGRGb3Jtcyhmb3JtczogKElBcHBGb3JtIHwgSUFwcEZvcm1HZXR0ZXIpW10pIHtcbiAgICAoZm9ybXMgfHwgW10pLmZvckVhY2goKGZvcm0pID0+IHRoaXMuYWRkQ2hpbGRGb3JtKGZvcm0pKTtcbiAgfVxuXG4gIHJlbW92ZUNoaWxkRm9ybShmb3JtOiBJQXBwRm9ybSB8IElBcHBGb3JtR2V0dGVyKTogSUFwcEZvcm0gfCBJQXBwRm9ybUdldHRlciB7XG4gICAgaWYgKCFmb3JtKSB0aHJvdyBuZXcgRXJyb3IoJ1RyeWluZyB0byByZW1vdmUgYW4gdW5kZWZpbmVkIGNoaWxkIGZvcm0nKTtcbiAgICBjb25zdCBpbmRleCA9ICh0aGlzLl9jaGlsZHJlbiB8fCBbXSkuZmluZEluZGV4KChjKSA9PiBjID09PSBmb3JtKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKVswXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRpc2FibGUob3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgdGhpcy5fY2hpbGRyZW4/LmZvckVhY2goKGMpID0+IGMuZGlzYWJsZShvcHRzKSk7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmcgJiYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkpIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBlbmFibGUob3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9jaGlsZHJlbj8uZm9yRWFjaCgoYykgPT4gYy5lbmFibGUob3B0cykpO1xuICAgIGlmICghdGhpcy5sb2FkaW5nICYmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbWFya0FzUHJpc3RpbmUob3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmRpcnR5U3ViamVjdC52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZGlydHlTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLl9jaGlsZHJlbj8uZm9yRWFjaCgoYykgPT4gYy5tYXJrQXNQcmlzdGluZShvcHRzKSk7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmcgJiYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkpIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBtYXJrQXNVbnRvdWNoZWQob3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy50b3VjaGVkU3ViamVjdC52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudG91Y2hlZFN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuX2NoaWxkcmVuPy5mb3JFYWNoKChjKSA9PiBjLm1hcmtBc1VudG91Y2hlZCgpKTtcbiAgICBpZiAoIXRoaXMubG9hZGluZyAmJiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBwcmVmZXIgdG8gdXNlIG1hcmtBbGxBc1RvdWNoZWQoKVxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgbWFya0FzVG91Y2hlZChvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICghdGhpcy50b3VjaGVkU3ViamVjdC52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy50b3VjaGVkU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgICB0aGlzLl9jaGlsZHJlbj8uZm9yRWFjaCgoYykgPT4gYy5tYXJrQXNUb3VjaGVkKG9wdHMpKTtcbiAgICBpZiAoIXRoaXMubG9hZGluZyAmJiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG1hcmtBbGxBc1RvdWNoZWQob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMudG91Y2hlZFN1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMudG91Y2hlZFN1YmplY3QubmV4dCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5fY2hpbGRyZW4/LmZvckVhY2goKGMpID0+IGMubWFya0FsbEFzVG91Y2hlZChvcHRzKSk7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmcgJiYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkpIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBtYXJrQXNEaXJ0eShvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICghdGhpcy5kaXJ0eVN1YmplY3QudmFsdWUpIHtcbiAgICAgIHRoaXMuZGlydHlTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICBpZiAoIXRoaXMubG9hZGluZyAmJiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBtYXJrQXNMb2FkaW5nKG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc0xvYWRlZChvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICghdGhpcy5sb2FkaW5nU3ViamVjdC5jbG9zZWQgJiYgdGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLm9ubHlTZWxmICE9PSB0cnVlKSB7XG4gICAgICAgIC8vIEVtaXQgdG8gY2hpbGRyZW4gZm9ybXMgYW5kIGVkaXRvcnNcbiAgICAgICAgLy8gbm90ZTogdGFibGVzIHNob3VsZCBiZSBjaGFuZ2VkIGJ5IHBhcmVudFxuICAgICAgICB0aGlzLmZvcm1zPy5mb3JFYWNoKChmKSA9PiBmLm1hcmtBc0xvYWRlZChvcHRzKSk7XG4gICAgICAgIHRoaXMuZWRpdG9ycz8uZm9yRWFjaCgoZSkgPT4gZS5tYXJrQXNMb2FkZWQob3B0cykpO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG1hcmtBc1JlYWR5KG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIHRoaXMuX2NoaWxkcmVuPy5mb3JFYWNoKChjKSA9PiBjLm1hcmtBc1JlYWR5KG9wdHMpKTtcbiAgICBpZiAoIXRoaXMucmVhZHlTdWJqZWN0LmNsb3NlZCAmJiAhdGhpcy5yZWFkeVN1YmplY3QudmFsdWUpIHRoaXMucmVhZHlTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gIH1cblxuICByZWFkeShvcHRzPzogV2FpdEZvck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5yZWFkeVN1YmplY3QudmFsdWUpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICByZXR1cm4gd2FpdEZvclRydWUodGhpcy5yZWFkeVN1YmplY3QsIHsgc3RvcDogdGhpcy5kZXN0cm95U3ViamVjdCwgLi4ub3B0cyB9KTtcbiAgfVxuXG4gIHdhaXRJZGxlKG9wdHM/OiBXYWl0Rm9yT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHJldHVybiB3YWl0Rm9yRmFsc2UodGhpcy5sb2FkaW5nU3ViamVjdCwgeyBzdG9wOiB0aGlzLmRlc3Ryb3lTdWJqZWN0LCAuLi5vcHRzIH0pO1xuICB9XG5cbiAgbWFya0FzU2F2aW5nKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2F2aW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBtYXJrQXNTYXZlZChvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuc2F2aW5nU3ViamVjdC5jbG9zZWQgJiYgdGhpcy5zYXZpbmdTdWJqZWN0LnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5zYXZpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjYW5jZWwoZXZlbnQ/OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzTmV3RGF0YSkge1xuICAgICAgYXdhaXQgdGhpcy51bmxvYWQoKTsgLy8gYXN5bmMgcmVzZXRcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7IC8vIGFzeW5jIHJlbG9hZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxvYWQgdGhlIHBhZ2UgKHJlbW92ZSBhbGwgZGF0YSkuIFVzZWZ1bCB3aGVuIHJldXNpbmcgYW5ndWxhciBjYWNoZSBhIGNhbmNlbGxlZCBwYWdlXG4gICAqXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBhc3luYyB1bmxvYWQob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5kZWJ1ZygnW2VkaXRvcl0gVW5sb2FkaW5nIGRhdGEuLi4nKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcbiAgICB0aGlzLl9jaGlsZHJlbj8uZm9yRWFjaCgoZikgPT4ge1xuICAgICAgaWYgKGYgaW5zdGFuY2VvZiBBcHBGb3JtKSB7XG4gICAgICAgIC8vIEZpeCBlcnJvciB3aGVuICdudWxsJyBpcyBwYXNzIChkZWZhdWx0IHZhbHVlID0ge30gd2FzIG5vdCBhcHBsaWVkKVxuICAgICAgICBmLnJlc2V0KHVuZGVmaW5lZCwgb3B0cyk7XG4gICAgICB9IGVsc2UgaWYgKGYgaW5zdGFuY2VvZiBBcHBUYWJsZSkge1xuICAgICAgICBmLmRhdGFTb3VyY2UuZGlzY29ubmVjdCgpO1xuICAgICAgfSBlbHNlIGlmIChmIGluc3RhbmNlb2YgQXBwRWRpdG9yKSB7XG4gICAgICAgIGYudW5sb2FkKG9wdHMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYXJrQXNQcmlzdGluZShvcHRzKTtcbiAgICB0aGlzLm1hcmtBc1NhdmVkKG9wdHMpO1xuICB9XG5cbiAgYXN5bmMgcmVsb2FkV2l0aENvbmZpcm1hdGlvbihjb25maXJtPzogYm9vbGVhbikge1xuICAgIGNvbnN0IG5lZWRDb25maXJtID0gdGhpcy5kaXJ0eTtcbiAgICAvLyBpZiBub3QgY29uZmlybSB5ZXQ6IGFzayBjb25maXJtYXRpb25cbiAgICBpZiAoIWNvbmZpcm0gJiYgbmVlZENvbmZpcm0pIHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoW1xuICAgICAgICAnQ09NTU9OLkJUTl9BQk9SVF9DSEFOR0VTJyxcbiAgICAgICAgJ0NPTU1PTi5CVE5fQ0FOQ0VMJyxcbiAgICAgICAgJ0NPTkZJUk0uQ0FOQ0VMX0NIQU5HRVMnLFxuICAgICAgICAnQ09ORklSTS5BTEVSVF9IRUFERVInLFxuICAgICAgXSk7XG4gICAgICBjb25zdCBhbGVydCA9IGF3YWl0IHRoaXMuYWxlcnRDdHJsLmNyZWF0ZSh7XG4gICAgICAgIGhlYWRlcjogdHJhbnNsYXRpb25zWydDT05GSVJNLkFMRVJUX0hFQURFUiddLFxuICAgICAgICBtZXNzYWdlOiB0cmFuc2xhdGlvbnNbJ0NPTkZJUk0uQ0FOQ0VMX0NIQU5HRVMnXSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9BQk9SVF9DSEFOR0VTJ10sXG4gICAgICAgICAgICBjc3NDbGFzczogJ3NlY29uZGFyeScsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbmZpcm0gPSB0cnVlOyAvLyB1cGRhdGUgdXBwZXIgdmFsdWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fQ0FOQ0VMJ10sXG4gICAgICAgICAgICByb2xlOiAnY2FuY2VsJyxcbiAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGFsZXJ0LnByZXNlbnQoKTtcbiAgICAgIGF3YWl0IGFsZXJ0Lm9uRGlkRGlzbWlzcygpO1xuICAgIH1cblxuICAgIC8vIElmIGNvbmZpcm06IGV4ZWN1dGUgdGhlIHJlbG9hZFxuICAgIGlmIChjb25maXJtIHx8ICFuZWVkQ29uZmlybSkge1xuICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnb0JhY2soZXZlbnQ/OiBFdmVudCk6IFByb21pc2U8dm9pZCB8IGJvb2xlYW4+IHtcbiAgICAvLyBHbyBiYWNrXG4gICAgaWYgKHRoaXMudG9vbGJhcj8uY2FuR29CYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy50b29sYmFyLmdvQmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCYWNrIHRvIGhvbWVcbiAgICAgIHJldHVybiB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVCYWNrKCcvJyk7XG4gICAgfVxuICB9XG5cbiAgYWJzdHJhY3QgbG9hZChpZD86IElELCBvcHRpb25zPzogTyk6IFByb21pc2U8dm9pZD47XG5cbiAgYWJzdHJhY3Qgc2F2ZShldmVudD86IEV2ZW50LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxib29sZWFuPjtcblxuICBhYnN0cmFjdCByZWxvYWQoKTogUHJvbWlzZTx2b2lkPjtcblxuICBsb2dGb3JtRXJyb3JzKHByZWZpeD86IHN0cmluZykge1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbZWRpdG9yXSBFZGl0b3Igbm90IHZhbGlkLiBDaGVja2luZyB3aGVyZSAoZm9ybXMsIHRhYmxlcykuLi4nKTtcbiAgICB0aGlzLl9jaGlsZHJlbj8uZm9yRWFjaCgoYykgPT4gdGhpcy5sb2dDaGlsZHJlbkVycm9ycyhjLCBwcmVmaXgpKTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNjcm9sbFRvVG9wKGR1cmF0aW9uPzogbnVtYmVyKSB7XG4gICAgZHVyYXRpb24gPSB0b051bWJlcihkdXJhdGlvbiwgNTAwKTtcblxuICAgIGlmICghdGhpcy5jb250ZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFt0YWItZWRpdG9yXSBDYW5ub3Qgc2Nyb2xsIHRvIHRvcC4gKG5vICdpb24tY29udGVudCcgdGFnIGZvdW5kICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuXG4gICAgICAvLyBUT0RPOiBGSVhNRSAobm90IHdvcmtpbmcgYXMgdGhlIHBhZ2UgaXMgbm90IHRoZSB3aW5kb3cpXG4gICAgICBjb25zdCBzY3JvbGxUb1RvcCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvcyA9IHdpbmRvdy5zY3JvbGxZO1xuICAgICAgICBpZiAocG9zID4gMCkge1xuICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBwb3MgLSAyMCk7IC8vIGhvdyBmYXIgdG8gc2Nyb2xsIG9uIGVhY2ggc3RlcFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHNjcm9sbFRvVG9wKTtcbiAgICAgICAgfVxuICAgICAgfSwgMTYpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbnRlbnQuc2Nyb2xsVG9Ub3AoZHVyYXRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyU3Vic2NyaXB0aW9uKHN1YjogU3Vic2NyaXB0aW9uIHwgVGVhcmRvd25Mb2dpYykge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoc3ViKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1bnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHN1YjogU3Vic2NyaXB0aW9uKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZShzdWIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVJZkRpcnR5QW5kQ29uZmlybShcbiAgICBldmVudD86IEV2ZW50LFxuICAgIG9wdHM/OiB7XG4gICAgICBlbWl0RXZlbnQ/OiBib29sZWFuO1xuICAgICAgY29uZmlybWVkPzogYm9vbGVhbjtcbiAgICB9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5kaXJ0eSkgcmV0dXJuIHRydWU7XG5cbiAgICBsZXQgY29uZmlybWVkID0gb3B0cz8uY29uZmlybWVkIHx8IGZhbHNlO1xuICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICBsZXQgY2FuY2VsID0gZmFsc2U7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFtcbiAgICAgICAgJ0NPTU1PTi5CVE5fU0FWRScsXG4gICAgICAgICdDT01NT04uQlROX0NBTkNFTCcsXG4gICAgICAgICdDT01NT04uQlROX0FCT1JUX0NIQU5HRVMnLFxuICAgICAgICAnQ09ORklSTS5TQVZFJyxcbiAgICAgICAgJ0NPTkZJUk0uQUxFUlRfSEVBREVSJyxcbiAgICAgIF0pO1xuICAgICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLmFsZXJ0Q3RybC5jcmVhdGUoe1xuICAgICAgICBoZWFkZXI6IHRyYW5zbGF0aW9uc1snQ09ORklSTS5BTEVSVF9IRUFERVInXSxcbiAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zWydDT05GSVJNLlNBVkUnXSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9DQU5DRUwnXSxcbiAgICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgICAgY3NzQ2xhc3M6ICdzZWNvbmRhcnknLFxuICAgICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgICBjYW5jZWwgPSB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9BQk9SVF9DSEFOR0VTJ10sXG4gICAgICAgICAgICBjc3NDbGFzczogJ3NlY29uZGFyeScsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7fSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9TQVZFJ10sXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbmZpcm1lZCA9IHRydWU7IC8vIHVwZGF0ZSB1cHBlciB2YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBhbGVydC5wcmVzZW50KCk7XG4gICAgICBhd2FpdCBhbGVydC5vbkRpZERpc21pc3MoKTtcblxuICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgcmV0dXJuICFjYW5jZWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2F2ZShldmVudCwgb3B0cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2hvd1RvYXN0KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMudG9hc3RDb250cm9sbGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHRvYXN0Q29udHJvbGxlciBpbiBjb21wb25lbnQncyBjb25zdHJ1Y3RvclwiKTtcbiAgICBhd2FpdCBUb2FzdHMuc2hvdyh0aGlzLnRvYXN0Q29udHJvbGxlciwgdGhpcy50cmFuc2xhdGUsIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxvZ0NoaWxkcmVuRXJyb3JzKGM6IElBcHBGb3JtIHwgQWJzdHJhY3RDb250cm9sLCBwcmVmaXg/OiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcpIHtcbiAgICBwcmVmaXggPSBwcmVmaXggfHwgJ1thcHAtdGFiLWVkaXRvcl0gJztcbiAgICAvLyBJZiBlZGl0b3JcbiAgICBpZiAoYyBpbnN0YW5jZW9mIEFwcEVkaXRvcikge1xuICAgICAgaWYgKCFjLmVtcHR5ICYmICFjLnZhbGlkKSB7XG4gICAgICAgIGlmIChjLnBlbmRpbmcpIHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gYy5jb25zdHJ1Y3Rvci5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgY29uc29sZS53YXJuKGAke3ByZWZpeH0gLT4gJHtwYXRofTogd2FpdGluZyB3aGlsZSBwZW5kaW5nLi4uYCk7XG4gICAgICAgICAgQXBwRm9ybVV0aWxzLndhaXRXaGlsZVBlbmRpbmcoYywgeyB0aW1lb3V0OiAxMDAwIH0pLnRoZW4oKCkgPT4gYy5sb2dGb3JtRXJyb3JzKHByZWZpeCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGMubG9nRm9ybUVycm9ycyhwcmVmaXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEFuZ3VsYXIgZm9ybSBjb250cm9sXG4gICAgZWxzZSBpZiAoYyBpbnN0YW5jZW9mIEFic3RyYWN0Q29udHJvbCkge1xuICAgICAgQXBwRm9ybVV0aWxzLmxvZ0Zvcm1FcnJvcnMoYywgcHJlZml4LCBwYXRoKTtcbiAgICB9XG4gICAgLy8gSWYgZm9ybSBwcm92aWRlcjogZ2V0IGRlbGVnYXRlXG4gICAgZWxzZSBpZiAoYyBpbnN0YW5jZW9mIEFwcEZvcm1Qcm92aWRlcikge1xuICAgICAgaWYgKCFjLmVtcHR5ICYmICFjLnZhbGlkKSB7XG4gICAgICAgIGMud2FpdERlbGVnYXRlKHsgdGltZW91dDogMTAwMCB9KS50aGVuKChkZWxlZ2F0ZSkgPT4gdGhpcy5sb2dDaGlsZHJlbkVycm9ycyhkZWxlZ2F0ZSwgcHJlZml4LCAncHJvdmlkZXInKSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhYmxlXG4gICAgZWxzZSBpZiAoYyBpbnN0YW5jZW9mIEFwcFRhYmxlKSB7XG4gICAgICBpZiAoYy5pbnZhbGlkICYmIGMuZWRpdGVkUm93ICYmIGMuZWRpdGVkUm93LnZhbGlkYXRvcikge1xuICAgICAgICBjb25zdCBwYXRoID0gYy5jb25zdHJ1Y3Rvci5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIEFwcEZvcm1VdGlscy5sb2dGb3JtRXJyb3JzKGMuZWRpdGVkUm93LnZhbGlkYXRvciwgcHJlZml4LCBwYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgZm9ybVxuICAgIGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBBcHBGb3JtKSB7XG4gICAgICBpZiAoIWMuZW1wdHkgJiYgIWMudmFsaWQpIHtcbiAgICAgICAgaWYgKGMucGVuZGluZykge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBjLmNvbnN0cnVjdG9yLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYCR7cHJlZml4fSAtPiAke3BhdGh9OiB3YWl0aW5nIHdoaWxlIHBlbmRpbmcuLi5gKTtcbiAgICAgICAgICBBcHBGb3JtVXRpbHMud2FpdFdoaWxlUGVuZGluZyhjLCB7IHRpbWVvdXQ6IDEwMDAgfSkudGhlbigoKSA9PiB0aGlzLmxvZ0NoaWxkcmVuRXJyb3JzKGMuZm9ybSwgcHJlZml4LCBwYXRoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQXBwRm9ybVV0aWxzLmxvZ0Zvcm1FcnJvcnMoYy5mb3JtLCBwcmVmaXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgJHtwcmVmaXh9IFVua25vd24gY2hpbGRyZW4gc3ViLWZvcm06IGAsIGMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRFcnJvcih2YWx1ZTogc3RyaW5nLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICAvLyBDb21wYXJlIHVzaW5nICchPScgdG8gZGV0ZWN0IG51bGwgYW5kIHVuZGVmaW5lZCBhcyBzYW1lIHZhbHVlXG4gICAgaWYgKHRoaXMuZXJyb3JTdWJqZWN0LnZhbHVlICE9IHZhbHVlKSB7XG4gICAgICB0aGlzLmVycm9yU3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0RXJyb3Iob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5zZXRFcnJvcih1bmRlZmluZWQsIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICAvLyBTaG91bGQgYmUgb3ZlcnJpZGUgYnkgc3ViY2xhc3NlcywgaWYgY2hhbmdlIGRldGVjdGlvbiBpcyBQdXNoXG4gIH1cbn1cblxuQERpcmVjdGl2ZSgpXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBcHBUYWJFZGl0b3I8VCA9IGFueSwgSUQgPSBudW1iZXIsIE8gPSBhbnk+IGV4dGVuZHMgQXBwRWRpdG9yPFQsIElELCBPPiBpbXBsZW1lbnRzIElBcHBUYWJFZGl0b3IsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIF9zZWxlY3RlZFRhYkluZGV4ID0gMDtcblxuICAvLyBFZGl0b3Igb3B0aW9uc1xuICB0YWJDb3VudDogbnVtYmVyO1xuICBlbmFibGVTd2lwZTogYm9vbGVhbjtcbiAgdGFiR3JvdXBBbmltYXRpb25EdXJhdGlvbjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHF1ZXJ5VGFiSW5kZXhQYXJhbU5hbWU6IHN0cmluZztcblxuICBASW5wdXQoKSBzZXQgc2VsZWN0ZWRUYWJJbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRTZWxlY3RlZFRhYkluZGV4KHZhbHVlKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRUYWJJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFRhYkluZGV4O1xuICB9XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkVGFiSW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBAVmlld0NoaWxkKCd0YWJHcm91cCcsIHsgc3RhdGljOiB0cnVlIH0pIHRhYkdyb3VwOiBNYXRUYWJHcm91cDtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgLy8gTW9kYWwgZWRpdG9yIGdpdmUgJ251bGwnXG4gICAgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyLFxuICAgIHByb3RlY3RlZCBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCBhbGVydEN0cmw6IEFsZXJ0Q29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIG9wdGlvbnM/OiBBcHBUYWJFZGl0b3JPcHRpb25zXG4gICkge1xuICAgIHN1cGVyKHJvdXRlLCByb3V0ZXIsIG5hdkNvbnRyb2xsZXIsIGFsZXJ0Q3RybCwgdHJhbnNsYXRlKTtcbiAgICBvcHRpb25zID0ge1xuICAgICAgdGFiQ291bnQ6IDEsXG4gICAgICBlbmFibGVTd2lwZTogdHJ1ZSxcbiAgICAgIHRhYkdyb3VwQW5pbWF0aW9uRHVyYXRpb246ICcyMDBtcycsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gICAgdGhpcy50YWJDb3VudCA9IG9wdGlvbnMudGFiQ291bnQ7XG4gICAgdGhpcy5lbmFibGVTd2lwZSA9IG9wdGlvbnMuZW5hYmxlU3dpcGU7XG4gICAgdGhpcy50YWJHcm91cEFuaW1hdGlvbkR1cmF0aW9uID0gb3B0aW9ucy50YWJHcm91cEFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIHRoaXMucXVlcnlUYWJJbmRleFBhcmFtTmFtZSA9ICd0YWInO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIC8vIFJlYWQgdGhlIHNlbGVjdGVkIHRhYiBpbmRleCwgZnJvbSBwYXRoIHF1ZXJ5IHBhcmFtc1xuICAgIGlmICh0aGlzLnRhYkdyb3VwICYmIHRoaXMucm91dGUgJiYgdGhpcy5xdWVyeVRhYkluZGV4UGFyYW1OYW1lKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocXVlcnlQYXJhbXMpID0+IHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zID0geyAuLi5xdWVyeVBhcmFtcyB9O1xuXG4gICAgICAgICAgLy8gUGFyc2UgdGFiIHBhcmFtXG4gICAgICAgICAgaWYgKHRoaXMudGFiQ291bnQgPiAxICYmIHRoaXMucXVlcnlUYWJJbmRleFBhcmFtTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdGFiSW5kZXggPSB0b051bWJlcihxdWVyeVBhcmFtc1t0aGlzLnF1ZXJ5VGFiSW5kZXhQYXJhbU5hbWVdLCAwKTtcbiAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbXNbdGhpcy5xdWVyeVRhYkluZGV4UGFyYW1OYW1lXSA9IHRhYkluZGV4ICE9PSAwID8gdGFiSW5kZXggOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFRhYkluZGV4ICE9PSB0YWJJbmRleCkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSB0YWJJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZWFsaWduIHRhYiwgYWZ0ZXIgYSBkZWxheSBiZWNhdXNlIHRoZSB0YWIgY2FuIGJlIGRpc2FibGVkIHdoZW4gY29tcG9uZW50IGlzIGNyZWF0ZWRcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGFiR3JvdXAucmVhbGlnbklua0JhcigpLCA1MDApO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleENoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmVycm9yU3ViamVjdC51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgc2V0U2VsZWN0ZWRUYWJJbmRleCh2YWx1ZTogbnVtYmVyLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuOyByZWFsaWduSW5rQmFyPzogYm9vbGVhbiB9KSB7XG4gICAgLy8gRml4IHZhbHVlXG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdmFsdWUgPSAwO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPiB0aGlzLnRhYkNvdW50IC0gMSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFiLWVkaXRvcl0gSW52YWxpZCB0YWIgaW5kZXggJHt2YWx1ZX0uIE1heCB2YWx1ZSBpcyAke3RoaXMudGFiQ291bnQgLSAxfWApO1xuICAgICAgdmFsdWUgPSB0aGlzLl9zZWxlY3RlZFRhYkluZGV4O1xuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGVkVGFiSW5kZXggPSB2YWx1ZTtcbiAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXhDaGFuZ2UubmV4dCh2YWx1ZSk7XG5cbiAgICBpZiAodGhpcy50YWJHcm91cCAmJiAoIW9wdHMgfHwgb3B0cy5yZWFsaWduSW5rQmFyICE9PSBmYWxzZSkpIHtcbiAgICAgIHRoaXMudGFiR3JvdXAuc2VsZWN0ZWRJbmRleCA9IHZhbHVlO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIC8vIFdhaXQgdGFiIGNoYW5nZSBpbiBVSSwgYmVmb3JlIHJlYWxpZ24gaW5rIHRhYlxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRhYkdyb3VwLnJlYWxpZ25JbmtCYXIoKSwgMjAwKTtcbiAgICB9IGVsc2UgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICByZWFsaWduSW5rQmFyKCkge1xuICAgIHRoaXMudGFiR3JvdXA/LnJlYWxpZ25JbmtCYXIoKTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKGV2ZW50OiBNYXRUYWJDaGFuZ2VFdmVudCwgcXVlcnlUYWJJbmRleFBhcmFtTmFtZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHF1ZXJ5VGFiSW5kZXhQYXJhbU5hbWUgPSBxdWVyeVRhYkluZGV4UGFyYW1OYW1lIHx8IHRoaXMucXVlcnlUYWJJbmRleFBhcmFtTmFtZTtcblxuICAgIGlmICghcXVlcnlUYWJJbmRleFBhcmFtTmFtZSB8fCAhdGhpcy5yb3V0ZSkgcmV0dXJuIHRydWU7IC8vIFNraXAgaWYgdGFiIHF1ZXJ5IHBhcmFtIG5vdCBzZXQsIG9yIG5vIHJvdXRlXG5cbiAgICBpZiAoIXRoaXMucXVlcnlQYXJhbXMgfHwgK3RoaXMucXVlcnlQYXJhbXNbcXVlcnlUYWJJbmRleFBhcmFtTmFtZV0gIT09IGV2ZW50LmluZGV4KSB7XG4gICAgICB0aGlzLnF1ZXJ5UGFyYW1zID0gdGhpcy5xdWVyeVBhcmFtcyB8fCB7fTtcbiAgICAgIHRoaXMucXVlcnlQYXJhbXNbcXVlcnlUYWJJbmRleFBhcmFtTmFtZV0gPSBldmVudC5pbmRleCAhPT0gMCA/IGV2ZW50LmluZGV4IDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAocXVlcnlUYWJJbmRleFBhcmFtTmFtZSA9PT0gJ3RhYicgJiYgaXNOb3ROaWwodGhpcy5xdWVyeVBhcmFtc1snc3VidGFiJ10pKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnF1ZXJ5UGFyYW1zLnN1YnRhYjsgLy8gY2xlYW4gc3VidGFiXG4gICAgICB9XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4nXSwge1xuICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICBxdWVyeVBhcmFtczogdGhpcy5xdWVyeVBhcmFtcyxcbiAgICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgICAgc3RhdGU6IHsgYW5pbWF0ZWQ6IGZhbHNlIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQWN0aW9uIHRyaWdnZXJlZCB3aGVuIHVzZXIgc3dpcGVzXG4gICAqL1xuICBvblN3aXBlVGFiKGV2ZW50OiBIYW1tZXJTd2lwZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgLy8gREVCVUdcbiAgICAvLyBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhcIlt0YWItcGFnZV0gb25Td2lwZVRhYigpXCIpO1xuXG4gICAgLy8gU2tpcCwgaWYgbm90IGEgdmFsaWQgc3dpcGUgZXZlbnRcbiAgICBpZiAoXG4gICAgICAhdGhpcy5lbmFibGVTd2lwZSB8fFxuICAgICAgIWV2ZW50IHx8XG4gICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkIHx8XG4gICAgICAoZXZlbnQuc3JjRXZlbnQgJiYgZXZlbnQuc3JjRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgfHxcbiAgICAgIGV2ZW50LnBvaW50ZXJUeXBlICE9PSAndG91Y2gnXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gREVCVUdcbiAgICAvL2lmICh0aGlzLmRlYnVnKVxuICAgIC8vY29uc29sZS5kZWJ1ZyhcIlt0YWItcGFnZV0gRGV0ZWN0ZWQgc3dpcGU6IFwiICsgZXZlbnQudHlwZSwgZXZlbnQpO1xuXG4gICAgbGV0IHNlbGVjdFRhYkluZGV4ID0gdGhpcy5zZWxlY3RlZFRhYkluZGV4O1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgLy8gT3BlbiBuZXh0IHRhYlxuICAgICAgY2FzZSAnc3dpcGVsZWZ0JzpcbiAgICAgICAgc2VsZWN0VGFiSW5kZXggPSBzZWxlY3RUYWJJbmRleCA+PSB0aGlzLnRhYkNvdW50IC0gMSA/IDAgOiBzZWxlY3RUYWJJbmRleCArIDE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAvLyBPcGVuIHByZXZpb3VzIHRhYlxuICAgICAgY2FzZSAnc3dpcGVyaWdodCc6XG4gICAgICAgIHNlbGVjdFRhYkluZGV4ID0gc2VsZWN0VGFiSW5kZXggPD0gMCA/IHRoaXMudGFiQ291bnQgOiBzZWxlY3RUYWJJbmRleCAtIDE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAvLyBPdGhlciBjYXNlXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKCdbdGFiLXBhZ2VdIFVua25vd24gc3dpcGUgYWN0aW9uOiAnICsgZXZlbnQudHlwZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IHNlbGVjdFRhYkluZGV4O1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25TdWJUYWJDaGFuZ2UoZXZlbnQ6IE1hdFRhYkNoYW5nZUV2ZW50KSB7XG4gICAgdGhpcy5vblRhYkNoYW5nZShldmVudCwgJ3N1YnRhYicpO1xuICB9XG5cbiAgYXN5bmMgdW5sb2FkKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IDA7XG4gICAgYXdhaXQgc3VwZXIudW5sb2FkKG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEZpcnN0SW52YWxpZFRhYkluZGV4KCk6IG51bWJlcjtcblxuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZURpcnR5Q2hpbGRyZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gU2F2ZSBhbGwgZGlydHkgdGFibGVzXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFsuLi50aGlzLnRhYmxlcywgLi4udGhpcy5lZGl0b3JzXS5maWx0ZXIoKGMpID0+IGMuZGlydHkpLm1hcCgoYykgPT4gYy5zYXZlKCkpKTtcblxuICAgIHJldHVybiAhcmVzdWx0cy5zb21lKChzYXZlZCkgPT4gc2F2ZWQgIT09IHRydWUpO1xuICB9XG59XG4iXX0=
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vZW50aXR5L2VkaXRvci5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZGLE9BQU8sRUFBbUIsVUFBVSxFQUFrQyxNQUFNLGdCQUFnQixDQUFDO0FBRTdGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFNUUsT0FBTyxFQUFvQixNQUFNLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXJELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQXFCLE1BQU0seUJBQXlCLENBQUM7Ozs7O0FBUTlFLGtFQUFrRTtBQUNsRSxNQUFNLE9BQWdCLFNBQ3BCLFNBQVEsZ0JBQW1CO0lBeUJmO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUExQkYsZUFBZSxDQUFrQjtJQUVsQyxhQUFhLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFN0QsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixXQUFXLENBQVM7SUFDcEIsV0FBVyxDQUdUO0lBRUYsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxJQUFJLENB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QU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRWpILE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVTLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBc0I7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ2pHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEUsQ0FBQzt1R0EvUW1CLFNBQVM7MkZBQVQsU0FBUyxtRUFtQmxCLFlBQVksaUZBQ1osbUJBQW1CLHdGQUNuQixVQUFVOzsyRkFyQkQsU0FBUztrQkFGOUIsU0FBUztpTUFxQmlCLE9BQU87c0JBQS9CLFNBQVM7dUJBQUMsWUFBWTtnQkFDMkIsY0FBYztzQkFBL0QsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ1AsT0FBTztzQkFBL0MsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyLCBJb25Db250ZW50LCBOYXZDb250cm9sbGVyLCBUb2FzdENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFwcFRhYmxlIH0gZnJvbSAnLi4vLi4vdGFibGUvdGFibGUuY2xhc3MnO1xuaW1wb3J0IHsgQXBwRm9ybSB9IGZyb20gJy4uL2Zvcm0uY2xhc3MnO1xuaW1wb3J0IHsgRm9ybUJ1dHRvbnNCYXJUb2tlbiB9IGZyb20gJy4uL2J1dHRvbnMvZm9ybS1idXR0b25zLWJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUFwcEZvcm0sIElBcHBGb3JtR2V0dGVyIH0gZnJvbSAnLi4vZm9ybS51dGlscyc7XG5pbXBvcnQgeyBTaG93VG9hc3RPcHRpb25zLCBUb2FzdHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdG9hc3QvdG9hc3RzJztcbmltcG9ydCB7IFRvb2xiYXJUb2tlbiB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC90b29sYmFyL3Rvb2xiYXInO1xuaW1wb3J0IHsgdG9OdW1iZXIgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IENhbkxlYXZlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2d1YXJkL2NvbXBvbmVudC1kaXJ0eS5ndWFyZCc7XG5pbXBvcnQgeyB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBcHBGb3JtQ29udGFpbmVyLCBJQXBwRm9ybUNvbnRhaW5lciB9IGZyb20gJy4uL2Zvcm0tY29udGFpbmVyLmNsYXNzJztcblxuZXhwb3J0IGludGVyZmFjZSBJQXBwRWRpdG9yPFQ+IGV4dGVuZHMgQ2FuTGVhdmUsIElBcHBGb3JtQ29udGFpbmVyPFQ+IHtcbiAgc2F2ZShldmVudD86IEV2ZW50LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxib29sZWFuPjtcbiAgY2FuY2VsKGV2ZW50PzogRXZlbnQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFwcEVkaXRvcjxUID0gYW55LCBJRCA9IG51bWJlciwgTyA9IGFueT5cbiAgZXh0ZW5kcyBBcHBGb3JtQ29udGFpbmVyPFQ+XG4gIGltcGxlbWVudHMgSUFwcEVkaXRvcjxUPiwgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXRcbntcbiAgcHJvdGVjdGVkIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyO1xuXG4gIHJlYWRvbmx5IHNhdmluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgcXVlcnlQYXJhbXM6IFBhcmFtcztcbiAgaTE4bkNvbnRleHQ6IHtcbiAgICBwcmVmaXg6IHN0cmluZztcbiAgICBzdWZmaXg6IHN0cmluZztcbiAgfTtcblxuICBnZXQgc2F2aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgfHwgdGhpcy5lZGl0b3JzPy5zb21lKChlKSA9PiBlLnNhdmluZyk7XG4gIH1cblxuICBAVmlld0NoaWxkKFRvb2xiYXJUb2tlbikgdG9vbGJhcjogVG9vbGJhclRva2VuIHwgbnVsbCA9IG51bGw7XG4gIEBWaWV3Q2hpbGQoRm9ybUJ1dHRvbnNCYXJUb2tlbiwgeyBzdGF0aWM6IHRydWUgfSkgZm9ybUJ1dHRvbnNCYXI6IEZvcm1CdXR0b25zQmFyVG9rZW4gfCBudWxsID0gbnVsbDtcbiAgQFZpZXdDaGlsZChJb25Db250ZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBjb250ZW50OiBJb25Db250ZW50O1xuXG4gIGFic3RyYWN0IGdldCBpc05ld0RhdGEoKTogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJvdGVjdGVkIG5hdkNvbnRyb2xsZXI6IE5hdkNvbnRyb2xsZXIsXG4gICAgcHJvdGVjdGVkIGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9sb2dQcmVmaXggPSAnW2VkaXRvcl0gJztcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICBpZiAodGhpcy5mb3JtQnV0dG9uc0Jhcikge1xuICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgICAgdGhpcy5mb3JtQnV0dG9uc0Jhci5vbkJhY2tcbiAgICAgICAgICAucGlwZSh0aHJvdHRsZVRpbWUoMjAwKSkgLy8gQXZvaWQgdG8gYmUgY2FsbGVkIHR3aWNlXG4gICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHRoaXMuZ29CYWNrKGV2ZW50KSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1lbXB0eS1saWZlY3ljbGUtbWV0aG9kXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBDYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuc2F2aW5nU3ViamVjdC51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBhZGRGb3JtKHBhdGgsIGZvcm0pXG4gICAqIEBwYXJhbSBmb3JtXG4gICAqL1xuICBhZGRDaGlsZEZvcm0oZm9ybTogSUFwcEZvcm0gfCBJQXBwRm9ybUdldHRlcikge1xuICAgIHRoaXMuYWRkRm9ybShudWxsLCBmb3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYWRkRm9ybXMoKVxuICAgKiBAcGFyYW0gZm9ybXNcbiAgICovXG4gIGFkZENoaWxkRm9ybXMoZm9ybXM6IChJQXBwRm9ybSB8IElBcHBGb3JtR2V0dGVyKVtdKSB7XG4gICAgdGhpcy5hZGRGb3Jtcyhmb3Jtcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHJlbW92ZUZvcm0oKVxuICAgKiBAcGFyYW0gZm9ybVxuICAgKi9cbiAgcmVtb3ZlQ2hpbGRGb3JtKGZvcm06IElBcHBGb3JtIHwgSUFwcEZvcm1HZXR0ZXIpOiBJQXBwRm9ybSB8IElBcHBGb3JtR2V0dGVyIHtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmVGb3JtKGZvcm0pO1xuICB9XG5cbiAgbWFya0FzU2F2aW5nKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2F2aW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBtYXJrQXNTYXZlZChvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuc2F2aW5nU3ViamVjdC5jbG9zZWQgJiYgdGhpcy5zYXZpbmdTdWJqZWN0LnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5zYXZpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjYW5jZWwoZXZlbnQ/OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzTmV3RGF0YSkge1xuICAgICAgYXdhaXQgdGhpcy51bmxvYWQoKTsgLy8gYXN5bmMgcmVzZXRcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7IC8vIGFzeW5jIHJlbG9hZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxvYWQgdGhlIHBhZ2UgKHJlbW92ZSBhbGwgZGF0YSkuIFVzZWZ1bCB3aGVuIHJldXNpbmcgYW5ndWxhciBjYWNoZSBhIGNhbmNlbGxlZCBwYWdlXG4gICAqXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBhc3luYyB1bmxvYWQob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5kZWJ1Zyh0aGlzLl9sb2dQcmVmaXggKyAnVW5sb2FkaW5nIGRhdGEuLi4nKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcbiAgICB0aGlzLmNoaWxkcmVuPy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBpZiAoZiBpbnN0YW5jZW9mIEFwcEZvcm0pIHtcbiAgICAgICAgLy8gRml4IGVycm9yIHdoZW4gJ251bGwnIGlzIHBhc3MgKGRlZmF1bHQgdmFsdWUgPSB7fSB3YXMgbm90IGFwcGxpZWQpXG4gICAgICAgIGYucmVzZXQodW5kZWZpbmVkLCBvcHRzKTtcbiAgICAgIH0gZWxzZSBpZiAoZiBpbnN0YW5jZW9mIEFwcFRhYmxlKSB7XG4gICAgICAgIGYuZGF0YVNvdXJjZS5kaXNjb25uZWN0KCk7XG4gICAgICB9IGVsc2UgaWYgKGYgaW5zdGFuY2VvZiBBcHBFZGl0b3IpIHtcbiAgICAgICAgZi51bmxvYWQob3B0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKG9wdHMpO1xuICAgIHRoaXMubWFya0FzU2F2ZWQob3B0cyk7XG4gIH1cblxuICBhc3luYyByZWxvYWRXaXRoQ29uZmlybWF0aW9uKGNvbmZpcm0/OiBib29sZWFuKSB7XG4gICAgY29uc3QgbmVlZENvbmZpcm0gPSB0aGlzLmRpcnR5O1xuICAgIC8vIGlmIG5vdCBjb25maXJtIHlldDogYXNrIGNvbmZpcm1hdGlvblxuICAgIGlmICghY29uZmlybSAmJiBuZWVkQ29uZmlybSkge1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25zID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChbXG4gICAgICAgICdDT01NT04uQlROX0FCT1JUX0NIQU5HRVMnLFxuICAgICAgICAnQ09NTU9OLkJUTl9DQU5DRUwnLFxuICAgICAgICAnQ09ORklSTS5DQU5DRUxfQ0hBTkdFUycsXG4gICAgICAgICdDT05GSVJNLkFMRVJUX0hFQURFUicsXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydEN0cmwuY3JlYXRlKHtcbiAgICAgICAgaGVhZGVyOiB0cmFuc2xhdGlvbnNbJ0NPTkZJUk0uQUxFUlRfSEVBREVSJ10sXG4gICAgICAgIG1lc3NhZ2U6IHRyYW5zbGF0aW9uc1snQ09ORklSTS5DQU5DRUxfQ0hBTkdFUyddLFxuICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0FCT1JUX0NIQU5HRVMnXSxcbiAgICAgICAgICAgIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyxcbiAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgICAgY29uZmlybSA9IHRydWU7IC8vIHVwZGF0ZSB1cHBlciB2YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9DQU5DRUwnXSxcbiAgICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgICAgaGFuZGxlcjogKCkgPT4ge30sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYWxlcnQucHJlc2VudCgpO1xuICAgICAgYXdhaXQgYWxlcnQub25EaWREaXNtaXNzKCk7XG4gICAgfVxuXG4gICAgLy8gSWYgY29uZmlybTogZXhlY3V0ZSB0aGUgcmVsb2FkXG4gICAgaWYgKGNvbmZpcm0gfHwgIW5lZWRDb25maXJtKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvVG9wKCk7XG4gICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdvQmFjayhldmVudD86IEV2ZW50KTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4ge1xuICAgIC8vIEdvIGJhY2tcbiAgICBpZiAodGhpcy50b29sYmFyPy5jYW5Hb0JhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnRvb2xiYXIuZ29CYWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJhY2sgdG8gaG9tZVxuICAgICAgcmV0dXJuIHRoaXMubmF2Q29udHJvbGxlci5uYXZpZ2F0ZUJhY2soJy8nKTtcbiAgICB9XG4gIH1cblxuICBhYnN0cmFjdCBsb2FkKGlkPzogSUQsIG9wdGlvbnM/OiBPKTogUHJvbWlzZTx2b2lkPjtcblxuICBhYnN0cmFjdCBzYXZlKGV2ZW50PzogRXZlbnQsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIGFic3RyYWN0IHJlbG9hZCgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNjcm9sbFRvVG9wKGR1cmF0aW9uPzogbnVtYmVyKSB7XG4gICAgZHVyYXRpb24gPSB0b051bWJlcihkdXJhdGlvbiwgNTAwKTtcblxuICAgIGlmICghdGhpcy5jb250ZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFt0YWItZWRpdG9yXSBDYW5ub3Qgc2Nyb2xsIHRvIHRvcC4gKG5vICdpb24tY29udGVudCcgdGFnIGZvdW5kICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuXG4gICAgICAvLyBUT0RPOiBGSVhNRSAobm90IHdvcmtpbmcgYXMgdGhlIHBhZ2UgaXMgbm90IHRoZSB3aW5kb3cpXG4gICAgICBjb25zdCBzY3JvbGxUb1RvcCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvcyA9IHdpbmRvdy5zY3JvbGxZO1xuICAgICAgICBpZiAocG9zID4gMCkge1xuICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBwb3MgLSAyMCk7IC8vIGhvdyBmYXIgdG8gc2Nyb2xsIG9uIGVhY2ggc3RlcFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHNjcm9sbFRvVG9wKTtcbiAgICAgICAgfVxuICAgICAgfSwgMTYpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbnRlbnQuc2Nyb2xsVG9Ub3AoZHVyYXRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVJZkRpcnR5QW5kQ29uZmlybShcbiAgICBldmVudD86IEV2ZW50LFxuICAgIG9wdHM/OiB7XG4gICAgICBlbWl0RXZlbnQ/OiBib29sZWFuO1xuICAgICAgY29uZmlybWVkPzogYm9vbGVhbjtcbiAgICB9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5kaXJ0eSkgcmV0dXJuIHRydWU7XG5cbiAgICBsZXQgY29uZmlybWVkID0gb3B0cz8uY29uZmlybWVkIHx8IGZhbHNlO1xuICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICBsZXQgY2FuY2VsID0gZmFsc2U7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFtcbiAgICAgICAgJ0NPTU1PTi5CVE5fU0FWRScsXG4gICAgICAgICdDT01NT04uQlROX0NBTkNFTCcsXG4gICAgICAgICdDT01NT04uQlROX0FCT1JUX0NIQU5HRVMnLFxuICAgICAgICAnQ09ORklSTS5TQVZFJyxcbiAgICAgICAgJ0NPTkZJUk0uQUxFUlRfSEVBREVSJyxcbiAgICAgIF0pO1xuICAgICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLmFsZXJ0Q3RybC5jcmVhdGUoe1xuICAgICAgICBoZWFkZXI6IHRyYW5zbGF0aW9uc1snQ09ORklSTS5BTEVSVF9IRUFERVInXSxcbiAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zWydDT05GSVJNLlNBVkUnXSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9DQU5DRUwnXSxcbiAgICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgICAgY3NzQ2xhc3M6ICdzZWNvbmRhcnknLFxuICAgICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgICBjYW5jZWwgPSB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9BQk9SVF9DSEFOR0VTJ10sXG4gICAgICAgICAgICBjc3NDbGFzczogJ3NlY29uZGFyeScsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7fSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9TQVZFJ10sXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbmZpcm1lZCA9IHRydWU7IC8vIHVwZGF0ZSB1cHBlciB2YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBhbGVydC5wcmVzZW50KCk7XG4gICAgICBhd2FpdCBhbGVydC5vbkRpZERpc21pc3MoKTtcblxuICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgcmV0dXJuICFjYW5jZWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2F2ZShldmVudCwgb3B0cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZURpcnR5Q2hpbGRyZW4oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gU2F2ZSBhbGwgZGlydHkgdGFibGVzXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFsuLi50aGlzLnRhYmxlcywgLi4udGhpcy5lZGl0b3JzXS5maWx0ZXIoKGMpID0+IGMuZGlydHkpLm1hcCgoYykgPT4gYy5zYXZlKCkpKTtcblxuICAgIHJldHVybiAhcmVzdWx0cy5zb21lKChzYXZlZCkgPT4gc2F2ZWQgIT09IHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNob3dUb2FzdChvcHRzOiBTaG93VG9hc3RPcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLnRvYXN0Q29udHJvbGxlcikgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyB0b2FzdENvbnRyb2xsZXIgaW4gY29tcG9uZW50J3MgY29uc3RydWN0b3JcIik7XG4gICAgYXdhaXQgVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCBvcHRzKTtcbiAgfVxufVxuIl19
|