@smartbit4all/ng-client 3.3.231 → 3.3.232

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.
@@ -736,10 +736,10 @@ export class SmartformwidgetComponent {
736
736
  }
737
737
  }
738
738
  SmartformwidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SmartformwidgetComponent, deps: [{ token: i1.SmartFormService }, { token: i2.ComponentFactoryService }, { token: i3.DomSanitizer }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
739
- SmartformwidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SmartformwidgetComponent, selector: "smartformwidget", inputs: { form: "form", widgetInstance: "widgetInstance", onBlur: "onBlur", onValueChange: "onValueChange", labelColor: "labelColor", sophisticatedValueChange: "sophisticatedValueChange" }, viewQueries: [{ propertyName: "chipInputChild", first: true, predicate: ["chipInput"], descendants: true }, { propertyName: "customComponentVcRef", first: true, predicate: ["customComponent"], descendants: true, read: ViewContainerRef }, { propertyName: "quill", first: true, predicate: ["quillEditor"], descendants: true }, { propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "dateInputChild", first: true, predicate: ["dateInput"], descendants: true }, { propertyName: "timeInputChild", first: true, predicate: ["timeInput"], descendants: true }, { propertyName: "childrenWidgetsQL", predicate: SmartformwidgetComponent, descendants: true }], ngImport: i0, template: "<div class=\"container\" [formGroup]=\"form\">\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n class=\"container\"\r\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\r\n >\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\" [ngClass]=\"getDirection()\">\r\n <smartformwidget\r\n *ngFor=\"let widget of widgetInstance.valueList\"\r\n [form]=\"form\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor\"\r\n ></smartformwidget>\r\n </div>\r\n\r\n <div\r\n (capsLock)=\"capsOn = $event\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n\r\n <input\r\n *ngIf=\"!widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.inputmode]=\"\r\n widgetInstance.inputMode ? widgetInstance.inputMode.toLocaleLowerCase() : 'text'\r\n \"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\r\n [mask]=\"widgetInstance.mask ?? ''\"\r\n (keydown.enter)=\"onKeydown()\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n />\r\n <input\r\n *ngIf=\"widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\r\n [matAutocomplete]=\"textFieldAuto\"\r\n (keydown.enter)=\"onKeydown()\"\r\n />\r\n <button\r\n *ngIf=\"widgetInstance.isPassword\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <mat-icon>{{ hidePassword ? 'visibility_off' : 'visibility' }}</mat-icon>\r\n </button>\r\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option.label\">\r\n <span [innerHTML]=\"option.label | highlight : toHighlight\"></span>\r\n </mat-option>\r\n </mat-autocomplete>\r\n <span class=\"mat-error\" *ngIf=\"capsOn && widgetInstance.isPassword\">\r\n {{ widgetInstance.capsLockWarning }}\r\n </span>\r\n\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n\r\n <span matPrefix>\r\n <smart-icon\r\n *ngIf=\"capsOn && widgetInstance.isPassword\"\r\n [icon]=\"widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\"\r\n color=\"warn\"\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.icon && widgetInstance.iconPosition === 'PRE'\"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n ></smart-icon>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n [color]=\"widgetInstance.textFieldButton.iconColor\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{ widgetInstance.maxLength - form.controls[widgetInstance.key].value.length }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [type]=\"'number'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [min]=\"widgetInstance.minValues ?? null\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <span matPrefix>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon *ngIf=\"widgetInstance.icon\" [icon]=\"widgetInstance.icon\" matSuffix>\r\n </smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-list #chipList aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ value }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n <input\r\n #chipInput\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"addOnBlur\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [matAutocomplete]=\"chipAuto\"\r\n (matChipInputTokenEnd)=\"add($event)\"\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n <mat-autocomplete\r\n #chipAuto=\"matAutocomplete\"\r\n (optionSelected)=\"selected($event, widgetInstance)\"\r\n >\r\n <mat-option\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let item of widgetInstance.valueList\"\r\n [value]=\"item.value\"\r\n >\r\n {{ item.label }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-chip-list>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-list #chipList aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ getChipsValue(value) }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n <input\r\n #chipInput\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"false\"\r\n [readonly]=\"true\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n </mat-chip-list>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <textarea\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n ></textarea>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{ widgetInstance.maxLength - form.controls[widgetInstance.key].value.length }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance.hint || widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [ngModel]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\r\n [value]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RADIO_BUTTON\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-radio-group\r\n class=\"input radio-section widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n aria-label=\"{{ widgetInstance.label }}\"\r\n appearance=\"outline\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <div [ngClass]=\"getDirection()\">\r\n <div class=\"radio-item-container\" *ngFor=\"let radio of widgetInstance.valueList\">\r\n <img\r\n *ngIf=\"radio.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"radio-item-image\"\r\n [src]=\"radio.imageUrl\"\r\n />\r\n <mat-radio-button\r\n class=\"selecatbleObject\"\r\n value=\"{{ radio.value }}\"\r\n [ngClass]=\"getDirection()\"\r\n (change)=\"onValueChange?.next(radio.value)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n >\r\n {{ radio.label }}\r\n </mat-radio-button>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\r\n class=\"datePicker widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"onBlur?.next(widgetInstance)\"></mat-datepicker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [min]=\"widgetInstance.minDate ?? null\"\r\n [max]=\"widgetInstance.maxDate ?? null\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\r\n <ngx-mat-datetime-picker\r\n #picker\r\n [showSpinners]=\"true\"\r\n [showSeconds]=\"false\"\r\n [stepHour]=\"1\"\r\n [stepMinute]=\"1\"\r\n [stepSecond]=\"10\"\r\n [touchUi]=\"false\"\r\n [color]=\"'primary'\"\r\n [enableMeridian]=\"false\"\r\n [disableMinute]=\"false\"\r\n [hideTime]=\"false\"\r\n >\r\n </ngx-mat-datetime-picker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [ngxMatDatetimePicker]=\"picker\"\r\n [ngxMatDatetimePickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div> -->\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"dateTimePickerContainer\">\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"onBlur?.next(widgetInstance)\"></mat-datepicker>\r\n <input\r\n #dateInput\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onDatePickerBlur($event)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field\r\n *ngIf=\"hasCreated\"\r\n class=\"input widgetContent time\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <input\r\n #timeInput\r\n [formControlName]=\"widgetInstance.key + '-time'\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n (blur)=\"onTimePickerBlur($event)\"\r\n matInput\r\n />\r\n </mat-form-field>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"onBlur?.next(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon>\r\n {{ innerOption.label }}\r\n </mat-option>\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n multiple\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"onBlur?.next(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon\r\n >{{ innerOption.label }}</mat-option\r\n >\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TIME\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n [value]=\"getTime()\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <mat-slide-toggle\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n value=\"{{ widgetInstance.value }}\"\r\n (change)=\"onValueChange?.next($event)\"\r\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\r\n >{{ !widgetInstance.showLabel ? widgetInstance.label : '' }}</mat-slide-toggle\r\n ><span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.INDICATOR\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"smartIndicator widgetContent\">\r\n <div class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\" [ngClass]=\"getNgClass()\">\r\n <div\r\n *ngFor=\"let item of indicatorItems; let i = index\"\r\n class=\"indicatorItem\"\r\n [ngClass]=\"getIndicatorItemClass(i)\"\r\n ></div>\r\n </div>\r\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\r\n {{ getIndicatorStatusLabel() }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.FILE_UPLOADER\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <smartfileuploader\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [uploadCallback]=\"upload.bind(this)\"\r\n [fileFormats]=\"widgetInstance.fileFormats\"\r\n [maxSizeMb]=\"widgetInstance.maxSizeMb\"\r\n [i18n]=\"widgetInstance.i18n\"\r\n ></smartfileuploader>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.IMAGE\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <img\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [src]=\"widgetInstance.value\"\r\n />\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"getWidgetSvg(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.DIVIDER\" class=\"widgetContainer\">\r\n <hr\r\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n />\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.BUTTON\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <button\r\n mat-button\r\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\r\n [color]=\"widgetInstance.uiActionDescriptor?.color\"\r\n (click)=\"onButtonClicked(widgetInstance)\"\r\n >\r\n <div\r\n *ngIf=\"isOnlyIcon(widgetInstance.uiActionDescriptor); then iconOnly; else text\"\r\n ></div>\r\n <ng-template #iconOnly>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.uiActionDescriptor?.icon\"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n <ng-template #text>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'PRE'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n {{ widgetInstance.uiActionDescriptor?.title }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'POST'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"widgetContainer\">\r\n <h4\r\n class=\"labelContainer\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.COMPONENT && widgetInstance.showLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"widgetContent\">\r\n <ng-template #customComponent></ng-template>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <quill-editor\r\n #quillEditor\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [modules]=\"widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\"\r\n [placeholder]=\"widgetInstance.placeholder\"\r\n [readOnly]=\"widgetInstance.isReadonly\"\r\n [maxLength]=\"widgetInstance.maxLength\"\r\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\r\n ></quill-editor>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n class=\"rich-text-editor-leeway-counter\"\r\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\r\n >\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MATRIX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n\r\n <table class=\"matrixTable widgetContent\">\r\n <tr>\r\n <th></th>\r\n <th class=\"optionLabel\" *ngFor=\"let option of widgetInstance.value.columns\">\r\n {{ option.displayValue }}\r\n </th>\r\n </tr>\r\n <tr *ngFor=\"let question of widgetInstance.value.rows; let i = index\">\r\n <th class=\"questionLabel\">\r\n <label>{{ question.displayValue }}</label>\r\n </th>\r\n\r\n <td class=\"selectTd\" *ngFor=\"let option of widgetInstance.value.columns; let j = index\">\r\n <mat-radio-group\r\n *ngIf=\"!widgetInstance.isMultiple\"\r\n [formControlName]=\"widgetInstance.key + '.' + question.code\"\r\n [name]=\"'q' + i\"\r\n >\r\n <mat-radio-button [value]=\"option.code\"> </mat-radio-button>\r\n </mat-radio-group>\r\n <div *ngIf=\"widgetInstance.isMultiple\">\r\n <mat-checkbox\r\n [formControlName]=\"widgetInstance.key + '.data.' + question.code + '.' + option.code\"\r\n [value]=\"widgetInstance.value['data'][question.code][option.code]\"\r\n [checked]=\"true\"\r\n ></mat-checkbox>\r\n </div>\r\n </td>\r\n <br />\r\n <button *ngIf=\"widgetInstance.button\" mat-icon-button (click)=\"removeMatrixRow(question)\"\r\n ><smart-icon icon=\"close\"></smart-icon\r\n ></button>\r\n </tr>\r\n </table>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <youtube-player\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n videoId=\"{{ widgetInstance.videoId }}\"\r\n [width]=\"widgetInstance.width\"\r\n [height]=\"widgetInstance.height\"\r\n [startSeconds]=\"widgetInstance.startSeconds\"\r\n [endSeconds]=\"widgetInstance.endSeconds\"\r\n ></youtube-player>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MONTH_PICKER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <lib-smart-month-picker\r\n [widgetInstance]=\"widgetInstance\"\r\n (valueChange)=\"handleYearMonthPicked($event)\"\r\n ></lib-smart-month-picker>\r\n </div>\r\n</div>\r\n", styles: ["@import\"~quill/dist/quill.snow.css\";.checkbox-section,.radio-section{display:flex;flex-direction:column}.input{width:100%}.direction-col{display:flex;flex-direction:column;gap:.5em}.direction-row{display:flex;flex-direction:row;align-items:center;gap:.5em}.selecatbleObject{margin:.5em}.radioLabel{color:var(--primary-color);text-align:left!important}.container{height:100%}.input{height:100%;display:flex;flex-direction:column}.checkbox{flex-direction:column}.mat-form-field-wrapper{padding-bottom:0!important}.input .mat-standard-chip.mat-chip-with-trailing-icon{padding-right:12px}.time-picker{display:flex;flex-direction:row;height:100%;border:solid 2px lightgrey;padding:1em;border-radius:4px}.time-picker:hover{border-color:#000}::ng-deep .mat-h4 .mat-subheading-1 .mat-typography h4{margin:0}.label{margin:28px 0 8px}.smartIndicator{display:flex;flex-direction:column;gap:.25rem;width:-moz-fit-content;width:fit-content}.indicatorItems{display:flex;flex-direction:row;gap:.25rem}.indicatorItem{width:3rem;height:.25rem;background-color:#d3d3d3;border-radius:.5rem}.radio-error{width:-moz-fit-content;width:fit-content;display:flex;flex-direction:row;gap:.5rem}.mat-calendar-previous-button,.mat-calendar-next-button{padding:0;min-width:0;width:40px!important;height:40px!important;flex-shrink:0;line-height:40px;border-radius:50%}.mat-calendar-arrow{height:36px!important;display:flex!important;flex-direction:column!important;justify-content:center}.radio-item-container,.checkbox-item-container{display:flex;flex-direction:column}.widgetContent::ng-deep .ql-container{height:200px;width:460px}.dateTimePickerContainer{display:flex;flex-direction:row;gap:.25rem;max-width:225px}.date{width:125px}.time{width:90px}.date .mat-form-field-infix,.time .mat-form-field-infix{width:inherit!important}::ng-deep .mat-icon.mat-drag-indicator{--drag-indicator: #3b3b3b;color:var(--drag-indicator)}.matrixTable{width:100%;border-spacing:0 1rem}.matrixTable th{padding:.25rem}.matrixTable .optionLabel,.matrixTable td{text-align:center}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}\n"], components: [{ type: SmartformwidgetComponent, selector: "smartformwidget", inputs: ["form", "widgetInstance", "onBlur", "onValueChange", "labelColor", "sophisticatedValueChange"] }, { type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i9.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color"] }, { type: i10.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id"] }, { type: i11.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i12.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i13.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { type: i14.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { type: i14.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { type: i15.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i8.MatOptgroup, selector: "mat-optgroup", inputs: ["disabled"], exportAs: ["matOptgroup"] }, { type: i16.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i17.SmartfileuploaderComponent, selector: "smartfileuploader", inputs: ["uploadCallback", "fileFormats", "maxSizeMb", "i18n", "useIconButton", "isMultiple"] }, { type: i18.QuillEditorComponent, selector: "quill-editor" }, { type: i19.SortableWidgetComponent, selector: "lib-sortable-widget", inputs: ["widgetInstance"] }, { type: i20.YouTubePlayer, selector: "youtube-player", inputs: ["videoId", "height", "width", "startSeconds", "endSeconds", "suggestedQuality", "playerVars", "showBeforeIframeApiLoads"], outputs: ["ready", "stateChange", "error", "apiChange", "playbackQualityChange", "playbackRateChange"] }, { type: i21.SmartMonthPickerComponent, selector: "lib-smart-month-picker", inputs: ["widgetInstance"], outputs: ["valueChange"] }], directives: [{ type: i22.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i22.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i23.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i23.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i23.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i24.TrackCapsDirective, selector: "[capsLock]", outputs: ["capsLock"] }, { type: i23.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i4.MatLabel, selector: "mat-label" }, { type: i25.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i22.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i26.NgxMaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "leadZero", "triggerOnMaskChange", "apm", "inputTransformFn", "outputTransformFn", "keepCharacterPositions"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { type: i22.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i22.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i22.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i7.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i4.MatSuffix, selector: "[matSuffix]" }, { type: i4.MatPrefix, selector: "[matPrefix]" }, { type: i11.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i11.MatChipRemove, selector: "[matChipRemove]" }, { type: i11.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i13.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { type: i14.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }], pipes: { "async": i23.AsyncPipe, "highlight": i27.HighlightPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
739
+ SmartformwidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SmartformwidgetComponent, selector: "smartformwidget", inputs: { form: "form", widgetInstance: "widgetInstance", onBlur: "onBlur", onValueChange: "onValueChange", labelColor: "labelColor", sophisticatedValueChange: "sophisticatedValueChange" }, viewQueries: [{ propertyName: "chipInputChild", first: true, predicate: ["chipInput"], descendants: true }, { propertyName: "customComponentVcRef", first: true, predicate: ["customComponent"], descendants: true, read: ViewContainerRef }, { propertyName: "quill", first: true, predicate: ["quillEditor"], descendants: true }, { propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "dateInputChild", first: true, predicate: ["dateInput"], descendants: true }, { propertyName: "timeInputChild", first: true, predicate: ["timeInput"], descendants: true }, { propertyName: "childrenWidgetsQL", predicate: SmartformwidgetComponent, descendants: true }], ngImport: i0, template: "<div class=\"container\" [formGroup]=\"form\">\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n class=\"container\"\r\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\r\n >\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\" [ngClass]=\"getDirection()\">\r\n <smartformwidget\r\n *ngFor=\"let widget of widgetInstance.valueList\"\r\n [form]=\"form\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor\"\r\n ></smartformwidget>\r\n </div>\r\n\r\n <div\r\n (capsLock)=\"capsOn = $event\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n\r\n <input\r\n *ngIf=\"!widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.inputmode]=\"\r\n widgetInstance.inputMode ? widgetInstance.inputMode.toLocaleLowerCase() : 'text'\r\n \"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\r\n [mask]=\"widgetInstance.mask ?? ''\"\r\n (keydown.enter)=\"onKeydown()\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n />\r\n <input\r\n *ngIf=\"widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\r\n [matAutocomplete]=\"textFieldAuto\"\r\n (keydown.enter)=\"onKeydown()\"\r\n />\r\n <button\r\n *ngIf=\"widgetInstance.isPassword\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <mat-icon>{{ hidePassword ? 'visibility_off' : 'visibility' }}</mat-icon>\r\n </button>\r\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option.label\">\r\n <span [innerHTML]=\"option.label | highlight : toHighlight\"></span>\r\n </mat-option>\r\n </mat-autocomplete>\r\n <span class=\"mat-error\" *ngIf=\"capsOn && widgetInstance.isPassword\">\r\n {{ widgetInstance.capsLockWarning }}\r\n </span>\r\n\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n\r\n <span matPrefix>\r\n <smart-icon\r\n *ngIf=\"capsOn && widgetInstance.isPassword\"\r\n [icon]=\"widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\"\r\n color=\"warn\"\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.icon && widgetInstance.iconPosition === 'PRE'\"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n ></smart-icon>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n [color]=\"widgetInstance.textFieldButton.iconColor\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{ widgetInstance.maxLength - form.controls[widgetInstance.key].value.length }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [type]=\"'number'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [min]=\"widgetInstance.minValues ?? null\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <span matPrefix>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon *ngIf=\"widgetInstance.icon\" [icon]=\"widgetInstance.icon\" matSuffix>\r\n </smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-list #chipList aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ value }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n <input\r\n #chipInput\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"addOnBlur\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [matAutocomplete]=\"chipAuto\"\r\n (matChipInputTokenEnd)=\"add($event)\"\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n <mat-autocomplete\r\n #chipAuto=\"matAutocomplete\"\r\n (optionSelected)=\"selected($event, widgetInstance)\"\r\n >\r\n <mat-option\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let item of widgetInstance.valueList\"\r\n [value]=\"item.value\"\r\n >\r\n {{ item.label }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-chip-list>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-list #chipListLookup aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ getChipsValue(value) }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n <input\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipListLookup\"\r\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"false\"\r\n [readonly]=\"true\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n </mat-chip-list>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <textarea\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n ></textarea>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{ widgetInstance.maxLength - form.controls[widgetInstance.key].value.length }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance.hint || widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [ngModel]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\r\n [value]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RADIO_BUTTON\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-radio-group\r\n class=\"input radio-section widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n aria-label=\"{{ widgetInstance.label }}\"\r\n appearance=\"outline\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <div [ngClass]=\"getDirection()\">\r\n <div class=\"radio-item-container\" *ngFor=\"let radio of widgetInstance.valueList\">\r\n <img\r\n *ngIf=\"radio.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"radio-item-image\"\r\n [src]=\"radio.imageUrl\"\r\n />\r\n <mat-radio-button\r\n class=\"selecatbleObject\"\r\n value=\"{{ radio.value }}\"\r\n [ngClass]=\"getDirection()\"\r\n (change)=\"onValueChange?.next(radio.value)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n >\r\n {{ radio.label }}\r\n </mat-radio-button>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\r\n class=\"datePicker widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"onBlur?.next(widgetInstance)\"></mat-datepicker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [min]=\"widgetInstance.minDate ?? null\"\r\n [max]=\"widgetInstance.maxDate ?? null\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\r\n <ngx-mat-datetime-picker\r\n #picker\r\n [showSpinners]=\"true\"\r\n [showSeconds]=\"false\"\r\n [stepHour]=\"1\"\r\n [stepMinute]=\"1\"\r\n [stepSecond]=\"10\"\r\n [touchUi]=\"false\"\r\n [color]=\"'primary'\"\r\n [enableMeridian]=\"false\"\r\n [disableMinute]=\"false\"\r\n [hideTime]=\"false\"\r\n >\r\n </ngx-mat-datetime-picker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [ngxMatDatetimePicker]=\"picker\"\r\n [ngxMatDatetimePickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div> -->\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"dateTimePickerContainer\">\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"onBlur?.next(widgetInstance)\"></mat-datepicker>\r\n <input\r\n #dateInput\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onDatePickerBlur($event)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field\r\n *ngIf=\"hasCreated\"\r\n class=\"input widgetContent time\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <input\r\n #timeInput\r\n [formControlName]=\"widgetInstance.key + '-time'\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n (blur)=\"onTimePickerBlur($event)\"\r\n matInput\r\n />\r\n </mat-form-field>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"onBlur?.next(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon>\r\n {{ innerOption.label }}\r\n </mat-option>\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n multiple\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"onBlur?.next(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon\r\n >{{ innerOption.label }}</mat-option\r\n >\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TIME\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n [value]=\"getTime()\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <mat-slide-toggle\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n value=\"{{ widgetInstance.value }}\"\r\n (change)=\"onValueChange?.next($event)\"\r\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\r\n >{{ !widgetInstance.showLabel ? widgetInstance.label : '' }}</mat-slide-toggle\r\n ><span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.INDICATOR\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"smartIndicator widgetContent\">\r\n <div class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\" [ngClass]=\"getNgClass()\">\r\n <div\r\n *ngFor=\"let item of indicatorItems; let i = index\"\r\n class=\"indicatorItem\"\r\n [ngClass]=\"getIndicatorItemClass(i)\"\r\n ></div>\r\n </div>\r\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\r\n {{ getIndicatorStatusLabel() }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.FILE_UPLOADER\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <smartfileuploader\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [uploadCallback]=\"upload.bind(this)\"\r\n [fileFormats]=\"widgetInstance.fileFormats\"\r\n [maxSizeMb]=\"widgetInstance.maxSizeMb\"\r\n [i18n]=\"widgetInstance.i18n\"\r\n ></smartfileuploader>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.IMAGE\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <img\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [src]=\"widgetInstance.value\"\r\n />\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"getWidgetSvg(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.DIVIDER\" class=\"widgetContainer\">\r\n <hr\r\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n />\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.BUTTON\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <button\r\n mat-button\r\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\r\n [color]=\"widgetInstance.uiActionDescriptor?.color\"\r\n (click)=\"onButtonClicked(widgetInstance)\"\r\n >\r\n <div\r\n *ngIf=\"isOnlyIcon(widgetInstance.uiActionDescriptor); then iconOnly; else text\"\r\n ></div>\r\n <ng-template #iconOnly>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.uiActionDescriptor?.icon\"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n <ng-template #text>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'PRE'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n {{ widgetInstance.uiActionDescriptor?.title }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'POST'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"widgetContainer\">\r\n <h4\r\n class=\"labelContainer\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.COMPONENT && widgetInstance.showLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"widgetContent\">\r\n <ng-template #customComponent></ng-template>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <quill-editor\r\n #quillEditor\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [modules]=\"widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\"\r\n [placeholder]=\"widgetInstance.placeholder\"\r\n [readOnly]=\"widgetInstance.isReadonly\"\r\n [maxLength]=\"widgetInstance.maxLength\"\r\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\r\n ></quill-editor>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n class=\"rich-text-editor-leeway-counter\"\r\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\r\n >\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MATRIX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n\r\n <table class=\"matrixTable widgetContent\">\r\n <tr>\r\n <th></th>\r\n <th class=\"optionLabel\" *ngFor=\"let option of widgetInstance.value.columns\">\r\n {{ option.displayValue }}\r\n </th>\r\n </tr>\r\n <tr *ngFor=\"let question of widgetInstance.value.rows; let i = index\">\r\n <th class=\"questionLabel\">\r\n <label>{{ question.displayValue }}</label>\r\n </th>\r\n\r\n <td class=\"selectTd\" *ngFor=\"let option of widgetInstance.value.columns; let j = index\">\r\n <mat-radio-group\r\n *ngIf=\"!widgetInstance.isMultiple\"\r\n [formControlName]=\"widgetInstance.key + '.' + question.code\"\r\n [name]=\"'q' + i\"\r\n >\r\n <mat-radio-button [value]=\"option.code\"> </mat-radio-button>\r\n </mat-radio-group>\r\n <div *ngIf=\"widgetInstance.isMultiple\">\r\n <mat-checkbox\r\n [formControlName]=\"widgetInstance.key + '.data.' + question.code + '.' + option.code\"\r\n [value]=\"widgetInstance.value['data'][question.code][option.code]\"\r\n [checked]=\"true\"\r\n ></mat-checkbox>\r\n </div>\r\n </td>\r\n <br />\r\n <button *ngIf=\"widgetInstance.button\" mat-icon-button (click)=\"removeMatrixRow(question)\"\r\n ><smart-icon icon=\"close\"></smart-icon\r\n ></button>\r\n </tr>\r\n </table>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <youtube-player\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n videoId=\"{{ widgetInstance.videoId }}\"\r\n [width]=\"widgetInstance.width\"\r\n [height]=\"widgetInstance.height\"\r\n [startSeconds]=\"widgetInstance.startSeconds\"\r\n [endSeconds]=\"widgetInstance.endSeconds\"\r\n ></youtube-player>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MONTH_PICKER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <lib-smart-month-picker\r\n [widgetInstance]=\"widgetInstance\"\r\n (valueChange)=\"handleYearMonthPicked($event)\"\r\n ></lib-smart-month-picker>\r\n </div>\r\n</div>\r\n", styles: ["@import\"~quill/dist/quill.snow.css\";.checkbox-section,.radio-section{display:flex;flex-direction:column}.input{width:100%}.direction-col{display:flex;flex-direction:column;gap:.5em}.direction-row{display:flex;flex-direction:row;align-items:center;gap:.5em}.selecatbleObject{margin:.5em}.radioLabel{color:var(--primary-color);text-align:left!important}.container{height:100%}.input{height:100%;display:flex;flex-direction:column}.checkbox{flex-direction:column}.mat-form-field-wrapper{padding-bottom:0!important}.input .mat-standard-chip.mat-chip-with-trailing-icon{padding-right:12px}.time-picker{display:flex;flex-direction:row;height:100%;border:solid 2px lightgrey;padding:1em;border-radius:4px}.time-picker:hover{border-color:#000}::ng-deep .mat-h4 .mat-subheading-1 .mat-typography h4{margin:0}.label{margin:28px 0 8px}.smartIndicator{display:flex;flex-direction:column;gap:.25rem;width:-moz-fit-content;width:fit-content}.indicatorItems{display:flex;flex-direction:row;gap:.25rem}.indicatorItem{width:3rem;height:.25rem;background-color:#d3d3d3;border-radius:.5rem}.radio-error{width:-moz-fit-content;width:fit-content;display:flex;flex-direction:row;gap:.5rem}.mat-calendar-previous-button,.mat-calendar-next-button{padding:0;min-width:0;width:40px!important;height:40px!important;flex-shrink:0;line-height:40px;border-radius:50%}.mat-calendar-arrow{height:36px!important;display:flex!important;flex-direction:column!important;justify-content:center}.radio-item-container,.checkbox-item-container{display:flex;flex-direction:column}.widgetContent::ng-deep .ql-container{height:200px;width:460px}.dateTimePickerContainer{display:flex;flex-direction:row;gap:.25rem;max-width:225px}.date{width:125px}.time{width:90px}.date .mat-form-field-infix,.time .mat-form-field-infix{width:inherit!important}::ng-deep .mat-icon.mat-drag-indicator{--drag-indicator: #3b3b3b;color:var(--drag-indicator)}.matrixTable{width:100%;border-spacing:0 1rem}.matrixTable th{padding:.25rem}.matrixTable .optionLabel,.matrixTable td{text-align:center}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}\n"], components: [{ type: SmartformwidgetComponent, selector: "smartformwidget", inputs: ["form", "widgetInstance", "onBlur", "onValueChange", "labelColor", "sophisticatedValueChange"] }, { type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i9.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color"] }, { type: i10.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id"] }, { type: i11.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i12.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i13.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { type: i14.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { type: i14.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { type: i15.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i8.MatOptgroup, selector: "mat-optgroup", inputs: ["disabled"], exportAs: ["matOptgroup"] }, { type: i16.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i17.SmartfileuploaderComponent, selector: "smartfileuploader", inputs: ["uploadCallback", "fileFormats", "maxSizeMb", "i18n", "useIconButton", "isMultiple"] }, { type: i18.QuillEditorComponent, selector: "quill-editor" }, { type: i19.SortableWidgetComponent, selector: "lib-sortable-widget", inputs: ["widgetInstance"] }, { type: i20.YouTubePlayer, selector: "youtube-player", inputs: ["videoId", "height", "width", "startSeconds", "endSeconds", "suggestedQuality", "playerVars", "showBeforeIframeApiLoads"], outputs: ["ready", "stateChange", "error", "apiChange", "playbackQualityChange", "playbackRateChange"] }, { type: i21.SmartMonthPickerComponent, selector: "lib-smart-month-picker", inputs: ["widgetInstance"], outputs: ["valueChange"] }], directives: [{ type: i22.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i22.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i23.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i23.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i23.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i24.TrackCapsDirective, selector: "[capsLock]", outputs: ["capsLock"] }, { type: i23.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i4.MatLabel, selector: "mat-label" }, { type: i25.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i22.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i26.NgxMaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "leadZero", "triggerOnMaskChange", "apm", "inputTransformFn", "outputTransformFn", "keepCharacterPositions"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { type: i22.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i22.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i22.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i7.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i4.MatSuffix, selector: "[matSuffix]" }, { type: i4.MatPrefix, selector: "[matPrefix]" }, { type: i11.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i11.MatChipRemove, selector: "[matChipRemove]" }, { type: i11.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i13.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { type: i14.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }], pipes: { "async": i23.AsyncPipe, "highlight": i27.HighlightPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
740
740
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SmartformwidgetComponent, decorators: [{
741
741
  type: Component,
742
- args: [{ selector: 'smartformwidget', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container\" [formGroup]=\"form\">\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n class=\"container\"\r\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\r\n >\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\" [ngClass]=\"getDirection()\">\r\n <smartformwidget\r\n *ngFor=\"let widget of widgetInstance.valueList\"\r\n [form]=\"form\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor\"\r\n ></smartformwidget>\r\n </div>\r\n\r\n <div\r\n (capsLock)=\"capsOn = $event\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n\r\n <input\r\n *ngIf=\"!widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.inputmode]=\"\r\n widgetInstance.inputMode ? widgetInstance.inputMode.toLocaleLowerCase() : 'text'\r\n \"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\r\n [mask]=\"widgetInstance.mask ?? ''\"\r\n (keydown.enter)=\"onKeydown()\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n />\r\n <input\r\n *ngIf=\"widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\r\n [matAutocomplete]=\"textFieldAuto\"\r\n (keydown.enter)=\"onKeydown()\"\r\n />\r\n <button\r\n *ngIf=\"widgetInstance.isPassword\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <mat-icon>{{ hidePassword ? 'visibility_off' : 'visibility' }}</mat-icon>\r\n </button>\r\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option.label\">\r\n <span [innerHTML]=\"option.label | highlight : toHighlight\"></span>\r\n </mat-option>\r\n </mat-autocomplete>\r\n <span class=\"mat-error\" *ngIf=\"capsOn && widgetInstance.isPassword\">\r\n {{ widgetInstance.capsLockWarning }}\r\n </span>\r\n\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n\r\n <span matPrefix>\r\n <smart-icon\r\n *ngIf=\"capsOn && widgetInstance.isPassword\"\r\n [icon]=\"widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\"\r\n color=\"warn\"\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.icon && widgetInstance.iconPosition === 'PRE'\"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n ></smart-icon>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n [color]=\"widgetInstance.textFieldButton.iconColor\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{ widgetInstance.maxLength - form.controls[widgetInstance.key].value.length }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [type]=\"'number'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [min]=\"widgetInstance.minValues ?? null\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <span matPrefix>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon *ngIf=\"widgetInstance.icon\" [icon]=\"widgetInstance.icon\" matSuffix>\r\n </smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-list #chipList aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ value }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n <input\r\n #chipInput\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"addOnBlur\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [matAutocomplete]=\"chipAuto\"\r\n (matChipInputTokenEnd)=\"add($event)\"\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n <mat-autocomplete\r\n #chipAuto=\"matAutocomplete\"\r\n (optionSelected)=\"selected($event, widgetInstance)\"\r\n >\r\n <mat-option\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let item of widgetInstance.valueList\"\r\n [value]=\"item.value\"\r\n >\r\n {{ item.label }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-chip-list>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-list #chipList aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ getChipsValue(value) }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n <input\r\n #chipInput\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"false\"\r\n [readonly]=\"true\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n </mat-chip-list>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <textarea\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n ></textarea>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{ widgetInstance.maxLength - form.controls[widgetInstance.key].value.length }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance.hint || widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [ngModel]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\r\n [value]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RADIO_BUTTON\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-radio-group\r\n class=\"input radio-section widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n aria-label=\"{{ widgetInstance.label }}\"\r\n appearance=\"outline\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <div [ngClass]=\"getDirection()\">\r\n <div class=\"radio-item-container\" *ngFor=\"let radio of widgetInstance.valueList\">\r\n <img\r\n *ngIf=\"radio.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"radio-item-image\"\r\n [src]=\"radio.imageUrl\"\r\n />\r\n <mat-radio-button\r\n class=\"selecatbleObject\"\r\n value=\"{{ radio.value }}\"\r\n [ngClass]=\"getDirection()\"\r\n (change)=\"onValueChange?.next(radio.value)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n >\r\n {{ radio.label }}\r\n </mat-radio-button>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\r\n class=\"datePicker widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"onBlur?.next(widgetInstance)\"></mat-datepicker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [min]=\"widgetInstance.minDate ?? null\"\r\n [max]=\"widgetInstance.maxDate ?? null\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\r\n <ngx-mat-datetime-picker\r\n #picker\r\n [showSpinners]=\"true\"\r\n [showSeconds]=\"false\"\r\n [stepHour]=\"1\"\r\n [stepMinute]=\"1\"\r\n [stepSecond]=\"10\"\r\n [touchUi]=\"false\"\r\n [color]=\"'primary'\"\r\n [enableMeridian]=\"false\"\r\n [disableMinute]=\"false\"\r\n [hideTime]=\"false\"\r\n >\r\n </ngx-mat-datetime-picker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [ngxMatDatetimePicker]=\"picker\"\r\n [ngxMatDatetimePickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div> -->\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"dateTimePickerContainer\">\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"onBlur?.next(widgetInstance)\"></mat-datepicker>\r\n <input\r\n #dateInput\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onDatePickerBlur($event)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field\r\n *ngIf=\"hasCreated\"\r\n class=\"input widgetContent time\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <input\r\n #timeInput\r\n [formControlName]=\"widgetInstance.key + '-time'\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n (blur)=\"onTimePickerBlur($event)\"\r\n matInput\r\n />\r\n </mat-form-field>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"onBlur?.next(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon>\r\n {{ innerOption.label }}\r\n </mat-option>\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n multiple\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"onBlur?.next(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon\r\n >{{ innerOption.label }}</mat-option\r\n >\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TIME\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n [value]=\"getTime()\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <mat-slide-toggle\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n value=\"{{ widgetInstance.value }}\"\r\n (change)=\"onValueChange?.next($event)\"\r\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\r\n >{{ !widgetInstance.showLabel ? widgetInstance.label : '' }}</mat-slide-toggle\r\n ><span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.INDICATOR\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"smartIndicator widgetContent\">\r\n <div class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\" [ngClass]=\"getNgClass()\">\r\n <div\r\n *ngFor=\"let item of indicatorItems; let i = index\"\r\n class=\"indicatorItem\"\r\n [ngClass]=\"getIndicatorItemClass(i)\"\r\n ></div>\r\n </div>\r\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\r\n {{ getIndicatorStatusLabel() }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.FILE_UPLOADER\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <smartfileuploader\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [uploadCallback]=\"upload.bind(this)\"\r\n [fileFormats]=\"widgetInstance.fileFormats\"\r\n [maxSizeMb]=\"widgetInstance.maxSizeMb\"\r\n [i18n]=\"widgetInstance.i18n\"\r\n ></smartfileuploader>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.IMAGE\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <img\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [src]=\"widgetInstance.value\"\r\n />\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"getWidgetSvg(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.DIVIDER\" class=\"widgetContainer\">\r\n <hr\r\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n />\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.BUTTON\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <button\r\n mat-button\r\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\r\n [color]=\"widgetInstance.uiActionDescriptor?.color\"\r\n (click)=\"onButtonClicked(widgetInstance)\"\r\n >\r\n <div\r\n *ngIf=\"isOnlyIcon(widgetInstance.uiActionDescriptor); then iconOnly; else text\"\r\n ></div>\r\n <ng-template #iconOnly>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.uiActionDescriptor?.icon\"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n <ng-template #text>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'PRE'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n {{ widgetInstance.uiActionDescriptor?.title }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'POST'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"widgetContainer\">\r\n <h4\r\n class=\"labelContainer\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.COMPONENT && widgetInstance.showLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"widgetContent\">\r\n <ng-template #customComponent></ng-template>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <quill-editor\r\n #quillEditor\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [modules]=\"widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\"\r\n [placeholder]=\"widgetInstance.placeholder\"\r\n [readOnly]=\"widgetInstance.isReadonly\"\r\n [maxLength]=\"widgetInstance.maxLength\"\r\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\r\n ></quill-editor>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n class=\"rich-text-editor-leeway-counter\"\r\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\r\n >\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MATRIX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n\r\n <table class=\"matrixTable widgetContent\">\r\n <tr>\r\n <th></th>\r\n <th class=\"optionLabel\" *ngFor=\"let option of widgetInstance.value.columns\">\r\n {{ option.displayValue }}\r\n </th>\r\n </tr>\r\n <tr *ngFor=\"let question of widgetInstance.value.rows; let i = index\">\r\n <th class=\"questionLabel\">\r\n <label>{{ question.displayValue }}</label>\r\n </th>\r\n\r\n <td class=\"selectTd\" *ngFor=\"let option of widgetInstance.value.columns; let j = index\">\r\n <mat-radio-group\r\n *ngIf=\"!widgetInstance.isMultiple\"\r\n [formControlName]=\"widgetInstance.key + '.' + question.code\"\r\n [name]=\"'q' + i\"\r\n >\r\n <mat-radio-button [value]=\"option.code\"> </mat-radio-button>\r\n </mat-radio-group>\r\n <div *ngIf=\"widgetInstance.isMultiple\">\r\n <mat-checkbox\r\n [formControlName]=\"widgetInstance.key + '.data.' + question.code + '.' + option.code\"\r\n [value]=\"widgetInstance.value['data'][question.code][option.code]\"\r\n [checked]=\"true\"\r\n ></mat-checkbox>\r\n </div>\r\n </td>\r\n <br />\r\n <button *ngIf=\"widgetInstance.button\" mat-icon-button (click)=\"removeMatrixRow(question)\"\r\n ><smart-icon icon=\"close\"></smart-icon\r\n ></button>\r\n </tr>\r\n </table>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <youtube-player\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n videoId=\"{{ widgetInstance.videoId }}\"\r\n [width]=\"widgetInstance.width\"\r\n [height]=\"widgetInstance.height\"\r\n [startSeconds]=\"widgetInstance.startSeconds\"\r\n [endSeconds]=\"widgetInstance.endSeconds\"\r\n ></youtube-player>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MONTH_PICKER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <lib-smart-month-picker\r\n [widgetInstance]=\"widgetInstance\"\r\n (valueChange)=\"handleYearMonthPicked($event)\"\r\n ></lib-smart-month-picker>\r\n </div>\r\n</div>\r\n", styles: ["@import\"~quill/dist/quill.snow.css\";.checkbox-section,.radio-section{display:flex;flex-direction:column}.input{width:100%}.direction-col{display:flex;flex-direction:column;gap:.5em}.direction-row{display:flex;flex-direction:row;align-items:center;gap:.5em}.selecatbleObject{margin:.5em}.radioLabel{color:var(--primary-color);text-align:left!important}.container{height:100%}.input{height:100%;display:flex;flex-direction:column}.checkbox{flex-direction:column}.mat-form-field-wrapper{padding-bottom:0!important}.input .mat-standard-chip.mat-chip-with-trailing-icon{padding-right:12px}.time-picker{display:flex;flex-direction:row;height:100%;border:solid 2px lightgrey;padding:1em;border-radius:4px}.time-picker:hover{border-color:#000}::ng-deep .mat-h4 .mat-subheading-1 .mat-typography h4{margin:0}.label{margin:28px 0 8px}.smartIndicator{display:flex;flex-direction:column;gap:.25rem;width:-moz-fit-content;width:fit-content}.indicatorItems{display:flex;flex-direction:row;gap:.25rem}.indicatorItem{width:3rem;height:.25rem;background-color:#d3d3d3;border-radius:.5rem}.radio-error{width:-moz-fit-content;width:fit-content;display:flex;flex-direction:row;gap:.5rem}.mat-calendar-previous-button,.mat-calendar-next-button{padding:0;min-width:0;width:40px!important;height:40px!important;flex-shrink:0;line-height:40px;border-radius:50%}.mat-calendar-arrow{height:36px!important;display:flex!important;flex-direction:column!important;justify-content:center}.radio-item-container,.checkbox-item-container{display:flex;flex-direction:column}.widgetContent::ng-deep .ql-container{height:200px;width:460px}.dateTimePickerContainer{display:flex;flex-direction:row;gap:.25rem;max-width:225px}.date{width:125px}.time{width:90px}.date .mat-form-field-infix,.time .mat-form-field-infix{width:inherit!important}::ng-deep .mat-icon.mat-drag-indicator{--drag-indicator: #3b3b3b;color:var(--drag-indicator)}.matrixTable{width:100%;border-spacing:0 1rem}.matrixTable th{padding:.25rem}.matrixTable .optionLabel,.matrixTable td{text-align:center}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}\n"] }]
742
+ args: [{ selector: 'smartformwidget', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container\" [formGroup]=\"form\">\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n class=\"container\"\r\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\r\n >\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\" [ngClass]=\"getDirection()\">\r\n <smartformwidget\r\n *ngFor=\"let widget of widgetInstance.valueList\"\r\n [form]=\"form\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor\"\r\n ></smartformwidget>\r\n </div>\r\n\r\n <div\r\n (capsLock)=\"capsOn = $event\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n\r\n <input\r\n *ngIf=\"!widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.inputmode]=\"\r\n widgetInstance.inputMode ? widgetInstance.inputMode.toLocaleLowerCase() : 'text'\r\n \"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\r\n [mask]=\"widgetInstance.mask ?? ''\"\r\n (keydown.enter)=\"onKeydown()\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n />\r\n <input\r\n *ngIf=\"widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\r\n [matAutocomplete]=\"textFieldAuto\"\r\n (keydown.enter)=\"onKeydown()\"\r\n />\r\n <button\r\n *ngIf=\"widgetInstance.isPassword\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <mat-icon>{{ hidePassword ? 'visibility_off' : 'visibility' }}</mat-icon>\r\n </button>\r\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option.label\">\r\n <span [innerHTML]=\"option.label | highlight : toHighlight\"></span>\r\n </mat-option>\r\n </mat-autocomplete>\r\n <span class=\"mat-error\" *ngIf=\"capsOn && widgetInstance.isPassword\">\r\n {{ widgetInstance.capsLockWarning }}\r\n </span>\r\n\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n\r\n <span matPrefix>\r\n <smart-icon\r\n *ngIf=\"capsOn && widgetInstance.isPassword\"\r\n [icon]=\"widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\"\r\n color=\"warn\"\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.icon && widgetInstance.iconPosition === 'PRE'\"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n ></smart-icon>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n [color]=\"widgetInstance.textFieldButton.iconColor\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{ widgetInstance.maxLength - form.controls[widgetInstance.key].value.length }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [type]=\"'number'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [min]=\"widgetInstance.minValues ?? null\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <span matPrefix>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon *ngIf=\"widgetInstance.icon\" [icon]=\"widgetInstance.icon\" matSuffix>\r\n </smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-list #chipList aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ value }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n <input\r\n #chipInput\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"addOnBlur\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [matAutocomplete]=\"chipAuto\"\r\n (matChipInputTokenEnd)=\"add($event)\"\r\n (blur)=\"onBlur?.next($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n <mat-autocomplete\r\n #chipAuto=\"matAutocomplete\"\r\n (optionSelected)=\"selected($event, widgetInstance)\"\r\n >\r\n <mat-option\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let item of widgetInstance.valueList\"\r\n [value]=\"item.value\"\r\n >\r\n {{ item.label }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-chip-list>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-list #chipListLookup aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ getChipsValue(value) }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n <input\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipListLookup\"\r\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"false\"\r\n [readonly]=\"true\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n </mat-chip-list>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <textarea\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next($event)\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n ></textarea>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{ widgetInstance.maxLength - form.controls[widgetInstance.key].value.length }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance.hint || widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [ngModel]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\r\n [value]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RADIO_BUTTON\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-radio-group\r\n class=\"input radio-section widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n aria-label=\"{{ widgetInstance.label }}\"\r\n appearance=\"outline\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <div [ngClass]=\"getDirection()\">\r\n <div class=\"radio-item-container\" *ngFor=\"let radio of widgetInstance.valueList\">\r\n <img\r\n *ngIf=\"radio.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"radio-item-image\"\r\n [src]=\"radio.imageUrl\"\r\n />\r\n <mat-radio-button\r\n class=\"selecatbleObject\"\r\n value=\"{{ radio.value }}\"\r\n [ngClass]=\"getDirection()\"\r\n (change)=\"onValueChange?.next(radio.value)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n >\r\n {{ radio.label }}\r\n </mat-radio-button>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\r\n class=\"datePicker widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"onBlur?.next(widgetInstance)\"></mat-datepicker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [min]=\"widgetInstance.minDate ?? null\"\r\n [max]=\"widgetInstance.maxDate ?? null\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\r\n <ngx-mat-datetime-picker\r\n #picker\r\n [showSpinners]=\"true\"\r\n [showSeconds]=\"false\"\r\n [stepHour]=\"1\"\r\n [stepMinute]=\"1\"\r\n [stepSecond]=\"10\"\r\n [touchUi]=\"false\"\r\n [color]=\"'primary'\"\r\n [enableMeridian]=\"false\"\r\n [disableMinute]=\"false\"\r\n [hideTime]=\"false\"\r\n >\r\n </ngx-mat-datetime-picker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [ngxMatDatetimePicker]=\"picker\"\r\n [ngxMatDatetimePickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div> -->\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"dateTimePickerContainer\">\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"onBlur?.next(widgetInstance)\"></mat-datepicker>\r\n <input\r\n #dateInput\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onDatePickerBlur($event)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field\r\n *ngIf=\"hasCreated\"\r\n class=\"input widgetContent time\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <input\r\n #timeInput\r\n [formControlName]=\"widgetInstance.key + '-time'\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n (blur)=\"onTimePickerBlur($event)\"\r\n matInput\r\n />\r\n </mat-form-field>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"onBlur?.next(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon>\r\n {{ innerOption.label }}\r\n </mat-option>\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n multiple\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"onBlur?.next(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon\r\n >{{ innerOption.label }}</mat-option\r\n >\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TIME\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n [value]=\"getTime()\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <mat-slide-toggle\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n value=\"{{ widgetInstance.value }}\"\r\n (change)=\"onValueChange?.next($event)\"\r\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\r\n >{{ !widgetInstance.showLabel ? widgetInstance.label : '' }}</mat-slide-toggle\r\n ><span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.INDICATOR\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"smartIndicator widgetContent\">\r\n <div class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\" [ngClass]=\"getNgClass()\">\r\n <div\r\n *ngFor=\"let item of indicatorItems; let i = index\"\r\n class=\"indicatorItem\"\r\n [ngClass]=\"getIndicatorItemClass(i)\"\r\n ></div>\r\n </div>\r\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\r\n {{ getIndicatorStatusLabel() }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.FILE_UPLOADER\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <smartfileuploader\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [uploadCallback]=\"upload.bind(this)\"\r\n [fileFormats]=\"widgetInstance.fileFormats\"\r\n [maxSizeMb]=\"widgetInstance.maxSizeMb\"\r\n [i18n]=\"widgetInstance.i18n\"\r\n ></smartfileuploader>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.IMAGE\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <img\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [src]=\"widgetInstance.value\"\r\n />\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"getWidgetSvg(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.DIVIDER\" class=\"widgetContainer\">\r\n <hr\r\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n />\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.BUTTON\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <button\r\n mat-button\r\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\r\n [color]=\"widgetInstance.uiActionDescriptor?.color\"\r\n (click)=\"onButtonClicked(widgetInstance)\"\r\n >\r\n <div\r\n *ngIf=\"isOnlyIcon(widgetInstance.uiActionDescriptor); then iconOnly; else text\"\r\n ></div>\r\n <ng-template #iconOnly>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.uiActionDescriptor?.icon\"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n <ng-template #text>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'PRE'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n {{ widgetInstance.uiActionDescriptor?.title }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'POST'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"widgetContainer\">\r\n <h4\r\n class=\"labelContainer\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.COMPONENT && widgetInstance.showLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"widgetContent\">\r\n <ng-template #customComponent></ng-template>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <quill-editor\r\n #quillEditor\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [modules]=\"widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\"\r\n [placeholder]=\"widgetInstance.placeholder\"\r\n [readOnly]=\"widgetInstance.isReadonly\"\r\n [maxLength]=\"widgetInstance.maxLength\"\r\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\r\n ></quill-editor>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n class=\"rich-text-editor-leeway-counter\"\r\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\r\n >\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MATRIX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n\r\n <table class=\"matrixTable widgetContent\">\r\n <tr>\r\n <th></th>\r\n <th class=\"optionLabel\" *ngFor=\"let option of widgetInstance.value.columns\">\r\n {{ option.displayValue }}\r\n </th>\r\n </tr>\r\n <tr *ngFor=\"let question of widgetInstance.value.rows; let i = index\">\r\n <th class=\"questionLabel\">\r\n <label>{{ question.displayValue }}</label>\r\n </th>\r\n\r\n <td class=\"selectTd\" *ngFor=\"let option of widgetInstance.value.columns; let j = index\">\r\n <mat-radio-group\r\n *ngIf=\"!widgetInstance.isMultiple\"\r\n [formControlName]=\"widgetInstance.key + '.' + question.code\"\r\n [name]=\"'q' + i\"\r\n >\r\n <mat-radio-button [value]=\"option.code\"> </mat-radio-button>\r\n </mat-radio-group>\r\n <div *ngIf=\"widgetInstance.isMultiple\">\r\n <mat-checkbox\r\n [formControlName]=\"widgetInstance.key + '.data.' + question.code + '.' + option.code\"\r\n [value]=\"widgetInstance.value['data'][question.code][option.code]\"\r\n [checked]=\"true\"\r\n ></mat-checkbox>\r\n </div>\r\n </td>\r\n <br />\r\n <button *ngIf=\"widgetInstance.button\" mat-icon-button (click)=\"removeMatrixRow(question)\"\r\n ><smart-icon icon=\"close\"></smart-icon\r\n ></button>\r\n </tr>\r\n </table>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <youtube-player\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n videoId=\"{{ widgetInstance.videoId }}\"\r\n [width]=\"widgetInstance.width\"\r\n [height]=\"widgetInstance.height\"\r\n [startSeconds]=\"widgetInstance.startSeconds\"\r\n [endSeconds]=\"widgetInstance.endSeconds\"\r\n ></youtube-player>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MONTH_PICKER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <lib-smart-month-picker\r\n [widgetInstance]=\"widgetInstance\"\r\n (valueChange)=\"handleYearMonthPicked($event)\"\r\n ></lib-smart-month-picker>\r\n </div>\r\n</div>\r\n", styles: ["@import\"~quill/dist/quill.snow.css\";.checkbox-section,.radio-section{display:flex;flex-direction:column}.input{width:100%}.direction-col{display:flex;flex-direction:column;gap:.5em}.direction-row{display:flex;flex-direction:row;align-items:center;gap:.5em}.selecatbleObject{margin:.5em}.radioLabel{color:var(--primary-color);text-align:left!important}.container{height:100%}.input{height:100%;display:flex;flex-direction:column}.checkbox{flex-direction:column}.mat-form-field-wrapper{padding-bottom:0!important}.input .mat-standard-chip.mat-chip-with-trailing-icon{padding-right:12px}.time-picker{display:flex;flex-direction:row;height:100%;border:solid 2px lightgrey;padding:1em;border-radius:4px}.time-picker:hover{border-color:#000}::ng-deep .mat-h4 .mat-subheading-1 .mat-typography h4{margin:0}.label{margin:28px 0 8px}.smartIndicator{display:flex;flex-direction:column;gap:.25rem;width:-moz-fit-content;width:fit-content}.indicatorItems{display:flex;flex-direction:row;gap:.25rem}.indicatorItem{width:3rem;height:.25rem;background-color:#d3d3d3;border-radius:.5rem}.radio-error{width:-moz-fit-content;width:fit-content;display:flex;flex-direction:row;gap:.5rem}.mat-calendar-previous-button,.mat-calendar-next-button{padding:0;min-width:0;width:40px!important;height:40px!important;flex-shrink:0;line-height:40px;border-radius:50%}.mat-calendar-arrow{height:36px!important;display:flex!important;flex-direction:column!important;justify-content:center}.radio-item-container,.checkbox-item-container{display:flex;flex-direction:column}.widgetContent::ng-deep .ql-container{height:200px;width:460px}.dateTimePickerContainer{display:flex;flex-direction:row;gap:.25rem;max-width:225px}.date{width:125px}.time{width:90px}.date .mat-form-field-infix,.time .mat-form-field-infix{width:inherit!important}::ng-deep .mat-icon.mat-drag-indicator{--drag-indicator: #3b3b3b;color:var(--drag-indicator)}.matrixTable{width:100%;border-spacing:0 1rem}.matrixTable th{padding:.25rem}.matrixTable .optionLabel,.matrixTable td{text-align:center}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}\n"] }]
743
743
  }], ctorParameters: function () { return [{ type: i1.SmartFormService }, { type: i2.ComponentFactoryService }, { type: i3.DomSanitizer }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { form: [{
744
744
  type: Input
745
745
  }], widgetInstance: [{
@@ -774,4 +774,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
774
774
  type: ViewChild,
775
775
  args: ['timeInput']
776
776
  }] } });
777
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LWZvcm0vd2lkZ2V0cy9zbWFydGZvcm13aWRnZXQvc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LWZvcm0vd2lkZ2V0cy9zbWFydGZvcm13aWRnZXQvc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBR1QsS0FBSyxFQUlMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlqRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQWMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRzVGLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsbUJBQW1CLEVBQ25CLDJCQUEyQixHQUM1QixNQUFNLHdCQUF3QixDQUFDO0FBR2hDLE9BQU8sRUFDTCxvQ0FBb0MsR0FJckMsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3RCO1lBQ0QsSUFBSSxjQUFjLElBQUksS0FBSyxFQUFFO2dCQUMzQixPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUM5QjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOztxSEEvM0JVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLHViQTBCRyxnQkFBZ0IsNFpBa0J4Qyx3QkFBd0IsZ0RDakd4QyxvaXdEQXk0Q0EscXBFRHAxQ2Esd0JBQXdCOzJGQUF4Qix3QkFBd0I7a0JBUHBDLFNBQVM7K0JBQ0UsaUJBQWlCLGlCQUdaLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07d01BT3RDLElBQUk7c0JBQVosS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQU1rQixjQUFjO3NCQUFyQyxTQUFTO3VCQUFDLFdBQVc7Z0JBV3RCLG9CQUFvQjtzQkFEbkIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFPOUIsS0FBSztzQkFBOUIsU0FBUzt1QkFBQyxhQUFhO2dCQVNGLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFHcEIsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLHdCQUF3QjtnQkF1SGQsY0FBYztzQkFBckMsU0FBUzt1QkFBQyxXQUFXO2dCQUNFLGNBQWM7c0JBQXJDLFNBQVM7dUJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENPTU1BLCBFTlRFUiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDaGlsZHJlbixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XHJcbmltcG9ydCB7IE1hdENoaXBJbnB1dEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJ2Zhc3QtZXF1YWxzJztcclxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBDb250ZW50Q2hhbmdlLCBRdWlsbEVkaXRvckNvbXBvbmVudCwgUXVpbGxNb2R1bGVzIH0gZnJvbSAnbmd4LXF1aWxsJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3RhcnRXaXRoLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnQtZmFjdG9yeS1zZXJ2aWNlL3Byb2plY3RzJztcclxuaW1wb3J0IHsgVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vdmlldy1jb250ZXh0L3NtYXJ0LXVpLWFjdGlvbi91aS1hY3Rpb24tdG9vbGJhci5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIFNtYXJ0Rm9ybVdpZGdldERpcmVjdGlvbixcclxuICBTbWFydEZvcm1XaWRnZXRUeXBlLFxyXG4gIFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uRW51bSxcclxufSBmcm9tICcuLi8uLi9hcGkvbW9kZWwvbW9kZWxzJztcclxuaW1wb3J0IHsgU21hcnRGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NtYXJ0Zm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU21hcnRCdXR0b24sIFNtYXJ0Rm9ybVdpZGdldCwgU21hcnRJdGVtLCBTbWFydE1hdHJpeCB9IGZyb20gJy4uLy4uL3NtYXJ0Zm9ybS5mb3JtLW1vZGVsJztcclxuaW1wb3J0IHtcclxuICBTbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24sXHJcbiAgU21hcnRWYWxpZGF0b3IsXHJcbiAgU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLFxyXG4gIFZhbHVlLFxyXG59IGZyb20gJy4uLy4uL3NtYXJ0Zm9ybS5tb2RlbCc7XHJcbmltcG9ydCB7IFNtYXJ0U3R5bGVVdGlsaXR5IH0gZnJvbSAnLi4vLi4vLi4vdmlldy1jb250ZXh0L3V0aWxpdHkvc21hcnQtc3R5bGUtdXRpbGl0eSc7XHJcblxyXG5leHBvcnQgY2xhc3MgU21hcnRXaWRnZXRTZXR0aW5ncyB7XHJcbiAgcHVibGljIHN0YXRpYyB1c2VVdGMgPSBmYWxzZTtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzbWFydGZvcm13aWRnZXQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zbWFydGZvcm13aWRnZXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NtYXJ0Zm9ybXdpZGdldC5jb21wb25lbnQuY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNtYXJ0Zm9ybXdpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICBwcml2YXRlIF9kZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGhpZGVQYXNzd29yZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIGZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgd2lkZ2V0SW5zdGFuY2UhOiBTbWFydEZvcm1XaWRnZXQ8YW55PjtcclxuICBASW5wdXQoKSBvbkJsdXI/OiBTdWJqZWN0PGFueT47XHJcbiAgQElucHV0KCkgb25WYWx1ZUNoYW5nZT86IFN1YmplY3Q8YW55PjtcclxuICBASW5wdXQoKSBsYWJlbENvbG9yPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSE6IFN1YmplY3Q8U29waGlzdGljYXRlZFZhbHVlQ2hhbmdlPjtcclxuXHJcbiAgc21hcnRGb3JtV2lkZ2V0VHlwZSA9IFNtYXJ0Rm9ybVdpZGdldFR5cGU7XHJcblxyXG4gIGNhcHNPbjogYW55O1xyXG5cclxuICBAVmlld0NoaWxkKCdjaGlwSW5wdXQnKSBjaGlwSW5wdXRDaGlsZD86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcblxyXG4gIGZpbHRlcmVkVmFsdWVMaXN0PzogT2JzZXJ2YWJsZTxzdHJpbmdbXSB8IHVuZGVmaW5lZD47XHJcblxyXG4gIGhhc0Vycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZXJyb3JLZXk/OiBzdHJpbmc7XHJcblxyXG4gIGluZGljYXRvckl0ZW1zPzogYW55W107XHJcblxyXG4gIC8vIGN1c3RvbUNvbXBvbmVudFxyXG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbUNvbXBvbmVudCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxyXG4gIGN1c3RvbUNvbXBvbmVudFZjUmVmPzogVmlld0NvbnRhaW5lclJlZjtcclxuICBjdXN0b21Db21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8YW55PjtcclxuXHJcbiAgZmlsdGVyZWRPcHRpb25zPzogT2JzZXJ2YWJsZTxTbWFydEl0ZW08YW55PltdPjtcclxuICB0b0hpZ2hsaWdodDogc3RyaW5nID0gJyc7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3F1aWxsRWRpdG9yJykgcXVpbGw/OiBRdWlsbEVkaXRvckNvbXBvbmVudDtcclxuXHJcbiAgaXNFbnRlclByZXNzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgaXNEYXRlUGlja2VyUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgU21hcnRXaWRnZXRIaW50UG9zaXRpb24gPSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbkVudW07XHJcblxyXG4gIC8vIHRvb2xiYXJcclxuICBAVmlld0NoaWxkKCd0b29sYmFyJykgdG9vbGJhcj86IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudDtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbihTbWFydGZvcm13aWRnZXRDb21wb25lbnQpXHJcbiAgY2hpbGRyZW5XaWRnZXRzUUw/OiBRdWVyeUxpc3Q8U21hcnRmb3Jtd2lkZ2V0Q29tcG9uZW50PjtcclxuXHJcbiAgZW1wdHlRdWlsbFRvb2xiYXI6IFF1aWxsTW9kdWxlcyA9IHtcclxuICAgIHRvb2xiYXI6IGZhbHNlLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBTbWFydEZvcm1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZlNlcnZpY2U6IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIHB1YmxpYyBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XHJcbiAgICApIHtcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3QgPSB0aGlzLnNlcnZpY2UuZmlsdGVyV2lkZ2V0c0J5VmlzaWJpbGl0eShcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZ2V0RXJyb3JNZXNzYWdlKHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLm9uQmx1cj8ucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmdldEVycm9yTWVzc2FnZSh0aGlzLndpZGdldEluc3RhbmNlKTtcclxuICAgIH0pO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yXHJcbiAgICApIHtcclxuICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yPy5pbmRpY2F0b3JMZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmluZGljYXRvckl0ZW1zID0gbmV3IEFycmF5PGFueT4odGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IuaW5kaWNhdG9yTGVuZ3RoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRlUHJvcGVydHldLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IpIHtcclxuICAgICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclZhbHVlID1cclxuICAgICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuY2hhbmdlSW5kaWNhdG9yU3RhdHVzKHZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2Uuc2VsZWN0aW9uXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLm9uVmFsdWVDaGFuZ2UhLnBpcGUoXHJcbiAgICAgICAgc3RhcnRXaXRoKCcnKSxcclxuICAgICAgICBtYXAoKHZhbHVlKSA9PiB0aGlzLl9maWx0ZXIodmFsdWUgfHwgJycpKSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUikge1xyXG4gICAgICBsZXQgdmlkZW9JZCA9IHRoaXMucGFyc2VZb3V0dWJlVXJsKHRoaXMud2lkZ2V0SW5zdGFuY2UubGluayEpO1xyXG4gICAgICBpZiAodmlkZW9JZCkgdGhpcy53aWRnZXRJbnN0YW5jZS52aWRlb0lkID0gdmlkZW9JZDtcclxuICAgICAgY29uc3QgdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XHJcblxyXG4gICAgICB0YWcuc3JjID0gJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGknO1xyXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhZyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZvcm1Db250cm9sczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZpbHRlcihcclxuICAgICAgKGtleTogc3RyaW5nKSA9PlxyXG4gICAgICAgIGtleSA9PT0gdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkgfHwga2V5LnN0YXJ0c1dpdGgoYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LmApXHJcbiAgICApO1xyXG5cclxuICAgIGZvcm1Db250cm9scy5tYXAoKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1trZXldLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUyAmJlxyXG4gICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVBcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZTogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlID0ge1xyXG4gICAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgICBraW5kOlxyXG4gICAgICAgICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVCB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJBRElPX0JVVFRPTlxyXG4gICAgICAgICAgICAgICAgICA/ICdzZWxlY3Rpb24nXHJcbiAgICAgICAgICAgICAgICAgIDogJ2Jhc2ljJyxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLm5leHQodmFsdWVDaGFuZ2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwYXJzZVlvdXR1YmVVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIHVybC5yZXBsYWNlKCcvc2hvcnRzLycsICcvd2F0Y2g/dj0nKTtcclxuXHJcbiAgICB2YXIgcmVnRXhwID0gL14uKigoeW91dHUuYmVcXC8pfCh2XFwvKXwoXFwvdVxcL1xcd1xcLyl8KGVtYmVkXFwvKXwod2F0Y2hcXD8pKVxcPz92Pz0/KFteIyY/XSopLiovO1xyXG4gICAgdmFyIG1hdGNoID0gdXJsLm1hdGNoKHJlZ0V4cCk7XHJcblxyXG4gICAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzddLmxlbmd0aCA9PSAxMSA/IG1hdGNoWzddIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBfaGFzSnVzdENoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZ2V0IGhhc0p1c3RDaGFuZ2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhc0p1c3RDaGFuZ2VkO1xyXG4gIH1cclxuICBzZXQgaGFzSnVzdENoYW5nZWQoaGFzSnVzdENoYW5nZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2hhc0p1c3RDaGFuZ2VkID0gaGFzSnVzdENoYW5nZWQ7XHJcbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyNTApKS50aGVuKCgpID0+IHtcclxuICAgICAgdGhpcy5faGFzSnVzdENoYW5nZWQgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFzQ3JlYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAVmlld0NoaWxkKCdkYXRlSW5wdXQnKSBkYXRlSW5wdXRDaGlsZD86IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgndGltZUlucHV0JykgdGltZUlucHV0Q2hpbGQ/OiBFbGVtZW50UmVmO1xyXG5cclxuICBvbkRhdGVQaWNrZXJCbHVyKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRoaXMub25CbHVyPy5uZXh0KHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xyXG4gICAgdGhpcy5oYW5kbGVEYXRlQ2hhbmdlZCh0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXS52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvblRpbWVQaWNrZXJCbHVyKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRoaXMub25CbHVyPy5uZXh0KHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xyXG4gICAgdGhpcy5oYW5kbGVUaW1lQ2hhbmdlZCh0aGlzLmZvcm0uY29udHJvbHNbYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LXRpbWVgXS52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCkge1xyXG4gICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudFJlZiA9IHRoaXMuY2ZTZXJ2aWNlLmNyZWF0ZUNvbXBvbmVudChcclxuICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudFZjUmVmISxcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmNvbXBvbmVudCxcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmlucHV0XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUiB8fFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTU9OVEhfUElDS0VSXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5pc0RhdGVQaWNrZXJSZXF1aXJlZCA9ICEhdGhpcy53aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzPy5zb21lKFxyXG4gICAgICAgIChzbWFydFZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpID0+IHNtYXJ0VmFsaWRhdG9yLnZhbGlkYXRvciA9PT0gVmFsaWRhdG9ycy5yZXF1aXJlZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgbGV0IHRpbWU7XHJcbiAgICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlKSB7XHJcbiAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlKTtcclxuICAgICAgICBsZXQgaG91ciA9IFNtYXJ0V2lkZ2V0U2V0dGluZ3MudXNlVXRjID8gZGF0ZS5nZXRVVENIb3VycygpIDogZGF0ZS5nZXRIb3VycygpO1xyXG4gICAgICAgIGxldCBtaW4gPSBTbWFydFdpZGdldFNldHRpbmdzLnVzZVV0YyA/IGRhdGUuZ2V0VVRDTWludXRlcygpIDogZGF0ZS5nZXRNaW51dGVzKCk7XHJcbiAgICAgICAgdGltZSA9IFN0cmluZyhob3VyKS5wYWRTdGFydCgyLCAnMCcpICsgJzonICsgU3RyaW5nKG1pbikucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlID0gbW9tZW50KGRhdGUpO1xyXG4gICAgICAgIGNvbnN0IGRhdGVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV07XHJcbiAgICAgICAgaWYgKGRhdGVGb3JtQ29udHJvbCkge1xyXG4gICAgICAgICAgZGF0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aW1lID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcbiAgICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICB2YWxpZGF0b3JzID0gdGhpcy53aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzPy5tYXAoKHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpID0+IHtcclxuICAgICAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdG9yO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB0aW1lRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodGltZSwgdmFsaWRhdG9ycyk7XHJcblxyXG4gICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkKSB7XHJcbiAgICAgICAgdGltZUZvcm1Db250cm9sLmRpc2FibGUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LXRpbWVgLCB0aW1lRm9ybUNvbnRyb2wpO1xyXG5cclxuICAgICAgdGhpcy5oYXNDcmVhdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleSFdLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoX21vbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZURhdGVDaGFuZ2VkKF9tb21lbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB0aGlzLmZvcm0uY29udHJvbHNbYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LXRpbWVgXS52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHRpbWVWYWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZVRpbWVDaGFuZ2VkKHRpbWVWYWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVEYXRlQ2hhbmdlZChfbW9tZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlzRGF0ZUZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmRhdGVJbnB1dENoaWxkPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgaXNUaW1lRm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudGltZUlucHV0Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBkYXRlRm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXTtcclxuICAgIGNvbnN0IHRpbWVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1tgJHt0aGlzLndpZGdldEluc3RhbmNlLmtleX0tdGltZWBdO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuaXNEYXRlUGlja2VyUmVxdWlyZWQgJiZcclxuICAgICAgdGltZUZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSAmJlxyXG4gICAgICAhX21vbWVudFxyXG4gICAgKSB7XHJcbiAgICAgIHRpbWVGb3JtQ29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICB0aW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUoJycpO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgIXRoaXMuaXNEYXRlUGlja2VyUmVxdWlyZWQgJiZcclxuICAgICAgIXRpbWVGb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgJiZcclxuICAgICAgX21vbWVudFxyXG4gICAgKSB7XHJcbiAgICAgIHRpbWVGb3JtQ29udHJvbC5hZGRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgICAgaWYgKHRpbWVGb3JtQ29udHJvbC52YWx1ZSA9PT0gJycpIHtcclxuICAgICAgICB0aW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUodW5kZWZpbmVkKTtcclxuICAgICAgICB0aW1lRm9ybUNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIV9tb21lbnQgfHwgaXNEYXRlRm9jdXNlZCB8fCBpc1RpbWVGb2N1c2VkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNKdXN0Q2hhbmdlZCkge1xyXG4gICAgICB0aGlzLmhhc0p1c3RDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aW1lVmFsdWUgPSB0aW1lRm9ybUNvbnRyb2wudmFsdWUgfHwgJzAwOjAwJztcclxuICAgIHRoaXMuaGFzSnVzdENoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUikge1xyXG4gICAgICB0aGlzLnNldERhdGVGb3JtQ29udHJvbChkYXRlRm9ybUNvbnRyb2wsIF9tb21lbnQsIHRpbWVWYWx1ZSk7XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUgPSBkYXRlRm9ybUNvbnRyb2wudmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUaW1lQ2hhbmdlZCh0aW1lVmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy50aW1lSW5wdXRDaGlsZD8ubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGRhdGVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleSFdO1xyXG4gICAgY29uc3QgdGltZUZvcm1Db250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW2Ake3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5fS10aW1lYF07XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5pc0RhdGVQaWNrZXJSZXF1aXJlZCAmJlxyXG4gICAgICBkYXRlRm9ybUNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpICYmXHJcbiAgICAgICF0aW1lVmFsdWVcclxuICAgICkge1xyXG4gICAgICBkYXRlRm9ybUNvbnRyb2wucmVtb3ZlVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgZGF0ZUZvcm1Db250cm9sLnNldFZhbHVlKGRhdGVGb3JtQ29udHJvbC52YWx1ZSA/PyAnJyk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAhdGhpcy5pc0RhdGVQaWNrZXJSZXF1aXJlZCAmJlxyXG4gICAgICAhZGF0ZUZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSAmJlxyXG4gICAgICB0aW1lVmFsdWVcclxuICAgICkge1xyXG4gICAgICBkYXRlRm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNGb2N1c2VkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNKdXN0Q2hhbmdlZCkge1xyXG4gICAgICB0aGlzLmhhc0p1c3RDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRpbWVWYWx1ZSkge1xyXG4gICAgICBpZiAodGltZUZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSkge1xyXG4gICAgICAgIHRpbWVGb3JtQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgX21vbWVudCA9IGRhdGVGb3JtQ29udHJvbC52YWx1ZTtcclxuXHJcbiAgICBpZiAoIV9tb21lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFzSnVzdENoYW5nZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSKSB7XHJcbiAgICAgIHRoaXMuc2V0RGF0ZUZvcm1Db250cm9sKGRhdGVGb3JtQ29udHJvbCwgX21vbWVudCwgdGltZVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RGF0ZUZvcm1Db250cm9sKGRhdGVGb3JtQ29udHJvbDogYW55LCBfbW9tZW50OiBhbnksIHRpbWVWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoX21vbWVudCkge1xyXG4gICAgICBsZXQgaG91ciA9IHRpbWVWYWx1ZS5zdWJzdHJpbmcoMCwgMik7XHJcbiAgICAgIGxldCBtaW4gPSB0aW1lVmFsdWUuc3Vic3RyaW5nKDMsIDUpO1xyXG4gICAgICBfbW9tZW50LmhvdXIoaG91cik7XHJcbiAgICAgIF9tb21lbnQubWludXRlKG1pbik7XHJcbiAgICAgIGRhdGVGb3JtQ29udHJvbC5zZXRWYWx1ZShfbW9tZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFRpbWUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUikge1xyXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMV0uc3Vic3RyaW5nKDAsIDUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgb25LZXlkb3duKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0VudGVyUHJlc3NlZCA9IHRydWU7XHJcblxyXG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwKSkudGhlbigoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNFbnRlclByZXNzZWQgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0VudGVyUHJlc3NlZCkge1xyXG4gICAgICB0aGlzLmhpZGVQYXNzd29yZCA9ICF0aGlzLmhpZGVQYXNzd29yZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE5nQ2xhc3MoKTogeyBbY2xhc3NOYW1lOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgcmV0dXJuIFNtYXJ0U3R5bGVVdGlsaXR5LmdldE5nQ2xhc3Nlcyh0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlKTtcclxuICB9XHJcblxyXG4gIGdldFN0eWxlKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH0ge1xyXG4gICAgaWYgKCF0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlKSB7XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUgPSB7XHJcbiAgICAgICAgY2xhc3Nlc1RvQWRkOiBbXSxcclxuICAgICAgICBjbGFzc2VzVG9SZW1vdmU6IFtdLFxyXG4gICAgICAgIHN0eWxlOiB7fSxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoISgnd2lkdGgnIGluIHRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUuc3R5bGUpICYmICdtaW5XaWR0aCcgaW4gdGhpcy53aWRnZXRJbnN0YW5jZSkge1xyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlLnN0eWxlWyd3aWR0aCddID0gYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5taW5XaWR0aH1weGA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU21hcnRTdHlsZVV0aWxpdHkuZ2V0TmdTdHlsZXModGhpcy53aWRnZXRJbnN0YW5jZS5zdHlsZSk7XHJcbiAgfVxyXG5cclxuICBnZXRMYWJlbE5nQ2xhc3MoKTogeyBbY2xhc3NOYW1lOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgaWYgKCdsYWJlbFN0eWxlJyBpbiB0aGlzLndpZGdldEluc3RhbmNlKSB7XHJcbiAgICAgIHJldHVybiBTbWFydFN0eWxlVXRpbGl0eS5nZXROZ0NsYXNzZXModGhpcy53aWRnZXRJbnN0YW5jZS5sYWJlbFN0eWxlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge307XHJcbiAgfVxyXG5cclxuICBnZXRMYWJlbFN0eWxlKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH0ge1xyXG4gICAgaWYgKCdsYWJlbFN0eWxlJyBpbiB0aGlzLndpZGdldEluc3RhbmNlKSB7XHJcbiAgICAgIHJldHVybiBTbWFydFN0eWxlVXRpbGl0eS5nZXROZ1N0eWxlcyh0aGlzLndpZGdldEluc3RhbmNlLmxhYmVsU3R5bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSBoYW5kbGVyIGZvciB0aGUgcG90ZW50aWFsbHkgcHJlc2VudCBRdWlsbCBlZGl0b3IsIGVuZm9yY2luZyBtYXggbGVuZ3RoIGxpbWl0cyBpZlxyXG4gICAqIG5lY2Vzc2FyeS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBjaGFuZ2UgdGhlIHtAbGluayBDb250ZW50Q2hhbmdlfSB0aGUgUXVpbGwgZWRpdG9yIGVtaXRzXHJcbiAgICogQHJldHVybnMge0Bjb2RlIHZvaWR9XHJcbiAgICovXHJcbiAgb25SaWNoVGV4dEVkaXRvckNvbnRlbnRDaGFuZ2VkKGNoYW5nZTogQ29udGVudENoYW5nZSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SSUNIX1RFWFQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdlIGFyZSBwZXJtaXR0ZWQgYSBudW1iZXIgb25lIGdyZWF0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkOiBUaGUgcXVpbGwgZWRpdG9yIGNvbnRhaW5zIGFuXHJcbiAgICAvLyB1bnJlbW92YWJsZSBuZXctbGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiBpdHMgY29udGVudC5cclxuICAgIGNvbnN0IG1heExlbmd0aDogbnVtYmVyID0gdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGggKyAxO1xyXG4gICAgaWYgKGNoYW5nZS50ZXh0Lmxlbmd0aCA8PSBtYXhMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGluc2VydE9wQ291bnQ6IG51bWJlciA9IGNoYW5nZS5kZWx0YS5vcHM/LmZpbHRlcigoaXQpID0+ICEhaXQuaW5zZXJ0KS5sZW5ndGggPz8gMDtcclxuICAgIGlmIChpbnNlcnRPcENvdW50ID4gMCkge1xyXG4gICAgICB0aGlzLnF1aWxsPy5xdWlsbEVkaXRvci5zZXRDb250ZW50cyhjaGFuZ2Uub2xkRGVsdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyB1c2VyLXNwYWNlIGNoYXJhY3RlcnMgYWxsb3dlZCB0byBiZSBlbnRlcmVkIGludG8gdGhlIFF1aWxsXHJcbiAgICogZWRpdG9yLlxyXG4gICAqXHJcbiAgICogPHA+XHJcbiAgICogVGhlIHJlYWwgbGVuZ3RoIG9mIHRoZSBlZGl0b3IncyBjb250ZW50IG1heSBiZSBtdWNoIGxvbmdlciAtIGFzIGl0IGlzIHBlcnNpc3RlZCBhcyBhbiBIVE1MXHJcbiAgICogZG9jdW1lbnQgZnJhZ21lbnQgYmVoaW5kIHRoZSBzY2VuZXMuIFRoaXMgbWV0aG9kIGlzIGNvbmNlcm5lZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhlXHJcbiAgICogdXNlciBwZXJjZWl2ZXMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB0aGUge0BsaW5rIG51bWJlcn0gb2YgcmVtYWluaW5nIHBlcm1pdHRlZCBjaGFyYWN0ZXJzIHRoZSB1c2VyIG1heSBpbnB1dCwgb3Ige0Bjb2RlIC0xfVxyXG4gICAqICAgICAgICAgIGlmIHRoZSBsZWV3YXkgaXMgbm90IGludGVycHJldGVkIGluIHRoZSBjb21wb25lbnQncyBjdXJyZW50IHN0YXRlXHJcbiAgICovXHJcbiAgZ2V0UmljaFRleHRFZGl0b3JMZW5ndGhMZWV3YXkoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUklDSF9URVhUKSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMud2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB3ZSBhcmUgcGVybWl0dGVkIGEgbnVtYmVyIG9uZSBncmVhdGVyIHRoYW4gdGhlIHJlcXVlc3RlZDogVGhlIHF1aWxsIGVkaXRvciBjb250YWlucyBhblxyXG4gICAgLy8gdW5yZW1vdmFibGUgbmV3LWxpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQgb2YgaXRzIGNvbnRlbnQuXHJcbiAgICBjb25zdCBtYXhMZW5ndGg6IG51bWJlciA9IHRoaXMud2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoICsgMTtcclxuICAgIGlmICh0aGlzLnF1aWxsKSB7XHJcbiAgICAgIC8vIHRoaXMgaXMgdGhlIGludGVuZGVkIHBhdGggKHVzZXIgaW5wdXQpOlxyXG4gICAgICByZXR1cm4gbWF4TGVuZ3RoIC0gdGhpcy5xdWlsbC5xdWlsbEVkaXRvci5nZXRUZXh0KCkubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZhbGxiYWNrIHRvIHRoZSByYXcgSFRNTCBjb250ZW50OlxyXG4gICAgcmV0dXJuIG1heExlbmd0aCAtIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgYWRkT25CbHVyID0gdHJ1ZTtcclxuICByZWFkb25seSBzZXBhcmF0b3JLZXlzQ29kZXMgPSBbRU5URVIsIENPTU1BXSBhcyBjb25zdDtcclxuICByZWFkb25seSBlbXB0eVNlcGFyYXRvcktleXNDb2RlcyA9IFtdIGFzIGNvbnN0O1xyXG5cclxuICBhZGQoZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnZhbHVlIHx8ICcnKS50cmltKCk7XHJcbiAgICBpZiAodGhpcy5zZXRUZXh0RmllbGRDaGlwc1ZhbHVlKHZhbHVlKSkge1xyXG4gICAgICBjb25zdCB2YWx1ZUNoYW5nZTogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlID0ge1xyXG4gICAgICAgIGtleTogdGhpcy53aWRnZXRJbnN0YW5jZS5rZXksXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUsXHJcbiAgICAgICAga2luZDogJ3NlbGVjdGlvbicsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLm5leHQodmFsdWVDaGFuZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsZWFyIHRoZSBpbnB1dCB2YWx1ZVxyXG4gICAgZXZlbnQuY2hpcElucHV0IS5jbGVhcigpO1xyXG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmUodmFsdWU6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTIHx8XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0xPT0tVUFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5pbmRleE9mKHZhbHVlKTtcclxuXHJcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlOiBTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UgPSB7XHJcbiAgICAgICAgICBrZXk6IHRoaXMud2lkZ2V0SW5zdGFuY2Uua2V5LFxyXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUsXHJcbiAgICAgICAgICBraW5kOiAnc2VsZWN0aW9uJyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLm5leHQodmFsdWVDaGFuZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgd2lkZ2V0SW5zdGFuY2U6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KTogdm9pZCB7XHJcbiAgICBsZXQgdmFsdWUgPSBldmVudC5vcHRpb24udmlld1ZhbHVlO1xyXG4gICAgaWYgKHRoaXMuc2V0VGV4dEZpZWxkQ2hpcHNWYWx1ZSh2YWx1ZSkpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUyB8fFxyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVBcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2U6IFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSA9IHtcclxuICAgICAgICAgIGtleTogd2lkZ2V0SW5zdGFuY2Uua2V5LFxyXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLFxyXG4gICAgICAgICAga2luZDogJ3NlbGVjdGlvbicsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZS5uZXh0KHZhbHVlQ2hhbmdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRUZXh0RmllbGRDaGlwc1ZhbHVlKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAodGhpcy53aWRnZXRJbnN0YW5jZS5tYXhWYWx1ZXMgJiZcclxuICAgICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUhLmxlbmd0aCA8IHRoaXMud2lkZ2V0SW5zdGFuY2UubWF4VmFsdWVzKSB8fFxyXG4gICAgICAgICF0aGlzLndpZGdldEluc3RhbmNlLm1heFZhbHVlc1xyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoIXRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUpIHtcclxuICAgICAgICAgIGxldCB2YWx1ZXMgPSBuZXcgQXJyYXk8T2JqZWN0PigpO1xyXG4gICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZSA9IHZhbHVlcztcclxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0uc2V0VmFsdWUodmFsdWVzKTtcclxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLnB1c2godmFsdWUpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXREaXJlY3Rpb24oKTogc3RyaW5nIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SQURJT19CVVRUT05cclxuICAgICkge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS5kaXJlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gJ2RpcmVjdGlvbi1yb3cnO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLndpZGdldEluc3RhbmNlLmRpcmVjdGlvbiA9PT0gU21hcnRGb3JtV2lkZ2V0RGlyZWN0aW9uLkNPTCkge1xyXG4gICAgICByZXR1cm4gJ2RpcmVjdGlvbi1jb2wnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICdkaXJlY3Rpb24tcm93JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNtYXJ0Rm9ybVRleHRGaWVsZEJ1dHRvbkljb25Qb3NpdGlvbigpOiB0eXBlb2YgU21hcnRGb3JtVGV4dEZpZWxkQnV0dG9uSWNvblBvc2l0aW9uIHtcclxuICAgIHJldHVybiBTbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBnZXRUeXBlKCk6IHR5cGVvZiBTbWFydEZvcm1XaWRnZXRUeXBlIHtcclxuICAgIHJldHVybiBTbWFydEZvcm1XaWRnZXRUeXBlO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0OiBTbWFydEZvcm1XaWRnZXQ8YW55Pik6IHN0cmluZyB7XHJcbiAgICBpZiAod2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIGlmICh3aWRnZXQubGFiZWwgPT09ICcnKSB7XHJcbiAgICAgIHJldHVybiB3aWRnZXQubGFiZWw7XHJcbiAgICB9XHJcbiAgICBsZXQgaXNSZXF1aXJlZCA9IGZhbHNlO1xyXG4gICAgaWYgKFxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5USU1FICYmXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRPR0dMRSAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT04gJiZcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UXHJcbiAgICApIHtcclxuICAgICAgaXNSZXF1aXJlZCA9IHdpZGdldC52YWxpZGF0b3JzPy5sZW5ndGggPyB0aGlzLmZpZWxkSXNSZXF1aXJlZCgpICYmICEhd2lkZ2V0LnNob3dMYWJlbCA6IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCkge1xyXG4gICAgICBpc1JlcXVpcmVkID0gd2lkZ2V0Lm1hcmtBc1JlcXVpcmVkID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGAke3dpZGdldC5sYWJlbH0ke2lzUmVxdWlyZWQgPyAnIConIDogJyd9YDtcclxuICB9XHJcblxyXG4gIGdldFdpZGdldFN2Zyh2YWx1ZT86IHN0cmluZyk6IFNhZmVIdG1sIHwgbnVsbCB7XHJcbiAgICBsZXQgc2FmZVZhbHVlID0gdmFsdWUgPz8gJyc7XHJcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoc2FmZVZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmllbGRJc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHZhbHVlID0gZmFsc2U7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5USU1FICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5UT0dHTEUgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNWRyAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlQgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXHJcbiAgICApIHtcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzPy5mb3JFYWNoKCh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB7XHJcbiAgICAgICAgaWYgKHZhbGlkYXRvci52YWxpZGF0b3IgPT0gVmFsaWRhdG9ycy5yZXF1aXJlZCkgdmFsdWUgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYXNDdXN0b21FcnJvcih3aWRnZXQ6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+LCB2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0LmtleV0gJiYgdGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldLmVycm9ycykge1xyXG4gICAgICAgIGxldCBoYXNFcnJvciA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXQua2V5XS5lcnJvcnMhKS5sZW5ndGhcclxuICAgICAgICAgID8gdGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldPy5kaXJ0eSB8fFxyXG4gICAgICAgICAgICAodGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgdmFsaWRhdG9yICYmXHJcbiAgICAgICAgICAgICAgKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXQua2V5XT8uZXJyb3JzKSFbdmFsaWRhdG9yLm5hbWVdKVxyXG4gICAgICAgICAgOiBmYWxzZTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAodmFsaWRhdG9yICYmIGhhc0Vycm9yICYmICF0aGlzLmVycm9yS2V5KSB8fFxyXG4gICAgICAgICAgKHZhbGlkYXRvciAmJiBoYXNFcnJvciAmJiB0aGlzLmVycm9yS2V5ID09PSB2YWxpZGF0b3IubmFtZSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5lcnJvcktleSA9IHZhbGlkYXRvci5uYW1lO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc0Vycm9yICYmIHZhbGlkYXRvciAmJiB0aGlzLmVycm9yS2V5ID09PSB2YWxpZGF0b3IubmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5lcnJvcktleSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhhc0Vycm9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvck1lc3NhZ2Uod2lkZ2V0SW5zdGFuY2U6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbiAgICBsZXQgZXJyb3JJY29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICBsZXQgZXJyb3JJY29uQ29sb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIGxldCB2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yO1xyXG4gICAgaWYgKFxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXHJcbiAgICApIHtcclxuICAgICAgaWYgKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldICYmIHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLmVycm9ycykge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMuZXJyb3JLZXkgJiZcclxuICAgICAgICAgICFPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS5lcnJvcnMhKS5pbmNsdWRlcyh0aGlzLmVycm9yS2V5ISlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3JLZXkgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoXHJcbiAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgaW5kZXggPCBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS5lcnJvcnMhKS5sZW5ndGg7XHJcbiAgICAgICAgICBpbmRleCsrXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBjb25zdCBlcnJvcktleSA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLmVycm9ycyEpW2luZGV4XTtcclxuICAgICAgICAgIGxldCBjdXN0b21WYWxpZGF0b3JPbldpZGdldCA9IHdpZGdldEluc3RhbmNlLnZhbGlkYXRvcnM/LmZpbHRlcihcclxuICAgICAgICAgICAgKHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpID0+IHZhbGlkYXRvci5uYW1lID09PSBlcnJvcktleVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmIChjdXN0b21WYWxpZGF0b3JPbldpZGdldCAmJiBjdXN0b21WYWxpZGF0b3JPbldpZGdldC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF0uZXJyb3JNZXNzYWdlITtcclxuICAgICAgICAgICAgZXJyb3JJY29uID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF0uaWNvbjtcclxuICAgICAgICAgICAgZXJyb3JJY29uQ29sb3IgPSBjdXN0b21WYWxpZGF0b3JPbldpZGdldFswXS5pY29uQ29sb3I7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvciA9IGN1c3RvbVZhbGlkYXRvck9uV2lkZ2V0WzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBjdXN0b21WYWxpZGF0b3JPbkZvcm0gPSB0aGlzLnNlcnZpY2Uuc21hcnRGb3JtPy52YWxpZGF0b3JzPy5maWx0ZXIoXHJcbiAgICAgICAgICAgICh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB2YWxpZGF0b3IubmFtZSA9PT0gZXJyb3JLZXlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoY3VzdG9tVmFsaWRhdG9yT25Gb3JtICYmIGN1c3RvbVZhbGlkYXRvck9uRm9ybS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gY3VzdG9tVmFsaWRhdG9yT25Gb3JtWzBdLmVycm9yTWVzc2FnZSE7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvciA9IGN1c3RvbVZhbGlkYXRvck9uRm9ybVswXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5oYXNDdXN0b21FcnJvcih3aWRnZXRJbnN0YW5jZSwgdmFsaWRhdG9yISkpIHtcclxuICAgICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvciA9IGVycm9yTWVzc2FnZSE7XHJcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uID0gZXJyb3JJY29uO1xyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID0gZXJyb3JJY29uQ29sb3I7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLmVycm9yID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW5kaWNhdG9ySXRlbUNsYXNzKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IpIHtcclxuICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yLmluZGljYXRvclZhbHVlID49IGluZGV4KSB7XHJcbiAgICAgICAgcmV0dXJuIGBzbWFydC1pbmRpY2F0b3ItJHtpbmRleH1gO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBnZXRJbmRpY2F0b3JTdGF0dXNMYWJlbENvbG9yKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUikge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsdWUgPSBNYXRoLmZsb29yKHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JWYWx1ZSk7XHJcbiAgICBpZiAodmFsdWUgPiB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yTGVuZ3RoIC0gMSkge1xyXG4gICAgICByZXR1cm4gYHNtYXJ0LWluZGljYXRvci1sYWJlbC0ke3RoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JMZW5ndGggLSAxfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYHNtYXJ0LWluZGljYXRvci1sYWJlbC0ke3ZhbHVlfWA7XHJcbiAgfVxyXG4gIGdldEluZGljYXRvclN0YXR1c0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUikge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsdWUgPSBNYXRoLmZsb29yKHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JWYWx1ZSk7XHJcbiAgICBpZiAodmFsdWUgPiB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yTGVuZ3RoIC0gMSkge1xyXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclN0YXR1c0xhYmVsc1tcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yTGVuZ3RoIC0gMVxyXG4gICAgICBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JTdGF0dXNMYWJlbHNbdmFsdWVdO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkKGZpbGVzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSKSB7XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudXBsb2FkQ2FsbGJhY2sodGhpcy53aWRnZXRJbnN0YW5jZS5rZXksIGZpbGVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEJ1dHRvblR5cGUoZGVzY3JpcHRvcjogYW55KTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoZGVzY3JpcHRvci50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ05PUk1BTCc6XHJcbiAgICAgICAgcmV0dXJuICdtYXQtYnV0dG9uJztcclxuICAgICAgY2FzZSAnRkxBVCc6XHJcbiAgICAgICAgcmV0dXJuICdtYXQtZmxhdC1idXR0b24nO1xyXG4gICAgICBjYXNlICdSQUlTRUQnOlxyXG4gICAgICAgIHJldHVybiAnbWF0LXJhaXNlZC1idXR0b24nO1xyXG4gICAgICBjYXNlICdTVFJPS0VEJzpcclxuICAgICAgICByZXR1cm4gJ21hdC1zdHJva2VkLWJ1dHRvbic7XHJcbiAgICAgIGNhc2UgJ0lDT04nOlxyXG4gICAgICAgIHJldHVybiAnbWF0LWljb24tYnV0dG9uJztcclxuICAgICAgY2FzZSAnTUlOSV9GQUInOlxyXG4gICAgICAgIHJldHVybiAnbWF0LW1pbmktZmFiJztcclxuICAgICAgY2FzZSAnRkFCJzpcclxuICAgICAgICByZXR1cm4gJ21hdC1mYWInO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBVbmhhbmRsZWQgYWN0aW9uIGJ1dHRvbiB0eXBlIGNhc2U6ICR7ZGVzY3JpcHRvci50eXBlfWApO1xyXG4gICAgICAgIHJldHVybiBgbWF0LWJ1dHRvbmA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc09ubHlJY29uKGRlc2NyaXB0b3I6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgZGVzY3JpcHRvci50eXBlID09PSAnSUNPTicgfHwgZGVzY3JpcHRvci50eXBlID09PSAnTUlOSV9GQUInIHx8IGRlc2NyaXB0b3IudHlwZSA9PT0gJ0ZBQidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvbkJ1dHRvbkNsaWNrZWQoaW5zdGFuY2U6IFNtYXJ0QnV0dG9uKTogdm9pZCB7XHJcbiAgICBpZiAoaW5zdGFuY2UudWlBY3Rpb24pIHtcclxuICAgICAgaW5zdGFuY2UuY2FsbGJhY2soaW5zdGFuY2UudWlBY3Rpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW5zdGFuY2UuY2FsbGJhY2soaW5zdGFuY2Uua2V5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2ZpbHRlcih2YWx1ZTogSW5wdXRFdmVudCk6IFNtYXJ0SXRlbTxhbnk+W10ge1xyXG4gICAgbGV0IGZpbHRlclZhbHVlID0gKHZhbHVlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8udmFsdWU7XHJcbiAgICB0aGlzLnRvSGlnaGxpZ2h0ID0gZmlsdGVyVmFsdWU7XHJcblxyXG4gICAgaWYgKCFmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICBmaWx0ZXJWYWx1ZSA9ICcnO1xyXG4gICAgICB0aGlzLnRvSGlnaGxpZ2h0ID0gZmlsdGVyVmFsdWU7XHJcbiAgICB9XHJcbiAgICBmaWx0ZXJWYWx1ZSA9IGZpbHRlclZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRCAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogU21hcnRJdGVtPGFueT5bXSA9IGZpbHRlclZhbHVlXHJcbiAgICAgICAgPyB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdC5maWx0ZXIoKG9wdGlvbjogU21hcnRJdGVtPGFueT4pID0+XHJcbiAgICAgICAgICAgIG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIDogdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3Q7XHJcbiAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwICYmIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0Lmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIHZhbHVlcyBhZnRlciB0aGUgZmlsdGVyIG9wZXJhdGlvbiBidXQgd2UgZm91bmQgbm9uZTpcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmVycm9yID0gdGhpcy53aWRnZXRJbnN0YW5jZS5maWx0ZXJFcnJvck1lc3NhZ2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gd2UgZWl0aGVyIGZvdW5kIHZhbHVlcywgb3IgdGhlcmUgd2VyZSBubyB2YWx1ZXMgdG8gYmVnaW4gd2l0aDpcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmVycm9yID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgZGF0ZUZpbHRlcihkOiBEYXRlIHwgbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXRNYXRyaXhEaXNwbGF5VmFsdWUocXVlc3Rpb246IFZhbHVlLCBrZXk6IHN0cmluZykge1xyXG4gICAgKHRoaXMud2lkZ2V0SW5zdGFuY2UgYXMgU21hcnRNYXRyaXgpLnZhbHVlW2tleV0uZmluZCgodmFsdWU6IFZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZS5jb2RlID09IHF1ZXN0aW9uLmNvZGUpIHJldHVybiBxdWVzdGlvbi5kaXNwbGF5VmFsdWU7XHJcbiAgICAgIGVsc2UgcmV0dXJuIHF1ZXN0aW9uLmNvZGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVllYXJNb250aFBpY2tlZCh5ZWFyTW9udGhWYWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnNldERhdGVGb3JtQ29udHJvbCh0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXSwgeWVhck1vbnRoVmFsdWUsICcwMDowMCcpO1xyXG4gIH1cclxuXHJcbiAgY29tcGFyZUl0ZW1zKG8xOiBhbnksIG8yOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGZ1bmN0aW9uIGNvbnZlcnQob2JqOiBhbnkpOiBhbnkge1xyXG4gICAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIG9iai5yZXBsYWNlKC9cXC52WzAtOV0rJC8sICcnKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG4gICAgLy8gY2FsbGluZyB0aGlzLnRydW5jYXRlVXJpIGRpZG4ndCB3b3JrXHJcbiAgICAvLyBUT0RPOiB1c2Ugd2lkZ2V0LnNlbGVjdGlvbi5wYXJhbWV0ZXIgZm9yIGlnbm9yZVVyaVZlcnNpb24gLyBzdHJpY3RVcmlDb21wYXJpc29uO1xyXG5cclxuICAgIGxldCB2MSA9IGNvbnZlcnQobzEpO1xyXG4gICAgbGV0IHYyID0gY29udmVydChvMik7XHJcbiAgICByZXR1cm4gZGVlcEVxdWFsKHYxLCB2Mik7XHJcbiAgfVxyXG5cclxuICB0cnVuY2F0ZVVyaSh1cmk6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodXJpICYmIHR5cGVvZiB1cmkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiB1cmkucmVwbGFjZSgvXFwudlswLTldKyQvLCAnJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXJpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTWF0cml4Um93KHF1ZXN0aW9uOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKHF1ZXN0aW9uKTtcclxuICAgICh0aGlzLndpZGdldEluc3RhbmNlIGFzIFNtYXJ0TWF0cml4KS5idXR0b24/LmNhbGxiYWNrKHRoaXMud2lkZ2V0SW5zdGFuY2UsIHF1ZXN0aW9uKTtcclxuICB9XHJcblxyXG4gIGlzVG9vbGJhclByZXNlbnQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTEQgfHxcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVBcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS50b29sYmFySWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLndpZGdldEluc3RhbmNlLnRvb2xiYXJJZCAhPT0gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldENoaXBzVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgaWYgKCduYW1lJyBpbiB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZVsnbmFtZSddO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICgnZGlzcGxheVZhbHVlJyBpbiB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZVsnZGlzcGxheVZhbHVlJ107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG4gIDxkaXZcclxuICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnXCJcclxuICAgIGNsYXNzPVwiY29udGFpbmVyXCJcclxuICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaXNWaXNpYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogd2lkZ2V0SW5zdGFuY2UuaXNWaXNpYmxlXCJcclxuICA+XHJcbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVJcIiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxyXG4gICAgICA8c21hcnRmb3Jtd2lkZ2V0XHJcbiAgICAgICAgKm5nRm9yPVwibGV0IHdpZGdldCBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcIlxyXG4gICAgICAgIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRcIlxyXG4gICAgICAgIGNsYXNzPVwiY29udGFpbmVyLWl0ZW1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldC5jc3NDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgW29uQmx1cl09XCJvbkJsdXJcIlxyXG4gICAgICAgIFtvblZhbHVlQ2hhbmdlXT1cIm9uVmFsdWVDaGFuZ2VcIlxyXG4gICAgICAgIFtzb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2VdPVwic29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXCJcclxuICAgICAgICBjbGFzcz1cInt7IHdpZGdldC5rZXkgfX1cIlxyXG4gICAgICAgIFtsYWJlbENvbG9yXT1cImxhYmVsQ29sb3JcIlxyXG4gICAgICA+PC9zbWFydGZvcm13aWRnZXQ+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2XHJcbiAgICAgIChjYXBzTG9jayk9XCJjYXBzT24gPSAkZXZlbnRcIlxyXG4gICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRFwiXHJcbiAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICBjbGFzcz1cImlucHV0IHRleHRGaWVsZCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvbWF0LWxhYmVsPlxyXG5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNlbGVjdGlvblwiXHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFthdHRyLmlucHV0bW9kZV09XCJcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaW5wdXRNb2RlID8gd2lkZ2V0SW5zdGFuY2UuaW5wdXRNb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiAndGV4dCdcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBbdHlwZV09XCInc3RyaW5nJ1wiXHJcbiAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVyPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICB0eXBlPVwie3sgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZCA/IChoaWRlUGFzc3dvcmQgPyAncGFzc3dvcmQnIDogJ3RleHQnKSA6ICcnIH19XCJcclxuICAgICAgICAgIFttYXNrXT1cIndpZGdldEluc3RhbmNlLm1hc2sgPz8gJydcIlxyXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25LZXlkb3duKClcIlxyXG4gICAgICAgICAgbWF4bGVuZ3RoPVwie3sgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoIH19XCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zZWxlY3Rpb25cIlxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbdHlwZV09XCInc3RyaW5nJ1wiXHJcbiAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVyPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICB0eXBlPVwie3sgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZCA/ICdwYXNzd29yZCcgOiAnJyB9fVwiXHJcbiAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cInRleHRGaWVsZEF1dG9cIlxyXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25LZXlkb3duKClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkXCJcclxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KCRldmVudClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj57eyBoaWRlUGFzc3dvcmQgPyAndmlzaWJpbGl0eV9vZmYnIDogJ3Zpc2liaWxpdHknIH19PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjdGV4dEZpZWxkQXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb24ubGFiZWxcIj5cclxuICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJvcHRpb24ubGFiZWwgfCBoaWdobGlnaHQgOiB0b0hpZ2hsaWdodFwiPjwvc3Bhbj5cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIiAqbmdJZj1cImNhcHNPbiAmJiB3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5jYXBzTG9ja1dhcm5pbmcgfX1cclxuICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHNwYW4gbWF0UHJlZml4PlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJjYXBzT24gJiYgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZFwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmNhcHNMb2NrV2FybmluZ0ljb24gPz8gJ2tleWJvYXJkX2NhcHNsb2NrJ1wiXHJcbiAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pY29uICYmIHdpZGdldEluc3RhbmNlLmljb25Qb3NpdGlvbiA9PT0gJ1BSRSdcIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcclxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmljb25Db2xvciA/PyAncHJpbWFyeSdcIlxyXG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnByZWZpeCB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5zdWZmaXggfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmljb24gJiZcclxuICAgICAgICAgICAgKCF3aWRnZXRJbnN0YW5jZS5pY29uUG9zaXRpb24gfHwgd2lkZ2V0SW5zdGFuY2UuaWNvblBvc2l0aW9uID09PSAnUE9TVCcpXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuaWNvblwiXHJcbiAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuaWNvbkNvbG9yID8/ICdwcmltYXJ5J1wiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICA+PC9zbWFydC1pY29uPlxyXG5cclxuICAgICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXJcclxuICAgICAgICAgICN0b29sYmFyXHJcbiAgICAgICAgICAqbmdJZj1cImlzVG9vbGJhclByZXNlbnQoKVwiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxyXG4gICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uXCJcclxuICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgY29sb3I9XCJ7eyB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uY29sb3IgfX1cIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5jYWxsYmFjayh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25Qb3NpdGlvbiA9PT1cclxuICAgICAgICAgICAgICAgIHNtYXJ0Rm9ybVRleHRGaWVsZEJ1dHRvbkljb25Qb3NpdGlvbigpLlBSRSAmJiB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvbkNvbG9yXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvc21hcnQtaWNvbj5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblBvc2l0aW9uID09PVxyXG4gICAgICAgICAgICAgICAgc21hcnRGb3JtVGV4dEZpZWxkQnV0dG9uSWNvblBvc2l0aW9uKCkuUE9TVCAmJiB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3NtYXJ0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPG1hdC1oaW50XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dDaGFyYWN0ZXJMaW1pdFN1ZmZpeCAmJiB3aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGhcIlxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICBhbGlnbj1cImVuZFwiXHJcbiAgICAgICAgICA+e3sgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoIC0gZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLmxlbmd0aCB9fTwvbWF0LWhpbnRcclxuICAgICAgICA+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtaGludFxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAhd2lkZ2V0SW5zdGFuY2U/LmhpbnQgfHwgd2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5JTlBVVFxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICAgID5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTlVNQkVSXCJcclxuICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgdGV4dEZpZWxkIHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICBbcmVhZG9ubHldPVwid2lkZ2V0SW5zdGFuY2UuaXNSZWFkb25seVwiXHJcbiAgICAgICAgICBbdHlwZV09XCInbnVtYmVyJ1wiXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgIFttaW5dPVwid2lkZ2V0SW5zdGFuY2UubWluVmFsdWVzID8/IG51bGxcIlxyXG4gICAgICAgICAgW21heF09XCJ3aWRnZXRJbnN0YW5jZS5tYXhWYWx1ZXMgPz8gbnVsbFwiXHJcbiAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVyPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gbWF0UHJlZml4PlxyXG4gICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UucHJlZml4IH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIG1hdFN1ZmZpeD5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnN1ZmZpeCB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c21hcnQtaWNvbiAqbmdJZj1cIndpZGdldEluc3RhbmNlLmljb25cIiBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCIgbWF0U3VmZml4PlxyXG4gICAgICAgIDwvc21hcnQtaWNvbj5cclxuICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvblwiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgIGNvbG9yPVwie3sgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmNvbG9yIH19XCJcclxuICAgICAgICAgIChjbGljayk9XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uY2FsbGJhY2sod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uUG9zaXRpb24gPT09XHJcbiAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QUkUgJiYgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25cclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPC9zbWFydC1pY29uPlxyXG4gICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmxhYmVsIH19XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uUG9zaXRpb24gPT09XHJcbiAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QT1NUICYmIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvc21hcnQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFNcIlxyXG4gICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxtYXQtY2hpcC1saXN0ICNjaGlwTGlzdCBhcmlhLWxhYmVsPVwie3sgd2lkZ2V0SW5zdGFuY2UubGFiZWwgfX1cIj5cclxuICAgICAgICAgIDxtYXQtY2hpcFxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZSh2YWx1ZSlcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyB2YWx1ZSB9fVxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdENoaXBSZW1vdmU+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9tYXQtY2hpcD5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAjY2hpcElucHV0XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgICBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBMaXN0XCJcclxuICAgICAgICAgICAgW21hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzXT1cInNlcGFyYXRvcktleXNDb2Rlc1wiXHJcbiAgICAgICAgICAgIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwiYWRkT25CbHVyXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImNoaXBBdXRvXCJcclxuICAgICAgICAgICAgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImFkZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXHJcbiAgICAgICAgICAgICNjaGlwQXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJzZWxlY3RlZCgkZXZlbnQsIHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiXHJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgPC9tYXQtY2hpcC1saXN0PlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTE9PS1VQXCJcclxuICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWxhYmVsXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LWNoaXAtbGlzdCAjY2hpcExpc3QgYXJpYS1sYWJlbD1cInt7IHdpZGdldEluc3RhbmNlLmxhYmVsIH19XCI+XHJcbiAgICAgICAgICA8bWF0LWNoaXBcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgdmFsdWUgb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmUodmFsdWUpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0Q2hpcHNWYWx1ZSh2YWx1ZSkgfX1cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbWF0LWNoaXA+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgI2NoaXBJbnB1dFxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiXHJcbiAgICAgICAgICAgIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJlbXB0eVNlcGFyYXRvcktleXNDb2Rlc1wiXHJcbiAgICAgICAgICAgIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9tYXQtY2hpcC1saXN0PlxyXG4gICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICAgI3Rvb2xiYXJcclxuICAgICAgICAgICpuZ0lmPVwiaXNUb29sYmFyUHJlc2VudCgpXCJcclxuICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLnRvb2xiYXJJZFwiXHJcbiAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9CT1hcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWxhYmVsXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgW3R5cGVdPVwiJ3N0cmluZydcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgIFtyZWFkb25seV09XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5XCJcclxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgIChibHVyKT1cIm9uQmx1cj8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgIG1heGxlbmd0aD1cInt7IHdpZGdldEluc3RhbmNlLm1heExlbmd0aCB9fVwiXHJcbiAgICAgICAgPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgIDxtYXQtaGludFxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93Q2hhcmFjdGVyTGltaXRTdWZmaXggJiYgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcclxuICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgYWxpZ249XCJlbmRcIlxyXG4gICAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLm1heExlbmd0aCAtIGZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5sZW5ndGggfX08L21hdC1oaW50XHJcbiAgICAgICAgPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWhpbnRcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgIXdpZGdldEluc3RhbmNlLmhpbnQgfHwgd2lkZ2V0SW5zdGFuY2UuaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXHJcbiAgICAgICAgXCJcclxuICAgICAgICA+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvbWF0LWhpbnRcclxuICAgICAgPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJpbnB1dCBjaGVja2JveCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJyYWRpb0xhYmVsXCIgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNoZWNrYm94LXNlY3Rpb25cIiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LWl0ZW0tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoZWNrYm94IG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdDsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAqbmdJZj1cImNoZWNrYm94LmltYWdlVXJsXCJcclxuICAgICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC1pdGVtLWltYWdlXCJcclxuICAgICAgICAgICAgICBbc3JjXT1cImNoZWNrYm94LmltYWdlVXJsXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2VsZWNhdGJsZU9iamVjdFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjaGVja2JveC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KGNoZWNrYm94KVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyBjaGVja2JveC5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWVycm9yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXzJcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImlucHV0IGNoZWNrYm94IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cInJhZGlvTGFiZWxcIiAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hlY2tib3gtc2VjdGlvblwiIFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtaXRlbS1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hlY2tib3ggb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0OyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICpuZ0lmPVwiY2hlY2tib3guaW1hZ2VVcmxcIlxyXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LWl0ZW0taW1hZ2VcIlxyXG4gICAgICAgICAgICAgIFtzcmNdPVwiY2hlY2tib3guaW1hZ2VVcmxcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY2F0YmxlT2JqZWN0XCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgKyAnLicgKyBjaGVja2JveC5rZXkgfX1cIlxyXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJjaGVja2JveC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KGNoZWNrYm94KVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQhXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGNoZWNrYm94LmxhYmVsIH19XHJcbiAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuUkFESU9fQlVUVE9OXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bWF0LXJhZGlvLWdyb3VwXHJcbiAgICAgICAgY2xhc3M9XCJpbnB1dCByYWRpby1zZWN0aW9uIHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgYXJpYS1sYWJlbD1cInt7IHdpZGdldEluc3RhbmNlLmxhYmVsIH19XCJcclxuICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJyYWRpb0xhYmVsXCIgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8taXRlbS1jb250YWluZXJcIiAqbmdGb3I9XCJsZXQgcmFkaW8gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XCI+XHJcbiAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAqbmdJZj1cInJhZGlvLmltYWdlVXJsXCJcclxuICAgICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJyYWRpby1pdGVtLWltYWdlXCJcclxuICAgICAgICAgICAgICBbc3JjXT1cInJhZGlvLmltYWdlVXJsXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b25cclxuICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjYXRibGVPYmplY3RcIlxyXG4gICAgICAgICAgICAgIHZhbHVlPVwie3sgcmFkaW8udmFsdWUgfX1cIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCJcclxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQocmFkaW8udmFsdWUpXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyByYWRpby5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpby1lcnJvclwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L21hdC1yYWRpby1ncm91cD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfUElDS0VSXCJcclxuICAgICAgY2xhc3M9XCJkYXRlUGlja2VyIHdpZGdldENvbnRhaW5lclwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IGRhdGUge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlciAoY2xvc2VkKT1cIm9uQmx1cj8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIj48L21hdC1kYXRlcGlja2VyPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgIFttaW5dPVwid2lkZ2V0SW5zdGFuY2UubWluRGF0ZSA/PyBudWxsXCJcclxuICAgICAgICAgIFttYXhdPVwid2lkZ2V0SW5zdGFuY2UubWF4RGF0ZSA/PyBudWxsXCJcclxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGlja2VyXCJcclxuICAgICAgICAgIChibHVyKT1cIm9uQmx1cj8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgICAgKGRhdGVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgICAgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwid2lkZ2V0SW5zdGFuY2UuZmlsdGVyID8/IGRhdGVGaWx0ZXJcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgIDxtYXQtaGludD5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmRhdGVGb3JtYXRIaW50IH19XHJcbiAgICAgICAgPC9tYXQtaGludD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gPGRpdlxyXG4gICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUlwiXHJcbiAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsXCI+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50XCJcclxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkZ2V0SW5zdGFuY2UubWluV2lkdGggKyAncHgnIH1cIlxyXG4gICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwiJGFueShwaWNrZXIpXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgPG5neC1tYXQtZGF0ZXRpbWUtcGlja2VyXHJcbiAgICAgICAgICAjcGlja2VyXHJcbiAgICAgICAgICBbc2hvd1NwaW5uZXJzXT1cInRydWVcIlxyXG4gICAgICAgICAgW3Nob3dTZWNvbmRzXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtzdGVwSG91cl09XCIxXCJcclxuICAgICAgICAgIFtzdGVwTWludXRlXT1cIjFcIlxyXG4gICAgICAgICAgW3N0ZXBTZWNvbmRdPVwiMTBcIlxyXG4gICAgICAgICAgW3RvdWNoVWldPVwiZmFsc2VcIlxyXG4gICAgICAgICAgW2NvbG9yXT1cIidwcmltYXJ5J1wiXHJcbiAgICAgICAgICBbZW5hYmxlTWVyaWRpYW5dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgW2Rpc2FibGVNaW51dGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgW2hpZGVUaW1lXT1cImZhbHNlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9uZ3gtbWF0LWRhdGV0aW1lLXBpY2tlcj5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgIFtuZ3hNYXREYXRldGltZVBpY2tlcl09XCJwaWNrZXJcIlxyXG4gICAgICAgICAgW25neE1hdERhdGV0aW1lUGlja2VyRmlsdGVyXT1cIndpZGdldEluc3RhbmNlLmZpbHRlciA/PyBkYXRlRmlsdGVyXCJcclxuICAgICAgICAgIChibHVyKT1cIm9uQmx1cj8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgIDxtYXQtaGludD5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmRhdGVGb3JtYXRIaW50IH19XHJcbiAgICAgICAgPC9tYXQtaGludD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICA8ZGl2XHJcbiAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSXCJcclxuICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRlVGltZVBpY2tlckNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IGRhdGUge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyIChjbG9zZWQpPVwib25CbHVyPy5uZXh0KHdpZGdldEluc3RhbmNlKVwiPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgI2RhdGVJbnB1dFxyXG4gICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGlja2VyXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25EYXRlUGlja2VyQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJ3aWRnZXRJbnN0YW5jZS5maWx0ZXIgPz8gZGF0ZUZpbHRlclwiXHJcbiAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgIDxtYXQtaGludD5cclxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZGF0ZUZvcm1hdEhpbnQgfX1cclxuICAgICAgICAgIDwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgICpuZ0lmPVwiaGFzQ3JlYXRlZFwiXHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQgdGltZVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiB3aWRnZXRJbnN0YW5jZS5taW5XaWR0aCArICdweCcgfVwiXHJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICN0aW1lSW5wdXRcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXkgKyAnLXRpbWUnXCJcclxuICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFt0eXBlXT1cIid0aW1lJ1wiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgICAoYmx1cik9XCJvblRpbWVQaWNrZXJCbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1RcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWxhYmVsXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LXNlbGVjdFxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudC52YWx1ZSlcIlxyXG4gICAgICAgICAgKGNsb3NlZCk9XCJvbkJsdXI/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkIVwiXHJcbiAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiXHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNvbXBhcmVXaXRoID09IG51bGwgPyBjb21wYXJlSXRlbXMgOiB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aFxyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgPyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciA6ICcnIH19XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXBcclxuICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi50eXBlID09PSBnZXRUeXBlKCkuSVRFTV9HUk9VUFwiXHJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5pc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW5uZXJPcHRpb24gb2Ygb3B0aW9uLnZhbHVlTGlzdFwiXHJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaW5uZXJPcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlubmVyT3B0aW9uLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaW5uZXJPcHRpb24uaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgIFtpY29uXT1cImlubmVyT3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICBbY29sb3JdPVwiaW5uZXJPcHRpb24uaWNvbkNvbG9yXCJcclxuICAgICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgICAgICB7eyBpbm5lck9wdGlvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gZ2V0VHlwZSgpLklURU1cIlxyXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24uaWNvblwiXHJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJvcHRpb24uaWNvblwiXHJcbiAgICAgICAgICAgICAgICBbY29sb3JdPVwib3B0aW9uLmljb25Db2xvclwiXHJcbiAgICAgICAgICAgICAgPjwvc21hcnQtaWNvblxyXG4gICAgICAgICAgICAgID57eyBvcHRpb24ubGFiZWwgfX08L21hdC1vcHRpb25cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1oaW50XHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICF3aWRnZXRJbnN0YW5jZT8uaGludCB8fCB3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXHJcbiAgICAgICAgXCJcclxuICAgICAgICA+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvbWF0LWhpbnRcclxuICAgICAgPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdlxyXG4gICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUX01VTFRJUExFXCJcclxuICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWxhYmVsXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LXNlbGVjdFxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgbXVsdGlwbGVcclxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQudmFsdWUpXCJcclxuICAgICAgICAgIChjbG9zZWQpPVwib25CbHVyPy5uZXh0KHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZCFcIlxyXG4gICAgICAgICAgW2NvbXBhcmVXaXRoXT1cIlxyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aCA9PSBudWxsID8gY29tcGFyZUl0ZW1zIDogd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGhcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyID8gd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgOiAnJyB9fVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGdyb3VwXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gZ2V0VHlwZSgpLklURU1fR1JPVVBcIlxyXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGlubmVyT3B0aW9uIG9mIG9wdGlvbi52YWx1ZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImlubmVyT3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpbm5lck9wdGlvbi5pc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImlubmVyT3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICBbaWNvbl09XCJpbm5lck9wdGlvbi5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImlubmVyT3B0aW9uLmljb25Db2xvclwiXHJcbiAgICAgICAgICAgICAgICA+PC9zbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICA+e3sgaW5uZXJPcHRpb24ubGFiZWwgfX08L21hdC1vcHRpb25cclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09IGdldFR5cGUoKS5JVEVNXCJcclxuICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgW2ljb25dPVwib3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIm9wdGlvbi5pY29uQ29sb3JcIlxyXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb25cclxuICAgICAgICAgICAgICA+e3sgb3B0aW9uLmxhYmVsIH19PC9tYXQtb3B0aW9uXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtaGludFxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAhd2lkZ2V0SW5zdGFuY2U/LmhpbnQgfHwgd2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5JTlBVVFxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICAgID5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMXCJcclxuICAgICAgY2xhc3M9XCJsYWJlbCB3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiB3aWRnZXRJbnN0YW5jZS5taW5XaWR0aCArICdweCcgfVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC10aXRsZSBsYWJlbENvbnRhaW5lclwiIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPHA+e3sgd2lkZ2V0SW5zdGFuY2Uud2lkZ2V0RGVzY3JpcHRpb24gfX08L3A+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVElNRVwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHRpbWUge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFt0eXBlXT1cIid0aW1lJ1wiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiZ2V0VGltZSgpXCJcclxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgIChibHVyKT1cIm9uQmx1cj8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVE9HR0xFXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250ZW50ICB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXHJcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxyXG4gICAgICAgICAgdmFsdWU9XCJ7eyB3aWRnZXRJbnN0YW5jZS52YWx1ZSB9fVwiXHJcbiAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbbGFiZWxQb3NpdGlvbl09XCJ3aWRnZXRJbnN0YW5jZS50b2dnbGVMYWJlbFBvc2l0aW9uID8/ICdiZWZvcmUnXCJcclxuICAgICAgICAgID57eyAhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsID8gd2lkZ2V0SW5zdGFuY2UubGFiZWwgOiAnJyB9fTwvbWF0LXNsaWRlLXRvZ2dsZVxyXG4gICAgICAgID48c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUlwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxoNFxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gbGFiZWxDb250YWluZXIge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgPC9oND5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtYXJ0SW5kaWNhdG9yIHdpZGdldENvbnRlbnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5kaWNhdG9ySXRlbXMge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIiBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaW5kaWNhdG9ySXRlbXM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImluZGljYXRvckl0ZW1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRJbmRpY2F0b3JJdGVtQ2xhc3MoaSlcIlxyXG4gICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwIFtuZ0NsYXNzXT1cImdldEluZGljYXRvclN0YXR1c0xhYmVsQ29sb3IoKVwiPlxyXG4gICAgICAgICAge3sgZ2V0SW5kaWNhdG9yU3RhdHVzTGFiZWwoKSB9fVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGg0XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgIGNsYXNzPVwibGFiZWxDb250YWluZXIge3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICA8L2g0PlxyXG4gICAgICA8c21hcnRmaWxldXBsb2FkZXJcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgW3VwbG9hZENhbGxiYWNrXT1cInVwbG9hZC5iaW5kKHRoaXMpXCJcclxuICAgICAgICBbZmlsZUZvcm1hdHNdPVwid2lkZ2V0SW5zdGFuY2UuZmlsZUZvcm1hdHNcIlxyXG4gICAgICAgIFttYXhTaXplTWJdPVwid2lkZ2V0SW5zdGFuY2UubWF4U2l6ZU1iXCJcclxuICAgICAgICBbaTE4bl09XCJ3aWRnZXRJbnN0YW5jZS5pMThuXCJcclxuICAgICAgPjwvc21hcnRmaWxldXBsb2FkZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRVwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxoNFxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICBjbGFzcz1cImxhYmVsQ29udGFpbmVyIHt7IGxhYmVsQ29sb3IgfX0ge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgPC9oND5cclxuICAgICAgPGltZ1xyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5pbWFnZUNzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgdGl0bGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgW3NyY109XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TVkdcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICA8aDRcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgY2xhc3M9XCJsYWJlbENvbnRhaW5lciB7eyBsYWJlbENvbG9yIH19IHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgIDwvaDQ+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtpbm5lckhUTUxdPVwiZ2V0V2lkZ2V0U3ZnKHdpZGdldEluc3RhbmNlLnZhbHVlKVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgPjwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUlwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxoclxyXG4gICAgICAgIGNsYXNzPVwic21hcnREaXZpZGVyIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGg0XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgIGNsYXNzPVwibGFiZWxDb250YWluZXIge3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICA8L2g0PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0QnV0dG9uVHlwZSh3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IpXCJcclxuICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXCJcclxuICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrZWQod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNPbmx5SWNvbih3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IpOyB0aGVuIGljb25Pbmx5OyBlbHNlIHRleHRcIlxyXG4gICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNpY29uT25seT5cclxuICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvblwiXHJcbiAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yIS5pY29uIVwiXHJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIlxyXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uQ29sb3IgPz9cclxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uY29sb3JcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGV4dD5cclxuICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uICYmXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb25Qb3NpdGlvbiA9PT0gJ1BSRSdcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvciEuaWNvbiFcIlxyXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJcclxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvbkNvbG9yID8/XHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy50aXRsZSB9fVxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb24gJiZcclxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvblBvc2l0aW9uID09PSAnUE9TVCdcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvciEuaWNvbiFcIlxyXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJcclxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvbkNvbG9yID8/XHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICA8aDRcclxuICAgICAgICBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCJcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UICYmIHdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICA8L2g0PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGVudFwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tQ29tcG9uZW50PjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuUklDSF9URVhUXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCI+XHJcbiAgICAgICAgPGg0ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCIgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCI+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250ZW50XCI+XHJcbiAgICAgICAgPHF1aWxsLWVkaXRvclxyXG4gICAgICAgICAgI3F1aWxsRWRpdG9yXHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFttb2R1bGVzXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQgPyBlbXB0eVF1aWxsVG9vbGJhciA6IHdpZGdldEluc3RhbmNlLnF1aWxsTW9kdWxlc1wiXHJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwid2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgW3JlYWRPbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgW21heExlbmd0aF09XCJ3aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGhcIlxyXG4gICAgICAgICAgKG9uQ29udGVudENoYW5nZWQpPVwib25SaWNoVGV4dEVkaXRvckNvbnRlbnRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgID48L3F1aWxsLWVkaXRvcj5cclxuICAgICAgICA8bWF0LWhpbnRcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICF3aWRnZXRJbnN0YW5jZT8uaGludCB8fFxyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICAgICAgPlxyXG4gICAgICAgIDxtYXQtaGludFxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93Q2hhcmFjdGVyTGltaXRTdWZmaXggJiYgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcclxuICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgYWxpZ249XCJlbmRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJyaWNoLXRleHQtZWRpdG9yLWxlZXdheS1jb3VudGVyXCJcclxuICAgICAgICAgID57eyBnZXRSaWNoVGV4dEVkaXRvckxlbmd0aExlZXdheSgpIH19PC9tYXQtaGludFxyXG4gICAgICAgID5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TT1JUQUJMRVwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiPlxyXG4gICAgICAgIDxoNCAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGVudFwiPlxyXG4gICAgICAgIDxsaWItc29ydGFibGUtd2lkZ2V0XHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0SW5zdGFuY2VcIlxyXG4gICAgICAgID48L2xpYi1zb3J0YWJsZS13aWRnZXQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTUFUUklYXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiPlxyXG4gICAgICA8aDQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIiBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIj5cclxuICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgPC9oND5cclxuICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8dGFibGUgY2xhc3M9XCJtYXRyaXhUYWJsZSB3aWRnZXRDb250ZW50XCI+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICA8dGggY2xhc3M9XCJvcHRpb25MYWJlbFwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWUuY29sdW1uc1wiPlxyXG4gICAgICAgICAge3sgb3B0aW9uLmRpc3BsYXlWYWx1ZSB9fVxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgIDwvdHI+XHJcbiAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcXVlc3Rpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWUucm93czsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgIDx0aCBjbGFzcz1cInF1ZXN0aW9uTGFiZWxcIj5cclxuICAgICAgICAgIDxsYWJlbD57eyBxdWVzdGlvbi5kaXNwbGF5VmFsdWUgfX08L2xhYmVsPlxyXG4gICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgIDx0ZCBjbGFzcz1cInNlbGVjdFRkXCIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZS5jb2x1bW5zOyBsZXQgaiA9IGluZGV4XCI+XHJcbiAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLmlzTXVsdGlwbGVcIlxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleSArICcuJyArIHF1ZXN0aW9uLmNvZGVcIlxyXG4gICAgICAgICAgICBbbmFtZV09XCIncScgKyBpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cIm9wdGlvbi5jb2RlXCI+IDwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLmlzTXVsdGlwbGVcIj5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5ICsgJy5kYXRhLicgKyBxdWVzdGlvbi5jb2RlICsgJy4nICsgb3B0aW9uLmNvZGVcIlxyXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVsnZGF0YSddW3F1ZXN0aW9uLmNvZGVdW29wdGlvbi5jb2RlXVwiXHJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgID48L21hdC1jaGVja2JveD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIndpZGdldEluc3RhbmNlLmJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlTWF0cml4Um93KHF1ZXN0aW9uKVwiXHJcbiAgICAgICAgICA+PHNtYXJ0LWljb24gaWNvbj1cImNsb3NlXCI+PC9zbWFydC1pY29uXHJcbiAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC90YWJsZT5cclxuICA8L2Rpdj5cclxuICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cclxuICAgICAgPGg0XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICA8L2g0PlxyXG4gICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgIH19PC9tYXQtaGludD5cclxuICAgIDwvZGl2PlxyXG4gICAgPHlvdXR1YmUtcGxheWVyXHJcbiAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICB2aWRlb0lkPVwie3sgd2lkZ2V0SW5zdGFuY2UudmlkZW9JZCB9fVwiXHJcbiAgICAgIFt3aWR0aF09XCJ3aWRnZXRJbnN0YW5jZS53aWR0aFwiXHJcbiAgICAgIFtoZWlnaHRdPVwid2lkZ2V0SW5zdGFuY2UuaGVpZ2h0XCJcclxuICAgICAgW3N0YXJ0U2Vjb25kc109XCJ3aWRnZXRJbnN0YW5jZS5zdGFydFNlY29uZHNcIlxyXG4gICAgICBbZW5kU2Vjb25kc109XCJ3aWRnZXRJbnN0YW5jZS5lbmRTZWNvbmRzXCJcclxuICAgID48L3lvdXR1YmUtcGxheWVyPlxyXG4gICAgPG1hdC1oaW50XHJcbiAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgIXdpZGdldEluc3RhbmNlPy5oaW50IHx8IHdpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uSU5QVVRcclxuICAgICAgXCJcclxuICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICA+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTU9OVEhfUElDS0VSXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgIDxoNCBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWxcIj5cclxuICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgPC9oND5cclxuICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxsaWItc21hcnQtbW9udGgtcGlja2VyXHJcbiAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXHJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVZZWFyTW9udGhQaWNrZWQoJGV2ZW50KVwiXHJcbiAgICA+PC9saWItc21hcnQtbW9udGgtcGlja2VyPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
777
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LWZvcm0vd2lkZ2V0cy9zbWFydGZvcm13aWRnZXQvc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LWZvcm0vd2lkZ2V0cy9zbWFydGZvcm13aWRnZXQvc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBR1QsS0FBSyxFQUlMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlqRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQWMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRzVGLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsbUJBQW1CLEVBQ25CLDJCQUEyQixHQUM1QixNQUFNLHdCQUF3QixDQUFDO0FBR2hDLE9BQU8sRUFDTCxvQ0FBb0MsR0FJckMsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3RCO1lBQ0QsSUFBSSxjQUFjLElBQUksS0FBSyxFQUFFO2dCQUMzQixPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUM5QjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOztxSEEvM0JVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLHViQTBCRyxnQkFBZ0IsNFpBa0J4Qyx3QkFBd0IsZ0RDakd4QyxzaHdEQXc0Q0EscXBFRG4xQ2Esd0JBQXdCOzJGQUF4Qix3QkFBd0I7a0JBUHBDLFNBQVM7K0JBQ0UsaUJBQWlCLGlCQUdaLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07d01BT3RDLElBQUk7c0JBQVosS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQU1rQixjQUFjO3NCQUFyQyxTQUFTO3VCQUFDLFdBQVc7Z0JBV3RCLG9CQUFvQjtzQkFEbkIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFPOUIsS0FBSztzQkFBOUIsU0FBUzt1QkFBQyxhQUFhO2dCQVNGLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFHcEIsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLHdCQUF3QjtnQkF1SGQsY0FBYztzQkFBckMsU0FBUzt1QkFBQyxXQUFXO2dCQUNFLGNBQWM7c0JBQXJDLFNBQVM7dUJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENPTU1BLCBFTlRFUiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDaGlsZHJlbixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XHJcbmltcG9ydCB7IE1hdENoaXBJbnB1dEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJ2Zhc3QtZXF1YWxzJztcclxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBDb250ZW50Q2hhbmdlLCBRdWlsbEVkaXRvckNvbXBvbmVudCwgUXVpbGxNb2R1bGVzIH0gZnJvbSAnbmd4LXF1aWxsJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3RhcnRXaXRoLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnQtZmFjdG9yeS1zZXJ2aWNlL3Byb2plY3RzJztcclxuaW1wb3J0IHsgVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vdmlldy1jb250ZXh0L3NtYXJ0LXVpLWFjdGlvbi91aS1hY3Rpb24tdG9vbGJhci5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIFNtYXJ0Rm9ybVdpZGdldERpcmVjdGlvbixcclxuICBTbWFydEZvcm1XaWRnZXRUeXBlLFxyXG4gIFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uRW51bSxcclxufSBmcm9tICcuLi8uLi9hcGkvbW9kZWwvbW9kZWxzJztcclxuaW1wb3J0IHsgU21hcnRGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NtYXJ0Zm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU21hcnRCdXR0b24sIFNtYXJ0Rm9ybVdpZGdldCwgU21hcnRJdGVtLCBTbWFydE1hdHJpeCB9IGZyb20gJy4uLy4uL3NtYXJ0Zm9ybS5mb3JtLW1vZGVsJztcclxuaW1wb3J0IHtcclxuICBTbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24sXHJcbiAgU21hcnRWYWxpZGF0b3IsXHJcbiAgU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLFxyXG4gIFZhbHVlLFxyXG59IGZyb20gJy4uLy4uL3NtYXJ0Zm9ybS5tb2RlbCc7XHJcbmltcG9ydCB7IFNtYXJ0U3R5bGVVdGlsaXR5IH0gZnJvbSAnLi4vLi4vLi4vdmlldy1jb250ZXh0L3V0aWxpdHkvc21hcnQtc3R5bGUtdXRpbGl0eSc7XHJcblxyXG5leHBvcnQgY2xhc3MgU21hcnRXaWRnZXRTZXR0aW5ncyB7XHJcbiAgcHVibGljIHN0YXRpYyB1c2VVdGMgPSBmYWxzZTtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzbWFydGZvcm13aWRnZXQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zbWFydGZvcm13aWRnZXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NtYXJ0Zm9ybXdpZGdldC5jb21wb25lbnQuY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNtYXJ0Zm9ybXdpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICBwcml2YXRlIF9kZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGhpZGVQYXNzd29yZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIGZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgd2lkZ2V0SW5zdGFuY2UhOiBTbWFydEZvcm1XaWRnZXQ8YW55PjtcclxuICBASW5wdXQoKSBvbkJsdXI/OiBTdWJqZWN0PGFueT47XHJcbiAgQElucHV0KCkgb25WYWx1ZUNoYW5nZT86IFN1YmplY3Q8YW55PjtcclxuICBASW5wdXQoKSBsYWJlbENvbG9yPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSE6IFN1YmplY3Q8U29waGlzdGljYXRlZFZhbHVlQ2hhbmdlPjtcclxuXHJcbiAgc21hcnRGb3JtV2lkZ2V0VHlwZSA9IFNtYXJ0Rm9ybVdpZGdldFR5cGU7XHJcblxyXG4gIGNhcHNPbjogYW55O1xyXG5cclxuICBAVmlld0NoaWxkKCdjaGlwSW5wdXQnKSBjaGlwSW5wdXRDaGlsZD86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcblxyXG4gIGZpbHRlcmVkVmFsdWVMaXN0PzogT2JzZXJ2YWJsZTxzdHJpbmdbXSB8IHVuZGVmaW5lZD47XHJcblxyXG4gIGhhc0Vycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZXJyb3JLZXk/OiBzdHJpbmc7XHJcblxyXG4gIGluZGljYXRvckl0ZW1zPzogYW55W107XHJcblxyXG4gIC8vIGN1c3RvbUNvbXBvbmVudFxyXG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbUNvbXBvbmVudCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxyXG4gIGN1c3RvbUNvbXBvbmVudFZjUmVmPzogVmlld0NvbnRhaW5lclJlZjtcclxuICBjdXN0b21Db21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8YW55PjtcclxuXHJcbiAgZmlsdGVyZWRPcHRpb25zPzogT2JzZXJ2YWJsZTxTbWFydEl0ZW08YW55PltdPjtcclxuICB0b0hpZ2hsaWdodDogc3RyaW5nID0gJyc7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3F1aWxsRWRpdG9yJykgcXVpbGw/OiBRdWlsbEVkaXRvckNvbXBvbmVudDtcclxuXHJcbiAgaXNFbnRlclByZXNzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgaXNEYXRlUGlja2VyUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgU21hcnRXaWRnZXRIaW50UG9zaXRpb24gPSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbkVudW07XHJcblxyXG4gIC8vIHRvb2xiYXJcclxuICBAVmlld0NoaWxkKCd0b29sYmFyJykgdG9vbGJhcj86IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudDtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbihTbWFydGZvcm13aWRnZXRDb21wb25lbnQpXHJcbiAgY2hpbGRyZW5XaWRnZXRzUUw/OiBRdWVyeUxpc3Q8U21hcnRmb3Jtd2lkZ2V0Q29tcG9uZW50PjtcclxuXHJcbiAgZW1wdHlRdWlsbFRvb2xiYXI6IFF1aWxsTW9kdWxlcyA9IHtcclxuICAgIHRvb2xiYXI6IGZhbHNlLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBTbWFydEZvcm1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZlNlcnZpY2U6IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIHB1YmxpYyBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XHJcbiAgICApIHtcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3QgPSB0aGlzLnNlcnZpY2UuZmlsdGVyV2lkZ2V0c0J5VmlzaWJpbGl0eShcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZ2V0RXJyb3JNZXNzYWdlKHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLm9uQmx1cj8ucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmdldEVycm9yTWVzc2FnZSh0aGlzLndpZGdldEluc3RhbmNlKTtcclxuICAgIH0pO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yXHJcbiAgICApIHtcclxuICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yPy5pbmRpY2F0b3JMZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmluZGljYXRvckl0ZW1zID0gbmV3IEFycmF5PGFueT4odGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IuaW5kaWNhdG9yTGVuZ3RoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRlUHJvcGVydHldLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IpIHtcclxuICAgICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclZhbHVlID1cclxuICAgICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuY2hhbmdlSW5kaWNhdG9yU3RhdHVzKHZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2Uuc2VsZWN0aW9uXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLm9uVmFsdWVDaGFuZ2UhLnBpcGUoXHJcbiAgICAgICAgc3RhcnRXaXRoKCcnKSxcclxuICAgICAgICBtYXAoKHZhbHVlKSA9PiB0aGlzLl9maWx0ZXIodmFsdWUgfHwgJycpKSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUikge1xyXG4gICAgICBsZXQgdmlkZW9JZCA9IHRoaXMucGFyc2VZb3V0dWJlVXJsKHRoaXMud2lkZ2V0SW5zdGFuY2UubGluayEpO1xyXG4gICAgICBpZiAodmlkZW9JZCkgdGhpcy53aWRnZXRJbnN0YW5jZS52aWRlb0lkID0gdmlkZW9JZDtcclxuICAgICAgY29uc3QgdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XHJcblxyXG4gICAgICB0YWcuc3JjID0gJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGknO1xyXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhZyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZvcm1Db250cm9sczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZpbHRlcihcclxuICAgICAgKGtleTogc3RyaW5nKSA9PlxyXG4gICAgICAgIGtleSA9PT0gdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkgfHwga2V5LnN0YXJ0c1dpdGgoYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LmApXHJcbiAgICApO1xyXG5cclxuICAgIGZvcm1Db250cm9scy5tYXAoKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1trZXldLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUyAmJlxyXG4gICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVBcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZTogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlID0ge1xyXG4gICAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgICBraW5kOlxyXG4gICAgICAgICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVCB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJBRElPX0JVVFRPTlxyXG4gICAgICAgICAgICAgICAgICA/ICdzZWxlY3Rpb24nXHJcbiAgICAgICAgICAgICAgICAgIDogJ2Jhc2ljJyxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLm5leHQodmFsdWVDaGFuZ2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwYXJzZVlvdXR1YmVVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIHVybC5yZXBsYWNlKCcvc2hvcnRzLycsICcvd2F0Y2g/dj0nKTtcclxuXHJcbiAgICB2YXIgcmVnRXhwID0gL14uKigoeW91dHUuYmVcXC8pfCh2XFwvKXwoXFwvdVxcL1xcd1xcLyl8KGVtYmVkXFwvKXwod2F0Y2hcXD8pKVxcPz92Pz0/KFteIyY/XSopLiovO1xyXG4gICAgdmFyIG1hdGNoID0gdXJsLm1hdGNoKHJlZ0V4cCk7XHJcblxyXG4gICAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzddLmxlbmd0aCA9PSAxMSA/IG1hdGNoWzddIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBfaGFzSnVzdENoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZ2V0IGhhc0p1c3RDaGFuZ2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhc0p1c3RDaGFuZ2VkO1xyXG4gIH1cclxuICBzZXQgaGFzSnVzdENoYW5nZWQoaGFzSnVzdENoYW5nZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2hhc0p1c3RDaGFuZ2VkID0gaGFzSnVzdENoYW5nZWQ7XHJcbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyNTApKS50aGVuKCgpID0+IHtcclxuICAgICAgdGhpcy5faGFzSnVzdENoYW5nZWQgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFzQ3JlYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAVmlld0NoaWxkKCdkYXRlSW5wdXQnKSBkYXRlSW5wdXRDaGlsZD86IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgndGltZUlucHV0JykgdGltZUlucHV0Q2hpbGQ/OiBFbGVtZW50UmVmO1xyXG5cclxuICBvbkRhdGVQaWNrZXJCbHVyKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRoaXMub25CbHVyPy5uZXh0KHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xyXG4gICAgdGhpcy5oYW5kbGVEYXRlQ2hhbmdlZCh0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXS52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvblRpbWVQaWNrZXJCbHVyKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRoaXMub25CbHVyPy5uZXh0KHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xyXG4gICAgdGhpcy5oYW5kbGVUaW1lQ2hhbmdlZCh0aGlzLmZvcm0uY29udHJvbHNbYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LXRpbWVgXS52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCkge1xyXG4gICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudFJlZiA9IHRoaXMuY2ZTZXJ2aWNlLmNyZWF0ZUNvbXBvbmVudChcclxuICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudFZjUmVmISxcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmNvbXBvbmVudCxcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmlucHV0XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUiB8fFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTU9OVEhfUElDS0VSXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5pc0RhdGVQaWNrZXJSZXF1aXJlZCA9ICEhdGhpcy53aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzPy5zb21lKFxyXG4gICAgICAgIChzbWFydFZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpID0+IHNtYXJ0VmFsaWRhdG9yLnZhbGlkYXRvciA9PT0gVmFsaWRhdG9ycy5yZXF1aXJlZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgbGV0IHRpbWU7XHJcbiAgICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlKSB7XHJcbiAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlKTtcclxuICAgICAgICBsZXQgaG91ciA9IFNtYXJ0V2lkZ2V0U2V0dGluZ3MudXNlVXRjID8gZGF0ZS5nZXRVVENIb3VycygpIDogZGF0ZS5nZXRIb3VycygpO1xyXG4gICAgICAgIGxldCBtaW4gPSBTbWFydFdpZGdldFNldHRpbmdzLnVzZVV0YyA/IGRhdGUuZ2V0VVRDTWludXRlcygpIDogZGF0ZS5nZXRNaW51dGVzKCk7XHJcbiAgICAgICAgdGltZSA9IFN0cmluZyhob3VyKS5wYWRTdGFydCgyLCAnMCcpICsgJzonICsgU3RyaW5nKG1pbikucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlID0gbW9tZW50KGRhdGUpO1xyXG4gICAgICAgIGNvbnN0IGRhdGVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV07XHJcbiAgICAgICAgaWYgKGRhdGVGb3JtQ29udHJvbCkge1xyXG4gICAgICAgICAgZGF0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aW1lID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcbiAgICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICB2YWxpZGF0b3JzID0gdGhpcy53aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzPy5tYXAoKHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpID0+IHtcclxuICAgICAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdG9yO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB0aW1lRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodGltZSwgdmFsaWRhdG9ycyk7XHJcblxyXG4gICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkKSB7XHJcbiAgICAgICAgdGltZUZvcm1Db250cm9sLmRpc2FibGUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LXRpbWVgLCB0aW1lRm9ybUNvbnRyb2wpO1xyXG5cclxuICAgICAgdGhpcy5oYXNDcmVhdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleSFdLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoX21vbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZURhdGVDaGFuZ2VkKF9tb21lbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB0aGlzLmZvcm0uY29udHJvbHNbYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LXRpbWVgXS52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHRpbWVWYWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZVRpbWVDaGFuZ2VkKHRpbWVWYWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVEYXRlQ2hhbmdlZChfbW9tZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlzRGF0ZUZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmRhdGVJbnB1dENoaWxkPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgaXNUaW1lRm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudGltZUlucHV0Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBkYXRlRm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXTtcclxuICAgIGNvbnN0IHRpbWVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1tgJHt0aGlzLndpZGdldEluc3RhbmNlLmtleX0tdGltZWBdO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuaXNEYXRlUGlja2VyUmVxdWlyZWQgJiZcclxuICAgICAgdGltZUZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSAmJlxyXG4gICAgICAhX21vbWVudFxyXG4gICAgKSB7XHJcbiAgICAgIHRpbWVGb3JtQ29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICB0aW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUoJycpO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgIXRoaXMuaXNEYXRlUGlja2VyUmVxdWlyZWQgJiZcclxuICAgICAgIXRpbWVGb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgJiZcclxuICAgICAgX21vbWVudFxyXG4gICAgKSB7XHJcbiAgICAgIHRpbWVGb3JtQ29udHJvbC5hZGRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgICAgaWYgKHRpbWVGb3JtQ29udHJvbC52YWx1ZSA9PT0gJycpIHtcclxuICAgICAgICB0aW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUodW5kZWZpbmVkKTtcclxuICAgICAgICB0aW1lRm9ybUNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIV9tb21lbnQgfHwgaXNEYXRlRm9jdXNlZCB8fCBpc1RpbWVGb2N1c2VkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNKdXN0Q2hhbmdlZCkge1xyXG4gICAgICB0aGlzLmhhc0p1c3RDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aW1lVmFsdWUgPSB0aW1lRm9ybUNvbnRyb2wudmFsdWUgfHwgJzAwOjAwJztcclxuICAgIHRoaXMuaGFzSnVzdENoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUikge1xyXG4gICAgICB0aGlzLnNldERhdGVGb3JtQ29udHJvbChkYXRlRm9ybUNvbnRyb2wsIF9tb21lbnQsIHRpbWVWYWx1ZSk7XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUgPSBkYXRlRm9ybUNvbnRyb2wudmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUaW1lQ2hhbmdlZCh0aW1lVmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy50aW1lSW5wdXRDaGlsZD8ubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGRhdGVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleSFdO1xyXG4gICAgY29uc3QgdGltZUZvcm1Db250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW2Ake3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5fS10aW1lYF07XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5pc0RhdGVQaWNrZXJSZXF1aXJlZCAmJlxyXG4gICAgICBkYXRlRm9ybUNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpICYmXHJcbiAgICAgICF0aW1lVmFsdWVcclxuICAgICkge1xyXG4gICAgICBkYXRlRm9ybUNvbnRyb2wucmVtb3ZlVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgZGF0ZUZvcm1Db250cm9sLnNldFZhbHVlKGRhdGVGb3JtQ29udHJvbC52YWx1ZSA/PyAnJyk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAhdGhpcy5pc0RhdGVQaWNrZXJSZXF1aXJlZCAmJlxyXG4gICAgICAhZGF0ZUZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSAmJlxyXG4gICAgICB0aW1lVmFsdWVcclxuICAgICkge1xyXG4gICAgICBkYXRlRm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNGb2N1c2VkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNKdXN0Q2hhbmdlZCkge1xyXG4gICAgICB0aGlzLmhhc0p1c3RDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRpbWVWYWx1ZSkge1xyXG4gICAgICBpZiAodGltZUZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSkge1xyXG4gICAgICAgIHRpbWVGb3JtQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgX21vbWVudCA9IGRhdGVGb3JtQ29udHJvbC52YWx1ZTtcclxuXHJcbiAgICBpZiAoIV9tb21lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFzSnVzdENoYW5nZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSKSB7XHJcbiAgICAgIHRoaXMuc2V0RGF0ZUZvcm1Db250cm9sKGRhdGVGb3JtQ29udHJvbCwgX21vbWVudCwgdGltZVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RGF0ZUZvcm1Db250cm9sKGRhdGVGb3JtQ29udHJvbDogYW55LCBfbW9tZW50OiBhbnksIHRpbWVWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoX21vbWVudCkge1xyXG4gICAgICBsZXQgaG91ciA9IHRpbWVWYWx1ZS5zdWJzdHJpbmcoMCwgMik7XHJcbiAgICAgIGxldCBtaW4gPSB0aW1lVmFsdWUuc3Vic3RyaW5nKDMsIDUpO1xyXG4gICAgICBfbW9tZW50LmhvdXIoaG91cik7XHJcbiAgICAgIF9tb21lbnQubWludXRlKG1pbik7XHJcbiAgICAgIGRhdGVGb3JtQ29udHJvbC5zZXRWYWx1ZShfbW9tZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFRpbWUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUikge1xyXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMV0uc3Vic3RyaW5nKDAsIDUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgb25LZXlkb3duKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0VudGVyUHJlc3NlZCA9IHRydWU7XHJcblxyXG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwKSkudGhlbigoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNFbnRlclByZXNzZWQgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0VudGVyUHJlc3NlZCkge1xyXG4gICAgICB0aGlzLmhpZGVQYXNzd29yZCA9ICF0aGlzLmhpZGVQYXNzd29yZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE5nQ2xhc3MoKTogeyBbY2xhc3NOYW1lOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgcmV0dXJuIFNtYXJ0U3R5bGVVdGlsaXR5LmdldE5nQ2xhc3Nlcyh0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlKTtcclxuICB9XHJcblxyXG4gIGdldFN0eWxlKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH0ge1xyXG4gICAgaWYgKCF0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlKSB7XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUgPSB7XHJcbiAgICAgICAgY2xhc3Nlc1RvQWRkOiBbXSxcclxuICAgICAgICBjbGFzc2VzVG9SZW1vdmU6IFtdLFxyXG4gICAgICAgIHN0eWxlOiB7fSxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoISgnd2lkdGgnIGluIHRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUuc3R5bGUpICYmICdtaW5XaWR0aCcgaW4gdGhpcy53aWRnZXRJbnN0YW5jZSkge1xyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlLnN0eWxlWyd3aWR0aCddID0gYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5taW5XaWR0aH1weGA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU21hcnRTdHlsZVV0aWxpdHkuZ2V0TmdTdHlsZXModGhpcy53aWRnZXRJbnN0YW5jZS5zdHlsZSk7XHJcbiAgfVxyXG5cclxuICBnZXRMYWJlbE5nQ2xhc3MoKTogeyBbY2xhc3NOYW1lOiBzdHJpbmddOiBib29sZWFuIH0ge1xyXG4gICAgaWYgKCdsYWJlbFN0eWxlJyBpbiB0aGlzLndpZGdldEluc3RhbmNlKSB7XHJcbiAgICAgIHJldHVybiBTbWFydFN0eWxlVXRpbGl0eS5nZXROZ0NsYXNzZXModGhpcy53aWRnZXRJbnN0YW5jZS5sYWJlbFN0eWxlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge307XHJcbiAgfVxyXG5cclxuICBnZXRMYWJlbFN0eWxlKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH0ge1xyXG4gICAgaWYgKCdsYWJlbFN0eWxlJyBpbiB0aGlzLndpZGdldEluc3RhbmNlKSB7XHJcbiAgICAgIHJldHVybiBTbWFydFN0eWxlVXRpbGl0eS5nZXROZ1N0eWxlcyh0aGlzLndpZGdldEluc3RhbmNlLmxhYmVsU3R5bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSBoYW5kbGVyIGZvciB0aGUgcG90ZW50aWFsbHkgcHJlc2VudCBRdWlsbCBlZGl0b3IsIGVuZm9yY2luZyBtYXggbGVuZ3RoIGxpbWl0cyBpZlxyXG4gICAqIG5lY2Vzc2FyeS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBjaGFuZ2UgdGhlIHtAbGluayBDb250ZW50Q2hhbmdlfSB0aGUgUXVpbGwgZWRpdG9yIGVtaXRzXHJcbiAgICogQHJldHVybnMge0Bjb2RlIHZvaWR9XHJcbiAgICovXHJcbiAgb25SaWNoVGV4dEVkaXRvckNvbnRlbnRDaGFuZ2VkKGNoYW5nZTogQ29udGVudENoYW5nZSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SSUNIX1RFWFQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdlIGFyZSBwZXJtaXR0ZWQgYSBudW1iZXIgb25lIGdyZWF0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkOiBUaGUgcXVpbGwgZWRpdG9yIGNvbnRhaW5zIGFuXHJcbiAgICAvLyB1bnJlbW92YWJsZSBuZXctbGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiBpdHMgY29udGVudC5cclxuICAgIGNvbnN0IG1heExlbmd0aDogbnVtYmVyID0gdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGggKyAxO1xyXG4gICAgaWYgKGNoYW5nZS50ZXh0Lmxlbmd0aCA8PSBtYXhMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGluc2VydE9wQ291bnQ6IG51bWJlciA9IGNoYW5nZS5kZWx0YS5vcHM/LmZpbHRlcigoaXQpID0+ICEhaXQuaW5zZXJ0KS5sZW5ndGggPz8gMDtcclxuICAgIGlmIChpbnNlcnRPcENvdW50ID4gMCkge1xyXG4gICAgICB0aGlzLnF1aWxsPy5xdWlsbEVkaXRvci5zZXRDb250ZW50cyhjaGFuZ2Uub2xkRGVsdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyB1c2VyLXNwYWNlIGNoYXJhY3RlcnMgYWxsb3dlZCB0byBiZSBlbnRlcmVkIGludG8gdGhlIFF1aWxsXHJcbiAgICogZWRpdG9yLlxyXG4gICAqXHJcbiAgICogPHA+XHJcbiAgICogVGhlIHJlYWwgbGVuZ3RoIG9mIHRoZSBlZGl0b3IncyBjb250ZW50IG1heSBiZSBtdWNoIGxvbmdlciAtIGFzIGl0IGlzIHBlcnNpc3RlZCBhcyBhbiBIVE1MXHJcbiAgICogZG9jdW1lbnQgZnJhZ21lbnQgYmVoaW5kIHRoZSBzY2VuZXMuIFRoaXMgbWV0aG9kIGlzIGNvbmNlcm5lZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhlXHJcbiAgICogdXNlciBwZXJjZWl2ZXMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB0aGUge0BsaW5rIG51bWJlcn0gb2YgcmVtYWluaW5nIHBlcm1pdHRlZCBjaGFyYWN0ZXJzIHRoZSB1c2VyIG1heSBpbnB1dCwgb3Ige0Bjb2RlIC0xfVxyXG4gICAqICAgICAgICAgIGlmIHRoZSBsZWV3YXkgaXMgbm90IGludGVycHJldGVkIGluIHRoZSBjb21wb25lbnQncyBjdXJyZW50IHN0YXRlXHJcbiAgICovXHJcbiAgZ2V0UmljaFRleHRFZGl0b3JMZW5ndGhMZWV3YXkoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUklDSF9URVhUKSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMud2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB3ZSBhcmUgcGVybWl0dGVkIGEgbnVtYmVyIG9uZSBncmVhdGVyIHRoYW4gdGhlIHJlcXVlc3RlZDogVGhlIHF1aWxsIGVkaXRvciBjb250YWlucyBhblxyXG4gICAgLy8gdW5yZW1vdmFibGUgbmV3LWxpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQgb2YgaXRzIGNvbnRlbnQuXHJcbiAgICBjb25zdCBtYXhMZW5ndGg6IG51bWJlciA9IHRoaXMud2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoICsgMTtcclxuICAgIGlmICh0aGlzLnF1aWxsKSB7XHJcbiAgICAgIC8vIHRoaXMgaXMgdGhlIGludGVuZGVkIHBhdGggKHVzZXIgaW5wdXQpOlxyXG4gICAgICByZXR1cm4gbWF4TGVuZ3RoIC0gdGhpcy5xdWlsbC5xdWlsbEVkaXRvci5nZXRUZXh0KCkubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZhbGxiYWNrIHRvIHRoZSByYXcgSFRNTCBjb250ZW50OlxyXG4gICAgcmV0dXJuIG1heExlbmd0aCAtIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgYWRkT25CbHVyID0gdHJ1ZTtcclxuICByZWFkb25seSBzZXBhcmF0b3JLZXlzQ29kZXMgPSBbRU5URVIsIENPTU1BXSBhcyBjb25zdDtcclxuICByZWFkb25seSBlbXB0eVNlcGFyYXRvcktleXNDb2RlcyA9IFtdIGFzIGNvbnN0O1xyXG5cclxuICBhZGQoZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnZhbHVlIHx8ICcnKS50cmltKCk7XHJcbiAgICBpZiAodGhpcy5zZXRUZXh0RmllbGRDaGlwc1ZhbHVlKHZhbHVlKSkge1xyXG4gICAgICBjb25zdCB2YWx1ZUNoYW5nZTogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlID0ge1xyXG4gICAgICAgIGtleTogdGhpcy53aWRnZXRJbnN0YW5jZS5rZXksXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUsXHJcbiAgICAgICAga2luZDogJ3NlbGVjdGlvbicsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLm5leHQodmFsdWVDaGFuZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsZWFyIHRoZSBpbnB1dCB2YWx1ZVxyXG4gICAgZXZlbnQuY2hpcElucHV0IS5jbGVhcigpO1xyXG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmUodmFsdWU6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTIHx8XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0xPT0tVUFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5pbmRleE9mKHZhbHVlKTtcclxuXHJcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlOiBTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UgPSB7XHJcbiAgICAgICAgICBrZXk6IHRoaXMud2lkZ2V0SW5zdGFuY2Uua2V5LFxyXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUsXHJcbiAgICAgICAgICBraW5kOiAnc2VsZWN0aW9uJyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLm5leHQodmFsdWVDaGFuZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgd2lkZ2V0SW5zdGFuY2U6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KTogdm9pZCB7XHJcbiAgICBsZXQgdmFsdWUgPSBldmVudC5vcHRpb24udmlld1ZhbHVlO1xyXG4gICAgaWYgKHRoaXMuc2V0VGV4dEZpZWxkQ2hpcHNWYWx1ZSh2YWx1ZSkpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUyB8fFxyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVBcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2U6IFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSA9IHtcclxuICAgICAgICAgIGtleTogd2lkZ2V0SW5zdGFuY2Uua2V5LFxyXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLFxyXG4gICAgICAgICAga2luZDogJ3NlbGVjdGlvbicsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZS5uZXh0KHZhbHVlQ2hhbmdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRUZXh0RmllbGRDaGlwc1ZhbHVlKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAodGhpcy53aWRnZXRJbnN0YW5jZS5tYXhWYWx1ZXMgJiZcclxuICAgICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUhLmxlbmd0aCA8IHRoaXMud2lkZ2V0SW5zdGFuY2UubWF4VmFsdWVzKSB8fFxyXG4gICAgICAgICF0aGlzLndpZGdldEluc3RhbmNlLm1heFZhbHVlc1xyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoIXRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUpIHtcclxuICAgICAgICAgIGxldCB2YWx1ZXMgPSBuZXcgQXJyYXk8T2JqZWN0PigpO1xyXG4gICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZSA9IHZhbHVlcztcclxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0uc2V0VmFsdWUodmFsdWVzKTtcclxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLnB1c2godmFsdWUpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXREaXJlY3Rpb24oKTogc3RyaW5nIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SQURJT19CVVRUT05cclxuICAgICkge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS5kaXJlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gJ2RpcmVjdGlvbi1yb3cnO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLndpZGdldEluc3RhbmNlLmRpcmVjdGlvbiA9PT0gU21hcnRGb3JtV2lkZ2V0RGlyZWN0aW9uLkNPTCkge1xyXG4gICAgICByZXR1cm4gJ2RpcmVjdGlvbi1jb2wnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICdkaXJlY3Rpb24tcm93JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNtYXJ0Rm9ybVRleHRGaWVsZEJ1dHRvbkljb25Qb3NpdGlvbigpOiB0eXBlb2YgU21hcnRGb3JtVGV4dEZpZWxkQnV0dG9uSWNvblBvc2l0aW9uIHtcclxuICAgIHJldHVybiBTbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBnZXRUeXBlKCk6IHR5cGVvZiBTbWFydEZvcm1XaWRnZXRUeXBlIHtcclxuICAgIHJldHVybiBTbWFydEZvcm1XaWRnZXRUeXBlO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0OiBTbWFydEZvcm1XaWRnZXQ8YW55Pik6IHN0cmluZyB7XHJcbiAgICBpZiAod2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIGlmICh3aWRnZXQubGFiZWwgPT09ICcnKSB7XHJcbiAgICAgIHJldHVybiB3aWRnZXQubGFiZWw7XHJcbiAgICB9XHJcbiAgICBsZXQgaXNSZXF1aXJlZCA9IGZhbHNlO1xyXG4gICAgaWYgKFxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5USU1FICYmXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRPR0dMRSAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT04gJiZcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UXHJcbiAgICApIHtcclxuICAgICAgaXNSZXF1aXJlZCA9IHdpZGdldC52YWxpZGF0b3JzPy5sZW5ndGggPyB0aGlzLmZpZWxkSXNSZXF1aXJlZCgpICYmICEhd2lkZ2V0LnNob3dMYWJlbCA6IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCkge1xyXG4gICAgICBpc1JlcXVpcmVkID0gd2lkZ2V0Lm1hcmtBc1JlcXVpcmVkID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGAke3dpZGdldC5sYWJlbH0ke2lzUmVxdWlyZWQgPyAnIConIDogJyd9YDtcclxuICB9XHJcblxyXG4gIGdldFdpZGdldFN2Zyh2YWx1ZT86IHN0cmluZyk6IFNhZmVIdG1sIHwgbnVsbCB7XHJcbiAgICBsZXQgc2FmZVZhbHVlID0gdmFsdWUgPz8gJyc7XHJcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoc2FmZVZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmllbGRJc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHZhbHVlID0gZmFsc2U7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5USU1FICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5UT0dHTEUgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNWRyAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlQgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXHJcbiAgICApIHtcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzPy5mb3JFYWNoKCh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB7XHJcbiAgICAgICAgaWYgKHZhbGlkYXRvci52YWxpZGF0b3IgPT0gVmFsaWRhdG9ycy5yZXF1aXJlZCkgdmFsdWUgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYXNDdXN0b21FcnJvcih3aWRnZXQ6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+LCB2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0LmtleV0gJiYgdGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldLmVycm9ycykge1xyXG4gICAgICAgIGxldCBoYXNFcnJvciA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXQua2V5XS5lcnJvcnMhKS5sZW5ndGhcclxuICAgICAgICAgID8gdGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldPy5kaXJ0eSB8fFxyXG4gICAgICAgICAgICAodGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgdmFsaWRhdG9yICYmXHJcbiAgICAgICAgICAgICAgKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXQua2V5XT8uZXJyb3JzKSFbdmFsaWRhdG9yLm5hbWVdKVxyXG4gICAgICAgICAgOiBmYWxzZTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAodmFsaWRhdG9yICYmIGhhc0Vycm9yICYmICF0aGlzLmVycm9yS2V5KSB8fFxyXG4gICAgICAgICAgKHZhbGlkYXRvciAmJiBoYXNFcnJvciAmJiB0aGlzLmVycm9yS2V5ID09PSB2YWxpZGF0b3IubmFtZSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5lcnJvcktleSA9IHZhbGlkYXRvci5uYW1lO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc0Vycm9yICYmIHZhbGlkYXRvciAmJiB0aGlzLmVycm9yS2V5ID09PSB2YWxpZGF0b3IubmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5lcnJvcktleSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhhc0Vycm9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvck1lc3NhZ2Uod2lkZ2V0SW5zdGFuY2U6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbiAgICBsZXQgZXJyb3JJY29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICBsZXQgZXJyb3JJY29uQ29sb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIGxldCB2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yO1xyXG4gICAgaWYgKFxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXHJcbiAgICApIHtcclxuICAgICAgaWYgKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldICYmIHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLmVycm9ycykge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMuZXJyb3JLZXkgJiZcclxuICAgICAgICAgICFPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS5lcnJvcnMhKS5pbmNsdWRlcyh0aGlzLmVycm9yS2V5ISlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3JLZXkgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoXHJcbiAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgaW5kZXggPCBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS5lcnJvcnMhKS5sZW5ndGg7XHJcbiAgICAgICAgICBpbmRleCsrXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBjb25zdCBlcnJvcktleSA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLmVycm9ycyEpW2luZGV4XTtcclxuICAgICAgICAgIGxldCBjdXN0b21WYWxpZGF0b3JPbldpZGdldCA9IHdpZGdldEluc3RhbmNlLnZhbGlkYXRvcnM/LmZpbHRlcihcclxuICAgICAgICAgICAgKHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpID0+IHZhbGlkYXRvci5uYW1lID09PSBlcnJvcktleVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmIChjdXN0b21WYWxpZGF0b3JPbldpZGdldCAmJiBjdXN0b21WYWxpZGF0b3JPbldpZGdldC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF0uZXJyb3JNZXNzYWdlITtcclxuICAgICAgICAgICAgZXJyb3JJY29uID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF0uaWNvbjtcclxuICAgICAgICAgICAgZXJyb3JJY29uQ29sb3IgPSBjdXN0b21WYWxpZGF0b3JPbldpZGdldFswXS5pY29uQ29sb3I7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvciA9IGN1c3RvbVZhbGlkYXRvck9uV2lkZ2V0WzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBjdXN0b21WYWxpZGF0b3JPbkZvcm0gPSB0aGlzLnNlcnZpY2Uuc21hcnRGb3JtPy52YWxpZGF0b3JzPy5maWx0ZXIoXHJcbiAgICAgICAgICAgICh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB2YWxpZGF0b3IubmFtZSA9PT0gZXJyb3JLZXlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoY3VzdG9tVmFsaWRhdG9yT25Gb3JtICYmIGN1c3RvbVZhbGlkYXRvck9uRm9ybS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gY3VzdG9tVmFsaWRhdG9yT25Gb3JtWzBdLmVycm9yTWVzc2FnZSE7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvciA9IGN1c3RvbVZhbGlkYXRvck9uRm9ybVswXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5oYXNDdXN0b21FcnJvcih3aWRnZXRJbnN0YW5jZSwgdmFsaWRhdG9yISkpIHtcclxuICAgICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvciA9IGVycm9yTWVzc2FnZSE7XHJcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uID0gZXJyb3JJY29uO1xyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID0gZXJyb3JJY29uQ29sb3I7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLmVycm9yID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW5kaWNhdG9ySXRlbUNsYXNzKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IpIHtcclxuICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yLmluZGljYXRvclZhbHVlID49IGluZGV4KSB7XHJcbiAgICAgICAgcmV0dXJuIGBzbWFydC1pbmRpY2F0b3ItJHtpbmRleH1gO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBnZXRJbmRpY2F0b3JTdGF0dXNMYWJlbENvbG9yKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUikge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsdWUgPSBNYXRoLmZsb29yKHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JWYWx1ZSk7XHJcbiAgICBpZiAodmFsdWUgPiB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yTGVuZ3RoIC0gMSkge1xyXG4gICAgICByZXR1cm4gYHNtYXJ0LWluZGljYXRvci1sYWJlbC0ke3RoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JMZW5ndGggLSAxfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYHNtYXJ0LWluZGljYXRvci1sYWJlbC0ke3ZhbHVlfWA7XHJcbiAgfVxyXG4gIGdldEluZGljYXRvclN0YXR1c0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUikge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsdWUgPSBNYXRoLmZsb29yKHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JWYWx1ZSk7XHJcbiAgICBpZiAodmFsdWUgPiB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yTGVuZ3RoIC0gMSkge1xyXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclN0YXR1c0xhYmVsc1tcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yTGVuZ3RoIC0gMVxyXG4gICAgICBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JTdGF0dXNMYWJlbHNbdmFsdWVdO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkKGZpbGVzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSKSB7XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudXBsb2FkQ2FsbGJhY2sodGhpcy53aWRnZXRJbnN0YW5jZS5rZXksIGZpbGVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEJ1dHRvblR5cGUoZGVzY3JpcHRvcjogYW55KTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoZGVzY3JpcHRvci50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ05PUk1BTCc6XHJcbiAgICAgICAgcmV0dXJuICdtYXQtYnV0dG9uJztcclxuICAgICAgY2FzZSAnRkxBVCc6XHJcbiAgICAgICAgcmV0dXJuICdtYXQtZmxhdC1idXR0b24nO1xyXG4gICAgICBjYXNlICdSQUlTRUQnOlxyXG4gICAgICAgIHJldHVybiAnbWF0LXJhaXNlZC1idXR0b24nO1xyXG4gICAgICBjYXNlICdTVFJPS0VEJzpcclxuICAgICAgICByZXR1cm4gJ21hdC1zdHJva2VkLWJ1dHRvbic7XHJcbiAgICAgIGNhc2UgJ0lDT04nOlxyXG4gICAgICAgIHJldHVybiAnbWF0LWljb24tYnV0dG9uJztcclxuICAgICAgY2FzZSAnTUlOSV9GQUInOlxyXG4gICAgICAgIHJldHVybiAnbWF0LW1pbmktZmFiJztcclxuICAgICAgY2FzZSAnRkFCJzpcclxuICAgICAgICByZXR1cm4gJ21hdC1mYWInO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBVbmhhbmRsZWQgYWN0aW9uIGJ1dHRvbiB0eXBlIGNhc2U6ICR7ZGVzY3JpcHRvci50eXBlfWApO1xyXG4gICAgICAgIHJldHVybiBgbWF0LWJ1dHRvbmA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc09ubHlJY29uKGRlc2NyaXB0b3I6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgZGVzY3JpcHRvci50eXBlID09PSAnSUNPTicgfHwgZGVzY3JpcHRvci50eXBlID09PSAnTUlOSV9GQUInIHx8IGRlc2NyaXB0b3IudHlwZSA9PT0gJ0ZBQidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvbkJ1dHRvbkNsaWNrZWQoaW5zdGFuY2U6IFNtYXJ0QnV0dG9uKTogdm9pZCB7XHJcbiAgICBpZiAoaW5zdGFuY2UudWlBY3Rpb24pIHtcclxuICAgICAgaW5zdGFuY2UuY2FsbGJhY2soaW5zdGFuY2UudWlBY3Rpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW5zdGFuY2UuY2FsbGJhY2soaW5zdGFuY2Uua2V5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2ZpbHRlcih2YWx1ZTogSW5wdXRFdmVudCk6IFNtYXJ0SXRlbTxhbnk+W10ge1xyXG4gICAgbGV0IGZpbHRlclZhbHVlID0gKHZhbHVlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8udmFsdWU7XHJcbiAgICB0aGlzLnRvSGlnaGxpZ2h0ID0gZmlsdGVyVmFsdWU7XHJcblxyXG4gICAgaWYgKCFmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICBmaWx0ZXJWYWx1ZSA9ICcnO1xyXG4gICAgICB0aGlzLnRvSGlnaGxpZ2h0ID0gZmlsdGVyVmFsdWU7XHJcbiAgICB9XHJcbiAgICBmaWx0ZXJWYWx1ZSA9IGZpbHRlclZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRCAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogU21hcnRJdGVtPGFueT5bXSA9IGZpbHRlclZhbHVlXHJcbiAgICAgICAgPyB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdC5maWx0ZXIoKG9wdGlvbjogU21hcnRJdGVtPGFueT4pID0+XHJcbiAgICAgICAgICAgIG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIDogdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3Q7XHJcbiAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwICYmIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0Lmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIHZhbHVlcyBhZnRlciB0aGUgZmlsdGVyIG9wZXJhdGlvbiBidXQgd2UgZm91bmQgbm9uZTpcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmVycm9yID0gdGhpcy53aWRnZXRJbnN0YW5jZS5maWx0ZXJFcnJvck1lc3NhZ2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gd2UgZWl0aGVyIGZvdW5kIHZhbHVlcywgb3IgdGhlcmUgd2VyZSBubyB2YWx1ZXMgdG8gYmVnaW4gd2l0aDpcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmVycm9yID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgZGF0ZUZpbHRlcihkOiBEYXRlIHwgbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXRNYXRyaXhEaXNwbGF5VmFsdWUocXVlc3Rpb246IFZhbHVlLCBrZXk6IHN0cmluZykge1xyXG4gICAgKHRoaXMud2lkZ2V0SW5zdGFuY2UgYXMgU21hcnRNYXRyaXgpLnZhbHVlW2tleV0uZmluZCgodmFsdWU6IFZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZS5jb2RlID09IHF1ZXN0aW9uLmNvZGUpIHJldHVybiBxdWVzdGlvbi5kaXNwbGF5VmFsdWU7XHJcbiAgICAgIGVsc2UgcmV0dXJuIHF1ZXN0aW9uLmNvZGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVllYXJNb250aFBpY2tlZCh5ZWFyTW9udGhWYWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnNldERhdGVGb3JtQ29udHJvbCh0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXSwgeWVhck1vbnRoVmFsdWUsICcwMDowMCcpO1xyXG4gIH1cclxuXHJcbiAgY29tcGFyZUl0ZW1zKG8xOiBhbnksIG8yOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGZ1bmN0aW9uIGNvbnZlcnQob2JqOiBhbnkpOiBhbnkge1xyXG4gICAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIG9iai5yZXBsYWNlKC9cXC52WzAtOV0rJC8sICcnKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG4gICAgLy8gY2FsbGluZyB0aGlzLnRydW5jYXRlVXJpIGRpZG4ndCB3b3JrXHJcbiAgICAvLyBUT0RPOiB1c2Ugd2lkZ2V0LnNlbGVjdGlvbi5wYXJhbWV0ZXIgZm9yIGlnbm9yZVVyaVZlcnNpb24gLyBzdHJpY3RVcmlDb21wYXJpc29uO1xyXG5cclxuICAgIGxldCB2MSA9IGNvbnZlcnQobzEpO1xyXG4gICAgbGV0IHYyID0gY29udmVydChvMik7XHJcbiAgICByZXR1cm4gZGVlcEVxdWFsKHYxLCB2Mik7XHJcbiAgfVxyXG5cclxuICB0cnVuY2F0ZVVyaSh1cmk6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodXJpICYmIHR5cGVvZiB1cmkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiB1cmkucmVwbGFjZSgvXFwudlswLTldKyQvLCAnJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXJpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTWF0cml4Um93KHF1ZXN0aW9uOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKHF1ZXN0aW9uKTtcclxuICAgICh0aGlzLndpZGdldEluc3RhbmNlIGFzIFNtYXJ0TWF0cml4KS5idXR0b24/LmNhbGxiYWNrKHRoaXMud2lkZ2V0SW5zdGFuY2UsIHF1ZXN0aW9uKTtcclxuICB9XHJcblxyXG4gIGlzVG9vbGJhclByZXNlbnQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTEQgfHxcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVBcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS50b29sYmFySWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLndpZGdldEluc3RhbmNlLnRvb2xiYXJJZCAhPT0gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldENoaXBzVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgaWYgKCduYW1lJyBpbiB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZVsnbmFtZSddO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICgnZGlzcGxheVZhbHVlJyBpbiB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZVsnZGlzcGxheVZhbHVlJ107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG4gIDxkaXZcclxuICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnXCJcclxuICAgIGNsYXNzPVwiY29udGFpbmVyXCJcclxuICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaXNWaXNpYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogd2lkZ2V0SW5zdGFuY2UuaXNWaXNpYmxlXCJcclxuICA+XHJcbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVJcIiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxyXG4gICAgICA8c21hcnRmb3Jtd2lkZ2V0XHJcbiAgICAgICAgKm5nRm9yPVwibGV0IHdpZGdldCBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcIlxyXG4gICAgICAgIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRcIlxyXG4gICAgICAgIGNsYXNzPVwiY29udGFpbmVyLWl0ZW1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldC5jc3NDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgW29uQmx1cl09XCJvbkJsdXJcIlxyXG4gICAgICAgIFtvblZhbHVlQ2hhbmdlXT1cIm9uVmFsdWVDaGFuZ2VcIlxyXG4gICAgICAgIFtzb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2VdPVwic29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXCJcclxuICAgICAgICBjbGFzcz1cInt7IHdpZGdldC5rZXkgfX1cIlxyXG4gICAgICAgIFtsYWJlbENvbG9yXT1cImxhYmVsQ29sb3JcIlxyXG4gICAgICA+PC9zbWFydGZvcm13aWRnZXQ+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2XHJcbiAgICAgIChjYXBzTG9jayk9XCJjYXBzT24gPSAkZXZlbnRcIlxyXG4gICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRFwiXHJcbiAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICBjbGFzcz1cImlucHV0IHRleHRGaWVsZCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvbWF0LWxhYmVsPlxyXG5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNlbGVjdGlvblwiXHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFthdHRyLmlucHV0bW9kZV09XCJcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaW5wdXRNb2RlID8gd2lkZ2V0SW5zdGFuY2UuaW5wdXRNb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiAndGV4dCdcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBbdHlwZV09XCInc3RyaW5nJ1wiXHJcbiAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVyPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICB0eXBlPVwie3sgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZCA/IChoaWRlUGFzc3dvcmQgPyAncGFzc3dvcmQnIDogJ3RleHQnKSA6ICcnIH19XCJcclxuICAgICAgICAgIFttYXNrXT1cIndpZGdldEluc3RhbmNlLm1hc2sgPz8gJydcIlxyXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25LZXlkb3duKClcIlxyXG4gICAgICAgICAgbWF4bGVuZ3RoPVwie3sgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoIH19XCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zZWxlY3Rpb25cIlxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbdHlwZV09XCInc3RyaW5nJ1wiXHJcbiAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVyPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICB0eXBlPVwie3sgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZCA/ICdwYXNzd29yZCcgOiAnJyB9fVwiXHJcbiAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cInRleHRGaWVsZEF1dG9cIlxyXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25LZXlkb3duKClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkXCJcclxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KCRldmVudClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj57eyBoaWRlUGFzc3dvcmQgPyAndmlzaWJpbGl0eV9vZmYnIDogJ3Zpc2liaWxpdHknIH19PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjdGV4dEZpZWxkQXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMgfCBhc3luY1wiIFt2YWx1ZV09XCJvcHRpb24ubGFiZWxcIj5cclxuICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJvcHRpb24ubGFiZWwgfCBoaWdobGlnaHQgOiB0b0hpZ2hsaWdodFwiPjwvc3Bhbj5cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIiAqbmdJZj1cImNhcHNPbiAmJiB3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5jYXBzTG9ja1dhcm5pbmcgfX1cclxuICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHNwYW4gbWF0UHJlZml4PlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJjYXBzT24gJiYgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZFwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmNhcHNMb2NrV2FybmluZ0ljb24gPz8gJ2tleWJvYXJkX2NhcHNsb2NrJ1wiXHJcbiAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pY29uICYmIHdpZGdldEluc3RhbmNlLmljb25Qb3NpdGlvbiA9PT0gJ1BSRSdcIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcclxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmljb25Db2xvciA/PyAncHJpbWFyeSdcIlxyXG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnByZWZpeCB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5zdWZmaXggfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmljb24gJiZcclxuICAgICAgICAgICAgKCF3aWRnZXRJbnN0YW5jZS5pY29uUG9zaXRpb24gfHwgd2lkZ2V0SW5zdGFuY2UuaWNvblBvc2l0aW9uID09PSAnUE9TVCcpXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuaWNvblwiXHJcbiAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuaWNvbkNvbG9yID8/ICdwcmltYXJ5J1wiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICA+PC9zbWFydC1pY29uPlxyXG5cclxuICAgICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXJcclxuICAgICAgICAgICN0b29sYmFyXHJcbiAgICAgICAgICAqbmdJZj1cImlzVG9vbGJhclByZXNlbnQoKVwiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxyXG4gICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uXCJcclxuICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgY29sb3I9XCJ7eyB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uY29sb3IgfX1cIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5jYWxsYmFjayh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25Qb3NpdGlvbiA9PT1cclxuICAgICAgICAgICAgICAgIHNtYXJ0Rm9ybVRleHRGaWVsZEJ1dHRvbkljb25Qb3NpdGlvbigpLlBSRSAmJiB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvbkNvbG9yXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvc21hcnQtaWNvbj5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblBvc2l0aW9uID09PVxyXG4gICAgICAgICAgICAgICAgc21hcnRGb3JtVGV4dEZpZWxkQnV0dG9uSWNvblBvc2l0aW9uKCkuUE9TVCAmJiB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3NtYXJ0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPG1hdC1oaW50XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dDaGFyYWN0ZXJMaW1pdFN1ZmZpeCAmJiB3aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGhcIlxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICBhbGlnbj1cImVuZFwiXHJcbiAgICAgICAgICA+e3sgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoIC0gZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLmxlbmd0aCB9fTwvbWF0LWhpbnRcclxuICAgICAgICA+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtaGludFxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAhd2lkZ2V0SW5zdGFuY2U/LmhpbnQgfHwgd2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5JTlBVVFxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICAgID5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTlVNQkVSXCJcclxuICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgdGV4dEZpZWxkIHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICBbcmVhZG9ubHldPVwid2lkZ2V0SW5zdGFuY2UuaXNSZWFkb25seVwiXHJcbiAgICAgICAgICBbdHlwZV09XCInbnVtYmVyJ1wiXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgIFttaW5dPVwid2lkZ2V0SW5zdGFuY2UubWluVmFsdWVzID8/IG51bGxcIlxyXG4gICAgICAgICAgW21heF09XCJ3aWRnZXRJbnN0YW5jZS5tYXhWYWx1ZXMgPz8gbnVsbFwiXHJcbiAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgKGJsdXIpPVwib25CbHVyPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gbWF0UHJlZml4PlxyXG4gICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UucHJlZml4IH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIG1hdFN1ZmZpeD5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnN1ZmZpeCB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c21hcnQtaWNvbiAqbmdJZj1cIndpZGdldEluc3RhbmNlLmljb25cIiBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCIgbWF0U3VmZml4PlxyXG4gICAgICAgIDwvc21hcnQtaWNvbj5cclxuICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvblwiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgIGNvbG9yPVwie3sgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmNvbG9yIH19XCJcclxuICAgICAgICAgIChjbGljayk9XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uY2FsbGJhY2sod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uUG9zaXRpb24gPT09XHJcbiAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QUkUgJiYgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25cclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPC9zbWFydC1pY29uPlxyXG4gICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmxhYmVsIH19XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uUG9zaXRpb24gPT09XHJcbiAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QT1NUICYmIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvc21hcnQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFNcIlxyXG4gICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxtYXQtY2hpcC1saXN0ICNjaGlwTGlzdCBhcmlhLWxhYmVsPVwie3sgd2lkZ2V0SW5zdGFuY2UubGFiZWwgfX1cIj5cclxuICAgICAgICAgIDxtYXQtY2hpcFxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZSh2YWx1ZSlcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyB2YWx1ZSB9fVxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdENoaXBSZW1vdmU+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9tYXQtY2hpcD5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAjY2hpcElucHV0XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgICBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBMaXN0XCJcclxuICAgICAgICAgICAgW21hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzXT1cInNlcGFyYXRvcktleXNDb2Rlc1wiXHJcbiAgICAgICAgICAgIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwiYWRkT25CbHVyXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImNoaXBBdXRvXCJcclxuICAgICAgICAgICAgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImFkZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXHJcbiAgICAgICAgICAgICNjaGlwQXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJzZWxlY3RlZCgkZXZlbnQsIHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiXHJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgPC9tYXQtY2hpcC1saXN0PlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTE9PS1VQXCJcclxuICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWxhYmVsXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LWNoaXAtbGlzdCAjY2hpcExpc3RMb29rdXAgYXJpYS1sYWJlbD1cInt7IHdpZGdldEluc3RhbmNlLmxhYmVsIH19XCI+XHJcbiAgICAgICAgICA8bWF0LWNoaXBcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgdmFsdWUgb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmUodmFsdWUpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0Q2hpcHNWYWx1ZSh2YWx1ZSkgfX1cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbWF0LWNoaXA+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RMb29rdXBcIlxyXG4gICAgICAgICAgICBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwiZW1wdHlTZXBhcmF0b3JLZXlzQ29kZXNcIlxyXG4gICAgICAgICAgICBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInRydWVcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cclxuICAgICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXJcclxuICAgICAgICAgICN0b29sYmFyXHJcbiAgICAgICAgICAqbmdJZj1cImlzVG9vbGJhclByZXNlbnQoKVwiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxyXG4gICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfQk9YXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFt0eXBlXT1cIidzdHJpbmcnXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICBbcmVhZG9ubHldPVwid2lkZ2V0SW5zdGFuY2UuaXNSZWFkb25seVwiXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAoYmx1cik9XCJvbkJsdXI/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICBtYXhsZW5ndGg9XCJ7eyB3aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGggfX1cIlxyXG4gICAgICAgID48L3RleHRhcmVhPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICA8bWF0LWhpbnRcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0NoYXJhY3RlckxpbWl0U3VmZml4ICYmIHdpZGdldEluc3RhbmNlLm1heExlbmd0aFwiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgIGFsaWduPVwiZW5kXCJcclxuICAgICAgICAgID57eyB3aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGggLSBmb3JtLmNvbnRyb2xzW3dpZGdldEluc3RhbmNlLmtleV0udmFsdWUubGVuZ3RoIH19PC9tYXQtaGludFxyXG4gICAgICAgID5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1oaW50XHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICF3aWRnZXRJbnN0YW5jZS5oaW50IHx8IHdpZGdldEluc3RhbmNlLmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5JTlBVVFxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICAgID5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWFwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgY2hlY2tib3ggd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwicmFkaW9MYWJlbFwiICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjaGVja2JveC1zZWN0aW9uXCIgW25nQ2xhc3NdPVwiZ2V0RGlyZWN0aW9uKClcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC1pdGVtLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjaGVja2JveCBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3Q7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjaGVja2JveC5pbWFnZVVybFwiXHJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtaXRlbS1pbWFnZVwiXHJcbiAgICAgICAgICAgICAgW3NyY109XCJjaGVja2JveC5pbWFnZVVybFwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjYXRibGVPYmplY3RcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY2hlY2tib3gudmFsdWVcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dChjaGVja2JveClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgY2hlY2tib3gubGFiZWwgfX1cclxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpby1lcnJvclwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWF8yXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJpbnB1dCBjaGVja2JveCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJyYWRpb0xhYmVsXCIgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNoZWNrYm94LXNlY3Rpb25cIiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LWl0ZW0tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoZWNrYm94IG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdDsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAqbmdJZj1cImNoZWNrYm94LmltYWdlVXJsXCJcclxuICAgICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC1pdGVtLWltYWdlXCJcclxuICAgICAgICAgICAgICBbc3JjXT1cImNoZWNrYm94LmltYWdlVXJsXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2VsZWNhdGJsZU9iamVjdFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5ICsgJy4nICsgY2hlY2tib3gua2V5IH19XCJcclxuICAgICAgICAgICAgICBbdmFsdWVdPVwiY2hlY2tib3gudmFsdWVcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dChjaGVja2JveClcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkIVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyBjaGVja2JveC5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWVycm9yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlJBRElPX0JVVFRPTlwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG1hdC1yYWRpby1ncm91cFxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgcmFkaW8tc2VjdGlvbiB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJ7eyB3aWRnZXRJbnN0YW5jZS5sYWJlbCB9fVwiXHJcbiAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwicmFkaW9MYWJlbFwiICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWl0ZW0tY29udGFpbmVyXCIgKm5nRm9yPVwibGV0IHJhZGlvIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiPlxyXG4gICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJyYWRpby5pbWFnZVVybFwiXHJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicmFkaW8taXRlbS1pbWFnZVwiXHJcbiAgICAgICAgICAgICAgW3NyY109XCJyYWRpby5pbWFnZVVybFwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY2F0YmxlT2JqZWN0XCJcclxuICAgICAgICAgICAgICB2YWx1ZT1cInt7IHJhZGlvLnZhbHVlIH19XCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KHJhZGlvLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgcmFkaW8ubGFiZWwgfX1cclxuICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2XHJcbiAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1BJQ0tFUlwiXHJcbiAgICAgIGNsYXNzPVwiZGF0ZVBpY2tlciB3aWRnZXRDb250YWluZXJcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCBkYXRlIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwicGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXIgKGNsb3NlZCk9XCJvbkJsdXI/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCI+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICBbbWluXT1cIndpZGdldEluc3RhbmNlLm1pbkRhdGUgPz8gbnVsbFwiXHJcbiAgICAgICAgICBbbWF4XT1cIndpZGdldEluc3RhbmNlLm1heERhdGUgPz8gbnVsbFwiXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiXHJcbiAgICAgICAgICAoYmx1cik9XCJvbkJsdXI/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAgIFttYXREYXRlcGlja2VyRmlsdGVyXT1cIndpZGdldEluc3RhbmNlLmZpbHRlciA/PyBkYXRlRmlsdGVyXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICA8bWF0LWhpbnQ+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5kYXRlRm9ybWF0SGludCB9fVxyXG4gICAgICAgIDwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIDxkaXZcclxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVJcIlxyXG4gICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgPGg0IGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbFwiPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudFwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IHdpZGdldEluc3RhbmNlLm1pbldpZHRoICsgJ3B4JyB9XCJcclxuICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWxhYmVsXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cIiRhbnkocGlja2VyKVwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgIDxuZ3gtbWF0LWRhdGV0aW1lLXBpY2tlclxyXG4gICAgICAgICAgI3BpY2tlclxyXG4gICAgICAgICAgW3Nob3dTcGlubmVyc109XCJ0cnVlXCJcclxuICAgICAgICAgIFtzaG93U2Vjb25kc109XCJmYWxzZVwiXHJcbiAgICAgICAgICBbc3RlcEhvdXJdPVwiMVwiXHJcbiAgICAgICAgICBbc3RlcE1pbnV0ZV09XCIxXCJcclxuICAgICAgICAgIFtzdGVwU2Vjb25kXT1cIjEwXCJcclxuICAgICAgICAgIFt0b3VjaFVpXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtjb2xvcl09XCIncHJpbWFyeSdcIlxyXG4gICAgICAgICAgW2VuYWJsZU1lcmlkaWFuXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtkaXNhYmxlTWludXRlXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtoaWRlVGltZV09XCJmYWxzZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvbmd4LW1hdC1kYXRldGltZS1waWNrZXI+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICBbbmd4TWF0RGF0ZXRpbWVQaWNrZXJdPVwicGlja2VyXCJcclxuICAgICAgICAgIFtuZ3hNYXREYXRldGltZVBpY2tlckZpbHRlcl09XCJ3aWRnZXRJbnN0YW5jZS5maWx0ZXIgPz8gZGF0ZUZpbHRlclwiXHJcbiAgICAgICAgICAoYmx1cik9XCJvbkJsdXI/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICA8bWF0LWhpbnQ+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5kYXRlRm9ybWF0SGludCB9fVxyXG4gICAgICAgIDwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgPGRpdlxyXG4gICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUlwiXHJcbiAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZVRpbWVQaWNrZXJDb250YWluZXJcIj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCBkYXRlIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwicGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlciAoY2xvc2VkKT1cIm9uQmx1cj8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIj48L21hdC1kYXRlcGlja2VyPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICNkYXRlSW5wdXRcclxuICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uRGF0ZVBpY2tlckJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAgICAgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwid2lkZ2V0SW5zdGFuY2UuZmlsdGVyID8/IGRhdGVGaWx0ZXJcIlxyXG4gICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8bWF0LWhpbnQ+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmRhdGVGb3JtYXRIaW50IH19XHJcbiAgICAgICAgICA8L21hdC1oaW50PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICAqbmdJZj1cImhhc0NyZWF0ZWRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHRpbWVcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkZ2V0SW5zdGFuY2UubWluV2lkdGggKyAncHgnIH1cIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAjdGltZUlucHV0XHJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5ICsgJy10aW1lJ1wiXHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbdHlwZV09XCIndGltZSdcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25UaW1lUGlja2VyQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPG1hdC1zZWxlY3RcclxuICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQudmFsdWUpXCJcclxuICAgICAgICAgIChjbG9zZWQpPVwib25CbHVyPy5uZXh0KHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZCFcIlxyXG4gICAgICAgICAgW2NvbXBhcmVXaXRoXT1cIlxyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aCA9PSBudWxsID8gY29tcGFyZUl0ZW1zIDogd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGhcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyID8gd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgOiAnJyB9fVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGdyb3VwXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gZ2V0VHlwZSgpLklURU1fR1JPVVBcIlxyXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGlubmVyT3B0aW9uIG9mIG9wdGlvbi52YWx1ZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImlubmVyT3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpbm5lck9wdGlvbi5pc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImlubmVyT3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICBbaWNvbl09XCJpbm5lck9wdGlvbi5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImlubmVyT3B0aW9uLmljb25Db2xvclwiXHJcbiAgICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICAgICAge3sgaW5uZXJPcHRpb24ubGFiZWwgfX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09IGdldFR5cGUoKS5JVEVNXCJcclxuICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgW2ljb25dPVwib3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIm9wdGlvbi5pY29uQ29sb3JcIlxyXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb25cclxuICAgICAgICAgICAgICA+e3sgb3B0aW9uLmxhYmVsIH19PC9tYXQtb3B0aW9uXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtaGludFxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAhd2lkZ2V0SW5zdGFuY2U/LmhpbnQgfHwgd2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5JTlBVVFxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICAgID5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRVwiXHJcbiAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPG1hdC1zZWxlY3RcclxuICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIG11bHRpcGxlXHJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50LnZhbHVlKVwiXHJcbiAgICAgICAgICAoY2xvc2VkKT1cIm9uQmx1cj8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQhXCJcclxuICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGggPT0gbnVsbCA/IGNvbXBhcmVJdGVtcyA6IHdpZGdldEluc3RhbmNlLmNvbXBhcmVXaXRoXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciA/IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIDogJycgfX1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcIj5cclxuICAgICAgICAgICAgPG1hdC1vcHRncm91cFxyXG4gICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09IGdldFR5cGUoKS5JVEVNX0dST1VQXCJcclxuICAgICAgICAgICAgICBbbGFiZWxdPVwib3B0aW9uLmxhYmVsXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpbm5lck9wdGlvbiBvZiBvcHRpb24udmFsdWVMaXN0XCJcclxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpbm5lck9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaW5uZXJPcHRpb24uaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpbm5lck9wdGlvbi5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgW2ljb25dPVwiaW5uZXJPcHRpb24uaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJpbm5lck9wdGlvbi5pY29uQ29sb3JcIlxyXG4gICAgICAgICAgICAgICAgPjwvc21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgPnt7IGlubmVyT3B0aW9uLmxhYmVsIH19PC9tYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L21hdC1vcHRncm91cD5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi50eXBlID09PSBnZXRUeXBlKCkuSVRFTVwiXHJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5pc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi5pY29uXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cIm9wdGlvbi5pY29uXCJcclxuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJvcHRpb24uaWNvbkNvbG9yXCJcclxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgPnt7IG9wdGlvbi5sYWJlbCB9fTwvbWF0LW9wdGlvblxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWhpbnRcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgIXdpZGdldEluc3RhbmNlPy5oaW50IHx8IHdpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uSU5QVVRcclxuICAgICAgICBcIlxyXG4gICAgICAgID57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9tYXQtaGludFxyXG4gICAgICA+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2XHJcbiAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTFwiXHJcbiAgICAgIGNsYXNzPVwibGFiZWwgd2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkZ2V0SW5zdGFuY2UubWluV2lkdGggKyAncHgnIH1cIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtdGl0bGUgbGFiZWxDb250YWluZXJcIiBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJ1wiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxwPnt7IHdpZGdldEluc3RhbmNlLndpZGdldERlc2NyaXB0aW9uIH19PC9wPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRJTUVcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB0aW1lIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbdHlwZV09XCIndGltZSdcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cImdldFRpbWUoKVwiXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAoYmx1cik9XCJvbkJsdXI/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRPR0dMRVwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCAge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxyXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICAgIHZhbHVlPVwie3sgd2lkZ2V0SW5zdGFuY2UudmFsdWUgfX1cIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgW2xhYmVsUG9zaXRpb25dPVwid2lkZ2V0SW5zdGFuY2UudG9nZ2xlTGFiZWxQb3NpdGlvbiA/PyAnYmVmb3JlJ1wiXHJcbiAgICAgICAgICA+e3sgIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbCA/IHdpZGdldEluc3RhbmNlLmxhYmVsIDogJycgfX08L21hdC1zbGlkZS10b2dnbGVcclxuICAgICAgICA+PHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1JcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICA8aDRcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IGxhYmVsQ29udGFpbmVyIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgIDwvaDQ+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWFydEluZGljYXRvciB3aWRnZXRDb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvckl0ZW1zIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCIgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGluZGljYXRvckl0ZW1zOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJpbmRpY2F0b3JJdGVtXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0SW5kaWNhdG9ySXRlbUNsYXNzKGkpXCJcclxuICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cCBbbmdDbGFzc109XCJnZXRJbmRpY2F0b3JTdGF0dXNMYWJlbENvbG9yKClcIj5cclxuICAgICAgICAgIHt7IGdldEluZGljYXRvclN0YXR1c0xhYmVsKCkgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUlwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxoNFxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICBjbGFzcz1cImxhYmVsQ29udGFpbmVyIHt7IGxhYmVsQ29sb3IgfX0ge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgPC9oND5cclxuICAgICAgPHNtYXJ0ZmlsZXVwbG9hZGVyXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgIFt1cGxvYWRDYWxsYmFja109XCJ1cGxvYWQuYmluZCh0aGlzKVwiXHJcbiAgICAgICAgW2ZpbGVGb3JtYXRzXT1cIndpZGdldEluc3RhbmNlLmZpbGVGb3JtYXRzXCJcclxuICAgICAgICBbbWF4U2l6ZU1iXT1cIndpZGdldEluc3RhbmNlLm1heFNpemVNYlwiXHJcbiAgICAgICAgW2kxOG5dPVwid2lkZ2V0SW5zdGFuY2UuaTE4blwiXHJcbiAgICAgID48L3NtYXJ0ZmlsZXVwbG9hZGVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0VcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICA8aDRcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgY2xhc3M9XCJsYWJlbENvbnRhaW5lciB7eyBsYWJlbENvbG9yIH19IHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgIDwvaDQ+XHJcbiAgICAgIDxpbWdcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuaW1hZ2VDc3MgPz8gJycgfX1cIlxyXG4gICAgICAgIHRpdGxlPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgIFtzcmNdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGg0XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgIGNsYXNzPVwibGFiZWxDb250YWluZXIge3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICA8L2g0PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICBbaW5uZXJIVE1MXT1cImdldFdpZGdldFN2Zyh3aWRnZXRJbnN0YW5jZS52YWx1ZSlcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgID48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVJcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICA8aHJcclxuICAgICAgICBjbGFzcz1cInNtYXJ0RGl2aWRlciB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTlwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxoNFxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICBjbGFzcz1cImxhYmVsQ29udGFpbmVyIHt7IGxhYmVsQ29sb3IgfX0ge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgPC9oND5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldEJ1dHRvblR5cGUod2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yKVwiXHJcbiAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5jb2xvclwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25CdXR0b25DbGlja2VkKHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAqbmdJZj1cImlzT25seUljb24od2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yKTsgdGhlbiBpY29uT25seTsgZWxzZSB0ZXh0XCJcclxuICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaWNvbk9ubHk+XHJcbiAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb25cIlxyXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvciEuaWNvbiFcIlxyXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJcclxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvbkNvbG9yID8/XHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3RleHQ+XHJcbiAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvbiAmJlxyXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uUG9zaXRpb24gPT09ICdQUkUnXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IhLmljb24hXCJcclxuICAgICAgICAgICAgICBbY29sb3JdPVwiXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb25Db2xvciA/P1xyXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5jb2xvclxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8udGl0bGUgfX1cclxuICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uICYmXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb25Qb3NpdGlvbiA9PT0gJ1BPU1QnXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IhLmljb24hXCJcclxuICAgICAgICAgICAgICBbY29sb3JdPVwiXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb25Db2xvciA/P1xyXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5jb2xvclxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGg0XHJcbiAgICAgICAgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiXHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJiB3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgPC9oND5cclxuICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2N1c3RvbUNvbXBvbmVudD48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlJJQ0hfVEVYVFwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiPlxyXG4gICAgICAgIDxoNCAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGVudFwiPlxyXG4gICAgICAgIDxxdWlsbC1lZGl0b3JcclxuICAgICAgICAgICNxdWlsbEVkaXRvclxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbbW9kdWxlc109XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkID8gZW1wdHlRdWlsbFRvb2xiYXIgOiB3aWRnZXRJbnN0YW5jZS5xdWlsbE1vZHVsZXNcIlxyXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIndpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIFtyZWFkT25seV09XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5XCJcclxuICAgICAgICAgIFttYXhMZW5ndGhdPVwid2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcclxuICAgICAgICAgIChvbkNvbnRlbnRDaGFuZ2VkKT1cIm9uUmljaFRleHRFZGl0b3JDb250ZW50Q2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICA+PC9xdWlsbC1lZGl0b3I+XHJcbiAgICAgICAgPG1hdC1oaW50XHJcbiAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAhd2lkZ2V0SW5zdGFuY2U/LmhpbnQgfHxcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5JTlBVVFxyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgID57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9tYXQtaGludFxyXG4gICAgICAgID5cclxuICAgICAgICA8bWF0LWhpbnRcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0NoYXJhY3RlckxpbWl0U3VmZml4ICYmIHdpZGdldEluc3RhbmNlLm1heExlbmd0aFwiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgIGFsaWduPVwiZW5kXCJcclxuICAgICAgICAgIGNsYXNzPVwicmljaC10ZXh0LWVkaXRvci1sZWV3YXktY291bnRlclwiXHJcbiAgICAgICAgICA+e3sgZ2V0UmljaFRleHRFZGl0b3JMZW5ndGhMZWV3YXkoKSB9fTwvbWF0LWhpbnRcclxuICAgICAgICA+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU09SVEFCTEVcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cclxuICAgICAgICA8aDQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIiBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIj5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cclxuICAgICAgICA8bGliLXNvcnRhYmxlLXdpZGdldFxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldEluc3RhbmNlXCJcclxuICAgICAgICA+PC9saWItc29ydGFibGUtd2lkZ2V0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLk1BVFJJWFwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cclxuICAgICAgPGg0ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCIgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCI+XHJcbiAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgIDwvaDQ+XHJcbiAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPHRhYmxlIGNsYXNzPVwibWF0cml4VGFibGUgd2lkZ2V0Q29udGVudFwiPlxyXG4gICAgICA8dHI+XHJcbiAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgPHRoIGNsYXNzPVwib3B0aW9uTGFiZWxcIiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlLmNvbHVtbnNcIj5cclxuICAgICAgICAgIHt7IG9wdGlvbi5kaXNwbGF5VmFsdWUgfX1cclxuICAgICAgICA8L3RoPlxyXG4gICAgICA8L3RyPlxyXG4gICAgICA8dHIgKm5nRm9yPVwibGV0IHF1ZXN0aW9uIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlLnJvd3M7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICA8dGggY2xhc3M9XCJxdWVzdGlvbkxhYmVsXCI+XHJcbiAgICAgICAgICA8bGFiZWw+e3sgcXVlc3Rpb24uZGlzcGxheVZhbHVlIH19PC9sYWJlbD5cclxuICAgICAgICA8L3RoPlxyXG5cclxuICAgICAgICA8dGQgY2xhc3M9XCJzZWxlY3RUZFwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWUuY29sdW1uczsgbGV0IGogPSBpbmRleFwiPlxyXG4gICAgICAgICAgPG1hdC1yYWRpby1ncm91cFxyXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5pc011bHRpcGxlXCJcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXkgKyAnLicgKyBxdWVzdGlvbi5jb2RlXCJcclxuICAgICAgICAgICAgW25hbWVdPVwiJ3EnICsgaVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFt2YWx1ZV09XCJvcHRpb24uY29kZVwiPiA8L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pc011bHRpcGxlXCI+XHJcbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleSArICcuZGF0YS4nICsgcXVlc3Rpb24uY29kZSArICcuJyArIG9wdGlvbi5jb2RlXCJcclxuICAgICAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVbJ2RhdGEnXVtxdWVzdGlvbi5jb2RlXVtvcHRpb24uY29kZV1cIlxyXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInRydWVcIlxyXG4gICAgICAgICAgICA+PC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDxiciAvPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5idXR0b25cIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlbW92ZU1hdHJpeFJvdyhxdWVzdGlvbilcIlxyXG4gICAgICAgICAgPjxzbWFydC1pY29uIGljb249XCJjbG9zZVwiPjwvc21hcnQtaWNvblxyXG4gICAgICAgID48L2J1dHRvbj5cclxuICAgICAgPC90cj5cclxuICAgIDwvdGFibGU+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuWU9VVFVCRV9QTEFZRVJcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCI+XHJcbiAgICAgIDxoNFxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0ge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyB9fVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgPC9oND5cclxuICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDx5b3V0dWJlLXBsYXllclxyXG4gICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgdmlkZW9JZD1cInt7IHdpZGdldEluc3RhbmNlLnZpZGVvSWQgfX1cIlxyXG4gICAgICBbd2lkdGhdPVwid2lkZ2V0SW5zdGFuY2Uud2lkdGhcIlxyXG4gICAgICBbaGVpZ2h0XT1cIndpZGdldEluc3RhbmNlLmhlaWdodFwiXHJcbiAgICAgIFtzdGFydFNlY29uZHNdPVwid2lkZ2V0SW5zdGFuY2Uuc3RhcnRTZWNvbmRzXCJcclxuICAgICAgW2VuZFNlY29uZHNdPVwid2lkZ2V0SW5zdGFuY2UuZW5kU2Vjb25kc1wiXHJcbiAgICA+PC95b3V0dWJlLXBsYXllcj5cclxuICAgIDxtYXQtaGludFxyXG4gICAgICAqbmdJZj1cIlxyXG4gICAgICAgICF3aWRnZXRJbnN0YW5jZT8uaGludCB8fCB3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXHJcbiAgICAgIFwiXHJcbiAgICAgID57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9tYXQtaGludFxyXG4gICAgPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLk1PTlRIX1BJQ0tFUlwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICA8aDQgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsXCI+XHJcbiAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgIDwvaDQ+XHJcbiAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bGliLXNtYXJ0LW1vbnRoLXBpY2tlclxyXG4gICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0SW5zdGFuY2VcIlxyXG4gICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlWWVhck1vbnRoUGlja2VkKCRldmVudClcIlxyXG4gICAgPjwvbGliLXNtYXJ0LW1vbnRoLXBpY2tlcj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==