@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
112 lines • 25 kB
JavaScript
import { Component, forwardRef, Input } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { ApplicationService } from '@c8y/client';
import { gettext, PluginsService } from '@c8y/ngx-components';
import { BehaviorSubject, combineLatest, merge } from 'rxjs';
import { filter, map, shareReplay, switchMap } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/client";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@angular/common";
import * as i4 from "@angular/forms";
export class PackageVersionSelectComponent {
constructor(applicationService, pluginsService) {
this.applicationService = applicationService;
this.pluginsService = pluginsService;
this.label = gettext('Use plugin version');
this.onInput$ = new BehaviorSubject('');
this.isDisabled = false;
this.packageContextPath$ = new BehaviorSubject('');
this.packageId$ = new BehaviorSubject('');
const packageIdFromContextPath$ = this.packageContextPath$.pipe(filter(path => !!path), switchMap(path => this.getPackageIdForContextPath(path)));
const packageId$ = merge(packageIdFromContextPath$, this.packageId$.pipe(filter(id => !!id)));
const packageVersions$ = packageId$.pipe(switchMap(id => this.getPackageVersions(id)), shareReplay(1));
this.versions$ = combineLatest([packageVersions$, this.onInput$.asObservable()]).pipe(map(([resultList, filterStr]) => this.applyFilterToResultList(resultList, filterStr)));
}
writeValue(obj) {
this.selectedVersion = obj;
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(isDisabled) {
this.isDisabled = isDisabled;
}
ngOnChanges(changes) {
if (changes.packageContextPath) {
this.packageContextPath$.next(this.packageContextPath);
}
if (changes.packageId) {
this.packageId$.next(this.packageId);
}
}
async getPackageVersions(packageId) {
return await this.applicationService.listVersions(packageId);
}
onVersionSelect(version) {
this.selectedVersion = version;
if (this.onChange) {
this.onChange(version);
}
if (this.onTouched) {
this.onTouched();
}
}
async getPackageIdForContextPath(contextPath) {
const { data: application } = await this.applicationService.getManifestOfContextPath(contextPath);
const packageAppId = application.id;
return packageAppId;
}
setInitialValueForInput(versions) {
if (!this.selectedVersion && versions.length > 0) {
const latest = versions.find(v => v.tags.includes('latest'));
this.selectedVersion = latest || versions[0];
if (this.onChange) {
this.onChange(this.selectedVersion);
}
}
}
filterAppVersions(appVersions, filterStr) {
return filterStr === ''
? appVersions
: appVersions.filter(appVersion => appVersion.version.includes(filterStr) ||
appVersion.tags?.some(tag => tag.includes(filterStr)));
}
applyFilterToResultList(resultList, filterStr) {
const versionsFilteredByStr = this.filterAppVersions(resultList.data, filterStr);
const sortedAppVersions = this.pluginsService.sortVersions({
list: versionsFilteredByStr,
path: ['version']
}, 'desc');
this.setInitialValueForInput(sortedAppVersions);
return { data: sortedAppVersions, res: resultList.res };
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PackageVersionSelectComponent, deps: [{ token: i1.ApplicationService }, { token: i2.PluginsService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PackageVersionSelectComponent, selector: "c8y-package-version-select", inputs: { label: "label", packageContextPath: "packageContextPath", packageId: "packageId" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: forwardRef(() => PackageVersionSelectComponent)
}
], usesOnChanges: true, ngImport: i0, template: "<label for=\"packageVersion\">{{ label | translate }}</label>\n<c8y-form-group>\n <c8y-typeahead\n [(ngModel)]=\"selectedVersion\"\n name=\"packageVersion\"\n (onSearch)=\"onInput$.next($event)\"\n placeholder=\"{{ 'Select below or start typing' | translate }}\"\n [displayProperty]=\"'version'\"\n [required]=\"true\"\n [disabled]=\"isDisabled\"\n [hideNew]=\"true\"\n [container]=\"'body'\"\n >\n <c8y-li\n *c8yFor=\"let appVersion of versions$; loadMore: 'auto'; notFound: notFoundTemplate\"\n (click)=\"onVersionSelect(appVersion)\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n [active]=\"selectedVersion === appVersion\"\n >\n <c8y-li-icon icon=\"big-parcel\"></c8y-li-icon>\n <span\n [ngStyle]=\"{\n display: 'flex',\n 'flex-direction': 'row',\n 'align-content': 'center',\n 'justify-content': 'space-between',\n 'align-items': 'center'\n }\"\n >\n <c8y-highlight\n [text]=\"appVersion.version || '--'\"\n [pattern]=\"onInput$ | async\"\n ></c8y-highlight>\n <span>\n <span *ngFor=\"let tag of appVersion.tags\" class=\"label label-info m-l-4\">\n {{ tag }}\n </span>\n </span>\n </span>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li\n class=\"bg-gray-lighter p-8\"\n *ngIf=\"(onInput$ | async)?.length > 0 && (versions$ | async)?.data?.length === 0\"\n >\n <span translate>No match found.</span>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n</c8y-form-group>\n", dependencies: [{ kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i2.HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: i2.TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected", "highlightFirstItem"], outputs: ["onSearch", "onIconClick"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PackageVersionSelectComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-package-version-select', providers: [
{
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: forwardRef(() => PackageVersionSelectComponent)
}
], template: "<label for=\"packageVersion\">{{ label | translate }}</label>\n<c8y-form-group>\n <c8y-typeahead\n [(ngModel)]=\"selectedVersion\"\n name=\"packageVersion\"\n (onSearch)=\"onInput$.next($event)\"\n placeholder=\"{{ 'Select below or start typing' | translate }}\"\n [displayProperty]=\"'version'\"\n [required]=\"true\"\n [disabled]=\"isDisabled\"\n [hideNew]=\"true\"\n [container]=\"'body'\"\n >\n <c8y-li\n *c8yFor=\"let appVersion of versions$; loadMore: 'auto'; notFound: notFoundTemplate\"\n (click)=\"onVersionSelect(appVersion)\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n [active]=\"selectedVersion === appVersion\"\n >\n <c8y-li-icon icon=\"big-parcel\"></c8y-li-icon>\n <span\n [ngStyle]=\"{\n display: 'flex',\n 'flex-direction': 'row',\n 'align-content': 'center',\n 'justify-content': 'space-between',\n 'align-items': 'center'\n }\"\n >\n <c8y-highlight\n [text]=\"appVersion.version || '--'\"\n [pattern]=\"onInput$ | async\"\n ></c8y-highlight>\n <span>\n <span *ngFor=\"let tag of appVersion.tags\" class=\"label label-info m-l-4\">\n {{ tag }}\n </span>\n </span>\n </span>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li\n class=\"bg-gray-lighter p-8\"\n *ngIf=\"(onInput$ | async)?.length > 0 && (versions$ | async)?.data?.length === 0\"\n >\n <span translate>No match found.</span>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n</c8y-form-group>\n" }]
}], ctorParameters: () => [{ type: i1.ApplicationService }, { type: i2.PluginsService }], propDecorators: { label: [{
type: Input
}], packageContextPath: [{
type: Input
}], packageId: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS12ZXJzaW9uLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9lY29zeXN0ZW0vc2hhcmVkL3BhY2thZ2UtdmVyc2lvbi1zZWxlY3QvcGFja2FnZS12ZXJzaW9uLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9lY29zeXN0ZW0vc2hhcmVkL3BhY2thZ2UtdmVyc2lvbi1zZWxlY3QvcGFja2FnZS12ZXJzaW9uLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBYSxLQUFLLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQW9DLE1BQU0sYUFBYSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBYyxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBYXJFLE1BQU0sT0FBTyw2QkFBNkI7SUFheEMsWUFDVSxrQkFBc0MsRUFDdEMsY0FBOEI7UUFEOUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFkL0IsVUFBSyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBSS9DLGFBQVEsR0FBNEIsSUFBSSxlQUFlLENBQVMsRUFBRSxDQUFDLENBQUM7UUFFcEUsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNYLHdCQUFtQixHQUFHLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBa0IsRUFBRSxDQUFDLENBQUM7UUFRNUQsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQ3RCLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN6RCxDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUYsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUN0QyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDNUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDbkYsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FDdEYsQ0FBQztJQUNKLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBUTtRQUNqQixJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQztJQUM3QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsZ0JBQWdCLENBQUUsVUFBbUI7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxTQUEwQjtRQUNqRCxPQUFPLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQTRCO1FBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO1FBQy9CLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxXQUFtQjtRQUMxRCxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixDQUNsRixXQUFXLENBQ1osQ0FBQztRQUNGLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDcEMsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVPLHVCQUF1QixDQUFDLFFBQStCO1FBQzdELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxpQkFBaUIsQ0FDdkIsV0FBa0MsRUFDbEMsU0FBaUI7UUFFakIsT0FBTyxTQUFTLEtBQUssRUFBRTtZQUNyQixDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUNoQixVQUFVLENBQUMsRUFBRSxDQUNYLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztnQkFDdEMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQ3hELENBQUM7SUFDUixDQUFDO0lBRU8sdUJBQXVCLENBQzdCLFVBQTRDLEVBQzVDLFNBQWlCO1FBRWpCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDakYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FDeEQ7WUFDRSxJQUFJLEVBQUUscUJBQXFCO1lBQzNCLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQztTQUNsQixFQUNELE1BQU0sQ0FDUCxDQUFDO1FBRUYsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEQsT0FBTyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzFELENBQUM7K0dBckhVLDZCQUE2QjttR0FBN0IsNkJBQTZCLG1KQVI3QjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLEtBQUssRUFBRSxJQUFJO2dCQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsNkJBQTZCLENBQUM7YUFDN0Q7U0FDRiwrQ0NoQkgsd21EQWtEQTs7NEZEaENhLDZCQUE2QjtrQkFYekMsU0FBUzsrQkFDRSw0QkFBNEIsYUFFM0I7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsS0FBSyxFQUFFLElBQUk7NEJBQ1gsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsOEJBQThCLENBQUM7eUJBQzdEO3FCQUNGO29IQUdRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgT25DaGFuZ2VzLCBJbnB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TZXJ2aWNlLCBJQXBwbGljYXRpb25WZXJzaW9uLCBJUmVzdWx0TGlzdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IGdldHRleHQsIFBsdWdpbnNTZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXBhY2thZ2UtdmVyc2lvbi1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFja2FnZS12ZXJzaW9uLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBQYWNrYWdlVmVyc2lvblNlbGVjdENvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgUGFja2FnZVZlcnNpb25TZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCkgbGFiZWwgPSBnZXR0ZXh0KCdVc2UgcGx1Z2luIHZlcnNpb24nKTtcbiAgQElucHV0KCkgcGFja2FnZUNvbnRleHRQYXRoOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBhY2thZ2VJZDogc3RyaW5nIHwgbnVtYmVyO1xuICBzZWxlY3RlZFZlcnNpb246IElBcHBsaWNhdGlvblZlcnNpb247XG4gIG9uSW5wdXQkOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHZlcnNpb25zJDogT2JzZXJ2YWJsZTxJUmVzdWx0TGlzdDxJQXBwbGljYXRpb25WZXJzaW9uPj47XG4gIGlzRGlzYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBwYWNrYWdlQ29udGV4dFBhdGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gIHByaXZhdGUgcGFja2FnZUlkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVtYmVyPignJyk7XG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2ZXJzaW9uOiBJQXBwbGljYXRpb25WZXJzaW9uKSA9PiB2b2lkO1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFwcGxpY2F0aW9uU2VydmljZTogQXBwbGljYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcGx1Z2luc1NlcnZpY2U6IFBsdWdpbnNTZXJ2aWNlXG4gICkge1xuICAgIGNvbnN0IHBhY2thZ2VJZEZyb21Db250ZXh0UGF0aCQgPSB0aGlzLnBhY2thZ2VDb250ZXh0UGF0aCQucGlwZShcbiAgICAgIGZpbHRlcihwYXRoID0+ICEhcGF0aCksXG4gICAgICBzd2l0Y2hNYXAocGF0aCA9PiB0aGlzLmdldFBhY2thZ2VJZEZvckNvbnRleHRQYXRoKHBhdGgpKVxuICAgICk7XG4gICAgY29uc3QgcGFja2FnZUlkJCA9IG1lcmdlKHBhY2thZ2VJZEZyb21Db250ZXh0UGF0aCQsIHRoaXMucGFja2FnZUlkJC5waXBlKGZpbHRlcihpZCA9PiAhIWlkKSkpO1xuICAgIGNvbnN0IHBhY2thZ2VWZXJzaW9ucyQgPSBwYWNrYWdlSWQkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoaWQgPT4gdGhpcy5nZXRQYWNrYWdlVmVyc2lvbnMoaWQpKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgICB0aGlzLnZlcnNpb25zJCA9IGNvbWJpbmVMYXRlc3QoW3BhY2thZ2VWZXJzaW9ucyQsIHRoaXMub25JbnB1dCQuYXNPYnNlcnZhYmxlKCldKS5waXBlKFxuICAgICAgbWFwKChbcmVzdWx0TGlzdCwgZmlsdGVyU3RyXSkgPT4gdGhpcy5hcHBseUZpbHRlclRvUmVzdWx0TGlzdChyZXN1bHRMaXN0LCBmaWx0ZXJTdHIpKVxuICAgICk7XG4gIH1cblxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFZlcnNpb24gPSBvYmo7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzRGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLnBhY2thZ2VDb250ZXh0UGF0aCkge1xuICAgICAgdGhpcy5wYWNrYWdlQ29udGV4dFBhdGgkLm5leHQodGhpcy5wYWNrYWdlQ29udGV4dFBhdGgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLnBhY2thZ2VJZCkge1xuICAgICAgdGhpcy5wYWNrYWdlSWQkLm5leHQodGhpcy5wYWNrYWdlSWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFBhY2thZ2VWZXJzaW9ucyhwYWNrYWdlSWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8SVJlc3VsdExpc3Q8SUFwcGxpY2F0aW9uVmVyc2lvbj4+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UubGlzdFZlcnNpb25zKHBhY2thZ2VJZCk7XG4gIH1cblxuICBvblZlcnNpb25TZWxlY3QodmVyc2lvbjogSUFwcGxpY2F0aW9uVmVyc2lvbikge1xuICAgIHRoaXMuc2VsZWN0ZWRWZXJzaW9uID0gdmVyc2lvbjtcbiAgICBpZiAodGhpcy5vbkNoYW5nZSkge1xuICAgICAgdGhpcy5vbkNoYW5nZSh2ZXJzaW9uKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub25Ub3VjaGVkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UGFja2FnZUlkRm9yQ29udGV4dFBhdGgoY29udGV4dFBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyPiB7XG4gICAgY29uc3QgeyBkYXRhOiBhcHBsaWNhdGlvbiB9ID0gYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuZ2V0TWFuaWZlc3RPZkNvbnRleHRQYXRoKFxuICAgICAgY29udGV4dFBhdGhcbiAgICApO1xuICAgIGNvbnN0IHBhY2thZ2VBcHBJZCA9IGFwcGxpY2F0aW9uLmlkO1xuICAgIHJldHVybiBwYWNrYWdlQXBwSWQ7XG4gIH1cblxuICBwcml2YXRlIHNldEluaXRpYWxWYWx1ZUZvcklucHV0KHZlcnNpb25zOiBJQXBwbGljYXRpb25WZXJzaW9uW10pIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRWZXJzaW9uICYmIHZlcnNpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxhdGVzdCA9IHZlcnNpb25zLmZpbmQodiA9PiB2LnRhZ3MuaW5jbHVkZXMoJ2xhdGVzdCcpKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWZXJzaW9uID0gbGF0ZXN0IHx8IHZlcnNpb25zWzBdO1xuICAgICAgaWYgKHRoaXMub25DaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnNlbGVjdGVkVmVyc2lvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJBcHBWZXJzaW9ucyhcbiAgICBhcHBWZXJzaW9uczogSUFwcGxpY2F0aW9uVmVyc2lvbltdLFxuICAgIGZpbHRlclN0cjogc3RyaW5nXG4gICk6IElBcHBsaWNhdGlvblZlcnNpb25bXSB7XG4gICAgcmV0dXJuIGZpbHRlclN0ciA9PT0gJydcbiAgICAgID8gYXBwVmVyc2lvbnNcbiAgICAgIDogYXBwVmVyc2lvbnMuZmlsdGVyKFxuICAgICAgICAgIGFwcFZlcnNpb24gPT5cbiAgICAgICAgICAgIGFwcFZlcnNpb24udmVyc2lvbi5pbmNsdWRlcyhmaWx0ZXJTdHIpIHx8XG4gICAgICAgICAgICBhcHBWZXJzaW9uLnRhZ3M/LnNvbWUodGFnID0+IHRhZy5pbmNsdWRlcyhmaWx0ZXJTdHIpKVxuICAgICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZpbHRlclRvUmVzdWx0TGlzdChcbiAgICByZXN1bHRMaXN0OiBJUmVzdWx0TGlzdDxJQXBwbGljYXRpb25WZXJzaW9uPixcbiAgICBmaWx0ZXJTdHI6IHN0cmluZ1xuICApOiBJUmVzdWx0TGlzdDxJQXBwbGljYXRpb25WZXJzaW9uPiB7XG4gICAgY29uc3QgdmVyc2lvbnNGaWx0ZXJlZEJ5U3RyID0gdGhpcy5maWx0ZXJBcHBWZXJzaW9ucyhyZXN1bHRMaXN0LmRhdGEsIGZpbHRlclN0cik7XG4gICAgY29uc3Qgc29ydGVkQXBwVmVyc2lvbnMgPSB0aGlzLnBsdWdpbnNTZXJ2aWNlLnNvcnRWZXJzaW9ucyhcbiAgICAgIHtcbiAgICAgICAgbGlzdDogdmVyc2lvbnNGaWx0ZXJlZEJ5U3RyLFxuICAgICAgICBwYXRoOiBbJ3ZlcnNpb24nXVxuICAgICAgfSxcbiAgICAgICdkZXNjJ1xuICAgICk7XG5cbiAgICB0aGlzLnNldEluaXRpYWxWYWx1ZUZvcklucHV0KHNvcnRlZEFwcFZlcnNpb25zKTtcbiAgICByZXR1cm4geyBkYXRhOiBzb3J0ZWRBcHBWZXJzaW9ucywgcmVzOiByZXN1bHRMaXN0LnJlcyB9O1xuICB9XG59XG4iLCI8bGFiZWwgZm9yPVwicGFja2FnZVZlcnNpb25cIj57eyBsYWJlbCB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG48Yzh5LWZvcm0tZ3JvdXA+XG4gIDxjOHktdHlwZWFoZWFkXG4gICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFZlcnNpb25cIlxuICAgIG5hbWU9XCJwYWNrYWdlVmVyc2lvblwiXG4gICAgKG9uU2VhcmNoKT1cIm9uSW5wdXQkLm5leHQoJGV2ZW50KVwiXG4gICAgcGxhY2Vob2xkZXI9XCJ7eyAnU2VsZWN0IGJlbG93IG9yIHN0YXJ0IHR5cGluZycgfCB0cmFuc2xhdGUgfX1cIlxuICAgIFtkaXNwbGF5UHJvcGVydHldPVwiJ3ZlcnNpb24nXCJcbiAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxuICAgIFtoaWRlTmV3XT1cInRydWVcIlxuICAgIFtjb250YWluZXJdPVwiJ2JvZHknXCJcbiAgPlxuICAgIDxjOHktbGlcbiAgICAgICpjOHlGb3I9XCJsZXQgYXBwVmVyc2lvbiBvZiB2ZXJzaW9ucyQ7IGxvYWRNb3JlOiAnYXV0byc7IG5vdEZvdW5kOiBub3RGb3VuZFRlbXBsYXRlXCJcbiAgICAgIChjbGljayk9XCJvblZlcnNpb25TZWxlY3QoYXBwVmVyc2lvbilcIlxuICAgICAgY2xhc3M9XCJwLWwtOCBwLXItOCBjOHktbGlzdF9faXRlbS0tbGlua1wiXG4gICAgICBbYWN0aXZlXT1cInNlbGVjdGVkVmVyc2lvbiA9PT0gYXBwVmVyc2lvblwiXG4gICAgPlxuICAgICAgPGM4eS1saS1pY29uIGljb249XCJiaWctcGFyY2VsXCI+PC9jOHktbGktaWNvbj5cbiAgICAgIDxzcGFuXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgJ2ZsZXgtZGlyZWN0aW9uJzogJ3JvdycsXG4gICAgICAgICAgJ2FsaWduLWNvbnRlbnQnOiAnY2VudGVyJyxcbiAgICAgICAgICAnanVzdGlmeS1jb250ZW50JzogJ3NwYWNlLWJldHdlZW4nLFxuICAgICAgICAgICdhbGlnbi1pdGVtcyc6ICdjZW50ZXInXG4gICAgICAgIH1cIlxuICAgICAgPlxuICAgICAgICA8Yzh5LWhpZ2hsaWdodFxuICAgICAgICAgIFt0ZXh0XT1cImFwcFZlcnNpb24udmVyc2lvbiB8fCAnLS0nXCJcbiAgICAgICAgICBbcGF0dGVybl09XCJvbklucHV0JCB8IGFzeW5jXCJcbiAgICAgICAgPjwvYzh5LWhpZ2hsaWdodD5cbiAgICAgICAgPHNwYW4+XG4gICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHRhZyBvZiBhcHBWZXJzaW9uLnRhZ3NcIiBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm8gbS1sLTRcIj5cbiAgICAgICAgICAgIHt7IHRhZyB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgIDwvYzh5LWxpPlxuICAgIDxuZy10ZW1wbGF0ZSAjbm90Rm91bmRUZW1wbGF0ZT5cbiAgICAgIDxjOHktbGlcbiAgICAgICAgY2xhc3M9XCJiZy1ncmF5LWxpZ2h0ZXIgcC04XCJcbiAgICAgICAgKm5nSWY9XCIob25JbnB1dCQgfCBhc3luYyk/Lmxlbmd0aCA+IDAgJiYgKHZlcnNpb25zJCB8IGFzeW5jKT8uZGF0YT8ubGVuZ3RoID09PSAwXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gdHJhbnNsYXRlPk5vIG1hdGNoIGZvdW5kLjwvc3Bhbj5cbiAgICAgIDwvYzh5LWxpPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvYzh5LXR5cGVhaGVhZD5cbjwvYzh5LWZvcm0tZ3JvdXA+XG4iXX0=