UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

176 lines 25.2 kB
/** * @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2Y29uZmlnLWxvYWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL3BhZ2Utc2NhZmZvbGQvbmF2aWdhdGlvbi9uYXZjb25maWctbG9hZGVyL25hdmNvbmZpZy1sb2FkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUVMLE1BQU0sRUFDTixFQUFFLEVBQ0YsYUFBYSxFQUNiLE1BQU0sRUFDTixHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUVMLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxHQUNWLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7OztBQXlCdkQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxjQUFjLENBQzVELDhCQUE4QixDQUMvQixDQUFDO0FBSUYsTUFBTSxVQUFVLEdBQUcsQ0FDakIsSUFBcUIsRUFDckIsTUFBcUMsRUFDcEIsRUFBRSxDQUNuQixDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7S0FDVCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDVixJQUFJLENBQUMsS0FBSyxH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QkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7c0JBUUksTUFBTTt1QkFBQyw0QkFBNEI7O3NCQUNuQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBtb2R1bGUgbmF2Y29uZmlnLWxvYWRlclxuICovXG5cbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSxcbiAgY29uY2F0LFxuICBvZixcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxuICBzd2l0Y2hNYXAsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEs4c0FwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hcGkvazhzLWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEt1YmVybmV0ZXNSZXNvdXJjZSxcbiAgcGFyc2UsXG4gIHBhcnNlSnNvbixcbiAgc2tpcEVycm9yLFxufSBmcm9tICcuLi8uLi8uLi9jb3JlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3RyYW5zbGF0ZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IE5hdkdyb3VwQ29uZmlnLCBOYXZJdGVtQ29uZmlnIH0gZnJvbSAnLi4vbmF2LW1lbnUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBmaWx0ZXJOYXZUcmVlcywgbWFwTmF2VHJlZXMgfSBmcm9tICcuLi91dGlscyc7XG5cbmludGVyZmFjZSBOYXZpZ2F0aW9uQ29uZmlnQ29uZmlnTWFwRGF0YSB7XG4gIGJ1aWxkSW46IHtcbiAgICBbbmFtZTogc3RyaW5nXToge1xuICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgIGhpZGRlbjogYm9vbGVhbjtcbiAgICB9O1xuICB9O1xuICBjdXN0b21zOiBBcnJheTx7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBpY29uPzogc3RyaW5nO1xuICAgIGljb25EYXRhPzogc3RyaW5nO1xuICAgIGhpZGRlbjogYm9vbGVhbjtcbiAgICBocmVmOiBzdHJpbmc7XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgTmF2aWdhdGlvbkNvbmZpZ0NvbmZpZ01hcCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZSB7XG4gIGRhdGE6IHtcbiAgICBidWlsZEluOiBzdHJpbmc7XG4gICAgY3VzdG9tczogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgTkFWX0NPTkZJR19MT0NBTF9TVE9SQUdFX0tFWSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KFxuICAnbmF2IGNvbmZpZyBsb2NhbCBzdG9yYWdlIGtleScsXG4pO1xuXG5leHBvcnQgdHlwZSBOYXYgPSBOYXZJdGVtQ29uZmlnIHwgTmF2R3JvdXBDb25maWc7XG5cbmNvbnN0IGNvbmZpZ1RyZWUgPSAoXG4gIHRyZWU6IE5hdkl0ZW1Db25maWdbXSxcbiAgY29uZmlnOiBOYXZpZ2F0aW9uQ29uZmlnQ29uZmlnTWFwRGF0YSxcbik6IE5hdkl0ZW1Db25maWdbXSA9PlxuICAodHJlZSB8fCBbXSlcbiAgICAubWFwKGl0ZW0gPT4ge1xuICAgICAgaXRlbS5sYWJlbCA9IGNvbmZpZy5idWlsZEluW2l0ZW0ubmFtZV0/LmxhYmVsO1xuICAgICAgcmV0dXJuIGl0ZW0uY2hpbGRyZW4gJiYgIWNvbmZpZy5idWlsZEluW2l0ZW0ubmFtZV0/LmhpZGRlbiAvLyDniLboioLngrnooqsgaGlkZGVuIOi3s+i/hyBjb25maWcg5a2Q6IqC54K5XG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjb25maWdUcmVlKGl0ZW0uY2hpbGRyZW4sIGNvbmZpZyksXG4gICAgICAgICAgfVxuICAgICAgICA6IGl0ZW07XG4gICAgfSlcbiAgICAuZmlsdGVyKGl0ZW0gPT4gIWNvbmZpZy5idWlsZEluW2l0ZW0ubmFtZV0/LmhpZGRlbik7IC8vIOi/h+a7pCBoaWRkZW4g6IqC54K5XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBOYXZDb25maWdMb2FkZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZWRDb25maWcgPSBuZXcgTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxzdHJpbmc+PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uU2VydmljZSxcbiAgICBASW5qZWN0KE5BVl9DT05GSUdfTE9DQUxfU1RPUkFHRV9LRVkpXG4gICAgQE9wdGlvbmFsKClcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsU3RvcmFnZUtleTogc3RyaW5nID0gJycsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNBcGk6IEs4c0FwaVNlcnZpY2UsXG4gICkge31cblxuICBsb2FkTmF2Q29uZmlnKGFkZHJlc3M6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5jYWNoZWRDb25maWcuaGFzKGFkZHJlc3MpKSB7XG4gICAgICB0aGlzLmNhY2hlZENvbmZpZy5zZXQoYWRkcmVzcywgdGhpcy5idWlsZExvYWRTdHJlYW0oYWRkcmVzcykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRDb25maWcuZ2V0KGFkZHJlc3MpO1xuICB9XG5cbiAgbG9hZE5hdlRyZWUoXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIGNtQ29uZmlnTmFtZTogc3RyaW5nLFxuICAgIHdpdGhHcm91cCA9IGZhbHNlLFxuICAgIGVuam95RW1wdHkgPSBmYWxzZSxcbiAgKSB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5sb2FkTmF2Q29uZmlnKGFkZHJlc3MpLnBpcGUodGhpcy5wYXJzZVlhbWwoKSksXG4gICAgICB0aGlzLmxvYWRDbUNvbmZpZyhjbUNvbmZpZ05hbWUpLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFt0cmVlLCBjb25maWddKSA9PlxuICAgICAgICB3aXRoR3JvdXBcbiAgICAgICAgICA/IHRoaXMuY29uZmlnVHJlZVdpdGhHcm91cChcbiAgICAgICAgICAgICAgdHJlZSBhcyBOYXZHcm91cENvbmZpZ1tdLFxuICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgIGVuam95RW1wdHksXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB0aGlzLmNvbmZpZ1RyZWUodHJlZSwgY29uZmlnKSxcbiAgICAgICksXG4gICAgICB0aGlzLm1hcFRvQXVpTmF2KHdpdGhHcm91cCksXG4gICAgKTtcbiAgfVxuXG4gIGNvbmZpZ1RyZWUoXG4gICAgdHJlZUl0ZW1Db25maWc6IE5hdkl0ZW1Db25maWdbXSxcbiAgICBjb25maWc6IE5hdmlnYXRpb25Db25maWdDb25maWdNYXBEYXRhLFxuICApIHtcbiAgICByZXR1cm4gZmlsdGVyTmF2VHJlZXModHJlZSA9PiAhKHRyZWUuY2hpbGRyZW4gJiYgIXRyZWUuY2hpbGRyZW4ubGVuZ3RoKSkoXG4gICAgICBjb25maWdUcmVlKHRyZWVJdGVtQ29uZmlnLCBjb25maWcpLmNvbmNhdChcbiAgICAgICAgY29uZmlnLmN1c3RvbXMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaGlkZGVuKSwgLy8g5re75Yqg6Ieq5a6a5LmJ55qE5bem5a+86IiqXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBjb25maWdUcmVlV2l0aEdyb3VwKFxuICAgIHRyZWVHcm91cENvbmZpZzogTmF2R3JvdXBDb25maWdbXSxcbiAgICBjb25maWc6IE5hdmlnYXRpb25Db25maWdDb25maWdNYXBEYXRhLFxuICAgIGVuam95RW1wdHkgPSBmYWxzZSxcbiAgKSB7XG4gICAgcmV0dXJuIHRyZWVHcm91cENvbmZpZ1xuICAgICAgLm1hcCh0ID0+ICh7XG4gICAgICAgIC4uLnQsXG4gICAgICAgIGl0ZW1zOiBmaWx0ZXJOYXZUcmVlczxOYXZJdGVtQ29uZmlnPiggLy8g6L+H5ruk5a2Y5Zyo5a2Q6IqC54K577yM5L2G5a2Q6IqC54K55Li656m655qE6IqC54K5XG4gICAgICAgICAgdHJlZSA9PiAhKHRyZWUuY2hpbGRyZW4gJiYgIXRyZWUuY2hpbGRyZW4ubGVuZ3RoKSxcbiAgICAgICAgKShcbiAgICAgICAgICBjb25maWdUcmVlKHQuaXRlbXMsIGNvbmZpZykuY29uY2F0KFxuICAgICAgICAgICAgY29uZmlnLmN1c3RvbXMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaGlkZGVuKSwgLy8g5re75Yqg6Ieq5a6a5LmJ55qE5bem5a+86IiqXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIH0pKVxuICAgICAgLmZpbHRlcihpdGVtID0+IGVuam95RW1wdHkgfHwgaXRlbS5pdGVtcy5sZW5ndGgpO1xuICB9XG5cbiAgcGFyc2VZYW1sKCkge1xuICAgIHJldHVybiBtYXA8c3RyaW5nLCBOYXZbXT4oKHlhbWw6IHN0cmluZykgPT4ge1xuICAgICAgbGV0IGRhdGE6IE5hdltdID0gW107XG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gcGFyc2UoeWFtbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB0aGlzLnRvYXN0UGFyc2VFcnJvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG4gIH1cblxuICBtYXBUb0F1aU5hdih3aXRoR3JvdXAgPSBmYWxzZSkge1xuICAgIHJldHVybiBzd2l0Y2hNYXA8TmF2W10sIE9ic2VydmFibGU8TmF2W10+PihpdGVtcyA9PlxuICAgICAgdGhpcy50cmFuc2xhdGUubG9jYWxlJC5waXBlKFxuICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgIGxldCBkYXRhOiBOYXZbXSA9IFtdO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkYXRhID0gd2l0aEdyb3VwXG4gICAgICAgICAgICAgID8gaXRlbXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICB0aXRsZTogaXRlbS50aXRsZSA/IHRoaXMudHJhbnNsYXRlLmdldChpdGVtLnRpdGxlKSA6ICcnLFxuICAgICAgICAgICAgICAgICAgaXRlbXM6IG1hcE5hdlRyZWVzKHRoaXMubWFwVG9BdWlOYXZJdGVtKShpdGVtLml0ZW1zKSxcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgOiBtYXBOYXZUcmVlcyh0aGlzLm1hcFRvQXVpTmF2SXRlbSkoaXRlbXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgdGhpcy50b2FzdFBhcnNlRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBuYW1lXG4gICAqIOWKoOi9veW3puWvvOiIqumFjee9riB0b2RvOiDmt7vliqDmlofmoaPpk77mjqVcbiAgICovXG4gIGxvYWRDbUNvbmZpZyhuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnOiBOYXZpZ2F0aW9uQ29uZmlnQ29uZmlnTWFwRGF0YSA9IHtcbiAgICAgIGJ1aWxkSW46IHt9LFxuICAgICAgY3VzdG9tczogW10sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5rOHNBcGlcbiAgICAgIC5nZXRHbG9iYWxSZXNvdXJjZTxOYXZpZ2F0aW9uQ29uZmlnQ29uZmlnTWFwPih7XG4gICAgICAgIGRlZmluaXRpb246IHtcbiAgICAgICAgICB0eXBlOiAnY29uZmlnbWFwcycsXG4gICAgICAgICAgYXBpVmVyc2lvbjogJ3YxJyxcbiAgICAgICAgfSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbmFtZXNwYWNlZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKGNtID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYnVpbGRJbjogcGFyc2VKc29uKGNtLmRhdGE/LmJ1aWxkSW4pIHx8IHt9LFxuICAgICAgICAgICAgICBjdXN0b21zOiBwYXJzZUpzb24oY20uZGF0YT8uY3VzdG9tcykgfHwgW10sXG4gICAgICAgICAgICB9IGFzIE5hdmlnYXRpb25Db25maWdDb25maWdNYXBEYXRhO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdENvbmZpZztcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBza2lwRXJyb3IoZGVmYXVsdENvbmZpZyksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExvYWRTdHJlYW0ocGF0aDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gY29uY2F0KFxuICAgICAgb2YodGhpcy5nZXRMb2NhbChwYXRoKSksXG4gICAgICB0aGlzLmh0dHBcbiAgICAgICAgLmdldChwYXRoLCB7XG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ2FjaGUtQ29udHJvbCc6ICduby1jYWNoZScgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldExvY2FsKHBhdGgsIGNvbmZpZyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgKS5waXBlKFxuICAgICAgZmlsdGVyKGNvbmZpZyA9PiAhIWNvbmZpZyksXG4gICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXBUb0F1aU5hdkl0ZW0gPSAoXG4gICAgaXRlbTogTmF2SXRlbUNvbmZpZyxcbiAgICBwYXJlbnRzOiBOYXZJdGVtQ29uZmlnW10sXG4gICk6IE5hdkl0ZW1Db25maWcgPT4gKHtcbiAgICAuLi5pdGVtLFxuICAgIGNoaWxkcmVuOiBudWxsLFxuICAgIGtleTogaXRlbS5rZXkgPz8gWy4uLnBhcmVudHMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSksIGl0ZW0ubmFtZV0uam9pbignLycpLFxuICAgIGxhYmVsOiBpdGVtLmxhYmVsIHx8IHRoaXMudHJhbnNsYXRlLmdldChpdGVtLm5hbWUpLFxuICB9KTtcblxuICBwcml2YXRlIHRvYXN0UGFyc2VFcnJvcigpIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbi5lcnJvcih0aGlzLnRyYW5zbGF0ZS5nZXQoJ25hdl9jb25maWdfZXJyb3InKSk7XG4gIH1cblxuICBwcml2YXRlIGxvY2FsS2V5KHBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IG5vZGVzID0gcGF0aC5zcGxpdCgnLycpO1xuICAgIHJldHVybiBgJHt0aGlzLmxvY2FsU3RvcmFnZUtleX0uJHtub2Rlcy5hdCgtMSl9YDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TG9jYWwocGF0aDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubG9jYWxTdG9yYWdlS2V5KSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsS2V5KHBhdGgpLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2NhbChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY2FsU3RvcmFnZUtleVxuICAgICAgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsS2V5KHBhdGgpKSB8fCAnJ1xuICAgICAgOiAnJztcbiAgfVxufVxuIl19