UNPKG

carbon-components-angular

Version:
247 lines 19.2 kB
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