@crediblefinance/credible-ui
Version:
Credible's standard UI library
148 lines • 34.6 kB
JavaScript
import { Component, Output, EventEmitter, Input } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';
import Dropdown from '../models/Dropdown';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../directives/precision-directive";
import * as i3 from "@angular/forms";
import * as i4 from "@angular/material/select";
import * as i5 from "@angular/material/core";
export class CfInputCurrencyDropdownComponent {
// for dropdown
options = [];
currencyChanged = new EventEmitter();
label = '';
name;
id = null;
showLabel = true;
dark = false;
selected = '';
disabled = false;
// for input
value = 0;
type = 'number';
readonly = false;
placeholder = '';
precision = 8;
precisionType = 'decimal';
valueChanged = new EventEmitter();
currentSelected = new Dropdown();
formGroup;
inputControl;
currencyControl;
theme = 'dark';
// HTML helpers
objectFn = Object;
constructor() {
if (!this.inputControl && !this.formGroup && !this.currencyControl) {
this.formGroup = new FormGroup({});
this.inputControl = new FormControl('');
this.currencyControl = new FormControl('');
}
}
ngOnInit() {
}
ngOnChanges(changes) {
if (changes.value) {
const currentValue = changes.value.currentValue.toString();
if (this.type === 'number' && currentValue.includes('.')) {
const str = currentValue.split('.');
this.value = str[0] + '.' + str[1].slice(0, this.precision);
}
this.inputControl.setValue(this.value);
}
if (changes.selected && changes.selected.currentValue) {
this.setDefaultSingleSelection();
}
if (changes.options && changes.options.currentValue) {
this.setDefaultSingleSelection();
}
}
setDefaultSingleSelection() {
if (!this.options || this.options.length === 0)
return;
if (typeof this.selected === 'string') {
const index = this.validOption(this.selected);
if (index === -1) {
if (this.currencyControl.value && this.getCurrentSelectedOption(this.currencyControl.value))
this.currentSelected = this.getCurrentSelectedOption(this.currencyControl.value);
else
this.currentSelected = this.options[0];
}
else
this.currentSelected = this.options[index];
}
else
this.currentSelected = this.options[0];
this.currencyControl.setValue(this.currentSelected.value);
}
validOption(value) {
if (value === '')
return -1;
for (let i = 0; i < this.options.length; i++) {
if (this.options[i].value === value)
return i;
}
return -1;
}
changeDropdown(matSelectChange) {
const currentSelected = this.getCurrentSelectedOption(matSelectChange.value);
if (currentSelected) {
this.currentSelected = currentSelected;
this.currencyChanged.emit(this.currentSelected);
}
}
getCurrentSelectedOption(value) {
return this.options.find((x) => x.value === value);
}
valueChangedHandler($event) {
this.valueChanged.emit($event.target.value);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: CfInputCurrencyDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.9", type: CfInputCurrencyDropdownComponent, selector: "cf-input-currency-dropdown", inputs: { options: "options", label: "label", name: "name", id: "id", showLabel: "showLabel", dark: "dark", selected: "selected", disabled: "disabled", value: "value", type: "type", readonly: "readonly", placeholder: "placeholder", precision: "precision", precisionType: "precisionType", formGroup: "formGroup", inputControl: "inputControl", currencyControl: "currencyControl", theme: "theme" }, outputs: { currencyChanged: "currencyChanged", valueChanged: "valueChanged" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cf-input-currency-dropdown container\" [ngClass]=\"theme\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <div *ngIf=\"showLabel\">\n <label class=\"label\">{{ label }}</label>\n </div>\n <div [class.error]=\"\n (inputControl.invalid && inputControl.touched) ||\n (currencyControl.invalid && currencyControl.touched)\n \" class=\"holder\" [formGroup]=\"formGroup\">\n <div class=\"input-holder\">\n <input [type]=\"type\" [readonly]=\"readonly\" [formControl]=\"inputControl\" class=\"value-span\"\n [placeholder]=\"placeholder\" [value]=\"value\" (keyup)=\"valueChangedHandler($event)\" [id]=\"id\"\n PrecisionDirective [precision]=\"precision\" [precisionType]=\"precisionType\" />\n </div>\n <div class=\"dropdown-holder\" [ngClass]=\"{ dark: dark }\">\n <mat-select matNativeControl [formControl]=\"currencyControl\"\n [panelClass]=\"['cf-overlay-input-dropdown-child-pane', theme]\" (selectionChange)=\"changeDropdown($event)\"\n [ngClass]=\"{ dark: dark }\" [disabled]=\"disabled\">\n <mat-select-trigger style=\"display: flex; align-items: center;\">\n <img [src]=\"currentSelected.logo\" [alt]=\"currentSelected.label\" width=\"25\"\n style=\"margin-right: 0.5rem\" />\n <span class=\"selected-option-text\">{{\n currentSelected.value | uppercase\n }}</span>\n </mat-select-trigger>\n <mat-option [value]=\"item.value\" *ngFor=\"let item of options\">\n <img [src]=\"item.logo\" [alt]=\"item.label\" width=\"25\" />\n {{ item.label }}\n </mat-option>\n </mat-select>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-danger\" *ngIf=\"inputControl.errors && inputControl.touched\">\n {{ inputControl.errors[objectFn.keys(inputControl.errors)[0]] }}\n </div>\n <div class=\"text-danger\" *ngIf=\"\n currencyControl.errors &&\n currencyControl.touched &&\n !inputControl.errors\n \">\n {{ currencyControl.errors[objectFn.keys(currencyControl.errors)[0]] }}\n </div>\n</div>", styles: [".cf-input-currency-dropdown{padding:0;height:max-content;margin-left:auto;margin-right:auto}.cf-input-currency-dropdown .label{font-weight:700;font-size:.8rem;margin-bottom:3px}.cf-input-currency-dropdown .error{border:.5px solid #dc3545!important}.cf-input-currency-dropdown .error .dropdown-holder{border-left:1px solid #dc3545!important}.cf-input-currency-dropdown .holder{border:.5px solid grey;border-radius:9px;padding:11.25px .5rem 11.25px 1rem;display:flex;justify-content:space-between}.cf-input-currency-dropdown .holder .input-holder{display:flex;justify-content:space-between;width:100%}.cf-input-currency-dropdown .holder .input-holder span{border:none;width:100%;display:block;overflow-x:auto}.cf-input-currency-dropdown .holder .input-holder input{border:none;width:100%;font-size:1rem}.cf-input-currency-dropdown .holder .dropdown-holder{display:flex;justify-content:center;border-left:1px solid grey;padding-left:.5rem;min-width:100px}.cf-input-currency-dropdown .holder .dropdown-holder.dark{border:none}.cf-input-currency-dropdown .holder .dropdown-holder .selected-option-text{color:gray;font-size:.9rem}.dark .mat-select-arrow{color:#cf0}mat-select-trigger,.mat-select-trigger{width:max-content}@media only screen and (max-width: 500px){.cf-input-currency-dropdown{font-size:1rem}.label,input{font-size:1rem!important}::ng-deep .cf-input-currency-dropdown .mat-select-arrow{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid}}button:focus,input:focus,select:focus,textarea:focus{outline:none}input:-webkit-autofill,input:-webkit-autofill:active,input:-webkit-autofill:focus,input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 30px white inset!important}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield}.cf-input-currency-dropdown.dark .label{color:#fff}.cf-input-currency-dropdown.dark .holder{background:#24252B}.cf-input-currency-dropdown.dark .holder .input-holder input{background:#24252B;color:#fff}::ng-deep .cf-overlay-input-dropdown-parent-pane{min-width:max-content!important}::ng-deep .cf-overlay-input-dropdown-child-pane .mdc-list-item{width:max-content}::ng-deep .cf-overlay-input-dropdown-child-pane .mat-mdc-option-pseudo-checkbox{display:none}::ng-deep .cf-overlay-input-dropdown-child-pane.dark .mdc-list-item__primary-text{color:#000!important;width:max-content}::ng-deep .cf-overlay-input-dropdown-child-pane .mat-mdc-select{display:grid!important}::ng-deep .cf-input-currency-dropdown .dark .mat-mdc-select-arrow{color:#fff}.cf-input-currency-dropdown.light .mat-mdc-select-arrow,.cf-input-currency-dropdown.dark .mat-mdc-select-arrow{color:gray}.cf-input-currency-dropdown .mat-mdc-select{display:grid!important}::ng-deep .mat-mdc-option-active{width:100%}::ng-deep .cf-overlay-input-dropdown-child-pane.light .mdc-list-item__primary-text{width:100%;display:flex;gap:.5rem;align-items:center;color:#000!important}::ng-deep .cf-overlay-input-dropdown-child-pane .mat-mdc-option-active{width:100%}::ng-deep .cf-overlay-input-dropdown-child-pane .mat-mdc-option-active .mdc-list-item__primary-text{font-weight:700!important;display:flex;gap:.5rem;align-items:center;color:#000!important}::ng-deep .cf-overlay-input-dropdown-child-pane.dark{background-color:#1d1e22}::ng-deep .cf-overlay-input-dropdown-child-pane.light{background-color:#fff}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.PrecisionDirective, selector: "[PrecisionDirective]", inputs: ["precision", "type", "precisionType"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "aria-describedby", "panelClass", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i4.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: CfInputCurrencyDropdownComponent, decorators: [{
type: Component,
args: [{ selector: 'cf-input-currency-dropdown', template: "<div class=\"cf-input-currency-dropdown container\" [ngClass]=\"theme\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <div *ngIf=\"showLabel\">\n <label class=\"label\">{{ label }}</label>\n </div>\n <div [class.error]=\"\n (inputControl.invalid && inputControl.touched) ||\n (currencyControl.invalid && currencyControl.touched)\n \" class=\"holder\" [formGroup]=\"formGroup\">\n <div class=\"input-holder\">\n <input [type]=\"type\" [readonly]=\"readonly\" [formControl]=\"inputControl\" class=\"value-span\"\n [placeholder]=\"placeholder\" [value]=\"value\" (keyup)=\"valueChangedHandler($event)\" [id]=\"id\"\n PrecisionDirective [precision]=\"precision\" [precisionType]=\"precisionType\" />\n </div>\n <div class=\"dropdown-holder\" [ngClass]=\"{ dark: dark }\">\n <mat-select matNativeControl [formControl]=\"currencyControl\"\n [panelClass]=\"['cf-overlay-input-dropdown-child-pane', theme]\" (selectionChange)=\"changeDropdown($event)\"\n [ngClass]=\"{ dark: dark }\" [disabled]=\"disabled\">\n <mat-select-trigger style=\"display: flex; align-items: center;\">\n <img [src]=\"currentSelected.logo\" [alt]=\"currentSelected.label\" width=\"25\"\n style=\"margin-right: 0.5rem\" />\n <span class=\"selected-option-text\">{{\n currentSelected.value | uppercase\n }}</span>\n </mat-select-trigger>\n <mat-option [value]=\"item.value\" *ngFor=\"let item of options\">\n <img [src]=\"item.logo\" [alt]=\"item.label\" width=\"25\" />\n {{ item.label }}\n </mat-option>\n </mat-select>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-danger\" *ngIf=\"inputControl.errors && inputControl.touched\">\n {{ inputControl.errors[objectFn.keys(inputControl.errors)[0]] }}\n </div>\n <div class=\"text-danger\" *ngIf=\"\n currencyControl.errors &&\n currencyControl.touched &&\n !inputControl.errors\n \">\n {{ currencyControl.errors[objectFn.keys(currencyControl.errors)[0]] }}\n </div>\n</div>", styles: [".cf-input-currency-dropdown{padding:0;height:max-content;margin-left:auto;margin-right:auto}.cf-input-currency-dropdown .label{font-weight:700;font-size:.8rem;margin-bottom:3px}.cf-input-currency-dropdown .error{border:.5px solid #dc3545!important}.cf-input-currency-dropdown .error .dropdown-holder{border-left:1px solid #dc3545!important}.cf-input-currency-dropdown .holder{border:.5px solid grey;border-radius:9px;padding:11.25px .5rem 11.25px 1rem;display:flex;justify-content:space-between}.cf-input-currency-dropdown .holder .input-holder{display:flex;justify-content:space-between;width:100%}.cf-input-currency-dropdown .holder .input-holder span{border:none;width:100%;display:block;overflow-x:auto}.cf-input-currency-dropdown .holder .input-holder input{border:none;width:100%;font-size:1rem}.cf-input-currency-dropdown .holder .dropdown-holder{display:flex;justify-content:center;border-left:1px solid grey;padding-left:.5rem;min-width:100px}.cf-input-currency-dropdown .holder .dropdown-holder.dark{border:none}.cf-input-currency-dropdown .holder .dropdown-holder .selected-option-text{color:gray;font-size:.9rem}.dark .mat-select-arrow{color:#cf0}mat-select-trigger,.mat-select-trigger{width:max-content}@media only screen and (max-width: 500px){.cf-input-currency-dropdown{font-size:1rem}.label,input{font-size:1rem!important}::ng-deep .cf-input-currency-dropdown .mat-select-arrow{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid}}button:focus,input:focus,select:focus,textarea:focus{outline:none}input:-webkit-autofill,input:-webkit-autofill:active,input:-webkit-autofill:focus,input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 30px white inset!important}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield}.cf-input-currency-dropdown.dark .label{color:#fff}.cf-input-currency-dropdown.dark .holder{background:#24252B}.cf-input-currency-dropdown.dark .holder .input-holder input{background:#24252B;color:#fff}::ng-deep .cf-overlay-input-dropdown-parent-pane{min-width:max-content!important}::ng-deep .cf-overlay-input-dropdown-child-pane .mdc-list-item{width:max-content}::ng-deep .cf-overlay-input-dropdown-child-pane .mat-mdc-option-pseudo-checkbox{display:none}::ng-deep .cf-overlay-input-dropdown-child-pane.dark .mdc-list-item__primary-text{color:#000!important;width:max-content}::ng-deep .cf-overlay-input-dropdown-child-pane .mat-mdc-select{display:grid!important}::ng-deep .cf-input-currency-dropdown .dark .mat-mdc-select-arrow{color:#fff}.cf-input-currency-dropdown.light .mat-mdc-select-arrow,.cf-input-currency-dropdown.dark .mat-mdc-select-arrow{color:gray}.cf-input-currency-dropdown .mat-mdc-select{display:grid!important}::ng-deep .mat-mdc-option-active{width:100%}::ng-deep .cf-overlay-input-dropdown-child-pane.light .mdc-list-item__primary-text{width:100%;display:flex;gap:.5rem;align-items:center;color:#000!important}::ng-deep .cf-overlay-input-dropdown-child-pane .mat-mdc-option-active{width:100%}::ng-deep .cf-overlay-input-dropdown-child-pane .mat-mdc-option-active .mdc-list-item__primary-text{font-weight:700!important;display:flex;gap:.5rem;align-items:center;color:#000!important}::ng-deep .cf-overlay-input-dropdown-child-pane.dark{background-color:#1d1e22}::ng-deep .cf-overlay-input-dropdown-child-pane.light{background-color:#fff}\n"] }]
}], ctorParameters: () => [], propDecorators: { options: [{
type: Input
}], currencyChanged: [{
type: Output
}], label: [{
type: Input
}], name: [{
type: Input
}], id: [{
type: Input
}], showLabel: [{
type: Input
}], dark: [{
type: Input
}], selected: [{
type: Input
}], disabled: [{
type: Input
}], value: [{
type: Input
}], type: [{
type: Input
}], readonly: [{
type: Input
}], placeholder: [{
type: Input
}], precision: [{
type: Input
}], precisionType: [{
type: Input
}], valueChanged: [{
type: Output
}], formGroup: [{
type: Input
}], inputControl: [{
type: Input
}], currencyControl: [{
type: Input
}], theme: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2YtaW5wdXQtY3VycmVuY3ktZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3JlZGlibGUtdWkvc3JjL2xpYi9jZi1pbnB1dC1jdXJyZW5jeS1kcm9wZG93bi9jZi1pbnB1dC1jdXJyZW5jeS1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcmVkaWJsZS11aS9zcmMvbGliL2NmLWlucHV0LWN1cnJlbmN5LWRyb3Bkb3duL2NmLWlucHV0LWN1cnJlbmN5LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQ2pELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxXQUFXLEVBQUUsU0FBUyxFQUN6QixNQUFNLGdCQUFnQixDQUFDO0FBR3hCLE9BQU8sUUFBUSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7O0FBTzFDLE1BQU0sT0FBTyxnQ0FBZ0M7SUFDekMsZUFBZTtJQUNOLE9BQU8sR0FBcUIsRUFBRSxDQUFDO0lBQzlCLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ3RDLEtBQUssR0FBVyxFQUFFLENBQUM7SUFDbkIsSUFBSSxDQUFVO0lBQ2QsRUFBRSxHQUFtQixJQUFJLENBQUM7SUFDMUIsU0FBUyxHQUFZLElBQUksQ0FBQztJQUMxQixJQUFJLEdBQVksS0FBSyxDQUFDO0lBQ3RCLFFBQVEsR0FBc0IsRUFBRSxDQUFDO0lBQ2pDLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFFbkMsWUFBWTtJQUNILEtBQUssR0FBb0IsQ0FBQyxDQUFDO0lBQzNCLElBQUksR0FBc0IsUUFBUSxDQUFDO0lBQ25DLFFBQVEsR0FBYSxLQUFLLENBQUM7SUFDM0IsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUN6QixTQUFT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Q0ksNEJBQTRCO3dEQU03QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBSUUsU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEZvcm1Db250cm9sLCBGb3JtR3JvdXBcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0U2VsZWN0Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCBJRHJvcGRvd24gZnJvbSAnLi4vaW50ZXJmYWNlcy9JRHJvcGRvd24nO1xuaW1wb3J0IERyb3Bkb3duIGZyb20gJy4uL21vZGVscy9Ecm9wZG93bic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnY2YtaW5wdXQtY3VycmVuY3ktZHJvcGRvd24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jZi1pbnB1dC1jdXJyZW5jeS1kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2YtaW5wdXQtY3VycmVuY3ktZHJvcGRvd24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDZklucHV0Q3VycmVuY3lEcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICAvLyBmb3IgZHJvcGRvd25cbiAgICBASW5wdXQoKSBvcHRpb25zOiBBcnJheTxJRHJvcGRvd24+ID0gW107XG4gICAgQE91dHB1dCgpIGN1cnJlbmN5Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJyc7XG4gICAgQElucHV0KCkgbmFtZT86IHN0cmluZztcbiAgICBASW5wdXQoKSBpZD86IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIHNob3dMYWJlbDogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgZGFyazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBmb3IgaW5wdXRcbiAgICBASW5wdXQoKSB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyID0gMDtcbiAgICBASW5wdXQoKSB0eXBlOiAnbnVtYmVyJyB8ICd0ZXh0JyA9ICdudW1iZXInO1xuICAgIEBJbnB1dCgpIHJlYWRvbmx5PzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcbiAgICBASW5wdXQoKSBwcmVjaXNpb246IG51bWJlciA9IDg7XG4gICAgQElucHV0KCkgcHJlY2lzaW9uVHlwZTogc3RyaW5nID0gJ2RlY2ltYWwnO1xuICAgIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBjdXJyZW50U2VsZWN0ZWQ6IElEcm9wZG93biA9IG5ldyBEcm9wZG93bigpO1xuXG4gICAgQElucHV0KCkgZm9ybUdyb3VwITogRm9ybUdyb3VwO1xuICAgIEBJbnB1dCgpIGlucHV0Q29udHJvbCE6IEZvcm1Db250cm9sO1xuICAgIEBJbnB1dCgpIGN1cnJlbmN5Q29udHJvbCE6IEZvcm1Db250cm9sO1xuXG4gICAgQElucHV0KCkgdGhlbWU6IHN0cmluZyA9ICdkYXJrJztcbiAgICAvLyBIVE1MIGhlbHBlcnNcbiAgICBvYmplY3RGbiA9IE9iamVjdDtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlucHV0Q29udHJvbCAmJiAhdGhpcy5mb3JtR3JvdXAgJiYgIXRoaXMuY3VycmVuY3lDb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgICAgICAgICAgdGhpcy5pbnB1dENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW5jeUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjaGFuZ2VzLnZhbHVlLmN1cnJlbnRWYWx1ZS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnbnVtYmVyJyAmJiBjdXJyZW50VmFsdWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGN1cnJlbnRWYWx1ZS5zcGxpdCgnLicpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHN0clswXSArICcuJyArIHN0clsxXS5zbGljZSgwLCB0aGlzLnByZWNpc2lvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuc2VsZWN0ZWQgJiYgY2hhbmdlcy5zZWxlY3RlZC5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdFNpbmdsZVNlbGVjdGlvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMub3B0aW9ucyAmJiBjaGFuZ2VzLm9wdGlvbnMuY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldERlZmF1bHRTaW5nbGVTZWxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldERlZmF1bHRTaW5nbGVTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zIHx8IHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNlbGVjdGVkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZhbGlkT3B0aW9uKHRoaXMuc2VsZWN0ZWQpO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVuY3lDb250cm9sLnZhbHVlICYmIHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkT3B0aW9uKHRoaXMuY3VycmVuY3lDb250cm9sLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0ZWQgPSB0aGlzLmdldEN1cnJlbnRTZWxlY3RlZE9wdGlvbih0aGlzLmN1cnJlbmN5Q29udHJvbC52YWx1ZSkgYXMgSURyb3Bkb3duO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0ZWQgPSB0aGlzLm9wdGlvbnNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0ZWQgPSB0aGlzLm9wdGlvbnNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGVkID0gdGhpcy5vcHRpb25zWzBdO1xuXG4gICAgICAgIHRoaXMuY3VycmVuY3lDb250cm9sLnNldFZhbHVlKHRoaXMuY3VycmVudFNlbGVjdGVkLnZhbHVlKTtcbiAgICB9XG5cbiAgICB2YWxpZE9wdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJycpXG4gICAgICAgICAgICByZXR1cm4gLTE7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0udmFsdWUgPT09IHZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIGNoYW5nZURyb3Bkb3duKG1hdFNlbGVjdENoYW5nZTogTWF0U2VsZWN0Q2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZCA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkT3B0aW9uKG1hdFNlbGVjdENoYW5nZS52YWx1ZSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0ZWQgPSBjdXJyZW50U2VsZWN0ZWQgYXMgSURyb3Bkb3duO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW5jeUNoYW5nZWQuZW1pdCh0aGlzLmN1cnJlbnRTZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRPcHRpb24odmFsdWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbmQoKHg6IElEcm9wZG93bikgPT4geC52YWx1ZSA9PT0gdmFsdWUpO1xuICAgIH1cblxuICAgIHZhbHVlQ2hhbmdlZEhhbmRsZXIoJGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZWQuZW1pdCgkZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2YtaW5wdXQtY3VycmVuY3ktZHJvcGRvd24gY29udGFpbmVyXCIgW25nQ2xhc3NdPVwidGhlbWVcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93TGFiZWxcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBbY2xhc3MuZXJyb3JdPVwiXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dENvbnRyb2wuaW52YWxpZCAmJiBpbnB1dENvbnRyb2wudG91Y2hlZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGN1cnJlbmN5Q29udHJvbC5pbnZhbGlkICYmIGN1cnJlbmN5Q29udHJvbC50b3VjaGVkKVxuICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwiaG9sZGVyXCIgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbdHlwZV09XCJ0eXBlXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgW2Zvcm1Db250cm9sXT1cImlucHV0Q29udHJvbFwiIGNsYXNzPVwidmFsdWUtc3BhblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbdmFsdWVdPVwidmFsdWVcIiAoa2V5dXApPVwidmFsdWVDaGFuZ2VkSGFuZGxlcigkZXZlbnQpXCIgW2lkXT1cImlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFByZWNpc2lvbkRpcmVjdGl2ZSBbcHJlY2lzaW9uXT1cInByZWNpc2lvblwiIFtwcmVjaXNpb25UeXBlXT1cInByZWNpc2lvblR5cGVcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1ob2xkZXJcIiBbbmdDbGFzc109XCJ7IGRhcms6IGRhcmsgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBtYXROYXRpdmVDb250cm9sIFtmb3JtQ29udHJvbF09XCJjdXJyZW5jeUNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BhbmVsQ2xhc3NdPVwiWydjZi1vdmVybGF5LWlucHV0LWRyb3Bkb3duLWNoaWxkLXBhbmUnLCB0aGVtZV1cIiAoc2VsZWN0aW9uQ2hhbmdlKT1cImNoYW5nZURyb3Bkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBkYXJrOiBkYXJrIH1cIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjdXJyZW50U2VsZWN0ZWQubG9nb1wiIFthbHRdPVwiY3VycmVudFNlbGVjdGVkLmxhYmVsXCIgd2lkdGg9XCIyNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAwLjVyZW1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0ZWQtb3B0aW9uLXRleHRcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWQudmFsdWUgfCB1cHBlcmNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpdGVtLmxvZ29cIiBbYWx0XT1cIml0ZW0ubGFiZWxcIiB3aWR0aD1cIjI1XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImlucHV0Q29udHJvbC5lcnJvcnMgJiYgaW5wdXRDb250cm9sLnRvdWNoZWRcIj5cbiAgICAgICAge3sgaW5wdXRDb250cm9sLmVycm9yc1tvYmplY3RGbi5rZXlzKGlucHV0Q29udHJvbC5lcnJvcnMpWzBdXSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiXG4gICAgICAgICAgICBjdXJyZW5jeUNvbnRyb2wuZXJyb3JzICYmXG4gICAgICAgICAgICBjdXJyZW5jeUNvbnRyb2wudG91Y2hlZCAmJlxuICAgICAgICAgICAgIWlucHV0Q29udHJvbC5lcnJvcnNcbiAgICAgICAgXCI+XG4gICAgICAgIHt7IGN1cnJlbmN5Q29udHJvbC5lcnJvcnNbb2JqZWN0Rm4ua2V5cyhjdXJyZW5jeUNvbnRyb2wuZXJyb3JzKVswXV0gfX1cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==