@fundamental-ngx/platform 0.43.53 → 0.43.55

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.
@@ -463,6 +463,17 @@ export class FormFieldComponent {
463
463
  return typeof hintOptions === 'string';
464
464
  }
465
465
  /** @hidden */
466
+ _getLabelledBy() {
467
+ let retVal = 'fdp-form-label-' + this.id;
468
+ if (this.hasErrors() && this.groupedErrors.length > 0) {
469
+ retVal = retVal + ' fdp-form-message-grouped-errors-' + this.id;
470
+ }
471
+ if (this.groupedErrors.length === 0 && this.hasErrors() && this.i18Strings) {
472
+ retVal = retVal + ' fdp-form-message-error-' + this.id;
473
+ }
474
+ return retVal;
475
+ }
476
+ /** @hidden */
466
477
  _validateErrorHandler() {
467
478
  if (this._editable &&
468
479
  this.control &&
@@ -601,10 +612,10 @@ export class FormFieldComponent {
601
612
  }
602
613
  }
603
614
  FormFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FormFieldComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.FormGroupContainer, optional: true }, { token: i1.FormFieldGroup, optional: true }, { token: RESPONSIVE_BREAKPOINTS_CONFIG, optional: true }, { token: i1.ResponsiveBreakpointsService }, { token: FDP_FORM_FIELD_HINT_OPTIONS_DEFAULT }, { token: FDP_FORM_FIELD_HINT_LAYOUT_CONFIG }, { token: i2.FormFieldLayoutService, self: true }, { token: i2.FormFieldLayoutService, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
604
- FormFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FormFieldComponent, selector: "fdp-form-field", inputs: { label: "label", id: "id", hintPlacement: "hintPlacement", hint: "hint", labelLayout: "labelLayout", noLabelLayout: "noLabelLayout", validators: "validators", rank: "rank", placeholder: "placeholder", column: "column", columnLayout: "columnLayout", labelColumnLayout: "labelColumnLayout", fieldColumnLayout: "fieldColumnLayout", gapColumnLayout: "gapColumnLayout", i18Strings: "i18Strings", required: "required", editable: "editable", columns: "columns", disabled: "disabled", colon: "colon", formGroupContainer: "formGroupContainer" }, outputs: { onChange: "onChange", onColumnChange: "onColumnChange" }, providers: [formFieldProvider, formGroupChildProvider, FormFieldLayoutService], queries: [{ propertyName: "formFieldExtras", first: true, predicate: FormFieldControlExtrasComponent, descendants: true, read: ElementRef }, { propertyName: "_errorDirectiveQuery", predicate: FormFieldErrorDirective }], viewQueries: [{ propertyName: "renderer", first: true, predicate: ["renderer"], descendants: true, static: true }, { propertyName: "labelCol", first: true, predicate: ["labelCol"], descendants: true }, { propertyName: "inputMessageGroup", first: true, predicate: InputMessageGroupWithTemplate, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<ng-template #renderer>\n <div [horizontal]=\"true\" fd-form-item class=\"fd-row\">\n <div\n class=\"fd-col\"\n #labelCol\n [class]=\"_labelColumnLayoutClass\"\n *ngIf=\"!noLabelLayout\"\n [style.margin-bottom.px]=\"_controlExtrasHeightPx\"\n >\n <ng-template [ngTemplateOutlet]=\"labelTemplate\"></ng-template>\n </div>\n <ng-container *ngTemplateOutlet=\"withFormMessage\"></ng-container>\n <ng-container *ngTemplateOutlet=\"gapTemplate\"></ng-container>\n </div>\n <span aria-hidden=\"true\" style=\"display: none\" [id]=\"'fdp-form-hint-' + id\">\n <ng-container *ngIf=\"isStringHint(hintOptions.content); else hintTemplate\">\n {{ hintOptions.content }}\n </ng-container>\n <ng-template #hintTemplate>\n <ng-template [ngTemplateOutlet]=\"$any(hintOptions.content)\"></ng-template>\n </ng-template>\n </span>\n</ng-template>\n\n<ng-template #withFormMessage>\n <fdp-input-message-group\n class=\"fd-col\"\n [class]=\"_fieldColumnLayoutClass\"\n [attr.aria-labelledby]=\"'fdp-form-label-' + id\"\n >\n <!--\n Todo: we should extend this on FormGroup Level and have error trigger strategy that will be applied to\n all the field e.g.: [triggers]=\"['mouseenter', 'mouseleave']\"\n -->\n\n <ng-template #triggerItem>\n <ng-content></ng-content>\n </ng-template>\n\n <ng-container *ngIf=\"hasErrors() && groupedErrors.length > 0\">\n <fd-form-message *ngFor=\"let error of groupedErrors\" [type]=\"error.directive.type\">\n <ng-template\n [ngIf]=\"error.directive._headingTemplateRef\"\n [ngTemplateOutlet]=\"error.directive._headingTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error.error, label: label }\"\n >\n </ng-template>\n <ng-container *ngIf=\"error.directive._headingTemplateRef && error.directive._descriptionTemplateRef\">\n <br />\n </ng-container>\n <ng-template\n [ngIf]=\"error.directive._descriptionTemplateRef\"\n [ngTemplateOutlet]=\"error.directive._descriptionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error.error, label: label }\"\n >\n </ng-template>\n </fd-form-message>\n </ng-container>\n\n <fd-form-message *ngIf=\"groupedErrors.length === 0 && hasErrors() && i18Strings\" type=\"error\">\n <ng-container *ngTemplateOutlet=\"i18Strings; context: { $implicit: control?.ngControl?.errors }\">\n </ng-container>\n </fd-form-message>\n </fdp-input-message-group>\n</ng-template>\n\n<ng-template #labelTemplate>\n <ng-container *ngIf=\"hintTarget === 'label'; else withoutHint\">\n <label\n [id]=\"'fdp-form-label-' + id\"\n [required]=\"editable && required\"\n fd-form-label\n [inlineHelpContent]=\"hintOptions.content\"\n [inlineHelpBodyPlacement]=\"hintOptions.placement || 'top'\"\n [inlineHelpPlacement]=\"hintOptions.position || 'after'\"\n [inlineHelpGlyph]=\"hintOptions.glyph || ''\"\n [inlineHelpTriggers]=\"hintOptions.trigger || []\"\n [alignLabelEnd]=\"!!(isHorizontal$ | async)\"\n [colon]=\"colon\"\n >\n <span [id]=\"'fdp-form-label-content-' + id\">{{ label }}</span>\n </label>\n </ng-container>\n <ng-template #withoutHint>\n <label\n [id]=\"'fdp-form-label-' + id\"\n [required]=\"editable && required\"\n fd-form-label\n [colon]=\"colon\"\n [alignLabelEnd]=\"!!(isHorizontal$ | async)\"\n >\n <span [id]=\"'fdp-form-label-content-' + id\">{{ label }}</span>\n </label>\n </ng-template>\n</ng-template>\n\n<ng-template #gapTemplate>\n <ng-container *ngIf=\"hintTarget === 'input' && hintOptions.content; else withoutHint\">\n <div class=\"fd-col fd-form-field-inline-help-container\" [class]=\"_gapColumnLayoutClass\">\n <span fd-link [undecorated]=\"true\">\n <fd-icon\n [fd-inline-help]=\"hintOptions.content\"\n [glyph]=\"hintOptions.glyph\"\n [placement]=\"hintOptions.placement || null\"\n [triggers]=\"hintOptions.trigger || []\"\n tabindex=\"0\"\n >\n </fd-icon>\n </span>\n </div>\n </ng-container>\n <ng-template #withoutHint>\n <div class=\"fd-col\" [class]=\"_gapColumnLayoutClass\"></div>\n </ng-template>\n</ng-template>\n", styles: [".fd-form-label__wrapper{display:flex;width:100%;white-space:nowrap}.fd-form-field-inline-help-container{overflow:visible!important}.fd-form-field-inline-help-container [class*=sap-icon]{margin:0}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.FormItemComponent, selector: "[fd-form-item]", inputs: ["isInline", "horizontal"] }, { kind: "component", type: i4.FormLabelComponent, selector: "[fd-form-label]", inputs: ["required", "colon", "checkbox", "radio", "alignLabelEnd", "inlineHelpTitle", "inlineHelpContent", "inlineHelpGlyph", "inlineHelpTriggers", "inlineHelpBodyPlacement", "inlineHelpPlacement", "inlineHelpLabel", "id"] }, { kind: "component", type: i4.FormMessageComponent, selector: "fd-form-message", inputs: ["type", "static", "embedded", "class"] }, { kind: "directive", type: i5.InlineHelpDirective, selector: "[fd-inline-help]:not([fd-inline-help-template]), [fd-inline-help-template]:not([fd-inline-help])", inputs: ["triggers", "noArrow", "closeOnEscapeKey", "closeOnOutsideClick", "fd-inline-help", "fd-inline-help-template"] }, { kind: "component", type: i6.IconComponent, selector: "fd-icon", inputs: ["glyph", "font", "class", "ariaLabel"] }, { kind: "component", type: i7.LinkComponent, selector: "[fdLink], [fd-link], [fd-breadcrumb-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle", "undecorated"] }, { kind: "component", type: i8.InputMessageGroupWithTemplate, selector: "fdp-input-message-group" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
615
+ FormFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FormFieldComponent, selector: "fdp-form-field", inputs: { label: "label", id: "id", hintPlacement: "hintPlacement", hint: "hint", labelLayout: "labelLayout", noLabelLayout: "noLabelLayout", validators: "validators", rank: "rank", placeholder: "placeholder", column: "column", columnLayout: "columnLayout", labelColumnLayout: "labelColumnLayout", fieldColumnLayout: "fieldColumnLayout", gapColumnLayout: "gapColumnLayout", i18Strings: "i18Strings", required: "required", editable: "editable", columns: "columns", disabled: "disabled", colon: "colon", formGroupContainer: "formGroupContainer" }, outputs: { onChange: "onChange", onColumnChange: "onColumnChange" }, providers: [formFieldProvider, formGroupChildProvider, FormFieldLayoutService], queries: [{ propertyName: "formFieldExtras", first: true, predicate: FormFieldControlExtrasComponent, descendants: true, read: ElementRef }, { propertyName: "_errorDirectiveQuery", predicate: FormFieldErrorDirective }], viewQueries: [{ propertyName: "renderer", first: true, predicate: ["renderer"], descendants: true, static: true }, { propertyName: "labelCol", first: true, predicate: ["labelCol"], descendants: true }, { propertyName: "inputMessageGroup", first: true, predicate: InputMessageGroupWithTemplate, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<ng-template #renderer>\n <div [horizontal]=\"true\" fd-form-item class=\"fd-row\">\n <div\n class=\"fd-col\"\n #labelCol\n [class]=\"_labelColumnLayoutClass\"\n *ngIf=\"!noLabelLayout\"\n [style.margin-bottom.px]=\"_controlExtrasHeightPx\"\n >\n <ng-template [ngTemplateOutlet]=\"labelTemplate\"></ng-template>\n </div>\n <ng-container *ngTemplateOutlet=\"withFormMessage\"></ng-container>\n <ng-container *ngTemplateOutlet=\"gapTemplate\"></ng-container>\n </div>\n <span aria-hidden=\"true\" style=\"display: none\" [id]=\"'fdp-form-hint-' + id\">\n <ng-container *ngIf=\"isStringHint(hintOptions.content); else hintTemplate\">\n {{ hintOptions.content }}\n </ng-container>\n <ng-template #hintTemplate>\n <ng-template [ngTemplateOutlet]=\"$any(hintOptions.content)\"></ng-template>\n </ng-template>\n </span>\n</ng-template>\n\n<ng-template #withFormMessage>\n <fdp-input-message-group class=\"fd-col\" [class]=\"_fieldColumnLayoutClass\" [attr.aria-labelledby]=\"_getLabelledBy()\">\n <!--\n Todo: we should extend this on FormGroup Level and have error trigger strategy that will be applied to\n all the field e.g.: [triggers]=\"['mouseenter', 'mouseleave']\"\n -->\n\n <ng-template #triggerItem>\n <ng-content></ng-content>\n </ng-template>\n\n <ng-container *ngIf=\"hasErrors() && groupedErrors.length > 0\">\n <fd-form-message\n *ngFor=\"let error of groupedErrors\"\n [type]=\"error.directive.type\"\n [attr.id]=\"'fdp-form-message-grouped-errors-' + id\"\n >\n <ng-template\n [ngIf]=\"error.directive._headingTemplateRef\"\n [ngTemplateOutlet]=\"error.directive._headingTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error.error, label: label }\"\n >\n </ng-template>\n <ng-container *ngIf=\"error.directive._headingTemplateRef && error.directive._descriptionTemplateRef\">\n <br />\n </ng-container>\n <ng-template\n [ngIf]=\"error.directive._descriptionTemplateRef\"\n [ngTemplateOutlet]=\"error.directive._descriptionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error.error, label: label }\"\n >\n </ng-template>\n </fd-form-message>\n </ng-container>\n\n <fd-form-message\n *ngIf=\"groupedErrors.length === 0 && hasErrors() && i18Strings\"\n type=\"error\"\n [attr.id]=\"'fdp-form-message-error-' + id\"\n >\n <ng-container *ngTemplateOutlet=\"i18Strings; context: { $implicit: control?.ngControl?.errors }\">\n </ng-container>\n </fd-form-message>\n </fdp-input-message-group>\n</ng-template>\n\n<ng-template #labelTemplate>\n <ng-container *ngIf=\"hintTarget === 'label'; else withoutHint\">\n <label\n [id]=\"'fdp-form-label-' + id\"\n [required]=\"editable && required\"\n fd-form-label\n [inlineHelpContent]=\"hintOptions.content\"\n [inlineHelpBodyPlacement]=\"hintOptions.placement || 'top'\"\n [inlineHelpPlacement]=\"hintOptions.position || 'after'\"\n [inlineHelpGlyph]=\"hintOptions.glyph || ''\"\n [inlineHelpTriggers]=\"hintOptions.trigger || []\"\n [alignLabelEnd]=\"!!(isHorizontal$ | async)\"\n [colon]=\"colon\"\n >\n <span [id]=\"'fdp-form-label-content-' + id\">{{ label }}</span>\n </label>\n </ng-container>\n <ng-template #withoutHint>\n <label\n [id]=\"'fdp-form-label-' + id\"\n [required]=\"editable && required\"\n fd-form-label\n [colon]=\"colon\"\n [alignLabelEnd]=\"!!(isHorizontal$ | async)\"\n >\n <span [id]=\"'fdp-form-label-content-' + id\">{{ label }}</span>\n </label>\n </ng-template>\n</ng-template>\n\n<ng-template #gapTemplate>\n <ng-container *ngIf=\"hintTarget === 'input' && hintOptions.content; else withoutHint\">\n <div class=\"fd-col fd-form-field-inline-help-container\" [class]=\"_gapColumnLayoutClass\">\n <span fd-link [undecorated]=\"true\">\n <fd-icon\n [fd-inline-help]=\"hintOptions.content\"\n [glyph]=\"hintOptions.glyph\"\n [placement]=\"hintOptions.placement || null\"\n [triggers]=\"hintOptions.trigger || []\"\n tabindex=\"0\"\n >\n </fd-icon>\n </span>\n </div>\n </ng-container>\n <ng-template #withoutHint>\n <div class=\"fd-col\" [class]=\"_gapColumnLayoutClass\"></div>\n </ng-template>\n</ng-template>\n", styles: [".fd-form-label__wrapper{display:flex;width:100%;white-space:nowrap}.fd-form-field-inline-help-container{overflow:visible!important}.fd-form-field-inline-help-container [class*=sap-icon]{margin:0}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.FormItemComponent, selector: "[fd-form-item]", inputs: ["isInline", "horizontal"] }, { kind: "component", type: i4.FormLabelComponent, selector: "[fd-form-label]", inputs: ["required", "colon", "checkbox", "radio", "alignLabelEnd", "inlineHelpTitle", "inlineHelpContent", "inlineHelpGlyph", "inlineHelpTriggers", "inlineHelpBodyPlacement", "inlineHelpPlacement", "inlineHelpLabel", "id"] }, { kind: "component", type: i4.FormMessageComponent, selector: "fd-form-message", inputs: ["type", "static", "embedded", "class"] }, { kind: "directive", type: i5.InlineHelpDirective, selector: "[fd-inline-help]:not([fd-inline-help-template]), [fd-inline-help-template]:not([fd-inline-help])", inputs: ["triggers", "noArrow", "closeOnEscapeKey", "closeOnOutsideClick", "fd-inline-help", "fd-inline-help-template"] }, { kind: "component", type: i6.IconComponent, selector: "fd-icon", inputs: ["glyph", "font", "class", "ariaLabel"] }, { kind: "component", type: i7.LinkComponent, selector: "[fdLink], [fd-link], [fd-breadcrumb-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle", "undecorated"] }, { kind: "component", type: i8.InputMessageGroupWithTemplate, selector: "fdp-input-message-group" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
605
616
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FormFieldComponent, decorators: [{
606
617
  type: Component,
607
- args: [{ selector: 'fdp-form-field', changeDetection: ChangeDetectionStrategy.OnPush, providers: [formFieldProvider, formGroupChildProvider, FormFieldLayoutService], template: "<ng-template #renderer>\n <div [horizontal]=\"true\" fd-form-item class=\"fd-row\">\n <div\n class=\"fd-col\"\n #labelCol\n [class]=\"_labelColumnLayoutClass\"\n *ngIf=\"!noLabelLayout\"\n [style.margin-bottom.px]=\"_controlExtrasHeightPx\"\n >\n <ng-template [ngTemplateOutlet]=\"labelTemplate\"></ng-template>\n </div>\n <ng-container *ngTemplateOutlet=\"withFormMessage\"></ng-container>\n <ng-container *ngTemplateOutlet=\"gapTemplate\"></ng-container>\n </div>\n <span aria-hidden=\"true\" style=\"display: none\" [id]=\"'fdp-form-hint-' + id\">\n <ng-container *ngIf=\"isStringHint(hintOptions.content); else hintTemplate\">\n {{ hintOptions.content }}\n </ng-container>\n <ng-template #hintTemplate>\n <ng-template [ngTemplateOutlet]=\"$any(hintOptions.content)\"></ng-template>\n </ng-template>\n </span>\n</ng-template>\n\n<ng-template #withFormMessage>\n <fdp-input-message-group\n class=\"fd-col\"\n [class]=\"_fieldColumnLayoutClass\"\n [attr.aria-labelledby]=\"'fdp-form-label-' + id\"\n >\n <!--\n Todo: we should extend this on FormGroup Level and have error trigger strategy that will be applied to\n all the field e.g.: [triggers]=\"['mouseenter', 'mouseleave']\"\n -->\n\n <ng-template #triggerItem>\n <ng-content></ng-content>\n </ng-template>\n\n <ng-container *ngIf=\"hasErrors() && groupedErrors.length > 0\">\n <fd-form-message *ngFor=\"let error of groupedErrors\" [type]=\"error.directive.type\">\n <ng-template\n [ngIf]=\"error.directive._headingTemplateRef\"\n [ngTemplateOutlet]=\"error.directive._headingTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error.error, label: label }\"\n >\n </ng-template>\n <ng-container *ngIf=\"error.directive._headingTemplateRef && error.directive._descriptionTemplateRef\">\n <br />\n </ng-container>\n <ng-template\n [ngIf]=\"error.directive._descriptionTemplateRef\"\n [ngTemplateOutlet]=\"error.directive._descriptionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error.error, label: label }\"\n >\n </ng-template>\n </fd-form-message>\n </ng-container>\n\n <fd-form-message *ngIf=\"groupedErrors.length === 0 && hasErrors() && i18Strings\" type=\"error\">\n <ng-container *ngTemplateOutlet=\"i18Strings; context: { $implicit: control?.ngControl?.errors }\">\n </ng-container>\n </fd-form-message>\n </fdp-input-message-group>\n</ng-template>\n\n<ng-template #labelTemplate>\n <ng-container *ngIf=\"hintTarget === 'label'; else withoutHint\">\n <label\n [id]=\"'fdp-form-label-' + id\"\n [required]=\"editable && required\"\n fd-form-label\n [inlineHelpContent]=\"hintOptions.content\"\n [inlineHelpBodyPlacement]=\"hintOptions.placement || 'top'\"\n [inlineHelpPlacement]=\"hintOptions.position || 'after'\"\n [inlineHelpGlyph]=\"hintOptions.glyph || ''\"\n [inlineHelpTriggers]=\"hintOptions.trigger || []\"\n [alignLabelEnd]=\"!!(isHorizontal$ | async)\"\n [colon]=\"colon\"\n >\n <span [id]=\"'fdp-form-label-content-' + id\">{{ label }}</span>\n </label>\n </ng-container>\n <ng-template #withoutHint>\n <label\n [id]=\"'fdp-form-label-' + id\"\n [required]=\"editable && required\"\n fd-form-label\n [colon]=\"colon\"\n [alignLabelEnd]=\"!!(isHorizontal$ | async)\"\n >\n <span [id]=\"'fdp-form-label-content-' + id\">{{ label }}</span>\n </label>\n </ng-template>\n</ng-template>\n\n<ng-template #gapTemplate>\n <ng-container *ngIf=\"hintTarget === 'input' && hintOptions.content; else withoutHint\">\n <div class=\"fd-col fd-form-field-inline-help-container\" [class]=\"_gapColumnLayoutClass\">\n <span fd-link [undecorated]=\"true\">\n <fd-icon\n [fd-inline-help]=\"hintOptions.content\"\n [glyph]=\"hintOptions.glyph\"\n [placement]=\"hintOptions.placement || null\"\n [triggers]=\"hintOptions.trigger || []\"\n tabindex=\"0\"\n >\n </fd-icon>\n </span>\n </div>\n </ng-container>\n <ng-template #withoutHint>\n <div class=\"fd-col\" [class]=\"_gapColumnLayoutClass\"></div>\n </ng-template>\n</ng-template>\n", styles: [".fd-form-label__wrapper{display:flex;width:100%;white-space:nowrap}.fd-form-field-inline-help-container{overflow:visible!important}.fd-form-field-inline-help-container [class*=sap-icon]{margin:0}\n"] }]
618
+ args: [{ selector: 'fdp-form-field', changeDetection: ChangeDetectionStrategy.OnPush, providers: [formFieldProvider, formGroupChildProvider, FormFieldLayoutService], template: "<ng-template #renderer>\n <div [horizontal]=\"true\" fd-form-item class=\"fd-row\">\n <div\n class=\"fd-col\"\n #labelCol\n [class]=\"_labelColumnLayoutClass\"\n *ngIf=\"!noLabelLayout\"\n [style.margin-bottom.px]=\"_controlExtrasHeightPx\"\n >\n <ng-template [ngTemplateOutlet]=\"labelTemplate\"></ng-template>\n </div>\n <ng-container *ngTemplateOutlet=\"withFormMessage\"></ng-container>\n <ng-container *ngTemplateOutlet=\"gapTemplate\"></ng-container>\n </div>\n <span aria-hidden=\"true\" style=\"display: none\" [id]=\"'fdp-form-hint-' + id\">\n <ng-container *ngIf=\"isStringHint(hintOptions.content); else hintTemplate\">\n {{ hintOptions.content }}\n </ng-container>\n <ng-template #hintTemplate>\n <ng-template [ngTemplateOutlet]=\"$any(hintOptions.content)\"></ng-template>\n </ng-template>\n </span>\n</ng-template>\n\n<ng-template #withFormMessage>\n <fdp-input-message-group class=\"fd-col\" [class]=\"_fieldColumnLayoutClass\" [attr.aria-labelledby]=\"_getLabelledBy()\">\n <!--\n Todo: we should extend this on FormGroup Level and have error trigger strategy that will be applied to\n all the field e.g.: [triggers]=\"['mouseenter', 'mouseleave']\"\n -->\n\n <ng-template #triggerItem>\n <ng-content></ng-content>\n </ng-template>\n\n <ng-container *ngIf=\"hasErrors() && groupedErrors.length > 0\">\n <fd-form-message\n *ngFor=\"let error of groupedErrors\"\n [type]=\"error.directive.type\"\n [attr.id]=\"'fdp-form-message-grouped-errors-' + id\"\n >\n <ng-template\n [ngIf]=\"error.directive._headingTemplateRef\"\n [ngTemplateOutlet]=\"error.directive._headingTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error.error, label: label }\"\n >\n </ng-template>\n <ng-container *ngIf=\"error.directive._headingTemplateRef && error.directive._descriptionTemplateRef\">\n <br />\n </ng-container>\n <ng-template\n [ngIf]=\"error.directive._descriptionTemplateRef\"\n [ngTemplateOutlet]=\"error.directive._descriptionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: error.error, label: label }\"\n >\n </ng-template>\n </fd-form-message>\n </ng-container>\n\n <fd-form-message\n *ngIf=\"groupedErrors.length === 0 && hasErrors() && i18Strings\"\n type=\"error\"\n [attr.id]=\"'fdp-form-message-error-' + id\"\n >\n <ng-container *ngTemplateOutlet=\"i18Strings; context: { $implicit: control?.ngControl?.errors }\">\n </ng-container>\n </fd-form-message>\n </fdp-input-message-group>\n</ng-template>\n\n<ng-template #labelTemplate>\n <ng-container *ngIf=\"hintTarget === 'label'; else withoutHint\">\n <label\n [id]=\"'fdp-form-label-' + id\"\n [required]=\"editable && required\"\n fd-form-label\n [inlineHelpContent]=\"hintOptions.content\"\n [inlineHelpBodyPlacement]=\"hintOptions.placement || 'top'\"\n [inlineHelpPlacement]=\"hintOptions.position || 'after'\"\n [inlineHelpGlyph]=\"hintOptions.glyph || ''\"\n [inlineHelpTriggers]=\"hintOptions.trigger || []\"\n [alignLabelEnd]=\"!!(isHorizontal$ | async)\"\n [colon]=\"colon\"\n >\n <span [id]=\"'fdp-form-label-content-' + id\">{{ label }}</span>\n </label>\n </ng-container>\n <ng-template #withoutHint>\n <label\n [id]=\"'fdp-form-label-' + id\"\n [required]=\"editable && required\"\n fd-form-label\n [colon]=\"colon\"\n [alignLabelEnd]=\"!!(isHorizontal$ | async)\"\n >\n <span [id]=\"'fdp-form-label-content-' + id\">{{ label }}</span>\n </label>\n </ng-template>\n</ng-template>\n\n<ng-template #gapTemplate>\n <ng-container *ngIf=\"hintTarget === 'input' && hintOptions.content; else withoutHint\">\n <div class=\"fd-col fd-form-field-inline-help-container\" [class]=\"_gapColumnLayoutClass\">\n <span fd-link [undecorated]=\"true\">\n <fd-icon\n [fd-inline-help]=\"hintOptions.content\"\n [glyph]=\"hintOptions.glyph\"\n [placement]=\"hintOptions.placement || null\"\n [triggers]=\"hintOptions.trigger || []\"\n tabindex=\"0\"\n >\n </fd-icon>\n </span>\n </div>\n </ng-container>\n <ng-template #withoutHint>\n <div class=\"fd-col\" [class]=\"_gapColumnLayoutClass\"></div>\n </ng-template>\n</ng-template>\n", styles: [".fd-form-label__wrapper{display:flex;width:100%;white-space:nowrap}.fd-form-field-inline-help-container{overflow:visible!important}.fd-form-field-inline-help-container [class*=sap-icon]{margin:0}\n"] }]
608
619
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.FormGroupContainer, decorators: [{
609
620
  type: Optional
610
621
  }] }, { type: i1.FormFieldGroup, decorators: [{
@@ -692,4 +703,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
692
703
  type: ViewChild,
693
704
  args: [InputMessageGroupWithTemplate, { read: ElementRef }]
694
705
  }] } });
695
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL3NyYy9saWIvZm9ybS9mb3JtLWdyb3VwL2Zvcm0tZmllbGQvZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL3NyYy9saWIvZm9ybS9mb3JtLWdyb3VwL2Zvcm0tZmllbGQvZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLFNBQVMsRUFJVCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFNBQVMsRUFDVCxJQUFJLEVBRUosUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFtQixXQUFXLEVBQTBCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsYUFBYSxFQUFnQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RSxPQUFPLEVBT0gsY0FBYyxFQUNkLGtCQUFr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IEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBpc0Rldk1vZGUsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFByb3ZpZGVyLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTZWxmLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgU2tpcFNlbGYsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBGRF9GT1JNX0ZJRUxELCBGb3JtRmllbGRDb250cm9sLCBGb3JtU3RhdGVzIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvZm9ybXMnO1xuaW1wb3J0IHsgdW5pcUJ5IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZmlsdGVyLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICAgIENvbHVtbixcbiAgICBDb2x1bW5MYXlvdXQsXG4gICAgRmllbGRIaW50T3B0aW9ucyxcbiAgICBGb3JtRXJyb3IsXG4gICAgUGxhdGZvcm1Gb3JtRmllbGRDb250cm9sLFxuICAgIEZvcm1GaWVsZEVycm9yRGlyZWN0aXZlQ29udGV4dCxcbiAgICBGb3JtRmllbGRHcm91cCxcbiAgICBGb3JtR3JvdXBDb250YWluZXIsXG4gICAgSGludFBsYWNlbWVudCxcbiAgICBMYWJlbExheW91dCxcbiAgICBSRVNQT05TSVZFX0JSRUFLUE9JTlRTX0NPTkZJRyxcbiAgICBSZXNwb25zaXZlQnJlYWtQb2ludENvbmZpZyxcbiAgICBSZXNwb25zaXZlQnJlYWtwb2ludHNTZXJ2aWNlLFxuICAgIFBsYXRmb3JtRm9ybUZpZWxkLFxuICAgIEZpZWxkSGludElucHV0LFxuICAgIEhpbnRDb250ZW50XG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvcGxhdGZvcm0vc2hhcmVkJztcbmltcG9ydCB7IE51bGxhYmxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgZ2V0Rm9ybVN0YXRlIH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQge1xuICAgIERlZmF1bHRIb3Jpem9udGFsRmllbGRMYXlvdXQsXG4gICAgRGVmYXVsdEhvcml6b250YWxMYWJlbExheW91dCxcbiAgICBEZWZhdWx0VmVydGljYWxGaWVsZExheW91dCxcbiAgICBEZWZhdWx0VmVydGljYWxMYWJlbExheW91dCxcbiAgICBGT1JNX0dST1VQX0NISUxEX0ZJRUxEX1RPS0VOXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGb3JtRmllbGRFcnJvckRpcmVjdGl2ZSB9IGZyb20gJy4uL2Zvcm0tZmllbGQtZXJyb3IvZm9ybS1maWVsZC1lcnJvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgZ2VuZXJhdGVDb2x1bW5DbGFzcywgbm9ybWFsaXplQ29sdW1uTGF5b3V0IH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBGb3JtRmllbGRDb250cm9sRXh0cmFzQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS1maWVsZC1leHRyYXMvZm9ybS1maWVsZC1leHRyYXMuY29tcG9uZW50JztcbmltcG9ydCB7IElucHV0TWVzc2FnZUdyb3VwV2l0aFRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vaW5wdXQtbWVzc2FnZS1ncm91cC13aXRoLXRlbXBsYXRlL2lucHV0LW1lc3NhZ2UtZ3JvdXAtd2l0aC10ZW1wbGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBGRFBfRk9STV9GSUVMRF9ISU5UX0xBWU9VVF9DT05GSUcsXG4gICAgRkRQX0ZPUk1fRklFTERfSElOVF9PUFRJT05TX0RFRkFVTFQsXG4gICAgSGludExheW91dENvbmZpZ1xufSBmcm9tICcuLi9mZHAtZm9ybS50b2tlbnMnO1xuaW1wb3J0IHsgRm9ybUZpZWxkTGF5b3V0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Zvcm0tZmllbGQtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgZGVmYXVsdEZvcm1GaWVsZEhpbnRPcHRpb25zIH0gZnJvbSAnLi4vY29uZmlnL2RlZmF1bHQtZm9ybS1maWVsZC1oaW50LW9wdGlvbnMnO1xuXG5sZXQgZGVmYXVsdElkID0gMDtcblxuY29uc3QgZm9ybUZpZWxkUHJvdmlkZXI6IFByb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IEZEX0ZPUk1fRklFTEQsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9ybUZpZWxkQ29tcG9uZW50KVxufTtcblxuY29uc3QgZm9ybUdyb3VwQ2hpbGRQcm92aWRlcjogUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogRk9STV9HUk9VUF9DSElMRF9GSUVMRF9UT0tFTixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGb3JtRmllbGRDb21wb25lbnQpXG59O1xuXG4vKipcbiAqIEZvcm0gRmllbGQgcmVwcmVzZW50IGFjdHVhbCByb3cgYW5kIGFnZ3JlZ2F0ZXMgY29tbW9uIGJlaGF2aW9yIGZvciB0aGUgaW5wdXQgZmllbGQgc3VjaCBhc1xuICogZXJyb3IsIGxhYmVsIG9yIGhpbnQuXG4gKiBIaW50IGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGxpc3RlbmluZyBmb3IgRmllbGRDb250cm9sIGNoYW5nZXMgYW5kIHRyaWdnZXIgbmVjZXNzYXJ5XG4gKiBjaGFuZ2UgZGV0ZWN0aW9uXG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkcC1mb3JtLWZpZWxkJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2Zvcm0tZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2Zvcm0tZmllbGQuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtmb3JtRmllbGRQcm92aWRlciwgZm9ybUdyb3VwQ2hpbGRQcm92aWRlciwgRm9ybUZpZWxkTGF5b3V0U2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUZpZWxkQ29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBQbGF0Zm9ybUZvcm1GaWVsZCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkluaXQsIE9uQ2hhbmdlc1xue1xuICAgIC8qKiBGb3JtIGZpZWxkIGxhYmVsICovXG4gICAgQElucHV0KClcbiAgICBsYWJlbDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3VmZml4IGZvciBpZHMgb2YgY29udHJvbCBlbGVtZW50cyBpbnNpZGUgdGhpcyBmb3JtIGZpZWxkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBpZDogc3RyaW5nID0gKCsrZGVmYXVsdElkKS50b1N0cmluZygpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGBoaW50LnBsYWNlbWVudGAgaW5wdXQgaW5zdGVhZFxuICAgICAqIERlZmluZXMgaGludCBwbGFjZW1lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGhpbnRQbGFjZW1lbnQ6IEhpbnRQbGFjZW1lbnQ7XG5cbiAgICAvKiogSGludCB0byBiZSBwbGFjZWQgbmV4dCB0byBsYWJlbCAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGludDogTnVsbGFibGU8RmllbGRIaW50SW5wdXQ+O1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBVc2UgbGFiZWxDb2x1bW5MYXlvdXQsIGZpZWxkQ29sdW1uTGF5b3V0IGFuZCBnYXBDb2x1bW5MYXlvdXQgcHJvcGVydGllcy5cbiAgICAgKiBEZWZpbmUgZm9ybSBmaWVsZCBsYWJlbCBwbGFjZW1lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBsYWJlbExheW91dCh2YWx1ZTogTGFiZWxMYXlvdXQpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgJ0xhYmVsTGF5b3V0IGlucHV0IHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbGFiZWxDb2x1bW5MYXlvdXQsIGZpZWxkQ29sdW1uTGF5b3V0IGFuZCBnYXBDb2x1bW5MYXlvdXQgcHJvcGVydGllcyBpbnN0ZWFkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9sYWJlbExheW91dCA9IHZhbHVlO1xuXG4gICAgICAgIHRoaXMubGFiZWxDb2x1bW5MYXlvdXQgPVxuICAgICAgICAgICAgdGhpcy5fbGFiZWxMYXlvdXQgPT09ICdob3Jpem9udGFsJyA/IERlZmF1bHRIb3Jpem9udGFsTGFiZWxMYXlvdXQgOiBEZWZhdWx0VmVydGljYWxMYWJlbExheW91dDtcbiAgICAgICAgdGhpcy5maWVsZENvbHVtbkxheW91dCA9XG4gICAgICAgICAgICB0aGlzLl9sYWJlbExheW91dCA9PT0gJ2hvcml6b250YWwnID8gRGVmYXVsdEhvcml6b250YWxGaWVsZExheW91dCA6IERlZmF1bHRWZXJ0aWNhbEZpZWxkTGF5b3V0O1xuICAgIH1cblxuICAgIGdldCBsYWJlbExheW91dCgpOiBMYWJlbExheW91dCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbExheW91dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hlbiBmb3JtIGZpZWxkIGxhYmVsIHNob3VsZCBub3QgYmUgZGlzcGxheWVkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBub0xhYmVsTGF5b3V0ID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiB2YWxpZGF0b3JzIGFwcGxpZWQgdG8gdGhlIGZvcm0gZmllbGQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB2YWxpZGF0b3JzOiBBcnJheTxWYWxpZGF0b3JGbj4gPSBbVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yXTtcblxuICAgIC8qKlxuICAgICAqIFJhbmsgaXMgdXNlZCBmb3Igb3JkZXJpbmcuXG4gICAgICogRmlyc3QgbG93ZXIgbnVtYmVyLCB0aGVuIC0gaGlnaGVyXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICByYW5rOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBQbGFjZWhvbGRlciBmb3IgdGhlIGZpZWxkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gICAgLyoqIEZvcm0gQ29udGFpbmVyIGNvbHVtbiBpdCBiZWxvbmdzIHRvICovXG4gICAgQElucHV0KClcbiAgICBjb2x1bW46IG51bWJlcjtcblxuICAgIC8qKiBvYmplY3QgZm9yIHBsYWNpbmcgZmllbGQgaW4gY29sdW1uIGluIGVhY2ggc2NyZWVuIGxheW91dCAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGNvbHVtbkxheW91dChsYXlvdXQ6IENvbHVtbkxheW91dCB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIWxheW91dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbHVtbkxheW91dCA9IGxheW91dDtcbiAgICAgICAgdGhpcy5faXNDb2x1bW5MYXlvdXRFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fc2V0TGF5b3V0KCk7XG4gICAgfVxuXG4gICAgZ2V0IGNvbHVtbkxheW91dCgpOiBDb2x1bW5MYXlvdXQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uTGF5b3V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGFiZWwncyBjb2x1bW4gbGF5b3V0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGxhYmVsQ29sdW1uTGF5b3V0KHZhbHVlOiBDb2x1bW5MYXlvdXQgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xhYmVsQ29sdW1uTGF5b3V0ID0gbm9ybWFsaXplQ29sdW1uTGF5b3V0KHZhbHVlKTtcbiAgICAgICAgdGhpcy5fbGFiZWxDb2x1bW5MYXlvdXRDbGFzcyA9IGdlbmVyYXRlQ29sdW1uQ2xhc3ModGhpcy5fbGFiZWxDb2x1bW5MYXlvdXQpO1xuICAgICAgICB0aGlzLl9sYWJlbENvbHVtbkxheW91dCQubmV4dCh0aGlzLl9sYWJlbENvbHVtbkxheW91dCk7XG4gICAgfVxuXG4gICAgZ2V0IGxhYmVsQ29sdW1uTGF5b3V0KCk6IENvbHVtbkxheW91dCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbENvbHVtbkxheW91dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGZpZWxkJ3MgY29sdW1uIGxheW91dC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBmaWVsZENvbHVtbkxheW91dCh2YWx1ZTogQ29sdW1uTGF5b3V0IHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2ZpZWxkQ29sdW1uTGF5b3V0ID0gbm9ybWFsaXplQ29sdW1uTGF5b3V0KHZhbHVlKTtcbiAgICAgICAgdGhpcy5fZmllbGRDb2x1bW5MYXlvdXRDbGFzcyA9IGdlbmVyYXRlQ29sdW1uQ2xhc3ModGhpcy5fZmllbGRDb2x1bW5MYXlvdXQpO1xuICAgICAgICB0aGlzLl9maWVsZENvbHVtbkxheW91dCQubmV4dCh0aGlzLl9maWVsZENvbHVtbkxheW91dCk7XG4gICAgfVxuXG4gICAgZ2V0IGZpZWxkQ29sdW1uTGF5b3V0KCk6IENvbHVtbkxheW91dCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZENvbHVtbkxheW91dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGdhcCBjb2x1bW4gbGF5b3V0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGdhcENvbHVtbkxheW91dCh2YWx1ZTogQ29sdW1uTGF5b3V0IHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dhcENvbHVtbkxheW91dCA9IG5vcm1hbGl6ZUNvbHVtbkxheW91dCh2YWx1ZSk7XG4gICAgICAgIHRoaXMuX2dhcENvbHVtbkxheW91dENsYXNzID0gZ2VuZXJhdGVDb2x1bW5DbGFzcyh0aGlzLl9nYXBDb2x1bW5MYXlvdXQpO1xuICAgICAgICB0aGlzLl9nYXBDb2x1bW5MYXlvdXQkLm5leHQodGhpcy5fZ2FwQ29sdW1uTGF5b3V0KTtcbiAgICB9XG5cbiAgICBnZXQgZ2FwQ29sdW1uTGF5b3V0KCk6IENvbHVtbkxheW91dCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nYXBDb2x1bW5MYXlvdXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRpb25zIHRlbXBsYXRlIHJlZmVyZW5jZS5cbiAgICAgKiBUaGlzIGlzIGluIG1vc3Qgb2YgdGhlIGNhc2VzIHNldCBmcm9tIHBhcmVudCBjb250YWluZXIgKGZvcm0tZ3JvdXApXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBpMThTdHJpbmdzOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIFNldCB3aGVuIGZvcm0gZmllbGQgaXMgYSBtYW5kYXRvcnkgb25lLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHJlcXVpcmVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBmaWVsZCBpcyBlZGl0YWJsZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGVkaXRhYmxlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuX2VkaXRhYmxlICE9PSBuZXdWYWwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRhYmxlID0gbmV3VmFsO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29udHJvbFByb3BlcnRpZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBlZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRhYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm0gZmllbGQgY3VzdG9tIHdpZHRoIGluIGNvbHVtbnMgbXVzdCBiZSBiZXR3ZWVuIDEgLSAxMlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGNvbHVtbnModmFsdWU6IENvbHVtbikge1xuICAgICAgICB0aGlzLl9jb2x1bW5zID0gPENvbHVtbj5jb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0IGNvbHVtbnMoKTogQ29sdW1uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbWFya3MgZmllbGQgYXMgZGlzYWJsZWQuIHVzZWQgaW4gcmVhY3RpdmUgZm9ybSBhcHByb2FjaC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciBsYWJlbCB0ZXh0IHNob3VsZCBiZSBhcHBlbmRlZCB3aXRoIGNvbG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY29sb24gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEZvcm0gR3JvdXAgQ29udGFpbmVyIHRvIGJpbmQgdGhlIEZvcm0tRmllbGQgdG8uXG4gICAgICogVGhpcyB3aWxsIG92ZXJyaWRlIGRlZmF1bHQgdmFsdWUgaW5qZWN0ZWQgYnkgY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGZvcm1Hcm91cENvbnRhaW5lcjogRm9ybUdyb3VwQ29udGFpbmVyO1xuXG4gICAgLyoqIEVtaXRzIHdoZW5ldmVyIGZvcm1GaWVsZENvbnRyb2wncyBzdGF0ZSBjaGFuZ2VzICovXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbmV2ZXIgY29sdW1uIGxheW91dCBpcyBjaGFuZ2VkICovXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgb25Db2x1bW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBGb3JtIGZpZWxkIHRlbXBsYXRlIHJlZmVyZW5jZVxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3JlbmRlcmVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICByZW5kZXJlcjogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQENvbnRlbnRDaGlsZChGb3JtRmllbGRDb250cm9sRXh0cmFzQ29tcG9uZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBmb3JtRmllbGRFeHRyYXM/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihGb3JtRmllbGRFcnJvckRpcmVjdGl2ZSlcbiAgICBwcml2YXRlIF9lcnJvckRpcmVjdGl2ZVF1ZXJ5OiBRdWVyeUxpc3Q8Rm9ybUVycm9yPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnbGFiZWxDb2wnKSBsYWJlbENvbD86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKElucHV0TWVzc2FnZUdyb3VwV2l0aFRlbXBsYXRlLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBpbnB1dE1lc3NhZ2VHcm91cDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICAvKiogQ29tYmluZWQgRXJyb3IgZGlyZWN0aXZlcyBmcm9tIGZpZWxkIGl0c2VsZiBhbmQgcGFyZW50IGZvcm0gY29udGFpbmVyLiAqL1xuICAgIGdldCBlcnJvckRpcmVjdGl2ZXMoKTogRm9ybUVycm9yW10ge1xuICAgICAgICByZXR1cm4gdW5pcUJ5KFsuLi50aGlzLl9lcnJvckRpcmVjdGl2ZXMsIC4uLnRoaXMuX2Zvcm1Hcm91cEVycm9yRGlyZWN0aXZlc10sICdlcnJvcicpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaXNIb3Jpem9udGFsJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIC8qKlxuICAgICAqIENoaWxkIEZvcm1GaWVsZENvbnRyb2xcbiAgICAgKi9cbiAgICBjb250cm9sOiBQbGF0Zm9ybUZvcm1GaWVsZENvbnRyb2wgfCBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfbGFiZWxDb2x1bW5MYXlvdXRDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfZmllbGRDb2x1bW5MYXlvdXRDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfZ2FwQ29sdW1uTGF5b3V0Q2xhc3M6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIGhpbnQgYW5kIGhpbnQgcGxhY2VtZW50IGNvZXJjZWQgdG8gdGhlIEZpZWxkSGludE9wdGlvbnNcbiAgICAgKi9cbiAgICBoaW50T3B0aW9uczogRmllbGRIaW50T3B0aW9ucyA9IGRlZmF1bHRGb3JtRmllbGRIaW50T3B0aW9ucyBhcyB1bmtub3duIGFzIEZpZWxkSGludE9wdGlvbnM7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9lcnJvckRpcmVjdGl2ZXM6IEZvcm1FcnJvcltdID0gW107XG5cbiAgICAvKiogR3JvdXBlZCBlcnJvcnMuICovXG4gICAgZ3JvdXBlZEVycm9yczogRm9ybUZpZWxkRXJyb3JEaXJlY3RpdmVDb250ZXh0W10gPSBbXTtcblxuICAgIC8qKiBFdmVudCBlbWl0ZWQgd2hlbiBlcnJvcnMgb2JqZWN0IGJlaW5nIGNoYW5nZWQuICovXG4gICAgZXJyb3JzQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogT3B0aW9uYWwgRm9ybUNvbnRyb2xcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgX2NvbHVtbnM6IENvbHVtbiA9IDY7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByb3RlY3RlZCBfZWRpdGFibGUgPSB0cnVlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgX2Zvcm1Hcm91cDogRm9ybUdyb3VwO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgX3JlcXVpcmVkID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByb3RlY3RlZCBfZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2lzQ29sdW1uTGF5b3V0RW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gY29sdW1uIG51bWJlciBmb3IgZGlmZmVyZW50IHNjcmVlbiBzaXplcyAqL1xuICAgIHByaXZhdGUgX3hsQ29sdW1uTnVtYmVyOiBudW1iZXI7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xnQ29sdW1uTnVtYmVyOiBudW1iZXI7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX21kQ29sdW1uTnVtYmVyOiBudW1iZXI7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3NDb2x1bW5OdW1iZXIgPSAxO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9jb2x1bW5MYXlvdXQ6IENvbHVtbkxheW91dDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVzcG9uc2l2ZUJyZWFrUG9pbnRDb25maWc6IFJlc3BvbnNpdmVCcmVha1BvaW50Q29uZmlnO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9sYWJlbExheW91dDogTGFiZWxMYXlvdXQ7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xhYmVsQ29sdW1uTGF5b3V0OiBDb2x1bW5MYXlvdXQ7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2ZpZWxkQ29sdW1uTGF5b3V0OiBDb2x1bW5MYXlvdXQ7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nYXBDb2x1bW5MYXlvdXQ6IENvbHVtbkxheW91dDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZm9ybUdyb3VwRXJyb3JEaXJlY3RpdmVzOiBGb3JtRXJyb3JbXSA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9mb3JtR3JvdXBFcnJvckRpcmVjdGl2ZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZXJyb3JEaXJlY3RpdmVzQ2RyOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogQGhpZGRlbiB3aGV0aGVyIGxhYmVsIGFuZCBjb250cm9sIGFyZSB2ZXJ0aWNhbGx5IGFsaWduZWQgKi9cbiAgICBwcml2YXRlIGdldCBfaXNIb3Jpem9udGFsQWxpZ25tZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuaW5wdXRNZXNzYWdlR3JvdXAgfHwgIXRoaXMubGFiZWxDb2wpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnB1dE1lc3NhZ2VHcm91cFkgPSB0aGlzLmlucHV0TWVzc2FnZUdyb3VwLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkueTtcbiAgICAgICAgY29uc3QgbGFiZWxDb2xSZWN0ID0gdGhpcy5sYWJlbENvbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBsYWJlbENvbEJvdHRvbVkgPSBsYWJlbENvbFJlY3QueSArIGxhYmVsQ29sUmVjdC5oZWlnaHQ7XG4gICAgICAgIHJldHVybiBsYWJlbENvbEJvdHRvbVkgPiBpbnB1dE1lc3NhZ2VHcm91cFk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFN1bSBvZiBleHRyYSBoZWlnaHRzIGluc2lkZSBmb3JtIGNvbnRyb2wgYW5kIGZvcm1GaWVsZEV4dHJhcy5cbiAgICAgKiBMYWJlbCB3aWxsIGJlIHNoaWZ0ZWQgYnkgdGhpcyBudW1iZXIgaW4gb3JkZXIgdG8gYmUgcHJvcGVybHkgYWxpZ25lZCB3aXRoIHRoZSBjb250cm9sXG4gICAgICovXG4gICAgZ2V0IF9jb250cm9sRXh0cmFzSGVpZ2h0UHgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLm5vTGFiZWxMYXlvdXQgfHwgIXRoaXMuX2lzSG9yaXpvbnRhbEFsaWdubWVudCkge1xuICAgICAgICAgICAgLy8gcHJvY2VlZCBvbmx5IGlmIDEuIHRoZXJlJ3MgYSBsYWJlbDsgMi4gY29udHJvbCBoYXMgdmVydGljYWwgYWxpZ25tZW50XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHRoaXMuZm9ybUZpZWxkRXh0cmFzPy5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA/PyAwKSArICh0aGlzLmNvbnRyb2w/LmV4dHJhQ29udGVudEhlaWdodFB4ID8/IDApIHx8IG51bGxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xhYmVsQ29sdW1uTGF5b3V0JDogQmVoYXZpb3JTdWJqZWN0PENvbHVtbkxheW91dD47XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9maWVsZENvbHVtbkxheW91dCQ6IEJlaGF2aW9yU3ViamVjdDxDb2x1bW5MYXlvdXQ+O1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2FwQ29sdW1uTGF5b3V0JDogQmVoYXZpb3JTdWJqZWN0PENvbHVtbkxheW91dD47XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9uZWVkc0lubGluZUhlbHBQbGFjZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZ2V0IF9ncm91cEhvc3QoKTogRm9ybUdyb3VwQ29udGFpbmVyIHwgRm9ybUZpZWxkR3JvdXAge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtRmllbGRHcm91cCA/IHRoaXMuZm9ybUZpZWxkR3JvdXAgOiB0aGlzLmZvcm1Hcm91cENvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaWxsIGJlIHVwZGF0ZWQgZHVyaW5nIG9uQ2hhbmdlcyBhbmQgcmVzaXplLCByZXN1bHRpbmcgY29ycmVjdCBwbGFjZW1lbnQgb2YgdGhlXG4gICAgICogaGludCByZXNwZWN0aW5nIHBhc3NlZCBjb25maWdzIGFuZCBnaXZlbiBicmVha3BvaW50IG9mIHNjcmVlbi5cbiAgICAgKi9cbiAgICBoaW50VGFyZ2V0Pzogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9icmVha1BvaW50T2JzZXJ2ZXI6IE9ic2VydmFibGU8YW55PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZm9ybUZpZWxkTGF5b3V0U2VydmljZTogRm9ybUZpZWxkTGF5b3V0U2VydmljZTtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRIaW50T3B0aW9uczogRmllbGRIaW50T3B0aW9ucztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgZm9ybUdyb3VwQ29udGFpbmVyOiBGb3JtR3JvdXBDb250YWluZXIsXG4gICAgICAgIEBPcHRpb25hbCgpIHJlYWRvbmx5IGZvcm1GaWVsZEdyb3VwOiBGb3JtRmllbGRHcm91cCxcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQEluamVjdChSRVNQT05TSVZFX0JSRUFLUE9JTlRTX0NPTkZJRylcbiAgICAgICAgcmVhZG9ubHkgX2RlZmF1bHRSZXNwb25zaXZlQnJlYWtQb2ludENvbmZpZzogUmVzcG9uc2l2ZUJyZWFrUG9pbnRDb25maWcsXG4gICAgICAgIHJlYWRvbmx5IF9yZXNwb25zaXZlQnJlYWtwb2ludHNTZXJ2aWNlOiBSZXNwb25zaXZlQnJlYWtwb2ludHNTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KEZEUF9GT1JNX0ZJRUxEX0hJTlRfT1BUSU9OU19ERUZBVUxUKSBfcHJvdmlkZWRIaW50T3B0aW9uczogRmllbGRIaW50T3B0aW9ucyxcbiAgICAgICAgQEluamVjdChGRFBfRk9STV9GSUVMRF9ISU5UX0xBWU9VVF9DT05GSUcpIHByaXZhdGUgX2hpbnRMYXlvdXRDb25maWc6IEhpbnRMYXlvdXRDb25maWcsXG4gICAgICAgIEBTZWxmKCkgX3NlbGZGb3JtRmllbGRMYXlvdXRTZXJ2aWNlOiBGb3JtRmllbGRMYXlvdXRTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBfcGFyZW50Rm9ybUZpZWxkTGF5b3V0U2VydmljZTogRm9ybUZpZWxkTGF5b3V0U2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0SGludE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0Rm9ybUZpZWxkSGludE9wdGlvbnMsXG4gICAgICAgICAgICAuLi5fcHJvdmlkZWRIaW50T3B0aW9uc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9mb3JtRmllbGRMYXlvdXRTZXJ2aWNlID0gX3BhcmVudEZvcm1GaWVsZExheW91dFNlcnZpY2UgfHwgX3NlbGZGb3JtRmllbGRMYXlvdXRTZXJ2aWNlO1xuICAgICAgICB0aGlzLl9sYWJlbENvbHVtbkxheW91dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuX2xhYmVsQ29sdW1uTGF5b3V0KTtcbiAgICAgICAgdGhpcy5fZmllbGRDb2x1bW5MYXlvdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0aGlzLl9maWVsZENvbHVtbkxheW91dCk7XG4gICAgICAgIHRoaXMuX2dhcENvbHVtbkxheW91dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuX2dhcENvbHVtbkxheW91dCk7XG4gICAgICAgIC8vIGZvcm1Hcm91cENvbnRhaW5lciBjYW4gYmUgaW5qZWN0ZWQgb25seSBpZiBjdXJyZW50IGZvcm0tZmllbGQgaXMgbG9jYXRlZFxuICAgICAgICAvLyBpbnNpZ2h0IGZvcm1Hcm91cENvbnRhaW5lciBjb250ZW50LlxuICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB0aGUgZm9ybUdyb3VwQ29udGFpbmVyXG4gICAgICAgIC8vIHdpbGwgYmUgdW5kZWZpbmVkIChrbm93biBhbmd1bGFyIGlzc3VlKSxcbiAgICAgICAgLy8gaW4gc3VjaCBjYXNlIGZvcm1Hcm91cENvbnRhaW5lciBjYW4gYmUgcG9pbnRlZCBleHBsaWNpdGx5IHVzaW5nXG4gICAgICAgIC8vIGNvbXBvbmVudCBpbnB1dCBhbm5vdGF0aW9uXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQ29udGFpbmVyID0gZm9ybUdyb3VwQ29udGFpbmVyO1xuICAgICAgICB0aGlzLl9yZXNwb25zaXZlQnJlYWtQb2ludENvbmZpZyA9IF9kZWZhdWx0UmVzcG9uc2l2ZUJyZWFrUG9pbnRDb25maWcgfHwgbmV3IFJlc3BvbnNpdmVCcmVha1BvaW50Q29uZmlnKCk7XG4gICAgICAgIHRoaXMuX2JyZWFrUG9pbnRPYnNlcnZlciA9IHRoaXMuX3Jlc3BvbnNpdmVCcmVha3BvaW50c1NlcnZpY2Uub2JzZXJ2ZUJyZWFrcG9pbnRCeUNvbmZpZyhcbiAgICAgICAgICAgIHRoaXMuX3Jlc3BvbnNpdmVCcmVha1BvaW50Q29uZmlnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBpbml0aWFsIHZhbHVlcyBmb3IgbGFiZWwsIGZpZWxkIGFuZCBnYXAgY29sdW1uc1xuICAgICAqL1xuICAgIHNldERlZmF1bHRDb2x1bW5MYXlvdXQoKTogdm9pZCB7XG4gICAgICAgIC8vIElmIGxheW91dCBhbHJlYWR5IGRlZmluZWQsIG5vIG5lZWQgdG8gc2V0IGRlZmF1bHQgb25lLlxuICAgICAgICBpZiAodGhpcy5sYWJlbENvbHVtbkxheW91dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuVG9JbmxpbmVIZWxwUGxhY2VSZXF1aXJlbWVudENoYW5nZXMoKCkgPT4gKHRoaXMubGFiZWxDb2x1bW5MYXlvdXQgPyB0aGlzIDogdGhpcy5fZ3JvdXBIb3N0KSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBsaXN0ZW5Ub0lubGluZUhlbHBQbGFjZVJlcXVpcmVtZW50Q2hhbmdlcyhnZXRTb3VyY2U6ICgpID0+IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fbmVlZHNJbmxpbmVIZWxwUGxhY2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX25lZWRzSW5saW5lSGVscFBsYWNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLl9uZWVkc0lubGluZUhlbHBQbGFjZVN1YnNjcmlwdGlvbiA9IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXRMYXlvdXRzID0gKHNvdXJjZTogYW55KTogdm9pZCA9PiB7XG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sdW1uTGF5b3V0ID0gc291cmNlLmxhYmVsQ29sdW1uTGF5b3V0O1xuICAgICAgICAgICAgdGhpcy5maWVsZENvbHVtbkxheW91dCA9IHNvdXJjZS5maWVsZENvbHVtbkxheW91dDtcbiAgICAgICAgICAgIHRoaXMuZ2FwQ29sdW1uTGF5b3V0ID0gc291cmNlLmdhcENvbHVtbkxheW91dDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fbmVlZHNJbmxpbmVIZWxwUGxhY2VTdWJzY3JpcHRpb24gPSB0aGlzLl9mb3JtRmllbGRMYXlvdXRTZXJ2aWNlLm5lZWRzSW5saW5lSGVscFBsYWNlXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5fZm9ybUZpZWxkTGF5b3V0U2VydmljZS5nZXRGaXhlZExheW91dHMoZ2V0U291cmNlKCkpKSxcbiAgICAgICAgICAgICAgICB0YXAoc2V0TGF5b3V0cyksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgLy8gcHJvdmlkZXMgY2FwYWJpbGl0eSB0byBtYWtlIGEgZmllbGQgZGlzYWJsZWQuIHVzZWZ1bCBpbiByZWFjdGl2ZSBmb3JtIGFwcHJvYWNoLlxuICAgICAgICB0aGlzLmZvcm1Db250cm9sID1cbiAgICAgICAgICAgICh0aGlzLmZvcm1Hcm91cENvbnRhaW5lcj8uZm9ybUdyb3VwPy5nZXQodGhpcy5pZCkgYXMgRm9ybUNvbnRyb2wpID8/XG4gICAgICAgICAgICBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogbnVsbCwgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWQgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucyAmJiAodGhpcy5jb2x1bW5zIDwgMSB8fCB0aGlzLmNvbHVtbnMgPiAxMikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW2NvbHVtbnNdIGFjY2VwdHMgbnVtYmVycyBiZXR3ZWVuIDEgLSAxMicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzQ29sdW1uTGF5b3V0RW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5fYnJlYWtQb2ludE9ic2VydmVyXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGJyZWFrUG9pbnROYW1lKSA9PiB0aGlzLl91cGRhdGVMYXlvdXQoYnJlYWtQb2ludE5hbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FkZFRvRm9ybUdyb3VwKCk7XG5cbiAgICAgICAgdGhpcy5pc0hvcml6b250YWwkID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLl9sYWJlbENvbHVtbkxheW91dCQucGlwZShmaWx0ZXIoQm9vbGVhbiksIG1hcChub3JtYWxpemVDb2x1bW5MYXlvdXQpKSxcbiAgICAgICAgICAgIHRoaXMuX2ZpZWxkQ29sdW1uTGF5b3V0JC5waXBlKGZpbHRlcihCb29sZWFuKSwgbWFwKG5vcm1hbGl6ZUNvbHVtbkxheW91dCkpLFxuICAgICAgICAgICAgdGhpcy5fZ2FwQ29sdW1uTGF5b3V0JC5waXBlKG1hcCgoZykgPT4gbm9ybWFsaXplQ29sdW1uTGF5b3V0KGcgfHwgeyBTOiAwIH0pKSlcbiAgICAgICAgXSkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoW2xhYmVsLCBmaWVsZCwgZ2FwXSkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl9icmVha1BvaW50T2JzZXJ2ZXIucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKChicmVha3BvaW50TmFtZSkgPT4gbGFiZWxbYnJlYWtwb2ludE5hbWVdICsgZmllbGRbYnJlYWtwb2ludE5hbWVdICsgZ2FwW2JyZWFrcG9pbnROYW1lXSA8PSAxMilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubGlzdGVuVG9JbmxpbmVIZWxwUGxhY2VSZXF1aXJlbWVudENoYW5nZXMoKCkgPT4gdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmhpbnQgfHwgY2hhbmdlcy5oaW50UGxhY2VtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVIaW50T3B0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5fZm9ybUZpZWxkTGF5b3V0U2VydmljZS5zZXROZWVkc0lubGluZUhlbHAoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICAodGhpcy5oaW50T3B0aW9ucy50YXJnZXQgPT09ICdpbnB1dCcgfHwgdGhpcy5oaW50T3B0aW9ucy50YXJnZXQgPT09ICdhdXRvJykgJiYgISF0aGlzLmhpbnRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXMuaGludCAmJiBjaGFuZ2VzLmhpbnQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2JyZWFrUG9pbnRPYnNlcnZlclxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YXAoKHNpemVOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oaW50T3B0aW9ucy50YXJnZXQgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGludFRhcmdldCA9IHRoaXMuX2hpbnRMYXlvdXRDb25maWcuaGludE9uSW5wdXRCcmVha3BvaW50cy5pbmNsdWRlcyhzaXplTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnaW5wdXQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2xhYmVsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaW50VGFyZ2V0ID0gdGhpcy5oaW50T3B0aW9ucy50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkJClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hc3NpZ25FcnJvckRpcmVjdGl2ZXMoKTtcblxuICAgICAgICB0aGlzLl9lcnJvckRpcmVjdGl2ZVF1ZXJ5LmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9hc3NpZ25FcnJvckRpcmVjdGl2ZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xQcm9wZXJ0aWVzKCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlRXJyb3JIYW5kbGVyKCk7XG4gICAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb3JtRmllbGRMYXlvdXRTZXJ2aWNlLnJlbW92ZUVudHJ5KHRoaXMpO1xuICAgICAgICB0aGlzLl9yZW1vdmVGcm9tRm9ybUdyb3VwKCk7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3llZCQubmV4dCgpO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2Vycm9yRGlyZWN0aXZlc0Nkcj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fZm9ybUdyb3VwRXJyb3JEaXJlY3RpdmVzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaGFzRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9lZGl0YWJsZSAmJiAhIXRoaXMuY29udHJvbD8uY29udHJvbEludmFsaWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgdW5kZXJseWluZyBmb3JtIGNvbnRyb2xcbiAgICAgKiBAcGFyYW0gZm9ybUZpZWxkQ29udHJvbFxuICAgICAqL1xuICAgIHJlZ2lzdGVyRm9ybUZpZWxkQ29udHJvbChmb3JtRmllbGRDb250cm9sOiBGb3JtRmllbGRDb250cm9sKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdGb3JtIGZpZWxkIGNhbiBjb250YWluIG9ubHkgb25lIEZvcm1GaWVsZENvbnRyb2wnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udHJvbCA9IGZvcm1GaWVsZENvbnRyb2wgYXMgUGxhdGZvcm1Gb3JtRmllbGRDb250cm9sO1xuXG4gICAgICAgIGZvcm1GaWVsZENvbnRyb2wuc3RhdGVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDb250cm9sUHJvcGVydGllcygpO1xuICAgICAgICAgICAgLy8gbmVlZCB0byBjYWxsIGV4cGxpY2l0bHkgZGV0ZWN0Q2hhbmdlcygpIGluc3RlYWQgb2YgbWFya0ZvckNoZWNrIGJlZm9yZSB0aGVcbiAgICAgICAgICAgIC8vIG1vZGlmaWVkIHZhbGlkYXRpb24gc3RhdGUgb2YgdGhlIGNvbnRyb2wgcGFzc2VzIG92ZXIgY2hlY2tlZCBwaGFzZVxuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KCdzdGF0ZUNoYW5nZXMnKTtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBFcnJvcnMoKTtcbiAgICAgICAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVmcmVzaCBVSSB3aGVuIHZhbHVlIGNoYW5nZXNcbiAgICAgICAgaWYgKGZvcm1GaWVsZENvbnRyb2w/Lm5nQ29udHJvbD8udmFsdWVDaGFuZ2VzKSB7XG4gICAgICAgICAgICBmb3JtRmllbGRDb250cm9sLm5nQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KCd2YWx1ZUNoYW5nZXMnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwRXJyb3JzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JtRmllbGRDb250cm9sPy5uZ0NvbnRyb2w/LmNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtRmllbGRDb250cm9sLm5nQ29udHJvbC5jb250cm9sO1xuXG4gICAgICAgICAgICBjb25zdCBoYXNSZXF1aXJlZFZhbGlkYXRvciA9XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JzLmluY2x1ZGVzKFZhbGlkYXRvcnMucmVxdWlyZWQpIHx8IHRoaXMudmFsaWRhdG9ycy5pbmNsdWRlcyhWYWxpZGF0b3JzLnJlcXVpcmVkVHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlcXVpcmVkICYmICFoYXNSZXF1aXJlZFZhbGlkYXRvcikge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGFzUmVxdWlyZWRWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgZm9ybSBjb250cm9sIGlzIGRpc2FibGVkLCBpbiByZWFjdGl2ZSBmb3JtIGFwcHJvYWNoXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZXJlIGlzIGEgY2FzZSB3aGVuIGEgXCJmb3JtLWdyb3VwXCIgaW5pdGlhbCBzdGF0ZSBpcyBWQUxJRCxcbiAgICAgICAgICAgICAqIGFuZCBvbiB0aGUgbmV4dCBsb29wIGEgY2hpbGQgZm9ybS1maWxlZCBleHRlbmRzIGl0IGFuZCBtYWtlXG4gICAgICAgICAgICAgKiB0aGUgZm9ybS1ncm91cCBJTlZBTElELlxuICAgICAgICAgICAgICogSW4gc3VjaCBjYXNlIHdlIGdldCB0aGUgZXJyb3JcbiAgICAgICAgICAgICAqIFwiRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvci4gUHJldmlvdXMgdmFsdWUgaXMgbmctdmFsaWQsIGN1cnJlbnQgdmFsdWUgaXMgbmctaW52YWxpZFwiLlxuICAgICAgICAgICAgICogVG8gZml4IGl0IHdlIGhhdmUgdG8gcG9zdHBvbmUgYWRkaW5nIGZvcm0tZmllbGQgdmFsaWRhdG9yc1xuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMuY29tcG9zZSh0aGlzLnZhbGlkYXRvcnMpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuX2FkZENvbnRyb2xUb0Zvcm1Hcm91cChmb3JtRmllbGRDb250cm9sPy5uZ0NvbnRyb2w/LmNvbnRyb2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlciB1bmRlcmx5aW5nIGZvcm0gY29udHJvbFxuICAgICAqIEBwYXJhbSBmb3JtRmllbGRDb250cm9sXG4gICAgICovXG4gICAgdW5yZWdpc3RlckZvcm1GaWVsZENvbnRyb2woZm9ybUZpZWxkQ29udHJvbDogRm9ybUZpZWxkQ29udHJvbCk6IHZvaWQge1xuICAgICAgICBpZiAoZm9ybUZpZWxkQ29udHJvbCAhPT0gdGhpcy5jb250cm9sKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRyb2wgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3JlbW92ZUNvbnRyb2xGcm9tRm9ybUdyb3VwKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR3JvdXBzXG4gICAgICovXG4gICAgZ3JvdXBFcnJvcnMoKTogdm9pZCB7XG4gICAgICAgIC8vIFF1ZXVlIHRhc2sgYmVjYXVzZSBmaXJpbmcgaXQgcmlnaHQgYXdheSBtYXkgY2F1c2UgZXJyb3Igd2l0aCBzaG93aW5nIGVtcHR5IG1lc3NhZ2UuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncm91cGVkRXJyb3JzID0gW107XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmNvbnRyb2w/Lm5nQ29udHJvbD8uZXJyb3JzO1xuICAgICAgICAgICAgaWYgKCFlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXJyb3JEaXJlY3RpdmVzLmZvckVhY2goKGRpcmVjdGl2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyb3JzW2RpcmVjdGl2ZS5lcnJvcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBlZEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JzW2RpcmVjdGl2ZS5lcnJvcl1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5lcnJvcnNDaGFuZ2UkLm5leHQoKTtcbiAgICAgICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHByaW9yaXRpemVkIGNvbnRyb2wgc3RhdGUgYmFzZWQgb24gdGhlIGVycm9yIHR5cGVzIGl0IGhhcy5cbiAgICAgKi9cbiAgICBnZXRQcmlvcml0eVN0YXRlKCk6IEZvcm1TdGF0ZXMge1xuICAgICAgICBpZiAodGhpcy5ncm91cGVkRXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzRXJyb3JzKCkgPyAnZXJyb3InIDogJ2RlZmF1bHQnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldEZvcm1TdGF0ZSh0aGlzLmdyb3VwZWRFcnJvcnMubWFwKChlcnJvcikgPT4gZXJyb3IuZGlyZWN0aXZlLnR5cGUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGVycm9yIGRpcmVjdGl2ZXMuXG4gICAgICovXG4gICAgc2V0RXJyb3JEaXJlY3RpdmVzKGRpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxGb3JtRXJyb3I+KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Zvcm1Hcm91cEVycm9yRGlyZWN0aXZlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblxuICAgICAgICBpZiAoIWRpcmVjdGl2ZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Zvcm1Hcm91cEVycm9yRGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXMudG9BcnJheSgpO1xuXG4gICAgICAgIHRoaXMuX2Zvcm1Hcm91cEVycm9yRGlyZWN0aXZlc1N1YnNjcmlwdGlvbiA9IGRpcmVjdGl2ZXMuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9ybUdyb3VwRXJyb3JEaXJlY3RpdmVzID0gZGlyZWN0aXZlcy50b0FycmF5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgY29udGVudCBvZiB0aGUgcHJvdmlkZWQgaGludCBpcyBhIHN0cmluZy5cbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaXNTdHJpbmdIaW50KGhpbnRPcHRpb25zOiBIaW50Q29udGVudCk6IGhpbnRPcHRpb25zIGlzIHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaGludE9wdGlvbnMgPT09ICdzdHJpbmcnO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGVFcnJvckhhbmRsZXIoKTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuX2VkaXRhYmxlICYmXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wgJiZcbiAgICAgICAgICAgIHRoaXMuX2hhc1ZhbGlkYXRvcnMoKSAmJlxuICAgICAgICAgICAgIXRoaXMuaTE4U3RyaW5ncyAmJlxuICAgICAgICAgICAgdGhpcy5lcnJvckRpcmVjdGl2ZXMubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWxpZGF0aW9uIHN0cmluZ3MgYXJlIHJlcXVpcmVkIGZvciB0aGUgYW55IHByb3ZpZGVkIHZhbGlkYXRpb25zLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9oYXNWYWxpZGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0b3JzICYmIHRoaXMudmFsaWRhdG9ycy5sZW5ndGggPiAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBBZGQgRm9ybUZpZWxkIHRvIEZvcm1Hcm91cFxuICAgICAqL1xuICAgIHByaXZhdGUgX2FkZFRvRm9ybUdyb3VwKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUdyb3VwQ29udGFpbmVyIHx8IHRoaXMuZm9ybUZpZWxkR3JvdXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQ29udGFpbmVyLmFkZEZvcm1GaWVsZCh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmVtb3ZlIEZvcm1GaWVsZCBmcm9tIEZvcm1Hcm91cFxuICAgICAqL1xuICAgIHByaXZhdGUgX3JlbW92ZUZyb21Gb3JtR3JvdXAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtR3JvdXBDb250YWluZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm1Hcm91cENvbnRhaW5lci5yZW1vdmVGb3JtRmllbGQodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEFkZCBGb3JtQ29udHJvbCBmcm9tIEZvcm1Hcm91cFxuICAgICAqL1xuICAgIHByaXZhdGUgX2FkZENvbnRyb2xUb0Zvcm1Hcm91cChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1Hcm91cENvbnRhaW5lciB8fCAhIXRoaXMuZm9ybUZpZWxkR3JvdXA/LmZvcm1OYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JtR3JvdXBDb250YWluZXIuYWRkRm9ybUNvbnRyb2wodGhpcy5pZCwgY29udHJvbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFJlbW92ZSBGb3JtQ29udHJvbCBmcm9tIEZvcm1Hcm91cFxuICAgICAqL1xuICAgIHByaXZhdGUgX3JlbW92ZUNvbnRyb2xGcm9tRm9ybUdyb3VwKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUdyb3VwQ29udGFpbmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JtR3JvdXBDb250YWluZXIucmVtb3ZlRm9ybUNvbnRyb2wodGhpcy5pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE5lZWQgdG8gYmUgYWJsZSB0byBzZXQgdGhlc2UgcHJvcGVydGllcyBvbiBldmVyeSBsZXZlbC5cbiAgICAgKiAgLSBHbG9iYWwgRm9ybUdyb3VwIExldmVsIGFzIHdlbGwgZWFjaCBmaWVsZFxuICAgICAqXG4gICAgICogIFRvZG86IHVzZSBtb3JlIGVsZWdhbnQgd2F5IHRvIHNldCB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3VwZGF0ZUNvbnRyb2xQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250cm9sICYmIHRoaXMuX2VkaXRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wuaWQgPSB0aGlzLmlkO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlcXVpcmVkID0gdGhpcy5yZXF1aXJlZDtcblxuICAgICAgICAgICAgaWYgKHRoaXMucGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zZXRMYXlvdXQoKTogdm9pZCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplQ29sdW1uTGF5b3V0KHRoaXMuY29sdW1uTGF5b3V0LCAxKTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTGF5b3V0ID0gbm9ybWFsaXplZDtcbiAgICAgICAgICAgIHRoaXMuX3NDb2x1bW5OdW1iZXIgPSBub3JtYWxpemVkWydTJ107XG4gICAgICAgICAgICB0aGlzLl9tZENvbHVtbk51bWJlciA9IG5vcm1hbGl6ZWRbJ00nXTtcbiAgICAgICAgICAgIHRoaXMuX2xnQ29sdW1uTnVtYmVyID0gbm9ybWFsaXplZFsnTCddO1xuICAgICAgICAgICAgdGhpcy5feGxDb2x1bW5OdW1iZXIgPSBub3JtYWxpemVkWydYTCddO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5faXNDb2x1bW5MYXlvdXRFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3VwZGF0ZUxheW91dChjdXJyZW50QnJlYWtpbmdQb2ludE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5faXNDb2x1bW5MYXlvdXRFbmFibGVkKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnRCcmVha2luZ1BvaW50TmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ1MnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbiA9IHRoaXMuX3NDb2x1bW5OdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbiA9IHRoaXMuX21kQ29sdW1uTnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSB0aGlzLl9sZ0NvbHVtbk51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnWEwnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbiA9IHRoaXMuX3hsQ29sdW1uTnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbiA9IHRoaXMuX3hsQ29sdW1uTnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW1pdCBjb2x1bW4gY2hhbmdlLCBzbyBmb3JtLWdyb3VwIGtub3dzIGl0IGFuZCByZS1hcnJhbmdlcyB0aGUgZmllbGRzXG4gICAgICAgIHRoaXMub25Db2x1bW5DaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3VwZGF0ZUhpbnRPcHRpb25zKCk6IHZvaWQge1xuICAgICAgICAvLyBwbGFjZW1lbnQgaXMgaGVyZSBzZXQgdXAgYmVjYXVzZSBoaW50UGxhY2VtZW50IGlzIGRlcHJlY2F0ZWRcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhpbnQgPT09ICdzdHJpbmcnIHx8IHRoaXMuaGludCBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmhpbnRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZmF1bHRIaW50T3B0aW9ucyxcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ6IHRoaXMuaGludFBsYWNlbWVudCA/IHRoaXMuaGludFBsYWNlbWVudCA6IHRoaXMuX2RlZmF1bHRIaW50T3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICAgICAgICAgICAgY29udGVudDogdGhpcy5oaW50XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmhpbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aGlzLmhpbnRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZmF1bHRIaW50T3B0aW9ucyxcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ6IHRoaXMuaGludFBsYWNlbWVudCA/IHRoaXMuaGludFBsYWNlbWVudCA6IHRoaXMuX2RlZmF1bHRIaW50T3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5oaW50XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9hc3NpZ25FcnJvckRpcmVjdGl2ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Vycm9yRGlyZWN0aXZlc0Nkcj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fZXJyb3JEaXJlY3RpdmVzID0gdGhpcy5fZXJyb3JEaXJlY3RpdmVRdWVyeS50b0FycmF5KCk7XG4gICAgICAgIHRoaXMuX2Vycm9yRGlyZWN0aXZlc0NkciA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgICAgICB0aGlzLl9lcnJvckRpcmVjdGl2ZXMuZm9yRWFjaCgoZGlyZWN0aXZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvckRpcmVjdGl2ZXNDZHIuYWRkKFxuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5kZXRlY3RDaGFuZ2VzJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwRXJyb3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNyZW5kZXJlcj5cbiAgICA8ZGl2IFtob3Jpem9udGFsXT1cInRydWVcIiBmZC1mb3JtLWl0ZW0gY2xhc3M9XCJmZC1yb3dcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJmZC1jb2xcIlxuICAgICAgICAgICAgI2xhYmVsQ29sXG4gICAgICAgICAgICBbY2xhc3NdPVwiX2xhYmVsQ29sdW1uTGF5b3V0Q2xhc3NcIlxuICAgICAgICAgICAgKm5nSWY9XCIhbm9MYWJlbExheW91dFwiXG4gICAgICAgICAgICBbc3R5bGUubWFyZ2luLWJvdHRvbS5weF09XCJfY29udHJvbEV4dHJhc0hlaWdodFB4XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIndpdGhGb3JtTWVzc2FnZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2FwVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiBbaWRdPVwiJ2ZkcC1mb3JtLWhpbnQtJyArIGlkXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1N0cmluZ0hpbnQoaGludE9wdGlvbnMuY29udGVudCk7IGVsc2UgaGludFRlbXBsYXRlXCI+XG4gICAgICAgICAgICB7eyBoaW50T3B0aW9ucy5jb250ZW50IH19XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2hpbnRUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KGhpbnRPcHRpb25zLmNvbnRlbnQpXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3dpdGhGb3JtTWVzc2FnZT5cbiAgICA8ZmRwLWlucHV0LW1lc3NhZ2UtZ3JvdXBcbiAgICAgICAgY2xhc3M9XCJmZC1jb2xcIlxuICAgICAgICBbY2xhc3NdPVwiX2ZpZWxkQ29sdW1uTGF5b3V0Q2xhc3NcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2ZkcC1mb3JtLWxhYmVsLScgKyBpZFwiXG4gICAgPlxuICAgICAgICA8IS0tXG4gICAgICAgICBUb2RvOiB3ZSBzaG91bGQgZXh0ZW5kIHRoaXMgb24gRm9ybUdyb3VwIExldmVsIGFuZCBoYXZlIGVycm9yIHRyaWdnZXIgc3RyYXRlZ3kgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG9cbiAgICAgICAgIGFsbCB0aGUgZmllbGQgZS5nLjogW3RyaWdnZXJzXT1cIlsnbW91c2VlbnRlcicsICdtb3VzZWxlYXZlJ11cIlxuICAgICAgICAgLS0+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICN0cmlnZ2VySXRlbT5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRXJyb3JzKCkgJiYgZ3JvdXBlZEVycm9ycy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8ZmQtZm9ybS1tZXNzYWdlICpuZ0Zvcj1cImxldCBlcnJvciBvZiBncm91cGVkRXJyb3JzXCIgW3R5cGVdPVwiZXJyb3IuZGlyZWN0aXZlLnR5cGVcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgW25nSWZdPVwiZXJyb3IuZGlyZWN0aXZlLl9oZWFkaW5nVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJlcnJvci5kaXJlY3RpdmUuX2hlYWRpbmdUZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogZXJyb3IuZXJyb3IsIGxhYmVsOiBsYWJlbCB9XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXJyb3IuZGlyZWN0aXZlLl9oZWFkaW5nVGVtcGxhdGVSZWYgJiYgZXJyb3IuZGlyZWN0aXZlLl9kZXNjcmlwdGlvblRlbXBsYXRlUmVmXCI+XG4gICAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBbbmdJZl09XCJlcnJvci5kaXJlY3RpdmUuX2Rlc2NyaXB0aW9uVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJlcnJvci5kaXJlY3RpdmUuX2Rlc2NyaXB0aW9uVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGVycm9yLmVycm9yLCBsYWJlbDogbGFiZWwgfVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2ZkLWZvcm0tbWVzc2FnZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPGZkLWZvcm0tbWVzc2FnZSAqbmdJZj1cImdyb3VwZWRFcnJvcnMubGVuZ3RoID09PSAwICYmIGhhc0Vycm9ycygpICYmIGkxOFN0cmluZ3NcIiB0eXBlPVwiZXJyb3JcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpMThTdHJpbmdzOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogY29udHJvbD8ubmdDb250cm9sPy5lcnJvcnMgfVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZmQtZm9ybS1tZXNzYWdlPlxuICAgIDwvZmRwLWlucHV0LW1lc3NhZ2UtZ3JvdXA+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xhYmVsVGVtcGxhdGU+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhpbnRUYXJnZXQgPT09ICdsYWJlbCc7IGVsc2Ugd2l0aG91dEhpbnRcIj5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBbaWRdPVwiJ2ZkcC1mb3JtLWxhYmVsLScgKyBpZFwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwiZWRpdGFibGUgJiYgcmVxdWlyZWRcIlxuICAgICAgICAgICAgZmQtZm9ybS1sYWJlbFxuICAgICAgICAgICAgW2lubGluZUhlbHBDb250ZW50XT1cImhpbnRPcHRpb25zLmNvbnRlbnRcIlxuICAgICAgICAgICAgW2lubGluZUhlbHBCb2R5UGxhY2VtZW50XT1cImhpbnRPcHRpb25zLnBsYWNlbWVudCB8fCAndG9wJ1wiXG4gICAgICAgICAgICBbaW5saW5lSGVscFBsYWNlbWVudF09XCJoaW50T3B0aW9ucy5wb3NpdGlvbiB8fCAnYWZ0ZXInXCJcbiAgICAgICAgICAgIFtpbmxpbmVIZWxwR2x5cGhdPVwiaGludE9wdGlvbnMuZ2x5cGggfHwgJydcIlxuICAgICAgICAgICAgW2lubGluZUhlbHBUcmlnZ2Vyc109XCJoaW50T3B0aW9ucy50cmlnZ2VyIHx8IFtdXCJcbiAgICAgICAgICAgIFthbGlnbkxhYmVsRW5kXT1cIiEhKGlzSG9yaXpvbnRhbCQgfCBhc3luYylcIlxuICAgICAgICAgICAgW2NvbG9uXT1cImNvbG9uXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gW2lkXT1cIidmZHAtZm9ybS1sYWJlbC1jb250ZW50LScgKyBpZFwiPnt7IGxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjd2l0aG91dEhpbnQ+XG4gICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgW2lkXT1cIidmZHAtZm9ybS1sYWJlbC0nICsgaWRcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cImVkaXRhYmxlICYmIHJlcXVpcmVkXCJcbiAgICAgICAgICAgIGZkLWZvcm0tbGFiZWxcbiAgICAgICAgICAgIFtjb2xvbl09XCJjb2xvblwiXG4gICAgICAgICAgICBbYWxpZ25MYWJlbEVuZF09XCIhIShpc0hvcml6b250YWwkIHwgYXN5bmMpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gW2lkXT1cIidmZHAtZm9ybS1sYWJlbC1jb250ZW50LScgKyBpZFwiPnt7IGxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2dhcFRlbXBsYXRlPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoaW50VGFyZ2V0ID09PSAnaW5wdXQnICYmIGhpbnRPcHRpb25zLmNvbnRlbnQ7IGVsc2Ugd2l0aG91dEhpbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZkLWNvbCBmZC1mb3JtLWZpZWxkLWlubGluZS1oZWxwLWNvbnRhaW5lclwiIFtjbGFzc109XCJfZ2FwQ29sdW1uTGF5b3V0Q2xhc3NcIj5cbiAgICAgICAgICAgIDxzcGFuIGZkLWxpbmsgW3VuZGVjb3JhdGVkXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICA8ZmQtaWNvblxuICAgICAgICAgICAgICAgICAgICBbZmQtaW5saW5lLWhlbHBdPVwiaGludE9wdGlvbnMuY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgIFtnbHlwaF09XCJoaW50T3B0aW9ucy5nbHlwaFwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZW1lbnRdPVwiaGludE9wdGlvbnMucGxhY2VtZW50IHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbdHJpZ2dlcnNdPVwiaGludE9wdGlvbnMudHJpZ2dlciB8fCBbXVwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvZmQtaWNvbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICN3aXRob3V0SGludD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZkLWNvbFwiIFtjbGFzc109XCJfZ2FwQ29sdW1uTGF5b3V0Q2xhc3NcIj48L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
706
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL3NyYy9saWIvZm9ybS9mb3JtLWdyb3VwL2Zvcm0tZmllbGQvZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL3NyYy9saWIvZm9ybS9mb3JtLWdyb3VwL2Zvcm0tZmllbGQvZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLFNBQVMsRUFJVCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFNBQVMsRUFDVCxJQUFJLEVBRUosUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFtQixXQUFXLEVBQTBCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsYUFBYSxFQUFnQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RSxPQUFPLEVBT0gsY0FBYyxFQUNkLGtCQUFr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SztnQkFRTixrQkFBa0I7c0JBRGpCLEtBQUs7O1FBS04sK0RBQStEO1FBQy9ELFFBQVE7c0JBRlAsTUFBTTs7UUFNUCwrREFBK0Q7UUFDL0QsY0FBYztzQkFGYixNQUFNO2dCQVNQLFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUt2QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsK0JBQStCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUszRCxvQkFBb0I7c0JBRDNCLGVBQWU7dUJBQUMsdUJBQXVCO2dCQUlqQixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBSXJCLGlCQUFpQjtzQkFEaEIsU0FBUzt1QkFBQyw2QkFBNkIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBpc0Rldk1vZGUsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFByb3ZpZGVyLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTZWxmLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgU2tpcFNlbGYsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBGRF9GT1JNX0ZJRUxELCBGb3JtRmllbGRDb250cm9sLCBGb3JtU3RhdGVzIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvZm9ybXMnO1xuaW1wb3J0IHsgdW5pcUJ5IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZmlsdGVyLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICAgIENvbHVtbixcbiAgICBDb2x1bW5MYXlvdXQsXG4gICAgRmllbGRIaW50T3B0aW9ucyxcbiAgICBGb3JtRXJyb3IsXG4gICAgUGxhdGZvcm1Gb3JtRmllbGRDb250cm9sLFxuICAgIEZvcm1GaWVsZEVycm9yRGlyZWN0aXZlQ29udGV4dCxcbiAgICBGb3JtRmllbGRHcm91cCxcbiAgICBGb3JtR3JvdXBDb250YWluZXIsXG4gICAgSGludFBsYWNlbWVudCxcbiAgICBMYWJlbExheW91dCxcbiAgICBSRVNQT05TSVZFX0JSRUFLUE9JTlRTX0NPTkZJRyxcbiAgICBSZXNwb25zaXZlQnJlYWtQb2ludENvbmZpZyxcbiAgICBSZXNwb25zaXZlQnJlYWtwb2ludHNTZXJ2aWNlLFxuICAgIFBsYXRmb3JtRm9ybUZpZWxkLFxuICAgIEZpZWxkSGludElucHV0LFxuICAgIEhpbnRDb250ZW50XG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvcGxhdGZvcm0vc2hhcmVkJztcbmltcG9ydCB7IE51bGxhYmxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgZ2V0Rm9ybVN0YXRlIH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQge1xuICAgIERlZmF1bHRIb3Jpem9udGFsRmllbGRMYXlvdXQsXG4gICAgRGVmYXVsdEhvcml6b250YWxMYWJlbExheW91dCxcbiAgICBEZWZhdWx0VmVydGljYWxGaWVsZExheW91dCxcbiAgICBEZWZhdWx0VmVydGljYWxMYWJlbExheW91dCxcbiAgICBGT1JNX0dST1VQX0NISUxEX0ZJRUxEX1RPS0VOXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGb3JtRmllbGRFcnJvckRpcmVjdGl2ZSB9IGZyb20gJy4uL2Zvcm0tZmllbGQtZXJyb3IvZm9ybS1maWVsZC1lcnJvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgZ2VuZXJhdGVDb2x1bW5DbGFzcywgbm9ybWFsaXplQ29sdW1uTGF5b3V0IH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBGb3JtRmllbGRDb250cm9sRXh0cmFzQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS1maWVsZC1leHRyYXMvZm9ybS1maWVsZC1leHRyYXMuY29tcG9uZW50JztcbmltcG9ydCB7IElucHV0TWVzc2FnZUdyb3VwV2l0aFRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vaW5wdXQtbWVzc2FnZS1ncm91cC13aXRoLXRlbXBsYXRlL2lucHV0LW1lc3NhZ2UtZ3JvdXAtd2l0aC10ZW1wbGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBGRFBfRk9STV9GSUVMRF9ISU5UX0xBWU9VVF9DT05GSUcsXG4gICAgRkRQX0ZPUk1fRklFTERfSElOVF9PUFRJT05TX0RFRkFVTFQsXG4gICAgSGludExheW91dENvbmZpZ1xufSBmcm9tICcuLi9mZHAtZm9ybS50b2tlbnMnO1xuaW1wb3J0IHsgRm9ybUZpZWxkTGF5b3V0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Zvcm0tZmllbGQtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgZGVmYXVsdEZvcm1GaWVsZEhpbnRPcHRpb25zIH0gZnJvbSAnLi4vY29uZmlnL2RlZmF1bHQtZm9ybS1maWVsZC1oaW50LW9wdGlvbnMnO1xuXG5sZXQgZGVmYXVsdElkID0gMDtcblxuY29uc3QgZm9ybUZpZWxkUHJvdmlkZXI6IFByb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IEZEX0ZPUk1fRklFTEQsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9ybUZpZWxkQ29tcG9uZW50KVxufTtcblxuY29uc3QgZm9ybUdyb3VwQ2hpbGRQcm92aWRlcjogUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogRk9STV9HUk9VUF9DSElMRF9GSUVMRF9UT0tFTixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGb3JtRmllbGRDb21wb25lbnQpXG59O1xuXG4vKipcbiAqIEZvcm0gRmllbGQgcmVwcmVzZW50IGFjdHVhbCByb3cgYW5kIGFnZ3JlZ2F0ZXMgY29tbW9uIGJlaGF2aW9yIGZvciB0aGUgaW5wdXQgZmllbGQgc3VjaCBhc1xuICogZXJyb3IsIGxhYmVsIG9yIGhpbnQuXG4gKiBIaW50IGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGxpc3RlbmluZyBmb3IgRmllbGRDb250cm9sIGNoYW5nZXMgYW5kIHRyaWdnZXIgbmVjZXNzYXJ5XG4gKiBjaGFuZ2UgZGV0ZWN0aW9uXG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkcC1mb3JtLWZpZWxkJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2Zvcm0tZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2Zvcm0tZmllbGQuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtmb3JtRmllbGRQcm92aWRlciwgZm9ybUdyb3VwQ2hpbGRQcm92aWRlciwgRm9ybUZpZWxkTGF5b3V0U2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUZpZWxkQ29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBQbGF0Zm9ybUZvcm1GaWVsZCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkluaXQsIE9uQ2hhbmdlc1xue1xuICAgIC8qKiBGb3JtIGZpZWxkIGxhYmVsICovXG4gICAgQElucHV0KClcbiAgICBsYWJlbDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3VmZml4IGZvciBpZHMgb2YgY29udHJvbCBlbGVtZW50cyBpbnNpZGUgdGhpcyBmb3JtIGZpZWxkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBpZDogc3RyaW5nID0gKCsrZGVmYXVsdElkKS50b1N0cmluZygpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGBoaW50LnBsYWNlbWVudGAgaW5wdXQgaW5zdGVhZFxuICAgICAqIERlZmluZXMgaGludCBwbGFjZW1lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGhpbnRQbGFjZW1lbnQ6IEhpbnRQbGFjZW1lbnQ7XG5cbiAgICAvKiogSGludCB0byBiZSBwbGFjZWQgbmV4dCB0byBsYWJlbCAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGludDogTnVsbGFibGU8RmllbGRIaW50SW5wdXQ+O1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBVc2UgbGFiZWxDb2x1bW5MYXlvdXQsIGZpZWxkQ29sdW1uTGF5b3V0IGFuZCBnYXBDb2x1bW5MYXlvdXQgcHJvcGVydGllcy5cbiAgICAgKiBEZWZpbmUgZm9ybSBmaWVsZCBsYWJlbCBwbGFjZW1lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBsYWJlbExheW91dCh2YWx1ZTogTGFiZWxMYXlvdXQpIHtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgJ0xhYmVsTGF5b3V0IGlucHV0IHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbGFiZWxDb2x1bW5MYXlvdXQsIGZpZWxkQ29sdW1uTGF5b3V0IGFuZCBnYXBDb2x1bW5MYXlvdXQgcHJvcGVydGllcyBpbnN0ZWFkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9sYWJlbExheW91dCA9IHZhbHVlO1xuXG4gICAgICAgIHRoaXMubGFiZWxDb2x1bW5MYXlvdXQgPVxuICAgICAgICAgICAgdGhpcy5fbGFiZWxMYXlvdXQgPT09ICdob3Jpem9udGFsJyA/IERlZmF1bHRIb3Jpem9udGFsTGFiZWxMYXlvdXQgOiBEZWZhdWx0VmVydGljYWxMYWJlbExheW91dDtcbiAgICAgICAgdGhpcy5maWVsZENvbHVtbkxheW91dCA9XG4gICAgICAgICAgICB0aGlzLl9sYWJlbExheW91dCA9PT0gJ2hvcml6b250YWwnID8gRGVmYXVsdEhvcml6b250YWxGaWVsZExheW91dCA6IERlZmF1bHRWZXJ0aWNhbEZpZWxkTGF5b3V0O1xuICAgIH1cblxuICAgIGdldCBsYWJlbExheW91dCgpOiBMYWJlbExheW91dCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbExheW91dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hlbiBmb3JtIGZpZWxkIGxhYmVsIHNob3VsZCBub3QgYmUgZGlzcGxheWVkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBub0xhYmVsTGF5b3V0ID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiB2YWxpZGF0b3JzIGFwcGxpZWQgdG8gdGhlIGZvcm0gZmllbGQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB2YWxpZGF0b3JzOiBBcnJheTxWYWxpZGF0b3JGbj4gPSBbVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yXTtcblxuICAgIC8qKlxuICAgICAqIFJhbmsgaXMgdXNlZCBmb3Igb3JkZXJpbmcuXG4gICAgICogRmlyc3QgbG93ZXIgbnVtYmVyLCB0aGVuIC0gaGlnaGVyXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICByYW5rOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBQbGFjZWhvbGRlciBmb3IgdGhlIGZpZWxkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gICAgLyoqIEZvcm0gQ29udGFpbmVyIGNvbHVtbiBpdCBiZWxvbmdzIHRvICovXG4gICAgQElucHV0KClcbiAgICBjb2x1bW46IG51bWJlcjtcblxuICAgIC8qKiBvYmplY3QgZm9yIHBsYWNpbmcgZmllbGQgaW4gY29sdW1uIGluIGVhY2ggc2NyZWVuIGxheW91dCAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGNvbHVtbkxheW91dChsYXlvdXQ6IENvbHVtbkxheW91dCB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIWxheW91dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbHVtbkxheW91dCA9IGxheW91dDtcbiAgICAgICAgdGhpcy5faXNDb2x1bW5MYXlvdXRFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fc2V0TGF5b3V0KCk7XG4gICAgfVxuXG4gICAgZ2V0IGNvbHVtbkxheW91dCgpOiBDb2x1bW5MYXlvdXQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uTGF5b3V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbGFiZWwncyBjb2x1bW4gbGF5b3V0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGxhYmVsQ29sdW1uTGF5b3V0KHZhbHVlOiBDb2x1bW5MYXlvdXQgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xhYmVsQ29sdW1uTGF5b3V0ID0gbm9ybWFsaXplQ29sdW1uTGF5b3V0KHZhbHVlKTtcbiAgICAgICAgdGhpcy5fbGFiZWxDb2x1bW5MYXlvdXRDbGFzcyA9IGdlbmVyYXRlQ29sdW1uQ2xhc3ModGhpcy5fbGFiZWxDb2x1bW5MYXlvdXQpO1xuICAgICAgICB0aGlzLl9sYWJlbENvbHVtbkxheW91dCQubmV4dCh0aGlzLl9sYWJlbENvbHVtbkxheW91dCk7XG4gICAgfVxuXG4gICAgZ2V0IGxhYmVsQ29sdW1uTGF5b3V0KCk6IENvbHVtbkxheW91dCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbENvbHVtbkxheW91dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGZpZWxkJ3MgY29sdW1uIGxheW91dC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBmaWVsZENvbHVtbkxheW91dCh2YWx1ZTogQ29sdW1uTGF5b3V0IHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2ZpZWxkQ29sdW1uTGF5b3V0ID0gbm9ybWFsaXplQ29sdW1uTGF5b3V0KHZhbHVlKTtcbiAgICAgICAgdGhpcy5fZmllbGRDb2x1bW5MYXlvdXRDbGFzcyA9IGdlbmVyYXRlQ29sdW1uQ2xhc3ModGhpcy5fZmllbGRDb2x1bW5MYXlvdXQpO1xuICAgICAgICB0aGlzLl9maWVsZENvbHVtbkxheW91dCQubmV4dCh0aGlzLl9maWVsZENvbHVtbkxheW91dCk7XG4gICAgfVxuXG4gICAgZ2V0IGZpZWxkQ29sdW1uTGF5b3V0KCk6IENvbHVtbkxheW91dCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZENvbHVtbkxheW91dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGdhcCBjb2x1bW4gbGF5b3V0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGdhcENvbHVtbkxheW91dCh2YWx1ZTogQ29sdW1uTGF5b3V0IHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dhcENvbHVtbkxheW91dCA9IG5vcm1hbGl6ZUNvbHVtbkxheW91dCh2YWx1ZSk7XG4gICAgICAgIHRoaXMuX2dhcENvbHVtbkxheW91dENsYXNzID0gZ2VuZXJhdGVDb2x1bW5DbGFzcyh0aGlzLl9nYXBDb2x1bW5MYXlvdXQpO1xuICAgICAgICB0aGlzLl9nYXBDb2x1bW5MYXlvdXQkLm5leHQodGhpcy5fZ2FwQ29sdW1uTGF5b3V0KTtcbiAgICB9XG5cbiAgICBnZXQgZ2FwQ29sdW1uTGF5b3V0KCk6IENvbHVtbkxheW91dCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nYXBDb2x1bW5MYXlvdXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNsYXRpb25zIHRlbXBsYXRlIHJlZmVyZW5jZS5cbiAgICAgKiBUaGlzIGlzIGluIG1vc3Qgb2YgdGhlIGNhc2VzIHNldCBmcm9tIHBhcmVudCBjb250YWluZXIgKGZvcm0tZ3JvdXApXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBpMThTdHJpbmdzOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIFNldCB3aGVuIGZvcm0gZmllbGQgaXMgYSBtYW5kYXRvcnkgb25lLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHJlcXVpcmVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBmaWVsZCBpcyBlZGl0YWJsZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGVkaXRhYmxlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuX2VkaXRhYmxlICE9PSBuZXdWYWwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRhYmxlID0gbmV3VmFsO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29udHJvbFByb3BlcnRpZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBlZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRhYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm0gZmllbGQgY3VzdG9tIHdpZHRoIGluIGNvbHVtbnMgbXVzdCBiZSBiZXR3ZWVuIDEgLSAxMlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGNvbHVtbnModmFsdWU6IENvbHVtbikge1xuICAgICAgICB0aGlzLl9jb2x1bW5zID0gPENvbHVtbj5jb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0IGNvbHVtbnMoKTogQ29sdW1uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbWFya3MgZmllbGQgYXMgZGlzYWJsZWQuIHVzZWQgaW4gcmVhY3RpdmUgZm9ybSBhcHByb2FjaC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciBsYWJlbCB0ZXh0IHNob3VsZCBiZSBhcHBlbmRlZCB3aXRoIGNvbG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY29sb24gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEZvcm0gR3JvdXAgQ29udGFpbmVyIHRvIGJpbmQgdGhlIEZvcm0tRmllbGQgdG8uXG4gICAgICogVGhpcyB3aWxsIG92ZXJyaWRlIGRlZmF1bHQgdmFsdWUgaW5qZWN0ZWQgYnkgY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGZvcm1Hcm91cENvbnRhaW5lcjogRm9ybUdyb3VwQ29udGFpbmVyO1xuXG4gICAgLyoqIEVtaXRzIHdoZW5ldmVyIGZvcm1GaWVsZENvbnRyb2wncyBzdGF0ZSBjaGFuZ2VzICovXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbmV2ZXIgY29sdW1uIGxheW91dCBpcyBjaGFuZ2VkICovXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgb25Db2x1bW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBGb3JtIGZpZWxkIHRlbXBsYXRlIHJlZmVyZW5jZVxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3JlbmRlcmVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICByZW5kZXJlcjogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQENvbnRlbnRDaGlsZChGb3JtRmllbGRDb250cm9sRXh0cmFzQ29tcG9uZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBmb3JtRmllbGRFeHRyYXM/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihGb3JtRmllbGRFcnJvckRpcmVjdGl2ZSlcbiAgICBwcml2YXRlIF9lcnJvckRpcmVjdGl2ZVF1ZXJ5OiBRdWVyeUxpc3Q8Rm9ybUVycm9yPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnbGFiZWxDb2wnKSBsYWJlbENvbD86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKElucHV0TWVzc2FnZUdyb3VwV2l0aFRlbXBsYXRlLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBpbnB1dE1lc3NhZ2VHcm91cDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICAvKiogQ29tYmluZWQgRXJyb3IgZGlyZWN0aXZlcyBmcm9tIGZpZWxkIGl0c2VsZiBhbmQgcGFyZW50IGZvcm0gY29udGFpbmVyLiAqL1xuICAgIGdldCBlcnJvckRpcmVjdGl2ZXMoKTogRm9ybUVycm9yW10ge1xuICAgICAgICByZXR1cm4gdW5pcUJ5KFsuLi50aGlzLl9lcnJvckRpcmVjdGl2ZXMsIC4uLnRoaXMuX2Zvcm1Hcm91cEVycm9yRGlyZWN0aXZlc10sICdlcnJvcicpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaXNIb3Jpem9udGFsJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIC8qKlxuICAgICAqIENoaWxkIEZvcm1GaWVsZENvbnRyb2xcbiAgICAgKi9cbiAgICBjb250cm9sOiBQbGF0Zm9ybUZvcm1GaWVsZENvbnRyb2wgfCBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfbGFiZWxDb2x1bW5MYXlvdXRDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfZmllbGRDb2x1bW5MYXlvdXRDbGFzczogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfZ2FwQ29sdW1uTGF5b3V0Q2xhc3M6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIGhpbnQgYW5kIGhpbnQgcGxhY2VtZW50IGNvZXJjZWQgdG8gdGhlIEZpZWxkSGludE9wdGlvbnNcbiAgICAgKi9cbiAgICBoaW50T3B0aW9uczogRmllbGRIaW50T3B0aW9ucyA9IGRlZmF1bHRGb3JtRmllbGRIaW50T3B0aW9ucyBhcyB1bmtub3duIGFzIEZpZWxkSGludE9wdGlvbnM7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9lcnJvckRpcmVjdGl2ZXM6IEZvcm1FcnJvcltdID0gW107XG5cbiAgICAvKiogR3JvdXBlZCBlcnJvcnMuICovXG4gICAgZ3JvdXBlZEVycm9yczogRm9ybUZpZWxkRXJyb3JEaXJlY3RpdmVDb250ZXh0W10gPSBbXTtcblxuICAgIC8qKiBFdmVudCBlbWl0ZWQgd2hlbiBlcnJvcnMgb2JqZWN0IGJlaW5nIGNoYW5nZWQuICovXG4gICAgZXJyb3JzQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogT3B0aW9uYWwgRm9ybUNvbnRyb2xcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgX2NvbHVtbnM6IENvbHVtbiA9IDY7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByb3RlY3RlZCBfZWRpdGFibGUgPSB0cnVlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgX2Zvcm1Hcm91cDogRm9ybUdyb3VwO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcm90ZWN0ZWQgX3JlcXVpcmVkID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByb3RlY3RlZCBfZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2lzQ29sdW1uTGF5b3V0RW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gY29sdW1uIG51bWJlciBmb3IgZGlmZmVyZW50IHNjcmVlbiBzaXplcyAqL1xuICAgIHByaXZhdGUgX3hsQ29sdW1uTnVtYmVyOiBudW1iZXI7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xnQ29sdW1uTnVtYmVyOiBudW1iZXI7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX21kQ29sdW1uTnVtYmVyOiBudW1iZXI7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3NDb2x1bW5OdW1iZXIgPSAxO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9jb2x1bW5MYXlvdXQ6IENvbHVtbkxheW91dDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVzcG9uc2l2ZUJyZWFrUG9pbnRDb25maWc6IFJlc3BvbnNpdmVCcmVha1BvaW50Q29uZmlnO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9sYWJlbExheW91dDogTGFiZWxMYXlvdXQ7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xhYmVsQ29sdW1uTGF5b3V0OiBDb2x1bW5MYXlvdXQ7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2ZpZWxkQ29sdW1uTGF5b3V0OiBDb2x1bW5MYXlvdXQ7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nYXBDb2x1bW5MYXlvdXQ6IENvbHVtbkxheW91dDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZm9ybUdyb3VwRXJyb3JEaXJlY3RpdmVzOiBGb3JtRXJyb3JbXSA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9mb3JtR3JvdXBFcnJvckRpcmVjdGl2ZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZXJyb3JEaXJlY3RpdmVzQ2RyOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogQGhpZGRlbiB3aGV0aGVyIGxhYmVsIGFuZCBjb250cm9sIGFyZSB2ZXJ0aWNhbGx5IGFsaWduZWQgKi9cbiAgICBwcml2YXRlIGdldCBfaXNIb3Jpem9udGFsQWxpZ25tZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuaW5wdXRNZXNzYWdlR3JvdXAgfHwgIXRoaXMubGFiZWxDb2wpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnB1dE1lc3NhZ2VHcm91cFkgPSB0aGlzLmlucHV0TWVzc2FnZUdyb3VwLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkueTtcbiAgICAgICAgY29uc3QgbGFiZWxDb2xSZWN0ID0gdGhpcy5sYWJlbENvbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBsYWJlbENvbEJvdHRvbVkgPSBsYWJlbENvbFJlY3QueSArIGxhYmVsQ29sUmVjdC5oZWlnaHQ7XG4gICAgICAgIHJldHVybiBsYWJlbENvbEJvdHRvbVkgPiBpbnB1dE1lc3NhZ2VHcm91cFk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFN1bSBvZiBleHRyYSBoZWlnaHRzIGluc2lkZSBmb3JtIGNvbnRyb2wgYW5kIGZvcm1GaWVsZEV4dHJhcy5cbiAgICAgKiBMYWJlbCB3aWxsIGJlIHNoaWZ0ZWQgYnkgdGhpcyBudW1iZXIgaW4gb3JkZXIgdG8gYmUgcHJvcGVybHkgYWxpZ25lZCB3aXRoIHRoZSBjb250cm9sXG4gICAgICovXG4gICAgZ2V0IF9jb250cm9sRXh0cmFzSGVpZ2h0UHgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLm5vTGFiZWxMYXlvdXQgfHwgIXRoaXMuX2lzSG9yaXpvbnRhbEFsaWdubWVudCkge1xuICAgICAgICAgICAgLy8gcHJvY2VlZCBvbmx5IGlmIDEuIHRoZXJlJ3MgYSBsYWJlbDsgMi4gY29udHJvbCBoYXMgdmVydGljYWwgYWxpZ25tZW50XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHRoaXMuZm9ybUZpZWxkRXh0cmFzPy5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA/PyAwKSArICh0aGlzLmNvbnRyb2w/LmV4dHJhQ29udGVudEhlaWdodFB4ID8/IDApIHx8IG51bGxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xhYmVsQ29sdW1uTGF5b3V0JDogQmVoYXZpb3JTdWJqZWN0PENvbHVtbkxheW91dD47XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9maWVsZENvbHVtbkxheW91dCQ6IEJlaGF2aW9yU3ViamVjdDxDb2x1bW5MYXlvdXQ+O1xuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2FwQ29sdW1uTGF5b3V0JDogQmVoYXZpb3JTdWJqZWN0PENvbHVtbkxheW91dD47XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9uZWVkc0lubGluZUhlbHBQbGFjZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZ2V0IF9ncm91cEhvc3QoKTogRm9ybUdyb3VwQ29udGFpbmVyIHwgRm9ybUZpZWxkR3JvdXAge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtRmllbGRHcm91cCA/IHRoaXMuZm9ybUZpZWxkR3JvdXAgOiB0aGlzLmZvcm1Hcm91cENvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaWxsIGJlIHVwZGF0ZWQgZHVyaW5nIG9uQ2hhbmdlcyBhbmQgcmVzaXplLCByZXN1bHRpbmcgY29ycmVjdCBwbGFjZW1lbnQgb2YgdGhlXG4gICAgICogaGludCByZXNwZWN0aW5nIHBhc3NlZCBjb25maWdzIGFuZCBnaXZlbiBicmVha3BvaW50IG9mIHNjcmVlbi5cbiAgICAgKi9cbiAgICBoaW50VGFyZ2V0Pzogc3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9icmVha1BvaW50T2JzZXJ2ZXI6IE9ic2VydmFibGU8YW55PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZm9ybUZpZWxkTGF5b3V0U2VydmljZTogRm9ybUZpZWxkTGF5b3V0U2VydmljZTtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRIaW50T3B0aW9uczogRmllbGRIaW50T3B0aW9ucztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgZm9ybUdyb3VwQ29udGFpbmVyOiBGb3JtR3JvdXBDb250YWluZXIsXG4gICAgICAgIEBPcHRpb25hbCgpIHJlYWRvbmx5IGZvcm1GaWVsZEdyb3VwOiBGb3JtRmllbGRHcm91cCxcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQEluamVjdChSRVNQT05TSVZFX0JSRUFLUE9JTlRTX0NPTkZJRylcbiAgICAgICAgcmVhZG9ubHkgX2RlZmF1bHRSZXNwb25zaXZlQnJlYWtQb2ludENvbmZpZzogUmVzcG9uc2l2ZUJyZWFrUG9pbnRDb25maWcsXG4gICAgICAgIHJlYWRvbmx5IF9yZXNwb25zaXZlQnJlYWtwb2ludHNTZXJ2aWNlOiBSZXNwb25zaXZlQnJlYWtwb2ludHNTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KEZEUF9GT1JNX0ZJRUxEX0hJTlRfT1BUSU9OU19ERUZBVUxUKSBfcHJvdmlkZWRIaW50T3B0aW9uczogRmllbGRIaW50T3B0aW9ucyxcbiAgICAgICAgQEluamVjdChGRFBfRk9STV9GSUVMRF9ISU5UX0xBWU9VVF9DT05GSUcpIHByaXZhdGUgX2hpbnRMYXlvdXRDb25maWc6IEhpbnRMYXlvdXRDb25maWcsXG4gICAgICAgIEBTZWxmKCkgX3NlbGZGb3JtRmllbGRMYXlvdXRTZXJ2aWNlOiBGb3JtRmllbGRMYXlvdXRTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBfcGFyZW50Rm9ybUZpZWxkTGF5b3V0U2VydmljZTogRm9ybUZpZWxkTGF5b3V0U2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0SGludE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0Rm9ybUZpZWxkSGludE9wdGlvbnMsXG4gICAgICAgICAgICAuLi5fcHJvdmlkZWRIaW50T3B0aW9uc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9mb3JtRmllbGRMYXlvdXRTZXJ2aWNlID0gX3BhcmVudEZvcm1GaWVsZExheW91dFNlcnZpY2UgfHwgX3NlbGZGb3JtRmllbGRMYXlvdXRTZXJ2aWNlO1xuICAgICAgICB0aGlzLl9sYWJlbENvbHVtbkxheW91dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuX2xhYmVsQ29sdW1uTGF5b3V0KTtcbiAgICAgICAgdGhpcy5fZmllbGRDb2x1bW5MYXlvdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0aGlzLl9maWVsZENvbHVtbkxheW91dCk7XG4gICAgICAgIHRoaXMuX2dhcENvbHVtbkxheW91dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuX2dhcENvbHVtbkxheW91dCk7XG4gICAgICAgIC8vIGZvcm1Hcm91cENvbnRhaW5lciBjYW4gYmUgaW5qZWN0ZWQgb25seSBpZiBjdXJyZW50IGZvcm0tZmllbGQgaXMgbG9jYXRlZFxuICAgICAgICAvLyBpbnNpZ2h0IGZvcm1Hcm91cENvbnRhaW5lciBjb250ZW50LlxuICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB0aGUgZm9ybUdyb3VwQ29udGFpbmVyXG4gICAgICAgIC8vIHdpbGwgYmUgdW5kZWZpbmVkIChrbm93biBhbmd1bGFyIGlzc3VlKSxcbiAgICAgICAgLy8gaW4gc3VjaCBjYXNlIGZvcm1Hcm91cENvbnRhaW5lciBjYW4gYmUgcG9pbnRlZCBleHBsaWNpdGx5IHVzaW5nXG4gICAgICAgIC8vIGNvbXBvbmVudCBpbnB1dCBhbm5vdGF0aW9uXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQ29udGFpbmVyID0gZm9ybUdyb3VwQ29udGFpbmVyO1xuICAgICAgICB0aGlzLl9yZXNwb25zaXZlQnJlYWtQb2ludENvbmZpZyA9IF9kZWZhdWx0UmVzcG9uc2l2ZUJyZWFrUG9pbnRDb25maWcgfHwgbmV3IFJlc3BvbnNpdmVCcmVha1BvaW50Q29uZmlnKCk7XG4gICAgICAgIHRoaXMuX2JyZWFrUG9pbnRPYnNlcnZlciA9IHRoaXMuX3Jlc3BvbnNpdmVCcmVha3BvaW50c1NlcnZpY2Uub2JzZXJ2ZUJyZWFrcG9pbnRCeUNvbmZpZyhcbiAgICAgICAgICAgIHRoaXMuX3Jlc3BvbnNpdmVCcmVha1BvaW50Q29uZmlnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBpbml0aWFsIHZhbHVlcyBmb3IgbGFiZWwsIGZpZWxkIGFuZCBnYXAgY29sdW1uc1xuICAgICAqL1xuICAgIHNldERlZmF1bHRDb2x1bW5MYXlvdXQoKTogdm9pZCB7XG4gICAgICAgIC8vIElmIGxheW91dCBhbHJlYWR5IGRlZmluZWQsIG5vIG5lZWQgdG8gc2V0IGRlZmF1bHQgb25lLlxuICAgICAgICBpZiAodGhpcy5sYWJlbENvbHVtbkxheW91dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuVG9JbmxpbmVIZWxwUGxhY2VSZXF1aXJlbWVudENoYW5nZXMoKCkgPT4gKHRoaXMubGFiZWxDb2x1bW5MYXlvdXQgPyB0aGlzIDogdGhpcy5fZ3JvdXBIb3N0KSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBsaXN0ZW5Ub0lubGluZUhlbHBQbGFjZVJlcXVpcmVtZW50Q2hhbmdlcyhnZXRTb3VyY2U6ICgpID0+IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fbmVlZHNJbmxpbmVIZWxwUGxhY2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX25lZWRzSW5saW5lSGVscFBsYWNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLl9uZWVkc0lubGluZUhlbHBQbGFjZVN1YnNjcmlwdGlvbiA9IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXRMYXlvdXRzID0gKHNvdXJjZTogYW55KTogdm9pZCA9PiB7XG4gICAgICAgICAgICB0aGlzLmxhYmVsQ29sdW1uTGF5b3V0ID0gc291cmNlLmxhYmVsQ29sdW1uTGF5b3V0O1xuICAgICAgICAgICAgdGhpcy5maWVsZENvbHVtbkxheW91dCA9IHNvdXJjZS5maWVsZENvbHVtbkxheW91dDtcbiAgICAgICAgICAgIHRoaXMuZ2FwQ29sdW1uTGF5b3V0ID0gc291cmNlLmdhcENvbHVtbkxheW91dDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fbmVlZHNJbmxpbmVIZWxwUGxhY2VTdWJzY3JpcHRpb24gPSB0aGlzLl9mb3JtRmllbGRMYXlvdXRTZXJ2aWNlLm5lZWRzSW5saW5lSGVscFBsYWNlXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5fZm9ybUZpZWxkTGF5b3V0U2VydmljZS5nZXRGaXhlZExheW91dHMoZ2V0U291cmNlKCkpKSxcbiAgICAgICAgICAgICAgICB0YXAoc2V0TGF5b3V0cyksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgLy8gcHJvdmlkZXMgY2FwYWJpbGl0eSB0byBtYWtlIGEgZmllbGQgZGlzYWJsZWQuIHVzZWZ1bCBpbiByZWFjdGl2ZSBmb3JtIGFwcHJvYWNoLlxuICAgICAgICB0aGlzLmZvcm1Db250cm9sID1cbiAgICAgICAgICAgICh0aGlzLmZvcm1Hcm91cENvbnRhaW5lcj8uZm9ybUdyb3VwPy5nZXQodGhpcy5pZCkgYXMgRm9ybUNvbnRyb2wpID8/XG4gICAgICAgICAgICBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogbnVsbCwgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWQgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucyAmJiAodGhpcy5jb2x1bW5zIDwgMSB8fCB0aGlzLmNvbHVtbnMgPiAxMikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW2NvbHVtbnNdIGFjY2VwdHMgbnVtYmVycyBiZXR3ZWVuIDEgLSAxMicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzQ29sdW1uTGF5b3V0RW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5fYnJlYWtQb2ludE9ic2VydmVyXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGJyZWFrUG9pbnROYW1lKSA9PiB0aGlzLl91cGRhdGVMYXlvdXQoYnJlYWtQb2ludE5hbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FkZFRvRm9ybUdyb3VwKCk7XG5cbiAgICAgICAgdGhpcy5pc0hvcml6b250YWwkID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLl9sYWJlbENvbHVtbkxheW91dCQucGlwZShmaWx0ZXIoQm9vbGVhbiksIG1hcChub3JtYWxpemVDb2x1bW5MYXlvdXQpKSxcbiAgICAgICAgICAgIHRoaXMuX2ZpZWxkQ29sdW1uTGF5b3V0JC5waXBlKGZpbHRlcihCb29sZWFuKSwgbWFwKG5vcm1hbGl6ZUNvbHVtbkxheW91dCkpLFxuICAgICAgICAgICAgdGhpcy5fZ2FwQ29sdW1uTGF5b3V0JC5waXBlKG1hcCgoZykgPT4gbm9ybWFsaXplQ29sdW1uTGF5b3V0KGcgfHwgeyBTOiAwIH0pKSlcbiAgICAgICAgXSkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoW2xhYmVsLCBmaWVsZCwgZ2FwXSkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLl9icmVha1BvaW50T2JzZXJ2ZXIucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKChicmVha3BvaW50TmFtZSkgPT4gbGFiZWxbYnJlYWtwb2ludE5hbWVdICsgZmllbGRbYnJlYWtwb2ludE5hbWVdICsgZ2FwW2JyZWFrcG9pbnROYW1lXSA8PSAxMilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubGlzdGVuVG9JbmxpbmVIZWxwUGxhY2VSZXF1aXJlbWVudENoYW5nZXMoKCkgPT4gdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmhpbnQgfHwgY2hhbmdlcy5oaW50UGxhY2VtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVIaW50T3B0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5fZm9ybUZpZWxkTGF5b3V0U2VydmljZS5zZXROZWVkc0lubGluZUhlbHAoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICAodGhpcy5oaW50T3B0aW9ucy50YXJnZXQgPT09ICdpbnB1dCcgfHwgdGhpcy5oaW50T3B0aW9ucy50YXJnZXQgPT09ICdhdXRvJykgJiYgISF0aGlzLmhpbnRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXMuaGludCAmJiBjaGFuZ2VzLmhpbnQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2JyZWFrUG9pbnRPYnNlcnZlclxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YXAoKHNpemVOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oaW50T3B0aW9ucy50YXJnZXQgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGludFRhcmdldCA9IHRoaXMuX2hpbnRMYXlvdXRDb25maWcuaGludE9uSW5wdXRCcmVha3BvaW50cy5pbmNsdWRlcyhzaXplTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnaW5wdXQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2xhYmVsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaW50VGFyZ2V0ID0gdGhpcy5oaW50T3B0aW9ucy50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkJClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hc3NpZ25FcnJvckRpcmVjdGl2ZXMoKTtcblxuICAgICAgICB0aGlzLl9lcnJvckRpcmVjdGl2ZVF1ZXJ5LmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9hc3NpZ25FcnJvckRpcmVjdGl2ZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xQcm9wZXJ0aWVzKCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlRXJyb3JIYW5kbGVyKCk7XG4gICAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb3JtRmllbGRMYXlvdXRTZXJ2aWNlLnJlbW92ZUVudHJ5KHRoaXMpO1xuICAgICAgICB0aGlzLl9yZW1vdmVGcm9tRm9ybUdyb3VwKCk7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3llZCQubmV4dCgpO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2Vycm9yRGlyZWN0aXZlc0Nkcj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fZm9ybUdyb3VwRXJyb3JEaXJlY3RpdmVzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaGFzRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9lZGl0YWJsZSAmJiAhIXRoaXMuY29udHJvbD8uY29udHJvbEludmFsaWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgdW5kZXJseWluZyBmb3JtIGNvbnRyb2xcbiAgICAgKiBAcGFyYW0gZm9ybUZpZWxkQ29udHJvbFxuICAgICAqL1xuICAgIHJlZ2lzdGVyRm9ybUZpZWxkQ29udHJvbChmb3JtRmllbGRDb250cm9sOiBGb3JtRmllbGRDb250cm9sKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdGb3JtIGZpZWxkIGNhbiBjb250YWluIG9ubHkgb25lIEZvcm1GaWVsZENvbnRyb2wnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udHJvbCA9IGZvcm1GaWVsZENvbnRyb2wgYXMgUGxhdGZvcm1Gb3JtRmllbGRDb250cm9sO1xuXG4gICAgICAgIGZvcm1GaWVsZENvbnRyb2wuc3RhdGVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDb250cm9sUHJvcGVydGllcygpO1xuICAgICAgICAgICAgLy8gbmVlZCB0byBjYWxsIGV4cGxpY2l0bHkgZGV0ZWN0Q2hhbmdlcygpIGluc3RlYWQgb2YgbWFya0ZvckNoZWNrIGJlZm9yZSB0aGVcbiAgICAgICAgICAgIC8vIG1vZGlmaWVkIHZhbGlkYXRpb24gc3RhdGUgb2YgdGhlIGNvbnRyb2wgcGFzc2VzIG92ZXIgY2hlY2tlZCBwaGFzZVxuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KCdzdGF0ZUNoYW5nZXMnKTtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBFcnJvcnMoKTtcbiAgICAgICAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVmcmVzaCBVSSB3aGVuIHZhbHVlIGNoYW5nZXNcbiAgICAgICAgaWYgKGZvcm1GaWVsZENvbnRyb2w/Lm5nQ29udHJvbD8udmFsdWVDaGFuZ2VzKSB7XG4gICAgICAgICAgICBmb3JtRmllbGRDb250cm9sLm5nQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KCd2YWx1ZUNoYW5nZXMnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwRXJyb3JzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JtRmllbGRDb250cm9sPy5uZ0NvbnRyb2w/LmNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtRmllbGRDb250cm9sLm5nQ29udHJvbC5jb250cm9sO1xuXG4gICAgICAgICAgICBjb25zdCBoYXNSZXF1aXJlZFZhbGlkYXRvciA9XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0b3JzLmluY2x1ZGVzKFZhbGlkYXRvcnMucmVxdWlyZWQpIHx8IHRoaXMudmFsaWRhdG9ycy5pbmNsdWRlcyhWYWxpZGF0b3JzLnJlcXVpcmVkVHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlcXVpcmVkICYmICFoYXNSZXF1aXJlZFZhbGlkYXRvcikge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGFzUmVxdWlyZWRWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgZm9ybSBjb250cm9sIGlzIGRpc2FibGVkLCBpbiByZWFjdGl2ZSBmb3JtIGFwcHJvYWNoXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZXJlIGlzIGEgY2FzZSB3aGVuIGEgXCJmb3JtLWdyb3VwXCIgaW5pdGlhbCBzdGF0ZSBpcyBWQUxJRCxcbiAgICAgICAgICAgICAqIGFuZCBvbiB0aGUgbmV4dCBsb29wIGEgY2hpbGQgZm9ybS1maWxlZCBleHRlbmRzIGl0IGFuZCBtYWtlXG4gICAgICAgICAgICAgKiB0aGUgZm9ybS1ncm91cCBJTlZBTElELlxuICAgICAgICAgICAgICogSW4gc3VjaCBjYXNlIHdlIGdldCB0aGUgZXJyb3JcbiAgICAgICAgICAgICAqIFwiRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvci4gUHJldmlvdXMgdmFsdWUgaXMgbmctdmFsaWQsIGN1cnJlbnQgdmFsdWUgaXMgbmctaW52YWxpZFwiLlxuICAgICAgICAgICAgICogVG8gZml4IGl0IHdlIGhhdmUgdG8gcG9zdHBvbmUgYWRkaW5nIGZvcm0tZmllbGQgdmFsaWRhdG9yc1xuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMuY29tcG9zZSh0aGlzLnZhbGlkYXRvcnMpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuX2FkZENvbnRyb2xUb0Zvcm1Hcm91cChmb3JtRmllbGRDb250cm9sPy5uZ0NvbnRyb2w/LmNvbnRyb2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlciB1bmRlcmx5aW5nIGZvcm0gY29udHJvbFxuICAgICAqIEBwYXJhbSBmb3JtRmllbGRDb250cm9sXG4gICAgICovXG4gICAgdW5yZWdpc3RlckZvcm1GaWVsZENvbnRyb2woZm9ybUZpZWxkQ29udHJvbDogRm9ybUZpZWxkQ29udHJvbCk6IHZvaWQge1xuICAgICAgICBpZiAoZm9ybUZpZWxkQ29udHJvbCAhPT0gdGhpcy5jb250cm9sKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRyb2wgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3JlbW92ZUNvbnRyb2xGcm9tRm9ybUdyb3VwKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR3JvdXBzXG4gICAgICovXG4gICAgZ3JvdXBFcnJvcnMoKTogdm9pZCB7XG4gICAgICAgIC8vIFF1ZXVlIHRhc2sgYmVjYXVzZSBmaXJpbmcgaXQgcmlnaHQgYXdheSBtYXkgY2F1c2UgZXJyb3Igd2l0aCBzaG93aW5nIGVtcHR5IG1lc3NhZ2UuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncm91cGVkRXJyb3JzID0gW107XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmNvbnRyb2w/Lm5nQ29udHJvbD8uZXJyb3JzO1xuICAgICAgICAgICAgaWYgKCFlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXJyb3JEaXJlY3RpdmVzLmZvckVhY2goKGRpcmVjdGl2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyb3JzW2RpcmVjdGl2ZS5lcnJvcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBlZEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JzW2RpcmVjdGl2ZS5lcnJvcl1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5lcnJvcnNDaGFuZ2UkLm5leHQoKTtcbiAgICAgICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHByaW9yaXRpemVkIGNvbnRyb2wgc3RhdGUgYmFzZWQgb24gdGhlIGVycm9yIHR5cGVzIGl0IGhhcy5cbiAgICAgKi9cbiAgICBnZXRQcmlvcml0eVN0YXRlKCk6IEZvcm1TdGF0ZXMge1xuICAgICAgICBpZiAodGhpcy5ncm91cGVkRXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzRXJyb3JzKCkgPyAnZXJyb3InIDogJ2RlZmF1bHQnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldEZvcm1TdGF0ZSh0aGlzLmdyb3VwZWRFcnJvcnMubWFwKChlcnJvcikgPT4gZXJyb3IuZGlyZWN0aXZlLnR5cGUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGVycm9yIGRpcmVjdGl2ZXMuXG4gICAgICovXG4gICAgc2V0RXJyb3JEaXJlY3RpdmVzKGRpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxGb3JtRXJyb3I+KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Zvcm1Hcm91cEVycm9yRGlyZWN0aXZlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblxuICAgICAgICBpZiAoIWRpcmVjdGl2ZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Zvcm1Hcm91cEVycm9yRGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXMudG9BcnJheSgpO1xuXG4gICAgICAgIHRoaXMuX2Zvcm1Hcm91cEVycm9yRGlyZWN0aXZlc1N1YnNjcmlwdGlvbiA9IGRpcmVjdGl2ZXMuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9ybUdyb3VwRXJyb3JEaXJlY3RpdmVzID0gZGlyZWN0aXZlcy50b0FycmF5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgY29udGVudCBvZiB0aGUgcHJvdmlkZWQgaGludCBpcyBhIHN0cmluZy5cbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaXNTdHJpbmdIaW50KGhpbnRPcHRpb25zOiBIaW50Q29udGVudCk6IGhpbnRPcHRpb25zIGlzIHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaGludE9wdGlvbnMgPT09ICdzdHJpbmcnO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2dldExhYmVsbGVkQnkoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9ICdmZHAtZm9ybS1sYWJlbC0nICsgdGhpcy5pZDtcbiAgICAgICAgaWYgKHRoaXMuaGFzRXJyb3JzKCkgJiYgdGhpcy5ncm91cGVkRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCArICcgZmRwLWZvcm0tbWVzc2FnZS1ncm91cGVkLWVycm9ycy0nICsgdGhpcy5pZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncm91cGVkRXJyb3JzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmhhc0Vycm9ycygpICYmIHRoaXMuaTE4U3RyaW5ncykge1xuICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsICsgJyBmZHAtZm9ybS1tZXNzYWdlLWVycm9yLScgKyB0aGlzLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3ZhbGlkYXRlRXJyb3JIYW5kbGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLl9lZGl0YWJsZSAmJlxuICAgICAgICAgICAgdGhpcy5jb250cm9sICYmXG4gICAgICAgICAgICB0aGlzLl9oYXNWYWxpZGF0b3JzKCkgJiZcbiAgICAgICAgICAgICF0aGlzLmkxOFN0cmluZ3MgJiZcbiAgICAgICAgICAgIHRoaXMuZXJyb3JEaXJlY3RpdmVzLmxlbmd0aCA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsaWRhdGlvbiBzdHJpbmdzIGFyZSByZXF1aXJlZCBmb3IgdGhlIGFueSBwcm92aWRlZCB2YWxpZGF0aW9ucy4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaGFzVmFsaWRhdG9ycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdG9ycyAmJiB0aGlzLnZhbGlkYXRvcnMubGVuZ3RoID4gMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQWRkIEZvcm1GaWVsZCB0byBGb3JtR3JvdXBcbiAgICAgKi9cbiAgICBwcml2YXRlIF9hZGRUb0Zvcm1Hcm91cCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1Hcm91cENvbnRhaW5lciB8fCB0aGlzLmZvcm1GaWVsZEdyb3VwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcm1Hcm91cENvbnRhaW5lci5hZGRGb3JtRmllbGQodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFJlbW92ZSBGb3JtRmllbGQgZnJvbSBGb3JtR3JvdXBcbiAgICAgKi9cbiAgICBwcml2YXRlIF9yZW1vdmVGcm9tRm9ybUdyb3VwKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUdyb3VwQ29udGFpbmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JtR3JvdXBDb250YWluZXIucmVtb3ZlRm9ybUZpZWxkKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBBZGQgRm9ybUNvbnRyb2wgZnJvbSBGb3JtR3JvdXBcbiAgICAgKi9cbiAgICBwcml2YXRlIF9hZGRDb250cm9sVG9Gb3JtR3JvdXAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtR3JvdXBDb250YWluZXIgfHwgISF0aGlzLmZvcm1GaWVsZEdyb3VwPy5mb3JtTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQ29udGFpbmVyLmFkZEZvcm1Db250cm9sKHRoaXMuaWQsIGNvbnRyb2wpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBSZW1vdmUgRm9ybUNvbnRyb2wgZnJvbSBGb3JtR3JvdXBcbiAgICAgKi9cbiAgICBwcml2YXRlIF9yZW1vdmVDb250cm9sRnJvbUZvcm1Hcm91cCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1Hcm91cENvbnRhaW5lcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQ29udGFpbmVyLnJlbW92ZUZvcm1Db250cm9sKHRoaXMuaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBOZWVkIHRvIGJlIGFibGUgdG8gc2V0IHRoZXNlIHByb3BlcnRpZXMgb24gZXZlcnkgbGV2ZWwuXG4gICAgICogIC0gR2xvYmFsIEZvcm1Hcm91cCBMZXZlbCBhcyB3ZWxsIGVhY2ggZmllbGRcbiAgICAgKlxuICAgICAqICBUb2RvOiB1c2UgbW9yZSBlbGVnYW50IHdheSB0byBzZXQgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF91cGRhdGVDb250cm9sUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLl9lZGl0YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sLmlkID0gdGhpcy5pZDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5yZXF1aXJlZCA9IHRoaXMucmVxdWlyZWQ7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc2V0TGF5b3V0KCk6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUNvbHVtbkxheW91dCh0aGlzLmNvbHVtbkxheW91dCwgMSk7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbkxheW91dCA9IG5vcm1hbGl6ZWQ7XG4gICAgICAgICAgICB0aGlzLl9zQ29sdW1uTnVtYmVyID0gbm9ybWFsaXplZFsnUyddO1xuICAgICAgICAgICAgdGhpcy5fbWRDb2x1bW5OdW1iZXIgPSBub3JtYWxpemVkWydNJ107XG4gICAgICAgICAgICB0aGlzLl9sZ0NvbHVtbk51bWJlciA9IG5vcm1hbGl6ZWRbJ0wnXTtcbiAgICAgICAgICAgIHRoaXMuX3hsQ29sdW1uTnVtYmVyID0gbm9ybWFsaXplZFsnWEwnXTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzQ29sdW1uTGF5b3V0RW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF91cGRhdGVMYXlvdXQoY3VycmVudEJyZWFraW5nUG9pbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29sdW1uTGF5b3V0RW5hYmxlZCkge1xuICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50QnJlYWtpbmdQb2ludE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSB0aGlzLl9zQ29sdW1uTnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSB0aGlzLl9tZENvbHVtbk51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uID0gdGhpcy5fbGdDb2x1bW5OdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1hMJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSB0aGlzLl94bENvbHVtbk51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSB0aGlzLl94bENvbHVtbk51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVtaXQgY29sdW1uIGNoYW5nZSwgc28gZm9ybS1ncm91cCBrbm93cyBpdCBhbmQgcmUtYXJyYW5nZXMgdGhlIGZpZWxkc1xuICAgICAgICB0aGlzLm9uQ29sdW1uQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF91cGRhdGVIaW50T3B0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgLy8gcGxhY2VtZW50IGlzIGhlcmUgc2V0IHVwIGJlY2F1c2UgaGludFBsYWNlbWVudCBpcyBkZXByZWNhdGVkXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5oaW50ID09PSAnc3RyaW5nJyB8fCB0aGlzLmhpbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgdGhpcy5oaW50T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWZhdWx0SGludE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50OiB0aGlzLmhpbnRQbGFjZW1lbnQgPyB0aGlzLmhpbnRQbGFjZW1lbnQgOiB0aGlzLl9kZWZhdWx0SGludE9wdGlvbnMucGxhY2VtZW50LFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuaGludFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5oaW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5oaW50T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWZhdWx0SGludE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50OiB0aGlzLmhpbnRQbGFjZW1lbnQgPyB0aGlzLmhpbnRQbGFjZW1lbnQgOiB0aGlzLl9kZWZhdWx0SGludE9wdGlvbnMucGxhY2VtZW50LFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuaGludFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfYXNzaWduRXJyb3JEaXJlY3RpdmVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9lcnJvckRpcmVjdGl2ZXNDZHI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX2Vycm9yRGlyZWN0aXZlcyA9IHRoaXMuX2Vycm9yRGlyZWN0aXZlUXVlcnkudG9BcnJheSgpO1xuICAgICAgICB0aGlzLl9lcnJvckRpcmVjdGl2ZXNDZHIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5fZXJyb3JEaXJlY3RpdmVzLmZvckVhY2goKGRpcmVjdGl2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3JEaXJlY3RpdmVzQ2RyLmFkZChcbiAgICAgICAgICAgICAgICBkaXJlY3RpdmUuZGV0ZWN0Q2hhbmdlcyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cEVycm9ycygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSAjcmVuZGVyZXI+XG4gICAgPGRpdiBbaG9yaXpvbnRhbF09XCJ0cnVlXCIgZmQtZm9ybS1pdGVtIGNsYXNzPVwiZmQtcm93XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZmQtY29sXCJcbiAgICAgICAgICAgICNsYWJlbENvbFxuICAgICAgICAgICAgW2NsYXNzXT1cIl9sYWJlbENvbHVtbkxheW91dENsYXNzXCJcbiAgICAgICAgICAgICpuZ0lmPVwiIW5vTGFiZWxMYXlvdXRcIlxuICAgICAgICAgICAgW3N0eWxlLm1hcmdpbi1ib3R0b20ucHhdPVwiX2NvbnRyb2xFeHRyYXNIZWlnaHRQeFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsYWJlbFRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ3aXRoRm9ybU1lc3NhZ2VcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdhcFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCIgW2lkXT1cIidmZHAtZm9ybS1oaW50LScgKyBpZFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTdHJpbmdIaW50KGhpbnRPcHRpb25zLmNvbnRlbnQpOyBlbHNlIGhpbnRUZW1wbGF0ZVwiPlxuICAgICAgICAgICAge3sgaGludE9wdGlvbnMuY29udGVudCB9fVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNoaW50VGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShoaW50T3B0aW9ucy5jb250ZW50KVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN3aXRoRm9ybU1lc3NhZ2U+XG4gICAgPGZkcC1pbnB1dC1tZXNzYWdlLWdyb3VwIGNsYXNzPVwiZmQtY29sXCIgW2NsYXNzXT1cIl9maWVsZENvbHVtbkxheW91dENsYXNzXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIl9nZXRMYWJlbGxlZEJ5KClcIj5cbiAgICAgICAgPCEtLVxuICAgICAgICAgVG9kbzogd2Ugc2hvdWxkIGV4dGVuZCB0aGlzIG9uIEZvcm1Hcm91cCBMZXZlbCBhbmQgaGF2ZSBlcnJvciB0cmlnZ2VyIHN0cmF0ZWd5IHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvXG4gICAgICAgICBhbGwgdGhlIGZpZWxkIGUuZy46IFt0cmlnZ2Vyc109XCJbJ21vdXNlZW50ZXInLCAnbW91c2VsZWF2ZSddXCJcbiAgICAgICAgIC0tPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjdHJpZ2dlckl0ZW0+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0Vycm9ycygpICYmIGdyb3VwZWRFcnJvcnMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPGZkLWZvcm0tbWVzc2FnZVxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBlcnJvciBvZiBncm91cGVkRXJyb3JzXCJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCJlcnJvci5kaXJlY3RpdmUudHlwZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ2ZkcC1mb3JtLW1lc3NhZ2UtZ3JvdXBlZC1lcnJvcnMtJyArIGlkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgW25nSWZdPVwiZXJyb3IuZGlyZWN0aXZlLl9oZWFkaW5nVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJlcnJvci5kaXJlY3RpdmUuX2hlYWRpbmdUZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogZXJyb3IuZXJyb3IsIGxhYmVsOiBsYWJlbCB9XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXJyb3IuZGlyZWN0aXZlLl9oZWFkaW5nVGVtcGxhdGVSZWYgJiYgZXJyb3IuZGlyZWN0aXZlLl9kZXNjcmlwdGlvblRlbXBsYXRlUmVmXCI+XG4gICAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBbbmdJZl09XCJlcnJvci5kaXJlY3RpdmUuX2Rlc2NyaXB0aW9uVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJlcnJvci5kaXJlY3RpdmUuX2Rlc2NyaXB0aW9uVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGVycm9yLmVycm9yLCBsYWJlbDogbGFiZWwgfVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2ZkLWZvcm0tbWVzc2FnZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPGZkLWZvcm0tbWVzc2FnZVxuICAgICAgICAgICAgKm5nSWY9XCJncm91cGVkRXJyb3JzLmxlbmd0aCA9PT0gMCAmJiBoYXNFcnJvcnMoKSAmJiBpMThTdHJpbmdzXCJcbiAgICAgICAgICAgIHR5cGU9XCJlcnJvclwiXG4gICAgICAgICAgICBbYXR0ci5pZF09XCInZmRwLWZvcm0tbWVzc2FnZS1lcnJvci0nICsgaWRcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaTE4U3RyaW5nczsgY29udGV4dDogeyAkaW1wbGljaXQ6IGNvbnRyb2w/Lm5nQ29udHJvbD8uZXJyb3JzIH1cIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2ZkLWZvcm0tbWVzc2FnZT5cbiAgICA8L2ZkcC1pbnB1dC1tZXNzYWdlLWdyb3VwPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsYWJlbFRlbXBsYXRlPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoaW50VGFyZ2V0ID09PSAnbGFiZWwnOyBlbHNlIHdpdGhvdXRIaW50XCI+XG4gICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgW2lkXT1cIidmZHAtZm9ybS1sYWJlbC0nICsgaWRcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cImVkaXRhYmxlICYmIHJlcXVpcmVkXCJcbiAgICAgICAgICAgIGZkLWZvcm0tbGFiZWxcbiAgICAgICAgICAgIFtpbmxpbmVIZWxwQ29udGVudF09XCJoaW50T3B0aW9ucy5jb250ZW50XCJcbiAgICAgICAgICAgIFtpbmxpbmVIZWxwQm9keVBsYWNlbWVudF09XCJoaW50T3B0aW9ucy5wbGFjZW1lbnQgfHwgJ3RvcCdcIlxuICAgICAgICAgICAgW2lubGluZUhlbHBQbGFjZW1lbnRdPVwiaGludE9wdGlvbnMucG9zaXRpb24gfHwgJ2FmdGVyJ1wiXG4gICAgICAgICAgICBbaW5saW5lSGVscEdseXBoXT1cImhpbnRPcHRpb25zLmdseXBoIHx8ICcnXCJcbiAgICAgICAgICAgIFtpbmxpbmVIZWxwVHJpZ2dlcnNdPVwiaGludE9wdGlvbnMudHJpZ2dlciB8fCBbXVwiXG4gICAgICAgICAgICBbYWxpZ25MYWJlbEVuZF09XCIhIShpc0hvcml6b250YWwkIHwgYXN5bmMpXCJcbiAgICAgICAgICAgIFtjb2xvbl09XCJjb2xvblwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIFtpZF09XCInZmRwLWZvcm0tbGFiZWwtY29udGVudC0nICsgaWRcIj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3dpdGhvdXRIaW50PlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIFtpZF09XCInZmRwLWZvcm0tbGFiZWwtJyArIGlkXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJlZGl0YWJsZSAmJiByZXF1aXJlZFwiXG4gICAgICAgICAgICBmZC1mb3JtLWxhYmVsXG4gICAgICAgICAgICBbY29sb25dPVwiY29sb25cIlxuICAgICAgICAgICAgW2FsaWduTGFiZWxFbmRdPVwiISEoaXNIb3Jpem9udGFsJCB8IGFzeW5jKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIFtpZF09XCInZmRwLWZvcm0tbGFiZWwtY29udGVudC0nICsgaWRcIj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNnYXBUZW1wbGF0ZT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGludFRhcmdldCA9PT0gJ2lucHV0JyAmJiBoaW50T3B0aW9ucy5jb250ZW50OyBlbHNlIHdpdGhvdXRIaW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmZC1jb2wgZmQtZm9ybS1maWVsZC1pbmxpbmUtaGVscC1jb250YWluZXJcIiBbY2xhc3NdPVwiX2dhcENvbHVtbkxheW91dENsYXNzXCI+XG4gICAgICAgICAgICA8c3BhbiBmZC1saW5rIFt1bmRlY29yYXRlZF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPGZkLWljb25cbiAgICAgICAgICAgICAgICAgICAgW2ZkLWlubGluZS1oZWxwXT1cImhpbnRPcHRpb25zLmNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICBbZ2x5cGhdPVwiaGludE9wdGlvbnMuZ2x5cGhcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2VtZW50XT1cImhpbnRPcHRpb25zLnBsYWNlbWVudCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW3RyaWdnZXJzXT1cImhpbnRPcHRpb25zLnRyaWdnZXIgfHwgW11cIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2ZkLWljb24+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjd2l0aG91dEhpbnQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmZC1jb2xcIiBbY2xhc3NdPVwiX2dhcENvbHVtbkxheW91dENsYXNzXCI+PC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=