@alauda-fe/common
Version:
Alauda frontend team common codes.
176 lines • 25.2 kB
JavaScript
/**
* @packageDocumentation
* @module navconfig-loader
*/
import { NotificationService } from '@alauda/ui';
import { HttpClient } from '@angular/common/http';
import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';
import { concat, of, combineLatest, filter, map, shareReplay, switchMap, tap, } from 'rxjs';
import { K8sApiService } from '../../../api/k8s-api.service';
import { parse, parseJson, skipError, } from '../../../core/public-api';
import { TranslateService } from '../../../translate/public-api';
import { filterNavTrees, mapNavTrees } from '../utils';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "../../../translate/public-api";
import * as i3 from "@alauda/ui";
import * as i4 from "../../../api/k8s-api.service";
export const NAV_CONFIG_LOCAL_STORAGE_KEY = new InjectionToken('nav config local storage key');
const configTree = (tree, config) => (tree || [])
.map(item => {
item.label = config.buildIn[item.name]?.label;
return item.children && !config.buildIn[item.name]?.hidden // 父节点被 hidden 跳过 config 子节点
? {
...item,
children: configTree(item.children, config),
}
: item;
})
.filter(item => !config.buildIn[item.name]?.hidden); // 过滤 hidden 节点
export class NavConfigLoaderService {
constructor(http, translate, notification, localStorageKey = '', k8sApi) {
this.http = http;
this.translate = translate;
this.notification = notification;
this.localStorageKey = localStorageKey;
this.k8sApi = k8sApi;
this.cachedConfig = new Map();
this.mapToAuiNavItem = (item, parents) => ({
...item,
children: null,
key: item.key ?? [...parents.map(({ name }) => name), item.name].join('/'),
label: item.label || this.translate.get(item.name),
});
}
loadNavConfig(address) {
if (!this.cachedConfig.has(address)) {
this.cachedConfig.set(address, this.buildLoadStream(address));
}
return this.cachedConfig.get(address);
}
loadNavTree(address, cmConfigName, withGroup = false, enjoyEmpty = false) {
return combineLatest([
this.loadNavConfig(address).pipe(this.parseYaml()),
this.loadCmConfig(cmConfigName),
]).pipe(map(([tree, config]) => withGroup
? this.configTreeWithGroup(tree, config, enjoyEmpty)
: this.configTree(tree, config)), this.mapToAuiNav(withGroup));
}
configTree(treeItemConfig, config) {
return filterNavTrees(tree => !(tree.children && !tree.children.length))(configTree(treeItemConfig, config).concat(config.customs.filter(item => !item.hidden)));
}
configTreeWithGroup(treeGroupConfig, config, enjoyEmpty = false) {
return treeGroupConfig
.map(t => ({
...t,
items: filterNavTrees(// 过滤存在子节点,但子节点为空的节点
// 过滤存在子节点,但子节点为空的节点
tree => !(tree.children && !tree.children.length))(configTree(t.items, config).concat(config.customs.filter(item => !item.hidden))),
}))
.filter(item => enjoyEmpty || item.items.length);
}
parseYaml() {
return map((yaml) => {
let data = [];
try {
data = parse(yaml);
}
catch (err) {
console.error(err);
this.toastParseError();
}
return data;
});
}
mapToAuiNav(withGroup = false) {
return switchMap(items => this.translate.locale$.pipe(map(() => {
let data = [];
try {
data = withGroup
? items.map(item => ({
...item,
title: item.title ? this.translate.get(item.title) : '',
items: mapNavTrees(this.mapToAuiNavItem)(item.items),
}))
: mapNavTrees(this.mapToAuiNavItem)(items);
}
catch (err) {
console.error(err);
this.toastParseError();
}
return data;
})));
}
/**
* @param name
* 加载左导航配置 todo: 添加文档链接
*/
loadCmConfig(name) {
const defaultConfig = {
buildIn: {},
customs: [],
};
return this.k8sApi
.getGlobalResource({
definition: {
type: 'configmaps',
apiVersion: 'v1',
},
name,
namespaced: true,
})
.pipe(map(cm => {
try {
return {
buildIn: parseJson(cm.data?.buildIn) || {},
customs: parseJson(cm.data?.customs) || [],
};
}
catch (e) {
console.error(e);
return defaultConfig;
}
}), skipError(defaultConfig));
}
buildLoadStream(path) {
return concat(of(this.getLocal(path)), this.http
.get(path, {
responseType: 'text',
headers: { 'Cache-Control': 'no-cache' },
})
.pipe(tap(config => {
this.setLocal(path, config);
}))).pipe(filter(config => !!config), shareReplay(1));
}
toastParseError() {
this.notification.error(this.translate.get('nav_config_error'));
}
localKey(path) {
const nodes = path.split('/');
return `${this.localStorageKey}.${nodes.at(-1)}`;
}
setLocal(path, value) {
if (this.localStorageKey) {
localStorage.setItem(this.localKey(path), value);
}
}
getLocal(path) {
return this.localStorageKey
? localStorage.getItem(this.localKey(path)) || ''
: '';
}
static { this.ɵfac = function NavConfigLoaderService_Factory(t) { return new (t || NavConfigLoaderService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.TranslateService), i0.ɵɵinject(i3.NotificationService), i0.ɵɵinject(NAV_CONFIG_LOCAL_STORAGE_KEY, 8), i0.ɵɵinject(i4.K8sApiService)); }; }
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: NavConfigLoaderService, factory: NavConfigLoaderService.ɵfac, providedIn: 'root' }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NavConfigLoaderService, [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], () => [{ type: i1.HttpClient }, { type: i2.TranslateService }, { type: i3.NotificationService }, { type: undefined, decorators: [{
type: Inject,
args: [NAV_CONFIG_LOCAL_STORAGE_KEY]
}, {
type: Optional
}] }, { type: i4.K8sApiService }], null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2Y29uZmlnLWxvYWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL3BhZ2Utc2NhZmZvbGQvbmF2aWdhdGlvbi9uYXZjb25maWctbG9hZGVyL25hdmNvbmZpZy1sb2FkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUVMLE1BQU0sRUFDTixFQUFFLEVBQ0YsYUFBYSxFQUNiLE1BQU0sRUFDTixHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUVMLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxHQUNWLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7OztBQXlCdkQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxjQUFjLENBQzVELDhCQUE4QixDQUMvQixDQUFDO0FBSUYsTUFBTSxVQUFVLEdBQUcsQ0FDakIsSUFBcUIsRUFDckIsTUFBcUMsRUFDcEIsRUFBRSxDQUNuQixDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7S0FDVCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDVixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUM5QyxPQUFPLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsNEJBQTRCO1FBQ3JGLENBQUMsQ0FBQztZQUNFLEdBQUcsSUFBSTtZQUNQLFFBQVEsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7U0FDNUM7UUFDSCxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ1gsQ0FBQyxDQUFDO0tBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQWU7QUFLeEUsTUFBTSxPQUFPLHNCQUFzQjtJQUdqQyxZQUNtQixJQUFnQixFQUNoQixTQUEyQixFQUMzQixZQUFpQyxFQUdqQyxrQkFBMEIsRUFBRSxFQUM1QixNQUFxQjtRQU5yQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUdqQyxvQkFBZSxHQUFmLGVBQWUsQ0FBYTtRQUM1QixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBVHZCLGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFpS3JELG9CQUFlLEdBQUcsQ0FDakMsSUFBbUIsRUFDbkIsT0FBd0IsRUFDVCxFQUFFLENBQUMsQ0FBQztZQUNuQixHQUFHLElBQUk7WUFDUCxRQUFRLEVBQUUsSUFBSTtZQUNkLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDMUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNuRCxDQUFDLENBQUM7SUEvSkEsQ0FBQztJQUVKLGFBQWEsQ0FBQyxPQUFlO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELFdBQVcsQ0FDVCxPQUFlLEVBQ2YsWUFBb0IsRUFDcEIsU0FBUyxHQUFHLEtBQUssRUFDakIsVUFBVSxHQUFHLEtBQUs7UUFFbEIsT0FBTyxhQUFhLENBQUM7WUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO1NBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUNyQixTQUFTO1lBQ1AsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FDdEIsSUFBd0IsRUFDeEIsTUFBTSxFQUNOLFVBQVUsQ0FDWDtZQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FDbEMsRUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVELFVBQVUsQ0FDUixjQUErQixFQUMvQixNQUFxQztRQUVyQyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUN0RSxVQUFVLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FDdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDNUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELG1CQUFtQixDQUNqQixlQUFpQyxFQUNqQyxNQUFxQyxFQUNyQyxVQUFVLEdBQUcsS0FBSztRQUVsQixPQUFPLGVBQWU7YUFDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNULEdBQUcsQ0FBQztZQUNKLEtBQUssRUFBRSxjQUFjLENBQWlCLG9CQUFvQjtZQUN4RCxBQURvQyxvQkFBb0I7WUFDeEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ2xELENBQ0MsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUNoQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUM1QyxDQUNGO1NBQ0YsQ0FBQyxDQUFDO2FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLEdBQUcsQ0FBZ0IsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUN6QyxJQUFJLElBQUksR0FBVSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDO2dCQUNILElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckIsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxTQUFTLEdBQUcsS0FBSztRQUMzQixPQUFPLFNBQVMsQ0FBMkIsS0FBSyxDQUFDLEVBQUUsQ0FDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN6QixHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsSUFBSSxJQUFJLEdBQVUsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQztnQkFDSCxJQUFJLEdBQUcsU0FBUztvQkFDZCxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ2pCLEdBQUcsSUFBSTt3QkFDUCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUN2RCxLQUFLLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO3FCQUNyRCxDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZLENBQUMsSUFBWTtRQUN2QixNQUFNLGFBQWEsR0FBa0M7WUFDbkQsT0FBTyxFQUFFLEVBQUU7WUFDWCxPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxNQUFNO2FBQ2YsaUJBQWlCLENBQTRCO1lBQzVDLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsWUFBWTtnQkFDbEIsVUFBVSxFQUFFLElBQUk7YUFDakI7WUFDRCxJQUFJO1lBQ0osVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQzthQUNELElBQUksQ0FDSCxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDUCxJQUFJLENBQUM7Z0JBQ0gsT0FBTztvQkFDTCxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRTtvQkFDMUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUU7aUJBQ1YsQ0FBQztZQUNyQyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUN6QixDQUFDO0lBQ04sQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFZO1FBQ2xDLE9BQU8sTUFBTSxDQUNYLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ3ZCLElBQUksQ0FBQyxJQUFJO2FBQ04sR0FBRyxDQUFDLElBQUksRUFBRTtZQUNULFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUU7U0FDekMsQ0FBQzthQUNELElBQUksQ0FDSCxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FDSCxDQUNKLENBQUMsSUFBSSxDQUNKLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFDMUIsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7SUFDSixDQUFDO0lBWU8sZUFBZTtRQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVPLFFBQVEsQ0FBQyxJQUFZO1FBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVPLFFBQVEsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUMxQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFTyxRQUFRLENBQUMsSUFBWTtRQUMzQixPQUFPLElBQUksQ0FBQyxlQUFlO1lBQ3pCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQ2pELENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDO3VGQS9MVSxzQkFBc0IsaUhBT3ZCLDRCQUE0Qjt1RUFQM0Isc0JBQXNCLFdBQXRCLHNCQUFzQixtQkFGckIsTUFBTTs7aUZBRVAsc0JBQXNCO2NBSGxDLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7c0JBUUksTUFBTTt1QkFBQyw0QkFBNEI7O3NCQUNuQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBtb2R1bGUgbmF2Y29uZmlnLWxvYWRlclxuICovXG5cbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSxcbiAgY29uY2F0LFxuICBvZixcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxuICBzd2l0Y2hNYXAsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEs4c0FwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hcGkvazhzLWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEt1YmVybmV0ZXNSZXNvdXJjZSxcbiAgcGFyc2UsXG4gIHBhcnNlSnNvbixcbiAgc2tpcEVycm9yLFxufSBmcm9tICcuLi8uLi8uLi9jb3JlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3RyYW5zbGF0ZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IE5hdkdyb3VwQ29uZmlnLCBOYXZJdGVtQ29uZmlnIH0gZnJvbSAnLi4vbmF2LW1lbnUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBmaWx0ZXJOYXZUcmVlcywgbWFwTmF2VHJlZXMgfSBmcm9tICcuLi91dGlscyc7XG5cbmludGVyZmFjZSBOYXZpZ2F0aW9uQ29uZmlnQ29uZmlnTWFwRGF0YSB7XG4gIGJ1aWxkSW46IHtcbiAgICBbbmFtZTogc3RyaW5nXToge1xuICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgIGhpZGRlbjogYm9vbGVhbjtcbiAgICB9O1xuICB9O1xuICBjdXN0b21zOiBBcnJheTx7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBpY29uPzogc3RyaW5nO1xuICAgIGljb25EYXRhPzogc3RyaW5nO1xuICAgIGhpZGRlbjogYm9vbGVhbjtcbiAgICBocmVmOiBzdHJpbmc7XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgTmF2aWdhdGlvbkNvbmZpZ0NvbmZpZ01hcCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZSB7XG4gIGRhdGE6IHtcbiAgICBidWlsZEluOiBzdHJpbmc7XG4gICAgY3VzdG9tczogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgTkFWX0NPTkZJR19MT0NBTF9TVE9SQUdFX0tFWSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KFxuICAnbmF2IGNvbmZpZyBsb2NhbCBzdG9yYWdlIGtleScsXG4pO1xuXG5leHBvcnQgdHlwZSBOYXYgPSBOYXZJdGVtQ29uZmlnIHwgTmF2R3JvdXBDb25maWc7XG5cbmNvbnN0IGNvbmZpZ1RyZWUgPSAoXG4gIHRyZWU6IE5hdkl0ZW1Db25maWdbXSxcbiAgY29uZmlnOiBOYXZpZ2F0aW9uQ29uZmlnQ29uZmlnTWFwRGF0YSxcbik6IE5hdkl0ZW1Db25maWdbXSA9PlxuICAodHJlZSB8fCBbXSlcbiAgICAubWFwKGl0ZW0gPT4ge1xuICAgICAgaXRlbS5sYWJlbCA9IGNvbmZpZy5idWlsZEluW2l0ZW0ubmFtZV0/LmxhYmVsO1xuICAgICAgcmV0dXJuIGl0ZW0uY2hpbGRyZW4gJiYgIWNvbmZpZy5idWlsZEluW2l0ZW0ubmFtZV0/LmhpZGRlbiAvLyDniLboioLngrnooqsgaGlkZGVuIOi3s+i/hyBjb25maWcg5a2Q6IqC54K5XG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjb25maWdUcmVlKGl0ZW0uY2hpbGRyZW4sIGNvbmZpZyksXG4gICAgICAgICAgfVxuICAgICAgICA6IGl0ZW07XG4gICAgfSlcbiAgICAuZmlsdGVyKGl0ZW0gPT4gIWNvbmZpZy5idWlsZEluW2l0ZW0ubmFtZV0/LmhpZGRlbik7IC8vIOi/h+a7pCBoaWRkZW4g6IqC54K5XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBOYXZDb25maWdMb2FkZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZWRDb25maWcgPSBuZXcgTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxzdHJpbmc+PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uU2VydmljZSxcbiAgICBASW5qZWN0KE5BVl9DT05GSUdfTE9DQUxfU1RPUkFHRV9LRVkpXG4gICAgQE9wdGlvbmFsKClcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsU3RvcmFnZUtleTogc3RyaW5nID0gJycsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNBcGk6IEs4c0FwaVNlcnZpY2UsXG4gICkge31cblxuICBsb2FkTmF2Q29uZmlnKGFkZHJlc3M6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5jYWNoZWRDb25maWcuaGFzKGFkZHJlc3MpKSB7XG4gICAgICB0aGlzLmNhY2hlZENvbmZpZy5zZXQoYWRkcmVzcywgdGhpcy5idWlsZExvYWRTdHJlYW0oYWRkcmVzcykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRDb25maWcuZ2V0KGFkZHJlc3MpO1xuICB9XG5cbiAgbG9hZE5hdlRyZWUoXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIGNtQ29uZmlnTmFtZTogc3RyaW5nLFxuICAgIHdpdGhHcm91cCA9IGZhbHNlLFxuICAgIGVuam95RW1wdHkgPSBmYWxzZSxcbiAgKSB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5sb2FkTmF2Q29uZmlnKGFkZHJlc3MpLnBpcGUodGhpcy5wYXJzZVlhbWwoKSksXG4gICAgICB0aGlzLmxvYWRDbUNvbmZpZyhjbUNvbmZpZ05hbWUpLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFt0cmVlLCBjb25maWddKSA9PlxuICAgICAgICB3aXRoR3JvdXBcbiAgICAgICAgICA/IHRoaXMuY29uZmlnVHJlZVdpdGhHcm91cChcbiAgICAgICAgICAgICAgdHJlZSBhcyBOYXZHcm91cENvbmZpZ1tdLFxuICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgIGVuam95RW1wdHksXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB0aGlzLmNvbmZpZ1RyZWUodHJlZSwgY29uZmlnKSxcbiAgICAgICksXG4gICAgICB0aGlzLm1hcFRvQXVpTmF2KHdpdGhHcm91cCksXG4gICAgKTtcbiAgfVxuXG4gIGNvbmZpZ1RyZWUoXG4gICAgdHJlZUl0ZW1Db25maWc6IE5hdkl0ZW1Db25maWdbXSxcbiAgICBjb25maWc6IE5hdmlnYXRpb25Db25maWdDb25maWdNYXBEYXRhLFxuICApIHtcbiAgICByZXR1cm4gZmlsdGVyTmF2VHJlZXModHJlZSA9PiAhKHRyZWUuY2hpbGRyZW4gJiYgIXRyZWUuY2hpbGRyZW4ubGVuZ3RoKSkoXG4gICAgICBjb25maWdUcmVlKHRyZWVJdGVtQ29uZmlnLCBjb25maWcpLmNvbmNhdChcbiAgICAgICAgY29uZmlnLmN1c3RvbXMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaGlkZGVuKSwgLy8g5re75Yqg6Ieq5a6a5LmJ55qE5bem5a+86IiqXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBjb25maWdUcmVlV2l0aEdyb3VwKFxuICAgIHRyZWVHcm91cENvbmZpZzogTmF2R3JvdXBDb25maWdbXSxcbiAgICBjb25maWc6IE5hdmlnYXRpb25Db25maWdDb25maWdNYXBEYXRhLFxuICAgIGVuam95RW1wdHkgPSBmYWxzZSxcbiAgKSB7XG4gICAgcmV0dXJuIHRyZWVHcm91cENvbmZpZ1xuICAgICAgLm1hcCh0ID0+ICh7XG4gICAgICAgIC4uLnQsXG4gICAgICAgIGl0ZW1zOiBmaWx0ZXJOYXZUcmVlczxOYXZJdGVtQ29uZmlnPiggLy8g6L+H5ruk5a2Y5Zyo5a2Q6IqC54K577yM5L2G5a2Q6IqC54K55Li656m655qE6IqC54K5XG4gICAgICAgICAgdHJlZSA9PiAhKHRyZWUuY2hpbGRyZW4gJiYgIXRyZWUuY2hpbGRyZW4ubGVuZ3RoKSxcbiAgICAgICAgKShcbiAgICAgICAgICBjb25maWdUcmVlKHQuaXRlbXMsIGNvbmZpZykuY29uY2F0KFxuICAgICAgICAgICAgY29uZmlnLmN1c3RvbXMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaGlkZGVuKSwgLy8g5re75Yqg6Ieq5a6a5LmJ55qE5bem5a+86IiqXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIH0pKVxuICAgICAgLmZpbHRlcihpdGVtID0+IGVuam95RW1wdHkgfHwgaXRlbS5pdGVtcy5sZW5ndGgpO1xuICB9XG5cbiAgcGFyc2VZYW1sKCkge1xuICAgIHJldHVybiBtYXA8c3RyaW5nLCBOYXZbXT4oKHlhbWw6IHN0cmluZykgPT4ge1xuICAgICAgbGV0IGRhdGE6IE5hdltdID0gW107XG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gcGFyc2UoeWFtbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB0aGlzLnRvYXN0UGFyc2VFcnJvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG4gIH1cblxuICBtYXBUb0F1aU5hdih3aXRoR3JvdXAgPSBmYWxzZSkge1xuICAgIHJldHVybiBzd2l0Y2hNYXA8TmF2W10sIE9ic2VydmFibGU8TmF2W10+PihpdGVtcyA9PlxuICAgICAgdGhpcy50cmFuc2xhdGUubG9jYWxlJC5waXBlKFxuICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgIGxldCBkYXRhOiBOYXZbXSA9IFtdO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkYXRhID0gd2l0aEdyb3VwXG4gICAgICAgICAgICAgID8gaXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSA/IHRoaXMudHJhbnNsYXRlLmdldChpdGVtLnRpdGxlKSA6ICcnLFxuICAgICAgICAgICAgICAgICAgaXRlbXM6IG1hcE5hdlRyZWVzKHRoaXMubWFwVG9BdWlOYXZJdGVtKShpdGVtLml0ZW1zKSxcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgOiBtYXBOYXZUcmVlcyh0aGlzLm1hcFRvQXVpTmF2SXRlbSkoaXRlbXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgdGhpcy50b2FzdFBhcnNlRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBuYW1lXG4gICAqIOWKoOi9veW3puWvvOiIqumFjee9riB0b2RvOiDmt7vliqDmlofmoaPpk77mjqVcbiAgICovXG4gIGxvYWRDbUNvbmZpZyhuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnOiBOYXZpZ2F0aW9uQ29uZmlnQ29uZmlnTWFwRGF0YSA9IHtcbiAgICAgIGJ1aWxkSW46IHt9LFxuICAgICAgY3VzdG9tczogW10sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5rOHNBcGlcbiAgICAgIC5nZXRHbG9iYWxSZXNvdXJjZTxOYXZpZ2F0aW9uQ29uZmlnQ29uZmlnTWFwPih7XG4gICAgICAgIGRlZmluaXRpb246IHtcbiAgICAgICAgICB0eXBlOiAnY29uZmlnbWFwcycsXG4gICAgICAgICAgYXBpVmVyc2lvbjogJ3YxJyxcbiAgICAgICAgfSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbmFtZXNwYWNlZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKGNtID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYnVpbGRJbjogcGFyc2VKc29uKGNtLmRhdGE/LmJ1aWxkSW4pIHx8IHt9LFxuICAgICAgICAgICAgICBjdXN0b21zOiBwYXJzZUpzb24oY20uZGF0YT8uY3VzdG9tcykgfHwgW10sXG4gICAgICAgICAgICB9IGFzIE5hdmlnYXRpb25Db25maWdDb25maWdNYXBEYXRhO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdENvbmZpZztcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBza2lwRXJyb3IoZGVmYXVsdENvbmZpZyksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExvYWRTdHJlYW0ocGF0aDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gY29uY2F0KFxuICAgICAgb2YodGhpcy5nZXRMb2NhbChwYXRoKSksXG4gICAgICB0aGlzLmh0dHBcbiAgICAgICAgLmdldChwYXRoLCB7XG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ2FjaGUtQ29udHJvbCc6ICduby1jYWNoZScgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldExvY2FsKHBhdGgsIGNvbmZpZyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgKS5waXBlKFxuICAgICAgZmlsdGVyKGNvbmZpZyA9PiAhIWNvbmZpZyksXG4gICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXBUb0F1aU5hdkl0ZW0gPSAoXG4gICAgaXRlbTogTmF2SXRlbUNvbmZpZyxcbiAgICBwYXJlbnRzOiBOYXZJdGVtQ29uZmlnW10sXG4gICk6IE5hdkl0ZW1Db25maWcgPT4gKHtcbiAgICAuLi5pdGVtLFxuICAgIGNoaWxkcmVuOiBudWxsLFxuICAgIGtleTogaXRlbS5rZXkgPz8gWy4uLnBhcmVudHMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSksIGl0ZW0ubmFtZV0uam9pbignLycpLFxuICAgIGxhYmVsOiBpdGVtLmxhYmVsIHx8IHRoaXMudHJhbnNsYXRlLmdldChpdGVtLm5hbWUpLFxuICB9KTtcblxuICBwcml2YXRlIHRvYXN0UGFyc2VFcnJvcigpIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbi5lcnJvcih0aGlzLnRyYW5zbGF0ZS5nZXQoJ25hdl9jb25maWdfZXJyb3InKSk7XG4gIH1cblxuICBwcml2YXRlIGxvY2FsS2V5KHBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IG5vZGVzID0gcGF0aC5zcGxpdCgnLycpO1xuICAgIHJldHVybiBgJHt0aGlzLmxvY2FsU3RvcmFnZUtleX0uJHtub2Rlcy5hdCgtMSl9YDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TG9jYWwocGF0aDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubG9jYWxTdG9yYWdlS2V5KSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsS2V5KHBhdGgpLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2NhbChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY2FsU3RvcmFnZUtleVxuICAgICAgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsS2V5KHBhdGgpKSB8fCAnJ1xuICAgICAgOiAnJztcbiAgfVxufVxuIl19