@pepperi/lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.1.
316 lines • 45.8 kB
JavaScript
import { Component, Inject } from '@angular/core';
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
import { hex2hsl, hslString2hsl, rgbString2hsl, findClosestAccessibleColor, hsl2hex, convertHslToStringHsl } from './color-utils';
import { PepColorType } from './color.model';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/dialog";
import * as i2 from "@angular/material/button";
import * as i3 from "@angular/material/icon";
import * as i4 from "@pepperi/lib/icon";
import * as i5 from "@angular/common";
import * as i6 from "@angular/material/form-field";
import * as i7 from "@angular/material/slider";
import * as i8 from "@pepperi/lib/textbox";
import * as i9 from "@pepperi/lib/field-title";
import * as i10 from "@angular/material/checkbox";
import * as i11 from "@ngx-translate/core";
function PepperiColorPickerComponent_div_33_mat_icon_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "mat-icon");
i0.ɵɵelement(1, "pep-icon", 27);
i0.ɵɵelementEnd();
} }
const _c0 = function (a0) { return { "background": a0 }; };
function PepperiColorPickerComponent_div_33_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 23);
i0.ɵɵelement(1, "pep-field-title", 24);
i0.ɵɵpipe(2, "translate");
i0.ɵɵelementStart(3, "div", 25);
i0.ɵɵtemplate(4, PepperiColorPickerComponent_div_33_mat_icon_4_Template, 2, 0, "mat-icon", 26);
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("label", i0.ɵɵpipeBind1(2, 3, "PeppriColor_AAComplient"));
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(5, _c0, ctx_r0.complientColor));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.isUserChooseAAComplientColor);
} }
function PepperiColorPickerComponent_mat_checkbox_36_Template(rf, ctx) { if (rf & 1) {
const _r4 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "mat-checkbox", 28);
i0.ɵɵlistener("change", function PepperiColorPickerComponent_mat_checkbox_36_Template_mat_checkbox_change_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r3 = i0.ɵɵnextContext(); return ctx_r3.checkAAComplient = !ctx_r3.checkAAComplient; });
i0.ɵɵelementStart(1, "span", 29);
i0.ɵɵtext(2);
i0.ɵɵpipe(3, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵproperty("checked", ctx_r1.checkAAComplient);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 2, "PeppriColor_AAComplient"));
} }
const _c1 = function (a0, a1, a2) { return { "main": a0, "success": a1, "caution": a2 }; };
const _c2 = function (a0) { return { "with-complient": a0 }; };
export var ContrastRatioType;
(function (ContrastRatioType) {
ContrastRatioType[ContrastRatioType["AA"] = 4.5] = "AA";
ContrastRatioType[ContrastRatioType["AAA"] = 7] = "AAA";
})(ContrastRatioType || (ContrastRatioType = {}));
export class PepperiColorPickerComponent {
constructor(dialogRef, data) {
this.dialogRef = dialogRef;
this.data = data;
this.PepColorType = PepColorType;
this.checkAAComplient = true;
this.currentHue = 100;
this.currentHueMin = 0;
this.currentHueMax = 360;
this.currentSaturation = 50;
this.currentSaturationMin = 0;
this.currentSaturationMax = 100;
this.currentLightness = 50;
this.currentLightnessMin = 0;
this.currentLightnessMax = 100;
this.data.type = data ? data.type : PepColorType.AnyColor;
this.data.showAAComplient = data && data.showAAComplient === undefined ? true : (data ? data.showAAComplient : false);
this.data.textColor = data && data.textColor ? data.textColor : '#fff';
this.data.contrastRatio = data && data.contrastRatio ? data.contrastRatio : ContrastRatioType.AA;
}
ngOnInit() {
this.initVars();
this.checkAAComplient = this.data.showAAComplient;
this.convertValueStringToColor(this.data.value);
}
initVars() {
if (this.data.type === PepColorType.MainColor) {
this.currentLightnessMax = 10;
this.currentLightness = 5;
}
else if (this.data.type === PepColorType.SuccessColor) {
this.currentHueMin = 70;
this.currentHueMax = 150;
this.currentHue = 100;
this.currentSaturationMin = 50;
this.currentSaturationMax = 100;
this.currentSaturation = 50;
this.currentLightnessMin = 10;
this.currentLightnessMax = 65;
this.currentLightness = 50;
}
else if (this.data.type === PepColorType.CautionColor) {
this.currentHueMin = -20;
this.currentHueMax = 20;
this.currentHue = 10;
this.currentSaturationMin = 75;
this.currentSaturationMax = 100;
this.currentSaturation = 75;
this.currentLightnessMin = 25;
this.currentLightnessMax = 75;
this.currentLightness = 50;
}
}
setCurrentHueInCss() {
document.documentElement.style.setProperty(PepperiColorPickerComponent.CURRENT_HUE, this.currentHue.toString());
}
convertValueStringToColor(color) {
if (color.indexOf('hsl') === 0) {
const hsl = hslString2hsl(color);
this.convertColorToValueString(hsl);
}
else if (color.indexOf('rgb') === 0) {
const hsl = rgbString2hsl(color);
this.convertColorToValueString(hsl);
}
else if (color.indexOf('#') === 0) {
const hsl = hex2hsl(color);
this.convertColorToValueString(hsl);
}
else {
// Handle other colors.
}
this.setCurrentHueInCss();
}
convertColorToValueString(hslColor) {
// Regular hue
if (hslColor.h >= this.currentHueMin && hslColor.h <= this.currentHueMax) {
this.currentHue = hslColor.h;
}
else if (this.currentHueMin < 0 && hslColor.h >= 0 && hslColor.h <= 360) {
// For min with - (change to the other side of the circle)
hslColor.h = hslColor.h - 360;
if (hslColor.h >= this.currentHueMin && hslColor.h <= this.currentHueMax) {
this.currentHue = hslColor.h;
}
}
this.currentSaturation =
(hslColor.s >= this.currentSaturationMin &&
hslColor.s <= this.currentSaturationMax) ?
hslColor.s : this.currentSaturation;
this.currentLightness =
(hslColor.l >= this.currentLightnessMin &&
hslColor.l <= this.currentLightnessMax) ?
hslColor.l : this.currentLightness;
// Write the value (if hue is changed to the other side of the circle return it back).
const hsl = { h: this.currentHue, s: this.currentSaturation, l: this.currentLightness };
this.data.value = convertHslToStringHsl(hsl);
// Check the contrast ratio - set the closest accessible color to complientColor
// and update isUserChooseAAComplientColor.
const adjustableColor = hsl2hex(hsl);
const closestHex = findClosestAccessibleColor(adjustableColor, this.data.textColor, this.data.contrastRatio);
this.isUserChooseAAComplientColor = adjustableColor === closestHex;
this.complientColor = convertHslToStringHsl(hex2hsl(closestHex));
}
onHueChange(event) {
this.convertColorToValueString({ h: event.value });
this.setCurrentHueInCss();
}
onSaturationChange(event) {
// this.currentSaturation = event.value;
this.convertColorToValueString({ s: event.value });
}
onLightnessChange(event) {
// this.currentLightness = event.value;
this.convertColorToValueString({ l: this.currentLightnessMax - event.value + this.currentLightnessMin });
}
onColorValueChange(event) {
this.convertValueStringToColor(event.value);
}
onSave(event) {
const color = this.checkAAComplient ? this.complientColor : this.data.value;
// this.notify.emit({ key: this.key, value: color });
this.dialogRef.close(color);
}
}
PepperiColorPickerComponent.CURRENT_HUE = '--pep-color-picker-current-hue';
PepperiColorPickerComponent.ɵfac = function PepperiColorPickerComponent_Factory(t) { return new (t || PepperiColorPickerComponent)(i0.ɵɵdirectiveInject(i1.MatDialogRef), i0.ɵɵdirectiveInject(MAT_DIALOG_DATA)); };
PepperiColorPickerComponent.ɵcmp = i0.ɵɵdefineComponent({ type: PepperiColorPickerComponent, selectors: [["ng-component"]], decls: 44, vars: 58, consts: [[1, "pepperi-color-picker-container"], ["mat-dialog-title", "", 1, "pepperi-border-bottom"], [1, "pull-left", "flip"], ["mat-button", "", 1, "pepperi-button", "icon-button", "md", "weak", "pull-right", "flip", 3, "mat-dialog-close"], ["name", "system_close"], ["mat-dialog-content", ""], [1, "color-chooser-content"], [1, "current-color", 3, "ngStyle"], [1, "slider-box"], [1, "body-xs"], [1, "current-hue", 3, "ngClass"], ["step", "1", 3, "min", "max", "value", "change"], [1, "current-saturation", 3, "ngClass"], [1, "current-lightness", 3, "ngClass"], [1, "color-value-content"], [1, "color-value", 3, "ngClass"], [3, "key", "label", "formattedValue", "value", "valueChanged"], ["class", "color-complient-container", 4, "ngIf"], ["mat-dialog-actions", "", 1, "pepperi-border-top", "split-actions"], ["type", "checkbox", "id", "checkAAComplient", 3, "checked", "change", 4, "ngIf"], [1, "spacing-element-negative"], ["mat-button", "", 1, "spacing-element", "pepperi-button", "cancel-btn", "md", "weak", 3, "mat-dialog-close"], ["mat-button", "", 1, "spacing-element", "pepperi-button", "save-btn", "md", "strong", 3, "click"], [1, "color-complient-container"], [3, "label"], [1, "color-complient", 3, "ngStyle"], [4, "ngIf"], ["name", "system_ok"], ["type", "checkbox", "id", "checkAAComplient", 3, "checked", "change"], [1, "body-xs", "ellipsis"]], template: function PepperiColorPickerComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 0);
i0.ɵɵelementStart(1, "h2", 1);
i0.ɵɵelementStart(2, "span", 2);
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "button", 3);
i0.ɵɵelementStart(6, "mat-icon");
i0.ɵɵelement(7, "pep-icon", 4);
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementStart(8, "div", 5);
i0.ɵɵelementStart(9, "div", 6);
i0.ɵɵelement(10, "div", 7);
i0.ɵɵelementStart(11, "div", 8);
i0.ɵɵelementStart(12, "mat-label", 9);
i0.ɵɵtext(13);
i0.ɵɵpipe(14, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(15, "div", 10);
i0.ɵɵelementStart(16, "mat-slider", 11);
i0.ɵɵlistener("change", function PepperiColorPickerComponent_Template_mat_slider_change_16_listener($event) { return ctx.onHueChange($event); });
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementStart(17, "div", 8);
i0.ɵɵelementStart(18, "mat-label", 9);
i0.ɵɵtext(19);
i0.ɵɵpipe(20, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(21, "div", 12);
i0.ɵɵelementStart(22, "mat-slider", 11);
i0.ɵɵlistener("change", function PepperiColorPickerComponent_Template_mat_slider_change_22_listener($event) { return ctx.onSaturationChange($event); });
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementStart(23, "div", 8);
i0.ɵɵelementStart(24, "mat-label", 9);
i0.ɵɵtext(25);
i0.ɵɵpipe(26, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(27, "div", 13);
i0.ɵɵelementStart(28, "mat-slider", 11);
i0.ɵɵlistener("change", function PepperiColorPickerComponent_Template_mat_slider_change_28_listener($event) { return ctx.onLightnessChange($event); });
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementStart(29, "div", 14);
i0.ɵɵelementStart(30, "div", 15);
i0.ɵɵelementStart(31, "pep-textbox", 16);
i0.ɵɵlistener("valueChanged", function PepperiColorPickerComponent_Template_pep_textbox_valueChanged_31_listener($event) { return ctx.onColorValueChange($event); });
i0.ɵɵpipe(32, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵtemplate(33, PepperiColorPickerComponent_div_33_Template, 5, 7, "div", 17);
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementStart(34, "div", 18);
i0.ɵɵelementStart(35, "div");
i0.ɵɵtemplate(36, PepperiColorPickerComponent_mat_checkbox_36_Template, 4, 4, "mat-checkbox", 19);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(37, "div", 20);
i0.ɵɵelementStart(38, "button", 21);
i0.ɵɵtext(39);
i0.ɵɵpipe(40, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(41, "button", 22);
i0.ɵɵlistener("click", function PepperiColorPickerComponent_Template_button_click_41_listener($event) { return ctx.onSave($event); });
i0.ɵɵtext(42);
i0.ɵɵpipe(43, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 28, "PepperiColorPicker_Title"));
i0.ɵɵadvance(2);
i0.ɵɵproperty("mat-dialog-close", null);
i0.ɵɵadvance(5);
i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(42, _c0, (ctx.data == null ? null : ctx.data.value) ? ctx.data.value : "transparent"));
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 30, "PepperiColorPicker_ChangeHue"));
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction3(44, _c1, (ctx.data == null ? null : ctx.data.type) === ctx.PepColorType.MainColor, (ctx.data == null ? null : ctx.data.type) === ctx.PepColorType.SuccessColor, (ctx.data == null ? null : ctx.data.type) === ctx.PepColorType.CautionColor));
i0.ɵɵadvance(1);
i0.ɵɵproperty("min", ctx.currentHueMin)("max", ctx.currentHueMax)("value", ctx.currentHue);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(20, 32, "PepperiColorPicker_ChangeSaturation"));
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction3(48, _c1, (ctx.data == null ? null : ctx.data.type) === ctx.PepColorType.MainColor, (ctx.data == null ? null : ctx.data.type) === ctx.PepColorType.SuccessColor, (ctx.data == null ? null : ctx.data.type) === ctx.PepColorType.CautionColor));
i0.ɵɵadvance(1);
i0.ɵɵproperty("min", ctx.currentSaturationMin)("max", ctx.currentSaturationMax)("value", ctx.currentSaturation);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(26, 34, "PepperiColorPicker_ChangeLightness"));
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction3(52, _c1, (ctx.data == null ? null : ctx.data.type) === ctx.PepColorType.MainColor, (ctx.data == null ? null : ctx.data.type) === ctx.PepColorType.SuccessColor, (ctx.data == null ? null : ctx.data.type) === ctx.PepColorType.CautionColor));
i0.ɵɵadvance(1);
i0.ɵɵproperty("min", ctx.currentLightnessMin)("max", ctx.currentLightnessMax)("value", ctx.currentLightnessMax - ctx.currentLightness + ctx.currentLightnessMin);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(56, _c2, ctx.checkAAComplient));
i0.ɵɵadvance(1);
i0.ɵɵproperty("key", "colorValue")("label", i0.ɵɵpipeBind1(32, 36, "PepperiColorPicker_AddValueHere"))("formattedValue", ctx.data == null ? null : ctx.data.value)("value", ctx.data == null ? null : ctx.data.value);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx.checkAAComplient);
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngIf", ctx.data.showAAComplient);
i0.ɵɵadvance(2);
i0.ɵɵproperty("mat-dialog-close", null);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(40, 38, "Cancel"), " ");
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(43, 40, "Ok"), " ");
} }, directives: [i1.MatDialogTitle, i2.MatButton, i1.MatDialogClose, i3.MatIcon, i4.PepperiIconComponent, i1.MatDialogContent, i5.NgStyle, i6.MatLabel, i5.NgClass, i7.MatSlider, i8.PepperiTextboxComponent, i5.NgIf, i1.MatDialogActions, i9.PepperiFieldTitleComponent, i10.MatCheckbox], pipes: [i11.TranslatePipe], styles: [".mat-slider-horizontal[_ngcontent-%COMP%] .mat-slider-track-fill[_ngcontent-%COMP%], .mat-slider-track-background[_ngcontent-%COMP%]{display:none}.pepperi-color-picker-container[_ngcontent-%COMP%] .mat-dialog-title[_ngcontent-%COMP%]{margin-bottom:0}.pepperi-color-picker-container[_ngcontent-%COMP%] .mat-dialog-content[_ngcontent-%COMP%]{padding-bottom:var(--pep-spacing-sm,.5rem);padding-left:var(--pep-spacing-sm,.5rem);padding-right:var(--pep-spacing-sm,.5rem)}.pepperi-color-picker-container[_ngcontent-%COMP%] .color-chooser-content[_ngcontent-%COMP%]{-ms-grid-columns:(1fr)[8];-ms-grid-rows:(1fr)[3];display:-ms-grid;display:grid;grid-column-gap:var(--pep-spacing-xl,1.5rem);grid-row-gap:var(--pep-spacing-sm,.5rem);grid-template-columns:repeat(8,1fr);grid-template-rows:repeat(3,1fr);margin-top:var(--pep-spacing-sm,.5rem)}.pepperi-color-picker-container[_ngcontent-%COMP%] .color-chooser-content[_ngcontent-%COMP%] .current-color[_ngcontent-%COMP%]{-ms-grid-column:6;-ms-grid-column-span:4;-ms-grid-row:1;-ms-grid-row-span:3;border-radius:var(--pep-border-radius-md,.25rem);grid-column:6/span 4;grid-row:1/span 3;height:9.25rem;width:9.25rem}.pepperi-color-picker-container[_ngcontent-%COMP%] .color-chooser-content[_ngcontent-%COMP%] .slider-box[_ngcontent-%COMP%]{-ms-grid-column:1;-ms-grid-column-span:5;grid-column:1/span 5}.pepperi-color-picker-container[_ngcontent-%COMP%] .color-value-content[_ngcontent-%COMP%]{-ms-grid-columns:(1fr)[8];-ms-grid-rows:(1fr)[1];display:-ms-grid;display:grid;grid-column-gap:var(--pep-spacing-xl,1.5rem);grid-row-gap:var(--pep-spacing-sm,.5rem);grid-template-columns:repeat(8,1fr);grid-template-rows:repeat(1,1fr);margin-top:1.5rem}.pepperi-color-picker-container[_ngcontent-%COMP%] .color-value-content[_ngcontent-%COMP%] .color-value[_ngcontent-%COMP%]{-ms-grid-column:1;-ms-grid-column-span:9;-ms-grid-row:1;-ms-grid-row-span:1;grid-column:1/span 9;grid-row:1/span 1}.pepperi-color-picker-container[_ngcontent-%COMP%] .color-value-content[_ngcontent-%COMP%] .color-value.with-complient[_ngcontent-%COMP%]{-ms-grid-column:1;-ms-grid-column-span:5;grid-column:1/span 5}.pepperi-color-picker-container[_ngcontent-%COMP%] .color-value-content[_ngcontent-%COMP%] .color-complient-container[_ngcontent-%COMP%]{-ms-grid-column:6;-ms-grid-column-span:4;grid-column:6/span 4}.pepperi-color-picker-container[_ngcontent-%COMP%] .color-value-content[_ngcontent-%COMP%] .color-complient-container[_ngcontent-%COMP%] .color-complient[_ngcontent-%COMP%]{align-items:center;border-radius:var(--pep-border-radius-md,.25rem);display:flex;height:var(--pep-form-field-height,2.5rem);justify-content:center;width:9.25rem}"] });
/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(PepperiColorPickerComponent, [{
type: Component,
args: [{
templateUrl: './color-picker.component.html',
styleUrls: ['./color-picker.component.scss']
}]
}], function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
type: Inject,
args: [MAT_DIALOG_DATA]
}] }]; }, null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3BlcHBlcmktbGliL2NvbG9yL2NvbG9yLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wZXBwZXJpLWxpYi9jb2xvci9jb2xvci1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFnQixlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQVksMEJBQTBCLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7O0lDdUR6QixnQ0FDSTtJQUFBLCtCQUNXO0lBQ2YsaUJBQVc7Ozs7SUFQbkIsK0JBQ0k7SUFBQSxzQ0FDa0I7O0lBQ2xCLCtCQUNJO0lBQUEsOEZBQ0k7SUFHUixpQkFBTTtJQUNWLGlCQUFNOzs7SUFSZSxlQUFnRDtJQUFoRCx1RUFBZ0Q7SUFFcEMsZUFBNEM7SUFBNUMsMkVBQTRDO0lBQzNELGVBQW9DO0lBQXBDLDBEQUFvQzs7OztJQVV0RCx3Q0FFSTtJQURBLGdQQUErQztJQUMvQyxnQ0FBK0I7SUFBQSxZQUEyQzs7SUFBQSxpQkFBTztJQUNyRixpQkFBZTs7O0lBRnFDLGlEQUE0QjtJQUM3QyxlQUEyQztJQUEzQyxxRUFBMkM7Ozs7QURqRTFGLE1BQU0sQ0FBTixJQUFZLGlCQUdYO0FBSEQsV0FBWSxpQkFBaUI7SUFDekIsdURBQVEsQ0FBQTtJQUNSLHVEQUFPLENBQUE7QUFDWCxDQUFDLEVBSFcsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUc1QjtB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QTJCO2NBSnZDLFNBQVM7ZUFBQztnQkFDUCxXQUFXLEVBQUUsK0JBQStCO2dCQUM1QyxTQUFTLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQzthQUMvQzs7c0JBVVEsTUFBTTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IGhleDJoc2wsIGhzbFN0cmluZzJoc2wsIHJnYlN0cmluZzJoc2wsIEhzbENvbG9yLCBmaW5kQ2xvc2VzdEFjY2Vzc2libGVDb2xvciwgaHNsMmhleCwgY29udmVydEhzbFRvU3RyaW5nSHNsIH0gZnJvbSAnLi9jb2xvci11dGlscyc7XHJcbmltcG9ydCB7IFBlcENvbG9yVHlwZSB9IGZyb20gJy4vY29sb3IubW9kZWwnO1xyXG5cclxuZXhwb3J0IGVudW0gQ29udHJhc3RSYXRpb1R5cGUge1xyXG4gICAgQUEgPSA0LjUsXHJcbiAgICBBQUEgPSA3XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29sb3JQaWNrZXJEaWFsb2dEYXRhIHtcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgICB0eXBlOiBQZXBDb2xvclR5cGU7XHJcbiAgICBzaG93QUFDb21wbGllbnQ6IGJvb2xlYW47XHJcbiAgICB0ZXh0Q29sb3I6IHN0cmluZztcclxuICAgIGNvbnRyYXN0UmF0aW86IENvbnRyYXN0UmF0aW9UeXBlO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb2xvci1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY29sb3ItcGlja2VyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFBlcHBlcmlDb2xvclBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgc3RhdGljIENVUlJFTlRfSFVFID0gJy0tcGVwLWNvbG9yLXBpY2tlci1jdXJyZW50LWh1ZSc7XHJcblxyXG4gICAgUGVwQ29sb3JUeXBlID0gUGVwQ29sb3JUeXBlO1xyXG4gICAgY2hlY2tBQUNvbXBsaWVudCA9IHRydWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxQZXBwZXJpQ29sb3JQaWNrZXJDb21wb25lbnQ+LFxyXG4gICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogQ29sb3JQaWNrZXJEaWFsb2dEYXRhXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLmRhdGEudHlwZSA9IGRhdGEgPyBkYXRhLnR5cGUgOiBQZXBDb2xvclR5cGUuQW55Q29sb3I7XHJcbiAgICAgICAgdGhpcy5kYXRhLnNob3dBQUNvbXBsaWVudCA9IGRhdGEgJiYgZGF0YS5zaG93QUFDb21wbGllbnQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiAoZGF0YSA/IGRhdGEuc2hvd0FBQ29tcGxpZW50IDogZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZGF0YS50ZXh0Q29sb3IgPSBkYXRhICYmIGRhdGEudGV4dENvbG9yID8gZGF0YS50ZXh0Q29sb3IgOiAnI2ZmZic7XHJcbiAgICAgICAgdGhpcy5kYXRhLmNvbnRyYXN0UmF0aW8gPSBkYXRhICYmIGRhdGEuY29udHJhc3RSYXRpbyA/IGRhdGEuY29udHJhc3RSYXRpbyA6IENvbnRyYXN0UmF0aW9UeXBlLkFBO1xyXG4gICAgfVxyXG5cclxuICAgIGN1cnJlbnRIdWUgPSAxMDA7XHJcbiAgICBjdXJyZW50SHVlTWluID0gMDtcclxuICAgIGN1cnJlbnRIdWVNYXggPSAzNjA7XHJcblxyXG4gICAgY3VycmVudFNhdHVyYXRpb24gPSA1MDtcclxuICAgIGN1cnJlbnRTYXR1cmF0aW9uTWluID0gMDtcclxuICAgIGN1cnJlbnRTYXR1cmF0aW9uTWF4ID0gMTAwO1xyXG5cclxuICAgIGN1cnJlbnRMaWdodG5lc3MgPSA1MDtcclxuICAgIGN1cnJlbnRMaWdodG5lc3NNaW4gPSAwO1xyXG4gICAgY3VycmVudExpZ2h0bmVzc01heCA9IDEwMDtcclxuXHJcbiAgICBjb21wbGllbnRDb2xvcjogc3RyaW5nO1xyXG4gICAgaXNVc2VyQ2hvb3NlQUFDb21wbGllbnRDb2xvcjogYm9vbGVhbjtcclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmluaXRWYXJzKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja0FBQ29tcGxpZW50ID0gdGhpcy5kYXRhLnNob3dBQUNvbXBsaWVudDtcclxuICAgICAgICB0aGlzLmNvbnZlcnRWYWx1ZVN0cmluZ1RvQ29sb3IodGhpcy5kYXRhLnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0VmFycygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5kYXRhLnR5cGUgPT09IFBlcENvbG9yVHlwZS5NYWluQ29sb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGlnaHRuZXNzTWF4ID0gMTA7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExpZ2h0bmVzcyA9IDU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEudHlwZSA9PT0gUGVwQ29sb3JUeXBlLlN1Y2Nlc3NDb2xvcikge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIdWVNaW4gPSA3MDtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SHVlTWF4ID0gMTUwO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIdWUgPSAxMDA7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTYXR1cmF0aW9uTWluID0gNTA7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNhdHVyYXRpb25NYXggPSAxMDA7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNhdHVyYXRpb24gPSA1MDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExpZ2h0bmVzc01pbiA9IDEwO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMaWdodG5lc3NNYXggPSA2NTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGlnaHRuZXNzID0gNTA7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEudHlwZSA9PT0gUGVwQ29sb3JUeXBlLkNhdXRpb25Db2xvcikge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIdWVNaW4gPSAtMjA7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEh1ZU1heCA9IDIwO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIdWUgPSAxMDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNhdHVyYXRpb25NaW4gPSA3NTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2F0dXJhdGlvbk1heCA9IDEwMDtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2F0dXJhdGlvbiA9IDc1O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGlnaHRuZXNzTWluID0gMjU7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExpZ2h0bmVzc01heCA9IDc1O1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMaWdodG5lc3MgPSA1MDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q3VycmVudEh1ZUluQ3NzKCk6IHZvaWQge1xyXG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShQZXBwZXJpQ29sb3JQaWNrZXJDb21wb25lbnQuQ1VSUkVOVF9IVUUsIHRoaXMuY3VycmVudEh1ZS50b1N0cmluZygpKTtcclxuICAgIH1cclxuXHJcbiAgICBjb252ZXJ0VmFsdWVTdHJpbmdUb0NvbG9yKGNvbG9yKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGNvbG9yLmluZGV4T2YoJ2hzbCcpID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhzbCA9IGhzbFN0cmluZzJoc2woY29sb3IpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnZlcnRDb2xvclRvVmFsdWVTdHJpbmcoaHNsKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbG9yLmluZGV4T2YoJ3JnYicpID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhzbCA9IHJnYlN0cmluZzJoc2woY29sb3IpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnZlcnRDb2xvclRvVmFsdWVTdHJpbmcoaHNsKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbG9yLmluZGV4T2YoJyMnKSA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBoc2wgPSBoZXgyaHNsKGNvbG9yKTtcclxuICAgICAgICAgICAgdGhpcy5jb252ZXJ0Q29sb3JUb1ZhbHVlU3RyaW5nKGhzbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSGFuZGxlIG90aGVyIGNvbG9ycy5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0Q3VycmVudEh1ZUluQ3NzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29udmVydENvbG9yVG9WYWx1ZVN0cmluZyhoc2xDb2xvcjogSHNsQ29sb3IpOiB2b2lkIHtcclxuICAgICAgICAvLyBSZWd1bGFyIGh1ZVxyXG4gICAgICAgIGlmIChoc2xDb2xvci5oID49IHRoaXMuY3VycmVudEh1ZU1pbiAmJiBoc2xDb2xvci5oIDw9IHRoaXMuY3VycmVudEh1ZU1heCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIdWUgPSBoc2xDb2xvci5oO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50SHVlTWluIDwgMCAmJiBoc2xDb2xvci5oID49IDAgJiYgaHNsQ29sb3IuaCA8PSAzNjApIHtcclxuICAgICAgICAgICAgLy8gRm9yIG1pbiB3aXRoIC0gKGNoYW5nZSB0byB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgY2lyY2xlKVxyXG4gICAgICAgICAgICBoc2xDb2xvci5oID0gaHNsQ29sb3IuaCAtIDM2MDtcclxuXHJcbiAgICAgICAgICAgIGlmIChoc2xDb2xvci5oID49IHRoaXMuY3VycmVudEh1ZU1pbiAmJiBoc2xDb2xvci5oIDw9IHRoaXMuY3VycmVudEh1ZU1heCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SHVlID0gaHNsQ29sb3IuaDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50U2F0dXJhdGlvbiA9XHJcbiAgICAgICAgICAgIChoc2xDb2xvci5zID49IHRoaXMuY3VycmVudFNhdHVyYXRpb25NaW4gJiZcclxuICAgICAgICAgICAgIGhzbENvbG9yLnMgPD0gdGhpcy5jdXJyZW50U2F0dXJhdGlvbk1heCkgP1xyXG4gICAgICAgICAgICAgICAgaHNsQ29sb3IucyA6IHRoaXMuY3VycmVudFNhdHVyYXRpb247XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudExpZ2h0bmVzcyA9XHJcbiAgICAgICAgICAgIChoc2xDb2xvci5sID49IHRoaXMuY3VycmVudExpZ2h0bmVzc01pbiAmJlxyXG4gICAgICAgICAgICAgaHNsQ29sb3IubCA8PSB0aGlzLmN1cnJlbnRMaWdodG5lc3NNYXgpID9cclxuICAgICAgICAgICAgICAgIGhzbENvbG9yLmwgOiB0aGlzLmN1cnJlbnRMaWdodG5lc3M7XHJcblxyXG4gICAgICAgIC8vIFdyaXRlIHRoZSB2YWx1ZSAoaWYgaHVlIGlzIGNoYW5nZWQgdG8gdGhlIG90aGVyIHNpZGUgb2YgdGhlIGNpcmNsZSByZXR1cm4gaXQgYmFjaykuXHJcbiAgICAgICAgY29uc3QgaHNsID0geyBoOiB0aGlzLmN1cnJlbnRIdWUsIHM6IHRoaXMuY3VycmVudFNhdHVyYXRpb24sIGw6IHRoaXMuY3VycmVudExpZ2h0bmVzcyB9O1xyXG4gICAgICAgIHRoaXMuZGF0YS52YWx1ZSA9IGNvbnZlcnRIc2xUb1N0cmluZ0hzbChoc2wpO1xyXG5cclxuICAgICAgICAvLyBDaGVjayB0aGUgY29udHJhc3QgcmF0aW8gLSBzZXQgdGhlIGNsb3Nlc3QgYWNjZXNzaWJsZSBjb2xvciB0byBjb21wbGllbnRDb2xvclxyXG4gICAgICAgIC8vIGFuZCB1cGRhdGUgaXNVc2VyQ2hvb3NlQUFDb21wbGllbnRDb2xvci5cclxuICAgICAgICBjb25zdCBhZGp1c3RhYmxlQ29sb3IgPSBoc2wyaGV4KGhzbCk7XHJcbiAgICAgICAgY29uc3QgY2xvc2VzdEhleCA9IGZpbmRDbG9zZXN0QWNjZXNzaWJsZUNvbG9yKGFkanVzdGFibGVDb2xvciwgdGhpcy5kYXRhLnRleHRDb2xvciwgdGhpcy5kYXRhLmNvbnRyYXN0UmF0aW8pO1xyXG5cclxuICAgICAgICB0aGlzLmlzVXNlckNob29zZUFBQ29tcGxpZW50Q29sb3IgPSBhZGp1c3RhYmxlQ29sb3IgPT09IGNsb3Nlc3RIZXg7XHJcbiAgICAgICAgdGhpcy5jb21wbGllbnRDb2xvciA9IGNvbnZlcnRIc2xUb1N0cmluZ0hzbChoZXgyaHNsKGNsb3Nlc3RIZXgpKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkh1ZUNoYW5nZShldmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udmVydENvbG9yVG9WYWx1ZVN0cmluZyh7IGg6IGV2ZW50LnZhbHVlIH0pO1xyXG4gICAgICAgIHRoaXMuc2V0Q3VycmVudEh1ZUluQ3NzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25TYXR1cmF0aW9uQ2hhbmdlKGV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50U2F0dXJhdGlvbiA9IGV2ZW50LnZhbHVlO1xyXG4gICAgICAgIHRoaXMuY29udmVydENvbG9yVG9WYWx1ZVN0cmluZyh7IHM6IGV2ZW50LnZhbHVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTGlnaHRuZXNzQ2hhbmdlKGV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50TGlnaHRuZXNzID0gZXZlbnQudmFsdWU7XHJcbiAgICAgICAgdGhpcy5jb252ZXJ0Q29sb3JUb1ZhbHVlU3RyaW5nKHsgbDogdGhpcy5jdXJyZW50TGlnaHRuZXNzTWF4IC0gZXZlbnQudmFsdWUgKyB0aGlzLmN1cnJlbnRMaWdodG5lc3NNaW4gfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Db2xvclZhbHVlQ2hhbmdlKGV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb252ZXJ0VmFsdWVTdHJpbmdUb0NvbG9yKGV2ZW50LnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBvblNhdmUoZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjb2xvciA9IHRoaXMuY2hlY2tBQUNvbXBsaWVudCA/IHRoaXMuY29tcGxpZW50Q29sb3IgOiB0aGlzLmRhdGEudmFsdWU7XHJcblxyXG4gICAgICAgIC8vIHRoaXMubm90aWZ5LmVtaXQoeyBrZXk6IHRoaXMua2V5LCB2YWx1ZTogY29sb3IgfSk7XHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoY29sb3IpO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicGVwcGVyaS1jb2xvci1waWNrZXItY29udGFpbmVyXCI+XHJcblxyXG4gICAgPGgyIG1hdC1kaWFsb2ctdGl0bGUgY2xhc3M9XCJwZXBwZXJpLWJvcmRlci1ib3R0b21cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInB1bGwtbGVmdCBmbGlwXCI+e3sgJ1BlcHBlcmlDb2xvclBpY2tlcl9UaXRsZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXQtZGlhbG9nLWNsb3NlXT1cIm51bGxcIiBjbGFzcz1cInBlcHBlcmktYnV0dG9uIGljb24tYnV0dG9uIG1kIHdlYWsgcHVsbC1yaWdodCBmbGlwXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDxwZXAtaWNvbiBuYW1lPVwic3lzdGVtX2Nsb3NlXCI+XHJcbiAgICAgICAgICAgICAgICA8L3BlcC1pY29uPlxyXG4gICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9oMj5cclxuXHJcbiAgICA8ZGl2IG1hdC1kaWFsb2ctY29udGVudD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sb3ItY2hvb3Nlci1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJyZW50LWNvbG9yXCIgW25nU3R5bGVdPVwieyAnYmFja2dyb3VuZCc6IGRhdGE/LnZhbHVlID8gZGF0YS52YWx1ZSA6ICd0cmFuc3BhcmVudCcgfVwiPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1ib3hcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJib2R5LXhzIFwiPnt7ICdQZXBwZXJpQ29sb3JQaWNrZXJfQ2hhbmdlSHVlJyB8IHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VycmVudC1odWVcIiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgJ21haW4nOiBkYXRhPy50eXBlID09PSBQZXBDb2xvclR5cGUuTWFpbkNvbG9yLFxyXG4gICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJzogZGF0YT8udHlwZSA9PT0gUGVwQ29sb3JUeXBlLlN1Y2Nlc3NDb2xvcixcclxuICAgICAgICAgICAgICAgICAgICAnY2F1dGlvbic6IGRhdGE/LnR5cGUgPT09IFBlcENvbG9yVHlwZS5DYXV0aW9uQ29sb3IgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGVyIFttaW5dPVwiY3VycmVudEh1ZU1pblwiIFttYXhdPVwiY3VycmVudEh1ZU1heFwiIHN0ZXA9XCIxXCIgW3ZhbHVlXT1cImN1cnJlbnRIdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uSHVlQ2hhbmdlKCRldmVudClcIj48L21hdC1zbGlkZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiYm9keS14cyBcIj57eyAnUGVwcGVyaUNvbG9yUGlja2VyX0NoYW5nZVNhdHVyYXRpb24nIHwgdHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJyZW50LXNhdHVyYXRpb25cIiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgJ21haW4nOiBkYXRhPy50eXBlID09PSBQZXBDb2xvclR5cGUuTWFpbkNvbG9yLFxyXG4gICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJzogZGF0YT8udHlwZSA9PT0gUGVwQ29sb3JUeXBlLlN1Y2Nlc3NDb2xvcixcclxuICAgICAgICAgICAgICAgICAgICAnY2F1dGlvbic6IGRhdGE/LnR5cGUgPT09IFBlcENvbG9yVHlwZS5DYXV0aW9uQ29sb3IgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGVyIFttaW5dPVwiY3VycmVudFNhdHVyYXRpb25NaW5cIiBbbWF4XT1cImN1cnJlbnRTYXR1cmF0aW9uTWF4XCIgc3RlcD1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFNhdHVyYXRpb25cIiAoY2hhbmdlKT1cIm9uU2F0dXJhdGlvbkNoYW5nZSgkZXZlbnQpXCI+PC9tYXQtc2xpZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWJveFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImJvZHkteHMgXCI+e3sgJ1BlcHBlcmlDb2xvclBpY2tlcl9DaGFuZ2VMaWdodG5lc3MnIHwgdHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJyZW50LWxpZ2h0bmVzc1wiIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAnbWFpbic6IGRhdGE/LnR5cGUgPT09IFBlcENvbG9yVHlwZS5NYWluQ29sb3IsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3N1Y2Nlc3MnOiBkYXRhPy50eXBlID09PSBQZXBDb2xvclR5cGUuU3VjY2Vzc0NvbG9yLFxyXG4gICAgICAgICAgICAgICAgICAgICdjYXV0aW9uJzogZGF0YT8udHlwZSA9PT0gUGVwQ29sb3JUeXBlLkNhdXRpb25Db2xvciB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZXIgW21pbl09XCJjdXJyZW50TGlnaHRuZXNzTWluXCIgW21heF09XCJjdXJyZW50TGlnaHRuZXNzTWF4XCIgc3RlcD1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudExpZ2h0bmVzc01heCAtIGN1cnJlbnRMaWdodG5lc3MgKyBjdXJyZW50TGlnaHRuZXNzTWluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkxpZ2h0bmVzc0NoYW5nZSgkZXZlbnQpXCI+PC9tYXQtc2xpZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci12YWx1ZS1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci12YWx1ZVwiIFtuZ0NsYXNzXT1cInsgJ3dpdGgtY29tcGxpZW50JzogY2hlY2tBQUNvbXBsaWVudCB9XCI+XHJcbiAgICAgICAgICAgICAgICA8cGVwLXRleHRib3ggW2tleV09XCInY29sb3JWYWx1ZSdcIiBbbGFiZWxdPVwiJ1BlcHBlcmlDb2xvclBpY2tlcl9BZGRWYWx1ZUhlcmUnIHwgdHJhbnNsYXRlIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdHRlZFZhbHVlXT1cImRhdGE/LnZhbHVlXCIgW3ZhbHVlXT1cImRhdGE/LnZhbHVlXCIgKHZhbHVlQ2hhbmdlZCk9XCJvbkNvbG9yVmFsdWVDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPC9wZXAtdGV4dGJveD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGVja0FBQ29tcGxpZW50XCIgY2xhc3M9XCJjb2xvci1jb21wbGllbnQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8cGVwLWZpZWxkLXRpdGxlIFtsYWJlbF09XCInUGVwcHJpQ29sb3JfQUFDb21wbGllbnQnIHwgdHJhbnNsYXRlIFwiPlxyXG4gICAgICAgICAgICAgICAgPC9wZXAtZmllbGQtdGl0bGU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sb3ItY29tcGxpZW50XCIgW25nU3R5bGVdPVwieyAnYmFja2dyb3VuZCc6IGNvbXBsaWVudENvbG9yIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJpc1VzZXJDaG9vc2VBQUNvbXBsaWVudENvbG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwZXAtaWNvbiBuYW1lPVwic3lzdGVtX29rXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGVwLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnMgY2xhc3M9XCJwZXBwZXJpLWJvcmRlci10b3Agc3BsaXQtYWN0aW9ucyBcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwiZGF0YS5zaG93QUFDb21wbGllbnRcIiB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImNoZWNrQUFDb21wbGllbnRcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGVja0FBQ29tcGxpZW50ID0gIWNoZWNrQUFDb21wbGllbnRcIiBbY2hlY2tlZF09XCJjaGVja0FBQ29tcGxpZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJvZHkteHMgZWxsaXBzaXNcIj57eyAnUGVwcHJpQ29sb3JfQUFDb21wbGllbnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2luZy1lbGVtZW50LW5lZ2F0aXZlXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJudWxsXCIgY2xhc3M9XCJzcGFjaW5nLWVsZW1lbnQgcGVwcGVyaS1idXR0b24gY2FuY2VsLWJ0biBtZCB3ZWFrXCI+XHJcbiAgICAgICAgICAgICAgICB7eydDYW5jZWwnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cInNwYWNpbmctZWxlbWVudCBwZXBwZXJpLWJ1dHRvbiBzYXZlLWJ0biBtZCBzdHJvbmdcIiAoY2xpY2spPVwib25TYXZlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIHt7J09rJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuIl19