@colijnit/corecomponents_v12 12.0.18 → 12.0.21
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/bundles/colijnit-corecomponents_v12.umd.js +283 -81
- package/bundles/colijnit-corecomponents_v12.umd.js.map +1 -1
- package/colijnit-corecomponents_v12.d.ts +14 -16
- package/colijnit-corecomponents_v12.metadata.json +1 -1
- package/esm2015/colijnit-corecomponents_v12.js +15 -17
- package/esm2015/lib/components/base/base-input.component.js +181 -36
- package/esm2015/lib/components/carousel-3d/carousel-3d.component.js +12 -6
- package/esm2015/lib/components/co-dialog/co-dialog.module.js +1 -3
- package/esm2015/lib/components/collapsible/collapsible.component.js +10 -2
- package/esm2015/lib/components/drop-down-list/drop-down-list.component.js +1 -1
- package/esm2015/lib/components/drop-down-list/drop-down.module.js +6 -6
- package/esm2015/lib/components/form/form.component.js +18 -18
- package/esm2015/lib/components/input-checkbox/input-checkbox.component.js +1 -1
- package/esm2015/lib/components/input-checkbox-multi-select/input-checkbox-multi-select.component.js +1 -1
- package/esm2015/lib/components/input-date-picker/input-date-picker.component.js +1 -1
- package/esm2015/lib/components/input-radio-button/input-radio-button.component.js +1 -1
- package/esm2015/lib/components/input-text/input-text.component.js +15 -4
- package/esm2015/lib/components/input-text/input-text.module.js +1 -1
- package/esm2015/lib/components/input-textarea/input-textarea.component.js +8 -8
- package/esm2015/lib/components/multi-select-list/multi-select-list.module.js +6 -6
- package/esm2015/lib/components/validation-error/validation-error.component.js +13 -1
- package/esm2015/lib/components/validation-error/validation-error.module.js +4 -2
- package/esm2015/public-api.js +3 -1
- package/fesm2015/colijnit-corecomponents_v12.js +246 -69
- package/fesm2015/colijnit-corecomponents_v12.js.map +1 -1
- package/lib/components/base/base-input.component.d.ts +23 -5
- package/lib/components/co-kanban/style/_layout.scss +4 -0
- package/lib/components/co-kanban/style/_material-definition.scss +2 -0
- package/lib/components/drop-down-list/style/_layout.scss +2 -1
- package/lib/components/drop-down-list/style/_material-definition.scss +2 -0
- package/lib/components/form/form.component.d.ts +2 -3
- package/lib/components/input-checkbox/style/_material-definition.scss +1 -2
- package/lib/components/input-checkbox/style/material.scss +2 -0
- package/lib/components/input-checkbox-multi-select/style/_layout.scss +5 -1
- package/lib/components/input-checkbox-multi-select/style/_material-definition.scss +2 -0
- package/lib/components/input-combo-box/style/_layout.scss +4 -2
- package/lib/components/input-combo-box/style/_material-definition.scss +2 -0
- package/lib/components/input-date-picker/style/_layout.scss +2 -1
- package/lib/components/input-date-picker/style/_material-definition.scss +4 -0
- package/lib/components/input-listbox/style/_layout.scss +0 -1
- package/lib/components/input-listbox/style/_material-definition.scss +2 -2
- package/lib/components/input-text/style/_layout.scss +32 -0
- package/lib/components/input-text/style/_material-definition.scss +3 -0
- package/lib/components/input-text/style/_theme.scss +21 -1
- package/lib/components/input-textarea/style/_theme.scss +1 -0
- package/lib/components/multi-select-list/style/_layout.scss +2 -1
- package/lib/components/multi-select-list/style/_material-definition.scss +2 -0
- package/lib/components/multi-select-list/style/_theme.scss +5 -1
- package/lib/components/validation-error/style/_layout.scss +10 -2
- package/lib/components/validation-error/validation-error.component.d.ts +6 -0
- package/lib/style/_input.mixins.scss +4 -3
- package/lib/style/_variables.scss +41 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
1
|
+
import { __awaiter, __decorate } from "tslib";
|
|
2
2
|
import { ChangeDetectorRef, ComponentFactoryResolver, Directive, ElementRef, EventEmitter, HostBinding, HostListener, Injectable, Input, Optional, Output, ViewChild, ViewContainerRef } from "@angular/core";
|
|
3
3
|
import { NgModel } from "@angular/forms";
|
|
4
4
|
import { isNill } from "../../core/function/is-nill.function";
|
|
@@ -23,10 +23,13 @@ export class BaseInputComponent {
|
|
|
23
23
|
this.formUserChangeListener = formUserChangeListener;
|
|
24
24
|
this.ngZoneWrapper = ngZoneWrapper;
|
|
25
25
|
this.elementRef = elementRef;
|
|
26
|
+
this.showSaveCancel = false;
|
|
26
27
|
this.noValidation = false;
|
|
27
28
|
this.forceRequired = false; // a force outside of [cfgName]'s influence
|
|
28
29
|
// Goal: ability to emulate the red background of input fields (form-submitted invalid state)
|
|
29
30
|
this.redErrorBackground = false;
|
|
31
|
+
// @Output()
|
|
32
|
+
// public commit: EventEmitter<any> = new EventEmitter<any>();
|
|
30
33
|
this.nativeBlur = new EventEmitter();
|
|
31
34
|
this.blur = new EventEmitter();
|
|
32
35
|
// emits when the enter button on keyboard was pressed while this form input had focussed
|
|
@@ -45,12 +48,19 @@ export class BaseInputComponent {
|
|
|
45
48
|
this.fullWidth = false;
|
|
46
49
|
this.excludeUserModelChange = false;
|
|
47
50
|
this.noFormGroupControl = false;
|
|
51
|
+
this.keepFocus = false;
|
|
52
|
+
this.canSaveOrCancel = false;
|
|
48
53
|
this._markedAsUserTouched = false;
|
|
49
54
|
this._destroyed = false;
|
|
50
55
|
this._hasOnPushCdStrategy = false;
|
|
56
|
+
this._initialModelSet = false;
|
|
51
57
|
this._forceReadonly = undefined;
|
|
52
58
|
this._validators = [];
|
|
53
59
|
this._asyncValidators = [];
|
|
60
|
+
// descendents should override this
|
|
61
|
+
this.commit = (model) => __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
return Promise.resolve(true);
|
|
63
|
+
});
|
|
54
64
|
BaseInputComponent.BaseFormInputComponentIndex++;
|
|
55
65
|
this.name = BaseInputComponent.BaseFormInputComponentIndex.toString();
|
|
56
66
|
if (this.formUserChangeListener) {
|
|
@@ -68,7 +78,12 @@ export class BaseInputComponent {
|
|
|
68
78
|
}
|
|
69
79
|
}
|
|
70
80
|
set model(value) {
|
|
81
|
+
if (!this._initialModelSet) {
|
|
82
|
+
this._initialModel = this._model;
|
|
83
|
+
this._initialModelSet = true;
|
|
84
|
+
}
|
|
71
85
|
this._model = value;
|
|
86
|
+
this.canSaveOrCancel = this._model !== this._initialModel;
|
|
72
87
|
this._clearErrorComponent();
|
|
73
88
|
}
|
|
74
89
|
get model() {
|
|
@@ -209,6 +224,30 @@ export class BaseInputComponent {
|
|
|
209
224
|
get validationDisabled() {
|
|
210
225
|
return this.readonly || this.disabled || this.noValidation;
|
|
211
226
|
}
|
|
227
|
+
onClick(event) {
|
|
228
|
+
if (this.canChange && !this.noClickFocus) {
|
|
229
|
+
this.requestFocus();
|
|
230
|
+
if (!this.excludeUserModelChange) {
|
|
231
|
+
this.markAsUserTouched();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
onFocusIn() {
|
|
236
|
+
if (!this.excludeUserModelChange) {
|
|
237
|
+
this.markAsUserTouched();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
handleDocumentScroll() {
|
|
241
|
+
this._positionValidationError();
|
|
242
|
+
}
|
|
243
|
+
handleWindowResize() {
|
|
244
|
+
this._positionValidationError();
|
|
245
|
+
}
|
|
246
|
+
handleKeyDown(event) {
|
|
247
|
+
if (this.showSaveCancel && this.canSaveOrCancel) {
|
|
248
|
+
this._handleKeyDown(event);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
212
251
|
get canChange() {
|
|
213
252
|
return !this.readonly && !this.disabled;
|
|
214
253
|
}
|
|
@@ -221,25 +260,13 @@ export class BaseInputComponent {
|
|
|
221
260
|
get isDestroyed() {
|
|
222
261
|
return this._destroyed;
|
|
223
262
|
}
|
|
224
|
-
showValidationError(error) {
|
|
225
|
-
if (this.validationErrorContainer) {
|
|
226
|
-
if (this._errorValidationComponent) {
|
|
227
|
-
this._clearErrorComponent();
|
|
228
|
-
}
|
|
229
|
-
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(ValidationErrorComponent);
|
|
230
|
-
this._errorValidationComponent = this.validationErrorContainer.createComponent(componentFactory);
|
|
231
|
-
this._errorValidationComponent.instance.error = error;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
263
|
ngOnInit() {
|
|
235
264
|
this._modelChangeSub = this.modelChange.subscribe((val) => {
|
|
236
265
|
this.model = val;
|
|
237
266
|
});
|
|
238
|
-
// if (this.speechInput) {
|
|
239
|
-
// this._subscribeToSpeechInput();
|
|
240
|
-
// }
|
|
241
267
|
}
|
|
242
268
|
ngAfterViewInit() {
|
|
269
|
+
this._prepareInput();
|
|
243
270
|
this._updateControlValidatorsAndOwnFlags();
|
|
244
271
|
this._addOrRemoveSelfFromForm();
|
|
245
272
|
if (this.formComponent) {
|
|
@@ -253,6 +280,10 @@ export class BaseInputComponent {
|
|
|
253
280
|
}
|
|
254
281
|
}
|
|
255
282
|
ngOnDestroy() {
|
|
283
|
+
if (this.input) {
|
|
284
|
+
this.input.removeEventListener('blur', (event) => this.doBlur(event));
|
|
285
|
+
this.input.removeEventListener('focus', (event) => this.doFocus(event));
|
|
286
|
+
}
|
|
256
287
|
this._destroyed = true;
|
|
257
288
|
this._clearErrorComponent();
|
|
258
289
|
// if (this.tooltipManager && this.elementRef) {
|
|
@@ -276,7 +307,33 @@ export class BaseInputComponent {
|
|
|
276
307
|
// this._removeSelfFromForm();
|
|
277
308
|
this.elementRef = undefined;
|
|
278
309
|
this.changeDetector = undefined;
|
|
279
|
-
|
|
310
|
+
this.input = undefined;
|
|
311
|
+
}
|
|
312
|
+
commitClick(event) {
|
|
313
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
314
|
+
this.keepFocus = true;
|
|
315
|
+
yield this.commit(this.model);
|
|
316
|
+
this.keepFocus = false;
|
|
317
|
+
this.doBlur(event);
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
cancelClick(event) {
|
|
321
|
+
this.keepFocus = true;
|
|
322
|
+
if (this._initialModelSet) {
|
|
323
|
+
this.model = this._initialModel;
|
|
324
|
+
}
|
|
325
|
+
this.keepFocus = false;
|
|
326
|
+
}
|
|
327
|
+
showValidationError(error) {
|
|
328
|
+
if (this.validationErrorContainer) {
|
|
329
|
+
if (this._errorValidationComponent) {
|
|
330
|
+
this._clearErrorComponent();
|
|
331
|
+
}
|
|
332
|
+
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(ValidationErrorComponent);
|
|
333
|
+
this._errorValidationComponent = this.validationErrorContainer.createComponent(componentFactory);
|
|
334
|
+
this._errorValidationComponent.instance.error = error;
|
|
335
|
+
this._positionValidationError();
|
|
336
|
+
}
|
|
280
337
|
}
|
|
281
338
|
/**
|
|
282
339
|
* Emits a modelChange event with given value, indicating that the model of this form input
|
|
@@ -293,28 +350,33 @@ export class BaseInputComponent {
|
|
|
293
350
|
this.detectChanges();
|
|
294
351
|
}
|
|
295
352
|
}
|
|
296
|
-
onClick(event) {
|
|
297
|
-
if (this.canChange && !this.noClickFocus) {
|
|
298
|
-
this.requestFocus();
|
|
299
|
-
if (!this.excludeUserModelChange) {
|
|
300
|
-
this.markAsUserTouched();
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
onFocusIn() {
|
|
305
|
-
if (!this.excludeUserModelChange) {
|
|
306
|
-
this.markAsUserTouched();
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
353
|
requestFocus() {
|
|
310
354
|
if (this.canChange && this.input) {
|
|
311
355
|
this.input.focus();
|
|
312
356
|
this.focused = true;
|
|
313
357
|
}
|
|
314
358
|
}
|
|
315
|
-
|
|
316
|
-
this.
|
|
317
|
-
|
|
359
|
+
doFocus(event) {
|
|
360
|
+
if (this.disabled) {
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
this._initialModelSet = false;
|
|
364
|
+
this.focused = true;
|
|
365
|
+
this.canSaveOrCancel = false;
|
|
366
|
+
this.focus.next();
|
|
367
|
+
}
|
|
368
|
+
doBlur(event) {
|
|
369
|
+
setTimeout(() => {
|
|
370
|
+
if (this.keepFocus) {
|
|
371
|
+
if (event) {
|
|
372
|
+
event.preventDefault;
|
|
373
|
+
}
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
this.focused = false;
|
|
377
|
+
this.input.blur();
|
|
378
|
+
this.blur.next();
|
|
379
|
+
}, 200);
|
|
318
380
|
}
|
|
319
381
|
detectChanges() {
|
|
320
382
|
if (!this._destroyed) {
|
|
@@ -366,7 +428,7 @@ export class BaseInputComponent {
|
|
|
366
428
|
if (notNill(this.forcedMaxLength) || maxLength === this._maxLength) {
|
|
367
429
|
return;
|
|
368
430
|
}
|
|
369
|
-
if (maxLength
|
|
431
|
+
if (!isNaN(maxLength)) {
|
|
370
432
|
this._maxLength = maxLength;
|
|
371
433
|
this._updateControlValidatorsAndOwnFlags();
|
|
372
434
|
}
|
|
@@ -445,7 +507,7 @@ export class BaseInputComponent {
|
|
|
445
507
|
}
|
|
446
508
|
}
|
|
447
509
|
_setNativeMaxLength(maxlength) {
|
|
448
|
-
if (this.input) {
|
|
510
|
+
if (this.input && !isNaN(maxlength)) {
|
|
449
511
|
this.input.maxLength = maxlength;
|
|
450
512
|
}
|
|
451
513
|
}
|
|
@@ -491,6 +553,85 @@ export class BaseInputComponent {
|
|
|
491
553
|
this.formComponent.addFormInput(this.myFormInputInstance ? this.myFormInputInstance : this);
|
|
492
554
|
}
|
|
493
555
|
}
|
|
556
|
+
_prepareInput() {
|
|
557
|
+
if (this.elementRef && this.elementRef.nativeElement) {
|
|
558
|
+
//try to find input element
|
|
559
|
+
this.input = this._findInputNode(this.elementRef.nativeElement.children);
|
|
560
|
+
if (this.input) {
|
|
561
|
+
this.input.addEventListener('blur', (event) => this.doBlur(event));
|
|
562
|
+
this.input.addEventListener('focus', (event) => this.doFocus(event));
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
_findInputNode(nodes) {
|
|
567
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
568
|
+
const node = nodes[i];
|
|
569
|
+
if (node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement) {
|
|
570
|
+
return node;
|
|
571
|
+
}
|
|
572
|
+
else if (node.children.length > 0) {
|
|
573
|
+
return this._findInputNode(node.children);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
_positionValidationError() {
|
|
578
|
+
if (this.elementRef && this.elementRef.nativeElement && this._errorValidationComponent) {
|
|
579
|
+
const clientRect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
580
|
+
this._errorValidationComponent.instance.top = clientRect.bottom;
|
|
581
|
+
this._errorValidationComponent.instance.left = clientRect.left;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
_handleKeyDown(event) {
|
|
585
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
586
|
+
switch (event.code) {
|
|
587
|
+
case 'Enter':
|
|
588
|
+
event.preventDefault();
|
|
589
|
+
yield this.commitClick();
|
|
590
|
+
return false;
|
|
591
|
+
case 'Tab':
|
|
592
|
+
const nextSiblingToFocus = event.shiftKey ? event.currentTarget.previousSibling : event.currentTarget.nextSibling;
|
|
593
|
+
event.preventDefault();
|
|
594
|
+
yield this.commitClick();
|
|
595
|
+
if (nextSiblingToFocus) {
|
|
596
|
+
try {
|
|
597
|
+
this._setFocusOnNextPossibleInput(nextSiblingToFocus, event.shiftKey);
|
|
598
|
+
}
|
|
599
|
+
catch (e) {
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
return false;
|
|
603
|
+
case 'Escape':
|
|
604
|
+
this.cancelClick();
|
|
605
|
+
event.preventDefault();
|
|
606
|
+
return false;
|
|
607
|
+
}
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
_createNewFocusEvent(element) {
|
|
611
|
+
let eventType = "onfocusin" in element ? "focusin" : "focus", bubbles = "onfocusin" in element, focusEvent;
|
|
612
|
+
if ("createEvent" in document) {
|
|
613
|
+
focusEvent = document.createEvent("Event");
|
|
614
|
+
focusEvent.initEvent(eventType, bubbles, true);
|
|
615
|
+
}
|
|
616
|
+
else if ("Event" in window) {
|
|
617
|
+
focusEvent = new Event(eventType, { bubbles: bubbles, cancelable: true });
|
|
618
|
+
}
|
|
619
|
+
return focusEvent;
|
|
620
|
+
}
|
|
621
|
+
_setFocusOnNextPossibleInput(element, previous) {
|
|
622
|
+
const elementColl = element.getElementsByTagName('input');
|
|
623
|
+
if (elementColl && elementColl.length > 0) {
|
|
624
|
+
const inputElement = elementColl[0];
|
|
625
|
+
if (inputElement.disabled || inputElement.readOnly) {
|
|
626
|
+
this._setFocusOnNextPossibleInput(previous ? element.previousSibling : element.nextSibling, previous);
|
|
627
|
+
}
|
|
628
|
+
else {
|
|
629
|
+
const focusEvent = this._createNewFocusEvent(element);
|
|
630
|
+
inputElement.focus();
|
|
631
|
+
inputElement.dispatchEvent(focusEvent);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
494
635
|
}
|
|
495
636
|
BaseInputComponent.BaseFormInputComponentIndex = 0;
|
|
496
637
|
BaseInputComponent.HiddenClass = "hidden";
|
|
@@ -507,6 +648,8 @@ BaseInputComponent.ctorParameters = () => [
|
|
|
507
648
|
];
|
|
508
649
|
BaseInputComponent.propDecorators = {
|
|
509
650
|
validationErrorContainer: [{ type: ViewChild, args: ["validationError", { read: ViewContainerRef },] }],
|
|
651
|
+
_ngModel: [{ type: ViewChild, args: [NgModel, { static: true },] }],
|
|
652
|
+
showSaveCancel: [{ type: Input }],
|
|
510
653
|
model: [{ type: Input }],
|
|
511
654
|
label: [{ type: Input }],
|
|
512
655
|
noValidation: [{ type: Input }],
|
|
@@ -536,7 +679,6 @@ BaseInputComponent.propDecorators = {
|
|
|
536
679
|
modelChange: [{ type: Output }],
|
|
537
680
|
userModelChange: [{ type: Output }],
|
|
538
681
|
hiddenChange: [{ type: Output }],
|
|
539
|
-
_ngModel: [{ type: ViewChild, args: [NgModel, { static: true },] }],
|
|
540
682
|
focused: [{ type: HostBinding, args: ["class.cc-input-focused",] }],
|
|
541
683
|
formInput: [{ type: HostBinding, args: ["class.form-input",] }],
|
|
542
684
|
customWidth: [{ type: Input }, { type: HostBinding, args: ["class.custom-width",] }],
|
|
@@ -556,7 +698,10 @@ BaseInputComponent.propDecorators = {
|
|
|
556
698
|
valid: [{ type: HostBinding, args: ["class.valid",] }],
|
|
557
699
|
validationDisabled: [{ type: HostBinding, args: ["class.no-validation",] }],
|
|
558
700
|
onClick: [{ type: HostListener, args: ["click", ["$event"],] }],
|
|
559
|
-
onFocusIn: [{ type: HostListener, args: ["focusin",] }]
|
|
701
|
+
onFocusIn: [{ type: HostListener, args: ["focusin",] }],
|
|
702
|
+
handleDocumentScroll: [{ type: HostListener, args: ["document:scroll",] }],
|
|
703
|
+
handleWindowResize: [{ type: HostListener, args: ["window:resize",] }],
|
|
704
|
+
handleKeyDown: [{ type: HostListener, args: ["keydown", ["$event"],] }]
|
|
560
705
|
};
|
|
561
706
|
__decorate([
|
|
562
707
|
InputBoolean()
|
|
@@ -588,4 +733,4 @@ __decorate([
|
|
|
588
733
|
__decorate([
|
|
589
734
|
InputBoolean()
|
|
590
735
|
], BaseInputComponent.prototype, "noFormGroupControl", void 0);
|
|
591
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS9iYXNlLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUFvQix3QkFBd0IsRUFDN0QsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUFFLGdCQUFnQixFQUM1QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWdDLE9BQU8sRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBRW5GLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDOUQsT0FBTyxFQUFDLFlBQVksRUFBRSxxQkFBcUIsRUFBQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ2pHLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzFGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUUxRCxPQUFPLEVBQUMsdUNBQXVDLEVBQUMsTUFBTSw0REFBNEQsQ0FBQztBQUNuSCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDMUQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFHaEYsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sZ0RBQWdELENBQUM7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QUFDLFFBQVEsQ0FBQzt3QkFVaEMsWUFBWSxTQUFDLFNBQVM7O0FBbGJ2QjtJQURVLFlBQVksRUFBRTt3REFDYTtBQUdyQztJQURVLFlBQVksRUFBRTtxREFDRTtBQUcxQjtJQURVLFlBQVksRUFBRTt3REFDSztBQStFN0I7SUFEVSxZQUFZLEVBQUU7eURBQ2M7QUE2SHRDO0lBRFUsWUFBWSxFQUFFO3VEQUNZO0FBR3BDO0lBRFUsWUFBWSxFQUFFOzZEQUNrQjtBQUcxQztJQURVLFlBQVksRUFBRTtxREFDVTtBQUdsQztJQURVLFlBQVksRUFBRTtxREFDVTtBQUdsQztJQURVLFlBQVksRUFBRTtrRUFDdUI7QUFHL0M7SUFEVSxZQUFZLEVBQUU7OERBQ21CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnRGYWN0b3J5LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZixcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEluamVjdGFibGUsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPcHRpb25hbCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtBc3luY1ZhbGlkYXRvckZuLCBGb3JtQ29udHJvbCwgTmdNb2RlbCwgVmFsaWRhdG9yRm59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb25BZGFwdGVyQ29tcG9uZW50fSBmcm9tIFwiLi9jb25maWd1cmF0aW9uLWFkYXB0ZXItY29tcG9uZW50LmludGVyZmFjZVwiO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSBcIi4uLy4uL2NvcmUvZnVuY3Rpb24vaXMtbmlsbC5mdW5jdGlvblwiO1xyXG5pbXBvcnQge25vdE5pbGx9IGZyb20gXCIuLi8uLi9jb3JlL2Z1bmN0aW9uL25vdC1uaWxsLmZ1bmN0aW9uXCI7XHJcbmltcG9ydCB7SW5wdXRCb29sZWFuLCBJbnB1dEJvb2xlYW5EZWNvcmF0b3J9IGZyb20gXCIuLi8uLi9jb3JlL2RlY29yYXRvci9pbnB1dC1ib29sZWFuLmRlY29yYXRvclwiO1xyXG5pbXBvcnQge3JlcXVpcmVkVmFsaWRhdG9yfSBmcm9tIFwiLi4vLi4vY29yZS92YWxpZGF0b3IvcmVxdWlyZWQudmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7cHJlY2lzaW9uU2NhbGVWYWxpZGF0b3J9IGZyb20gXCIuLi8uLi9jb3JlL3ZhbGlkYXRvci9wcmVjaXNpb24tc2NhbGUudmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7bWF4U3RyaW5nTGVuZ3RoVmFsaWRhdG9yfSBmcm9tIFwiLi4vLi4vY29yZS92YWxpZGF0b3IvbWF4LXN0cmluZy1sZW5ndGgudmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7U3RyaW5nVXRpbHN9IGZyb20gXCIuLi8uLi9jb3JlL3V0aWxzL3N0cmluZy11dGlsc1wiO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtGb3JtSW5wdXRVc2VyTW9kZWxDaGFuZ2VMaXN0ZW5lclNlcnZpY2V9IGZyb20gXCIuLi8uLi9jb3JlL3NlcnZpY2UvZm9ybS1pbnB1dC11c2VyLWNoYW5nZS1saXN0ZW5lci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7TnVtYmVyVXRpbHN9IGZyb20gXCIuLi8uLi9jb3JlL3V0aWxzL251bWJlci11dGlsc1wiO1xyXG5pbXBvcnQge05nWm9uZVdyYXBwZXJTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vY29yZS9zZXJ2aWNlL25nLXpvbmUtd3JhcHBlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7Q29yZUNvbXBvbmVudHNJY29ufSBmcm9tIFwiLi4vLi4vY29yZS9lbnVtL2NvcmUtY29tcG9uZW50cy1pY29uLmVudW1cIjtcclxuaW1wb3J0IHtGb3JtQ29tcG9uZW50fSBmcm9tIFwiLi4vZm9ybS9mb3JtLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1ZhbGlkYXRpb25FcnJvckNvbXBvbmVudH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24tZXJyb3IvdmFsaWRhdGlvbi1lcnJvci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3JNb2R1bGV9IGZyb20gXCIuLi92YWxpZGF0aW9uLWVycm9yL3ZhbGlkYXRpb24tZXJyb3IubW9kdWxlXCI7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGNvbmNyZXRlIGZvcm0gaW5wdXQgY29tcG9uZW50cyB0aGF0IGNvbnRhaW4gYSBuYXRpdmUgPGlucHV0PiBlbGVtZW50LiBQcm92aWRlcyBjb21tb24gZGF0YSBhbmQgZnVuY3Rpb25hbGl0eSwgc3VjaCBhc1xyXG4gKiBhZGRpbmcgc2VsZiBhcyBhIGNvbnRyb2wgdG8gdGhlIHBhcmVudCBmb3JtLlxyXG4gKi9cclxuQERpcmVjdGl2ZSgpXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VJbnB1dENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBDb25maWd1cmF0aW9uQWRhcHRlckNvbXBvbmVudCB7XHJcbiAgQFZpZXdDaGlsZChcInZhbGlkYXRpb25FcnJvclwiLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZn0pXHJcbiAgcHVibGljIHZhbGlkYXRpb25FcnJvckNvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcclxuXHJcbiAgcHVibGljIGdldCBuZ01vZGVsKCk6IE5nTW9kZWwge1xyXG4gICAgaWYgKHRoaXMuX215Rm9ybUlucHV0SW5zdGFuY2UpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX215Rm9ybUlucHV0SW5zdGFuY2UubmdNb2RlbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9uZ01vZGVsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBCYXNlRm9ybUlucHV0Q29tcG9uZW50SW5kZXg6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIHN0YXRpYyBIaWRkZW5DbGFzczogc3RyaW5nID0gXCJoaWRkZW5cIjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IG1vZGVsKHZhbHVlOiBUKSB7XHJcbiAgICB0aGlzLl9tb2RlbCA9IHZhbHVlO1xyXG4gICAgdGhpcy5fY2xlYXJFcnJvckNvbXBvbmVudCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBtb2RlbCgpOiBUIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlbDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGxhYmVsOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKVxyXG4gIHB1YmxpYyBub1ZhbGlkYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpXHJcbiAgcHVibGljIGluaXRGb2N1czogYm9vbGVhbjtcclxuXHJcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpXHJcbiAgcHVibGljIG5vQ2xpY2tGb2N1czogYm9vbGVhbjtcclxuXHJcbiAgLy8gdXNlZCB0byBsaW5rIGZpZWxkIHRvIGJ1c2luZXNzIG9iamVjdCBmb3IgZGVlcC12YWxpZGF0aW9uXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYnVzaW5lc3NPYmplY3RJZDogYW55O1xyXG5cclxuICAvLyBASW5wdXQoKVxyXG4gIC8vIHB1YmxpYyBlcnJvck1lc3NhZ2U6IFZhbGlkYXRpb25NZXNzYWdlO1xyXG5cclxuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQoZGlzYWJsZWQ6IGJvb2xlYW4pIHtcclxuICAgIGlmIChkaXNhYmxlZCA9PT0gdGhpcy5fZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGlzYWJsZWQgPSBJbnB1dEJvb2xlYW5EZWNvcmF0b3IuSW5wdXRWYWx1ZVRvQm9vbGVhbihkaXNhYmxlZCk7XHJcbiAgICB0aGlzLl91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IG1heExlbmd0aChtYXhMZW5ndGg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZXRNYXhMZW5ndGgobWF4TGVuZ3RoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbm90TmlsbCh0aGlzLmZvcmNlZE1heExlbmd0aCkgPyB0aGlzLmZvcmNlZE1heExlbmd0aCA6IHRoaXMuX21heExlbmd0aDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGZvcmNlZE1heExlbmd0aDogbnVtYmVyO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgcmVhZG9ubHkocmVhZG9ubHk6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl9mb3JjZVJlYWRvbmx5ICE9PSB1bmRlZmluZWQgfHwgcmVhZG9ubHkgPT09IHRoaXMuX3JlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlYWRvbmx5ID0gSW5wdXRCb29sZWFuRGVjb3JhdG9yLklucHV0VmFsdWVUb0Jvb2xlYW4ocmVhZG9ubHkpO1xyXG4gICAgdGhpcy5fdXBkYXRlQ29udHJvbFZhbGlkYXRvcnNBbmRPd25GbGFncygpO1xyXG4gICAgaWYgKHRoaXMuX2hhc09uUHVzaENkU3RyYXRlZ3kpIHtcclxuICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHJlYWRvbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9yY2VSZWFkb25seSB8fCB0aGlzLl9yZWFkb25seTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBmb3JjZVJlYWRvbmx5KGZvcmNlUmVhZG9ubHk6IGJvb2xlYW4pIHtcclxuICAgIGlmIChmb3JjZVJlYWRvbmx5ID09PSB0aGlzLl9mb3JjZVJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX2ZvcmNlUmVhZG9ubHkgPSBJbnB1dEJvb2xlYW5EZWNvcmF0b3IuSW5wdXRWYWx1ZVRvQm9vbGVhbihmb3JjZVJlYWRvbmx5KTtcclxuICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xWYWxpZGF0b3JzQW5kT3duRmxhZ3MoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZm9yY2VSZWFkb25seSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JjZVJlYWRvbmx5O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IHJlcXVpcmVkKHJlcXVpcmVkOiBib29sZWFuKSB7XHJcbiAgICBpZiAocmVxdWlyZWQgPT09IHRoaXMuX3JlcXVpcmVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlcXVpcmVkID0gSW5wdXRCb29sZWFuRGVjb3JhdG9yLklucHV0VmFsdWVUb0Jvb2xlYW4ocmVxdWlyZWQpO1xyXG4gICAgdGhpcy5fdXBkYXRlQ29udHJvbFZhbGlkYXRvcnNBbmRPd25GbGFncygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZvcmNlUmVxdWlyZWQgfHwgdGhpcy5fcmVxdWlyZWQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKClcclxuICBwdWJsaWMgZm9yY2VSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlOyAgLy8gYSBmb3JjZSBvdXRzaWRlIG9mIFtjZmdOYW1lXSdzIGluZmx1ZW5jZVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgdmFsaWRhdG9ycyh2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdKSB7XHJcbiAgICBpZiAodmFsaWRhdG9ycyA9PT0gdGhpcy5fdmFsaWRhdG9ycykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl92YWxpZGF0b3JzID0gdmFsaWRhdG9ycztcclxuICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xWYWxpZGF0b3JzQW5kT3duRmxhZ3MoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsaWRhdG9ycygpOiBWYWxpZGF0b3JGbltdIHtcclxuICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3JzO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGFzeW5jVmFsaWRhdG9ycyh2YWxpZGF0b3JzOiBBc3luY1ZhbGlkYXRvckZuW10pIHtcclxuICAgIHRoaXMuX2FzeW5jVmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7XHJcbiAgICB0aGlzLl91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFzeW5jVmFsaWRhdG9ycygpOiBBc3luY1ZhbGlkYXRvckZuW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FzeW5jVmFsaWRhdG9ycztcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIEBIb3N0QmluZGluZyhcImNsYXNzLlwiICsgQmFzZUlucHV0Q29tcG9uZW50LkhpZGRlbkNsYXNzKVxyXG4gIHB1YmxpYyBzZXQgaGlkZGVuKGhpZGRlbjogYm9vbGVhbikge1xyXG4gICAgaWYgKGhpZGRlbiA9PT0gdGhpcy5faGlkZGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9oaWRkZW4gPSBoaWRkZW47XHJcblxyXG4gICAgdGhpcy5fYWRkT3JSZW1vdmVTZWxmRnJvbUZvcm0oKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2Rlc3Ryb3llZCkge1xyXG4gICAgICBpZiAoaGlkZGVuKSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRhY2goKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLnJlYXR0YWNoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2hhc09uUHVzaENkU3RyYXRlZ3kpIHtcclxuICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlc0FmdGVyQW5ndWxhcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGlkZGVuQ2hhbmdlLmVtaXQoaGlkZGVuKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGlkZGVuKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hpZGRlbjtcclxuICB9XHJcblxyXG4gIC8vIG5vIGN1c3RvbSBzZXR0ZXIgbG9naWMgYXMgd2l0aCB0aGUgb3RoZXIgJ3NjcmVlbiBjb25maWcgcHJvcHMnLCBiZWNhdXNlIGNvbmNyZXRlIGZvcm0gaW5wdXQgY29tcG9uZW50cyBoYW5kbGUgdGhpcyB0aGVtc2VsdmVzLlxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBkZWNpbWFscyh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9kZWNpbWFscyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkZWNpbWFscygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RlY2ltYWxzO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaWNvbjogQ29yZUNvbXBvbmVudHNJY29uO1xyXG5cclxuICAvLyBHb2FsOiBhYmlsaXR5IHRvIGVtdWxhdGUgdGhlIHJlZCBiYWNrZ3JvdW5kIG9mIGlucHV0IGZpZWxkcyAoZm9ybS1zdWJtaXR0ZWQgaW52YWxpZCBzdGF0ZSlcclxuICBASW5wdXQoKSBASG9zdEJpbmRpbmcoXCJjbGFzcy5jYy1yZWQtZXJyb3ItYmFja2dyb3VuZFwiKVxyXG4gIHB1YmxpYyByZWRFcnJvckJhY2tncm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgbXlGb3JtSW5wdXRJbnN0YW5jZSh2YWx1ZTogQmFzZUlucHV0Q29tcG9uZW50PFQ+KSB7XHJcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuX215Rm9ybUlucHV0SW5zdGFuY2UpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fbXlGb3JtSW5wdXRJbnN0YW5jZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5fdXBkYXRlQ29udHJvbFZhbGlkYXRvcnNBbmRPd25GbGFncygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG15Rm9ybUlucHV0SW5zdGFuY2UoKTogQmFzZUlucHV0Q29tcG9uZW50PFQ+IHtcclxuICAgIHJldHVybiB0aGlzLl9teUZvcm1JbnB1dEluc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbXlGb3JtSW5wdXRJbnN0YW5jZTogQmFzZUlucHV0Q29tcG9uZW50PFQ+O1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgbmF0aXZlQmx1cjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBibHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLy8gZW1pdHMgd2hlbiB0aGUgZW50ZXIgYnV0dG9uIG9uIGtleWJvYXJkIHdhcyBwcmVzc2VkIHdoaWxlIHRoaXMgZm9ybSBpbnB1dCBoYWQgZm9jdXNzZWRcclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgZW50ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgZm9jdXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkga2V5RG93bjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBrZXlVcDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBtb2RlbENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IHVzZXJNb2RlbENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IGhpZGRlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICBAVmlld0NoaWxkKE5nTW9kZWwsIHtzdGF0aWM6IHRydWV9KVxyXG4gIHB1YmxpYyBfbmdNb2RlbDogTmdNb2RlbDtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuY2MtaW5wdXQtZm9jdXNlZFwiKVxyXG4gIHB1YmxpYyBmb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBmb3JtQ29tcG9uZW50OiBGb3JtQ29tcG9uZW50O1xyXG5cclxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5mb3JtLWlucHV0XCIpXHJcbiAgcHVibGljIGZvcm1JbnB1dDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBASG9zdEJpbmRpbmcoXCJjbGFzcy5jdXN0b20td2lkdGhcIilcclxuICBwdWJsaWMgY3VzdG9tV2lkdGg6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpXHJcbiAgcHVibGljIG5vVHJpYW5nbGVHcmFwaGljOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBASG9zdEJpbmRpbmcoXCJjbGFzcy5oYWxmLXdpZHRoXCIpXHJcbiAgcHVibGljIGhhbGZXaWR0aDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgQEhvc3RCaW5kaW5nKFwiY2xhc3MuZnVsbC13aWR0aC1pbXBvcnRhbnRcIilcclxuICBwdWJsaWMgZnVsbFdpZHRoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKVxyXG4gIHB1YmxpYyBleGNsdWRlVXNlck1vZGVsQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKVxyXG4gIHB1YmxpYyBub0Zvcm1Hcm91cENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuZm9ybS1zdWJtaXR0ZWRcIilcclxuICBwdWJsaWMgZ2V0IGZvcm1TdWJtaXR0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29tcG9uZW50ICYmIHRoaXMuZm9ybUNvbXBvbmVudC5zdWJtaXR0ZWQ7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5oYXNub2xhYmVsXCIpXHJcbiAgcHVibGljIGdldCBoYXNOb0xhYmVsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGlzTmlsbCh0aGlzLmxhYmVsKTtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmhhc3ZhbHVlXCIpXHJcbiAgcHVibGljIGdldCBoYXNWYWx1ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMubW9kZWwgfHwgU3RyaW5nVXRpbHMuSXNTdHJpbmdXaXRoTGVuZ3RoKHRoaXMubW9kZWwpIHx8IE51bWJlclV0aWxzLklzTnVtYmVyKHRoaXMubW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuaW52YWxpZFwiKVxyXG4gIHB1YmxpYyBnZXQgaW52YWxpZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGVja1N0YXRlKCkgJiYgIXRoaXMuY29udHJvbC52YWxpZDtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmRpc2FibGVkXCIpXHJcbiAgcHVibGljIGdldCBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MucmVhZC1vbmx5XCIpXHJcbiAgcHVibGljIGdldCBpc1JlYWRvbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZG9ubHk7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5yZXF1aXJlZFwiKVxyXG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVpcmVkO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuY2MtdG91Y2hlZC1pbnZhbGlkXCIpXHJcbiAgcHVibGljIGdldCB0b3VjaGVkSW52YWxpZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250cm9sRXhpc3RzKCkgJiYgdGhpcy5jb250cm9sLnRvdWNoZWQgJiYgIXRoaXMuY29udHJvbC52YWxpZDtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLnZhbGlkXCIpXHJcbiAgcHVibGljIGdldCB2YWxpZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGVja1N0YXRlKCkgJiYgdGhpcy5jb250cm9sLnZhbGlkO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3Mubm8tdmFsaWRhdGlvblwiKVxyXG4gIHB1YmxpYyBnZXQgdmFsaWRhdGlvbkRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZG9ubHkgfHwgdGhpcy5kaXNhYmxlZCB8fCB0aGlzLm5vVmFsaWRhdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY2FuQ2hhbmdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLnJlYWRvbmx5ICYmICF0aGlzLmRpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjb250cm9sKCk6IEZvcm1Db250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLl9teUZvcm1JbnB1dEluc3RhbmNlID8gdGhpcy5fbXlGb3JtSW5wdXRJbnN0YW5jZS5jb250cm9sIDogdGhpcy5uZ01vZGVsICYmIHRoaXMubmdNb2RlbC5jb250cm9sO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBmb3JtSW5wdXRJbnN0YW5jZSgpOiBCYXNlSW5wdXRDb21wb25lbnQ8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX215Rm9ybUlucHV0SW5zdGFuY2UgfHwgdGhpcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNEZXN0cm95ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dWYWxpZGF0aW9uRXJyb3IoZXJyb3I6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudmFsaWRhdGlvbkVycm9yQ29udGFpbmVyKSB7XHJcbiAgICAgIGlmICh0aGlzLl9lcnJvclZhbGlkYXRpb25Db21wb25lbnQpIHtcclxuICAgICAgICB0aGlzLl9jbGVhckVycm9yQ29tcG9uZW50KCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxWYWxpZGF0aW9uRXJyb3JDb21wb25lbnQ+ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoVmFsaWRhdGlvbkVycm9yQ29tcG9uZW50KTtcclxuICAgICAgdGhpcy5fZXJyb3JWYWxpZGF0aW9uQ29tcG9uZW50ID0gdGhpcy52YWxpZGF0aW9uRXJyb3JDb250YWluZXIuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudEZhY3RvcnkpO1xyXG4gICAgICB0aGlzLl9lcnJvclZhbGlkYXRpb25Db21wb25lbnQuaW5zdGFuY2UuZXJyb3IgPSBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbnB1dDogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcblxyXG4gIC8vIEBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb25BZGFwdGVyQ29tcG9uZW50XHJcbiAgcHVibGljIG9iamVjdENvbmZpZ05hbWU6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgX21hcmtlZEFzVXNlclRvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gIHByb3RlY3RlZCBfZGVzdHJveWVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIF9oYXNPblB1c2hDZFN0cmF0ZWd5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIF9tb2RlbDogVDtcclxuXHJcbiAgcHJpdmF0ZSBfZXJyb3JWYWxpZGF0aW9uQ29tcG9uZW50OiBDb21wb25lbnRSZWY8VmFsaWRhdGlvbkVycm9yQ29tcG9uZW50PjtcclxuICBwcml2YXRlIF9kZWNpbWFsczogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2hpZGRlbjogYm9vbGVhbjtcclxuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbjtcclxuICBwcml2YXRlIF9tYXhMZW5ndGg6IG51bWJlcjtcclxuICBwcml2YXRlIF9yZWFkb25seTogYm9vbGVhbjtcclxuICBwcml2YXRlIF9yZXF1aXJlZDogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBfZm9yY2VSZWFkb25seTogYm9vbGVhbiA9IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBfdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2FzeW5jVmFsaWRhdG9yczogQXN5bmNWYWxpZGF0b3JGbltdID0gW107XHJcblxyXG4gIHByaXZhdGUgX3NwZWVjaFN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgX21vZGVsQ2hhbmdlU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBfZm9ybUFueVN1Ym1pdFN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgX2Zvcm1SZWFkb25seUNoYW5nZVN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgX2NsZWFyTWFya2VkQXNVc2VyVG91Y2hlZFN1YjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcm90ZWN0ZWQgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgZm9ybVVzZXJDaGFuZ2VMaXN0ZW5lcj86IEZvcm1JbnB1dFVzZXJNb2RlbENoYW5nZUxpc3RlbmVyU2VydmljZSxcclxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBuZ1pvbmVXcmFwcGVyPzogTmdab25lV3JhcHBlclNlcnZpY2UsXHJcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgZWxlbWVudFJlZj86IEVsZW1lbnRSZWYsXHJcbiAgKSB7XHJcbiAgICBCYXNlSW5wdXRDb21wb25lbnQuQmFzZUZvcm1JbnB1dENvbXBvbmVudEluZGV4Kys7XHJcbiAgICB0aGlzLm5hbWUgPSBCYXNlSW5wdXRDb21wb25lbnQuQmFzZUZvcm1JbnB1dENvbXBvbmVudEluZGV4LnRvU3RyaW5nKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZm9ybVVzZXJDaGFuZ2VMaXN0ZW5lcikge1xyXG4gICAgICB0aGlzLl9jbGVhck1hcmtlZEFzVXNlclRvdWNoZWRTdWIgPSB0aGlzLmZvcm1Vc2VyQ2hhbmdlTGlzdGVuZXIuY2xlYXJBbGxNYXJrZWRBc1VzZXJUb3VjaGVkLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fbWFya2VkQXNVc2VyVG91Y2hlZCA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbW9kZWxDaGFuZ2VTdWIgPSB0aGlzLm1vZGVsQ2hhbmdlLnN1YnNjcmliZSgodmFsOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5tb2RlbCA9IHZhbDtcclxuICAgIH0pO1xyXG4gICAgLy8gaWYgKHRoaXMuc3BlZWNoSW5wdXQpIHtcclxuICAgIC8vICAgICB0aGlzLl9zdWJzY3JpYmVUb1NwZWVjaElucHV0KCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk7XHJcblxyXG4gICAgdGhpcy5fYWRkT3JSZW1vdmVTZWxmRnJvbUZvcm0oKTtcclxuXHJcbiAgICBpZiAodGhpcy5mb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMucmVhZG9ubHkgPSB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuZm9ybUNvbXBvbmVudC5yZWFkb25seTtcclxuICAgICAgdGhpcy5fZm9ybVJlYWRvbmx5Q2hhbmdlU3ViID0gdGhpcy5mb3JtQ29tcG9uZW50LnJlYWRvbmx5Q2hhbmdlLnN1YnNjcmliZSgoaXNGb3JtUmVhZG9ubHk6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICB0aGlzLnJlYWRvbmx5ID0gaXNGb3JtUmVhZG9ubHk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmluaXRGb2N1cykge1xyXG4gICAgICBzZXRUaW1lb3V0KHRoaXMucmVxdWVzdEZvY3VzLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5fY2xlYXJFcnJvckNvbXBvbmVudCgpO1xyXG5cclxuICAgIC8vIGlmICh0aGlzLnRvb2x0aXBNYW5hZ2VyICYmIHRoaXMuZWxlbWVudFJlZikge1xyXG4gICAgLy8gICAgIHRoaXMudG9vbHRpcE1hbmFnZXIuZGVzdHJveUVycm9yVG9vbHRpcE9mRWxlbWVudCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYgKHRoaXMuX21vZGVsQ2hhbmdlU3ViKSB7XHJcbiAgICAgIHRoaXMuX21vZGVsQ2hhbmdlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fc3BlZWNoU3ViKSB7XHJcbiAgICAgIHRoaXMuX3NwZWVjaFN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2Zvcm1BbnlTdWJtaXRTdWIpIHtcclxuICAgICAgdGhpcy5fZm9ybUFueVN1Ym1pdFN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2Zvcm1SZWFkb25seUNoYW5nZVN1Yikge1xyXG4gICAgICB0aGlzLl9mb3JtUmVhZG9ubHlDaGFuZ2VTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9jbGVhck1hcmtlZEFzVXNlclRvdWNoZWRTdWIpIHtcclxuICAgICAgdGhpcy5fY2xlYXJNYXJrZWRBc1VzZXJUb3VjaGVkU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICAvLyB0aGlzLl9yZW1vdmVTZWxmRnJvbUZvcm0oKTtcclxuICAgIHRoaXMuZWxlbWVudFJlZiA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IgPSB1bmRlZmluZWQ7XHJcbiAgICAvLyB0aGlzLmlucHV0ID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgYSBtb2RlbENoYW5nZSBldmVudCB3aXRoIGdpdmVuIHZhbHVlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIG1vZGVsIG9mIHRoaXMgZm9ybSBpbnB1dFxyXG4gICAqIGhhcyBjaGFuZ2VkIGFuZCBpdHMgbmV3IHZhbHVlIGlzIGdpdmVuIHZhbHVlLiBBbHNvIGVtaXRzIHVzZXJNb2RlbENoYW5nZSBpZiBtYXJrZWRBc1VzZXJUb3VjaGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRNb2RlbCh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm1vZGVsID0gdmFsdWU7XHJcbiAgICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQodmFsdWUpO1xyXG5cclxuICAgIGlmICh0aGlzLl9tYXJrZWRBc1VzZXJUb3VjaGVkICYmIHRoaXMuZm9ybVVzZXJDaGFuZ2VMaXN0ZW5lcikge1xyXG4gICAgICB0aGlzLmZvcm1Vc2VyQ2hhbmdlTGlzdGVuZXIudXNlck1vZGVsQ2hhbmdlLm5leHQodmFsdWUpO1xyXG4gICAgICB0aGlzLnVzZXJNb2RlbENoYW5nZS5uZXh0KHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5faGFzT25QdXNoQ2RTdHJhdGVneSkge1xyXG4gICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJjbGlja1wiLCBbXCIkZXZlbnRcIl0pXHJcbiAgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2FuQ2hhbmdlICYmICF0aGlzLm5vQ2xpY2tGb2N1cykge1xyXG4gICAgICB0aGlzLnJlcXVlc3RGb2N1cygpO1xyXG4gICAgICBpZiAoIXRoaXMuZXhjbHVkZVVzZXJNb2RlbENoYW5nZSkge1xyXG4gICAgICAgIHRoaXMubWFya0FzVXNlclRvdWNoZWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcImZvY3VzaW5cIilcclxuICBvbkZvY3VzSW4oKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZXhjbHVkZVVzZXJNb2RlbENoYW5nZSkge1xyXG4gICAgICB0aGlzLm1hcmtBc1VzZXJUb3VjaGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVxdWVzdEZvY3VzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2FuQ2hhbmdlICYmIHRoaXMuaW5wdXQpIHtcclxuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xyXG4gICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRvQmx1cigpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5wdXQuYmx1cigpO1xyXG4gICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5fZGVzdHJveWVkKSB7XHJcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG1hcmtGb3JDaGVjaygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5fZGVzdHJveWVkKSB7XHJcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGV0ZWN0Q2hhbmdlc0FmdGVyQW5ndWxhcigpOiB2b2lkIHtcclxuICAgIGlmICghIXRoaXMubmdab25lV3JhcHBlcikge1xyXG4gICAgICB0aGlzLm5nWm9uZVdyYXBwZXIuc2V0VGltZW91dE91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuX2Rlc3Ryb3llZCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2hhc09uUHVzaENkU3RyYXRlZ3kpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaW5rcyB0aGUgZ2l2ZW4gZm9ybUNvbXAuc3VibWl0IGV2ZW50IHRvIHRoZSBmaXJpbmcgb2YgZGV0ZWN0Q2hhbmdlcygpIG9mIGdpdmVuIGNoYW5nZSBkZXRlY3Rvci4gVGhpcyBpcyBhICd1dGlsaXR5LWxpa2UnIG1ldGhvZCxcclxuICAgKiBidXQgd2UgbWFuYWdlIHRoZSBhY3R1YWwgc3Vic2NyaXB0aW9uICh3aXRoIFVOU1VCU0NSSUJFKCkhKSBvbiB0aGlzIGJhc2UgY2xhc3MuXHJcbiAgICogQHBhcmFtIGZvcm1Db21wIFRoZSBmb3JtIHdob3NlIHN1Ym1pdCB3ZSB3YW50IHRvIGxpbmsgd2l0aCB0aGUgY2FsbCBvZiAuZGV0ZWN0Q2hhbmdlcygpIG9uIGdpdmVuIGNoYW5nZSBkZXRlY3RvciByZWYuXHJcbiAgICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIFRoaXMgc2hvdWxkIGJlIGdpdmVuIGFzIHBhcmFtLiBJIGNob29zZSBub3QgdG8gbWFrZSB0aGlzIHBhcnQgb2Ygb3VyIChCYXNlRm9ybUlucHV0Q29tcG9uZW50KSBjb25zdHJ1Y3RvcixcclxuICAgKiBiZWNhdXNlIHdlIGFscmVhZHkgaGF2ZSAyMSBleHRlbmRlcnMuXHJcbiAgICovXHJcbiAgLy8gcHVibGljIGxpbmtGb3JtQW55U3VibWl0V2l0aERldGVjdENoYW5nZXMoZm9ybUNvbXA6IEZvcm1Db21wb25lbnQsIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZik6IHZvaWQge1xyXG4gIC8vICAgICBpZiAoZm9ybUNvbXAgJiYgY2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAvLyAgICAgICAgIHRoaXMuX2Zvcm1BbnlTdWJtaXRTdWIgPSBmb3JtQ29tcC5hbnlTdWJtaXQuc3Vic2NyaWJlKCgoKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKCF0aGlzLl9kZXN0cm95ZWQpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH0pKTtcclxuICAvLyAgICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIG1hcmtBc1VzZXJUb3VjaGVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbWFya2VkQXNVc2VyVG91Y2hlZCA9IHRydWU7XHJcbiAgICB0aGlzLnJlZEVycm9yQmFja2dyb3VuZCA9IGZhbHNlOyAvLyBub3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSByaWdodCBwbGFjZSB0byBkbyB0aGF0XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJNYXJrZWRBc1VzZXJUb3VjaGVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbWFya2VkQXNVc2VyVG91Y2hlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy91c2VkIGZvciBkZXNjZW5kZW50cywgYmVjYXVzZSBkZXNjZW5kZW50cyBjYW4ndCBzZXQgc3VwZXIgcHJvcGVydGllcywgc2VlIElucHV0TnVtYmVyQ29tcG9uZW50XHJcbiAgcHJvdGVjdGVkIHNldE1heExlbmd0aChtYXhMZW5ndGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKG5vdE5pbGwodGhpcy5mb3JjZWRNYXhMZW5ndGgpIHx8IG1heExlbmd0aCA9PT0gdGhpcy5fbWF4TGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWF4TGVuZ3RoID4gMCkgeyAvLyBub3QgbWF4TGVuZ3RoIGlzIDBcclxuICAgICAgdGhpcy5fbWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xyXG4gICAgICB0aGlzLl91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX21hcmtBc09uUHVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2hhc09uUHVzaENkU3RyYXRlZ3kgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9jaGVja1N0YXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMubmdNb2RlbCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5mb3JtU3VibWl0dGVkIHx8ICh0aGlzLl9jb250cm9sRXhpc3RzKCkgJiYgdGhpcy5jb250cm9sLnRvdWNoZWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gUGxhY2UgdmFsaWRhdG9ycyBvbnRvIG91ciBBbmd1bGFyJ3MgRm9ybUNvbnRyb2wuXHJcbiAgcHJvdGVjdGVkIF91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZXI6IEVsZW1lbnRSZWYgPSB0aGlzLm15Rm9ybUlucHV0SW5zdGFuY2UgPyB0aGlzLm15Rm9ybUlucHV0SW5zdGFuY2UuZWxlbWVudFJlZiA6IHRoaXMuZWxlbWVudFJlZjtcclxuICAgIC8vIGlmICh0aGlzLnRvb2x0aXBNYW5hZ2VyICYmIGVyKSB7XHJcbiAgICAvLyAgICAgdGhpcy50b29sdGlwTWFuYWdlci5kZXN0cm95RXJyb3JUb29sdGlwT2ZFbGVtZW50KGVyLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5fc2V0TmF0aXZlUmVxdWlyZWQodGhpcy5yZXF1aXJlZCk7XHJcbiAgICB0aGlzLl9zZXROYXRpdmVNYXhMZW5ndGgodGhpcy5tYXhMZW5ndGgpO1xyXG4gICAgdGhpcy5fc2V0TmF0aXZlRGlzYWJsZWQodGhpcy5kaXNhYmxlZCk7XHJcbiAgICB0aGlzLl9zZXROYXRpdmVSZWFkT25seSh0aGlzLnJlYWRvbmx5IHx8IHRoaXMuZm9yY2VSZWFkb25seSk7XHJcblxyXG4gICAgdGhpcy5yZWRFcnJvckJhY2tncm91bmQgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9jb250cm9sRXhpc3RzKCkpIHtcclxuICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG5cclxuICAgICAgLy8gYWRkIHJlcXVpcmVkXHJcbiAgICAgIGlmICh0aGlzLnJlcXVpcmVkKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKHJlcXVpcmVkVmFsaWRhdG9yKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWRkIG1heGxlbmd0aFxyXG4gICAgICBpZiAobm90TmlsbCh0aGlzLl9tYXhMZW5ndGgpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVjaW1hbHMpIHtcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChwcmVjaXNpb25TY2FsZVZhbGlkYXRvcih0aGlzLl9tYXhMZW5ndGgsIHRoaXMuZGVjaW1hbHMpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKG1heFN0cmluZ0xlbmd0aFZhbGlkYXRvcih0aGlzLl9tYXhMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGFkZCBASW5wdXQoKS1lZCB2YWxpZGF0b3JzXHJcbiAgICAgIHZhbGlkYXRvcnMucHVzaCguLi50aGlzLl92YWxpZGF0b3JzKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl92YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgdGhpcy5fdmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XHJcbiAgICAgICAgICBpZiAodmFsaWRhdG9yID09PSByZXF1aXJlZFZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldE5hdGl2ZVJlcXVpcmVkKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcclxuICAgICAgdGhpcy5jb250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyh0aGlzLl9hc3luY1ZhbGlkYXRvcnMpO1xyXG4gICAgICB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xlYXJFcnJvckNvbXBvbmVudCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvckNvbnRhaW5lcikge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvckNvbnRhaW5lci5jbGVhcigpO1xyXG4gICAgICBpZiAodGhpcy5fZXJyb3JWYWxpZGF0aW9uQ29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5fZXJyb3JWYWxpZGF0aW9uQ29tcG9uZW50LmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLl9lcnJvclZhbGlkYXRpb25Db21wb25lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLyB3aGV0aGVyIHRoaXMubmdNb2RlbC5jb250cm9sIGhhcyBzYWZlIGFjY2Vzc1xyXG4gIHByaXZhdGUgX2NvbnRyb2xFeGlzdHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5uZ01vZGVsICYmICEhdGhpcy5jb250cm9sO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY29udHJvbElzVmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbEV4aXN0cygpICYmIHRoaXMuY29udHJvbC52YWxpZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldE5hdGl2ZURpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pbnB1dCkge1xyXG4gICAgICB0aGlzLmlucHV0LmRpc2FibGVkID0gZGlzYWJsZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXROYXRpdmVNYXhMZW5ndGgobWF4bGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlucHV0KSB7XHJcbiAgICAgIHRoaXMuaW5wdXQubWF4TGVuZ3RoID0gbWF4bGVuZ3RoO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9zZXROYXRpdmVSZWFkT25seShyZWFkb25seTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaW5wdXQpIHtcclxuICAgICAgdGhpcy5pbnB1dC5yZWFkT25seSA9IHJlYWRvbmx5O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0TmF0aXZlUmVxdWlyZWQocmVxdWlyZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlucHV0KSB7XHJcbiAgICAgIHRoaXMuaW5wdXQucmVxdWlyZWQgPSByZXF1aXJlZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3N1YnNjcmliZVRvU3BlZWNoSW5wdXQoKTogdm9pZCB7XHJcbiAgICAvLyB0aGlzLl9zcGVlY2hTdWIgPSB0aGlzLnNwZWVjaElucHV0LnNwZWVjaElucHV0LnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgLy8gICAgIGlmICh0aGlzLmZvY3VzZWQgJiYgdGhpcy5fY29udHJvbEV4aXN0cygpKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHZhbDogc3RyaW5nID0gdGhpcy5jb250cm9sLnZhbHVlO1xyXG4gICAgLy8gICAgICAgICB0aGlzLnNldE1vZGVsKChTdHJpbmdVdGlscy5Jc1N0cmluZyh2YWwpID8gdmFsIDogJycpICsgZGF0YSk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hZGRPclJlbW92ZVNlbGZGcm9tRm9ybSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmhpZGRlbikge1xyXG4gICAgICB0aGlzLl9yZW1vdmVTZWxmRnJvbUZvcm0oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2FkZFNlbGZUb0Zvcm0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVNlbGZJbkZvcm0oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuZm9ybUNvbXBvbmVudC51cGRhdGVGb3JtSW5wdXQodGhpcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZW1vdmVTZWxmRnJvbUZvcm0oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29tcG9uZW50ICYmIHRoaXMubmdNb2RlbCkge1xyXG4gICAgICB0aGlzLmZvcm1Db21wb25lbnQucmVtb3ZlRm9ybUlucHV0KHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWRkU2VsZlRvRm9ybSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZvcm1Db21wb25lbnQgJiYgdGhpcy5uZ01vZGVsICYmICF0aGlzLm5vRm9ybUdyb3VwQ29udHJvbCkge1xyXG4gICAgICB0aGlzLmZvcm1Db21wb25lbnQucmVtb3ZlRm9ybUlucHV0KHRoaXMpOyAvLyBwcmV2ZW50aW5nIHRoZXJlIGFyZSB0d28gY29udHJvbHMgaW4gZm9ybWdyb3VwIHdoZW4gbXlGb3JtSW5wdXRJbnN0YW5jZSBpcyAoYmVpbmcpIHNldFxyXG4gICAgICB0aGlzLmZvcm1Db21wb25lbnQuYWRkRm9ybUlucHV0KHRoaXMubXlGb3JtSW5wdXRJbnN0YW5jZSA/IHRoaXMubXlGb3JtSW5wdXRJbnN0YW5jZSA6IHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|
|
736
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS9iYXNlLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUVqQix3QkFBd0IsRUFFeEIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWdDLE9BQU8sRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBRW5GLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDOUQsT0FBTyxFQUFDLFlBQVksRUFBRSxxQkFBcUIsRUFBQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ2pHLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzFGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUUxRCxPQUFPLEVBQUMsdUNBQXVDLEVBQUMsTUFBTSw0REFBNEQsQ0FBQztBQUNuSCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDMUQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFHaEYsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sZ0RBQWdELENBQUM7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QUFDLGlCQUFpQjt5QkFLN0IsV0FBVyxTQUFDLGdCQUFnQjs2QkFLNUIsV0FBVyxTQUFDLDBCQUEwQjtvQkFLdEMsV0FBVyxTQUFDLGFBQWE7aUNBS3pCLFdBQVcsU0FBQyxxQkFBcUI7c0JBS2pDLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7d0JBVWhDLFlBQVksU0FBQyxTQUFTO21DQU90QixZQUFZLFNBQUMsaUJBQWlCO2lDQUs5QixZQUFZLFNBQUMsZUFBZTs0QkFLNUIsWUFBWSxTQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7QUFoVG5DO0lBRFUsWUFBWSxFQUFFO3dEQUNhO0FBR3JDO0lBRFUsWUFBWSxFQUFFO3FEQUNFO0FBRzFCO0lBRFUsWUFBWSxFQUFFO3dEQUNLO0FBK0U3QjtJQURVLFlBQVksRUFBRTt5REFDYztBQTZIdEM7SUFEVSxZQUFZLEVBQUU7dURBQ1k7QUFHcEM7SUFEVSxZQUFZLEVBQUU7NkRBQ2tCO0FBRzFDO0lBRFUsWUFBWSxFQUFFO3FEQUNVO0FBR2xDO0lBRFUsWUFBWSxFQUFFO3FEQUNVO0FBR2xDO0lBRFUsWUFBWSxFQUFFO2tFQUN1QjtBQUcvQztJQURVLFlBQVksRUFBRTs4REFDbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50RmFjdG9yeSxcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgQ29tcG9uZW50UmVmLCBDb250ZW50Q2hpbGQsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3RhYmxlLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q29udGFpbmVyUmVmXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtBc3luY1ZhbGlkYXRvckZuLCBGb3JtQ29udHJvbCwgTmdNb2RlbCwgVmFsaWRhdG9yRm59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb25BZGFwdGVyQ29tcG9uZW50fSBmcm9tIFwiLi9jb25maWd1cmF0aW9uLWFkYXB0ZXItY29tcG9uZW50LmludGVyZmFjZVwiO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSBcIi4uLy4uL2NvcmUvZnVuY3Rpb24vaXMtbmlsbC5mdW5jdGlvblwiO1xyXG5pbXBvcnQge25vdE5pbGx9IGZyb20gXCIuLi8uLi9jb3JlL2Z1bmN0aW9uL25vdC1uaWxsLmZ1bmN0aW9uXCI7XHJcbmltcG9ydCB7SW5wdXRCb29sZWFuLCBJbnB1dEJvb2xlYW5EZWNvcmF0b3J9IGZyb20gXCIuLi8uLi9jb3JlL2RlY29yYXRvci9pbnB1dC1ib29sZWFuLmRlY29yYXRvclwiO1xyXG5pbXBvcnQge3JlcXVpcmVkVmFsaWRhdG9yfSBmcm9tIFwiLi4vLi4vY29yZS92YWxpZGF0b3IvcmVxdWlyZWQudmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7cHJlY2lzaW9uU2NhbGVWYWxpZGF0b3J9IGZyb20gXCIuLi8uLi9jb3JlL3ZhbGlkYXRvci9wcmVjaXNpb24tc2NhbGUudmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7bWF4U3RyaW5nTGVuZ3RoVmFsaWRhdG9yfSBmcm9tIFwiLi4vLi4vY29yZS92YWxpZGF0b3IvbWF4LXN0cmluZy1sZW5ndGgudmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7U3RyaW5nVXRpbHN9IGZyb20gXCIuLi8uLi9jb3JlL3V0aWxzL3N0cmluZy11dGlsc1wiO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtGb3JtSW5wdXRVc2VyTW9kZWxDaGFuZ2VMaXN0ZW5lclNlcnZpY2V9IGZyb20gXCIuLi8uLi9jb3JlL3NlcnZpY2UvZm9ybS1pbnB1dC11c2VyLWNoYW5nZS1saXN0ZW5lci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7TnVtYmVyVXRpbHN9IGZyb20gXCIuLi8uLi9jb3JlL3V0aWxzL251bWJlci11dGlsc1wiO1xyXG5pbXBvcnQge05nWm9uZVdyYXBwZXJTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vY29yZS9zZXJ2aWNlL25nLXpvbmUtd3JhcHBlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7Q29yZUNvbXBvbmVudHNJY29ufSBmcm9tIFwiLi4vLi4vY29yZS9lbnVtL2NvcmUtY29tcG9uZW50cy1pY29uLmVudW1cIjtcclxuaW1wb3J0IHtGb3JtQ29tcG9uZW50fSBmcm9tIFwiLi4vZm9ybS9mb3JtLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1ZhbGlkYXRpb25FcnJvckNvbXBvbmVudH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24tZXJyb3IvdmFsaWRhdGlvbi1lcnJvci5jb21wb25lbnRcIjtcclxuXHJcbi8qKlxyXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgY29uY3JldGUgZm9ybSBpbnB1dCBjb21wb25lbnRzIHRoYXQgY29udGFpbiBhIG5hdGl2ZSA8aW5wdXQ+IGVsZW1lbnQuIFByb3ZpZGVzIGNvbW1vbiBkYXRhIGFuZCBmdW5jdGlvbmFsaXR5LCBzdWNoIGFzXHJcbiAqIGFkZGluZyBzZWxmIGFzIGEgY29udHJvbCB0byB0aGUgcGFyZW50IGZvcm0uXHJcbiAqL1xyXG5ARGlyZWN0aXZlKClcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUlucHV0Q29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIENvbmZpZ3VyYXRpb25BZGFwdGVyQ29tcG9uZW50IHtcclxuICBAVmlld0NoaWxkKFwidmFsaWRhdGlvbkVycm9yXCIsIHtyZWFkOiBWaWV3Q29udGFpbmVyUmVmfSlcclxuICBwdWJsaWMgdmFsaWRhdGlvbkVycm9yQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xyXG5cclxuICBAVmlld0NoaWxkKE5nTW9kZWwsIHtzdGF0aWM6IHRydWV9KVxyXG4gIHB1YmxpYyBfbmdNb2RlbDogTmdNb2RlbDtcclxuXHJcbiAgcHVibGljIGdldCBuZ01vZGVsKCk6IE5nTW9kZWwge1xyXG4gICAgaWYgKHRoaXMuX215Rm9ybUlucHV0SW5zdGFuY2UpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX215Rm9ybUlucHV0SW5zdGFuY2UubmdNb2RlbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9uZ01vZGVsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBCYXNlRm9ybUlucHV0Q29tcG9uZW50SW5kZXg6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIHN0YXRpYyBIaWRkZW5DbGFzczogc3RyaW5nID0gXCJoaWRkZW5cIjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd1NhdmVDYW5jZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IG1vZGVsKHZhbHVlOiBUKSB7XHJcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxNb2RlbFNldCkge1xyXG4gICAgICB0aGlzLl9pbml0aWFsTW9kZWwgPSB0aGlzLl9tb2RlbDtcclxuICAgICAgdGhpcy5faW5pdGlhbE1vZGVsU2V0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuX21vZGVsID0gdmFsdWU7XHJcbiAgICB0aGlzLmNhblNhdmVPckNhbmNlbCA9IHRoaXMuX21vZGVsICE9PSB0aGlzLl9pbml0aWFsTW9kZWw7XHJcbiAgICB0aGlzLl9jbGVhckVycm9yQ29tcG9uZW50KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG1vZGVsKCk6IFQge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgbGFiZWw6IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpXHJcbiAgcHVibGljIG5vVmFsaWRhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKClcclxuICBwdWJsaWMgaW5pdEZvY3VzOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKClcclxuICBwdWJsaWMgbm9DbGlja0ZvY3VzOiBib29sZWFuO1xyXG5cclxuICAvLyB1c2VkIHRvIGxpbmsgZmllbGQgdG8gYnVzaW5lc3Mgb2JqZWN0IGZvciBkZWVwLXZhbGlkYXRpb25cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBidXNpbmVzc09iamVjdElkOiBhbnk7XHJcblxyXG4gIC8vIEBJbnB1dCgpXHJcbiAgLy8gcHVibGljIGVycm9yTWVzc2FnZTogVmFsaWRhdGlvbk1lc3NhZ2U7XHJcblxyXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBkaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xyXG4gICAgaWYgKGRpc2FibGVkID09PSB0aGlzLl9kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IElucHV0Qm9vbGVhbkRlY29yYXRvci5JbnB1dFZhbHVlVG9Cb29sZWFuKGRpc2FibGVkKTtcclxuICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xWYWxpZGF0b3JzQW5kT3duRmxhZ3MoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgbWF4TGVuZ3RoKG1heExlbmd0aDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnNldE1heExlbmd0aChtYXhMZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBub3ROaWxsKHRoaXMuZm9yY2VkTWF4TGVuZ3RoKSA/IHRoaXMuZm9yY2VkTWF4TGVuZ3RoIDogdGhpcy5fbWF4TGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZm9yY2VkTWF4TGVuZ3RoOiBudW1iZXI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCByZWFkb25seShyZWFkb25seTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuX2ZvcmNlUmVhZG9ubHkgIT09IHVuZGVmaW5lZCB8fCByZWFkb25seSA9PT0gdGhpcy5fcmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVhZG9ubHkgPSBJbnB1dEJvb2xlYW5EZWNvcmF0b3IuSW5wdXRWYWx1ZVRvQm9vbGVhbihyZWFkb25seSk7XHJcbiAgICB0aGlzLl91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk7XHJcbiAgICBpZiAodGhpcy5faGFzT25QdXNoQ2RTdHJhdGVneSkge1xyXG4gICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JjZVJlYWRvbmx5IHx8IHRoaXMuX3JlYWRvbmx5O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGZvcmNlUmVhZG9ubHkoZm9yY2VSZWFkb25seTogYm9vbGVhbikge1xyXG4gICAgaWYgKGZvcmNlUmVhZG9ubHkgPT09IHRoaXMuX2ZvcmNlUmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZm9yY2VSZWFkb25seSA9IElucHV0Qm9vbGVhbkRlY29yYXRvci5JbnB1dFZhbHVlVG9Cb29sZWFuKGZvcmNlUmVhZG9ubHkpO1xyXG4gICAgdGhpcy5fdXBkYXRlQ29udHJvbFZhbGlkYXRvcnNBbmRPd25GbGFncygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBmb3JjZVJlYWRvbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZvcmNlUmVhZG9ubHk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgcmVxdWlyZWQocmVxdWlyZWQ6IGJvb2xlYW4pIHtcclxuICAgIGlmIChyZXF1aXJlZCA9PT0gdGhpcy5fcmVxdWlyZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVxdWlyZWQgPSBJbnB1dEJvb2xlYW5EZWNvcmF0b3IuSW5wdXRWYWx1ZVRvQm9vbGVhbihyZXF1aXJlZCk7XHJcbiAgICB0aGlzLl91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9yY2VSZXF1aXJlZCB8fCB0aGlzLl9yZXF1aXJlZDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKVxyXG4gIHB1YmxpYyBmb3JjZVJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7ICAvLyBhIGZvcmNlIG91dHNpZGUgb2YgW2NmZ05hbWVdJ3MgaW5mbHVlbmNlXHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCB2YWxpZGF0b3JzKHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10pIHtcclxuICAgIGlmICh2YWxpZGF0b3JzID09PSB0aGlzLl92YWxpZGF0b3JzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3ZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzO1xyXG4gICAgdGhpcy5fdXBkYXRlQ29udHJvbFZhbGlkYXRvcnNBbmRPd25GbGFncygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB2YWxpZGF0b3JzKCk6IFZhbGlkYXRvckZuW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvcnM7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgYXN5bmNWYWxpZGF0b3JzKHZhbGlkYXRvcnM6IEFzeW5jVmFsaWRhdG9yRm5bXSkge1xyXG4gICAgdGhpcy5fYXN5bmNWYWxpZGF0b3JzID0gdmFsaWRhdG9ycztcclxuICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xWYWxpZGF0b3JzQW5kT3duRmxhZ3MoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgYXN5bmNWYWxpZGF0b3JzKCk6IEFzeW5jVmFsaWRhdG9yRm5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXN5bmNWYWxpZGF0b3JzO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgQEhvc3RCaW5kaW5nKFwiY2xhc3MuXCIgKyBCYXNlSW5wdXRDb21wb25lbnQuSGlkZGVuQ2xhc3MpXHJcbiAgcHVibGljIHNldCBoaWRkZW4oaGlkZGVuOiBib29sZWFuKSB7XHJcbiAgICBpZiAoaGlkZGVuID09PSB0aGlzLl9oaWRkZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2hpZGRlbiA9IGhpZGRlbjtcclxuXHJcbiAgICB0aGlzLl9hZGRPclJlbW92ZVNlbGZGcm9tRm9ybSgpO1xyXG5cclxuICAgIGlmICghdGhpcy5fZGVzdHJveWVkKSB7XHJcbiAgICAgIGlmIChoaWRkZW4pIHtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGFjaCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IucmVhdHRhY2goKTtcclxuICAgICAgICBpZiAodGhpcy5faGFzT25QdXNoQ2RTdHJhdGVneSkge1xyXG4gICAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzQWZ0ZXJBbmd1bGFyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oaWRkZW5DaGFuZ2UuZW1pdChoaWRkZW4pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBoaWRkZW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgLy8gbm8gY3VzdG9tIHNldHRlciBsb2dpYyBhcyB3aXRoIHRoZSBvdGhlciAnc2NyZWVuIGNvbmZpZyBwcm9wcycsIGJlY2F1c2UgY29uY3JldGUgZm9ybSBpbnB1dCBjb21wb25lbnRzIGhhbmRsZSB0aGlzIHRoZW1zZWx2ZXMuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGRlY2ltYWxzKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2RlY2ltYWxzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRlY2ltYWxzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVjaW1hbHM7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpY29uOiBDb3JlQ29tcG9uZW50c0ljb247XHJcblxyXG4gIC8vIEdvYWw6IGFiaWxpdHkgdG8gZW11bGF0ZSB0aGUgcmVkIGJhY2tncm91bmQgb2YgaW5wdXQgZmllbGRzIChmb3JtLXN1Ym1pdHRlZCBpbnZhbGlkIHN0YXRlKVxyXG4gIEBJbnB1dCgpIEBIb3N0QmluZGluZyhcImNsYXNzLmNjLXJlZC1lcnJvci1iYWNrZ3JvdW5kXCIpXHJcbiAgcHVibGljIHJlZEVycm9yQmFja2dyb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBteUZvcm1JbnB1dEluc3RhbmNlKHZhbHVlOiBCYXNlSW5wdXRDb21wb25lbnQ8VD4pIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5fbXlGb3JtSW5wdXRJbnN0YW5jZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9teUZvcm1JbnB1dEluc3RhbmNlID0gdmFsdWU7XHJcbiAgICB0aGlzLl91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgbXlGb3JtSW5wdXRJbnN0YW5jZSgpOiBCYXNlSW5wdXRDb21wb25lbnQ8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX215Rm9ybUlucHV0SW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9teUZvcm1JbnB1dEluc3RhbmNlOiBCYXNlSW5wdXRDb21wb25lbnQ8VD47XHJcblxyXG4gIC8vIEBPdXRwdXQoKVxyXG4gIC8vIHB1YmxpYyBjb21taXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBuYXRpdmVCbHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvLyBlbWl0cyB3aGVuIHRoZSBlbnRlciBidXR0b24gb24ga2V5Ym9hcmQgd2FzIHByZXNzZWQgd2hpbGUgdGhpcyBmb3JtIGlucHV0IGhhZCBmb2N1c3NlZFxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBlbnRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBmb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBrZXlEb3duOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IGtleVVwOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IG1vZGVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgdXNlck1vZGVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgaGlkZGVuQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmNjLWlucHV0LWZvY3VzZWRcIilcclxuICBwdWJsaWMgZm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgZm9ybUNvbXBvbmVudDogRm9ybUNvbXBvbmVudDtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuZm9ybS1pbnB1dFwiKVxyXG4gIHB1YmxpYyBmb3JtSW5wdXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgQEhvc3RCaW5kaW5nKFwiY2xhc3MuY3VzdG9tLXdpZHRoXCIpXHJcbiAgcHVibGljIGN1c3RvbVdpZHRoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKVxyXG4gIHB1YmxpYyBub1RyaWFuZ2xlR3JhcGhpYzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgQEhvc3RCaW5kaW5nKFwiY2xhc3MuaGFsZi13aWR0aFwiKVxyXG4gIHB1YmxpYyBoYWxmV2lkdGg6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIEBIb3N0QmluZGluZyhcImNsYXNzLmZ1bGwtd2lkdGgtaW1wb3J0YW50XCIpXHJcbiAgcHVibGljIGZ1bGxXaWR0aDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKClcclxuICBwdWJsaWMgZXhjbHVkZVVzZXJNb2RlbENoYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKClcclxuICBwdWJsaWMgbm9Gb3JtR3JvdXBDb250cm9sOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmZvcm0tc3VibWl0dGVkXCIpXHJcbiAgcHVibGljIGdldCBmb3JtU3VibWl0dGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudCAmJiB0aGlzLmZvcm1Db21wb25lbnQuc3VibWl0dGVkO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuaGFzbm9sYWJlbFwiKVxyXG4gIHB1YmxpYyBnZXQgaGFzTm9MYWJlbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpc05pbGwodGhpcy5sYWJlbCk7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5oYXN2YWx1ZVwiKVxyXG4gIHB1YmxpYyBnZXQgaGFzVmFsdWUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLm1vZGVsIHx8IFN0cmluZ1V0aWxzLklzU3RyaW5nV2l0aExlbmd0aCh0aGlzLm1vZGVsKSB8fCBOdW1iZXJVdGlscy5Jc051bWJlcih0aGlzLm1vZGVsKTtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmludmFsaWRcIilcclxuICBwdWJsaWMgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hlY2tTdGF0ZSgpICYmICF0aGlzLmNvbnRyb2wudmFsaWQ7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5kaXNhYmxlZFwiKVxyXG4gIHB1YmxpYyBnZXQgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLnJlYWQtb25seVwiKVxyXG4gIHB1YmxpYyBnZXQgaXNSZWFkb25seSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJlYWRvbmx5O1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MucmVxdWlyZWRcIilcclxuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlZDtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmNjLXRvdWNoZWQtaW52YWxpZFwiKVxyXG4gIHB1YmxpYyBnZXQgdG91Y2hlZEludmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbEV4aXN0cygpICYmIHRoaXMuY29udHJvbC50b3VjaGVkICYmICF0aGlzLmNvbnRyb2wudmFsaWQ7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy52YWxpZFwiKVxyXG4gIHB1YmxpYyBnZXQgdmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hlY2tTdGF0ZSgpICYmIHRoaXMuY29udHJvbC52YWxpZDtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLm5vLXZhbGlkYXRpb25cIilcclxuICBwdWJsaWMgZ2V0IHZhbGlkYXRpb25EaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5ub1ZhbGlkYXRpb247XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKFwiY2xpY2tcIiwgW1wiJGV2ZW50XCJdKVxyXG4gIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNhbkNoYW5nZSAmJiAhdGhpcy5ub0NsaWNrRm9jdXMpIHtcclxuICAgICAgdGhpcy5yZXF1ZXN0Rm9jdXMoKTtcclxuICAgICAgaWYgKCF0aGlzLmV4Y2x1ZGVVc2VyTW9kZWxDaGFuZ2UpIHtcclxuICAgICAgICB0aGlzLm1hcmtBc1VzZXJUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJmb2N1c2luXCIpXHJcbiAgb25Gb2N1c0luKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmV4Y2x1ZGVVc2VyTW9kZWxDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5tYXJrQXNVc2VyVG91Y2hlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcImRvY3VtZW50OnNjcm9sbFwiKVxyXG4gIHB1YmxpYyBoYW5kbGVEb2N1bWVudFNjcm9sbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Bvc2l0aW9uVmFsaWRhdGlvbkVycm9yKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxyXG4gIHB1YmxpYyBoYW5kbGVXaW5kb3dSZXNpemUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wb3NpdGlvblZhbGlkYXRpb25FcnJvcigpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcihcImtleWRvd25cIiwgW1wiJGV2ZW50XCJdKVxyXG4gIHB1YmxpYyBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zaG93U2F2ZUNhbmNlbCAmJiB0aGlzLmNhblNhdmVPckNhbmNlbCkge1xyXG4gICAgICB0aGlzLl9oYW5kbGVLZXlEb3duKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY2FuQ2hhbmdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLnJlYWRvbmx5ICYmICF0aGlzLmRpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjb250cm9sKCk6IEZvcm1Db250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLl9teUZvcm1JbnB1dEluc3RhbmNlID8gdGhpcy5fbXlGb3JtSW5wdXRJbnN0YW5jZS5jb250cm9sIDogdGhpcy5uZ01vZGVsICYmIHRoaXMubmdNb2RlbC5jb250cm9sO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBmb3JtSW5wdXRJbnN0YW5jZSgpOiBCYXNlSW5wdXRDb21wb25lbnQ8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX215Rm9ybUlucHV0SW5zdGFuY2UgfHwgdGhpcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNEZXN0cm95ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveWVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudDtcclxuXHJcbiAgcHVibGljIGtlZXBGb2N1czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjYW5TYXZlT3JDYW5jZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gQGltcGxlbWVudHMgQ29uZmlndXJhdGlvbkFkYXB0ZXJDb21wb25lbnRcclxuICBwdWJsaWMgb2JqZWN0Q29uZmlnTmFtZTogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBfbWFya2VkQXNVc2VyVG91Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcbiAgcHJvdGVjdGVkIF9kZXN0cm95ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX2hhc09uUHVzaENkU3RyYXRlZ3k6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX21vZGVsOiBUO1xyXG4gIHByb3RlY3RlZCBfaW5pdGlhbE1vZGVsOiBUO1xyXG4gIHByb3RlY3RlZCBfaW5pdGlhbE1vZGVsU2V0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX2Vycm9yVmFsaWRhdGlvbkNvbXBvbmVudDogQ29tcG9uZW50UmVmPFZhbGlkYXRpb25FcnJvckNvbXBvbmVudD47XHJcbiAgcHJpdmF0ZSBfZGVjaW1hbHM6IG51bWJlcjtcclxuICBwcml2YXRlIF9oaWRkZW46IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfbWF4TGVuZ3RoOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfcmVhZG9ubHk6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgX2ZvcmNlUmVhZG9ubHk6IGJvb2xlYW4gPSB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgX3ZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcclxuICBwcml2YXRlIF9hc3luY1ZhbGlkYXRvcnM6IEFzeW5jVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIF9zcGVlY2hTdWI6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9tb2RlbENoYW5nZVN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgX2Zvcm1BbnlTdWJtaXRTdWI6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9mb3JtUmVhZG9ubHlDaGFuZ2VTdWI6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9jbGVhck1hcmtlZEFzVXNlclRvdWNoZWRTdWI6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJvdGVjdGVkIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIGZvcm1Vc2VyQ2hhbmdlTGlzdGVuZXI/OiBGb3JtSW5wdXRVc2VyTW9kZWxDaGFuZ2VMaXN0ZW5lclNlcnZpY2UsXHJcbiAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgbmdab25lV3JhcHBlcj86IE5nWm9uZVdyYXBwZXJTZXJ2aWNlLFxyXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIGVsZW1lbnRSZWY/OiBFbGVtZW50UmVmLFxyXG4gICkge1xyXG4gICAgQmFzZUlucHV0Q29tcG9uZW50LkJhc2VGb3JtSW5wdXRDb21wb25lbnRJbmRleCsrO1xyXG4gICAgdGhpcy5uYW1lID0gQmFzZUlucHV0Q29tcG9uZW50LkJhc2VGb3JtSW5wdXRDb21wb25lbnRJbmRleC50b1N0cmluZygpO1xyXG5cclxuICAgIGlmICh0aGlzLmZvcm1Vc2VyQ2hhbmdlTGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5fY2xlYXJNYXJrZWRBc1VzZXJUb3VjaGVkU3ViID0gdGhpcy5mb3JtVXNlckNoYW5nZUxpc3RlbmVyLmNsZWFyQWxsTWFya2VkQXNVc2VyVG91Y2hlZC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX21hcmtlZEFzVXNlclRvdWNoZWQgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX21vZGVsQ2hhbmdlU3ViID0gdGhpcy5tb2RlbENoYW5nZS5zdWJzY3JpYmUoKHZhbDogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMubW9kZWwgPSB2YWw7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXBhcmVJbnB1dCgpO1xyXG5cclxuICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xWYWxpZGF0b3JzQW5kT3duRmxhZ3MoKTtcclxuXHJcbiAgICB0aGlzLl9hZGRPclJlbW92ZVNlbGZGcm9tRm9ybSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmZvcm1Db21wb25lbnQpIHtcclxuICAgICAgdGhpcy5yZWFkb25seSA9IHRoaXMucmVhZG9ubHkgfHwgdGhpcy5mb3JtQ29tcG9uZW50LnJlYWRvbmx5O1xyXG4gICAgICB0aGlzLl9mb3JtUmVhZG9ubHlDaGFuZ2VTdWIgPSB0aGlzLmZvcm1Db21wb25lbnQucmVhZG9ubHlDaGFuZ2Uuc3Vic2NyaWJlKChpc0Zvcm1SZWFkb25seTogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIHRoaXMucmVhZG9ubHkgPSBpc0Zvcm1SZWFkb25seTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaW5pdEZvY3VzKSB7XHJcbiAgICAgIHNldFRpbWVvdXQodGhpcy5yZXF1ZXN0Rm9jdXMuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlucHV0KSB7XHJcbiAgICAgIHRoaXMuaW5wdXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIChldmVudCkgPT4gdGhpcy5kb0JsdXIoZXZlbnQpKTtcclxuICAgICAgdGhpcy5pbnB1dC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIChldmVudCkgPT4gdGhpcy5kb0ZvY3VzKGV2ZW50KSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcclxuICAgIHRoaXMuX2NsZWFyRXJyb3JDb21wb25lbnQoKTtcclxuXHJcbiAgICAvLyBpZiAodGhpcy50b29sdGlwTWFuYWdlciAmJiB0aGlzLmVsZW1lbnRSZWYpIHtcclxuICAgIC8vICAgICB0aGlzLnRvb2x0aXBNYW5hZ2VyLmRlc3Ryb3lFcnJvclRvb2x0aXBPZkVsZW1lbnQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGlmICh0aGlzLl9tb2RlbENoYW5nZVN1Yikge1xyXG4gICAgICB0aGlzLl9tb2RlbENoYW5nZVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3NwZWVjaFN1Yikge1xyXG4gICAgICB0aGlzLl9zcGVlY2hTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9mb3JtQW55U3VibWl0U3ViKSB7XHJcbiAgICAgIHRoaXMuX2Zvcm1BbnlTdWJtaXRTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9mb3JtUmVhZG9ubHlDaGFuZ2VTdWIpIHtcclxuICAgICAgdGhpcy5fZm9ybVJlYWRvbmx5Q2hhbmdlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fY2xlYXJNYXJrZWRBc1VzZXJUb3VjaGVkU3ViKSB7XHJcbiAgICAgIHRoaXMuX2NsZWFyTWFya2VkQXNVc2VyVG91Y2hlZFN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5fcmVtb3ZlU2VsZkZyb21Gb3JtKCk7XHJcbiAgICB0aGlzLmVsZW1lbnRSZWYgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5pbnB1dCA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8vIGRlc2NlbmRlbnRzIHNob3VsZCBvdmVycmlkZSB0aGlzXHJcbiAgcHVibGljIGNvbW1pdCA9IGFzeW5jIChtb2RlbDogYW55KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNvbW1pdENsaWNrKGV2ZW50PzogTW91c2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5rZWVwRm9jdXMgPSB0cnVlO1xyXG4gICAgYXdhaXQgdGhpcy5jb21taXQodGhpcy5tb2RlbCk7XHJcbiAgICB0aGlzLmtlZXBGb2N1cyA9IGZhbHNlO1xyXG4gICAgdGhpcy5kb0JsdXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbmNlbENsaWNrKGV2ZW50PzogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5rZWVwRm9jdXMgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuX2luaXRpYWxNb2RlbFNldCkge1xyXG4gICAgICB0aGlzLm1vZGVsID0gdGhpcy5faW5pdGlhbE1vZGVsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5rZWVwRm9jdXMgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93VmFsaWRhdGlvbkVycm9yKGVycm9yOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvckNvbnRhaW5lcikge1xyXG4gICAgICBpZiAodGhpcy5fZXJyb3JWYWxpZGF0aW9uQ29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5fY2xlYXJFcnJvckNvbXBvbmVudCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8VmFsaWRhdGlvbkVycm9yQ29tcG9uZW50PiA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFZhbGlkYXRpb25FcnJvckNvbXBvbmVudCk7XHJcbiAgICAgIHRoaXMuX2Vycm9yVmFsaWRhdGlvbkNvbXBvbmVudCA9IHRoaXMudmFsaWRhdGlvbkVycm9yQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcclxuICAgICAgdGhpcy5fZXJyb3JWYWxpZGF0aW9uQ29tcG9uZW50Lmluc3RhbmNlLmVycm9yID0gZXJyb3I7XHJcbiAgICAgIHRoaXMuX3Bvc2l0aW9uVmFsaWRhdGlvbkVycm9yKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyBhIG1vZGVsQ2hhbmdlIGV2ZW50IHdpdGggZ2l2ZW4gdmFsdWUsIGluZGljYXRpbmcgdGhhdCB0aGUgbW9kZWwgb2YgdGhpcyBmb3JtIGlucHV0XHJcbiAgICogaGFzIGNoYW5nZWQgYW5kIGl0cyBuZXcgdmFsdWUgaXMgZ2l2ZW4gdmFsdWUuIEFsc28gZW1pdHMgdXNlck1vZGVsQ2hhbmdlIGlmIG1hcmtlZEFzVXNlclRvdWNoZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHNldE1vZGVsKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwgPSB2YWx1ZTtcclxuICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX21hcmtlZEFzVXNlclRvdWNoZWQgJiYgdGhpcy5mb3JtVXNlckNoYW5nZUxpc3RlbmVyKSB7XHJcbiAgICAgIHRoaXMuZm9ybVVzZXJDaGFuZ2VMaXN0ZW5lci51c2VyTW9kZWxDaGFuZ2UubmV4dCh2YWx1ZSk7XHJcbiAgICAgIHRoaXMudXNlck1vZGVsQ2hhbmdlLm5leHQodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9oYXNPblB1c2hDZFN0cmF0ZWd5KSB7XHJcbiAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlcXVlc3RGb2N1cygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNhbkNoYW5nZSAmJiB0aGlzLmlucHV0KSB7XHJcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKTtcclxuICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkb0ZvY3VzKGV2ZW50OiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faW5pdGlhbE1vZGVsU2V0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5jYW5TYXZlT3JDYW5jZWwgPSBmYWxzZTtcclxuICAgIHRoaXMuZm9jdXMubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRvQmx1cihldmVudD86IGFueSk6IGFueSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMua2VlcEZvY3VzKSB7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmlucHV0LmJsdXIoKTtcclxuICAgICAgdGhpcy5ibHVyLm5leHQoKTtcclxuICAgIH0sIDIwMCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5fZGVzdHJveWVkKSB7XHJcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG1hcmtGb3JDaGVjaygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5fZGVzdHJveWVkKSB7XHJcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGV0ZWN0Q2hhbmdlc0FmdGVyQW5ndWxhcigpOiB2b2lkIHtcclxuICAgIGlmICghIXRoaXMubmdab25lV3JhcHBlcikge1xyXG4gICAgICB0aGlzLm5nWm9uZVdyYXBwZXIuc2V0VGltZW91dE91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuX2Rlc3Ryb3llZCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2hhc09uUHVzaENkU3RyYXRlZ3kpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaW5rcyB0aGUgZ2l2ZW4gZm9ybUNvbXAuc3VibWl0IGV2ZW50IHRvIHRoZSBmaXJpbmcgb2YgZGV0ZWN0Q2hhbmdlcygpIG9mIGdpdmVuIGNoYW5nZSBkZXRlY3Rvci4gVGhpcyBpcyBhICd1dGlsaXR5LWxpa2UnIG1ldGhvZCxcclxuICAgKiBidXQgd2UgbWFuYWdlIHRoZSBhY3R1YWwgc3Vic2NyaXB0aW9uICh3aXRoIFVOU1VCU0NSSUJFKCkhKSBvbiB0aGlzIGJhc2UgY2xhc3MuXHJcbiAgICogQHBhcmFtIGZvcm1Db21wIFRoZSBmb3JtIHdob3NlIHN1Ym1pdCB3ZSB3YW50IHRvIGxpbmsgd2l0aCB0aGUgY2FsbCBvZiAuZGV0ZWN0Q2hhbmdlcygpIG9uIGdpdmVuIGNoYW5nZSBkZXRlY3RvciByZWYuXHJcbiAgICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIFRoaXMgc2hvdWxkIGJlIGdpdmVuIGFzIHBhcmFtLiBJIGNob29zZSBub3QgdG8gbWFrZSB0aGlzIHBhcnQgb2Ygb3VyIChCYXNlRm9ybUlucHV0Q29tcG9uZW50KSBjb25zdHJ1Y3RvcixcclxuICAgKiBiZWNhdXNlIHdlIGFscmVhZHkgaGF2ZSAyMSBleHRlbmRlcnMuXHJcbiAgICovXHJcbiAgLy8gcHVibGljIGxpbmtGb3JtQW55U3VibWl0V2l0aERldGVjdENoYW5nZXMoZm9ybUNvbXA6IEZvcm1Db21wb25lbnQsIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZik6IHZvaWQge1xyXG4gIC8vICAgICBpZiAoZm9ybUNvbXAgJiYgY2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAvLyAgICAgICAgIHRoaXMuX2Zvcm1BbnlTdWJtaXRTdWIgPSBmb3JtQ29tcC5hbnlTdWJtaXQuc3Vic2NyaWJlKCgoKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgaWYgKCF0aGlzLl9kZXN0cm95ZWQpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH0pKTtcclxuICAvLyAgICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIG1hcmtBc1VzZXJUb3VjaGVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbWFya2VkQXNVc2VyVG91Y2hlZCA9IHRydWU7XHJcbiAgICB0aGlzLnJlZEVycm9yQmFja2dyb3VuZCA9IGZhbHNlOyAvLyBub3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSByaWdodCBwbGFjZSB0byBkbyB0aGF0XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJNYXJrZWRBc1VzZXJUb3VjaGVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbWFya2VkQXNVc2VyVG91Y2hlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy91c2VkIGZvciBkZXNjZW5kZW50cywgYmVjYXVzZSBkZXNjZW5kZW50cyBjYW4ndCBzZXQgc3VwZXIgcHJvcGVydGllcywgc2VlIElucHV0TnVtYmVyQ29tcG9uZW50XHJcbiAgcHJvdGVjdGVkIHNldE1heExlbmd0aChtYXhMZW5ndGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKG5vdE5pbGwodGhpcy5mb3JjZWRNYXhMZW5ndGgpIHx8IG1heExlbmd0aCA9PT0gdGhpcy5fbWF4TGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWlzTmFOKG1heExlbmd0aCkpIHtcclxuICAgICAgdGhpcy5fbWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xyXG4gICAgICB0aGlzLl91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX21hcmtBc09uUHVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2hhc09uUHVzaENkU3RyYXRlZ3kgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9jaGVja1N0YXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMubmdNb2RlbCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5mb3JtU3VibWl0dGVkIHx8ICh0aGlzLl9jb250cm9sRXhpc3RzKCkgJiYgdGhpcy5jb250cm9sLnRvdWNoZWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gUGxhY2UgdmFsaWRhdG9ycyBvbnRvIG91ciBBbmd1bGFyJ3MgRm9ybUNvbnRyb2wuXHJcbiAgcHJvdGVjdGVkIF91cGRhdGVDb250cm9sVmFsaWRhdG9yc0FuZE93bkZsYWdzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZXI6IEVsZW1lbnRSZWYgPSB0aGlzLm15Rm9ybUlucHV0SW5zdGFuY2UgPyB0aGlzLm15Rm9ybUlucHV0SW5zdGFuY2UuZWxlbWVudFJlZiA6IHRoaXMuZWxlbWVudFJlZjtcclxuICAgIC8vIGlmICh0aGlzLnRvb2x0aXBNYW5hZ2VyICYmIGVyKSB7XHJcbiAgICAvLyAgICAgdGhpcy50b29sdGlwTWFuYWdlci5kZXN0cm95RXJyb3JUb29sdGlwT2ZFbGVtZW50KGVyLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5fc2V0TmF0aXZlUmVxdWlyZWQodGhpcy5yZXF1aXJlZCk7XHJcbiAgICB0aGlzLl9zZXROYXRpdmVNYXhMZW5ndGgodGhpcy5tYXhMZW5ndGgpO1xyXG4gICAgdGhpcy5fc2V0TmF0aXZlRGlzYWJsZWQodGhpcy5kaXNhYmxlZCk7XHJcbiAgICB0aGlzLl9zZXROYXRpdmVSZWFkT25seSh0aGlzLnJlYWRvbmx5IHx8IHRoaXMuZm9yY2VSZWFkb25seSk7XHJcblxyXG4gICAgdGhpcy5yZWRFcnJvckJhY2tncm91bmQgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9jb250cm9sRXhpc3RzKCkpIHtcclxuICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG5cclxuICAgICAgLy8gYWRkIHJlcXVpcmVkXHJcbiAgICAgIGlmICh0aGlzLnJlcXVpcmVkKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKHJlcXVpcmVkVmFsaWRhdG9yKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWRkIG1heGxlbmd0aFxyXG4gICAgICBpZiAobm90TmlsbCh0aGlzLl9tYXhMZW5ndGgpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVjaW1hbHMpIHtcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChwcmVjaXNpb25TY2FsZVZhbGlkYXRvcih0aGlzLl9tYXhMZW5ndGgsIHRoaXMuZGVjaW1hbHMpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKG1heFN0cmluZ0xlbmd0aFZhbGlkYXRvcih0aGlzLl9tYXhMZW5ndGgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGFkZCBASW5wdXQoKS1lZCB2YWxpZGF0b3JzXHJcbiAgICAgIHZhbGlkYXRvcnMucHVzaCguLi50aGlzLl92YWxpZGF0b3JzKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl92YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgdGhpcy5fdmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XHJcbiAgICAgICAgICBpZiAodmFsaWRhdG9yID09PSByZXF1aXJlZFZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldE5hdGl2ZVJlcXVpcmVkKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcclxuICAgICAgdGhpcy5jb250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyh0aGlzLl9hc3luY1ZhbGlkYXRvcnMpO1xyXG4gICAgICB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xlYXJFcnJvckNvbXBvbmVudCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvckNvbnRhaW5lcikge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvckNvbnRhaW5lci5jbGVhcigpO1xyXG4gICAgICBpZiAodGhpcy5fZXJyb3JWYWxpZGF0aW9uQ29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5fZXJyb3JWYWxpZGF0aW9uQ29tcG9uZW50LmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLl9lcnJvclZhbGlkYXRpb25Db21wb25lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLyB3aGV0aGVyIHRoaXMubmdNb2RlbC5jb250cm9sIGhhcyBzYWZlIGFjY2Vzc1xyXG4gIHByaXZhdGUgX2NvbnRyb2xFeGlzdHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5uZ01vZGVsICYmICEhdGhpcy5jb250cm9sO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY29udHJvbElzVmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbEV4aXN0cygpICYmIHRoaXMuY29udHJvbC52YWxpZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldE5hdGl2ZURpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pbnB1dCkge1xyXG4gICAgICB0aGlzLmlucHV0LmRpc2FibGVkID0gZGlzYWJsZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXROYXRpdmVNYXhMZW5ndGgobWF4bGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlucHV0ICYmICFpc05hTihtYXhsZW5ndGgpKSB7XHJcbiAgICAgIHRoaXMuaW5wdXQubWF4TGVuZ3RoID0gbWF4bGVuZ3RoO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9zZXROYXRpdmVSZWFkT25seShyZWFkb25seTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaW5wdXQpIHtcclxuICAgICAgdGhpcy5pbnB1dC5yZWFkT25seSA9IHJlYWRvbmx5O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0TmF0aXZlUmVxdWlyZWQocmVxdWlyZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlucHV0KSB7XHJcbiAgICAgIHRoaXMuaW5wdXQucmVxdWlyZWQgPSByZXF1aXJlZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3N1YnNjcmliZVRvU3BlZWNoSW5wdXQoKTogdm9pZCB7XHJcbiAgICAvLyB0aGlzLl9zcGVlY2hTdWIgPSB0aGlzLnNwZWVjaElucHV0LnNwZWVjaElucHV0LnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgLy8gICAgIGlmICh0aGlzLmZvY3VzZWQgJiYgdGhpcy5fY29udHJvbEV4aXN0cygpKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHZhbDogc3RyaW5nID0gdGhpcy5jb250cm9sLnZhbHVlO1xyXG4gICAgLy8gICAgICAgICB0aGlzLnNldE1vZGVsKChTdHJpbmdVdGlscy5Jc1N0cmluZyh2YWwpID8gdmFsIDogJycpICsgZGF0YSk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hZGRPclJlbW92ZVNlbGZGcm9tRm9ybSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmhpZGRlbikge1xyXG4gICAgICB0aGlzLl9yZW1vdmVTZWxmRnJvbUZvcm0oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2FkZFNlbGZUb0Zvcm0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVNlbGZJbkZvcm0oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuZm9ybUNvbXBvbmVudC51cGRhdGVGb3JtSW5wdXQodGhpcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZW1vdmVTZWxmRnJvbUZvcm0oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29tcG9uZW50ICYmIHRoaXMubmdNb2RlbCkge1xyXG4gICAgICB0aGlzLmZvcm1Db21wb25lbnQucmVtb3ZlRm9ybUlucHV0KHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYWRkU2VsZlRvRm9ybSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZvcm1Db21wb25lbnQgJiYgdGhpcy5uZ01vZGVsICYmICF0aGlzLm5vRm9ybUdyb3VwQ29udHJvbCkge1xyXG4gICAgICB0aGlzLmZvcm1Db21wb25lbnQucmVtb3ZlRm9ybUlucHV0KHRoaXMpOyAvLyBwcmV2ZW50aW5nIHRoZXJlIGFyZSB0d28gY29udHJvbHMgaW4gZm9ybWdyb3VwIHdoZW4gbXlGb3JtSW5wdXRJbnN0YW5jZSBpcyAoYmVpbmcpIHNldFxyXG4gICAgICB0aGlzLmZvcm1Db21wb25lbnQuYWRkRm9ybUlucHV0KHRoaXMubXlGb3JtSW5wdXRJbnN0YW5jZSA/IHRoaXMubXlGb3JtSW5wdXRJbnN0YW5jZSA6IHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlcGFyZUlucHV0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZWxlbWVudFJlZiAmJiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAvL3RyeSB0byBmaW5kIGlucHV0IGVsZW1lbnRcclxuICAgICAgdGhpcy5pbnB1dCA9IHRoaXMuX2ZpbmRJbnB1dE5vZGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4pO1xyXG4gICAgICBpZiAodGhpcy5pbnB1dCkge1xyXG4gICAgICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIChldmVudCkgPT4gdGhpcy5kb0JsdXIoZXZlbnQpKTtcclxuICAgICAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKGV2ZW50KSA9PiB0aGlzLmRvRm9jdXMoZXZlbnQpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZmluZElucHV0Tm9kZShub2Rlcyk6IGFueSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcclxuICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRJbnB1dE5vZGUobm9kZS5jaGlsZHJlbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Bvc2l0aW9uVmFsaWRhdGlvbkVycm9yKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZWxlbWVudFJlZiAmJiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCAmJiB0aGlzLl9lcnJvclZhbGlkYXRpb25Db21wb25lbnQpIHtcclxuICAgICAgY29uc3QgY2xpZW50UmVjdDogQ2xpZW50UmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICB0aGlzLl9lcnJvclZhbGlkYXRpb25Db21wb25lbnQuaW5zdGFuY2UudG9wID0gY2xpZW50UmVjdC5ib3R0b207XHJcbiAgICAgIHRoaXMuX2Vycm9yVmFsaWRhdGlvbkNvbXBvbmVudC5pbnN0YW5jZS5sZWZ0ID0gY2xpZW50UmVjdC5sZWZ0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IFByb21pc2U8YW55PiB7XHJcbiAgICBzd2l0Y2ggKGV2ZW50LmNvZGUpIHtcclxuICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb21taXRDbGljaygpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgY2FzZSAnVGFiJzpcclxuICAgICAgICBjb25zdCBuZXh0U2libGluZ1RvRm9jdXMgPSBldmVudC5zaGlmdEtleSA/IChldmVudC5jdXJyZW50VGFyZ2V0IGFzIGFueSkucHJldmlvdXNTaWJsaW5nIDogKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgYW55KS5uZXh0U2libGluZztcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29tbWl0Q2xpY2soKTtcclxuICAgICAgICBpZiAobmV4dFNpYmxpbmdUb0ZvY3VzKSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRGb2N1c09uTmV4dFBvc3NpYmxlSW5wdXQobmV4dFNpYmxpbmdUb0ZvY3VzLCBldmVudC5zaGlmdEtleSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgY2FzZSAnRXNjYXBlJzpcclxuICAgICAgICB0aGlzLmNhbmNlbENsaWNrKCk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVOZXdGb2N1c0V2ZW50KGVsZW1lbnQ6IGFueSk6IEV2ZW50IHtcclxuICAgIGxldCBldmVudFR5cGUgPSBcIm9uZm9jdXNpblwiIGluIGVsZW1lbnQgPyBcImZvY3VzaW5cIiA6IFwiZm9jdXNcIixcclxuICAgICAgYnViYmxlcyA9IFwib25mb2N1c2luXCIgaW4gZWxlbWVudCxcclxuICAgICAgZm9jdXNFdmVudDtcclxuXHJcbiAgICBpZiAoXCJjcmVhdGVFdmVudFwiIGluIGRvY3VtZW50KSB7XHJcbiAgICAgIGZvY3VzRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpO1xyXG4gICAgICBmb2N1c0V2ZW50LmluaXRFdmVudChldmVudFR5cGUsIGJ1YmJsZXMsIHRydWUpO1xyXG4gICAgfSBlbHNlIGlmIChcIkV2ZW50XCIgaW4gd2luZG93KSB7XHJcbiAgICAgIGZvY3VzRXZlbnQgPSBuZXcgRXZlbnQoZXZlbnRUeXBlLCB7IGJ1YmJsZXM6IGJ1YmJsZXMsIGNhbmNlbGFibGU6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZm9jdXNFdmVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldEZvY3VzT25OZXh0UG9zc2libGVJbnB1dChlbGVtZW50OiBhbnksIHByZXZpb3VzOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBjb25zdCBlbGVtZW50Q29sbCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7XHJcbiAgICBpZiAoZWxlbWVudENvbGwgJiYgZWxlbWVudENvbGwubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSBlbGVtZW50Q29sbFswXTtcclxuICAgICAgaWYgKGlucHV0RWxlbWVudC5kaXNhYmxlZCB8fCBpbnB1dEVsZW1lbnQucmVhZE9ubHkpIHtcclxuICAgICAgICB0aGlzLl9zZXRGb2N1c09uTmV4dFBvc3NpYmxlSW5wdXQocHJldmlvdXMgPyBlbGVtZW50LnByZXZpb3VzU2libGluZyA6IGVsZW1lbnQubmV4dFNpYmxpbmcsIHByZXZpb3VzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBmb2N1c0V2ZW50ID0gdGhpcy5fY3JlYXRlTmV3Rm9jdXNFdmVudChlbGVtZW50KTtcclxuICAgICAgICBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICBpbnB1dEVsZW1lbnQuZGlzcGF0Y2hFdmVudChmb2N1c0V2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|