@ng-dynamic-forms/ui-ng-bootstrap
Version:
NG Bootstrap UI package for NG Dynamic Forms
186 lines • 49.1 kB
JavaScript
import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, HostBinding, Input, Output, ViewChild, ViewChildren, ViewContainerRef } from "@angular/core";
import { ReactiveFormsModule } from "@angular/forms";
import { DYNAMIC_FORM_CONTROL_TYPE_ARRAY, DYNAMIC_FORM_CONTROL_TYPE_CHECKBOX, DYNAMIC_FORM_CONTROL_TYPE_CHECKBOX_GROUP, DYNAMIC_FORM_CONTROL_TYPE_DATEPICKER, DYNAMIC_FORM_CONTROL_TYPE_GROUP, DYNAMIC_FORM_CONTROL_TYPE_INPUT, DYNAMIC_FORM_CONTROL_TYPE_RADIO_GROUP, DYNAMIC_FORM_CONTROL_TYPE_RATING, DYNAMIC_FORM_CONTROL_TYPE_SELECT, DYNAMIC_FORM_CONTROL_TYPE_SWITCH, DYNAMIC_FORM_CONTROL_TYPE_TEXTAREA, DYNAMIC_FORM_CONTROL_TYPE_TIMEPICKER, DynamicFormArrayComponent, DynamicFormControlContainerComponent, DynamicFormGroupComponent, DynamicTemplateDirective } from "@ng-dynamic-forms/core";
import { DynamicNGBootstrapCheckboxComponent } from "./checkbox/dynamic-ng-bootstrap-checkbox.component";
import { DynamicNGBootstrapCheckboxGroupComponent } from "./checkbox-group/dynamic-ng-bootstrap-checkbox-group.component";
import { DynamicNGBootstrapCalendarComponent } from "./calendar/dynamic-ng-bootstrap-calendar.component";
import { DynamicNGBootstrapDatePickerComponent } from "./datepicker/dynamic-ng-bootstrap-datepicker.component";
import { DynamicNGBootstrapInputComponent } from "./input/dynamic-ng-bootstrap-input.component";
import { DynamicNGBootstrapRadioGroupComponent } from "./radio-group/dynamic-ng-bootstrap-radio-group.component";
import { DynamicNGBootstrapRatingComponent } from "./rating/dynamic-ng-bootstrap-rating.component";
import { DynamicNGBootstrapSelectComponent } from "./select/dynamic-ng-bootstrap-select.component";
import { DynamicNGBootstrapSwitchComponent } from "./switch/dynamic-ng-bootstrap-switch.component";
import { DynamicNGBootstrapTextAreaComponent } from "./textarea/dynamic-ng-bootstrap-textarea.component";
import { DynamicNGBootstrapTimePickerComponent } from "./timepicker/dynamic-ng-bootstrap-timepicker.component";
import { NgClass, NgFor, NgTemplateOutlet, NgIf } from "@angular/common";
import * as i0 from "@angular/core";
import * as i1 from "@ng-dynamic-forms/core";
import * as i2 from "@angular/forms";
export class DynamicNGBootstrapFormControlContainerComponent extends DynamicFormControlContainerComponent {
constructor(changeDetectorRef, componentFactoryResolver, layoutService, validationService, componentService, relationService) {
super(changeDetectorRef, componentFactoryResolver, layoutService, validationService, componentService, relationService);
this.changeDetectorRef = changeDetectorRef;
this.componentFactoryResolver = componentFactoryResolver;
this.layoutService = layoutService;
this.validationService = validationService;
this.componentService = componentService;
this.relationService = relationService;
this.asBootstrapFormGroup = true;
this.context = null;
this.blur = new EventEmitter();
this.change = new EventEmitter();
this.focus = new EventEmitter();
// tslint:disable-next-line:no-output-rename
this.customEvent = new EventEmitter();
}
get componentType() {
return this.componentService.getCustomComponentType(this.model) || ngBootstrapUIFormControlMapFn(this.model);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicNGBootstrapFormControlContainerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ComponentFactoryResolver }, { token: i1.DynamicFormLayoutService }, { token: i1.DynamicFormValidationService }, { token: i1.DynamicFormComponentService }, { token: i1.DynamicFormRelationService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.3", type: DynamicNGBootstrapFormControlContainerComponent, isStandalone: true, selector: "dynamic-ng-bootstrap-form-control", inputs: { asBootstrapFormGroup: "asBootstrapFormGroup", context: "context", group: "group", hostClass: "hostClass", inputTemplateList: ["templates", "inputTemplateList"], layout: "layout", model: "model" }, outputs: { blur: "blur", change: "change", focus: "focus", customEvent: "ngbEvent" }, host: { properties: { "class": "this.klass" } }, queries: [{ propertyName: "contentTemplateList", predicate: DynamicTemplateDirective }], viewQueries: [{ propertyName: "componentViewContainerRef", first: true, predicate: ["componentViewContainer"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, ngImport: i0, template: "<div [class.form-group]=\"(model.type !== 'GROUP' && asBootstrapFormGroup) || getClass('element', 'container').includes('form-group')\"\n [formGroup]=\"group\"\n [ngClass]=\"['ng-dynamic-forms-'+model.type.toLowerCase(), getClass('element', 'container'), getClass('grid', 'container')]\">\n\n <label *ngIf=\"!isCheckbox && hasLabel\"\n [for]=\"id\"\n [innerHTML]=\"model.label\"\n [ngClass]=\"[getClass('element', 'label'), getClass('grid', 'label')]\"></label>\n\n <ng-container *ngTemplateOutlet=\"startTemplate?.templateRef; context: model\"></ng-container>\n\n <div [ngClass]=\"getClass('grid', 'control')\">\n\n <ng-container #componentViewContainer></ng-container>\n\n <small *ngIf=\"hasHint\" class=\"text-muted\" [innerHTML]=\"hint\" [ngClass]=\"getClass('element', 'hint')\"></small>\n\n <div *ngIf=\"showErrorMessages\" [ngClass]=\"[getClass('element', 'errors'), getClass('grid', 'errors')]\">\n <small *ngFor=\"let message of errorMessages\" class=\"invalid-feedback d-block\">{{ message }}</small>\n </div>\n\n </div>\n\n <ng-container *ngTemplateOutlet=\"endTemplate?.templateRef; context: model\"></ng-container>\n\n <ng-content></ng-content>\n\n</div>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicNGBootstrapFormControlContainerComponent, decorators: [{
type: Component,
args: [{ selector: "dynamic-ng-bootstrap-form-control", changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ReactiveFormsModule, NgClass, NgIf, NgTemplateOutlet, NgFor], template: "<div [class.form-group]=\"(model.type !== 'GROUP' && asBootstrapFormGroup) || getClass('element', 'container').includes('form-group')\"\n [formGroup]=\"group\"\n [ngClass]=\"['ng-dynamic-forms-'+model.type.toLowerCase(), getClass('element', 'container'), getClass('grid', 'container')]\">\n\n <label *ngIf=\"!isCheckbox && hasLabel\"\n [for]=\"id\"\n [innerHTML]=\"model.label\"\n [ngClass]=\"[getClass('element', 'label'), getClass('grid', 'label')]\"></label>\n\n <ng-container *ngTemplateOutlet=\"startTemplate?.templateRef; context: model\"></ng-container>\n\n <div [ngClass]=\"getClass('grid', 'control')\">\n\n <ng-container #componentViewContainer></ng-container>\n\n <small *ngIf=\"hasHint\" class=\"text-muted\" [innerHTML]=\"hint\" [ngClass]=\"getClass('element', 'hint')\"></small>\n\n <div *ngIf=\"showErrorMessages\" [ngClass]=\"[getClass('element', 'errors'), getClass('grid', 'errors')]\">\n <small *ngFor=\"let message of errorMessages\" class=\"invalid-feedback d-block\">{{ message }}</small>\n </div>\n\n </div>\n\n <ng-container *ngTemplateOutlet=\"endTemplate?.templateRef; context: model\"></ng-container>\n\n <ng-content></ng-content>\n\n</div>\n" }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ComponentFactoryResolver }, { type: i1.DynamicFormLayoutService }, { type: i1.DynamicFormValidationService }, { type: i1.DynamicFormComponentService }, { type: i1.DynamicFormRelationService }]; }, propDecorators: { contentTemplateList: [{
type: ContentChildren,
args: [DynamicTemplateDirective]
}], klass: [{
type: HostBinding,
args: ["class"]
}], asBootstrapFormGroup: [{
type: Input
}], context: [{
type: Input
}], group: [{
type: Input
}], hostClass: [{
type: Input
}], inputTemplateList: [{
type: Input,
args: ["templates"]
}], layout: [{
type: Input
}], model: [{
type: Input
}], blur: [{
type: Output
}], change: [{
type: Output
}], focus: [{
type: Output
}], customEvent: [{
type: Output,
args: ["ngbEvent"]
}], componentViewContainerRef: [{
type: ViewChild,
args: ["componentViewContainer", { read: ViewContainerRef, static: true }]
}] } });
export function ngBootstrapUIFormControlMapFn(model) {
switch (model.type) {
case DYNAMIC_FORM_CONTROL_TYPE_ARRAY:
return DynamicNGBootstrapFormArrayComponent;
case DYNAMIC_FORM_CONTROL_TYPE_CHECKBOX:
return DynamicNGBootstrapCheckboxComponent;
case DYNAMIC_FORM_CONTROL_TYPE_CHECKBOX_GROUP:
return DynamicNGBootstrapCheckboxGroupComponent;
case DYNAMIC_FORM_CONTROL_TYPE_DATEPICKER:
const datePickerModel = model;
return datePickerModel.inline ? DynamicNGBootstrapCalendarComponent : DynamicNGBootstrapDatePickerComponent;
case DYNAMIC_FORM_CONTROL_TYPE_GROUP:
return DynamicNGBootstrapFormGroupComponent;
case DYNAMIC_FORM_CONTROL_TYPE_INPUT:
return DynamicNGBootstrapInputComponent;
case DYNAMIC_FORM_CONTROL_TYPE_RADIO_GROUP:
return DynamicNGBootstrapRadioGroupComponent;
case DYNAMIC_FORM_CONTROL_TYPE_RATING:
return DynamicNGBootstrapRatingComponent;
case DYNAMIC_FORM_CONTROL_TYPE_SELECT:
return DynamicNGBootstrapSelectComponent;
case DYNAMIC_FORM_CONTROL_TYPE_SWITCH:
return DynamicNGBootstrapSwitchComponent;
case DYNAMIC_FORM_CONTROL_TYPE_TEXTAREA:
return DynamicNGBootstrapTextAreaComponent;
case DYNAMIC_FORM_CONTROL_TYPE_TIMEPICKER:
return DynamicNGBootstrapTimePickerComponent;
default:
return null;
}
}
export class DynamicNGBootstrapFormArrayComponent extends DynamicFormArrayComponent {
constructor(layoutService, validationService) {
super(layoutService, validationService);
this.layoutService = layoutService;
this.validationService = validationService;
this.blur = new EventEmitter();
this.change = new EventEmitter();
this.customEvent = new EventEmitter();
this.focus = new EventEmitter();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicNGBootstrapFormArrayComponent, deps: [{ token: i1.DynamicFormLayoutService }, { token: i1.DynamicFormValidationService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.3", type: DynamicNGBootstrapFormArrayComponent, isStandalone: true, selector: "dynamic-ng-bootstrap-form-array", inputs: { formLayout: "formLayout", group: "group", layout: "layout", model: "model", templates: "templates" }, outputs: { blur: "blur", change: "change", customEvent: "customEvent", focus: "focus" }, viewQueries: [{ propertyName: "components", predicate: DynamicNGBootstrapFormControlContainerComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container [formGroup]=\"group\">\n\n <div [formArrayName]=\"model.id\" [id]=\"id\" [ngClass]=\"getClass('element', 'control')\">\n\n <div *ngFor=\"let groupModel of model.groups; let idx = index\" role=\"group\"\n [formGroupName]=\"idx\" [ngClass]=\"[getClass('element', 'group'), getClass('grid', 'group')]\">\n\n <ng-container *ngTemplateOutlet=\"startTemplate?.templateRef; context: groupModel\"></ng-container>\n\n <dynamic-ng-bootstrap-form-control *ngFor=\"let _model of groupModel.group\"\n [context]=\"groupModel\"\n [group]=\"array.at(idx)\"\n [hidden]=\"_model.hidden\"\n [layout]=\"formLayout\"\n [model]=\"_model\"\n [templates]=\"templates\"\n [hostClass]=\"[getClass('element','children'), getClass('grid','children')]\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"\n (ngbEvent)=\"onCustomEvent($event, null, true)\"></dynamic-ng-bootstrap-form-control>\n\n <ng-container *ngTemplateOutlet=\"endTemplate?.templateRef; context: groupModel\"></ng-container>\n\n </div>\n\n </div>\n\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DynamicNGBootstrapFormControlContainerComponent, selector: "dynamic-ng-bootstrap-form-control", inputs: ["asBootstrapFormGroup", "context", "group", "hostClass", "templates", "layout", "model"], outputs: ["blur", "change", "focus", "ngbEvent"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicNGBootstrapFormArrayComponent, decorators: [{
type: Component,
args: [{ selector: "dynamic-ng-bootstrap-form-array", standalone: true, imports: [ReactiveFormsModule, NgClass, NgFor, NgTemplateOutlet, DynamicNGBootstrapFormControlContainerComponent], template: "<ng-container [formGroup]=\"group\">\n\n <div [formArrayName]=\"model.id\" [id]=\"id\" [ngClass]=\"getClass('element', 'control')\">\n\n <div *ngFor=\"let groupModel of model.groups; let idx = index\" role=\"group\"\n [formGroupName]=\"idx\" [ngClass]=\"[getClass('element', 'group'), getClass('grid', 'group')]\">\n\n <ng-container *ngTemplateOutlet=\"startTemplate?.templateRef; context: groupModel\"></ng-container>\n\n <dynamic-ng-bootstrap-form-control *ngFor=\"let _model of groupModel.group\"\n [context]=\"groupModel\"\n [group]=\"array.at(idx)\"\n [hidden]=\"_model.hidden\"\n [layout]=\"formLayout\"\n [model]=\"_model\"\n [templates]=\"templates\"\n [hostClass]=\"[getClass('element','children'), getClass('grid','children')]\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"\n (ngbEvent)=\"onCustomEvent($event, null, true)\"></dynamic-ng-bootstrap-form-control>\n\n <ng-container *ngTemplateOutlet=\"endTemplate?.templateRef; context: groupModel\"></ng-container>\n\n </div>\n\n </div>\n\n</ng-container>\n" }]
}], ctorParameters: function () { return [{ type: i1.DynamicFormLayoutService }, { type: i1.DynamicFormValidationService }]; }, propDecorators: { formLayout: [{
type: Input
}], group: [{
type: Input
}], layout: [{
type: Input
}], model: [{
type: Input
}], templates: [{
type: Input
}], blur: [{
type: Output
}], change: [{
type: Output
}], customEvent: [{
type: Output
}], focus: [{
type: Output
}], components: [{
type: ViewChildren,
args: [DynamicNGBootstrapFormControlContainerComponent]
}] } });
export class DynamicNGBootstrapFormGroupComponent extends DynamicFormGroupComponent {
constructor(layoutService, validationService) {
super(layoutService, validationService);
this.layoutService = layoutService;
this.validationService = validationService;
this.blur = new EventEmitter();
this.change = new EventEmitter();
this.customEvent = new EventEmitter();
this.focus = new EventEmitter();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicNGBootstrapFormGroupComponent, deps: [{ token: i1.DynamicFormLayoutService }, { token: i1.DynamicFormValidationService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.3", type: DynamicNGBootstrapFormGroupComponent, isStandalone: true, selector: "dynamic-ng-bootstrap-form-group", inputs: { formLayout: "formLayout", group: "group", layout: "layout", model: "model", templates: "templates" }, outputs: { blur: "blur", change: "change", customEvent: "customEvent", focus: "focus" }, viewQueries: [{ propertyName: "components", predicate: DynamicNGBootstrapFormControlContainerComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container [formGroup]=\"group\">\n\n <div role=\"group\" [formGroupName]=\"model.id\" [id]=\"id\" [ngClass]=\"getClass('element','control')\">\n\n <dynamic-ng-bootstrap-form-control *ngFor=\"let _model of model.group\"\n [asBootstrapFormGroup]=\"true\"\n [group]=\"control\"\n [hidden]=\"_model.hidden\"\n [layout]=\"formLayout\"\n [model]=\"_model\"\n [templates]=\"templates\"\n [hostClass]=\"[getClass('element','children'), getClass('grid','children')]\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"\n (ngbEvent)=\"onCustomEvent($event, null, true)\"></dynamic-ng-bootstrap-form-control>\n </div>\n\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: DynamicNGBootstrapFormControlContainerComponent, selector: "dynamic-ng-bootstrap-form-control", inputs: ["asBootstrapFormGroup", "context", "group", "hostClass", "templates", "layout", "model"], outputs: ["blur", "change", "focus", "ngbEvent"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicNGBootstrapFormGroupComponent, decorators: [{
type: Component,
args: [{ selector: "dynamic-ng-bootstrap-form-group", standalone: true, imports: [ReactiveFormsModule, NgClass, NgFor, DynamicNGBootstrapFormControlContainerComponent], template: "<ng-container [formGroup]=\"group\">\n\n <div role=\"group\" [formGroupName]=\"model.id\" [id]=\"id\" [ngClass]=\"getClass('element','control')\">\n\n <dynamic-ng-bootstrap-form-control *ngFor=\"let _model of model.group\"\n [asBootstrapFormGroup]=\"true\"\n [group]=\"control\"\n [hidden]=\"_model.hidden\"\n [layout]=\"formLayout\"\n [model]=\"_model\"\n [templates]=\"templates\"\n [hostClass]=\"[getClass('element','children'), getClass('grid','children')]\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"\n (ngbEvent)=\"onCustomEvent($event, null, true)\"></dynamic-ng-bootstrap-form-control>\n </div>\n\n</ng-container>\n" }]
}], ctorParameters: function () { return [{ type: i1.DynamicFormLayoutService }, { type: i1.DynamicFormValidationService }]; }, propDecorators: { formLayout: [{
type: Input
}], group: [{
type: Input
}], layout: [{
type: Input
}], model: [{
type: Input
}], templates: [{
type: Input
}], blur: [{
type: Output
}], change: [{
type: Output
}], customEvent: [{
type: Output
}], focus: [{
type: Output
}], components: [{
type: ViewChildren,
args: [DynamicNGBootstrapFormControlContainerComponent]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1uZy1ib290c3RyYXAtZm9ybS1jb250cm9sLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1keW5hbWljLWZvcm1zL3VpLW5nLWJvb3RzdHJhcC9zcmMvbGliL2R5bmFtaWMtbmctYm9vdHN0cmFwLWZvcm0tY29udHJvbC1jb250YWluZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZHluYW1pYy1mb3Jtcy91aS1uZy1ib290c3RyYXAvc3JjL2xpYi9keW5hbWljLW5nLWJvb3RzdHJhcC1mb3JtLWNvbnRyb2wtY29udGFpbmVyLmNvbXBvbmVudC5odG1sIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZHluYW1pYy1mb3Jtcy91aS1uZy1ib290c3RyYXAvc3JjL2xpYi9keW5hbWljLW5nLWJvb3RzdHJhcC1mb3JtLWFycmF5LmNvbXBvbmVudC5odG1sIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZHluYW1pYy1mb3Jtcy91aS1uZy1ib290c3RyYXAvc3JjL2xpYi9keW5hbWljLW5nLWJvb3RzdHJhcC1mb3JtLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULGVBQWUsRUFDZixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFDTCxNQUFNLEVBR04sU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFvQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFDSCwrQkFBK0IsRUFDL0Isa0NBQWtDLEVBQ2xDLHdDQUF3QyxFQUN4QyxvQ0FBb0MsRUFDcEMsK0JBQStCLEVBQy9CLCtCQUErQixFQUMvQixxQ0FBcUMsRUFDckMsZ0NB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biAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUeXBlLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHtcbiAgICBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX0FSUkFZLFxuICAgIERZTkFNSUNfRk9STV9DT05UUk9MX1RZUEVfQ0hFQ0tCT1gsXG4gICAgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9DSEVDS0JPWF9HUk9VUCxcbiAgICBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX0RBVEVQSUNLRVIsXG4gICAgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9HUk9VUCxcbiAgICBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX0lOUFVULFxuICAgIERZTkFNSUNfRk9STV9DT05UUk9MX1RZUEVfUkFESU9fR1JPVVAsXG4gICAgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9SQVRJTkcsXG4gICAgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9TRUxFQ1QsXG4gICAgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9TV0lUQ0gsXG4gICAgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9URVhUQVJFQSxcbiAgICBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX1RJTUVQSUNLRVIsXG4gICAgRHluYW1pY0RhdGVQaWNrZXJNb2RlbCxcbiAgICBEeW5hbWljRm9ybUFycmF5Q29tcG9uZW50LFxuICAgIER5bmFtaWNGb3JtQXJyYXlHcm91cE1vZGVsLFxuICAgIER5bmFtaWNGb3JtQXJyYXlNb2RlbCxcbiAgICBEeW5hbWljRm9ybUNvbXBvbmVudFNlcnZpY2UsXG4gICAgRHluYW1pY0Zvcm1Db250cm9sLFxuICAgIER5bmFtaWNGb3JtQ29udHJvbENvbnRhaW5lckNvbXBvbmVudCxcbiAgICBEeW5hbWljRm9ybUNvbnRyb2xDdXN0b21FdmVudCxcbiAgICBEeW5hbWljRm9ybUNvbnRyb2xFdmVudCxcbiAgICBEeW5hbWljRm9ybUNvbnRyb2xMYXlvdXQsXG4gICAgRHluYW1pY0Zvcm1Db250cm9sTW9kZWwsXG4gICAgRHluYW1pY0Zvcm1Hcm91cENvbXBvbmVudCxcbiAgICBEeW5hbWljRm9ybUdyb3VwTW9kZWwsXG4gICAgRHluYW1pY0Zvcm1MYXlvdXQsXG4gICAgRHluYW1pY0Zvcm1MYXlvdXRTZXJ2aWNlLFxuICAgIER5bmFtaWNGb3JtUmVsYXRpb25TZXJ2aWNlLFxuICAgIER5bmFtaWNGb3JtVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgRHluYW1pY1RlbXBsYXRlRGlyZWN0aXZlXG59IGZyb20gXCJAbmctZHluYW1pYy1mb3Jtcy9jb3JlXCI7XG5pbXBvcnQgeyBEeW5hbWljTkdCb290c3RyYXBDaGVja2JveENvbXBvbmVudCB9IGZyb20gXCIuL2NoZWNrYm94L2R5bmFtaWMtbmctYm9vdHN0cmFwLWNoZWNrYm94LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRHluYW1pY05HQm9vdHN0cmFwQ2hlY2tib3hHcm91cENvbXBvbmVudCB9IGZyb20gXCIuL2NoZWNrYm94LWdyb3VwL2R5bmFtaWMtbmctYm9vdHN0cmFwLWNoZWNrYm94LWdyb3VwLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRHluYW1pY05HQm9vdHN0cmFwQ2FsZW5kYXJDb21wb25lbnQgfSBmcm9tIFwiLi9jYWxlbmRhci9keW5hbWljLW5nLWJvb3RzdHJhcC1jYWxlbmRhci5jb21wb25lbnRcIjtcbmltcG9ydCB7IER5bmFtaWNOR0Jvb3RzdHJhcERhdGVQaWNrZXJDb21wb25lbnQgfSBmcm9tIFwiLi9kYXRlcGlja2VyL2R5bmFtaWMtbmctYm9vdHN0cmFwLWRhdGVwaWNrZXIuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEeW5hbWljTkdCb290c3RyYXBJbnB1dENvbXBvbmVudCB9IGZyb20gXCIuL2lucHV0L2R5bmFtaWMtbmctYm9vdHN0cmFwLWlucHV0LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRHluYW1pY05HQm9vdHN0cmFwUmFkaW9Hcm91cENvbXBvbmVudCB9IGZyb20gXCIuL3JhZGlvLWdyb3VwL2R5bmFtaWMtbmctYm9vdHN0cmFwLXJhZGlvLWdyb3VwLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRHluYW1pY05HQm9vdHN0cmFwUmF0aW5nQ29tcG9uZW50IH0gZnJvbSBcIi4vcmF0aW5nL2R5bmFtaWMtbmctYm9vdHN0cmFwLXJhdGluZy5jb21wb25lbnRcIjtcbmltcG9ydCB7IER5bmFtaWNOR0Jvb3RzdHJhcFNlbGVjdENvbXBvbmVudCB9IGZyb20gXCIuL3NlbGVjdC9keW5hbWljLW5nLWJvb3RzdHJhcC1zZWxlY3QuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEeW5hbWljTkdCb290c3RyYXBTd2l0Y2hDb21wb25lbnQgfSBmcm9tIFwiLi9zd2l0Y2gvZHluYW1pYy1uZy1ib290c3RyYXAtc3dpdGNoLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRHluYW1pY05HQm9vdHN0cmFwVGV4dEFyZWFDb21wb25lbnQgfSBmcm9tIFwiLi90ZXh0YXJlYS9keW5hbWljLW5nLWJvb3RzdHJhcC10ZXh0YXJlYS5jb21wb25lbnRcIjtcbmltcG9ydCB7IER5bmFtaWNOR0Jvb3RzdHJhcFRpbWVQaWNrZXJDb21wb25lbnQgfSBmcm9tIFwiLi90aW1lcGlja2VyL2R5bmFtaWMtbmctYm9vdHN0cmFwLXRpbWVwaWNrZXIuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ0ZvciwgTmdUZW1wbGF0ZU91dGxldCwgTmdJZiB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwiZHluYW1pYy1uZy1ib290c3RyYXAtZm9ybS1jb250cm9sXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9keW5hbWljLW5nLWJvb3RzdHJhcC1mb3JtLWNvbnRyb2wtY29udGFpbmVyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZSwgTmdDbGFzcywgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCwgTmdGb3JdXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNOR0Jvb3RzdHJhcEZvcm1Db250cm9sQ29udGFpbmVyQ29tcG9uZW50IGV4dGVuZHMgRHluYW1pY0Zvcm1Db250cm9sQ29udGFpbmVyQ29tcG9uZW50IHtcbiAgICBAQ29udGVudENoaWxkcmVuKER5bmFtaWNUZW1wbGF0ZURpcmVjdGl2ZSkgY29udGVudFRlbXBsYXRlTGlzdCE6IFF1ZXJ5TGlzdDxEeW5hbWljVGVtcGxhdGVEaXJlY3RpdmU+O1xuXG4gICAgQEhvc3RCaW5kaW5nKFwiY2xhc3NcIikga2xhc3M/OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKSBhc0Jvb3RzdHJhcEZvcm1Hcm91cCA9IHRydWU7XG4gICAgQElucHV0KCkgY29udGV4dDogRHluYW1pY0Zvcm1BcnJheUdyb3VwTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBncm91cCE6IFVudHlwZWRGb3JtR3JvdXA7XG4gICAgQElucHV0KCkgaG9zdENsYXNzPzogc3RyaW5nW107XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWlucHV0LXJlbmFtZVxuICAgIEBJbnB1dChcInRlbXBsYXRlc1wiKSBpbnB1dFRlbXBsYXRlTGlzdD86IFF1ZXJ5TGlzdDxEeW5hbWljVGVtcGxhdGVEaXJlY3RpdmU+O1xuICAgIEBJbnB1dCgpIGxheW91dD86IER5bmFtaWNGb3JtTGF5b3V0O1xuICAgIEBJbnB1dCgpIG1vZGVsITogRHluYW1pY0Zvcm1Db250cm9sTW9kZWw7XG5cbiAgICBAT3V0cHV0KCkgYmx1cjogRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29udHJvbEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db250cm9sRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIGNoYW5nZTogRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29udHJvbEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db250cm9sRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIGZvY3VzOiBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db250cm9sRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUNvbnRyb2xFdmVudD4oKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LXJlbmFtZVxuICAgIEBPdXRwdXQoXCJuZ2JFdmVudFwiKSBjdXN0b21FdmVudDogRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29udHJvbEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db250cm9sRXZlbnQ+KCk7XG5cbiAgICBAVmlld0NoaWxkKFwiY29tcG9uZW50Vmlld0NvbnRhaW5lclwiLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlfSkgY29tcG9uZW50Vmlld0NvbnRhaW5lclJlZiE6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgbGF5b3V0U2VydmljZTogRHluYW1pY0Zvcm1MYXlvdXRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2YWxpZGF0aW9uU2VydmljZTogRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgY29tcG9uZW50U2VydmljZTogRHluYW1pY0Zvcm1Db21wb25lbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCByZWxhdGlvblNlcnZpY2U6IER5bmFtaWNGb3JtUmVsYXRpb25TZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGNoYW5nZURldGVjdG9yUmVmLCBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIGxheW91dFNlcnZpY2UsIHZhbGlkYXRpb25TZXJ2aWNlLCBjb21wb25lbnRTZXJ2aWNlLCByZWxhdGlvblNlcnZpY2UpO1xuICAgIH1cblxuICAgIGdldCBjb21wb25lbnRUeXBlKCk6IFR5cGU8RHluYW1pY0Zvcm1Db250cm9sPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTZXJ2aWNlLmdldEN1c3RvbUNvbXBvbmVudFR5cGUodGhpcy5tb2RlbCkgfHwgbmdCb290c3RyYXBVSUZvcm1Db250cm9sTWFwRm4odGhpcy5tb2RlbCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbmdCb290c3RyYXBVSUZvcm1Db250cm9sTWFwRm4obW9kZWw6IER5bmFtaWNGb3JtQ29udHJvbE1vZGVsKTogVHlwZTxEeW5hbWljRm9ybUNvbnRyb2w+IHwgbnVsbCB7XG4gICAgc3dpdGNoIChtb2RlbC50eXBlKSB7XG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9BUlJBWTpcbiAgICAgICAgICAgIHJldHVybiBEeW5hbWljTkdCb290c3RyYXBGb3JtQXJyYXlDb21wb25lbnQ7XG5cbiAgICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX0NIRUNLQk9YOlxuICAgICAgICAgICAgcmV0dXJuIER5bmFtaWNOR0Jvb3RzdHJhcENoZWNrYm94Q29tcG9uZW50O1xuXG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9DSEVDS0JPWF9HUk9VUDpcbiAgICAgICAgICAgIHJldHVybiBEeW5hbWljTkdCb290c3RyYXBDaGVja2JveEdyb3VwQ29tcG9uZW50O1xuXG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9EQVRFUElDS0VSOlxuICAgICAgICAgICAgY29uc3QgZGF0ZVBpY2tlck1vZGVsID0gbW9kZWwgYXMgRHluYW1pY0RhdGVQaWNrZXJNb2RlbDtcbiAgICAgICAgICAgIHJldHVybiBkYXRlUGlja2VyTW9kZWwuaW5saW5lID8gRHluYW1pY05HQm9vdHN0cmFwQ2FsZW5kYXJDb21wb25lbnQgOiBEeW5hbWljTkdCb290c3RyYXBEYXRlUGlja2VyQ29tcG9uZW50O1xuXG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9HUk9VUDpcbiAgICAgICAgICAgIHJldHVybiBEeW5hbWljTkdCb290c3RyYXBGb3JtR3JvdXBDb21wb25lbnQ7XG5cbiAgICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX0lOUFVUOlxuICAgICAgICAgICAgcmV0dXJuIER5bmFtaWNOR0Jvb3RzdHJhcElucHV0Q29tcG9uZW50O1xuXG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9SQURJT19HUk9VUDpcbiAgICAgICAgICAgIHJldHVybiBEeW5hbWljTkdCb290c3RyYXBSYWRpb0dyb3VwQ29tcG9uZW50O1xuXG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9SQVRJTkc6XG4gICAgICAgICAgICByZXR1cm4gRHluYW1pY05HQm9vdHN0cmFwUmF0aW5nQ29tcG9uZW50O1xuXG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9TRUxFQ1Q6XG4gICAgICAgICAgICByZXR1cm4gRHluYW1pY05HQm9vdHN0cmFwU2VsZWN0Q29tcG9uZW50O1xuXG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9TV0lUQ0g6XG4gICAgICAgICAgICByZXR1cm4gRHluYW1pY05HQm9vdHN0cmFwU3dpdGNoQ29tcG9uZW50O1xuXG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9URVhUQVJFQTpcbiAgICAgICAgICAgIHJldHVybiBEeW5hbWljTkdCb290c3RyYXBUZXh0QXJlYUNvbXBvbmVudDtcblxuICAgICAgICBjYXNlIERZTkFNSUNfRk9STV9DT05UUk9MX1RZUEVfVElNRVBJQ0tFUjpcbiAgICAgICAgICAgIHJldHVybiBEeW5hbWljTkdCb290c3RyYXBUaW1lUGlja2VyQ29tcG9uZW50O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcImR5bmFtaWMtbmctYm9vdHN0cmFwLWZvcm0tYXJyYXlcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2R5bmFtaWMtbmctYm9vdHN0cmFwLWZvcm0tYXJyYXkuY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtSZWFjdGl2ZUZvcm1zTW9kdWxlLCBOZ0NsYXNzLCBOZ0ZvciwgTmdUZW1wbGF0ZU91dGxldCwgRHluYW1pY05HQm9vdHN0cmFwRm9ybUNvbnRyb2xDb250YWluZXJDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNOR0Jvb3RzdHJhcEZvcm1BcnJheUNvbXBvbmVudCBleHRlbmRzIER5bmFtaWNGb3JtQXJyYXlDb21wb25lbnQge1xuICAgIEBJbnB1dCgpIGZvcm1MYXlvdXQ/OiBEeW5hbWljRm9ybUxheW91dDtcbiAgICBASW5wdXQoKSBncm91cCE6IFVudHlwZWRGb3JtR3JvdXA7XG4gICAgQElucHV0KCkgbGF5b3V0PzogRHluYW1pY0Zvcm1Db250cm9sTGF5b3V0O1xuICAgIEBJbnB1dCgpIG1vZGVsITogRHluYW1pY0Zvcm1BcnJheU1vZGVsO1xuICAgIEBJbnB1dCgpIHRlbXBsYXRlcz86IFF1ZXJ5TGlzdDxEeW5hbWljVGVtcGxhdGVEaXJlY3RpdmU+O1xuXG4gICAgQE91dHB1dCgpIGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBjdXN0b21FdmVudDogRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29udHJvbEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgZm9jdXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQFZpZXdDaGlsZHJlbihEeW5hbWljTkdCb290c3RyYXBGb3JtQ29udHJvbENvbnRhaW5lckNvbXBvbmVudCkgY29tcG9uZW50cyE6IFF1ZXJ5TGlzdDxEeW5hbWljTkdCb290c3RyYXBGb3JtQ29udHJvbENvbnRhaW5lckNvbXBvbmVudD47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbGF5b3V0U2VydmljZTogRHluYW1pY0Zvcm1MYXlvdXRTZXJ2aWNlLCBwcm90ZWN0ZWQgdmFsaWRhdGlvblNlcnZpY2U6IER5bmFtaWNGb3JtVmFsaWRhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIobGF5b3V0U2VydmljZSwgdmFsaWRhdGlvblNlcnZpY2UpO1xuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwiZHluYW1pYy1uZy1ib290c3RyYXAtZm9ybS1ncm91cFwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vZHluYW1pYy1uZy1ib290c3RyYXAtZm9ybS1ncm91cC5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGUsIE5nQ2xhc3MsIE5nRm9yLCBEeW5hbWljTkdCb290c3RyYXBGb3JtQ29udHJvbENvbnRhaW5lckNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY05HQm9vdHN0cmFwRm9ybUdyb3VwQ29tcG9uZW50IGV4dGVuZHMgRHluYW1pY0Zvcm1Hcm91cENvbXBvbmVudCB7XG4gICAgQElucHV0KCkgZm9ybUxheW91dD86IER5bmFtaWNGb3JtTGF5b3V0O1xuICAgIEBJbnB1dCgpIGdyb3VwITogVW50eXBlZEZvcm1Hcm91cDtcbiAgICBASW5wdXQoKSBsYXlvdXQ/OiBEeW5hbWljRm9ybUNvbnRyb2xMYXlvdXQ7XG4gICAgQElucHV0KCkgbW9kZWwhOiBEeW5hbWljRm9ybUdyb3VwTW9kZWw7XG4gICAgQElucHV0KCkgdGVtcGxhdGVzPzogUXVlcnlMaXN0PER5bmFtaWNUZW1wbGF0ZURpcmVjdGl2ZT4gfCBEeW5hbWljVGVtcGxhdGVEaXJlY3RpdmVbXTtcblxuICAgIEBPdXRwdXQoKSBibHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgY3VzdG9tRXZlbnQ6IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUNvbnRyb2xDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBWaWV3Q2hpbGRyZW4oRHluYW1pY05HQm9vdHN0cmFwRm9ybUNvbnRyb2xDb250YWluZXJDb21wb25lbnQpIGNvbXBvbmVudHMhOiBRdWVyeUxpc3Q8RHluYW1pY05HQm9vdHN0cmFwRm9ybUNvbnRyb2xDb250YWluZXJDb21wb25lbnQ+O1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGxheW91dFNlcnZpY2U6IER5bmFtaWNGb3JtTGF5b3V0U2VydmljZSwgcHJvdGVjdGVkIHZhbGlkYXRpb25TZXJ2aWNlOiBEeW5hbWljRm9ybVZhbGlkYXRpb25TZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGxheW91dFNlcnZpY2UsIHZhbGlkYXRpb25TZXJ2aWNlKTtcbiAgICB9XG59XG4iLCI8ZGl2IFtjbGFzcy5mb3JtLWdyb3VwXT1cIihtb2RlbC50eXBlICE9PSAnR1JPVVAnICYmIGFzQm9vdHN0cmFwRm9ybUdyb3VwKSB8fCBnZXRDbGFzcygnZWxlbWVudCcsICdjb250YWluZXInKS5pbmNsdWRlcygnZm9ybS1ncm91cCcpXCJcbiAgICAgW2Zvcm1Hcm91cF09XCJncm91cFwiXG4gICAgIFtuZ0NsYXNzXT1cIlsnbmctZHluYW1pYy1mb3Jtcy0nK21vZGVsLnR5cGUudG9Mb3dlckNhc2UoKSwgZ2V0Q2xhc3MoJ2VsZW1lbnQnLCAnY29udGFpbmVyJyksIGdldENsYXNzKCdncmlkJywgJ2NvbnRhaW5lcicpXVwiPlxuXG4gICAgPGxhYmVsICpuZ0lmPVwiIWlzQ2hlY2tib3ggJiYgaGFzTGFiZWxcIlxuICAgICAgICAgICBbZm9yXT1cImlkXCJcbiAgICAgICAgICAgW2lubmVySFRNTF09XCJtb2RlbC5sYWJlbFwiXG4gICAgICAgICAgIFtuZ0NsYXNzXT1cIltnZXRDbGFzcygnZWxlbWVudCcsICdsYWJlbCcpLCBnZXRDbGFzcygnZ3JpZCcsICdsYWJlbCcpXVwiPjwvbGFiZWw+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RhcnRUZW1wbGF0ZT8udGVtcGxhdGVSZWY7IGNvbnRleHQ6IG1vZGVsXCI+PC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldENsYXNzKCdncmlkJywgJ2NvbnRyb2wnKVwiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgI2NvbXBvbmVudFZpZXdDb250YWluZXI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPHNtYWxsICpuZ0lmPVwiaGFzSGludFwiIGNsYXNzPVwidGV4dC1tdXRlZFwiIFtpbm5lckhUTUxdPVwiaGludFwiIFtuZ0NsYXNzXT1cImdldENsYXNzKCdlbGVtZW50JywgJ2hpbnQnKVwiPjwvc21hbGw+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dFcnJvck1lc3NhZ2VzXCIgW25nQ2xhc3NdPVwiW2dldENsYXNzKCdlbGVtZW50JywgJ2Vycm9ycycpLCBnZXRDbGFzcygnZ3JpZCcsICdlcnJvcnMnKV1cIj5cbiAgICAgICAgICAgIDxzbWFsbCAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBlcnJvck1lc3NhZ2VzXCIgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrIGQtYmxvY2tcIj57eyBtZXNzYWdlIH19PC9zbWFsbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbmRUZW1wbGF0ZT8udGVtcGxhdGVSZWY7IGNvbnRleHQ6IG1vZGVsXCI+PC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbjwvZGl2PlxuIiwiPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XG5cbiAgICA8ZGl2IFtmb3JtQXJyYXlOYW1lXT1cIm1vZGVsLmlkXCIgW2lkXT1cImlkXCIgW25nQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2VsZW1lbnQnLCAnY29udHJvbCcpXCI+XG5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZ3JvdXBNb2RlbCBvZiBtb2RlbC5ncm91cHM7IGxldCBpZHggPSBpbmRleFwiIHJvbGU9XCJncm91cFwiXG4gICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaWR4XCIgW25nQ2xhc3NdPVwiW2dldENsYXNzKCdlbGVtZW50JywgJ2dyb3VwJyksIGdldENsYXNzKCdncmlkJywgJ2dyb3VwJyldXCI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGFydFRlbXBsYXRlPy50ZW1wbGF0ZVJlZjsgY29udGV4dDogZ3JvdXBNb2RlbFwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZHluYW1pYy1uZy1ib290c3RyYXAtZm9ybS1jb250cm9sICpuZ0Zvcj1cImxldCBfbW9kZWwgb2YgZ3JvdXBNb2RlbC5ncm91cFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZXh0XT1cImdyb3VwTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiYXJyYXkuYXQoaWR4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiX21vZGVsLmhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYXlvdXRdPVwiZm9ybUxheW91dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlbF09XCJfbW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVzXT1cInRlbXBsYXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtob3N0Q2xhc3NdPVwiW2dldENsYXNzKCdlbGVtZW50JywnY2hpbGRyZW4nKSwgZ2V0Q2xhc3MoJ2dyaWQnLCdjaGlsZHJlbicpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ2JFdmVudCk9XCJvbkN1c3RvbUV2ZW50KCRldmVudCwgbnVsbCwgdHJ1ZSlcIj48L2R5bmFtaWMtbmctYm9vdHN0cmFwLWZvcm0tY29udHJvbD5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImVuZFRlbXBsYXRlPy50ZW1wbGF0ZVJlZjsgY29udGV4dDogZ3JvdXBNb2RlbFwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG5cbjwvbmctY29udGFpbmVyPlxuIiwiPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XG5cbiAgICA8ZGl2IHJvbGU9XCJncm91cFwiIFtmb3JtR3JvdXBOYW1lXT1cIm1vZGVsLmlkXCIgW2lkXT1cImlkXCIgW25nQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2VsZW1lbnQnLCdjb250cm9sJylcIj5cblxuICAgICAgICA8ZHluYW1pYy1uZy1ib290c3RyYXAtZm9ybS1jb250cm9sICpuZ0Zvcj1cImxldCBfbW9kZWwgb2YgbW9kZWwuZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthc0Jvb3RzdHJhcEZvcm1Hcm91cF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJfbW9kZWwuaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGF5b3V0XT1cImZvcm1MYXlvdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlbF09XCJfbW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZXNdPVwidGVtcGxhdGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaG9zdENsYXNzXT1cIltnZXRDbGFzcygnZWxlbWVudCcsJ2NoaWxkcmVuJyksIGdldENsYXNzKCdncmlkJywnY2hpbGRyZW4nKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ2JFdmVudCk9XCJvbkN1c3RvbUV2ZW50KCRldmVudCwgbnVsbCwgdHJ1ZSlcIj48L2R5bmFtaWMtbmctYm9vdHN0cmFwLWZvcm0tY29udHJvbD5cbiAgICA8L2Rpdj5cblxuPC9uZy1jb250YWluZXI+XG4iXX0=