UNPKG

@taiga-ui/kit

Version:

Taiga UI Angular main components kit

64 lines 19.8 kB
import { ChangeDetectionStrategy, Component, inject, Input } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { TuiControl } from '@taiga-ui/cdk/classes'; import { TuiRepeatTimes } from '@taiga-ui/cdk/directives/repeat-times'; import { tuiFallbackValueProvider } from '@taiga-ui/cdk/tokens'; import { tuiClamp } from '@taiga-ui/cdk/utils/math'; import { TuiIcon } from '@taiga-ui/core/components/icon'; import { PolymorpheusOutlet } from '@taiga-ui/polymorpheus'; import { TUI_RATING_OPTIONS } from './rating.options'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; class TuiRating extends TuiControl { constructor() { super(...arguments); this.options = inject(TUI_RATING_OPTIONS); this.active = 0; this.icon = this.options.icon; this.max = this.options.max; } onKeyDown(event) { if (this.readOnly()) { event.preventDefault(); } } onPointer(delta) { this.active = tuiClamp(this.active + delta, 0, 1); } onClick(value) { if (this.active) { this.onChange(value); } } isActive(index) { return Math.ceil(this.value()) >= this.max - index; } isFraction(index) { return this.value() > this.max - index - 1 && this.value() < this.max - index; } getCut(index) { return this.isFraction(index) ? 100 * Math.max(this.max - index - this.value(), 0) : 0; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiRating, deps: null, target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiRating, isStandalone: true, selector: "tui-rating", inputs: { icon: "icon", max: "max" }, host: { listeners: { "keydown.capture": "onKeyDown($event)", "pointerdown": "onPointer(1)", "pointercancel": "onPointer(-1)", "document:pointerup": "onPointer(-1)" }, properties: { "class._disabled": "disabled()", "class._readonly": "readOnly()", "class._active": "active" } }, providers: [tuiFallbackValueProvider(0)], usesInheritance: true, ngImport: i0, template: "<input\n min=\"1\"\n type=\"range\"\n class=\"t-range\"\n [attr.aria-disabled]=\"readOnly()\"\n [disabled]=\"disabled()\"\n [max]=\"max\"\n [ngModel]=\"value()\"\n [ngModelOptions]=\"{standalone: true}\"\n (blur)=\"onTouched()\"\n (ngModelChange)=\"onChange($event)\"\n/>\n<div class=\"t-items\">\n <div\n *tuiRepeatTimes=\"let index of max\"\n class=\"t-item\"\n [class.t-item_active]=\"isActive(index)\"\n (pointerup)=\"onClick(max - index)\"\n >\n <tui-icon\n *polymorpheusOutlet=\"icon as src; context: {$implicit: max - index, value: value(), filled: false}\"\n class=\"t-icon t-icon_blank\"\n [background]=\"src.toString()\"\n [class.t-icon_fraction]=\"isFraction(index)\"\n [style.--t-cut.%]=\"100 - getCut(index)\"\n />\n <tui-icon\n *polymorpheusOutlet=\"\n icon as src;\n context: {$implicit: max - index, value: value(), filled: max - index - value() < 1}\n \"\n class=\"t-icon\"\n [background]=\"src.toString()\"\n [style.--t-cut.%]=\"getCut(index)\"\n />\n </div>\n</div>\n", styles: [":host{transition-property:color;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;display:block;inline-size:-webkit-fit-content;inline-size:-moz-fit-content;inline-size:fit-content;min-inline-size:-webkit-fit-content;min-inline-size:-moz-fit-content;min-inline-size:fit-content;font-size:1rem;cursor:pointer;-webkit-user-select:none;user-select:none;padding-block-start:2.5em;color:var(--tui-chart-categorical-12);background:var(--tui-text-tertiary) content-box}:host._readonly{pointer-events:none}:host._disabled{pointer-events:none;opacity:var(--tui-disabled-opacity)}.t-range{position:absolute;top:0;left:0;inline-size:100%;block-size:100%;opacity:0;box-sizing:border-box;padding:0 .75em;pointer-events:none}.t-range:focus-visible+.t-items{box-shadow:inset 0 0 0 .125rem var(--tui-border-focus)}.t-items{position:relative;display:flex;flex-direction:row-reverse;margin-block-start:-2.5em;padding-block-start:2.5em;background:inherit}.t-items:hover .t-icon{clip-path:inset(0 0 0 0)}.t-items:hover .t-icon_blank{clip-path:inset(0 0 0 100%)}.t-item{transition-property:transform;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;display:flex;flex:1 0 0;background:inherit;background-clip:content-box;margin-block-start:-2.5em;padding-block-start:2.5em;transition-timing-function:cubic-bezier(.35,1.5,.4,2.5)}.t-item:first-child{max-inline-size:2.5em}.t-item:hover .t-icon,.t-item:hover~.t-item .t-icon,.t-items:not(:hover) .t-item_active .t-icon{background-color:currentColor}.t-items:active .t-item:hover,.t-items:active .t-item:hover~.t-item{transform:scale(.85);transition-duration:var(--tui-duration),calc(var(--tui-duration) / 3);transition-timing-function:ease-in-out}.t-icon{transition-property:background;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;font-size:2.5em;margin-block-start:-1em;background:inherit;clip-path:inset(0 var(--t-cut) 0 0)}:host-context([dir=\"rtl\"]) .t-icon{clip-path:inset(0 0 0 var(--t-cut))}.t-icon ::ng-deep>*{font-size:1rem}.t-icon_blank{position:absolute;top:0;left:0;display:none;margin:0;background:inherit!important;clip-path:inset(0 0 0 var(--t-cut))}:host-context([dir=\"rtl\"]) .t-icon_blank{clip-path:inset(0 var(--t-cut) 0 0)}.t-icon_fraction{display:block}@media (any-pointer: coarse){:host._active .t-item_active{transform:scale(.85);transition-timing-function:ease-in-out}:host:not(._readonly) .t-range{pointer-events:auto}.t-icon{transition:none}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: TuiRepeatTimes, selector: "[tuiRepeatTimes][tuiRepeatTimesOf]", inputs: ["tuiRepeatTimesOf"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiRating }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiRating, decorators: [{ type: Component, args: [{ standalone: true, selector: 'tui-rating', imports: [FormsModule, PolymorpheusOutlet, TuiIcon, TuiRepeatTimes], changeDetection: ChangeDetectionStrategy.OnPush, providers: [tuiFallbackValueProvider(0)], host: { '[class._disabled]': 'disabled()', '[class._readonly]': 'readOnly()', '[class._active]': 'active', '(keydown.capture)': 'onKeyDown($event)', '(pointerdown)': 'onPointer(1)', '(pointercancel)': 'onPointer(-1)', '(document:pointerup)': 'onPointer(-1)', }, template: "<input\n min=\"1\"\n type=\"range\"\n class=\"t-range\"\n [attr.aria-disabled]=\"readOnly()\"\n [disabled]=\"disabled()\"\n [max]=\"max\"\n [ngModel]=\"value()\"\n [ngModelOptions]=\"{standalone: true}\"\n (blur)=\"onTouched()\"\n (ngModelChange)=\"onChange($event)\"\n/>\n<div class=\"t-items\">\n <div\n *tuiRepeatTimes=\"let index of max\"\n class=\"t-item\"\n [class.t-item_active]=\"isActive(index)\"\n (pointerup)=\"onClick(max - index)\"\n >\n <tui-icon\n *polymorpheusOutlet=\"icon as src; context: {$implicit: max - index, value: value(), filled: false}\"\n class=\"t-icon t-icon_blank\"\n [background]=\"src.toString()\"\n [class.t-icon_fraction]=\"isFraction(index)\"\n [style.--t-cut.%]=\"100 - getCut(index)\"\n />\n <tui-icon\n *polymorpheusOutlet=\"\n icon as src;\n context: {$implicit: max - index, value: value(), filled: max - index - value() < 1}\n \"\n class=\"t-icon\"\n [background]=\"src.toString()\"\n [style.--t-cut.%]=\"getCut(index)\"\n />\n </div>\n</div>\n", styles: [":host{transition-property:color;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;display:block;inline-size:-webkit-fit-content;inline-size:-moz-fit-content;inline-size:fit-content;min-inline-size:-webkit-fit-content;min-inline-size:-moz-fit-content;min-inline-size:fit-content;font-size:1rem;cursor:pointer;-webkit-user-select:none;user-select:none;padding-block-start:2.5em;color:var(--tui-chart-categorical-12);background:var(--tui-text-tertiary) content-box}:host._readonly{pointer-events:none}:host._disabled{pointer-events:none;opacity:var(--tui-disabled-opacity)}.t-range{position:absolute;top:0;left:0;inline-size:100%;block-size:100%;opacity:0;box-sizing:border-box;padding:0 .75em;pointer-events:none}.t-range:focus-visible+.t-items{box-shadow:inset 0 0 0 .125rem var(--tui-border-focus)}.t-items{position:relative;display:flex;flex-direction:row-reverse;margin-block-start:-2.5em;padding-block-start:2.5em;background:inherit}.t-items:hover .t-icon{clip-path:inset(0 0 0 0)}.t-items:hover .t-icon_blank{clip-path:inset(0 0 0 100%)}.t-item{transition-property:transform;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;display:flex;flex:1 0 0;background:inherit;background-clip:content-box;margin-block-start:-2.5em;padding-block-start:2.5em;transition-timing-function:cubic-bezier(.35,1.5,.4,2.5)}.t-item:first-child{max-inline-size:2.5em}.t-item:hover .t-icon,.t-item:hover~.t-item .t-icon,.t-items:not(:hover) .t-item_active .t-icon{background-color:currentColor}.t-items:active .t-item:hover,.t-items:active .t-item:hover~.t-item{transform:scale(.85);transition-duration:var(--tui-duration),calc(var(--tui-duration) / 3);transition-timing-function:ease-in-out}.t-icon{transition-property:background;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;font-size:2.5em;margin-block-start:-1em;background:inherit;clip-path:inset(0 var(--t-cut) 0 0)}:host-context([dir=\"rtl\"]) .t-icon{clip-path:inset(0 0 0 var(--t-cut))}.t-icon ::ng-deep>*{font-size:1rem}.t-icon_blank{position:absolute;top:0;left:0;display:none;margin:0;background:inherit!important;clip-path:inset(0 0 0 var(--t-cut))}:host-context([dir=\"rtl\"]) .t-icon_blank{clip-path:inset(0 var(--t-cut) 0 0)}.t-icon_fraction{display:block}@media (any-pointer: coarse){:host._active .t-item_active{transform:scale(.85);transition-timing-function:ease-in-out}:host:not(._readonly) .t-range{pointer-events:auto}.t-icon{transition:none}}\n"] }] }], propDecorators: { icon: [{ type: Input }], max: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0aW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL3JhdGluZy9yYXRpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvcmF0aW5nL3JhdGluZy50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNyRSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTFELE9BQU8sRUFBQyxrQkFBa0IsRUFBd0IsTUFBTSxrQkFBa0IsQ0FBQzs7O0FBRTNFLE1Ba0JhLFNBQVUsU0FBUSxVQUFrQjtJQWxCakQ7O1FBbUJxQixZQUFPLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFNUMsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUdkLFNBQUksR0FBNkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFHbkQsUUFBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO0tBK0JqQztJQTdCYSxTQUFTLENBQUMsS0FBb0I7UUFDcEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQzFCO0lBQ0wsQ0FBQztJQUVTLFNBQVMsQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRVMsT0FBTyxDQUFDLEtBQWE7UUFDM0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4QjtJQUNMLENBQUM7SUFFUyxRQUFRLENBQUMsS0FBYTtRQUM1QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDdkQsQ0FBQztJQUVTLFVBQVUsQ0FBQyxLQUFhO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDbEYsQ0FBQztJQUVTLE1BQU0sQ0FBQyxLQUFhO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDekIsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7K0dBdkNRLFNBQVM7bUdBQVQsU0FBUyxxWEFYUCxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLGlEQ2xCNUMsdXNDQXFDQSx1aUZEdkJjLFdBQVcsNndCQUFFLGtCQUFrQiw4SEFBRSxPQUFPLHFGQUFFLGNBQWM7O1NBZXpELFNBQVM7NEZBQVQsU0FBUztrQkFsQnJCLFNBQVM7aUNBQ00sSUFBSSxZQUNOLFlBQVksV0FDYixDQUFDLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLG1CQUdsRCx1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFDbEM7d0JBQ0YsbUJBQW1CLEVBQUUsWUFBWTt3QkFDakMsbUJBQW1CLEVBQUUsWUFBWTt3QkFDakMsaUJBQWlCLEVBQUUsUUFBUTt3QkFDM0IsbUJBQW1CLEVBQUUsbUJBQW1CO3dCQUN4QyxlQUFlLEVBQUUsY0FBYzt3QkFDL0IsaUJBQWlCLEVBQUUsZUFBZTt3QkFDbEMsc0JBQXNCLEVBQUUsZUFBZTtxQkFDMUM7OEJBUU0sSUFBSTtzQkFEVixLQUFLO2dCQUlDLEdBQUc7c0JBRFQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Zvcm1zTW9kdWxlfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1R1aUNvbnRyb2x9IGZyb20gJ0B0YWlnYS11aS9jZGsvY2xhc3Nlcyc7XG5pbXBvcnQge1R1aVJlcGVhdFRpbWVzfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RpcmVjdGl2ZXMvcmVwZWF0LXRpbWVzJztcbmltcG9ydCB7dHVpRmFsbGJhY2tWYWx1ZVByb3ZpZGVyfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3Rva2Vucyc7XG5pbXBvcnQge3R1aUNsYW1wfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21hdGgnO1xuaW1wb3J0IHtUdWlJY29ufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHtQb2x5bW9ycGhldXNPdXRsZXR9IGZyb20gJ0B0YWlnYS11aS9wb2x5bW9ycGhldXMnO1xuXG5pbXBvcnQge1RVSV9SQVRJTkdfT1BUSU9OUywgdHlwZSBUdWlSYXRpbmdPcHRpb25zfSBmcm9tICcuL3JhdGluZy5vcHRpb25zJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3R1aS1yYXRpbmcnLFxuICAgIGltcG9ydHM6IFtGb3Jtc01vZHVsZSwgUG9seW1vcnBoZXVzT3V0bGV0LCBUdWlJY29uLCBUdWlSZXBlYXRUaW1lc10sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3JhdGluZy50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9yYXRpbmcuc3R5bGUubGVzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW3R1aUZhbGxiYWNrVmFsdWVQcm92aWRlcigwKV0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLl9kaXNhYmxlZF0nOiAnZGlzYWJsZWQoKScsXG4gICAgICAgICdbY2xhc3MuX3JlYWRvbmx5XSc6ICdyZWFkT25seSgpJyxcbiAgICAgICAgJ1tjbGFzcy5fYWN0aXZlXSc6ICdhY3RpdmUnLFxuICAgICAgICAnKGtleWRvd24uY2FwdHVyZSknOiAnb25LZXlEb3duKCRldmVudCknLFxuICAgICAgICAnKHBvaW50ZXJkb3duKSc6ICdvblBvaW50ZXIoMSknLFxuICAgICAgICAnKHBvaW50ZXJjYW5jZWwpJzogJ29uUG9pbnRlcigtMSknLFxuICAgICAgICAnKGRvY3VtZW50OnBvaW50ZXJ1cCknOiAnb25Qb2ludGVyKC0xKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpUmF0aW5nIGV4dGVuZHMgVHVpQ29udHJvbDxudW1iZXI+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnMgPSBpbmplY3QoVFVJX1JBVElOR19PUFRJT05TKTtcblxuICAgIHByb3RlY3RlZCBhY3RpdmUgPSAwO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWNvbjogVHVpUmF0aW5nT3B0aW9uc1snaWNvbiddID0gdGhpcy5vcHRpb25zLmljb247XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtYXggPSB0aGlzLm9wdGlvbnMubWF4O1xuXG4gICAgcHJvdGVjdGVkIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZWFkT25seSgpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uUG9pbnRlcihkZWx0YTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHVpQ2xhbXAodGhpcy5hY3RpdmUgKyBkZWx0YSwgMCwgMSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uQ2xpY2sodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQWN0aXZlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnZhbHVlKCkpID49IHRoaXMubWF4IC0gaW5kZXg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzRnJhY3Rpb24oaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSgpID4gdGhpcy5tYXggLSBpbmRleCAtIDEgJiYgdGhpcy52YWx1ZSgpIDwgdGhpcy5tYXggLSBpbmRleDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Q3V0KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0ZyYWN0aW9uKGluZGV4KVxuICAgICAgICAgICAgPyAxMDAgKiBNYXRoLm1heCh0aGlzLm1heCAtIGluZGV4IC0gdGhpcy52YWx1ZSgpLCAwKVxuICAgICAgICAgICAgOiAwO1xuICAgIH1cbn1cbiIsIjxpbnB1dFxuICAgIG1pbj1cIjFcIlxuICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgY2xhc3M9XCJ0LXJhbmdlXCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInJlYWRPbmx5KClcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICBbbWF4XT1cIm1heFwiXG4gICAgW25nTW9kZWxdPVwidmFsdWUoKVwiXG4gICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgKGJsdXIpPVwib25Ub3VjaGVkKClcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuLz5cbjxkaXYgY2xhc3M9XCJ0LWl0ZW1zXCI+XG4gICAgPGRpdlxuICAgICAgICAqdHVpUmVwZWF0VGltZXM9XCJsZXQgaW5kZXggb2YgbWF4XCJcbiAgICAgICAgY2xhc3M9XCJ0LWl0ZW1cIlxuICAgICAgICBbY2xhc3MudC1pdGVtX2FjdGl2ZV09XCJpc0FjdGl2ZShpbmRleClcIlxuICAgICAgICAocG9pbnRlcnVwKT1cIm9uQ2xpY2sobWF4IC0gaW5kZXgpXCJcbiAgICA+XG4gICAgICAgIDx0dWktaWNvblxuICAgICAgICAgICAgKnBvbHltb3JwaGV1c091dGxldD1cImljb24gYXMgc3JjOyBjb250ZXh0OiB7JGltcGxpY2l0OiBtYXggLSBpbmRleCwgdmFsdWU6IHZhbHVlKCksIGZpbGxlZDogZmFsc2V9XCJcbiAgICAgICAgICAgIGNsYXNzPVwidC1pY29uIHQtaWNvbl9ibGFua1wiXG4gICAgICAgICAgICBbYmFja2dyb3VuZF09XCJzcmMudG9TdHJpbmcoKVwiXG4gICAgICAgICAgICBbY2xhc3MudC1pY29uX2ZyYWN0aW9uXT1cImlzRnJhY3Rpb24oaW5kZXgpXCJcbiAgICAgICAgICAgIFtzdHlsZS4tLXQtY3V0LiVdPVwiMTAwIC0gZ2V0Q3V0KGluZGV4KVwiXG4gICAgICAgIC8+XG4gICAgICAgIDx0dWktaWNvblxuICAgICAgICAgICAgKnBvbHltb3JwaGV1c091dGxldD1cIlxuICAgICAgICAgICAgICAgIGljb24gYXMgc3JjO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHskaW1wbGljaXQ6IG1heCAtIGluZGV4LCB2YWx1ZTogdmFsdWUoKSwgZmlsbGVkOiBtYXggLSBpbmRleCAtIHZhbHVlKCkgPCAxfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwidC1pY29uXCJcbiAgICAgICAgICAgIFtiYWNrZ3JvdW5kXT1cInNyYy50b1N0cmluZygpXCJcbiAgICAgICAgICAgIFtzdHlsZS4tLXQtY3V0LiVdPVwiZ2V0Q3V0KGluZGV4KVwiXG4gICAgICAgIC8+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==