@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
295 lines • 40.2 kB
JavaScript
import { Component, ElementRef, Injector, Input } from '@angular/core';
import { CapacityBase } from '../../common/capacity-base.component';
import { StatusIconType } from '../../icon/layered-icon/status/status-icon.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../../tooltip/tooltip.directive";
import * as i3 from "../../tooltip/tooltip-zone.directive";
import * as i4 from "../../icon/layered-icon/status/status-icon.component";
function LegendEntryComponent_div_0_div_1_div_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "div");
} if (rf & 2) {
const ctx_r10 = i0.ɵɵnextContext(3);
i0.ɵɵclassMapInterpolate1("sme-layout-absolute sme-width-xxs sme-position-stretch-v sme-layer-above ", ctx_r10.stripeClass, "");
} }
const _c0 = function (a0) { return { "background-color": a0 }; };
function LegendEntryComponent_div_0_div_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 13);
i0.ɵɵtemplate(1, LegendEntryComponent_div_0_div_1_div_1_Template, 1, 3, "div", 3);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext(2);
i0.ɵɵclassMapInterpolate1("sme-margin-right-xs sme-width-xxs sme-layout-relative ", ctx_r1.hideInHighContrastClass, "");
i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(5, _c0, ctx_r1.color));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r1.stripeClass);
} }
function LegendEntryComponent_div_0_div_2__svg_rect_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵnamespaceSVG();
i0.ɵɵelement(0, "rect", 17);
} if (rf & 2) {
const ctx_r11 = i0.ɵɵnextContext(3);
i0.ɵɵattribute("fill", ctx_r11.color);
} }
function LegendEntryComponent_div_0_div_2__svg_rect_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵnamespaceSVG();
i0.ɵɵelement(0, "rect", 18);
} if (rf & 2) {
const ctx_r12 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("ngClass", ctx_r12.stripeClass);
} }
function LegendEntryComponent_div_0_div_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div");
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(1, "svg", 14);
i0.ɵɵtemplate(2, LegendEntryComponent_div_0_div_2__svg_rect_2_Template, 1, 1, "rect", 15);
i0.ɵɵtemplate(3, LegendEntryComponent_div_0_div_2__svg_rect_3_Template, 1, 1, "rect", 16);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext(2);
i0.ɵɵclassMapInterpolate1("sme-margin-right-xs sme-width-xxs sme-layout-relative ", ctx_r2.hideInHighContrastClass, "");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", !ctx_r2.stripeClass);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r2.stripeClass);
} }
function LegendEntryComponent_div_0_span_8_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "span", 19);
} if (rf & 2) {
i0.ɵɵnextContext();
const _r3 = i0.ɵɵreference(4);
const ctx_r4 = i0.ɵɵnextContext();
i0.ɵɵproperty("title", ctx_r4.data.tooltipContext.text)("tooltipZone", _r3);
} }
function LegendEntryComponent_div_0_span_9_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "span", 20);
} if (rf & 2) {
i0.ɵɵnextContext();
const _r6 = i0.ɵɵreference(11);
const _r3 = i0.ɵɵreference(4);
const ctx_r5 = i0.ɵɵnextContext();
i0.ɵɵproperty("smeTooltip", _r6)("smeTooltipContext", ctx_r5.data.tooltipContext)("tooltipZone", _r3);
} }
function LegendEntryComponent_div_0_ng_template_10_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div");
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(2, "a", 21);
i0.ɵɵtext(3);
i0.ɵɵelement(4, "span", 22);
i0.ɵɵelementEnd();
} if (rf & 2) {
const data_r13 = ctx.$implicit;
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(data_r13.text);
i0.ɵɵadvance(1);
i0.ɵɵproperty("href", data_r13.linkUrl, i0.ɵɵsanitizeUrl);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(data_r13.linkText);
} }
function LegendEntryComponent_div_0_span_12_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "span");
} if (rf & 2) {
const ctx_r8 = i0.ɵɵnextContext(2);
i0.ɵɵclassMapInterpolate1("sme-margin-right-xs sme-icon ", ctx_r8.data.iconClass, "");
} }
function LegendEntryComponent_div_0_sme_status_icon_14_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-status-icon", 23);
} if (rf & 2) {
const ctx_r9 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("status", ctx_r9.data.status);
} }
const _c1 = function (a0) { return { "sme-color-alt-30": a0 }; };
function LegendEntryComponent_div_0_Template(rf, ctx) { if (rf & 1) {
const _r15 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "div", 1);
i0.ɵɵtemplate(1, LegendEntryComponent_div_0_div_1_Template, 2, 7, "div", 2);
i0.ɵɵtemplate(2, LegendEntryComponent_div_0_div_2_Template, 4, 5, "div", 3);
i0.ɵɵelementStart(3, "div", 4, 5);
i0.ɵɵlistener("focus", function LegendEntryComponent_div_0_Template_div_focus_3_listener() { i0.ɵɵrestoreView(_r15); const ctx_r14 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r14.enableAriaLiveUpdates()); })("blur", function LegendEntryComponent_div_0_Template_div_blur_3_listener() { i0.ɵɵrestoreView(_r15); const ctx_r16 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r16.disableAriaLiveUpdates()); });
i0.ɵɵelementStart(5, "div", 6)(6, "span", 7);
i0.ɵɵtext(7);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(8, LegendEntryComponent_div_0_span_8_Template, 1, 2, "span", 8);
i0.ɵɵtemplate(9, LegendEntryComponent_div_0_span_9_Template, 1, 3, "span", 9);
i0.ɵɵtemplate(10, LegendEntryComponent_div_0_ng_template_10_Template, 5, 3, "ng-template", null, 10, i0.ɵɵtemplateRefExtractor);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(12, LegendEntryComponent_div_0_span_12_Template, 1, 3, "span", 3);
i0.ɵɵelementStart(13, "p", 11);
i0.ɵɵtemplate(14, LegendEntryComponent_div_0_sme_status_icon_14_Template, 1, 1, "sme-status-icon", 12);
i0.ɵɵtext(15);
i0.ɵɵelementEnd()()();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵclassProp("sme-margin-right-sm", !ctx_r0.lastEntry)("sme-position-right-inline", ctx_r0.rightAlign)("sme-cursor-pointer", ctx_r0.data.action);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.color && !ctx_r0.svgLegendColorIndicator);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.color && ctx_r0.svgLegendColorIndicator);
i0.ɵɵadvance(1);
i0.ɵɵproperty("id", ctx_r0.entryId);
i0.ɵɵattribute("role", ctx_r0.data.action ? "button" : null)("aria-labelledby", ctx_r0.idBag.dataLabel + " " + ctx_r0.idBag.dataDisplayValue);
i0.ɵɵadvance(2);
i0.ɵɵattribute("aria-live", ctx_r0.ariaLiveValue);
i0.ɵɵadvance(1);
i0.ɵɵproperty("id", ctx_r0.idBag.dataLabel);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r0.data.label);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.data.tooltipContext && !ctx_r0.data.tooltipContext.linkUrl);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.data.tooltipContext && ctx_r0.data.tooltipContext.linkUrl);
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngIf", !!ctx_r0.data.iconClass);
i0.ɵɵadvance(1);
i0.ɵɵclassMapInterpolate1("", ctx_r0.textColorClass, " sme-font-h2");
i0.ɵɵproperty("id", ctx_r0.idBag.dataDisplayValue)("ngClass", i0.ɵɵpureFunction1(24, _c1, ctx_r0.data.fadedText));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.data.status !== null && !ctx_r0.data.iconClass && ctx_r0.data.status);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", ctx_r0.data.displayValue, " ");
} }
export var AriaLiveOptions;
(function (AriaLiveOptions) {
AriaLiveOptions["Polite"] = "polite";
AriaLiveOptions["Off"] = "off";
})(AriaLiveOptions || (AriaLiveOptions = {}));
export class LegendEntryComponent extends CapacityBase {
constructor(injector, elementRef) {
super(injector);
this.elementRef = elementRef;
/**
* Whether or not to hide the legend control color indicator in high contrast layout
*/
this.hideInHighContrast = false;
/**
* Whether or not the legend color indicator should use svg
*/
this.svgLegendColorIndicator = true;
this.hideInHighContrastClass = '';
this.ariaLiveValue = AriaLiveOptions.Off;
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'LegendEntryComponent';
}
ngOnInit() {
this.color = this.getColor();
this.textColorClass = this.getTextColorClass();
if (this.data && this.data.stripeColor && this.data.stripeAlpha) {
this.stripeClass = 'sme-background-stripes-{0}-{1}'.format(this.data.stripeColor, this.data.stripeAlpha);
}
this.lastEntry = this.data === MsftSme.last(this.entries);
if (this.hideInHighContrast) {
this.hideInHighContrastClass = 'sme-high-contrast-layout-none';
}
if (this.data.action) {
this.elementRef.nativeElement.addEventListener('click', event => {
this.data.action(event);
});
}
}
disableAriaLiveUpdates() {
this.ariaLiveValue = AriaLiveOptions.Off;
}
enableAriaLiveUpdates() {
this.ariaLiveValue = AriaLiveOptions.Polite;
}
getColor() {
// if user specifies a color, use that color. Otherwise use the color scheme
if (!MsftSme.isNullOrUndefined(this.data.color)) {
return this.data.color;
}
// no color bar will be rendered
if (this.noColor) {
return null;
}
// if user does not specify color or explicitly no color then color is determined by the color scheme
if (this.entries) {
let entriesTotal = 0;
for (const entry of this.entries) {
const entryValue = entry.rawValue ? entry.rawValue : entry.displayValue;
// sum up all the entry values for which we need to calculate color so we know if we have surpassed the red\yellow threshold
if (!entry.color && !entry.noColor) {
entriesTotal += entryValue;
}
}
const colorScheme = this.getColorScheme(entriesTotal);
if (MsftSme.isNullOrUndefined(colorScheme[this.index])) {
// eslint-disable-next-line max-len
throw new Error('Color property must be set on LegendEntryData input if the Legend Value component is used outside of a Legend component. Or the color scheme value is not defined for this index.');
}
else {
return colorScheme[this.index];
}
}
}
// adds classes listed to the root component
getInitialHostClasses() {
return super.getInitialHostClasses().concat([
'sme-layout-legend-entry'
]);
}
/**
* Creates the idBag used by this component to store unique element ids.
* id values will be assigned be the @see BaseComponent super class.
*/
createIdBag() {
return {
dataLabel: '',
dataDisplayValue: ''
};
}
getTextColorClass() {
if (MsftSme.isNullOrUndefined(this.data.status)) {
return null;
}
switch (this.data.status) {
case StatusIconType.Critical:
return 'sme-color-critical';
case StatusIconType.Error:
return 'sme-color-error';
case StatusIconType.Warning:
return 'sme-color-warning';
case StatusIconType.Info:
return 'sme-color-info';
case StatusIconType.Progress:
return 'sme-color-progress';
case StatusIconType.Success:
return 'sme-color-success';
case StatusIconType.Unknown:
return 'sme-color-neutral';
default:
return null;
}
}
}
/** @nocollapse */ LegendEntryComponent.ɵfac = function LegendEntryComponent_Factory(t) { return new (t || LegendEntryComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i0.ElementRef)); };
/** @nocollapse */ LegendEntryComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: LegendEntryComponent, selectors: [["sme-legend-entry"]], inputs: { data: "data", entryId: "entryId", entries: "entries", index: "index", rightAlign: "rightAlign", noColor: "noColor", hideInHighContrast: "hideInHighContrast", svgLegendColorIndicator: "svgLegendColorIndicator" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["class", "sme-arrange-stack-h", 3, "sme-margin-right-sm", "sme-position-right-inline", "sme-cursor-pointer", 4, "ngIf"], [1, "sme-arrange-stack-h"], [3, "class", "ngStyle", 4, "ngIf"], [3, "class", 4, "ngIf"], ["tabindex", "0", "smeTooltipZone", "", 1, "sme-arrange-stack-v", "sme-position-flex-auto", 3, "id", "focus", "blur"], ["zone", "smeTooltipZone"], [1, "sme-margin-bottom-xs"], [3, "id"], ["class", "sme-icon sme-info-bubble sme-icon-info sme-padding-left-xxs", "tabindex", "0", 3, "title", "tooltipZone", 4, "ngIf"], ["tabindex", "0", "class", "sme-icon sme-info-bubble sme-icon-info sme-padding-left-xxs", 3, "smeTooltip", "smeTooltipContext", "tooltipZone", 4, "ngIf"], ["template", ""], [3, "id", "ngClass"], ["class", "sme-layout-inline-block sme-margin-right-xxs", "size", "24px", 3, "status", 4, "ngIf"], [3, "ngStyle"], ["role", "presentation", "preserveAspectRatio", "none", "xmlns", "http://www.w3.org/2000/svg", 0, "xmlns", "xlink", "http://www.w3.org/1999/xlink", "viewBox", "0 0 4 56", 1, "sme-position-stretch"], ["width", "4", "height", "56", 4, "ngIf"], ["width", "4", "height", "56", 3, "ngClass", 4, "ngIf"], ["width", "4", "height", "56"], ["width", "4", "height", "56", 3, "ngClass"], ["tabindex", "0", 1, "sme-icon", "sme-info-bubble", "sme-icon-info", "sme-padding-left-xxs", 3, "title", "tooltipZone"], ["tabindex", "0", 1, "sme-icon", "sme-info-bubble", "sme-icon-info", "sme-padding-left-xxs", 3, "smeTooltip", "smeTooltipContext", "tooltipZone"], ["target", "_blank", 1, "sme-link", 3, "href"], [1, "sme-icon", "sme-icon-openInNewWindow", "sme-margin-left-xs"], ["size", "24px", 1, "sme-layout-inline-block", "sme-margin-right-xxs", 3, "status"]], template: function LegendEntryComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, LegendEntryComponent_div_0_Template, 16, 26, "div", 0);
} if (rf & 2) {
i0.ɵɵproperty("ngIf", ctx.data);
} }, dependencies: [i1.NgClass, i1.NgIf, i1.NgStyle, i2.TooltipDirective, i3.TooltipZoneDirective, i4.StatusIconComponent], encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LegendEntryComponent, [{
type: Component,
args: [{ selector: 'sme-legend-entry', template: "<div *ngIf=\"data\" class=\"sme-arrange-stack-h\" [class.sme-margin-right-sm]=\"!lastEntry\"\r\n [class.sme-position-right-inline]=\"rightAlign\" [class.sme-cursor-pointer]=\"data.action\">\r\n\r\n <div *ngIf=\"color && !svgLegendColorIndicator\"\r\n class=\"sme-margin-right-xs sme-width-xxs sme-layout-relative {{hideInHighContrastClass}}\"\r\n [ngStyle]=\"{'background-color': color}\">\r\n <div *ngIf=\"stripeClass\"\r\n class=\"sme-layout-absolute sme-width-xxs sme-position-stretch-v sme-layer-above {{stripeClass}}\"></div>\r\n </div>\r\n\r\n <div *ngIf=\"color && svgLegendColorIndicator\"\r\n class=\"sme-margin-right-xs sme-width-xxs sme-layout-relative {{hideInHighContrastClass}}\">\r\n <svg class=\"sme-position-stretch\" role=\"presentation\" preserveAspectRatio=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 4 56\">\r\n <rect *ngIf=\"!stripeClass\" width=\"4\" height=\"56\" [attr.fill]=\"color\" />\r\n <rect *ngIf=\"stripeClass\" width=\"4\" height=\"56\" [ngClass]=\"stripeClass\" />\r\n </svg>\r\n </div>\r\n\r\n <div tabindex=\"0\" [attr.role]=\"data.action ? 'button' : null\" [id]=\"entryId\"\r\n class=\"sme-arrange-stack-v sme-position-flex-auto\"\r\n [attr.aria-labelledby]=\"idBag.dataLabel + ' ' + idBag.dataDisplayValue\" #zone=\"smeTooltipZone\" smeTooltipZone\r\n (focus)=\"enableAriaLiveUpdates()\" (blur)=\"disableAriaLiveUpdates()\">\r\n <div class=\"sme-margin-bottom-xs\" [attr.aria-live]=\"ariaLiveValue\">\r\n <span [id]=\"idBag.dataLabel\">{{data.label}}</span>\r\n\r\n <span *ngIf=\"data.tooltipContext && !data.tooltipContext.linkUrl\"\r\n class=\"sme-icon sme-info-bubble sme-icon-info sme-padding-left-xxs\" [title]=\"data.tooltipContext.text\"\r\n [tooltipZone]=\"zone\" tabindex=\"0\"></span>\r\n\r\n <span *ngIf=\"data.tooltipContext && data.tooltipContext.linkUrl\" tabindex=\"0\"\r\n class=\"sme-icon sme-info-bubble sme-icon-info sme-padding-left-xxs\" [smeTooltip]=\"template\"\r\n [smeTooltipContext]=\"data.tooltipContext\" [tooltipZone]=\"zone\"></span>\r\n <ng-template #template let-data>\r\n <div>{{data.text}}</div>\r\n <a class=\"sme-link\" target=\"_blank\" [href]=\"data.linkUrl\">{{data.linkText}}<span\r\n class=\"sme-icon sme-icon-openInNewWindow sme-margin-left-xs\"></span></a>\r\n </ng-template>\r\n </div>\r\n <span *ngIf=\"!!data.iconClass\" class=\"sme-margin-right-xs sme-icon {{data.iconClass}}\"></span>\r\n <p [id]=\"idBag.dataDisplayValue\" class=\"{{textColorClass}} sme-font-h2\"\r\n [ngClass]=\"{'sme-color-alt-30': data.fadedText}\">\r\n <sme-status-icon *ngIf=\"data.status !== null && !data.iconClass && data.status\"\r\n class=\"sme-layout-inline-block sme-margin-right-xxs\" [status]=\"data.status\" size=\"24px\"></sme-status-icon>\r\n {{data.displayValue}}\r\n </p>\r\n </div>\r\n</div>\r\n" }]
}], function () { return [{ type: i0.Injector }, { type: i0.ElementRef }]; }, { data: [{
type: Input
}], entryId: [{
type: Input
}], entries: [{
type: Input
}], index: [{
type: Input
}], rightAlign: [{
type: Input
}], noColor: [{
type: Input
}], hideInHighContrast: [{
type: Input
}], svgLegendColorIndicator: [{
type: Input
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnZW5kLWVudHJ5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2xlZ2VuZC9sZWdlbmQtZW50cnkvbGVnZW5kLWVudHJ5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2xlZ2VuZC9sZWdlbmQtZW50cnkvbGVnZW5kLWVudHJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7Ozs7OztJQ0lsRixzQkFDeUc7OztJQUF2RywrSEFBZ0c7Ozs7SUFKcEcsK0JBRTBDO0lBQ3hDLGlGQUN5RztJQUMzRyxpQkFBTTs7O0lBSkosdUhBQXlGO0lBQ3pGLGtFQUF1QztJQUNqQyxlQUFpQjtJQUFqQix5Q0FBaUI7Ozs7SUFRckIsMkJBQXVFOzs7SUFBdEIscUNBQW1COzs7O0lBQ3BFLDJCQUEwRTs7O0lBQTFCLDZDQUF1Qjs7O0lBTDNFLDJCQUM0RjtJQUMxRixtQkFDZ0U7SUFEaEUsK0JBQ2dFO0lBQzlELHlGQUF1RTtJQUN2RSx5RkFBMEU7SUFDNUUsaUJBQU0sRUFBQTs7O0lBTE4sdUhBQXlGO0lBR2hGLGVBQWtCO0lBQWxCLDBDQUFrQjtJQUNsQixlQUFpQjtJQUFqQix5Q0FBaUI7OztJQVd4QiwyQkFFMkM7Ozs7O0lBRDJCLHVEQUFrQyxvQkFBQTs7O0lBR3hHLDJCQUV3RTs7Ozs7O0lBREYsZ0NBQXVCLGlEQUFBLG9CQUFBOzs7SUFHM0YsMkJBQUs7SUFBQSxZQUFhO0lBQUEsaUJB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Q0FBQztZQUMvQjtnQkFDSSxPQUFPLElBQUksQ0FBQztTQUNuQjtJQUNMLENBQUM7OzJHQTFJUSxvQkFBb0I7c0dBQXBCLG9CQUFvQjtRQ3JHakMsdUVBK0NNOztRQS9DQSwrQkFBVTs7dUZEcUdILG9CQUFvQjtjQUpoQyxTQUFTOzJCQUNJLGtCQUFrQjtvRkFZWixJQUFJO2tCQUFuQixLQUFLO1lBQ1UsT0FBTztrQkFBdEIsS0FBSztZQUNVLE9BQU87a0JBQXRCLEtBQUs7WUFDVSxLQUFLO2tCQUFwQixLQUFLO1lBQ1UsVUFBVTtrQkFBekIsS0FBSztZQUNVLE9BQU87a0JBQXRCLEtBQUs7WUFLVSxrQkFBa0I7a0JBQWpDLEtBQUs7WUFLVSx1QkFBdUI7a0JBQXRDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENhcGFjaXR5QmFzZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9jYXBhY2l0eS1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFN0YXR1c0ljb25UeXBlIH0gZnJvbSAnLi4vLi4vaWNvbi9sYXllcmVkLWljb24vc3RhdHVzL3N0YXR1cy1pY29uLmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExlZ2VuZEVudHJ5VG9vbHRpcENvbnRleHQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5XHJcbiAgICAgKi9cclxuICAgIHRleHQ/OiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0ZXh0IHRvIGRpc3BsYXkgZm9yIGEgbGlua1xyXG4gICAgICovXHJcbiAgICBsaW5rVGV4dD86IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHVybCBmb3IgYSBsaW5rIHRoYXQgdGFrZXMgdXNlciBvdXRzaWRlIG9mIFdpbmRvd3MgQWRtaW4gQ2VudGVyICh3aWxsIGRpc3BsYXkgdGhlIG9wZW4gaW4gbmV3IHRhYiBpY29uKVxyXG4gICAgICovXHJcbiAgICBsaW5rVXJsPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExlZ2VuZEVudHJ5RGF0YSB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsYWJlbCB0ZXh0IHRvIGFwcGVhciBhYm92ZSB0aGUgdmFsdWVcclxuICAgICAqL1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2YWx1ZSB0byBkaXNwbGF5XHJcbiAgICAgKi9cclxuICAgIGRpc3BsYXlWYWx1ZTogYW55O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9wdGlvbmFsIHVuZm9ybWF0dGVkIHZhbHVlIGZvciB1c2UgaW4gY2FwYWNpdHkgc2l0dWF0aW9ucy5cclxuICAgICAqIFRoZSB2YWx1ZSB3aWxsIGRpdmlkZWQgYnkgdGhlIHRvdGFsIGFuZCB0aGUgcmVzdWx0IGNvbXBhcmVkIHRvIHRoZSByZWQveWVsbG93IHRocmVzaG9sZCB2YWx1ZXMuXHJcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGNvbG9yIHNjaGVtZSB0byB1c2UgaW4gY2FwYWNpdHkgc2l0dWF0aW9ucy5cclxuICAgICAqIElmIGNvbG9yIHByb3BlcnR5IGlzIHNwZWNpZmllZCB0aGVuIHRoaXMgdmFsdWUgaXMgbm90IHVzZWQuXHJcbiAgICAgKi9cclxuICAgIHJhd1ZhbHVlPzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG9wdGlvbmFsIGNvbG9yIHRvIHVzZS4gVmFsdWUgbXVzdCBiZSBzdXBwbGllZCBpZiB0aGlzIGNvbXBvbmVudCBpcyB1c2VkIG91dHNpZGUgb2YgTGVnZW5kIGNvbXBvbmVudC5cclxuICAgICAqIElmIG5vIGNvbG9yIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgY29sb3Igd2lsbCBiZSBzcGVjaWZpZWQgYnkgdGhlIGNvbG9yIHNjaGVtZSAoZGVmYXVsdCB2YWx1ZXMgaW4gY2FwYWNpdHkgY2FzZSkuXHJcbiAgICAgKiBUaGlzIGRlZmF1bHRzIHRvIENhcGFjaXR5QmFzZSBkZWZhdWx0IGdyZWVuQ29sb3JTY2hlbWUuXHJcbiAgICAgKiBWYWx1ZSBzcGVjaWZpZWQgaGVyZSBvdmVycmlkZXMgYW55IGNvbG9yIHNjaGVtZSB2YWx1ZSB0aGF0IHdvdWxkIGJlIGNhbGN1bGF0ZWQgaWYgcmF3VmFsdWUgaXMgZ2l2ZW4uXHJcbiAgICAgKi9cclxuICAgIGNvbG9yPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRydWUgdG8gaGF2ZSBubyBjb2xvciBiYXIgcmVuZGVyZWRcclxuICAgICAqL1xyXG4gICAgbm9Db2xvcj86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB3aGV0aGVyIG9yIG5vdCB0byB1c2UgZ3JleWVkLW91dCB0ZXh0IGNvbG9yXHJcbiAgICAgKi9cclxuICAgIGZhZGVkVGV4dD86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xvciBvZiBvcHRpb25hbCBzdHJpcGVzLiBVc2Ugb25lIG9mIHRoZSBzdGFuZGFyZCBTTUUgY29sb3IgdmFsdWVzLlxyXG4gICAgICovXHJcbiAgICBzdHJpcGVDb2xvcj86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvcGFjaXR5IG9mIHRoZSBzdHJpcGUgY29sb3IuIFVzZSBvbmUgb2YgdGhlIHN0YW5kYXJkIFNNRSBjb2xvciBvcGFjaXR5IHZhbHVlc1xyXG4gICAgICovXHJcbiAgICBzdHJpcGVBbHBoYT86IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIG9iamVjdCB0byBzcGVjaWZ5IHRvb2x0aXAgZGF0YVxyXG4gICAgICovXHJcbiAgICB0b29sdGlwQ29udGV4dD86IExlZ2VuZEVudHJ5VG9vbHRpcENvbnRleHQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVc2UgdHJ1ZSB0byBoYXZlIHRleHQgYmUgcmlnaHQtYWxpZ25lZFxyXG4gICAgICovXHJcbiAgICByaWdodEFsaWduPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIHRoZSBhY3Rpb24gdG8gdGFrZSB3aGVuIHlvdSBjbGljayBhIGxlZ2VuZCBpdGVtXHJcbiAgICAgKi9cclxuICAgIGFjdGlvbj86IE1zZnRTbWUuQWN0aW9uMTxNb3VzZUV2ZW50PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNwZWNpZnkgYW55IGN1c3RvbSBpY29uIGNsYXNzIHRvIHVzZSBpbnN0ZWFkIG9mIHN0YXR1c1xyXG4gICAgICovXHJcbiAgICBpY29uQ2xhc3M/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGF0dXMgaWNvbiB0byBkaXNwbGF5XHJcbiAgICAgKi9cclxuICAgIHN0YXR1cz86IFN0YXR1c0ljb25UeXBlO1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBBcmlhTGl2ZU9wdGlvbnMge1xyXG4gICAgUG9saXRlID0gJ3BvbGl0ZScsXHJcbiAgICBPZmYgPSAnb2ZmJ1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWxlZ2VuZC1lbnRyeScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbGVnZW5kLWVudHJ5LmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTGVnZW5kRW50cnlDb21wb25lbnQgZXh0ZW5kcyBDYXBhY2l0eUJhc2UgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNvdXJjZSBuYW1lIHRvIHVzZSBmb3IgbG9nZ2luZ1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGxvZ1NvdXJjZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuICdMZWdlbmRFbnRyeUNvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGRhdGE6IExlZ2VuZEVudHJ5RGF0YTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBlbnRyeUlkOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZW50cmllczogTGVnZW5kRW50cnlEYXRhW107XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5kZXg6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyByaWdodEFsaWduOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIG5vQ29sb3I6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byBoaWRlIHRoZSBsZWdlbmQgY29udHJvbCBjb2xvciBpbmRpY2F0b3IgaW4gaGlnaCBjb250cmFzdCBsYXlvdXRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGhpZGVJbkhpZ2hDb250cmFzdCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGxlZ2VuZCBjb2xvciBpbmRpY2F0b3Igc2hvdWxkIHVzZSBzdmdcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHN2Z0xlZ2VuZENvbG9ySW5kaWNhdG9yID0gdHJ1ZTtcclxuXHJcbiAgICBwdWJsaWMgbGFzdEVudHJ5OiBib29sZWFuO1xyXG4gICAgcHVibGljIHN0cmlwZUNsYXNzOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgY29sb3I6IHN0cmluZztcclxuICAgIHB1YmxpYyBoaWRlSW5IaWdoQ29udHJhc3RDbGFzcyA9ICcnO1xyXG4gICAgcHVibGljIHRleHRDb2xvckNsYXNzOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgYXJpYUxpdmVWYWx1ZSA9IEFyaWFMaXZlT3B0aW9ucy5PZmY7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSB0aGlzLmdldENvbG9yKCk7XHJcbiAgICAgICAgdGhpcy50ZXh0Q29sb3JDbGFzcyA9IHRoaXMuZ2V0VGV4dENvbG9yQ2xhc3MoKTtcclxuICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5zdHJpcGVDb2xvciAmJiB0aGlzLmRhdGEuc3RyaXBlQWxwaGEpIHtcclxuICAgICAgICAgICAgdGhpcy5zdHJpcGVDbGFzcyA9ICdzbWUtYmFja2dyb3VuZC1zdHJpcGVzLXswfS17MX0nLmZvcm1hdCh0aGlzLmRhdGEuc3RyaXBlQ29sb3IsIHRoaXMuZGF0YS5zdHJpcGVBbHBoYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGFzdEVudHJ5ID0gdGhpcy5kYXRhID09PSBNc2Z0U21lLmxhc3QodGhpcy5lbnRyaWVzKTtcclxuICAgICAgICBpZiAodGhpcy5oaWRlSW5IaWdoQ29udHJhc3QpIHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlSW5IaWdoQ29udHJhc3RDbGFzcyA9ICdzbWUtaGlnaC1jb250cmFzdC1sYXlvdXQtbm9uZSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kYXRhLmFjdGlvbikge1xyXG4gICAgICAgICAgICAoPEhUTUxFbGVtZW50PnRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5hY3Rpb24oZXZlbnQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2FibGVBcmlhTGl2ZVVwZGF0ZXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hcmlhTGl2ZVZhbHVlID0gQXJpYUxpdmVPcHRpb25zLk9mZjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5hYmxlQXJpYUxpdmVVcGRhdGVzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYXJpYUxpdmVWYWx1ZSA9IEFyaWFMaXZlT3B0aW9ucy5Qb2xpdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbG9yKCk6IHN0cmluZyB7XHJcblxyXG4gICAgICAgIC8vIGlmIHVzZXIgc3BlY2lmaWVzIGEgY29sb3IsIHVzZSB0aGF0IGNvbG9yLiBPdGhlcndpc2UgdXNlIHRoZSBjb2xvciBzY2hlbWVcclxuICAgICAgICBpZiAoIU1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5kYXRhLmNvbG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmNvbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbm8gY29sb3IgYmFyIHdpbGwgYmUgcmVuZGVyZWRcclxuICAgICAgICBpZiAodGhpcy5ub0NvbG9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGNvbG9yIG9yIGV4cGxpY2l0bHkgbm8gY29sb3IgdGhlbiBjb2xvciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb2xvciBzY2hlbWVcclxuICAgICAgICBpZiAodGhpcy5lbnRyaWVzKSB7XHJcbiAgICAgICAgICAgIGxldCBlbnRyaWVzVG90YWwgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlWYWx1ZSA9IGVudHJ5LnJhd1ZhbHVlID8gZW50cnkucmF3VmFsdWUgOiBlbnRyeS5kaXNwbGF5VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAvLyBzdW0gdXAgYWxsIHRoZSBlbnRyeSB2YWx1ZXMgZm9yIHdoaWNoIHdlIG5lZWQgdG8gY2FsY3VsYXRlIGNvbG9yIHNvIHdlIGtub3cgaWYgd2UgaGF2ZSBzdXJwYXNzZWQgdGhlIHJlZFxceWVsbG93IHRocmVzaG9sZFxyXG4gICAgICAgICAgICAgICAgaWYgKCFlbnRyeS5jb2xvciAmJiAhZW50cnkubm9Db2xvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXNUb3RhbCArPSBlbnRyeVZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yU2NoZW1lID0gdGhpcy5nZXRDb2xvclNjaGVtZShlbnRyaWVzVG90YWwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKE1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQoY29sb3JTY2hlbWVbdGhpcy5pbmRleF0pKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2xvciBwcm9wZXJ0eSBtdXN0IGJlIHNldCBvbiBMZWdlbmRFbnRyeURhdGEgaW5wdXQgaWYgdGhlIExlZ2VuZCBWYWx1ZSBjb21wb25lbnQgaXMgdXNlZCBvdXRzaWRlIG9mIGEgTGVnZW5kIGNvbXBvbmVudC4gT3IgdGhlIGNvbG9yIHNjaGVtZSB2YWx1ZSBpcyBub3QgZGVmaW5lZCBmb3IgdGhpcyBpbmRleC4nKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb2xvclNjaGVtZVt0aGlzLmluZGV4XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWRkcyBjbGFzc2VzIGxpc3RlZCB0byB0aGUgcm9vdCBjb21wb25lbnRcclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtbGF5b3V0LWxlZ2VuZC1lbnRyeSdcclxuICAgICAgICBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIGlkQmFnIHVzZWQgYnkgdGhpcyBjb21wb25lbnQgdG8gc3RvcmUgdW5pcXVlIGVsZW1lbnQgaWRzLlxyXG4gICAgICogaWQgdmFsdWVzIHdpbGwgYmUgYXNzaWduZWQgYmUgdGhlIEBzZWUgQmFzZUNvbXBvbmVudCBzdXBlciBjbGFzcy5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUlkQmFnKCk6IE1zZnRTbWUuU3RyaW5nTWFwPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRhdGFMYWJlbDogJycsXHJcbiAgICAgICAgICAgIGRhdGFEaXNwbGF5VmFsdWU6ICcnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGV4dENvbG9yQ2xhc3MoKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh0aGlzLmRhdGEuc3RhdHVzKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN3aXRjaCAodGhpcy5kYXRhLnN0YXR1cykge1xyXG4gICAgICAgICAgICBjYXNlIFN0YXR1c0ljb25UeXBlLkNyaXRpY2FsOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdzbWUtY29sb3ItY3JpdGljYWwnO1xyXG4gICAgICAgICAgICBjYXNlIFN0YXR1c0ljb25UeXBlLkVycm9yOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdzbWUtY29sb3ItZXJyb3InO1xyXG4gICAgICAgICAgICBjYXNlIFN0YXR1c0ljb25UeXBlLldhcm5pbmc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NtZS1jb2xvci13YXJuaW5nJztcclxuICAgICAgICAgICAgY2FzZSBTdGF0dXNJY29uVHlwZS5JbmZvOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdzbWUtY29sb3ItaW5mbyc7XHJcbiAgICAgICAgICAgIGNhc2UgU3RhdHVzSWNvblR5cGUuUHJvZ3Jlc3M6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NtZS1jb2xvci1wcm9ncmVzcyc7XHJcbiAgICAgICAgICAgIGNhc2UgU3RhdHVzSWNvblR5cGUuU3VjY2VzczpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnc21lLWNvbG9yLXN1Y2Nlc3MnO1xyXG4gICAgICAgICAgICBjYXNlIFN0YXR1c0ljb25UeXBlLlVua25vd246XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NtZS1jb2xvci1uZXV0cmFsJztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCI8ZGl2ICpuZ0lmPVwiZGF0YVwiIGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2staFwiIFtjbGFzcy5zbWUtbWFyZ2luLXJpZ2h0LXNtXT1cIiFsYXN0RW50cnlcIlxyXG4gIFtjbGFzcy5zbWUtcG9zaXRpb24tcmlnaHQtaW5saW5lXT1cInJpZ2h0QWxpZ25cIiBbY2xhc3Muc21lLWN1cnNvci1wb2ludGVyXT1cImRhdGEuYWN0aW9uXCI+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJjb2xvciAmJiAhc3ZnTGVnZW5kQ29sb3JJbmRpY2F0b3JcIlxyXG4gICAgY2xhc3M9XCJzbWUtbWFyZ2luLXJpZ2h0LXhzIHNtZS13aWR0aC14eHMgc21lLWxheW91dC1yZWxhdGl2ZSB7e2hpZGVJbkhpZ2hDb250cmFzdENsYXNzfX1cIlxyXG4gICAgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogY29sb3J9XCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic3RyaXBlQ2xhc3NcIlxyXG4gICAgICBjbGFzcz1cInNtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXdpZHRoLXh4cyBzbWUtcG9zaXRpb24tc3RyZXRjaC12IHNtZS1sYXllci1hYm92ZSB7e3N0cmlwZUNsYXNzfX1cIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cImNvbG9yICYmIHN2Z0xlZ2VuZENvbG9ySW5kaWNhdG9yXCJcclxuICAgIGNsYXNzPVwic21lLW1hcmdpbi1yaWdodC14cyBzbWUtd2lkdGgteHhzIHNtZS1sYXlvdXQtcmVsYXRpdmUge3toaWRlSW5IaWdoQ29udHJhc3RDbGFzc319XCI+XHJcbiAgICA8c3ZnIGNsYXNzPVwic21lLXBvc2l0aW9uLXN0cmV0Y2hcIiByb2xlPVwicHJlc2VudGF0aW9uXCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCA0IDU2XCI+XHJcbiAgICAgIDxyZWN0ICpuZ0lmPVwiIXN0cmlwZUNsYXNzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiNTZcIiBbYXR0ci5maWxsXT1cImNvbG9yXCIgLz5cclxuICAgICAgPHJlY3QgKm5nSWY9XCJzdHJpcGVDbGFzc1wiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjU2XCIgW25nQ2xhc3NdPVwic3RyaXBlQ2xhc3NcIiAvPlxyXG4gICAgPC9zdmc+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgdGFiaW5kZXg9XCIwXCIgW2F0dHIucm9sZV09XCJkYXRhLmFjdGlvbiA/ICdidXR0b24nIDogbnVsbFwiIFtpZF09XCJlbnRyeUlkXCJcclxuICAgIGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2stdiBzbWUtcG9zaXRpb24tZmxleC1hdXRvXCJcclxuICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpZEJhZy5kYXRhTGFiZWwgKyAnICcgKyBpZEJhZy5kYXRhRGlzcGxheVZhbHVlXCIgI3pvbmU9XCJzbWVUb29sdGlwWm9uZVwiIHNtZVRvb2x0aXBab25lXHJcbiAgICAoZm9jdXMpPVwiZW5hYmxlQXJpYUxpdmVVcGRhdGVzKClcIiAoYmx1cik9XCJkaXNhYmxlQXJpYUxpdmVVcGRhdGVzKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtbWFyZ2luLWJvdHRvbS14c1wiIFthdHRyLmFyaWEtbGl2ZV09XCJhcmlhTGl2ZVZhbHVlXCI+XHJcbiAgICAgIDxzcGFuIFtpZF09XCJpZEJhZy5kYXRhTGFiZWxcIj57e2RhdGEubGFiZWx9fTwvc3Bhbj5cclxuXHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiZGF0YS50b29sdGlwQ29udGV4dCAmJiAhZGF0YS50b29sdGlwQ29udGV4dC5saW5rVXJsXCJcclxuICAgICAgICBjbGFzcz1cInNtZS1pY29uIHNtZS1pbmZvLWJ1YmJsZSBzbWUtaWNvbi1pbmZvIHNtZS1wYWRkaW5nLWxlZnQteHhzXCIgW3RpdGxlXT1cImRhdGEudG9vbHRpcENvbnRleHQudGV4dFwiXHJcbiAgICAgICAgW3Rvb2x0aXBab25lXT1cInpvbmVcIiB0YWJpbmRleD1cIjBcIj48L3NwYW4+XHJcblxyXG4gICAgICA8c3BhbiAqbmdJZj1cImRhdGEudG9vbHRpcENvbnRleHQgJiYgZGF0YS50b29sdGlwQ29udGV4dC5saW5rVXJsXCIgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICBjbGFzcz1cInNtZS1pY29uIHNtZS1pbmZvLWJ1YmJsZSBzbWUtaWNvbi1pbmZvIHNtZS1wYWRkaW5nLWxlZnQteHhzXCIgW3NtZVRvb2x0aXBdPVwidGVtcGxhdGVcIlxyXG4gICAgICAgIFtzbWVUb29sdGlwQ29udGV4dF09XCJkYXRhLnRvb2x0aXBDb250ZXh0XCIgW3Rvb2x0aXBab25lXT1cInpvbmVcIj48L3NwYW4+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgbGV0LWRhdGE+XHJcbiAgICAgICAgPGRpdj57e2RhdGEudGV4dH19PC9kaXY+XHJcbiAgICAgICAgPGEgY2xhc3M9XCJzbWUtbGlua1wiIHRhcmdldD1cIl9ibGFua1wiIFtocmVmXT1cImRhdGEubGlua1VybFwiPnt7ZGF0YS5saW5rVGV4dH19PHNwYW5cclxuICAgICAgICAgICAgY2xhc3M9XCJzbWUtaWNvbiBzbWUtaWNvbi1vcGVuSW5OZXdXaW5kb3cgc21lLW1hcmdpbi1sZWZ0LXhzXCI+PC9zcGFuPjwvYT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gICAgPHNwYW4gKm5nSWY9XCIhIWRhdGEuaWNvbkNsYXNzXCIgY2xhc3M9XCJzbWUtbWFyZ2luLXJpZ2h0LXhzIHNtZS1pY29uIHt7ZGF0YS5pY29uQ2xhc3N9fVwiPjwvc3Bhbj5cclxuICAgIDxwIFtpZF09XCJpZEJhZy5kYXRhRGlzcGxheVZhbHVlXCIgY2xhc3M9XCJ7e3RleHRDb2xvckNsYXNzfX0gc21lLWZvbnQtaDJcIlxyXG4gICAgICBbbmdDbGFzc109XCJ7J3NtZS1jb2xvci1hbHQtMzAnOiBkYXRhLmZhZGVkVGV4dH1cIj5cclxuICAgICAgPHNtZS1zdGF0dXMtaWNvbiAqbmdJZj1cImRhdGEuc3RhdHVzICE9PSBudWxsICYmICFkYXRhLmljb25DbGFzcyAmJiBkYXRhLnN0YXR1c1wiXHJcbiAgICAgICAgY2xhc3M9XCJzbWUtbGF5b3V0LWlubGluZS1ibG9jayBzbWUtbWFyZ2luLXJpZ2h0LXh4c1wiIFtzdGF0dXNdPVwiZGF0YS5zdGF0dXNcIiBzaXplPVwiMjRweFwiPjwvc21lLXN0YXR1cy1pY29uPlxyXG4gICAgICB7e2RhdGEuZGlzcGxheVZhbHVlfX1cclxuICAgIDwvcD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==