carbon-components-angular
Version:
Next generation components
247 lines • 19.2 kB
JavaScript
import { Component, HostBinding, Input, TemplateRef } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "carbon-components-angular/icon";
/**
* Get started with importing the module:
*
* ```typescript
* import { ProgressBarModule } from 'carbon-components-angular';
* ```
*
* [See demo](../../?path=/story/components-progress-bar--basic)
*/
export class ProgressBar {
constructor() {
this.id = `progress-bar-${ProgressBar.progressBarCounter++}`;
this.helperId = `progress-bar-helper-${ProgressBar.progressBarCounter}`;
/**
* Maximum value
*/
this.max = 100;
/**
* Alignment variant of the progress bar, default is `default`
*/
this.type = "default";
/**
* Current status of the progress bar, default is `active`
*/
this.status = "active";
/**
* Size of the progress bar, default is `big`
*/
this.size = "big";
/**
* Set to `true` to visually hide the label while keeping it available to assistive technologies.
*/
this.hideLabel = false;
this.defaultClass = true;
this._value = undefined;
}
/**
* Current value
*/
set value(num) {
this._value = num;
// Validate number
if (num > this.max) {
this._value = this.max;
}
if (num < 0) {
this._value = 0;
}
// Set values based on current state
if (this.isError) {
this._value = 0;
}
else if (this.isFinished) {
this._value = this.max;
}
}
get value() {
return this._value;
}
get percentage() {
return `scaleX(${this.value / this.max})`;
}
// Size
get bigBar() {
return this.size === "big";
}
get smallBar() {
return this.size === "small";
}
// Type
get defaultType() {
return this.type === "default";
}
get indentedType() {
return this.type === "indented";
}
get inlineType() {
return this.type === "inline";
}
// Status
get isFinished() {
return this.status === "finished";
}
get isError() {
return this.status === "error";
}
get indeterminate() {
return this.value === undefined && !this.isFinished && !this.isError;
}
isTemplate(value) {
return value instanceof TemplateRef;
}
}
ProgressBar.progressBarCounter = 0;
ProgressBar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ProgressBar, deps: [], target: i0.ɵɵFactoryTarget.Component });
ProgressBar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ProgressBar, selector: "cds-progress-bar, ibm-progress-bar", inputs: { value: "value", id: "id", label: "label", helperText: "helperText", max: "max", type: "type", status: "status", size: "size", hideLabel: "hideLabel" }, host: { properties: { "class.cds--progress-bar--big": "this.bigBar", "class.cds--progress-bar--small": "this.smallBar", "class.cds--progress-bar--default": "this.defaultType", "class.cds--progress-bar--indented": "this.indentedType", "class.cds--progress-bar--inline": "this.inlineType", "class.cds--progress-bar--finished": "this.isFinished", "class.cds--progress-bar--error": "this.isError", "class.cds--progress-bar--indeterminate": "this.indeterminate", "class.cds--progress-bar": "this.defaultClass" } }, ngImport: i0, template: `
<div
*ngIf="label"
class="cds--progress-bar__label"
[ngClass]="{'cds--visually-hidden': hideLabel}"
[id]="id">
<span class="cds--progress-bar__label-text">
<ng-container *ngIf="!isTemplate(label)">{{label}}</ng-container>
<ng-template *ngIf="isTemplate(label)" [ngTemplateOutlet]="label"></ng-template>
</span>
<svg
*ngIf="isFinished"
fill="currentColor"
cdsIcon="checkmark--filled"
class="cds--progress-bar__status-icon">
</svg>
<svg
*ngIf="isError"
fill="currentColor"
cdsIcon="error--filled"
class="cds--progress-bar__status-icon">
</svg>
</div>
<div
class="cds--progress-bar__track"
role="progressbar"
[attr.aria-busy]="!isFinished"
[attr.aria-invalid]="isError"
[attr.aria-labelledby]="id"
[attr.aria-describedby]="helperText ? helperId : null"
[attr.aria-valuemin]="!indeterminate ? 0 : null"
[attr.aria-valuemax]="!indeterminate ? max : null"
[attr.aria-valuenow]="!indeterminate ? value : null">
<div
class="cds--progress-bar__bar"
[ngStyle]="{
'transform': !isFinished && !isError ? percentage : null
}">
</div>
</div>
<div
[id]="helperId"
*ngIf="helperText"
class="cds--progress-bar__helper-text">
<ng-container *ngIf="!isTemplate(helperText)">{{helperText}}</ng-container>
<ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ProgressBar, decorators: [{
type: Component,
args: [{
selector: "cds-progress-bar, ibm-progress-bar",
template: `
<div
*ngIf="label"
class="cds--progress-bar__label"
[ngClass]="{'cds--visually-hidden': hideLabel}"
[id]="id">
<span class="cds--progress-bar__label-text">
<ng-container *ngIf="!isTemplate(label)">{{label}}</ng-container>
<ng-template *ngIf="isTemplate(label)" [ngTemplateOutlet]="label"></ng-template>
</span>
<svg
*ngIf="isFinished"
fill="currentColor"
cdsIcon="checkmark--filled"
class="cds--progress-bar__status-icon">
</svg>
<svg
*ngIf="isError"
fill="currentColor"
cdsIcon="error--filled"
class="cds--progress-bar__status-icon">
</svg>
</div>
<div
class="cds--progress-bar__track"
role="progressbar"
[attr.aria-busy]="!isFinished"
[attr.aria-invalid]="isError"
[attr.aria-labelledby]="id"
[attr.aria-describedby]="helperText ? helperId : null"
[attr.aria-valuemin]="!indeterminate ? 0 : null"
[attr.aria-valuemax]="!indeterminate ? max : null"
[attr.aria-valuenow]="!indeterminate ? value : null">
<div
class="cds--progress-bar__bar"
[ngStyle]="{
'transform': !isFinished && !isError ? percentage : null
}">
</div>
</div>
<div
[id]="helperId"
*ngIf="helperText"
class="cds--progress-bar__helper-text">
<ng-container *ngIf="!isTemplate(helperText)">{{helperText}}</ng-container>
<ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template>
</div>
`
}]
}], propDecorators: { value: [{
type: Input
}], bigBar: [{
type: HostBinding,
args: ["class.cds--progress-bar--big"]
}], smallBar: [{
type: HostBinding,
args: ["class.cds--progress-bar--small"]
}], defaultType: [{
type: HostBinding,
args: ["class.cds--progress-bar--default"]
}], indentedType: [{
type: HostBinding,
args: ["class.cds--progress-bar--indented"]
}], inlineType: [{
type: HostBinding,
args: ["class.cds--progress-bar--inline"]
}], isFinished: [{
type: HostBinding,
args: ["class.cds--progress-bar--finished"]
}], isError: [{
type: HostBinding,
args: ["class.cds--progress-bar--error"]
}], indeterminate: [{
type: HostBinding,
args: ["class.cds--progress-bar--indeterminate"]
}], id: [{
type: Input
}], label: [{
type: Input
}], helperText: [{
type: Input
}], max: [{
type: Input
}], type: [{
type: Input
}], status: [{
type: Input
}], size: [{
type: Input
}], hideLabel: [{
type: Input
}], defaultClass: [{
type: HostBinding,
args: ["class.cds--progress-bar"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MtYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcm9ncmVzcy1iYXIvcHJvZ3Jlc3MtYmFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDWCxLQUFLLEVBQ0wsV0FBVyxFQUNYLE1BQU0sZUFBZSxDQUFDOzs7O0FBRXZCOzs7Ozs7OztHQVFHO0FBb0RILE1BQU0sT0FBTyxXQUFXO0lBbkR4QjtRQTRHVSxPQUFFLEdBQUcsZ0JBQWdCLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7UUFDakUsYUFBUSxHQUFHLHVCQUF1QixXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQVNuRTs7V0FFRztRQUNNLFFBQUcsR0FBRyxHQUFHLENBQUM7UUFDbkI7O1dBRUc7UUFDTSxTQUFJLEdBQXNDLFNBQVMsQ0FBQztRQUM3RDs7V0FFRztRQUNNLFdBQU0sR0FBb0MsUUFBUSxDQUFDO1FBQzVEOztXQUVHO1FBQ00sU0FBSSxHQUFvQixLQUFLLENBQUM7UUFFdkM7O1dBRUc7UUFDTSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWEsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEQsV0FBTSxHQUFHLFNBQVMsQ0FBQztLQUszQjtJQTlGQTs7T0FFRztJQUNILElBQWEsS0FBSyxDQUFDLEdBQXVCO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLGtCQUFrQjtRQUNsQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUN2QjtRQUNELElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtZQUNaLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ2hCO1FBQ0Qsb0NBQW9DO1FBQ3BDLElBQUksSUFB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aW5kaW5nLFxuXHRJbnB1dCxcblx0VGVtcGxhdGVSZWZcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuLyoqXG4gKiBHZXQgc3RhcnRlZCB3aXRoIGltcG9ydGluZyB0aGUgbW9kdWxlOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG4gKiBgYGBcbiAqXG4gKiBbU2VlIGRlbW9dKC4uLy4uLz9wYXRoPS9zdG9yeS9jb21wb25lbnRzLXByb2dyZXNzLWJhci0tYmFzaWMpXG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJjZHMtcHJvZ3Jlc3MtYmFyLCBpYm0tcHJvZ3Jlc3MtYmFyXCIsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PGRpdlxuXHRcdFx0Km5nSWY9XCJsYWJlbFwiXG5cdFx0XHRjbGFzcz1cImNkcy0tcHJvZ3Jlc3MtYmFyX19sYWJlbFwiXG5cdFx0XHRbbmdDbGFzc109XCJ7J2Nkcy0tdmlzdWFsbHktaGlkZGVuJzogaGlkZUxhYmVsfVwiXG5cdFx0XHRbaWRdPVwiaWRcIj5cblx0XHRcdDxzcGFuIGNsYXNzPVwiY2RzLS1wcm9ncmVzcy1iYXJfX2xhYmVsLXRleHRcIj5cblx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGxhYmVsKVwiPnt7bGFiZWx9fTwvbmctY29udGFpbmVyPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGxhYmVsKVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDwvc3Bhbj5cblx0XHRcdDxzdmdcblx0XHRcdFx0Km5nSWY9XCJpc0ZpbmlzaGVkXCJcblx0XHRcdFx0ZmlsbD1cImN1cnJlbnRDb2xvclwiXG5cdFx0XHRcdGNkc0ljb249XCJjaGVja21hcmstLWZpbGxlZFwiXG5cdFx0XHRcdGNsYXNzPVwiY2RzLS1wcm9ncmVzcy1iYXJfX3N0YXR1cy1pY29uXCI+XG5cdFx0XHQ8L3N2Zz5cblx0XHRcdDxzdmdcblx0XHRcdFx0Km5nSWY9XCJpc0Vycm9yXCJcblx0XHRcdFx0ZmlsbD1cImN1cnJlbnRDb2xvclwiXG5cdFx0XHRcdGNkc0ljb249XCJlcnJvci0tZmlsbGVkXCJcblx0XHRcdFx0Y2xhc3M9XCJjZHMtLXByb2dyZXNzLWJhcl9fc3RhdHVzLWljb25cIj5cblx0XHRcdDwvc3ZnPlxuXHRcdDwvZGl2PlxuXHRcdDxkaXZcblx0XHRcdGNsYXNzPVwiY2RzLS1wcm9ncmVzcy1iYXJfX3RyYWNrXCJcblx0XHRcdHJvbGU9XCJwcm9ncmVzc2JhclwiXG5cdFx0XHRbYXR0ci5hcmlhLWJ1c3ldPVwiIWlzRmluaXNoZWRcIlxuXHRcdFx0W2F0dHIuYXJpYS1pbnZhbGlkXT1cImlzRXJyb3JcIlxuXHRcdFx0W2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlkXCJcblx0XHRcdFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiaGVscGVyVGV4dCA/IGhlbHBlcklkIDogbnVsbFwiXG5cdFx0XHRbYXR0ci5hcmlhLXZhbHVlbWluXT1cIiFpbmRldGVybWluYXRlID8gMCA6IG51bGxcIlxuXHRcdFx0W2F0dHIuYXJpYS12YWx1ZW1heF09XCIhaW5kZXRlcm1pbmF0ZSA/IG1heCA6IG51bGxcIlxuXHRcdFx0W2F0dHIuYXJpYS12YWx1ZW5vd109XCIhaW5kZXRlcm1pbmF0ZSA/IHZhbHVlIDogbnVsbFwiPlxuXHRcdFx0PGRpdlxuXHRcdFx0XHRjbGFzcz1cImNkcy0tcHJvZ3Jlc3MtYmFyX19iYXJcIlxuXHRcdFx0XHRbbmdTdHlsZV09XCJ7XG5cdFx0XHRcdFx0J3RyYW5zZm9ybSc6ICFpc0ZpbmlzaGVkICYmICFpc0Vycm9yID8gcGVyY2VudGFnZSA6IG51bGxcblx0XHRcdFx0fVwiPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdlxuXHRcdFx0W2lkXT1cImhlbHBlcklkXCJcblx0XHRcdCpuZ0lmPVwiaGVscGVyVGV4dFwiXG5cdFx0XHRjbGFzcz1cImNkcy0tcHJvZ3Jlc3MtYmFyX19oZWxwZXItdGV4dFwiPlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGhlbHBlclRleHQpXCI+e3toZWxwZXJUZXh0fX08L25nLWNvbnRhaW5lcj5cblx0XHRcdDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUoaGVscGVyVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWxwZXJUZXh0XCI+PC9uZy10ZW1wbGF0ZT5cblx0XHQ8L2Rpdj5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBQcm9ncmVzc0JhciB7XG5cdC8qKlxuXHQgKiBDdXJyZW50IHZhbHVlXG5cdCAqL1xuXHRASW5wdXQoKSBzZXQgdmFsdWUobnVtOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcblx0XHR0aGlzLl92YWx1ZSA9IG51bTtcblx0XHQvLyBWYWxpZGF0ZSBudW1iZXJcblx0XHRpZiAobnVtID4gdGhpcy5tYXgpIHtcblx0XHRcdHRoaXMuX3ZhbHVlID0gdGhpcy5tYXg7XG5cdFx0fVxuXHRcdGlmIChudW0gPCAwKSB7XG5cdFx0XHR0aGlzLl92YWx1ZSA9IDA7XG5cdFx0fVxuXHRcdC8vIFNldCB2YWx1ZXMgYmFzZWQgb24gY3VycmVudCBzdGF0ZVxuXHRcdGlmICh0aGlzLmlzRXJyb3IpIHtcblx0XHRcdHRoaXMuX3ZhbHVlID0gMDtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNGaW5pc2hlZCkge1xuXHRcdFx0dGhpcy5fdmFsdWUgPSB0aGlzLm1heDtcblx0XHR9XG5cdH1cblxuXHRnZXQgdmFsdWUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3ZhbHVlO1xuXHR9XG5cblx0Z2V0IHBlcmNlbnRhZ2UoKSB7XG5cdFx0cmV0dXJuIGBzY2FsZVgoJHt0aGlzLnZhbHVlIC8gdGhpcy5tYXh9KWA7XG5cdH1cblx0Ly8gU2l6ZVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLXByb2dyZXNzLWJhci0tYmlnXCIpIGdldCBiaWdCYXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2l6ZSA9PT0gXCJiaWdcIjtcblx0fVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLXByb2dyZXNzLWJhci0tc21hbGxcIikgZ2V0IHNtYWxsQmFyKCkge1xuXHRcdHJldHVybiB0aGlzLnNpemUgPT09IFwic21hbGxcIjtcblx0fVxuXHQvLyBUeXBlXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tcHJvZ3Jlc3MtYmFyLS1kZWZhdWx0XCIpIGdldCBkZWZhdWx0VHlwZSgpIHtcblx0XHRyZXR1cm4gdGhpcy50eXBlID09PSBcImRlZmF1bHRcIjtcblx0fVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLXByb2dyZXNzLWJhci0taW5kZW50ZWRcIikgZ2V0IGluZGVudGVkVHlwZSgpIHtcblx0XHRyZXR1cm4gdGhpcy50eXBlID09PSBcImluZGVudGVkXCI7XG5cdH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1wcm9ncmVzcy1iYXItLWlubGluZVwiKSBnZXQgaW5saW5lVHlwZSgpIHtcblx0XHRyZXR1cm4gdGhpcy50eXBlID09PSBcImlubGluZVwiO1xuXHR9XG5cdC8vIFN0YXR1c1xuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLXByb2dyZXNzLWJhci0tZmluaXNoZWRcIikgZ2V0IGlzRmluaXNoZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc3RhdHVzID09PSBcImZpbmlzaGVkXCI7XG5cdH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1wcm9ncmVzcy1iYXItLWVycm9yXCIpIGdldCBpc0Vycm9yKCkge1xuXHRcdHJldHVybiB0aGlzLnN0YXR1cyA9PT0gXCJlcnJvclwiO1xuXHR9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tcHJvZ3Jlc3MtYmFyLS1pbmRldGVybWluYXRlXCIpIGdldCBpbmRldGVybWluYXRlKCkge1xuXHRcdHJldHVybiB0aGlzLnZhbHVlID09PSB1bmRlZmluZWQgJiYgIXRoaXMuaXNGaW5pc2hlZCAmJiAhdGhpcy5pc0Vycm9yO1xuXHR9XG5cdHN0YXRpYyBwcm9ncmVzc0JhckNvdW50ZXIgPSAwO1xuXG5cdEBJbnB1dCgpIGlkID0gYHByb2dyZXNzLWJhci0ke1Byb2dyZXNzQmFyLnByb2dyZXNzQmFyQ291bnRlcisrfWA7XG5cdGhlbHBlcklkID0gYHByb2dyZXNzLWJhci1oZWxwZXItJHtQcm9ncmVzc0Jhci5wcm9ncmVzc0JhckNvdW50ZXJ9YDtcblx0LyoqXG5cdCAqIERlc2NyaXB0aW9uIG9mIHRoZSBwcm9ncmVzcyBiYXJcblx0ICovXG5cdEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuXHQvKipcblx0ICogQ3VycmVudCBwcm9ncmVzcyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHRASW5wdXQoKSBoZWxwZXJUZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuXHQvKipcblx0ICogTWF4aW11bSB2YWx1ZVxuXHQgKi9cblx0QElucHV0KCkgbWF4ID0gMTAwO1xuXHQvKipcblx0ICogQWxpZ25tZW50IHZhcmlhbnQgb2YgdGhlIHByb2dyZXNzIGJhciwgZGVmYXVsdCBpcyBgZGVmYXVsdGBcblx0ICovXG5cdEBJbnB1dCgpIHR5cGU6IFwiZGVmYXVsdFwiIHwgXCJpbmxpbmVcIiB8IFwiaW5kZW50ZWRcIiA9IFwiZGVmYXVsdFwiO1xuXHQvKipcblx0ICogQ3VycmVudCBzdGF0dXMgb2YgdGhlIHByb2dyZXNzIGJhciwgZGVmYXVsdCBpcyBgYWN0aXZlYFxuXHQgKi9cblx0QElucHV0KCkgc3RhdHVzOiBcImFjdGl2ZVwiIHwgXCJmaW5pc2hlZFwiIHwgXCJlcnJvclwiID0gXCJhY3RpdmVcIjtcblx0LyoqXG5cdCAqIFNpemUgb2YgdGhlIHByb2dyZXNzIGJhciwgZGVmYXVsdCBpcyBgYmlnYFxuXHQgKi9cblx0QElucHV0KCkgc2l6ZTogXCJzbWFsbFwiIHwgXCJiaWdcIiA9IFwiYmlnXCI7XG5cblx0LyoqXG5cdCAqIFNldCB0byBgdHJ1ZWAgdG8gdmlzdWFsbHkgaGlkZSB0aGUgbGFiZWwgd2hpbGUga2VlcGluZyBpdCBhdmFpbGFibGUgdG8gYXNzaXN0aXZlIHRlY2hub2xvZ2llcy5cblx0ICovXG5cdEBJbnB1dCgpIGhpZGVMYWJlbCA9IGZhbHNlO1xuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tcHJvZ3Jlc3MtYmFyXCIpIGRlZmF1bHRDbGFzcyA9IHRydWU7XG5cdHByaXZhdGUgX3ZhbHVlID0gdW5kZWZpbmVkO1xuXG5cdGlzVGVtcGxhdGUodmFsdWUpIHtcblx0XHRyZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcblx0fVxufVxuIl19