@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
182 lines • 23.8 kB
JavaScript
/**
* © 2025 Visa
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**/
import { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';
import { CommonModule } from '@angular/common';
import { Component, computed, ContentChild, ElementRef, HostBinding, Input, signal, ViewChild } from '@angular/core';
import { AppReadyService } from '../_utilities/services/app-stable-check.service';
import { LabelDirective } from '../label/label.directive';
import * as i0 from "@angular/core";
import * as i1 from "../_utilities/services/app-stable-check.service";
import * as i2 from "@angular/common";
export class CircularProgressComponent {
get hostClasses() {
return [
this.class,
'v-progress',
'v-progress-circular',
this.determinate ? '' : 'v-progress-indeterminate',
this.small ? 'v-progress-circular-small' : '',
this.determinate && this.percentage === 100 ? 'v-progress-complete' : '',
this.invalid ? 'v-progress-error' : ''
].join(' ');
}
/**
* Sets progress to determinate when true.
* @default false
*/
get determinate() {
return this._determinate;
}
set determinate(value) {
this._determinate = coerceBooleanProperty(value);
}
/**
* Sets progress to invalid when true.
* @default false
*/
get invalid() {
return this._invalid;
}
set invalid(value) {
this._invalid = coerceBooleanProperty(value);
}
get hostRole() {
// If role is set, use it
if (this.role) {
return this.role;
}
if (this._determinate) {
return 'progressbar';
}
return null;
}
/**
* Sets the percentage for a <code>determinate</code> circular progress.
* @default 0
*/
get percentage() {
return this._percentage;
}
set percentage(value) {
this._percentage = coerceNumberProperty(value);
this._percentageSignal.set(coerceNumberProperty(value));
}
/**
* Sets progress to small variant when true.
* @default false
*/
get small() {
return this._small;
}
set small(value) {
this._small = coerceBooleanProperty(value);
}
get hostAriaLabelledby() {
return this.ariaLabelledby;
}
constructor(appReadyService) {
this.appReadyService = appReadyService;
this._percentageSignal = signal(this.percentage);
this._initialSize = signal(0); // circumference
this._dashOffset = computed(() => {
if (this._initialSize() > 0) {
return this._initialSize() - this._initialSize() * (this._percentageSignal() * 0.01);
}
else
return 0;
});
/**
* Provides custom class(es) for custom styling.
* @default .v-progress.v-progress-circular
*/
this.class = '';
this._determinate = false;
this._invalid = false;
/**
* Sets custom role.
* @default 'progressbar' when determinate
* @default null when indeterminate
* @builtin true
*/
this.role = null;
this._percentage = 0;
this._small = false;
}
ngAfterContentInit() {
if (this.label) {
this.label.progressLabel = true;
if (!this.ariaLabelledby && this.label.id) {
this.ariaLabelledby = this.label.id;
}
}
}
ngAfterViewInit() {
if (this.progressBar) {
let radius; // default in case isPlatformBrowser fails
// best guess of radius if radius is not available
// by default, small size is 24
// by default, regular size is 48
const defaultSize = this.small ? 48 : 72;
setTimeout(() => {
// .getPropertyValue('r') not working outside of setTimeout
if (this.appReadyService.checkIsPlatformBrowser()) {
radius = parseInt(window.getComputedStyle(this.progressBar.nativeElement).getPropertyValue('r'));
}
// by default, radius is half of the default size minus 4 - the stroke width
radius = isNaN(radius) ? (defaultSize - 4) / 2 : radius;
this._initialSize.set(2 * Math.PI * radius);
}, 0);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CircularProgressComponent, deps: [{ token: i1.AppReadyService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CircularProgressComponent, isStandalone: true, selector: "[v-progress-circular], [v-circular-progress]", inputs: { class: "class", determinate: "determinate", invalid: "invalid", role: "role", percentage: "percentage", small: "small", ariaLabelledby: ["aria-labelledby", "ariaLabelledby"] }, host: { properties: { "class": "this.hostClasses", "attr.role": "this.hostRole", "attr.aria-labelledby": "this.hostAriaLabelledby" } }, queries: [{ propertyName: "label", first: true, predicate: LabelDirective, descendants: true }], viewQueries: [{ propertyName: "progressBar", first: true, predicate: ["progressBar"], descendants: true }], ngImport: i0, template: "<!--\n * \u00A9 2025 Visa\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<svg\n class=\"v-progress-circular-track\"\n [ngClass]=\"{\n 'v-progress-complete': determinate && percentage === 100,\n}\"\n>\n <circle class=\"v-progress-circular-background\">\n </circle>\n <circle\n class=\"v-progress-circular-bar\"\n [style.stroke-dasharray]=\"determinate ? _initialSize() : null\"\n [style.stroke-dashoffset]=\"determinate ? _dashOffset() : null\"\n #progressBar\n >\n </circle>\n</svg>\n<ng-content></ng-content>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CircularProgressComponent, decorators: [{
type: Component,
args: [{ standalone: true, imports: [CommonModule], selector: '[v-progress-circular], [v-circular-progress]', template: "<!--\n * \u00A9 2025 Visa\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<svg\n class=\"v-progress-circular-track\"\n [ngClass]=\"{\n 'v-progress-complete': determinate && percentage === 100,\n}\"\n>\n <circle class=\"v-progress-circular-background\">\n </circle>\n <circle\n class=\"v-progress-circular-bar\"\n [style.stroke-dasharray]=\"determinate ? _initialSize() : null\"\n [style.stroke-dashoffset]=\"determinate ? _dashOffset() : null\"\n #progressBar\n >\n </circle>\n</svg>\n<ng-content></ng-content>" }]
}], ctorParameters: () => [{ type: i1.AppReadyService }], propDecorators: { progressBar: [{
type: ViewChild,
args: ['progressBar', { static: false }]
}], label: [{
type: ContentChild,
args: [LabelDirective]
}], class: [{
type: Input
}], hostClasses: [{
type: HostBinding,
args: ['class']
}], determinate: [{
type: Input
}], invalid: [{
type: Input
}], role: [{
type: Input
}], hostRole: [{
type: HostBinding,
args: ['attr.role']
}], percentage: [{
type: Input
}], small: [{
type: Input
}], ariaLabelledby: [{
type: Input,
args: ['aria-labelledby']
}], hostAriaLabelledby: [{
type: HostBinding,
args: ['attr.aria-labelledby']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lyY3VsYXItcHJvZ3Jlc3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9ub3ZhLWxpYi9zcmMvbGliL2NpcmN1bGFyLXByb2dyZXNzL2NpcmN1bGFyLXByb2dyZXNzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9jaXJjdWxhci1wcm9ncmVzcy9jaXJjdWxhci1wcm9ncmVzcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLG9CQUFvQixFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFDL0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFHTCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNsRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7QUFRMUQsTUFBTSxPQUFPLHlCQUF5QjtJQWlCcEMsSUFDSSxXQUFXO1FBQ2IsT0FBTztZQUNMLElBQUksQ0FBQyxLQUFLO1lBQ1YsWUFBWTtZQUNaLHFCQUFxQjtZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtZQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM3QyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxxQkFB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eUJBQXlCO2tCQU5yQyxTQUFTO2lDQUNJLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiLDhDQUE4QztvRkFZWCxXQUFXO3NCQUF2RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ2IsS0FBSztzQkFBbEMsWUFBWTt1QkFBQyxjQUFjO2dCQU1uQixLQUFLO3NCQUFiLEtBQUs7Z0JBRUYsV0FBVztzQkFEZCxXQUFXO3VCQUFDLE9BQU87Z0JBa0JoQixXQUFXO3NCQURkLEtBQUs7Z0JBY0YsT0FBTztzQkFEVixLQUFLO2dCQWVHLElBQUk7c0JBQVosS0FBSztnQkFFRixRQUFRO3NCQURYLFdBQVc7dUJBQUMsV0FBVztnQkFpQnBCLFVBQVU7c0JBRGIsS0FBSztnQkFlRixLQUFLO3NCQURSLEtBQUs7Z0JBY29CLGNBQWM7c0JBQXZDLEtBQUs7dUJBQUMsaUJBQWlCO2dCQUVwQixrQkFBa0I7c0JBRHJCLFdBQVc7dUJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgICAgICAgICAgICAgwqkgMjAyNSBWaXNhXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiovXG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHksIE51bWJlcklucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgc2lnbmFsLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBcHBSZWFkeVNlcnZpY2UgfSBmcm9tICcuLi9fdXRpbGl0aWVzL3NlcnZpY2VzL2FwcC1zdGFibGUtY2hlY2suc2VydmljZSc7XG5pbXBvcnQgeyBMYWJlbERpcmVjdGl2ZSB9IGZyb20gJy4uL2xhYmVsL2xhYmVsLmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgc2VsZWN0b3I6ICdbdi1wcm9ncmVzcy1jaXJjdWxhcl0sIFt2LWNpcmN1bGFyLXByb2dyZXNzXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaXJjdWxhci1wcm9ncmVzcy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQ2lyY3VsYXJQcm9ncmVzc0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xuICBfcGVyY2VudGFnZVNpZ25hbCA9IHNpZ25hbCh0aGlzLnBlcmNlbnRhZ2UpO1xuICBfaW5pdGlhbFNpemUgPSBzaWduYWwoMCk7IC8vIGNpcmN1bWZlcmVuY2VcbiAgX2Rhc2hPZmZzZXQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKHRoaXMuX2luaXRpYWxTaXplKCkgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW5pdGlhbFNpemUoKSAtIHRoaXMuX2luaXRpYWxTaXplKCkgKiAodGhpcy5fcGVyY2VudGFnZVNpZ25hbCgpICogMC4wMSk7XG4gICAgfSBlbHNlIHJldHVybiAwO1xuICB9KTtcblxuICBAVmlld0NoaWxkKCdwcm9ncmVzc0JhcicsIHsgc3RhdGljOiBmYWxzZSB9KSBwcm9ncmVzc0JhcjogRWxlbWVudFJlZjtcbiAgQENvbnRlbnRDaGlsZChMYWJlbERpcmVjdGl2ZSkgbGFiZWw6IExhYmVsRGlyZWN0aXZlO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjdXN0b20gY2xhc3MmIzQwO2VzJiM0MTsgZm9yIGN1c3RvbSBzdHlsaW5nLlxuICAgKiBAZGVmYXVsdCAudi1wcm9ncmVzcy52LXByb2dyZXNzLWNpcmN1bGFyXG4gICAqL1xuICBASW5wdXQoKSBjbGFzczogc3RyaW5nID0gJyc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzZXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgICd2LXByb2dyZXNzJyxcbiAgICAgICd2LXByb2dyZXNzLWNpcmN1bGFyJyxcbiAgICAgIHRoaXMuZGV0ZXJtaW5hdGUgPyAnJyA6ICd2LXByb2dyZXNzLWluZGV0ZXJtaW5hdGUnLFxuICAgICAgdGhpcy5zbWFsbCA/ICd2LXByb2dyZXNzLWNpcmN1bGFyLXNtYWxsJyA6ICcnLFxuICAgICAgdGhpcy5kZXRlcm1pbmF0ZSAmJiB0aGlzLnBlcmNlbnRhZ2UgPT09IDEwMCA/ICd2LXByb2dyZXNzLWNvbXBsZXRlJyA6ICcnLFxuICAgICAgdGhpcy5pbnZhbGlkID8gJ3YtcHJvZ3Jlc3MtZXJyb3InIDogJydcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHByb2dyZXNzIHRvIGRldGVybWluYXRlIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBkZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGV0ZXJtaW5hdGU7XG4gIH1cbiAgc2V0IGRldGVybWluYXRlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9kZXRlcm1pbmF0ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2RldGVybWluYXRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvZ3Jlc3MgdG8gaW52YWxpZCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgaW52YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW52YWxpZDtcbiAgfVxuICBzZXQgaW52YWxpZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5faW52YWxpZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2ludmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gcm9sZS5cbiAgICogQGRlZmF1bHQgJ3Byb2dyZXNzYmFyJyB3aGVuIGRldGVybWluYXRlXG4gICAqIEBkZWZhdWx0IG51bGwgd2hlbiBpbmRldGVybWluYXRlXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpIHJvbGU6IHN0cmluZyB8IHZvaWQgfCBudWxsID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICBnZXQgaG9zdFJvbGUoKTogc3RyaW5nIHwgdm9pZCB8IG51bGwge1xuICAgIC8vIElmIHJvbGUgaXMgc2V0LCB1c2UgaXRcbiAgICBpZiAodGhpcy5yb2xlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb2xlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGV0ZXJtaW5hdGUpIHtcbiAgICAgIHJldHVybiAncHJvZ3Jlc3NiYXInO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwZXJjZW50YWdlIGZvciBhIDxjb2RlPmRldGVybWluYXRlPC9jb2RlPiBjaXJjdWxhciBwcm9ncmVzcy5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHBlcmNlbnRhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGVyY2VudGFnZTtcbiAgfVxuICBzZXQgcGVyY2VudGFnZSh2YWx1ZTogTnVtYmVySW5wdXQpIHtcbiAgICB0aGlzLl9wZXJjZW50YWdlID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuX3BlcmNlbnRhZ2VTaWduYWwuc2V0KGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKSk7XG4gIH1cbiAgX3BlcmNlbnRhZ2U6IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvZ3Jlc3MgdG8gc21hbGwgdmFyaWFudCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgc21hbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NtYWxsO1xuICB9XG4gIHNldCBzbWFsbCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fc21hbGwgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9zbWFsbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBcmlhIGF0dHJpYnV0ZSBwb2ludGluZyB0byBpZCBvZiBsYWJlbGxpbmcgZWxlbWVudC5cbiAgICogQGRlZmF1bHQgJmx0O2NoaWxkLWxhYmVsLWlkJmd0O1xuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtbGFiZWxsZWRieScpIGFyaWFMYWJlbGxlZGJ5OiBzdHJpbmc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWxhYmVsbGVkYnknKVxuICBnZXQgaG9zdEFyaWFMYWJlbGxlZGJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXJpYUxhYmVsbGVkYnk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcFJlYWR5U2VydmljZTogQXBwUmVhZHlTZXJ2aWNlKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYWJlbCkge1xuICAgICAgdGhpcy5sYWJlbC5wcm9ncmVzc0xhYmVsID0gdHJ1ZTtcblxuICAgICAgaWYgKCF0aGlzLmFyaWFMYWJlbGxlZGJ5ICYmIHRoaXMubGFiZWwuaWQpIHtcbiAgICAgICAgdGhpcy5hcmlhTGFiZWxsZWRieSA9IHRoaXMubGFiZWwuaWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb2dyZXNzQmFyKSB7XG4gICAgICBsZXQgcmFkaXVzOiBudW1iZXI7IC8vIGRlZmF1bHQgaW4gY2FzZSBpc1BsYXRmb3JtQnJvd3NlciBmYWlsc1xuICAgICAgLy8gYmVzdCBndWVzcyBvZiByYWRpdXMgaWYgcmFkaXVzIGlzIG5vdCBhdmFpbGFibGVcbiAgICAgIC8vIGJ5IGRlZmF1bHQsIHNtYWxsIHNpemUgaXMgMjRcbiAgICAgIC8vIGJ5IGRlZmF1bHQsIHJlZ3VsYXIgc2l6ZSBpcyA0OFxuICAgICAgY29uc3QgZGVmYXVsdFNpemUgPSB0aGlzLnNtYWxsID8gNDggOiA3MjtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyAuZ2V0UHJvcGVydHlWYWx1ZSgncicpIG5vdCB3b3JraW5nIG91dHNpZGUgb2Ygc2V0VGltZW91dFxuICAgICAgICBpZiAodGhpcy5hcHBSZWFkeVNlcnZpY2UuY2hlY2tJc1BsYXRmb3JtQnJvd3NlcigpKSB7XG4gICAgICAgICAgcmFkaXVzID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5wcm9ncmVzc0Jhci5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdyJykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGJ5IGRlZmF1bHQsIHJhZGl1cyBpcyBoYWxmIG9mIHRoZSBkZWZhdWx0IHNpemUgbWludXMgNCAtIHRoZSBzdHJva2Ugd2lkdGhcbiAgICAgICAgcmFkaXVzID0gaXNOYU4ocmFkaXVzKSA/IChkZWZhdWx0U2l6ZSAtIDQpIC8gMiA6IHJhZGl1cztcbiAgICAgICAgdGhpcy5faW5pdGlhbFNpemUuc2V0KDIgKiBNYXRoLlBJICogcmFkaXVzKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLVxuICogICAgICAgICAgICAgIMKpIDIwMjUgVmlzYVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuIC0tPlxuPHN2Z1xuICBjbGFzcz1cInYtcHJvZ3Jlc3MtY2lyY3VsYXItdHJhY2tcIlxuICBbbmdDbGFzc109XCJ7XG4gICd2LXByb2dyZXNzLWNvbXBsZXRlJzogZGV0ZXJtaW5hdGUgJiYgcGVyY2VudGFnZSA9PT0gMTAwLFxufVwiXG4+XG4gIDxjaXJjbGUgY2xhc3M9XCJ2LXByb2dyZXNzLWNpcmN1bGFyLWJhY2tncm91bmRcIj5cbiAgPC9jaXJjbGU+XG4gIDxjaXJjbGVcbiAgICBjbGFzcz1cInYtcHJvZ3Jlc3MtY2lyY3VsYXItYmFyXCJcbiAgICBbc3R5bGUuc3Ryb2tlLWRhc2hhcnJheV09XCJkZXRlcm1pbmF0ZSA/IF9pbml0aWFsU2l6ZSgpIDogbnVsbFwiXG4gICAgW3N0eWxlLnN0cm9rZS1kYXNob2Zmc2V0XT1cImRldGVybWluYXRlID8gX2Rhc2hPZmZzZXQoKSA6IG51bGxcIlxuICAgICNwcm9ncmVzc0JhclxuICA+XG4gIDwvY2lyY2xlPlxuPC9zdmc+XG48bmctY29udGVudD48L25nLWNvbnRlbnQ+Il19