@huntsman-cancer-institute/input 17.3.3 → 17.4.0

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.
@@ -529,7 +529,7 @@ export class CustomComboBoxComponent {
529
529
  </mat-error>
530
530
  <ng-content></ng-content>
531
531
  </mat-form-field>
532
- `, isInline: true, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:#0000008a}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i3.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "component", type: i4.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i5.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i6.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i6.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i7.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i8.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], encapsulation: i0.ViewEncapsulation.None }); }
532
+ `, isInline: true, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:var(--black-darkest)}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i3.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "component", type: i4.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i5.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i6.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i6.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i7.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i8.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], encapsulation: i0.ViewEncapsulation.None }); }
533
533
  }
534
534
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CustomComboBoxComponent, decorators: [{
535
535
  type: Component,
@@ -613,7 +613,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
613
613
  multi: true,
614
614
  }], host: {
615
615
  class: "hci-combobox-container"
616
- }, encapsulation: ViewEncapsulation.None, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:#0000008a}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"] }]
616
+ }, encapsulation: ViewEncapsulation.None, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:var(--black-darkest)}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"] }]
617
617
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Injector }], propDecorators: { maxOptionsToShow: [{
618
618
  type: Input
619
619
  }], customViewportClass: [{
@@ -676,4 +676,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
676
676
  type: ViewChild,
677
677
  args: ["input", { read: MatAutocompleteTrigger, static: false }]
678
678
  }] } });
679
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNvbWJvYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lucHV0L3NyYy9zZWxlY3QvY3VzdG9tLWNvbWJvYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZILE9BQU8sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUMsNEJBQTRCLElBQUksc0JBQXNCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7Ozs7Ozs7QUF5STdHLE1BQU0sT0FBTyx1QkFBdUI7SUFVbEMsSUFDVyxrQkFBa0IsQ0FBQyxLQUFhO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUM7SUFDL0YsQ0FBQztJQUVELElBQ1csbUJBQW1CLENBQUMsS0FBYTtRQUMxQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBVyxtQkFBbUI7UUFDNUIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBb0ZELFlBQW9CLEdBQXNCLEVBQ3RCLFFBQWtCO1FBRGxCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVU7UUE5Ry9CLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLHFCQUFnQixHQUFXLEVBQUUsQ0FBQztRQUc5QixxQkFBZ0IsR0FBVyxFQUFFLENBQUM7UUFHOUIsd0JBQW1CLEdBQVcsRUFBRSxDQUFDO1FBd0J4QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUV6QyxvREFBb0Q7UUFDcEMseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBRXRDLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDckIsY0FBUyxHQUFZLElBQUksQ0FBQztRQUUxQixxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFFeEMsMkRBQTJEO1FBQ3RCLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QyxvQkFBZSxHQUFXLFNBQVMsQ0FBQztRQUVwRCxvREFBb0Q7UUFDdEIsY0FBUyxHQUFHLElBQUksQ0FBQztRQUMvQixhQUFRLEdBQVcsQ0FBQyxDQUFDO1FBRTlCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRXRCLFlBQU8sR0FBVSxFQUFFLENBQUM7UUFDM0IsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFL0IsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQUdoQixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUVsQyxlQUFVLEdBQVcsRUFBRSxDQUFDO1FBR3hDLGtDQUFrQztRQUUzQixpQkFBWSxHQUFRLEVBQUMsUUFBUSxFQUFFLDBCQUEwQixFQUFDLENBQUM7UUFFMUQsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsd0JBQW1CLEdBQVcsRUFBRSxDQUFDO1FBQ2pDLHlCQUFvQixHQUFXLEVBQUUsQ0FBQztRQUVuQyxpQkFBWSxHQUFvQixJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDekQsaUJBQVksR0FBdUIsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvRCw4QkFBeUIsR0FBWSxLQUFLLENBQUM7UUFDM0MsU0FBSSxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3hDLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBS3JDLHlCQUFvQixHQUFjO1lBQ2hDLEtBQUssRUFBRSxDQUFDO1lBQ1IsR0FBRyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDO1NBQy9CLENBQUM7UUFJSyxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUU5QixtQkFBYyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzVELGtCQUFhLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDM0Qsa0JBQWEsR0FBd0IsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQVdqRSxlQUFVLEdBQXVCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUMxQyxnQkFBVyxHQUFlLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUVwQyxjQUFTLEdBQXNDLENBQUMsR0FBUyxFQUFFLEVBQUU7WUFDbEUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM5RSxDQUFDLENBQUE7SUFHeUMsQ0FBQztJQUUzQyxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBRSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxTQUFTLEdBQWMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQzdGLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7WUFDekMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFSixvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDdEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFdEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRUosMEVBQTBFO1FBQzFFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7UUFDcEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CO1lBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CO1NBQ2xDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQXNCLEVBQUUsRUFBRTtZQUVuRSxzRkFBc0Y7WUFDdEYsMEVBQTBFO1lBQzFFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxhQUFhLENBQUM7WUFFekMsb0RBQW9EO1lBQ3BELElBQUksR0FBRyxHQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU1RyxJQUFJLENBQUMsb0JBQW9CLEdBQUc7Z0JBQzFCLEtBQUssRUFBRSxhQUFhO2dCQUNwQixHQUFHLEVBQUUsYUFBYSxHQUFHLEdBQUc7YUFDekIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLElBQUksYUFBYSxHQUFpQixPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ2xELElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6RSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDbEIsSUFBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUMsQ0FBQztvQkFDbEMsd0hBQXdIO29CQUN4SCx5RkFBeUY7b0JBQ3pGLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQyxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksV0FBVyxHQUFpQixhQUFhLENBQUMsWUFBWSxDQUFDO1lBQzNELElBQUksV0FBVyxJQUFJLFFBQVEsSUFBSSxXQUFXLElBQUksV0FBVyxLQUFLLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDMUYsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBRTFCLG9FQUFvRTtnQkFDcEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDekcsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBRUQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLHFGQUFxRjtZQUNyRixzRUFBc0U7WUFDdEUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFRO1FBQ2pCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QyxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFFBQWE7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFFBQVEsR0FBUSxJQUFJLENBQUM7UUFDekIsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoRCxJQUFJLGlCQUFpQixHQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQzFELElBQUksUUFBUSxHQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDakUsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3pCLElBQUksVUFBVSxHQUFRLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO29CQUNqRyxJQUFJLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQzt3QkFDNUIsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3RCLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQztZQUMvQixDQUFDO1FBQ0gsQ0FBQztRQUVELDZFQUE2RTtRQUM3RSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLFFBQVEsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25FLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQztZQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyQyxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQy9HLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLFVBQW1CLEtBQUs7UUFDNUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxXQUFXLEdBQVcsRUFBRSxDQUFDO1lBQzdCLElBQUksT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDaEQsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RELENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQzdCLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekUsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDcEQsSUFBSSxVQUFVLEdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDMUYsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFTSxVQUFVO1FBQ2YsT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDOUMsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDL0IsT0FBTztRQUNULENBQUM7UUFFRCwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRW5CLElBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7UUFDOUQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFFMUUsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRU0sUUFBUTtRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4RCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVuRCx5RkFBeUY7UUFDekYsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVNLFVBQVU7UUFDZixrRkFBa0Y7UUFDbEYsbUZBQW1GO1FBQ25GLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVNLE9BQU8sQ0FBQyxLQUFpQjtRQUM5QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxLQUFpQjtRQUNqQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFvQjtRQUMvQixJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDakQsT0FBTztRQUNULENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsQ0FBQztZQUVELHFGQUFxRjtZQUNyRixrRkFBa0Y7WUFDbEYsd0JBQXdCO1lBQ3hCLEVBQUU7WUFDRixxREFBcUQ7WUFDckQsRUFBRTtZQUNGLG9GQUFvRjtZQUNwRixjQUFjO1lBQ2QsRUFBRTtZQUNGLGNBQWM7WUFDZCx3R0FBd0c7WUFDeEcsbUdBQW1HO1lBQ25HLCtHQUErRztZQUMvRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQ3pELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFFeEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsNEZBQTRGO0lBQzVGLDRFQUE0RTtJQUM1RSxjQUFjO1FBQ1osSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksV0FBVyxHQUFXLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUVoRCwwRkFBMEY7WUFDMUYsMkRBQTJEO1lBQzNELElBQUksUUFBUSxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1lBQzVELElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZSxDQUFDLEdBQVc7UUFDekIsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzFDLENBQUM7YUFBTSxJQUFJLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDdEMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQWEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkYsQ0FBQztJQUNILENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsOEJBQThCO0lBQzlCLHFCQUFxQjtRQUNuQixJQUFJLFdBQVcsR0FBVyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFaEQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoRSxDQUFDLENBQUMsQ0FBQztRQUVMLENBQUM7YUFBTSxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdkQsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoRyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQztRQUU1QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFLENBQUM7WUFFaEUsbUVBQW1FO1lBQ25FLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWpJLHVGQUF1RjtZQUN2RixJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSzttQkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFDOUUsQ0FBQztnQkFDRCxXQUFXLEdBQUcsUUFBUSxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVNLE9BQU87UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLGtCQUFrQjtZQUNsQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTSxVQUFVO1FBQ2Ysb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRU0sWUFBWSxDQUFDLEdBQVE7UUFDMUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXZELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFTSxzQkFBc0I7UUFDM0Isb0VBQW9FO1FBQ3BFLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixJQUFJLFdBQVcsR0FBVyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtZQUNqRyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsK0JBQStCO1lBQy9FLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTLENBQUMsR0FBUSxFQUFFLGNBQXVCLEtBQUs7UUFDOUMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQzNGLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxXQUFXLENBQUMsUUFBYTtRQUN2QixtREFBbUQ7UUFDbkQsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7Z0JBQ2xELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRLENBQUM7WUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFCLENBQUM7OEdBemhCVSx1QkFBdUI7a0dBQXZCLHVCQUF1QixzNkJBdER2QixDQUFDO2dCQUNWLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUM7Z0JBQ3RELEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyw4VEFzSnlCLHNCQUFzQixrREFyT3ZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBFVDs7MkZBdURVLHVCQUF1QjtrQkFuSW5DLFNBQVM7K0JBQ0UsY0FBYyxZQUNkOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBFVCxhQUNVLENBQUM7NEJBQ1YsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQUM7NEJBQ3RELEtBQUssRUFBRSxJQUFJO3lCQUNaLENBQUMsUUFDSTt3QkFDSixLQUFLLEVBQUUsd0JBQXdCO3FCQUNoQyxpQkE0Q2MsaUJBQWlCLENBQUMsSUFBSTs2R0FROUIsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQUlDLG1CQUFtQjtzQkFEekIsS0FBSztnQkFJSyxrQkFBa0I7c0JBRDVCLEtBQUs7Z0JBVUssbUJBQW1CO3NCQUQ3QixLQUFLO2dCQVlVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFHVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBRVUsT0FBTztzQkFBdEIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUVVLGdCQUFnQjtzQkFBL0IsS0FBSztnQkFHK0IsZ0JBQWdCO3NCQUFwRCxXQUFXO3VCQUFDLHNCQUFzQjtnQkFDbkIsZUFBZTtzQkFBOUIsS0FBSztnQkFHd0IsU0FBUztzQkFBdEMsV0FBVzt1QkFBQyxlQUFlO2dCQUNaLFFBQVE7c0JBQXZCLEtBQUs7Z0JBSVUsT0FBTztzQkFBdEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUtVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1csZUFBZTtzQkFBL0IsS0FBSztnQkFDVSxZQUFZO3NCQUEzQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFJQyxZQUFZO3NCQURsQixLQUFLO2dCQXlCSSxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFHUCxRQUFRO3NCQURQLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFJckMsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBSWxDLG1CQUFtQjtzQkFEbEIsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgZm9yd2FyZFJlZixcclxuICBIb3N0QmluZGluZyxcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2UsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFVudHlwZWRGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1IsIE5nQ29udHJvbH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgU3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge2RlYm91bmNlVGltZX0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7Q2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3Njcm9sbGluZ1wiO1xyXG5pbXBvcnQge01hdExlZ2FjeUF1dG9jb21wbGV0ZVRyaWdnZXIgYXMgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1hdXRvY29tcGxldGVcIjtcclxuaW1wb3J0IHtMaXN0UmFuZ2V9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcclxuaW1wb3J0IHtMaXN0S2V5TWFuYWdlciwgSGlnaGxpZ2h0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xyXG5pbXBvcnQge01hdExlZ2FjeU9wdGlvbiBhcyBNYXRPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktY29yZVwiO1xyXG5pbXBvcnQge0xlZ2FjeUZsb2F0TGFiZWxUeXBlIGFzIEZsb2F0TGFiZWxUeXBlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWZvcm0tZmllbGRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImhjaS1jb21ib2JveFwiLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJzdGFydENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cImVuZENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInRoaXMudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY3VzdG9tRmllbGRDbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbCAhPT0gdW5kZWZpbmVkXCI+e3sgbGFiZWwgfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1sYWJlbCAqbmdJZj1cImxhYmVsID09PSB1bmRlZmluZWRcIj5cclxuICAgICAgICB7eyB0ZW1wb3JhcnlQbGFjZWhvbGRlciA/IChpbm5lckNvbnRyb2wudmFsdWUgPyAnJyA6IHBsYWNlaG9sZGVyKSA6IHBsYWNlaG9sZGVyIH19XHJcbiAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgI2lucHV0XHJcbiAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgbmFtZT1cImN1c3RvbUNvbWJvQm94RmlsdGVyXCJcclxuICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ0ZW1wb3JhcnlQbGFjZWhvbGRlciA/IChpbm5lckNvbnRyb2wudmFsdWUgPyAnJyA6IHBsYWNlaG9sZGVyKSA6IHBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXHJcbiAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImlubmVyQ29udHJvbFwiXHJcbiAgICAgICAgICAgICBbYXR0ci5jZGtGb2N1c0luaXRpYWxdPVwiY2RrRm9jdXNJbml0aWFsID09PSB1bmRlZmluZWQgPyBudWxsIDogY2RrRm9jdXNJbml0aWFsXCJcclxuICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXHJcbiAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoKVwiXHJcbiAgICAgICAgICAgICA+XHJcbiAgICAgIDxkaXYgbWF0U3VmZml4XHJcbiAgICAgICAgICAgY2xhc3M9XCJoY2ktY29tYm9ib3gtYXJyb3ctd3JhcHBlclwiXHJcbiAgICAgICAgICAgKGNsaWNrKSA9IFwidG9nZ2xlT3BlbigkZXZlbnQpXCJcclxuICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0Q2xpY2soKVwiXHJcbiAgICAgICAgICAgKG1vdXNldXApPVwiZW5kQ2xpY2soKVwiXHJcbiAgICAgICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoY2ktY29tYm9ib3gtYXJyb3dcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtc3Bpbm5lciBtYXRTdWZmaXggKm5nSWY9XCJzaG93TG9hZGVyKClcIiBbZGlhbWV0ZXJdPVwiMzBcIiBzdHlsZT1cImZsb2F0OiByaWdodDsgbWFyZ2luLWxlZnQ6IDhweFwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0FjdGl2ZUZpcnN0T3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJ0aGlzLnNlbGVjdE9wdGlvbigkZXZlbnQub3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuZWQpPVwidGhpcy5vbk9wZW5lZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsb3NlZCk9XCJ0aGlzLm9uQ2xvc2VkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVdpdGhdPVwidGhpcy5kaXNwbGF5Rm5cIj5cclxuICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0ICN2aWV3cG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiaXNPcGVuID8gbnVsbCA6ICdub25lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhjaS1jb21ib2JveC12aWV3cG9ydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109IFwiY3VzdG9tVmlld3BvcnRDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwib3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwibnVtT3B0aW9uc1RvU2hvdyAqIG9wdGlvblNpemVQeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluQnVmZmVyUHhdPVwibnVtT3B0aW9uc1RvU2hvdyAqIG9wdGlvblNpemVQeCAqIDJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heEJ1ZmZlclB4XT1cIm51bU9wdGlvbnNUb1Nob3cgKiBvcHRpb25TaXplUHggKiAzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnRDbGljaygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cImVuZENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJhbGxvd05vbmUgJiYgaXNPcGVuICYmICh0aGlzLmZvcmNlU2hvd05vbmUgfHwgIXRoaXMuaW5uZXJDb250cm9sLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjdXN0b21PcHRpb25DbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwib3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgTm9uZVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0IG9mIHRoaXMubG9hZGVkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImN1c3RvbU9wdGlvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhjaS1jb21ib2JveC1zZWxlY3RlZF09XCIodmFsdWVGaWVsZCA/IG9wdFt2YWx1ZUZpZWxkXSA6IG9wdCkgPT09IG91dGVyQ29udHJvbC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWF0LXNlbGVjdGVkXT1cIih2YWx1ZUZpZWxkID8gb3B0W3ZhbHVlRmllbGRdIDogb3B0KSA9PT0gb3V0ZXJDb250cm9sLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwib3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZGlzcGxheUZpZWxkID8gb3B0W2Rpc3BsYXlGaWVsZF0gOiBvcHQgfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cclxuICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICA8bWF0LWVycm9yPlxyXG4gICAgICAgIHt7IGdldEVycm9yKCkgfX1cclxuICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgYCxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEN1c3RvbUNvbWJvQm94Q29tcG9uZW50KSxcclxuICAgIG11bHRpOiB0cnVlLFxyXG4gIH1dLFxyXG4gIGhvc3Q6IHtcclxuICAgIGNsYXNzOiBcImhjaS1jb21ib2JveC1jb250YWluZXJcIlxyXG4gIH0sXHJcbiAgc3R5bGVzOiBbYFxyXG4gICAgLmhjaS1jb21ib2JveC1jb250YWluZXIge1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC1hcnJvdyB7XHJcbiAgICAgIHdpZHRoOiAwO1xyXG4gICAgICBoZWlnaHQ6IDA7XHJcbiAgICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7XHJcbiAgICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50O1xyXG4gICAgICBib3JkZXItdG9wOiA1cHggc29saWQ7XHJcbiAgICAgIG1hcmdpbjogMCA0cHg7XHJcbiAgICAgIGNvbG9yOiByZ2JhKDAsMCwwLC41NCk7XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC1hcnJvdy13cmFwcGVyIHtcclxuICAgICAgZGlzcGxheTogdGFibGUtY2VsbDtcclxuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuICAgIH1cclxuXHJcbiAgICAuaGNpLWNvbWJvYm94LXZpZXdwb3J0IG1hdC1vcHRpb24ge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBwYWRkaW5nOiAwIC4ycmVtO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQgbWF0LW9wdGlvbiAubWF0LW9wdGlvbi10ZXh0IHtcclxuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgIH1cclxuXHJcbiAgICAuaGNpLWNvbWJvYm94LXZpZXdwb3J0IC5oY2ktY29tYm9ib3gtc2VsZWN0ZWQge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQgLm1hdC1hY3RpdmUge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIGZpeCBqaXR0ZXJ5IHNjcm9sbCBidWcgaW4gY2hyb21lICovXHJcbiAgICAuaGNpLWNvbWJvYm94LXZpZXdwb3J0IHtcclxuICAgICAgb3ZlcmZsb3ctYW5jaG9yOiBub25lO1xyXG4gICAgfVxyXG4gIGBdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21Db21ib0JveENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgcHVibGljIG9wdGlvblNpemVQeDogbnVtYmVyID0gMjU7XHJcbiAgcHVibGljIG51bU9wdGlvbnNUb1Nob3c6IG51bWJlciA9IDEwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBtYXhPcHRpb25zVG9TaG93OiBudW1iZXIgPSAxMDtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY3VzdG9tVmlld3BvcnRDbGFzczogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGN1c3RvbUZpZWxkQ2xhc3Nlcyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jdXN0b21GaWVsZENsYXNzZXMgPSB2YWx1ZSA/IHZhbHVlIDogXCJcIjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VzdG9tRmllbGRDbGFzc2VzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gISF0aGlzLl9jdXN0b21GaWVsZENsYXNzZXMgPyB0aGlzLl9jdXN0b21GaWVsZENsYXNzZXMgOiBcIm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFwiO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGN1c3RvbU9wdGlvbkNsYXNzZXModmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fY3VzdG9tT3B0aW9uQ2xhc3NlcyA9IHZhbHVlID8gdmFsdWUgOiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXN0b21PcHRpb25DbGFzc2VzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gISF0aGlzLl9jdXN0b21PcHRpb25DbGFzc2VzID8gdGhpcy5fY3VzdG9tT3B0aW9uQ2xhc3NlcyA6IFwiXCI7XHJcbiAgfVxyXG5cclxuICAvLyBJZiBhIGxhYmVsIGlzIG5vdCBzcGVjaWZpZWQgdGhlIHBsYWNlaG9sZGVyIGlzIHByb21vdGVkIHRvIGEgbGFiZWwuXHJcbiAgLy8gVG8gY3JlYXRlIGEgZm9ybSBmaWVsZCB3aXRoIG9ubHkgYSBwbGFjZWhvbGRlciwgc3BlY2lmeSBhbiBlbXB0eVxyXG4gIC8vIGxhYmVsIHRvIHByZXZlbnQgdGhlIHBsYWNlaG9sZGVyIGZyb20gYmVpbmcgcHJvbW90ZWQuXHJcbiAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAvLyBSZW1vdmVzIHRoZSBwbGFjZWhvbGRlciBhZnRlciBhIHNlbGVjdGlvbiBpcyBtYWRlXHJcbiAgQElucHV0KCkgcHVibGljIHRlbXBvcmFyeVBsYWNlaG9sZGVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyB0b29sdGlwOiBzdHJpbmcgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBhbGxvd05vbmU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0VGV4dE9uT3BlbiA9IHRydWU7XHJcblxyXG4gIC8vIHRlbGwgbWF0LWRpYWxvZyB0byBwYXNzIGluaXRpYWwgZm9jdXMgdG8gdGhlIGlubmVyIGlucHV0XHJcbiAgQEhvc3RCaW5kaW5nKFwiYXR0ci5jZGtGb2N1c0luaXRpYWxcIikgX2Nka0ZvY3VzSW5pdGlhbCA9IG51bGw7XHJcbiAgQElucHV0KCkgcHVibGljIGNka0ZvY3VzSW5pdGlhbDogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG5cclxuICAvLyBvbiB0YWIsIHNraXAgdGhlIGhvc3QgZWxlbWVudCBhbmQgZm9jdXMgdGhlIGlucHV0XHJcbiAgQEhvc3RCaW5kaW5nKFwiYXR0ci50YWJpbmRleFwiKSBfdGFiaW5kZXggPSBudWxsO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB0YWJpbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgcHVibGljIGZvcmNlU2hvd05vbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIG9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgYWxsb3dMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBsb2FkZWRPcHRpb25zOiBhbnlbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgdmFsdWVGaWVsZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHByaXZhdGUgZm9yY2VFbWl0T2JqZWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcHVibGljIGRpc3BsYXlGaWVsZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBhcHBlYXJhbmNlOiBzdHJpbmcgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmbG9hdExhYmVsOiBGbG9hdExhYmVsVHlwZTtcclxuXHJcbiAgLy8gU2V0IHRvIGVtcHR5IHRvIG5vdCBzaG93IGVycm9yc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlZmluZUVycm9yczogYW55ID0ge3JlcXVpcmVkOiBcIlRoaXMgaXMgYSByZXF1aXJlZCBmaWVsZFwifTtcclxuXHJcbiAgcHJpdmF0ZSBfc2hvd0xvYWRlciA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2N1c3RvbUZpZWxkQ2xhc3Nlczogc3RyaW5nID0gXCJcIjtcclxuICBwcml2YXRlIF9jdXN0b21PcHRpb25DbGFzc2VzOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBwdWJsaWMgb3V0ZXJDb250cm9sOiBBYnN0cmFjdENvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XHJcbiAgcHVibGljIGlubmVyQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbChudWxsKTtcclxuICBwcml2YXRlIGlnbm9yZUlubmVyQ29udHJvbENoYW5nZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHN1YnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBwcml2YXRlIG5vTmdDb250cm9sOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNlbGVjdGVkSW5kZXg6IG51bWJlcjtcclxuXHJcbiAga2V5TWFuYWdlcjogTGlzdEtleU1hbmFnZXI8SGlnaGxpZ2h0YWJsZT47XHJcbiAgdmlld3BvcnRSZW5kZXJSYW5nZTogTGlzdFJhbmdlO1xyXG4gIHZpZXdwb3J0VmlzaWJsZVJhbmdlOiBMaXN0UmFuZ2UgPSB7XHJcbiAgICBzdGFydDogMCxcclxuICAgIGVuZDogdGhpcy5udW1PcHRpb25zVG9TaG93IC0gMVxyXG4gIH07XHJcblxyXG4gIGFjdGl2ZVZhbHVlOiBhbnk7XHJcblxyXG4gIHB1YmxpYyBjbGlja0luUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIG9wdGlvblNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvcHRpb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvcHRpb25zTG9hZGVkOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZChcInZpZXdwb3J0XCIsIHtzdGF0aWM6IHRydWV9KVxyXG4gIHZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJpbnB1dFwiLCB7c3RhdGljOiB0cnVlfSlcclxuICBpbnB1dEVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJpbnB1dFwiLCB7cmVhZDogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciwgc3RhdGljOiBmYWxzZX0pXHJcbiAgYXV0b0NvbXBsZXRlVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcclxuXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZUZuOiAodmFsOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuICBwcml2YXRlIG9uVG91Y2hlZEZuOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gIHB1YmxpYyBkaXNwbGF5Rm46IChvcHQ/OiBhbnkpID0+IHN0cmluZyB8IHVuZGVmaW5lZCA9IChvcHQ/OiBhbnkpID0+IHtcclxuICAgIHJldHVybiBvcHQgPyAodGhpcy5kaXNwbGF5RmllbGQgPyBvcHRbdGhpcy5kaXNwbGF5RmllbGRdIDogb3B0KSA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2hvd0xvYWRlciA9IHRoaXMuYWxsb3dMb2FkZXIgJiYgKCEgdGhpcy5vcHRpb25zIHx8IHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDApO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IG5nQ29udHJvbDogTmdDb250cm9sID0gdGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sLCBudWxsKTtcclxuICAgIGlmIChuZ0NvbnRyb2wgJiYgbmdDb250cm9sLmNvbnRyb2wpIHtcclxuICAgICAgdGhpcy5vdXRlckNvbnRyb2wgPSBuZ0NvbnRyb2wuY29udHJvbDtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLm91dGVyQ29udHJvbC52YWxpZGF0b3IpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5vdXRlckNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubm9OZ0NvbnRyb2wgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3Vicy5hZGQodGhpcy5pbm5lckNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpLnN1YnNjcmliZSgoX3ZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHRoaXMuaXNPcGVuICYmICF0aGlzLmlnbm9yZUlubmVyQ29udHJvbENoYW5nZXMpIHtcclxuICAgICAgICB0aGlzLmZpbHRlck9wdGlvbnMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlnbm9yZUlubmVyQ29udHJvbENoYW5nZXMgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG5cclxuICAgIC8vIHdvcmsgYXJvdW5kIGZvciB2YWxpZGF0b3JzIG5vdCBhbHdheXMgcHJvcGFnYXRpbmdcclxuICAgIHRoaXMuc3Vicy5hZGQodGhpcy5vdXRlckNvbnRyb2wuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKF9ldmVudDogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLnNldFZhbGlkYXRvcnModGhpcy5vdXRlckNvbnRyb2wudmFsaWRhdG9yKTtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKHRoaXMub3V0ZXJDb250cm9sLmFzeW5jVmFsaWRhdG9yKTtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRFcnJvcnModGhpcy5vdXRlckNvbnRyb2wuZXJyb3JzKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm91dGVyQ29udHJvbC50b3VjaGVkKSB7XHJcbiAgICAgICAgdGhpcy5pbm5lckNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcblxyXG4gICAgLy8gdGhpcyBvYmplY3QgaXMgdXNlZCB0byBjb250cm9sIHRoZSBhY3RpdmUgc3RhdGUgd2hlbiBrZXlpbmcgdXAgYW5kIGRvd25cclxuICAgIHRoaXMua2V5TWFuYWdlciA9IHRoaXMuYXV0b0NvbXBsZXRlVHJpZ2dlci5hdXRvY29tcGxldGUuX2tleU1hbmFnZXI7XHJcbiAgICB0aGlzLmtleU1hbmFnZXIud2l0aFdyYXAoZmFsc2UpO1xyXG5cclxuICAgIHRoaXMuc3Vicy5hZGQoY29tYmluZUxhdGVzdChbXHJcbiAgICAgIHRoaXMudmlld3BvcnQucmVuZGVyZWRSYW5nZVN0cmVhbSxcclxuICAgICAgdGhpcy52aWV3cG9ydC5zY3JvbGxlZEluZGV4Q2hhbmdlXHJcbiAgICBdKS5zdWJzY3JpYmUoKFtyZW5kZXJlZFJhbmdlLCBzY3JvbGxlZEluZGV4XTogW0xpc3RSYW5nZSwgbnVtYmVyXSkgPT4ge1xyXG5cclxuICAgICAgLy8gSW5zdGVhZCBvZiBsb2FkaW5nIHRoZSB3aG9sZSBpdGVtIGxpc3QgYXQgb25jZSwgdGhlIHZpcnR1YWwgc2Nyb2xsIHZpZXdwb3J0IGJ1ZmZlcnNcclxuICAgICAgLy8gYSByYW5nZSBvZiBlbnRyaWVzLCBvbmx5IGEgcG9ydGlvbiBvZiB3aGljaCBhcmUgd2l0aGluIHRoZSB2aXNpYmxlIGZvbGRcclxuICAgICAgdGhpcy52aWV3cG9ydFJlbmRlclJhbmdlID0gcmVuZGVyZWRSYW5nZTtcclxuXHJcbiAgICAgIC8vIHdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUgdmlzaWJsZSByYW5nZSBvdXJzZWx2ZXNcclxuICAgICAgbGV0IGxlbjogbnVtYmVyID0gTWF0aC5taW4odGhpcy5sb2FkZWRPcHRpb25zLmxlbmd0aCArICh0aGlzLmFsbG93Tm9uZSA/IDEgOiAwKSwgdGhpcy5udW1PcHRpb25zVG9TaG93IC0gMSk7XHJcblxyXG4gICAgICB0aGlzLnZpZXdwb3J0VmlzaWJsZVJhbmdlID0ge1xyXG4gICAgICAgIHN0YXJ0OiBzY3JvbGxlZEluZGV4LFxyXG4gICAgICAgIGVuZDogc2Nyb2xsZWRJbmRleCArIGxlblxyXG4gICAgICB9O1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMub3B0aW9ucykge1xyXG4gICAgICBsZXQgb3B0aW9uc0NoYW5nZTogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy5vcHRpb25zO1xyXG4gICAgICBpZiAoIW9wdGlvbnNDaGFuZ2UuY3VycmVudFZhbHVlIHx8IG9wdGlvbnNDaGFuZ2UuY3VycmVudFZhbHVlLmxlbmd0aCA8IDEpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBbXTtcclxuICAgICAgICBpZih0aGlzLmlubmVyQ29udHJvbC52YWx1ZSAhPSBudWxsKXtcclxuICAgICAgICAgIC8vUmVzZXQgdGhlIGlubmVyQ29udHJvbCB2YWx1ZSBvZiB0aGUgZHJvcGRvd24gbGlzdCB0byBhbiBlbXB0eSBhcnJheSBpbiBjYXNlIG9mIG5vIHJlc3VsdHMgYXJlIHByZXNlbnQgdG8gYmUgZGlzcGxheWVkLlxyXG4gICAgICAgICAgLy9UaGlzIGZsdXNoZXMgb3V0IHRoZSBzdGFsZSB2YWx1ZSBmcm9tIHRoZSBsaXN0IGlmIHRoZXJlIGFyZSBubyByZXN1bHRzIHRvIGJlIGRpc3BsYXllZC5cclxuICAgICAgICAgIHRoaXMuaW5uZXJDb250cm9sLnNldFZhbHVlKFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjdXJyZW50T3B0czogYW55W10gPSA8YW55W10+b3B0aW9uc0NoYW5nZS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIGlmIChjdXJyZW50T3B0cyAmJiBcImxlbmd0aFwiIGluIGN1cnJlbnRPcHRzICYmIGN1cnJlbnRPcHRzICE9PSBvcHRpb25zQ2hhbmdlLnByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9zaG93TG9hZGVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zTG9hZGVkLmVtaXQoKTtcclxuXHJcbiAgICAgICAgLy8gSWYgbnVtYmVyIG9mIG9wdGlvbnMgaXMgbGVzcyB0aGFuIG91ciBtYXgsIHJlZHVjZSBzaXplIG9mIG92ZXJsYXlcclxuICAgICAgICB0aGlzLm51bU9wdGlvbnNUb1Nob3cgPSBNYXRoLm1pbihjdXJyZW50T3B0cy5sZW5ndGggKyAodGhpcy5hbGxvd05vbmUgPyAxIDogMCksIHRoaXMubWF4T3B0aW9uc1RvU2hvdyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc2hvd0xvYWRlciA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8gVGhlIGF1dG9jb21wbGV0ZSB3aWxsIGF1dG9tYXRpY2FsbHkgcG9wIG9wZW4gb25jZSBpdCBoYXMgb3B0aW9ucyBmaWx0ZXJlZCBpbnRvIGl0LFxyXG4gICAgICAvLyBidXQgd2UgZG9uJ3Qgd2FudCBpdCB0byBvbiBpbml0aWFsIHBhZ2UgbG9hZCBvciB3aGVuIHRhYmJpbmcgdGhvdWdoXHJcbiAgICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyT3B0aW9ucygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubG9hZE9ubHlDdXJyZW50VmFsdWUodGhpcy5vdXRlckNvbnRyb2wudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZE9ubHlDdXJyZW50VmFsdWUob2JqKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZUZuID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZEZuID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChpc0Rpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLmRpc2FibGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLmVuYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RXJyb3IoKTogc3RyaW5nIHtcclxuICAgIGZvciAoY29uc3QgZXJyb3IgaW4gdGhpcy5vdXRlckNvbnRyb2wuZXJyb3JzKSB7XHJcbiAgICAgIGlmICh0aGlzLmRlZmluZUVycm9ycyAmJiBlcnJvciBpbiB0aGlzLmRlZmluZUVycm9ycykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmluZUVycm9yc1tlcnJvcl07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZE9ubHlDdXJyZW50VmFsdWUoY250cmxWYWw6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMgfHwgdGhpcy5vcHRpb25zLmxlbmd0aCA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBuZXdWYWx1ZTogYW55ID0gbnVsbDtcclxuICAgIGlmIChjbnRybFZhbCAhPT0gbnVsbCAmJiBjbnRybFZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCBjdXJyZW50bHlTZWxlY3RlZDogYW55ID0gdGhpcy5vcHRpb25zLmZpbmQoKG9wdDogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IG9wdFZhbHVlOiBhbnkgPSB0aGlzLnZhbHVlRmllbGQgPyBvcHRbdGhpcy52YWx1ZUZpZWxkXSA6IG9wdDtcclxuICAgICAgICBpZiAodGhpcy5mb3JjZUVtaXRPYmplY3QpIHtcclxuICAgICAgICAgIGxldCBvdXRlclZhbHVlOiBhbnkgPSBjbnRybFZhbCA/ICh0aGlzLnZhbHVlRmllbGQgPyBjbnRybFZhbFt0aGlzLnZhbHVlRmllbGRdIDogY250cmxWYWwpIDogbnVsbDtcclxuICAgICAgICAgIGlmIChvcHRWYWx1ZSA9PT0gb3V0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG9wdFZhbHVlID09PSBjbnRybFZhbDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoY3VycmVudGx5U2VsZWN0ZWQpIHtcclxuICAgICAgICBuZXdWYWx1ZSA9IGN1cnJlbnRseVNlbGVjdGVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJlZmVyIHRvIGNoZWNrIGlkIGlmIGl0IGhhcyBvbmUgIHZzIHN0cmFpZ2h0IGFnYWluc3QgaXQncyBvYmplY3QgaWRlbnRpdHlcclxuICAgIGlmICh0aGlzLmlubmVyQ29udHJvbC52YWx1ZSAmJiBuZXdWYWx1ZSAhPSBudWxsICYmIHRoaXMudmFsdWVGaWVsZCkge1xyXG4gICAgICBpZiAodGhpcy5pbm5lckNvbnRyb2wudmFsdWVbdGhpcy52YWx1ZUZpZWxkXSAhPT0gbmV3VmFsdWVbdGhpcy52YWx1ZUZpZWxkXSkge1xyXG4gICAgICAgIHRoaXMuaWdub3JlSW5uZXJDb250cm9sQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsdWUobmV3VmFsdWUpO1xyXG4gICAgICAgIHRoaXMub3B0aW9uU2VsZWN0ZWQuZW1pdChuZXdWYWx1ZVt0aGlzLnZhbHVlRmllbGRdKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmlubmVyQ29udHJvbC52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcclxuICAgICAgdGhpcy5pZ25vcmVJbm5lckNvbnRyb2xDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsdWUobmV3VmFsdWUpO1xyXG4gICAgICBsZXQgbnYgPSBuZXdWYWx1ZSA/ICgodGhpcy52YWx1ZUZpZWxkICYmICF0aGlzLmZvcmNlRW1pdE9iamVjdCkgPyBuZXdWYWx1ZVt0aGlzLnZhbHVlRmllbGRdIDogbmV3VmFsdWUpIDogbnVsbDtcclxuICAgICAgdGhpcy5vcHRpb25TZWxlY3RlZC5lbWl0KG52KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyT3B0aW9ucyhzaG93QWxsOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9yY2VTaG93Tm9uZSA9IHNob3dBbGw7XHJcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMubGVuZ3RoIDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNob3dBbGwgfHwgIXRoaXMuaW5uZXJDb250cm9sLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMubG9hZGVkT3B0aW9ucyA9IFsuLi50aGlzLm9wdGlvbnNdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHNlYXJjaFZhbHVlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuaW5uZXJDb250cm9sLnZhbHVlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgc2VhcmNoVmFsdWUgPSB0aGlzLmlubmVyQ29udHJvbC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGlzcGxheUZpZWxkKSB7XHJcbiAgICAgICAgc2VhcmNoVmFsdWUgPSB0aGlzLmlubmVyQ29udHJvbC52YWx1ZVt0aGlzLmRpc3BsYXlGaWVsZF0udG9Mb3dlckNhc2UoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxvYWRlZE9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBvcHREaXNwbGF5OiBzdHJpbmcgPSAodGhpcy5kaXNwbGF5RmllbGQgPyBvcHRbdGhpcy5kaXNwbGF5RmllbGRdIDogb3B0KS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHJldHVybiBvcHREaXNwbGF5LmluY2x1ZGVzKHNlYXJjaFZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZm9yY2VTaG93Tm9uZSA9IHRoaXMubG9hZGVkT3B0aW9ucy5sZW5ndGggPT09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy5nZXRPcHRJbmRleCh0aGlzLm91dGVyQ29udHJvbC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd0xvYWRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFsbG93TG9hZGVyICYmIHRoaXMuX3Nob3dMb2FkZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3BlbigpIHtcclxuICAgIGlmICh0aGlzLmlubmVyQ29udHJvbC5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhlIGF1dG9jb21wbGV0ZSB3aWxsIG9ubHkgb3BlbiB3aGVuIG9wdGlvbnMgYXJlIGxvYWRlZFxyXG4gICAgdGhpcy5maWx0ZXJPcHRpb25zKHRydWUpO1xyXG4gICAgdGhpcy5hdXRvQ29tcGxldGVUcmlnZ2VyLm9wZW5QYW5lbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlKCkge1xyXG4gICAgdGhpcy5hdXRvQ29tcGxldGVUcmlnZ2VyLmNsb3NlUGFuZWwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk9wZW5lZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9yY2VTaG93Tm9uZSA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xyXG5cclxuICAgIGlmKHRoaXMuc2VsZWN0VGV4dE9uT3Blbil7XHJcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7IC8vIEhpZ2hsaWdodHMgdGV4dFxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPiAwKSB7XHJcbiAgICAgIC8vIG1ha2UgdGhlIHNlbGVjdGVkIG9wdGlvbiBhbHNvIHRoZSBhY3RpdmUgb3B0aW9uXHJcbiAgICAgIHRoaXMuYWN0aXZlVmFsdWUgPSB0aGlzLmdldE9wdFZhbCh0aGlzLmxvYWRlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XSk7XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWRPcHRpb24oKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbG9zZWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghdGhpcy5pbm5lckNvbnRyb2wudmFsdWUgJiYgdGhpcy5vdXRlckNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RPcHRpb24obnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2FkT25seUN1cnJlbnRWYWx1ZSh0aGlzLm91dGVyQ29udHJvbC52YWx1ZSk7XHJcblxyXG4gICAgLy8gcmVzZXQgdGhlIG9wdGlvbnMgc28gdGhlIGF1dG9jb21wbGV0ZSB3b24ndCBhdXRvbWF0aWNhbGx5IG9wZW4gb24gdGhlIG5leHQgdGFiIHRocm91Z2hcclxuICAgIHRoaXMubG9hZGVkT3B0aW9ucyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0Q2xpY2soKSB7XHJcbiAgICAvLyBjbGlja2luZyBvbiBjZXJ0YWluIHBhcnRzIG9mIHRoZSBtYXQtZmllbGQgd2lsbCBcImZsaWNrZXJcIiB0aGUgZm9jdXMsIHRyaWdnZXJpbmdcclxuICAgIC8vIGVycm9yIHZhbGlkYXRpb24gZWFybHkuIFRoaXMgdHJhY2tzIHRob3NlIGludGVybmFsIGNsaWNrcyBzbyB0aGV5IGNhbiBiZSBpZ25vcmVkXHJcbiAgICB0aGlzLmNsaWNrSW5Qcm9ncmVzcyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW5kQ2xpY2soKSB7XHJcbiAgICB0aGlzLmNsaWNrSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKCF0aGlzLmlzT3Blbikge1xyXG4gICAgICB0aGlzLm9wZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVPcGVuKGV2ZW50OiBNb3VzZUV2ZW50KTp2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJUYWJcIiB8fCBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRoZXJlIGlzIGEgYnVnIHdoZXJlIHRoZSBjZGsgYTExeSBLZXlNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGlzIG5vdCBjb21wYXRpYmxlIHdpdGhcclxuICAgICAgLy8gdGhlIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIsIHdoaWNoIGNhdXNlcyB0aGUgRHJvcC1kb3duIG5vdCBzY3JvbGwgd2l0aCBrZXlib2FyZFxyXG4gICAgICAvLyBvbiBsb25nIG9wdGlvbiBsaXN0cy5cclxuICAgICAgLy9cclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTY1OThcclxuICAgICAgLy9cclxuICAgICAgLy8gVGhpcyB3b3JrIGFyb3VuZCB0YWtlcyBjb250cm9sIG9mIHRoZSBrZXlib2FyZCBhbmQgbWFudWFsbHkgc2Nyb2xscyBhbmQgYWN0aXZhdGVzXHJcbiAgICAgIC8vIHRoZSBvcHRpb25zXHJcbiAgICAgIC8vXHJcbiAgICAgIC8vIFJlZmVyZW5jZXM6XHJcbiAgICAgIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21hc3Rlci9zcmMvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS10cmlnZ2VyLnRzXHJcbiAgICAgIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21hc3Rlci9zcmMvY2RrL2ExMXkva2V5LW1hbmFnZXIvbGlzdC1rZXktbWFuYWdlci50c1xyXG4gICAgICAvLyAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvYmxvYi9tYXN0ZXIvc3JjL2Nkay9hMTF5L2tleS1tYW5hZ2VyL2FjdGl2ZWRlc2NlbmRhbnQta2V5LW1hbmFnZXIudHNcclxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd1VwXCIgfHwgZXZlbnQua2V5ID09PSBcIkFycm93RG93blwiKSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdEFjdGl2ZUl0ZW0oKTtcclxuICAgICAgICB0aGlzLnNoaWZ0QWN0aXZlSXRlbShldmVudC5rZXkpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tBY3RpdmVCb3VuZGFyaWVzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGJlZm9yZSBvdXIga2V5cHJlc3MgYmluZGluZyBldmVuIHRyaWdnZXJzLCBhbmd1bGFyIGhhcyBhbHJlYWR5IG1vdmVkIHRoZSBhY3RpdmUgc2VsZWN0aW9uXHJcbiAgLy8gdW5zeW5jaW5nIGl0IHdpdGggb3VyIGRpc3BsYXkuIHRoaXMgY29kZSByZS1pbml0aWFsaXplcyB0aGUgYWN0aXZlIG9wdGlvblxyXG4gIGluaXRBY3RpdmVJdGVtKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlVmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmFjdGl2ZVZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBhY3RpdmVJbmRleDogbnVtYmVyID0gdGhpcy5nZXRBY3RpdmVJbmRleCgpO1xyXG5cclxuICAgICAgLy8gdGhpcyBkb2VzIHRoZSBjb252ZXJzaW9uIGZyb20gYW4gaW5kZXggd2l0aGluIGFsbCBvcHRpb25zIGRvd24gdG8gYSBwb3NpdGlvbiB3aXRoaW4gdGhlXHJcbiAgICAgIC8vIGRpc3BsYXllZCByYW5nZSwgd2hpY2ggaXMgYWxsIHRoZSBrZXltYW5hZ2VyIGlzIGF3YXJlIG9mXHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IGFjdGl2ZUluZGV4IC0gdGhpcy52aWV3cG9ydFJlbmRlclJhbmdlLnN0YXJ0O1xyXG4gICAgICB0aGlzLmtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShwb3NpdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaGlmdEFjdGl2ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChrZXkgPT09IFwiQXJyb3dVcFwiKSB7XHJcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTtcclxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIkFycm93RG93blwiKSB7XHJcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXROZXh0SXRlbUFjdGl2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmtleU1hbmFnZXIuYWN0aXZlSXRlbSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVZhbHVlID0gdGhpcy5nZXRPcHRWYWwoKDxNYXRPcHRpb24+dGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pLnZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGNoZWNrIGlmIHRoZSBhY3RpdmUgb3B0aW9uIGluZGV4IGlzIHdpdGhpbiB0aGUgZGlzcGxheWVkIHZpZXdwb3J0IHdpbmRvd1xyXG4gIC8vIGlmIG5vdCwgc2Nyb2xsIGl0IGludG8gdmlld1xyXG4gIGNoZWNrQWN0aXZlQm91bmRhcmllcygpOiB2b2lkIHtcclxuICAgIGxldCBhY3RpdmVJbmRleDogbnVtYmVyID0gdGhpcy5nZXRBY3RpdmVJbmRleCgpO1xyXG5cclxuICAgIGlmIChhY3RpdmVJbmRleCA8IHRoaXMudmlld3BvcnRWaXNpYmxlUmFuZ2Uuc3RhcnQpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy52aWV3cG9ydC5zY3JvbGxUb09mZnNldChhY3RpdmVJbmRleCAqIHRoaXMub3B0aW9uU2l6ZVB4KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChhY3RpdmVJbmRleCA+IHRoaXMudmlld3BvcnRWaXNpYmxlUmFuZ2UuZW5kKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudmlld3BvcnQuc2Nyb2xsVG9PZmZzZXQoKGFjdGl2ZUluZGV4IC0gKHRoaXMubnVtT3B0aW9uc1RvU2hvdyAtIDEpKSAqIHRoaXMub3B0aW9uU2l6ZVB4KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRBY3RpdmVJbmRleCgpIHtcclxuICAgIGxldCBhY3RpdmVJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAodGhpcy5hY3RpdmVWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYWN0aXZlVmFsdWUgIT09IG51bGwpIHtcclxuXHJcbiAgICAgIC8vIGlmIHdlIGFkZGVkIGEgbm9uZSBvcHRpb24gdGhlIHJldHVybmVkIGluZGV4IHdvdWxkIGJlIG9mZiBieSBvbmVcclxuICAgICAgbGV0IHZhbEluZGV4ID0gdGhpcy5nZXRPcHRJbmRleCh0aGlzLmFjdGl2ZVZhbHVlKSArICh0aGlzLmFsbG93Tm9uZSAmJiAodGhpcy5mb3JjZVNob3dOb25lIHx8ICF0aGlzLmlubmVyQ29udHJvbC52YWx1ZSkgPyAxIDogMCk7XHJcblxyXG4gICAgICAvLyB0aGUgaW5kZXggc2hvdWxkIGJlIHdpdGhpbiB0aGUgcmFuZ2Ugb2Ygb3VyIGVudGlyZSBidWZmZXIsIG9yIGp1c3QgYWxsb3cgaXQgdG8gcmVzZXRcclxuICAgICAgaWYgKHZhbEluZGV4ID49IHRoaXMudmlld3BvcnRSZW5kZXJSYW5nZS5zdGFydFxyXG4gICAgICAgICYmICghdGhpcy52aWV3cG9ydFJlbmRlclJhbmdlLmVuZCB8fCB2YWxJbmRleCA8PSB0aGlzLnZpZXdwb3J0UmVuZGVyUmFuZ2UuZW5kKVxyXG4gICAgICApIHtcclxuICAgICAgICBhY3RpdmVJbmRleCA9IHZhbEluZGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFjdGl2ZUluZGV4O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRm9jdXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIC8vIEhpZ2hsaWdodHMgdGV4dFxyXG4gICAgICBpZiAodGhpcy5zZWxlY3RUZXh0T25PcGVuKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZWxlY3QoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRm9jdXNPdXQoKSB7XHJcbiAgICAvLyBtYXJrIGNvbnRyb2wgdG91Y2hlZCBhbmQgdHJpZ2dlciBlcnJvciB2YWxpZGF0aW9uXHJcbiAgICBpZiAoIXRoaXMuY2xpY2tJblByb2dyZXNzKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgdGhpcy5vblRvdWNoZWRGbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdE9wdGlvbihvcHQ6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IG5ld1ZhbCA9IHRoaXMuZ2V0T3B0VmFsKG9wdCwgdGhpcy5mb3JjZUVtaXRPYmplY3QpO1xyXG5cclxuICAgIGlmICh0aGlzLm5vTmdDb250cm9sKSB7XHJcbiAgICAgIHRoaXMub3V0ZXJDb250cm9sLnNldFZhbHVlKG5ld1ZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vbkNoYW5nZUZuKG5ld1ZhbCk7XHJcbiAgICB0aGlzLm9wdGlvblNlbGVjdGVkLmVtaXQobmV3VmFsKTtcclxuICAgIHRoaXMub3B0aW9uQ2hhbmdlZC5lbWl0KG5ld1ZhbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9TZWxlY3RlZE9wdGlvbigpOiB2b2lkIHtcclxuICAgIC8vIHNjcm9sbCB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbiB3aGVuIHdlIG9wZW4gdGhlIGRyb3Bkb3duXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEluZGV4ID4gMCkge1xyXG4gICAgICBsZXQgb2Zmc2V0SW5kZXg6IG51bWJlciA9IHRoaXMuc2VsZWN0ZWRJbmRleCArICh0aGlzLmFsbG93Tm9uZSA/IDEgOiAwKTsgLy8gYWRqdXN0IGZvciBOb25lIGVudHJ5XHJcbiAgICAgIG9mZnNldEluZGV4IC09ICh0aGlzLm51bU9wdGlvbnNUb1Nob3cgLyAyKSAtIDE7IC8vIGNhbGN1bGF0ZSBtaWRkbGUgb2Ygdmlld3BvcnRcclxuICAgICAgdGhpcy52aWV3cG9ydC5zY3JvbGxUb09mZnNldChvZmZzZXRJbmRleCAqIHRoaXMub3B0aW9uU2l6ZVB4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE9wdFZhbChvcHQ6IGFueSwgZm9yY2VPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XHJcbiAgICBpZiAodGhpcy52YWx1ZUZpZWxkICYmICFmb3JjZU9iamVjdCkge1xyXG4gICAgICBpZiAob3B0ICE9PSBudWxsICYmIG9wdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHQgPT09IFwib2JqZWN0XCIgJiYgdGhpcy52YWx1ZUZpZWxkIGluIG9wdCkge1xyXG4gICAgICAgIHJldHVybiBvcHRbdGhpcy52YWx1ZUZpZWxkXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3B0O1xyXG4gIH1cclxuXHJcbiAgZ2V0T3B0SW5kZXgob3B0VmFsdWU6IGFueSk6IG51bWJlciB7XHJcbiAgICAvLyBmaW5kIHRoZSBpbmRleCBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb25cclxuICAgIGlmIChvcHRWYWx1ZSAhPT0gbnVsbCAmJiBvcHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWRlZE9wdGlvbnMuZmluZEluZGV4KChvcHRpb246IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldE9wdFZhbChvcHRpb24pID09PSBvcHRWYWx1ZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnMudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuIl19
679
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNvbWJvYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lucHV0L3NyYy9zZWxlY3QvY3VzdG9tLWNvbWJvYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZILE9BQU8sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUMsNEJBQTRCLElBQUksc0JBQXNCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7Ozs7Ozs7QUF5STdHLE1BQU0sT0FBTyx1QkFBdUI7SUFVbEMsSUFDVyxrQkFBa0IsQ0FBQyxLQUFhO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUM7SUFDL0YsQ0FBQztJQUVELElBQ1csbUJBQW1CLENBQUMsS0FBYTtRQUMxQyxJQUFJLENBQUMs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QUFJLEVBQUM7Z0JBSWxDLG1CQUFtQjtzQkFEbEIsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgZm9yd2FyZFJlZixcclxuICBIb3N0QmluZGluZyxcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2UsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFVudHlwZWRGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1IsIE5nQ29udHJvbH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgU3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge2RlYm91bmNlVGltZX0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7Q2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3Njcm9sbGluZ1wiO1xyXG5pbXBvcnQge01hdExlZ2FjeUF1dG9jb21wbGV0ZVRyaWdnZXIgYXMgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1hdXRvY29tcGxldGVcIjtcclxuaW1wb3J0IHtMaXN0UmFuZ2V9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcclxuaW1wb3J0IHtMaXN0S2V5TWFuYWdlciwgSGlnaGxpZ2h0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xyXG5pbXBvcnQge01hdExlZ2FjeU9wdGlvbiBhcyBNYXRPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktY29yZVwiO1xyXG5pbXBvcnQge0xlZ2FjeUZsb2F0TGFiZWxUeXBlIGFzIEZsb2F0TGFiZWxUeXBlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWZvcm0tZmllbGRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImhjaS1jb21ib2JveFwiLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJzdGFydENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cImVuZENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInRoaXMudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY3VzdG9tRmllbGRDbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbCAhPT0gdW5kZWZpbmVkXCI+e3sgbGFiZWwgfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1sYWJlbCAqbmdJZj1cImxhYmVsID09PSB1bmRlZmluZWRcIj5cclxuICAgICAgICB7eyB0ZW1wb3JhcnlQbGFjZWhvbGRlciA/IChpbm5lckNvbnRyb2wudmFsdWUgPyAnJyA6IHBsYWNlaG9sZGVyKSA6IHBsYWNlaG9sZGVyIH19XHJcbiAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgI2lucHV0XHJcbiAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgbmFtZT1cImN1c3RvbUNvbWJvQm94RmlsdGVyXCJcclxuICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ0ZW1wb3JhcnlQbGFjZWhvbGRlciA/IChpbm5lckNvbnRyb2wudmFsdWUgPyAnJyA6IHBsYWNlaG9sZGVyKSA6IHBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXHJcbiAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImlubmVyQ29udHJvbFwiXHJcbiAgICAgICAgICAgICBbYXR0ci5jZGtGb2N1c0luaXRpYWxdPVwiY2RrRm9jdXNJbml0aWFsID09PSB1bmRlZmluZWQgPyBudWxsIDogY2RrRm9jdXNJbml0aWFsXCJcclxuICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXHJcbiAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoKVwiXHJcbiAgICAgICAgICAgICA+XHJcbiAgICAgIDxkaXYgbWF0U3VmZml4XHJcbiAgICAgICAgICAgY2xhc3M9XCJoY2ktY29tYm9ib3gtYXJyb3ctd3JhcHBlclwiXHJcbiAgICAgICAgICAgKGNsaWNrKSA9IFwidG9nZ2xlT3BlbigkZXZlbnQpXCJcclxuICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0Q2xpY2soKVwiXHJcbiAgICAgICAgICAgKG1vdXNldXApPVwiZW5kQ2xpY2soKVwiXHJcbiAgICAgICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoY2ktY29tYm9ib3gtYXJyb3dcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtc3Bpbm5lciBtYXRTdWZmaXggKm5nSWY9XCJzaG93TG9hZGVyKClcIiBbZGlhbWV0ZXJdPVwiMzBcIiBzdHlsZT1cImZsb2F0OiByaWdodDsgbWFyZ2luLWxlZnQ6IDhweFwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0FjdGl2ZUZpcnN0T3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJ0aGlzLnNlbGVjdE9wdGlvbigkZXZlbnQub3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuZWQpPVwidGhpcy5vbk9wZW5lZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsb3NlZCk9XCJ0aGlzLm9uQ2xvc2VkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVdpdGhdPVwidGhpcy5kaXNwbGF5Rm5cIj5cclxuICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0ICN2aWV3cG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiaXNPcGVuID8gbnVsbCA6ICdub25lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhjaS1jb21ib2JveC12aWV3cG9ydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109IFwiY3VzdG9tVmlld3BvcnRDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwib3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwibnVtT3B0aW9uc1RvU2hvdyAqIG9wdGlvblNpemVQeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluQnVmZmVyUHhdPVwibnVtT3B0aW9uc1RvU2hvdyAqIG9wdGlvblNpemVQeCAqIDJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heEJ1ZmZlclB4XT1cIm51bU9wdGlvbnNUb1Nob3cgKiBvcHRpb25TaXplUHggKiAzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnRDbGljaygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cImVuZENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJhbGxvd05vbmUgJiYgaXNPcGVuICYmICh0aGlzLmZvcmNlU2hvd05vbmUgfHwgIXRoaXMuaW5uZXJDb250cm9sLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjdXN0b21PcHRpb25DbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwib3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgTm9uZVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0IG9mIHRoaXMubG9hZGVkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImN1c3RvbU9wdGlvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhjaS1jb21ib2JveC1zZWxlY3RlZF09XCIodmFsdWVGaWVsZCA/IG9wdFt2YWx1ZUZpZWxkXSA6IG9wdCkgPT09IG91dGVyQ29udHJvbC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWF0LXNlbGVjdGVkXT1cIih2YWx1ZUZpZWxkID8gb3B0W3ZhbHVlRmllbGRdIDogb3B0KSA9PT0gb3V0ZXJDb250cm9sLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwib3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZGlzcGxheUZpZWxkID8gb3B0W2Rpc3BsYXlGaWVsZF0gOiBvcHQgfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cclxuICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICA8bWF0LWVycm9yPlxyXG4gICAgICAgIHt7IGdldEVycm9yKCkgfX1cclxuICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgYCxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEN1c3RvbUNvbWJvQm94Q29tcG9uZW50KSxcclxuICAgIG11bHRpOiB0cnVlLFxyXG4gIH1dLFxyXG4gIGhvc3Q6IHtcclxuICAgIGNsYXNzOiBcImhjaS1jb21ib2JveC1jb250YWluZXJcIlxyXG4gIH0sXHJcbiAgc3R5bGVzOiBbYFxyXG4gICAgLmhjaS1jb21ib2JveC1jb250YWluZXIge1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC1hcnJvdyB7XHJcbiAgICAgIHdpZHRoOiAwO1xyXG4gICAgICBoZWlnaHQ6IDA7XHJcbiAgICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7XHJcbiAgICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50O1xyXG4gICAgICBib3JkZXItdG9wOiA1cHggc29saWQ7XHJcbiAgICAgIG1hcmdpbjogMCA0cHg7XHJcbiAgICAgIGNvbG9yOiB2YXIoLS1ibGFjay1kYXJrZXN0KTtcclxuICAgIH1cclxuXHJcbiAgICAuaGNpLWNvbWJvYm94LWFycm93LXdyYXBwZXIge1xyXG4gICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xyXG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQgbWF0LW9wdGlvbiB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIHBhZGRpbmc6IDAgLjJyZW07XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC12aWV3cG9ydCBtYXQtb3B0aW9uIC5tYXQtb3B0aW9uLXRleHQge1xyXG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQgLmhjaS1jb21ib2JveC1zZWxlY3RlZCB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGRkZGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC12aWV3cG9ydCAubWF0LWFjdGl2ZSB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2YzZjM7XHJcbiAgICB9XHJcblxyXG4gICAgLyogZml4IGppdHRlcnkgc2Nyb2xsIGJ1ZyBpbiBjaHJvbWUgKi9cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQge1xyXG4gICAgICBvdmVyZmxvdy1hbmNob3I6IG5vbmU7XHJcbiAgICB9XHJcbiAgYF0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEN1c3RvbUNvbWJvQm94Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBwdWJsaWMgb3B0aW9uU2l6ZVB4OiBudW1iZXIgPSAyNTtcclxuICBwdWJsaWMgbnVtT3B0aW9uc1RvU2hvdzogbnVtYmVyID0gMTA7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIG1heE9wdGlvbnNUb1Nob3c6IG51bWJlciA9IDEwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjdXN0b21WaWV3cG9ydENsYXNzOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgY3VzdG9tRmllbGRDbGFzc2VzKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2N1c3RvbUZpZWxkQ2xhc3NlcyA9IHZhbHVlID8gdmFsdWUgOiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXN0b21GaWVsZENsYXNzZXMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAhIXRoaXMuX2N1c3RvbUZpZWxkQ2xhc3NlcyA/IHRoaXMuX2N1c3RvbUZpZWxkQ2xhc3NlcyA6IFwibWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0XCI7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgY3VzdG9tT3B0aW9uQ2xhc3Nlcyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jdXN0b21PcHRpb25DbGFzc2VzID0gdmFsdWUgPyB2YWx1ZSA6IFwiXCI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1c3RvbU9wdGlvbkNsYXNzZXMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAhIXRoaXMuX2N1c3RvbU9wdGlvbkNsYXNzZXMgPyB0aGlzLl9jdXN0b21PcHRpb25DbGFzc2VzIDogXCJcIjtcclxuICB9XHJcblxyXG4gIC8vIElmIGEgbGFiZWwgaXMgbm90IHNwZWNpZmllZCB0aGUgcGxhY2Vob2xkZXIgaXMgcHJvbW90ZWQgdG8gYSBsYWJlbC5cclxuICAvLyBUbyBjcmVhdGUgYSBmb3JtIGZpZWxkIHdpdGggb25seSBhIHBsYWNlaG9sZGVyLCBzcGVjaWZ5IGFuIGVtcHR5XHJcbiAgLy8gbGFiZWwgdG8gcHJldmVudCB0aGUgcGxhY2Vob2xkZXIgZnJvbSBiZWluZyBwcm9tb3RlZC5cclxuICBASW5wdXQoKSBwdWJsaWMgbGFiZWw6IHN0cmluZztcclxuICBASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIC8vIFJlbW92ZXMgdGhlIHBsYWNlaG9sZGVyIGFmdGVyIGEgc2VsZWN0aW9uIGlzIG1hZGVcclxuICBASW5wdXQoKSBwdWJsaWMgdGVtcG9yYXJ5UGxhY2Vob2xkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIHRvb2x0aXA6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgcHVibGljIGFsbG93Tm9uZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RUZXh0T25PcGVuID0gdHJ1ZTtcclxuXHJcbiAgLy8gdGVsbCBtYXQtZGlhbG9nIHRvIHBhc3MgaW5pdGlhbCBmb2N1cyB0byB0aGUgaW5uZXIgaW5wdXRcclxuICBASG9zdEJpbmRpbmcoXCJhdHRyLmNka0ZvY3VzSW5pdGlhbFwiKSBfY2RrRm9jdXNJbml0aWFsID0gbnVsbDtcclxuICBASW5wdXQoKSBwdWJsaWMgY2RrRm9jdXNJbml0aWFsOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIG9uIHRhYiwgc2tpcCB0aGUgaG9zdCBlbGVtZW50IGFuZCBmb2N1cyB0aGUgaW5wdXRcclxuICBASG9zdEJpbmRpbmcoXCJhdHRyLnRhYmluZGV4XCIpIF90YWJpbmRleCA9IG51bGw7XHJcbiAgQElucHV0KCkgcHVibGljIHRhYmluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICBwdWJsaWMgZm9yY2VTaG93Tm9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogYW55W10gPSBbXTtcclxuICBASW5wdXQoKSBhbGxvd0xvYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxvYWRlZE9wdGlvbnM6IGFueVtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyB2YWx1ZUZpZWxkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHJpdmF0ZSBmb3JjZUVtaXRPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBwdWJsaWMgZGlzcGxheUZpZWxkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIGFwcGVhcmFuY2U6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgcHVibGljIGZsb2F0TGFiZWw6IEZsb2F0TGFiZWxUeXBlO1xyXG5cclxuICAvLyBTZXQgdG8gZW1wdHkgdG8gbm90IHNob3cgZXJyb3JzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVmaW5lRXJyb3JzOiBhbnkgPSB7cmVxdWlyZWQ6IFwiVGhpcyBpcyBhIHJlcXVpcmVkIGZpZWxkXCJ9O1xyXG5cclxuICBwcml2YXRlIF9zaG93TG9hZGVyID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY3VzdG9tRmllbGRDbGFzc2VzOiBzdHJpbmcgPSBcIlwiO1xyXG4gIHByaXZhdGUgX2N1c3RvbU9wdGlvbkNsYXNzZXM6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIHB1YmxpYyBvdXRlckNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuICBwdWJsaWMgaW5uZXJDb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKG51bGwpO1xyXG4gIHByaXZhdGUgaWdub3JlSW5uZXJDb250cm9sQ2hhbmdlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3ViczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIHByaXZhdGUgbm9OZ0NvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2VsZWN0ZWRJbmRleDogbnVtYmVyO1xyXG5cclxuICBrZXlNYW5hZ2VyOiBMaXN0S2V5TWFuYWdlcjxIaWdobGlnaHRhYmxlPjtcclxuICB2aWV3cG9ydFJlbmRlclJhbmdlOiBMaXN0UmFuZ2U7XHJcbiAgdmlld3BvcnRWaXNpYmxlUmFuZ2U6IExpc3RSYW5nZSA9IHtcclxuICAgIHN0YXJ0OiAwLFxyXG4gICAgZW5kOiB0aGlzLm51bU9wdGlvbnNUb1Nob3cgLSAxXHJcbiAgfTtcclxuXHJcbiAgYWN0aXZlVmFsdWU6IGFueTtcclxuXHJcbiAgcHVibGljIGNsaWNrSW5Qcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgb3B0aW9uU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9wdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9wdGlvbnNMb2FkZWQ6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xyXG5cclxuICBAVmlld0NoaWxkKFwidmlld3BvcnRcIiwge3N0YXRpYzogdHJ1ZX0pXHJcbiAgdmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcclxuXHJcbiAgQFZpZXdDaGlsZChcImlucHV0XCIsIHtzdGF0aWM6IHRydWV9KVxyXG4gIGlucHV0RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgQFZpZXdDaGlsZChcImlucHV0XCIsIHtyZWFkOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyLCBzdGF0aWM6IGZhbHNlfSlcclxuICBhdXRvQ29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xyXG5cclxuICBwcml2YXRlIG9uQ2hhbmdlRm46ICh2YWw6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkRm46ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuXHJcbiAgcHVibGljIGRpc3BsYXlGbjogKG9wdD86IGFueSkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkID0gKG9wdD86IGFueSkgPT4ge1xyXG4gICAgcmV0dXJuIG9wdCA/ICh0aGlzLmRpc3BsYXlGaWVsZCA/IG9wdFt0aGlzLmRpc3BsYXlGaWVsZF0gOiBvcHQpIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zaG93TG9hZGVyID0gdGhpcy5hbGxvd0xvYWRlciAmJiAoISB0aGlzLm9wdGlvbnMgfHwgdGhpcy5vcHRpb25zLmxlbmd0aCA9PT0gMCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgbmdDb250cm9sOiBOZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwpO1xyXG4gICAgaWYgKG5nQ29udHJvbCAmJiBuZ0NvbnRyb2wuY29udHJvbCkge1xyXG4gICAgICB0aGlzLm91dGVyQ29udHJvbCA9IG5nQ29udHJvbC5jb250cm9sO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMub3V0ZXJDb250cm9sLnZhbGlkYXRvcik7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyh0aGlzLm91dGVyQ29udHJvbC5hc3luY1ZhbGlkYXRvcik7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ub05nQ29udHJvbCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdWJzLmFkZCh0aGlzLmlubmVyQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMzAwKSkuc3Vic2NyaWJlKChfdmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5pc09wZW4gJiYgIXRoaXMuaWdub3JlSW5uZXJDb250cm9sQ2hhbmdlcykge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyT3B0aW9ucygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaWdub3JlSW5uZXJDb250cm9sQ2hhbmdlcyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcblxyXG4gICAgLy8gd29yayBhcm91bmQgZm9yIHZhbGlkYXRvcnMgbm90IGFsd2F5cyBwcm9wYWdhdGluZ1xyXG4gICAgdGhpcy5zdWJzLmFkZCh0aGlzLm91dGVyQ29udHJvbC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoX2V2ZW50OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLm91dGVyQ29udHJvbC52YWxpZGF0b3IpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5vdXRlckNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLnNldEVycm9ycyh0aGlzLm91dGVyQ29udHJvbC5lcnJvcnMpO1xyXG5cclxuICAgICAgaWYgKHRoaXMub3V0ZXJDb250cm9sLnRvdWNoZWQpIHtcclxuICAgICAgICB0aGlzLmlubmVyQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuXHJcbiAgICAvLyB0aGlzIG9iamVjdCBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIGFjdGl2ZSBzdGF0ZSB3aGVuIGtleWluZyB1cCBhbmQgZG93blxyXG4gICAgdGhpcy5rZXlNYW5hZ2VyID0gdGhpcy5hdXRvQ29tcGxldGVUcmlnZ2VyLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlcjtcclxuICAgIHRoaXMua2V5TWFuYWdlci53aXRoV3JhcChmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5zdWJzLmFkZChjb21iaW5lTGF0ZXN0KFtcclxuICAgICAgdGhpcy52aWV3cG9ydC5yZW5kZXJlZFJhbmdlU3RyZWFtLFxyXG4gICAgICB0aGlzLnZpZXdwb3J0LnNjcm9sbGVkSW5kZXhDaGFuZ2VcclxuICAgIF0pLnN1YnNjcmliZSgoW3JlbmRlcmVkUmFuZ2UsIHNjcm9sbGVkSW5kZXhdOiBbTGlzdFJhbmdlLCBudW1iZXJdKSA9PiB7XHJcblxyXG4gICAgICAvLyBJbnN0ZWFkIG9mIGxvYWRpbmcgdGhlIHdob2xlIGl0ZW0gbGlzdCBhdCBvbmNlLCB0aGUgdmlydHVhbCBzY3JvbGwgdmlld3BvcnQgYnVmZmVyc1xyXG4gICAgICAvLyBhIHJhbmdlIG9mIGVudHJpZXMsIG9ubHkgYSBwb3J0aW9uIG9mIHdoaWNoIGFyZSB3aXRoaW4gdGhlIHZpc2libGUgZm9sZFxyXG4gICAgICB0aGlzLnZpZXdwb3J0UmVuZGVyUmFuZ2UgPSByZW5kZXJlZFJhbmdlO1xyXG5cclxuICAgICAgLy8gd2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSB2aXNpYmxlIHJhbmdlIG91cnNlbHZlc1xyXG4gICAgICBsZXQgbGVuOiBudW1iZXIgPSBNYXRoLm1pbih0aGlzLmxvYWRlZE9wdGlvbnMubGVuZ3RoICsgKHRoaXMuYWxsb3dOb25lID8gMSA6IDApLCB0aGlzLm51bU9wdGlvbnNUb1Nob3cgLSAxKTtcclxuXHJcbiAgICAgIHRoaXMudmlld3BvcnRWaXNpYmxlUmFuZ2UgPSB7XHJcbiAgICAgICAgc3RhcnQ6IHNjcm9sbGVkSW5kZXgsXHJcbiAgICAgICAgZW5kOiBzY3JvbGxlZEluZGV4ICsgbGVuXHJcbiAgICAgIH07XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5vcHRpb25zKSB7XHJcbiAgICAgIGxldCBvcHRpb25zQ2hhbmdlOiBTaW1wbGVDaGFuZ2UgPSBjaGFuZ2VzLm9wdGlvbnM7XHJcbiAgICAgIGlmICghb3B0aW9uc0NoYW5nZS5jdXJyZW50VmFsdWUgfHwgb3B0aW9uc0NoYW5nZS5jdXJyZW50VmFsdWUubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIGlmKHRoaXMuaW5uZXJDb250cm9sLnZhbHVlICE9IG51bGwpe1xyXG4gICAgICAgICAgLy9SZXNldCB0aGUgaW5uZXJDb250cm9sIHZhbHVlIG9mIHRoZSBkcm9wZG93biBsaXN0IHRvIGFuIGVtcHR5IGFycmF5IGluIGNhc2Ugb2Ygbm8gcmVzdWx0cyBhcmUgcHJlc2VudCB0byBiZSBkaXNwbGF5ZWQuXHJcbiAgICAgICAgICAvL1RoaXMgZmx1c2hlcyBvdXQgdGhlIHN0YWxlIHZhbHVlIGZyb20gdGhlIGxpc3QgaWYgdGhlcmUgYXJlIG5vIHJlc3VsdHMgdG8gYmUgZGlzcGxheWVkLlxyXG4gICAgICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsdWUoW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGN1cnJlbnRPcHRzOiBhbnlbXSA9IDxhbnlbXT5vcHRpb25zQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgaWYgKGN1cnJlbnRPcHRzICYmIFwibGVuZ3RoXCIgaW4gY3VycmVudE9wdHMgJiYgY3VycmVudE9wdHMgIT09IG9wdGlvbnNDaGFuZ2UucHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3Nob3dMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9wdGlvbnNMb2FkZWQuZW1pdCgpO1xyXG5cclxuICAgICAgICAvLyBJZiBudW1iZXIgb2Ygb3B0aW9ucyBpcyBsZXNzIHRoYW4gb3VyIG1heCwgcmVkdWNlIHNpemUgb2Ygb3ZlcmxheVxyXG4gICAgICAgIHRoaXMubnVtT3B0aW9uc1RvU2hvdyA9IE1hdGgubWluKGN1cnJlbnRPcHRzLmxlbmd0aCArICh0aGlzLmFsbG93Tm9uZSA/IDEgOiAwKSwgdGhpcy5tYXhPcHRpb25zVG9TaG93KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zaG93TG9hZGVyID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAvLyBUaGUgYXV0b2NvbXBsZXRlIHdpbGwgYXV0b21hdGljYWxseSBwb3Agb3BlbiBvbmNlIGl0IGhhcyBvcHRpb25zIGZpbHRlcmVkIGludG8gaXQsXHJcbiAgICAgIC8vIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvIG9uIGluaXRpYWwgcGFnZSBsb2FkIG9yIHdoZW4gdGFiYmluZyB0aG91Z2hcclxuICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sb2FkT25seUN1cnJlbnRWYWx1ZSh0aGlzLm91dGVyQ29udHJvbC52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkT25seUN1cnJlbnRWYWx1ZShvYmopO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvcigpOiBzdHJpbmcge1xyXG4gICAgZm9yIChjb25zdCBlcnJvciBpbiB0aGlzLm91dGVyQ29udHJvbC5lcnJvcnMpIHtcclxuICAgICAgaWYgKHRoaXMuZGVmaW5lRXJyb3JzICYmIGVycm9yIGluIHRoaXMuZGVmaW5lRXJyb3JzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmaW5lRXJyb3JzW2Vycm9yXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkT25seUN1cnJlbnRWYWx1ZShjbnRybFZhbDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMubGVuZ3RoIDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5ld1ZhbHVlOiBhbnkgPSBudWxsO1xyXG4gICAgaWYgKGNudHJsVmFsICE9PSBudWxsICYmIGNudHJsVmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IGN1cnJlbnRseVNlbGVjdGVkOiBhbnkgPSB0aGlzLm9wdGlvbnMuZmluZCgob3B0OiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgb3B0VmFsdWU6IGFueSA9IHRoaXMudmFsdWVGaWVsZCA/IG9wdFt0aGlzLnZhbHVlRmllbGRdIDogb3B0O1xyXG4gICAgICAgIGlmICh0aGlzLmZvcmNlRW1pdE9iamVjdCkge1xyXG4gICAgICAgICAgbGV0IG91dGVyVmFsdWU6IGFueSA9IGNudHJsVmFsID8gKHRoaXMudmFsdWVGaWVsZCA/IGNudHJsVmFsW3RoaXMudmFsdWVGaWVsZF0gOiBjbnRybFZhbCkgOiBudWxsO1xyXG4gICAgICAgICAgaWYgKG9wdFZhbHVlID09PSBvdXRlclZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gb3B0VmFsdWUgPT09IGNudHJsVmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChjdXJyZW50bHlTZWxlY3RlZCkge1xyXG4gICAgICAgIG5ld1ZhbHVlID0gY3VycmVudGx5U2VsZWN0ZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwcmVmZXIgdG8gY2hlY2sgaWQgaWYgaXQgaGFzIG9uZSAgdnMgc3RyYWlnaHQgYWdhaW5zdCBpdCdzIG9iamVjdCBpZGVudGl0eVxyXG4gICAgaWYgKHRoaXMuaW5uZXJDb250cm9sLnZhbHVlICYmIG5ld1ZhbHVlICE9IG51bGwgJiYgdGhpcy52YWx1ZUZpZWxkKSB7XHJcbiAgICAgIGlmICh0aGlzLmlubmVyQ29udHJvbC52YWx1ZVt0aGlzLnZhbHVlRmllbGRdICE9PSBuZXdWYWx1ZVt0aGlzLnZhbHVlRmllbGRdKSB7XHJcbiAgICAgICAgdGhpcy5pZ25vcmVJbm5lckNvbnRyb2xDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRWYWx1ZShuZXdWYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25TZWxlY3RlZC5lbWl0KG5ld1ZhbHVlW3RoaXMudmFsdWVGaWVsZF0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5uZXJDb250cm9sLnZhbHVlICE9PSBuZXdWYWx1ZSkge1xyXG4gICAgICB0aGlzLmlnbm9yZUlubmVyQ29udHJvbENoYW5nZXMgPSB0cnVlO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRWYWx1ZShuZXdWYWx1ZSk7XHJcbiAgICAgIGxldCBudiA9IG5ld1ZhbHVlID8gKCh0aGlzLnZhbHVlRmllbGQgJiYgIXRoaXMuZm9yY2VFbWl0T2JqZWN0KSA/IG5ld1ZhbHVlW3RoaXMudmFsdWVGaWVsZF0gOiBuZXdWYWx1ZSkgOiBudWxsO1xyXG4gICAgICB0aGlzLm9wdGlvblNlbGVjdGVkLmVtaXQobnYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJPcHRpb25zKHNob3dBbGw6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JjZVNob3dOb25lID0gc2hvd0FsbDtcclxuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy5vcHRpb25zIHx8IHRoaXMub3B0aW9ucy5sZW5ndGggPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2hvd0FsbCB8fCAhdGhpcy5pbm5lckNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgdGhpcy5sb2FkZWRPcHRpb25zID0gWy4uLnRoaXMub3B0aW9uc107XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgc2VhcmNoVmFsdWU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5pbm5lckNvbnRyb2wudmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBzZWFyY2hWYWx1ZSA9IHRoaXMuaW5uZXJDb250cm9sLnZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXNwbGF5RmllbGQpIHtcclxuICAgICAgICBzZWFyY2hWYWx1ZSA9IHRoaXMuaW5uZXJDb250cm9sLnZhbHVlW3RoaXMuZGlzcGxheUZpZWxkXS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubG9hZGVkT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5maWx0ZXIoKG9wdDogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IG9wdERpc3BsYXk6IHN0cmluZyA9ICh0aGlzLmRpc3BsYXlGaWVsZCA/IG9wdFt0aGlzLmRpc3BsYXlGaWVsZF0gOiBvcHQpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIG9wdERpc3BsYXkuaW5jbHVkZXMoc2VhcmNoVmFsdWUpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5mb3JjZVNob3dOb25lID0gdGhpcy5sb2FkZWRPcHRpb25zLmxlbmd0aCA9PT0gMDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLmdldE9wdEluZGV4KHRoaXMub3V0ZXJDb250cm9sLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93TG9hZGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsb3dMb2FkZXIgJiYgdGhpcy5fc2hvd0xvYWRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuKCkge1xyXG4gICAgaWYgKHRoaXMuaW5uZXJDb250cm9sLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgYXV0b2NvbXBsZXRlIHdpbGwgb25seSBvcGVuIHdoZW4gb3B0aW9ucyBhcmUgbG9hZGVkXHJcbiAgICB0aGlzLmZpbHRlck9wdGlvbnModHJ1ZSk7XHJcbiAgICB0aGlzLmF1dG9Db21wbGV0ZVRyaWdnZXIub3BlblBhbmVsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UoKSB7XHJcbiAgICB0aGlzLmF1dG9Db21wbGV0ZVRyaWdnZXIuY2xvc2VQYW5lbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uT3BlbmVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JjZVNob3dOb25lID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XHJcblxyXG4gICAgaWYodGhpcy5zZWxlY3RUZXh0T25PcGVuKXtcclxuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZWxlY3QoKTsgLy8gSGlnaGxpZ2h0cyB0ZXh0XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA+IDApIHtcclxuICAgICAgLy8gbWFrZSB0aGUgc2VsZWN0ZWQgb3B0aW9uIGFsc28gdGhlIGFjdGl2ZSBvcHRpb25cclxuICAgICAgdGhpcy5hY3RpdmVWYWx1ZSA9IHRoaXMuZ2V0T3B0VmFsKHRoaXMubG9hZGVkT3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdKTtcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE9wdGlvbigpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsb3NlZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc09wZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlubmVyQ29udHJvbC52YWx1ZSAmJiB0aGlzLm91dGVyQ29udHJvbC52YWx1ZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdE9wdGlvbihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvYWRPbmx5Q3VycmVudFZhbHVlKHRoaXMub3V0ZXJDb250cm9sLnZhbHVlKTtcclxuXHJcbiAgICAvLyByZXNldCB0aGUgb3B0aW9ucyBzbyB0aGUgYXV0b2NvbXBsZXRlIHdvbid0IGF1dG9tYXRpY2FsbHkgb3BlbiBvbiB0aGUgbmV4dCB0YWIgdGhyb3VnaFxyXG4gICAgdGhpcy5sb2FkZWRPcHRpb25zID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRDbGljaygpIHtcclxuICAgIC8vIGNsaWNraW5nIG9uIGNlcnRhaW4gcGFydHMgb2YgdGhlIG1hdC1maWVsZCB3aWxsIFwiZmxpY2tlclwiIHRoZSBmb2N1cywgdHJpZ2dlcmluZ1xyXG4gICAgLy8gZXJyb3IgdmFsaWRhdGlvbiBlYXJseS4gVGhpcyB0cmFja3MgdGhvc2UgaW50ZXJuYWwgY2xpY2tzIHNvIHRoZXkgY2FuIGJlIGlnbm9yZWRcclxuICAgIHRoaXMuY2xpY2tJblByb2dyZXNzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlbmRDbGljaygpIHtcclxuICAgIHRoaXMuY2xpY2tJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZU9wZW4oZXZlbnQ6IE1vdXNlRXZlbnQpOnZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIlRhYlwiIHx8IGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcclxuICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIGNkayBhMTF5IEtleU1hbmFnZXIgaW1wbGVtZW50YXRpb24gaXMgbm90IGNvbXBhdGlibGUgd2l0aFxyXG4gICAgICAvLyB0aGUgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciwgd2hpY2ggY2F1c2VzIHRoZSBEcm9wLWRvd24gbm90IHNjcm9sbCB3aXRoIGtleWJvYXJkXHJcbiAgICAgIC8vIG9uIGxvbmcgb3B0aW9uIGxpc3RzLlxyXG4gICAgICAvL1xyXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xNjU5OFxyXG4gICAgICAvL1xyXG4gICAgICAvLyBUaGlzIHdvcmsgYXJvdW5kIHRha2VzIGNvbnRyb2wgb2YgdGhlIGtleWJvYXJkIGFuZCBtYW51YWxseSBzY3JvbGxzIGFuZCBhY3RpdmF0ZXNcclxuICAgICAgLy8gdGhlIG9wdGlvbnNcclxuICAgICAgLy9cclxuICAgICAgLy8gUmVmZXJlbmNlczpcclxuICAgICAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2Jsb2IvbWFzdGVyL3NyYy9tYXRlcmlhbC9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLXRyaWdnZXIudHNcclxuICAgICAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2Jsb2IvbWFzdGVyL3NyYy9jZGsvYTExeS9rZXktbWFuYWdlci9saXN0LWtleS1tYW5hZ2VyLnRzXHJcbiAgICAgIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21hc3Rlci9zcmMvY2RrL2ExMXkva2V5LW1hbmFnZXIvYWN0aXZlZGVzY2VuZGFudC1rZXktbWFuYWdlci50c1xyXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkFycm93VXBcIiB8fCBldmVudC5rZXkgPT09IFwiQXJyb3dEb3duXCIpIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0QWN0aXZlSXRlbSgpO1xyXG4gICAgICAgIHRoaXMuc2hpZnRBY3RpdmVJdGVtKGV2ZW50LmtleSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0FjdGl2ZUJvdW5kYXJpZXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gYmVmb3JlIG91ciBrZXlwcmVzcyBiaW5kaW5nIGV2ZW4gdHJpZ2dlcnMsIGFuZ3VsYXIgaGFzIGFscmVhZHkgbW92ZWQgdGhlIGFjdGl2ZSBzZWxlY3Rpb25cclxuICAvLyB1bnN5bmNpbmcgaXQgd2l0aCBvdXIgZGlzcGxheS4gdGhpcyBjb2RlIHJlLWluaXRpYWxpemVzIHRoZSBhY3RpdmUgb3B0aW9uXHJcbiAgaW5pdEFjdGl2ZUl0ZW0oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuYWN0aXZlVmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldEZpcnN0SXRlbUFjdGl2ZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGFjdGl2ZUluZGV4OiBudW1iZXIgPSB0aGlzLmdldEFjdGl2ZUluZGV4KCk7XHJcblxyXG4gICAgICAvLyB0aGlzIGRvZXMgdGhlIGNvbnZlcnNpb24gZnJvbSBhbiBpbmRleCB3aXRoaW4gYWxsIG9wdGlvbnMgZG93biB0byBhIHBvc2l0aW9uIHdpdGhpbiB0aGVcclxuICAgICAgLy8gZGlzcGxheWVkIHJhbmdlLCB3aGljaCBpcyBhbGwgdGhlIGtleW1hbmFnZXIgaXMgYXdhcmUgb2ZcclxuICAgICAgbGV0IHBvc2l0aW9uID0gYWN0aXZlSW5kZXggLSB0aGlzLnZpZXdwb3J0UmVuZGVyUmFuZ2Uuc3RhcnQ7XHJcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHBvc2l0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNoaWZ0QWN0aXZlSXRlbShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGtleSA9PT0gXCJBcnJvd1VwXCIpIHtcclxuICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xyXG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiQXJyb3dEb3duXCIpIHtcclxuICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldE5leHRJdGVtQWN0aXZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMua2V5TWFuYWdlci5hY3RpdmVJdGVtKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVmFsdWUgPSB0aGlzLmdldE9wdFZhbCgoPE1hdE9wdGlvbj50aGlzLmtleU1hbmFnZXIuYWN0aXZlSXRlbSkudmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gY2hlY2sgaWYgdGhlIGFjdGl2ZSBvcHRpb24gaW5kZXggaXMgd2l0aGluIHRoZSBkaXNwbGF5ZWQgdmlld3BvcnQgd2luZG93XHJcbiAgLy8gaWYgbm90LCBzY3JvbGwgaXQgaW50byB2aWV3XHJcbiAgY2hlY2tBY3RpdmVCb3VuZGFyaWVzKCk6IHZvaWQge1xyXG4gICAgbGV0IGFjdGl2ZUluZGV4OiBudW1iZXIgPSB0aGlzLmdldEFjdGl2ZUluZGV4KCk7XHJcblxyXG4gICAgaWYgKGFjdGl2ZUluZGV4IDwgdGhpcy52aWV3cG9ydFZpc2libGVSYW5nZS5zdGFydCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnZpZXdwb3J0LnNjcm9sbFRvT2Zmc2V0KGFjdGl2ZUluZGV4ICogdGhpcy5vcHRpb25TaXplUHgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKGFjdGl2ZUluZGV4ID4gdGhpcy52aWV3cG9ydFZpc2libGVSYW5nZS5lbmQpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy52aWV3cG9ydC5zY3JvbGxUb09mZnNldCgoYWN0aXZlSW5kZXggLSAodGhpcy5udW1PcHRpb25zVG9TaG93IC0gMSkpICogdGhpcy5vcHRpb25TaXplUHgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZUluZGV4KCkge1xyXG4gICAgbGV0IGFjdGl2ZUluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGlmICh0aGlzLmFjdGl2ZVZhbHVlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5hY3RpdmVWYWx1ZSAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgLy8gaWYgd2UgYWRkZWQgYSBub25lIG9wdGlvbiB0aGUgcmV0dXJuZWQgaW5kZXggd291bGQgYmUgb2ZmIGJ5IG9uZVxyXG4gICAgICBsZXQgdmFsSW5kZXggPSB0aGlzLmdldE9wdEluZGV4KHRoaXMuYWN0aXZlVmFsdWUpICsgKHRoaXMuYWxsb3dOb25lICYmICh0aGlzLmZvcmNlU2hvd05vbmUgfHwgIXRoaXMuaW5uZXJDb250cm9sLnZhbHVlKSA/IDEgOiAwKTtcclxuXHJcbiAgICAgIC8vIHRoZSBpbmRleCBzaG91bGQgYmUgd2l0aGluIHRoZSByYW5nZSBvZiBvdXIgZW50aXJlIGJ1ZmZlciwgb3IganVzdCBhbGxvdyBpdCB0byByZXNldFxyXG4gICAgICBpZiAodmFsSW5kZXggPj0gdGhpcy52aWV3cG9ydFJlbmRlclJhbmdlLnN0YXJ0XHJcbiAgICAgICAgJiYgKCF0aGlzLnZpZXdwb3J0UmVuZGVyUmFuZ2UuZW5kIHx8IHZhbEluZGV4IDw9IHRoaXMudmlld3BvcnRSZW5kZXJSYW5nZS5lbmQpXHJcbiAgICAgICkge1xyXG4gICAgICAgIGFjdGl2ZUluZGV4ID0gdmFsSW5kZXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYWN0aXZlSW5kZXg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1cygpIHtcclxuICAgIGlmICghdGhpcy5pc09wZW4pIHtcclxuICAgICAgLy8gSGlnaGxpZ2h0cyB0ZXh0XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdFRleHRPbk9wZW4pIHtcclxuICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNlbGVjdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1c091dCgpIHtcclxuICAgIC8vIG1hcmsgY29udHJvbCB0b3VjaGVkIGFuZCB0cmlnZ2VyIGVycm9yIHZhbGlkYXRpb25cclxuICAgIGlmICghdGhpcy5jbGlja0luUHJvZ3Jlc3MpIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICB0aGlzLm9uVG91Y2hlZEZuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0T3B0aW9uKG9wdDogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgbmV3VmFsID0gdGhpcy5nZXRPcHRWYWwob3B0LCB0aGlzLmZvcmNlRW1pdE9iamVjdCk7XHJcblxyXG4gICAgaWYgKHRoaXMubm9OZ0NvbnRyb2wpIHtcclxuICAgICAgdGhpcy5vdXRlckNvbnRyb2wuc2V0VmFsdWUobmV3VmFsKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uQ2hhbmdlRm4obmV3VmFsKTtcclxuICAgIHRoaXMub3B0aW9uU2VsZWN0ZWQuZW1pdChuZXdWYWwpO1xyXG4gICAgdGhpcy5vcHRpb25DaGFuZ2VkLmVtaXQobmV3VmFsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb1NlbGVjdGVkT3B0aW9uKCk6IHZvaWQge1xyXG4gICAgLy8gc2Nyb2xsIHRvIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uIHdoZW4gd2Ugb3BlbiB0aGUgZHJvcGRvd25cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPiAwKSB7XHJcbiAgICAgIGxldCBvZmZzZXRJbmRleDogbnVtYmVyID0gdGhpcy5zZWxlY3RlZEluZGV4ICsgKHRoaXMuYWxsb3dOb25lID8gMSA6IDApOyAvLyBhZGp1c3QgZm9yIE5vbmUgZW50cnlcclxuICAgICAgb2Zmc2V0SW5kZXggLT0gKHRoaXMubnVtT3B0aW9uc1RvU2hvdyAvIDIpIC0gMTsgLy8gY2FsY3VsYXRlIG1pZGRsZSBvZiB2aWV3cG9ydFxyXG4gICAgICB0aGlzLnZpZXdwb3J0LnNjcm9sbFRvT2Zmc2V0KG9mZnNldEluZGV4ICogdGhpcy5vcHRpb25TaXplUHgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0T3B0VmFsKG9wdDogYW55LCBmb3JjZU9iamVjdDogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcclxuICAgIGlmICh0aGlzLnZhbHVlRmllbGQgJiYgIWZvcmNlT2JqZWN0KSB7XHJcbiAgICAgIGlmIChvcHQgIT09IG51bGwgJiYgb3B0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdCA9PT0gXCJvYmplY3RcIiAmJiB0aGlzLnZhbHVlRmllbGQgaW4gb3B0KSB7XHJcbiAgICAgICAgcmV0dXJuIG9wdFt0aGlzLnZhbHVlRmllbGRdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvcHQ7XHJcbiAgfVxyXG5cclxuICBnZXRPcHRJbmRleChvcHRWYWx1ZTogYW55KTogbnVtYmVyIHtcclxuICAgIC8vIGZpbmQgdGhlIGluZGV4IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvblxyXG4gICAgaWYgKG9wdFZhbHVlICE9PSBudWxsICYmIG9wdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubG9hZGVkT3B0aW9ucy5maW5kSW5kZXgoKG9wdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0VmFsKG9wdGlvbikgPT09IG9wdFZhbHVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vicy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1105,13 +1105,15 @@ class DateValidator {
1105
1105
  static { this.minValue = undefined; }
1106
1106
  static { this.maxValue = undefined; }
1107
1107
  static dateFormatValidator(ac) {
1108
- if (ac && ac.value && !moment(ac.value, "M/D/YYYY", true).isValid()) {
1108
+ let dateArr = ac.value.split("/");
1109
+ if (dateArr.length != 3 || dateArr[0].length > 3 || dateArr[0].length < 1 || dateArr[1].length > 3 ||
1110
+ dateArr[1].length < 1 || dateArr[2].length !== 4) {
1109
1111
  return { "dateFormatValidator": true };
1110
1112
  }
1111
1113
  return null;
1112
1114
  }
1113
1115
  static dateRangeValidator(ac) {
1114
- if (ac && ac.value && DateValidator.minValue && DateValidator.maxValue && moment(ac.value, "M/D/YYYY", true).isValid()) {
1116
+ if (ac && ac.value && DateValidator.minValue && DateValidator.maxValue && (moment(ac.value, "M/D/YYYY", true).isValid() || moment(ac.value, "MM/DD/YYYY", true).isValid())) {
1115
1117
  let dateValue = moment(ac.value);
1116
1118
  let minDate = moment(DateValidator.convertNgbStructToDate(DateValidator.minValue));
1117
1119
  let maxDate = moment(DateValidator.convertNgbStructToDate(DateValidator.maxValue));
@@ -1121,11 +1123,17 @@ class DateValidator {
1121
1123
  }
1122
1124
  return null;
1123
1125
  }
1126
+ static dateInvalidValidator(ac) {
1127
+ if (ac && ac.value && !moment(ac.value, "M/D/YYYY", true).isValid() && !moment(ac.value, "MM/DD/YYYY", true).isValid()) {
1128
+ return { "dateInvalidValidator": true };
1129
+ }
1130
+ return null;
1131
+ }
1124
1132
  static convertNgbStructToDate(struct) {
1125
1133
  return { year: struct.year, month: struct.month - 1, day: struct.day };
1126
1134
  }
1127
1135
  static inRange(ac) {
1128
- if (ac && ac.value && DateValidator.minValue && DateValidator.maxValue && moment(ac.value, "M/D/YYYY", true).isValid()) {
1136
+ if (ac && ac.value && DateValidator.minValue && DateValidator.maxValue && (moment(ac.value, "M/D/YYYY", true).isValid() || moment(ac.value, "MM/DD/YYYY", true).isValid())) {
1129
1137
  let dateValue = moment(ac.value);
1130
1138
  let minDate = moment(DateValidator.convertNgbStructToDate(DateValidator.minValue));
1131
1139
  let maxDate = moment(DateValidator.convertNgbStructToDate(DateValidator.maxValue));
@@ -1266,6 +1274,7 @@ class DateComponent extends DateBase {
1266
1274
  // Binded data from the parent component.
1267
1275
  this.dateFormat = "shortDate";
1268
1276
  this.inputDataChange = new EventEmitter();
1277
+ this.dateValid = new EventEmitter();
1269
1278
  // only validate if user is typing
1270
1279
  this.validate = false;
1271
1280
  this.focused = false;
@@ -1275,7 +1284,7 @@ class DateComponent extends DateBase {
1275
1284
  */
1276
1285
  ngOnInit() {
1277
1286
  this.dateForm = this.formBuilder.group({
1278
- dateInput: new UntypedFormControl("", [DateValidator.dateFormatValidator, DateValidator.dateRangeValidator])
1287
+ dateInput: new UntypedFormControl("", [DateValidator.dateFormatValidator, DateValidator.dateRangeValidator, DateValidator.dateInvalidValidator])
1279
1288
  });
1280
1289
  this.onChanges();
1281
1290
  this.updateInternalDataFromModel();
@@ -1349,45 +1358,35 @@ class DateComponent extends DateBase {
1349
1358
  this.state = 0;
1350
1359
  this.dateForm.controls["dateInput"].setValue("");
1351
1360
  this.inputDataChange.emit(this.inputData);
1361
+ this.dateValid.emit(true);
1352
1362
  }
1353
1363
  onKeyUpInput(event) {
1354
1364
  // Check for when the input is deleted before being saved
1355
- if (event.key === "Delete" || event.key === "Backspace") {
1356
- if (this.dateForm.controls["dataInput"].value.length === 0) {
1357
- this.clear();
1358
- }
1359
- }
1360
- // update range so that the date range validator can run accurately
1361
- DateValidator.minValue = this.minDate;
1362
- DateValidator.maxValue = this.maxDate;
1363
- // Get the updated dateForm value
1364
- let eventTarget = event.target;
1365
- let inputValue = eventTarget.value;
1366
- this.dateForm.controls["dateInput"].patchValue(inputValue);
1367
- // if we have a good date and is within the range update the picker
1368
- if (DateValidator.inRange(this.dateForm.controls["dateInput"])) {
1369
- this.validate = false;
1370
- this.inputData = this.datePipe.transform(this.dateForm.controls["dateInput"].value, this.dateFormat);
1371
- this.updateInternalDataFromModel();
1372
- this.dateForm.controls["dateInput"].setValue(this.inputData);
1373
- this.inputDataChange.emit(this.inputData);
1365
+ if ((event.key === "Delete" || event.key === "Backspace") && this.dateForm.controls["dateInput"].value.length === 0) {
1366
+ this.clear();
1374
1367
  }
1375
1368
  else {
1376
- this.validate = true;
1377
- }
1378
- // // only validate if user is typing
1379
- // if (!this.validate) {
1380
- // this.validate = true;
1381
- // this.dateForm.controls["dateInput"].setValue("");
1382
- //
1383
- // // clear the date picker
1384
- // this.modifiedData = null;
1385
- // this.inputData = null;
1386
- // let today: Date = new Date();
1387
- // this.startDate = {year: today.getFullYear(), month: today.getMonth() + 1, day: today.getDate()};
1388
- // this.state = 0;
1389
- // this.inputDataChange.emit(this.inputData);
1390
- // }
1369
+ // update range so that the date range validator can run accurately
1370
+ DateValidator.minValue = this.minDate;
1371
+ DateValidator.maxValue = this.maxDate;
1372
+ // Get the updated dateForm value
1373
+ let eventTarget = event.target;
1374
+ let inputValue = eventTarget.value;
1375
+ this.dateForm.controls["dateInput"].patchValue(inputValue);
1376
+ // if we have a good date and is within the range update the picker
1377
+ if (DateValidator.inRange(this.dateForm.controls["dateInput"])) {
1378
+ this.validate = false;
1379
+ this.getDateValid();
1380
+ this.inputData = this.datePipe.transform(this.dateForm.controls["dateInput"].value, this.dateFormat);
1381
+ this.updateInternalDataFromModel();
1382
+ this.dateForm.controls["dateInput"].setValue(this.inputData);
1383
+ this.inputDataChange.emit(this.inputData);
1384
+ }
1385
+ else {
1386
+ this.validate = true;
1387
+ this.getDateValid();
1388
+ }
1389
+ }
1391
1390
  }
1392
1391
  /**
1393
1392
  * NgbDateStruct stores day, month and year. Convert this to ISO8601.
@@ -1404,8 +1403,20 @@ class DateComponent extends DateBase {
1404
1403
  }
1405
1404
  return date.year + "-" + ((date.month < 10) ? "0" : "") + date.month + "-" + ((date.day < 10) ? "0" : "") + date.day + "T12:00-06:00";
1406
1405
  }
1406
+ getDateValid() {
1407
+ if (this.dateForm.get("dateInput").hasError("dateFormatValidator")
1408
+ || this.dateForm.get("dateInput").hasError("dateRangeValidator")
1409
+ || this.dateForm.get("dateInput").hasError("dateInvalidValidator")) {
1410
+ this.dateValid.emit(false);
1411
+ return false;
1412
+ }
1413
+ else {
1414
+ this.dateValid.emit(true);
1415
+ return true;
1416
+ }
1417
+ }
1407
1418
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DateComponent, deps: [{ token: i0.ElementRef }, { token: i2.UntypedFormBuilder }, { token: i1.DatePipe }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1408
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: DateComponent, selector: "hci-date", inputs: { dateFormat: "dateFormat", minDate: "minDate", maxDate: "maxDate", label: "label", inputData: "inputData", modifiedData: "modifiedData" }, outputs: { inputDataChange: "inputDataChange" }, host: { listeners: { "document:click": "handleOutsideEvent($event)" } }, providers: [DatePipe, DateValidator], viewQueries: [{ propertyName: "dp", first: true, predicate: ["dp"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
1419
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: DateComponent, selector: "hci-date", inputs: { dateFormat: "dateFormat", minDate: "minDate", maxDate: "maxDate", label: "label", inputData: "inputData", modifiedData: "modifiedData" }, outputs: { inputDataChange: "inputDataChange", dateValid: "dateValid" }, host: { listeners: { "document:click": "handleOutsideEvent($event)" } }, providers: [DatePipe, DateValidator], viewQueries: [{ propertyName: "dp", first: true, predicate: ["dp"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
1409
1420
  <div class="form-group">
1410
1421
  <div class="input-group d-flex">
1411
1422
  <form [formGroup]="dateForm" class="flex-grow-1">
@@ -1426,43 +1437,17 @@ class DateComponent extends DateBase {
1426
1437
  class="invalid-date">Enter date as M/D/YYYY or MM/DD/YYYY</div>
1427
1438
  <div *ngIf="validate && dateForm.get('dateInput').hasError('dateRangeValidator')"
1428
1439
  class="invalid-date">Invalid Date Range</div>
1440
+ <div *ngIf="validate && dateForm.get('dateInput').hasError('dateInvalidValidator')"
1441
+ class="invalid-date">Not a real date</div>
1429
1442
  </div>
1430
1443
  </form>
1431
- <!--
1432
- We will replace the nbg date picker with material date picker
1433
- -->
1434
- <!-- <form [formGroup]="dateForm" class="flex-grow-1">-->
1435
- <!-- <div class="date-wrapper">-->
1436
- <!-- <div class="input-group-append">-->
1437
- <!-- <mat-form-field appearance="outline" [style.padding-top.em]="0.5"-->
1438
- <!-- [style.padding-bottom.em]="0.5">-->
1439
- <!-- <input matInput (keypress)="onKeyPressInput($event)"-->
1440
- <!-- [min]="minDate" [max]="maxDate" [matDatepicker]="datePicker"-->
1441
- <!-- formControlName="dateInput" placeholder="{{label}}" aria-label="date"-->
1442
- <!-- aria-describedby="basic-addon2">-->
1443
- <!-- <mat-datepicker-toggle matSuffix [for]="datePicker"></mat-datepicker-toggle>-->
1444
- <!-- <mat-datepicker #datePicker></mat-datepicker>-->
1445
- <!-- <mat-error *ngIf="validate && dateForm.get('dateInput').hasError('dateFormatValidator')"-->
1446
- <!-- class="invalid-date">-->
1447
- <!-- Enter date as M/D/YYYY or MM/DD/YYYY-->
1448
- <!-- </mat-error>-->
1449
- <!-- <mat-error *ngIf="validate && dateForm.get('dateInput').hasError('dateRangeValidator')"-->
1450
- <!-- class="invalid-date">-->
1451
- <!-- Invalid Date Range-->
1452
- <!-- </mat-error>-->
1453
- <!-- </mat-form-field>-->
1454
- <!-- </div>-->
1455
- <!-- </div>-->
1456
- <!-- </form>-->
1457
1444
  </div>
1458
1445
  </div>
1459
1446
  <div *ngIf="state === 1" class="inline-editing">
1460
1447
  <ngb-datepicker [ngModel]="modifiedData" #dp [startDate]="startDate" [minDate]="minDate"
1461
1448
  [maxDate]="maxDate" (keydown)="onKeyDown($event)"
1462
- (ngModelChange)="onChange($event)" (select)="save()"></ngb-datepicker>
1449
+ (ngModelChange)="onChange($event)" (dateSelect)="save()"></ngb-datepicker>
1463
1450
  <div class="inline-hover-save-options">
1464
- <!-- <a class="btn ii-so-btn save" (click)="save()"><i class="fas fa-check"></i></a>-->
1465
- <!-- <a class="btn ii-so-btn cancel" (click)="cancel()"><i class="fas fa-times"></i></a>-->
1466
1451
  </div>
1467
1452
  </div>
1468
1453
 
@@ -1491,43 +1476,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
1491
1476
  class="invalid-date">Enter date as M/D/YYYY or MM/DD/YYYY</div>
1492
1477
  <div *ngIf="validate && dateForm.get('dateInput').hasError('dateRangeValidator')"
1493
1478
  class="invalid-date">Invalid Date Range</div>
1479
+ <div *ngIf="validate && dateForm.get('dateInput').hasError('dateInvalidValidator')"
1480
+ class="invalid-date">Not a real date</div>
1494
1481
  </div>
1495
1482
  </form>
1496
- <!--
1497
- We will replace the nbg date picker with material date picker
1498
- -->
1499
- <!-- <form [formGroup]="dateForm" class="flex-grow-1">-->
1500
- <!-- <div class="date-wrapper">-->
1501
- <!-- <div class="input-group-append">-->
1502
- <!-- <mat-form-field appearance="outline" [style.padding-top.em]="0.5"-->
1503
- <!-- [style.padding-bottom.em]="0.5">-->
1504
- <!-- <input matInput (keypress)="onKeyPressInput($event)"-->
1505
- <!-- [min]="minDate" [max]="maxDate" [matDatepicker]="datePicker"-->
1506
- <!-- formControlName="dateInput" placeholder="{{label}}" aria-label="date"-->
1507
- <!-- aria-describedby="basic-addon2">-->
1508
- <!-- <mat-datepicker-toggle matSuffix [for]="datePicker"></mat-datepicker-toggle>-->
1509
- <!-- <mat-datepicker #datePicker></mat-datepicker>-->
1510
- <!-- <mat-error *ngIf="validate && dateForm.get('dateInput').hasError('dateFormatValidator')"-->
1511
- <!-- class="invalid-date">-->
1512
- <!-- Enter date as M/D/YYYY or MM/DD/YYYY-->
1513
- <!-- </mat-error>-->
1514
- <!-- <mat-error *ngIf="validate && dateForm.get('dateInput').hasError('dateRangeValidator')"-->
1515
- <!-- class="invalid-date">-->
1516
- <!-- Invalid Date Range-->
1517
- <!-- </mat-error>-->
1518
- <!-- </mat-form-field>-->
1519
- <!-- </div>-->
1520
- <!-- </div>-->
1521
- <!-- </form>-->
1522
1483
  </div>
1523
1484
  </div>
1524
1485
  <div *ngIf="state === 1" class="inline-editing">
1525
1486
  <ngb-datepicker [ngModel]="modifiedData" #dp [startDate]="startDate" [minDate]="minDate"
1526
1487
  [maxDate]="maxDate" (keydown)="onKeyDown($event)"
1527
- (ngModelChange)="onChange($event)" (select)="save()"></ngb-datepicker>
1488
+ (ngModelChange)="onChange($event)" (dateSelect)="save()"></ngb-datepicker>
1528
1489
  <div class="inline-hover-save-options">
1529
- <!-- <a class="btn ii-so-btn save" (click)="save()"><i class="fas fa-check"></i></a>-->
1530
- <!-- <a class="btn ii-so-btn cancel" (click)="cancel()"><i class="fas fa-times"></i></a>-->
1531
1490
  </div>
1532
1491
  </div>
1533
1492
 
@@ -1551,6 +1510,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
1551
1510
  type: Input
1552
1511
  }], inputDataChange: [{
1553
1512
  type: Output
1513
+ }], dateValid: [{
1514
+ type: Output
1554
1515
  }] } });
1555
1516
 
1556
1517
  /**
@@ -1631,7 +1592,7 @@ class DateRangeComponent {
1631
1592
  [maxDate]="maxEndDate">
1632
1593
  </hci-date>
1633
1594
  </div>
1634
- `, isInline: true, dependencies: [{ kind: "component", type: DateComponent, selector: "hci-date", inputs: ["dateFormat", "minDate", "maxDate", "label", "inputData", "modifiedData"], outputs: ["inputDataChange"] }] }); }
1595
+ `, isInline: true, dependencies: [{ kind: "component", type: DateComponent, selector: "hci-date", inputs: ["dateFormat", "minDate", "maxDate", "label", "inputData", "modifiedData"], outputs: ["inputDataChange", "dateValid"] }] }); }
1635
1596
  }
1636
1597
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DateRangeComponent, decorators: [{
1637
1598
  type: Component,
@@ -3012,7 +2973,7 @@ class CustomComboBoxComponent {
3012
2973
  </mat-error>
3013
2974
  <ng-content></ng-content>
3014
2975
  </mat-form-field>
3015
- `, isInline: true, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:#0000008a}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3$1.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i3$1.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3$1.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i3$1.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "component", type: i6$1.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i5.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i6$2.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i6$2.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i7.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i8.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], encapsulation: i0.ViewEncapsulation.None }); }
2976
+ `, isInline: true, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:var(--black-darkest)}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3$1.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i3$1.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3$1.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i3$1.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "component", type: i6$1.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i5.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i6$2.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i6$2.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i7.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i8.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], encapsulation: i0.ViewEncapsulation.None }); }
3016
2977
  }
3017
2978
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CustomComboBoxComponent, decorators: [{
3018
2979
  type: Component,
@@ -3096,7 +3057,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
3096
3057
  multi: true,
3097
3058
  }], host: {
3098
3059
  class: "hci-combobox-container"
3099
- }, encapsulation: ViewEncapsulation.None, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:#0000008a}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"] }]
3060
+ }, encapsulation: ViewEncapsulation.None, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:var(--black-darkest)}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"] }]
3100
3061
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Injector }], propDecorators: { maxOptionsToShow: [{
3101
3062
  type: Input
3102
3063
  }], customViewportClass: [{