@alauda-fe/common
Version:
Alauda frontend team common codes.
173 lines • 31.7 kB
JavaScript
import { inject } from '@angular/core';
import { toObservable, toSignal } from '@angular/core/rxjs-interop';
import { ActivatedRoute, Router } from '@angular/router';
import { NEVER, Subject, catchError, filter, interval, isObservable, map, of, startWith, switchMap, switchScan, take, withLatestFrom, } from 'rxjs';
import { WatchEvent } from '../api/public-api';
import { DOWNGRADE_WATCH_ENABLED, DOWNGRADE_WATCH_POLLING, publishRef, } from '../core/public-api';
export class K8SResourcePagedList {
constructor(config) {
this.config = config;
this.reload$$ = new Subject();
this.addedUid = new Set();
this.deletedUid = new Set();
this.params$ = isObservable(this.config.params)
? this.config.params
: toObservable(this.config.params);
this.loadState$ = this.config.watcher && !DOWNGRADE_WATCH_ENABLED
? this.loadStateWithWatcher()
: this.config.watcher || this.config.polling
? this.loadStateWithPolling()
: this.sourceLoadState();
this.loading$ = this.loadState$.pipe(map(state => state.loading));
this.items$ = this.loadState$.pipe(map(state => state.items));
this.totalItems$ = this.loadState$.pipe(map(state => state.totalItems));
this.loadError$ = this.loadState$.pipe(map(state => state.loadError));
this.$loading = toSignal(this.loading$);
this.$items = toSignal(this.items$);
this.$totalItems = toSignal(this.totalItems$);
this.$loadError = toSignal(this.loadError$);
}
reload() {
this.reload$$.next();
}
sourceLoadState() {
return this.params$.pipe(map(parseListParams), switchMap(({ listParams, extraParams }) => {
return this.reload$$.pipe(startWith(null), switchMap(() => {
return this.config.fetcher(listParams, extraParams).pipe(map(list => ({
loading: false,
loadSuccess: true,
items: list.items ?? [],
totalItems: list.metadata.totalItems ?? 0,
})), startWith({
loading: true,
loadSuccess: false,
items: [],
totalItems: 0,
}), catchError((err) => of({
loading: false,
loadSuccess: false,
loadError: err,
items: [],
totalItems: 0,
})));
}));
}), publishRef());
}
loadStateWithPolling() {
return this.sourceLoadState().pipe(switchMap(sourceState => sourceState.loadSuccess
? interval(this.config.polling || DOWNGRADE_WATCH_POLLING).pipe(withLatestFrom(this.params$), map(([_, params]) => parseListParams(params)), switchMap(({ listParams, extraParams }) => this.config.fetcher(listParams, extraParams).pipe(map(list => ({
...sourceState,
items: list.items,
totalItems: list.metadata.totalItems,
})), catchError(() => NEVER))), startWith(sourceState))
: of(sourceState)), publishRef());
}
loadStateWithWatcher() {
return this.sourceLoadState().pipe(switchMap(sourceState => sourceState.loadSuccess
? this.params$.pipe(take(1), switchMap(params => {
const watchParams = parseListParams({
keyword: params.keyword,
extra: params.extra,
});
const fetchParams = parseListParams(params);
return this.config
.watcher(watchParams.listParams, watchParams.extraParams)
.pipe(filter(({ type, object }) => {
switch (type) {
case WatchEvent.Added: {
if (this.addedUid.has(object.metadata.uid)) {
return false;
}
this.addedUid.add(object.metadata.uid);
return true;
}
case WatchEvent.Deleted: {
if (this.deletedUid.has(object.metadata.uid)) {
return false;
}
this.deletedUid.add(object.metadata.uid);
return true;
}
default: {
return true;
}
}
}), switchScan((state, { type, object }) => {
switch (type) {
case WatchEvent.Modified: {
return of({
...state,
items: state.items.map(item => item.metadata.uid === object.metadata.uid
? object
: item),
});
}
case WatchEvent.Added:
case WatchEvent.Deleted: {
return this.config
.fetcher(fetchParams.listParams, fetchParams.extraParams)
.pipe(map(list => ({
...state,
items: list.items,
totalItems: list.metadata.totalItems,
})), catchError(() => NEVER));
}
default: {
return NEVER;
}
}
}, sourceState));
}), startWith(sourceState))
: of(sourceState)), publishRef());
}
}
export function extractPagedListParams(defaultParams = {}, extraParams) {
const route = inject(ActivatedRoute);
const params$ = route.queryParams.pipe(map(params => ({
...defaultParams,
...{
pageIndex: params.pageIndex || defaultParams.pageIndex || 0,
pageSize: params.pageSize || defaultParams.pageSize || 20,
},
...(params.keyword ? { keyword: params.keyword } : {}),
...(params.sortField ? { sortField: params.sortField } : {}),
...(params.sortOrder ? { sortOrder: params.sortOrder } : {}),
...(params.fieldSelector ? { fieldSelector: params.fieldSelector } : {}),
...(params.labelSelector ? { labelSelector: params.labelSelector } : {}),
...(extraParams ? { extra: extraParams(params) } : {}),
})));
return {
stream: () => params$,
signal: () => toSignal(params$),
};
}
export function queryListParams() {
const router = inject(Router);
const route = inject(ActivatedRoute);
return (queryParams) => {
router.navigate(['./'], {
relativeTo: route,
queryParamsHandling: 'merge',
queryParams,
});
};
}
function parseListParams({ pageIndex, pageSize, sortField, sortOrder, keyword, fieldSelector: originFieldSelector, labelSelector, extra: extraParams, }) {
const search = keyword ? `search=${keyword}` : '';
const sortBy = sortField
? `sortby=${sortOrder === 'desc' ? '-' : ''}${sortField}`
: '';
const fieldSelector = [search, sortBy, originFieldSelector]
.filter(v => !!v)
.join(',');
return {
listParams: {
limit: (pageSize || 20) + '',
continue: +(pageIndex || 0) * +(pageSize || 20) + '',
...(labelSelector ? { labelSelector } : {}),
...(fieldSelector ? { fieldSelector } : {}),
},
extraParams,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiazhzLXJlc291cmNlLXBhZ2VkLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvazhzLXJlc291cmNlLWxpc3QvazhzLXJlc291cmNlLXBhZ2VkLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQVUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUNMLEtBQUssRUFFTCxPQUFPLEVBQ1AsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBQ1IsWUFBWSxFQUNaLEdBQUcsRUFDSCxFQUFFLEVBQ0YsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsSUFBSSxFQUNKLGNBQWMsR0FDZixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBb0IsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakUsT0FBTyxFQUNMLHVCQUF1QixFQUN2Qix1QkFBdUIsRUFJdkIsVUFBVSxHQUNYLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsTUFBTSxPQUFPLG9CQUFvQjtJQTZCL0IsWUFBNkIsTUFBNkI7UUFBN0IsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUF6QnpDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQy9CLGFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQzdCLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRWhELFlBQU8sR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDeEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUNwQixDQUFDLENBQUMsWUFBWSxDQUFDLElB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TUFBTSxNQUFNLEdBQUcsU0FBUztRQUN0QixDQUFDLENBQUMsVUFBVSxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUU7UUFDekQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNQLE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQztTQUN4RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNiLE9BQU87UUFDTCxVQUFVLEVBQUU7WUFDVixLQUFLLEVBQUUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRTtZQUM1QixRQUFRLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUU7WUFDcEQsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUMvQjtRQUNkLFdBQVc7S0FDWixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgU2lnbmFsLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgTkVWRVIsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIGNhdGNoRXJyb3IsXG4gIGZpbHRlcixcbiAgaW50ZXJ2YWwsXG4gIGlzT2JzZXJ2YWJsZSxcbiAgbWFwLFxuICBvZixcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHN3aXRjaFNjYW4sXG4gIHRha2UsXG4gIHdpdGhMYXRlc3RGcm9tLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgV2F0Y2hBUElSZXNwb25zZSwgV2F0Y2hFdmVudCB9IGZyb20gJy4uL2FwaS9wdWJsaWMtYXBpJztcbmltcG9ydCB7XG4gIERPV05HUkFERV9XQVRDSF9FTkFCTEVELFxuICBET1dOR1JBREVfV0FUQ0hfUE9MTElORyxcbiAgS3ViZXJuZXRlc1Jlc291cmNlLFxuICBLdWJlcm5ldGVzUmVzb3VyY2VMaXN0LFxuICBTdGF0dXMsXG4gIHB1Ymxpc2hSZWYsXG59IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5cbmV4cG9ydCBjbGFzcyBLOFNSZXNvdXJjZVBhZ2VkTGlzdDxcbiAgUiBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZSA9IEt1YmVybmV0ZXNSZXNvdXJjZSxcbiAgUCA9IHVua25vd24sXG4+IHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWxvYWQkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkZWRVaWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkVWlkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcGFyYW1zJCA9IGlzT2JzZXJ2YWJsZSh0aGlzLmNvbmZpZy5wYXJhbXMpXG4gICAgPyB0aGlzLmNvbmZpZy5wYXJhbXNcbiAgICA6IHRvT2JzZXJ2YWJsZSh0aGlzLmNvbmZpZy5wYXJhbXMpO1xuXG4gIGxvYWRTdGF0ZSQgPVxuICAgIHRoaXMuY29uZmlnLndhdGNoZXIgJiYgIURPV05HUkFERV9XQVRDSF9FTkFCTEVEXG4gICAgICA/IHRoaXMubG9hZFN0YXRlV2l0aFdhdGNoZXIoKVxuICAgICAgOiB0aGlzLmNvbmZpZy53YXRjaGVyIHx8IHRoaXMuY29uZmlnLnBvbGxpbmdcbiAgICAgICAgPyB0aGlzLmxvYWRTdGF0ZVdpdGhQb2xsaW5nKClcbiAgICAgICAgOiB0aGlzLnNvdXJjZUxvYWRTdGF0ZSgpO1xuXG4gIGxvYWRpbmckID0gdGhpcy5sb2FkU3RhdGUkLnBpcGUobWFwKHN0YXRlID0+IHN0YXRlLmxvYWRpbmcpKTtcbiAgaXRlbXMkID0gdGhpcy5sb2FkU3RhdGUkLnBpcGUobWFwKHN0YXRlID0+IHN0YXRlLml0ZW1zKSk7XG4gIHRvdGFsSXRlbXMkID0gdGhpcy5sb2FkU3RhdGUkLnBpcGUobWFwKHN0YXRlID0+IHN0YXRlLnRvdGFsSXRlbXMpKTtcbiAgbG9hZEVycm9yJCA9IHRoaXMubG9hZFN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS5sb2FkRXJyb3IpKTtcblxuICAkbG9hZGluZyA9IHRvU2lnbmFsKHRoaXMubG9hZGluZyQpO1xuICAkaXRlbXMgPSB0b1NpZ25hbCh0aGlzLml0ZW1zJCk7XG4gICR0b3RhbEl0ZW1zID0gdG9TaWduYWwodGhpcy50b3RhbEl0ZW1zJCk7XG4gICRsb2FkRXJyb3IgPSB0b1NpZ25hbCh0aGlzLmxvYWRFcnJvciQpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBQYWdlZExpc3RDb25maWc8UiwgUD4pIHt9XG5cbiAgcmVsb2FkKCkge1xuICAgIHRoaXMucmVsb2FkJCQubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3VyY2VMb2FkU3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zJC5waXBlKFxuICAgICAgbWFwKHBhcnNlTGlzdFBhcmFtcyksXG4gICAgICBzd2l0Y2hNYXAoKHsgbGlzdFBhcmFtcywgZXh0cmFQYXJhbXMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWxvYWQkJC5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKCk6IE9ic2VydmFibGU8TG9hZFN0YXRlPFI+PiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZmV0Y2hlcihsaXN0UGFyYW1zLCBleHRyYVBhcmFtcykucGlwZShcbiAgICAgICAgICAgICAgbWFwKGxpc3QgPT4gKHtcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsb2FkU3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpdGVtczogbGlzdC5pdGVtcyA/PyBbXSxcbiAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zOiBsaXN0Lm1ldGFkYXRhLnRvdGFsSXRlbXMgPz8gMCxcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICBzdGFydFdpdGgoe1xuICAgICAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9hZFN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zOiAwLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBTdGF0dXMgfCBIdHRwRXJyb3JSZXNwb25zZSkgPT5cbiAgICAgICAgICAgICAgICBvZih7XG4gICAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGxvYWRTdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGxvYWRFcnJvcjogZXJyLFxuICAgICAgICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgICAgICAgdG90YWxJdGVtczogMCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkU3RhdGVXaXRoUG9sbGluZygpOiBPYnNlcnZhYmxlPExvYWRTdGF0ZTxSPj4ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZUxvYWRTdGF0ZSgpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoc291cmNlU3RhdGUgPT5cbiAgICAgICAgc291cmNlU3RhdGUubG9hZFN1Y2Nlc3NcbiAgICAgICAgICA/IGludGVydmFsKHRoaXMuY29uZmlnLnBvbGxpbmcgfHwgRE9XTkdSQURFX1dBVENIX1BPTExJTkcpLnBpcGUoXG4gICAgICAgICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMucGFyYW1zJCksXG4gICAgICAgICAgICAgIG1hcCgoW18sIHBhcmFtc10pID0+IHBhcnNlTGlzdFBhcmFtcyhwYXJhbXMpKSxcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCh7IGxpc3RQYXJhbXMsIGV4dHJhUGFyYW1zIH0pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZmV0Y2hlcihsaXN0UGFyYW1zLCBleHRyYVBhcmFtcykucGlwZShcbiAgICAgICAgICAgICAgICAgIG1hcChsaXN0ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnNvdXJjZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogbGlzdC5pdGVtcyxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtczogbGlzdC5tZXRhZGF0YS50b3RhbEl0ZW1zLFxuICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBORVZFUiksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc3RhcnRXaXRoKHNvdXJjZVN0YXRlKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IG9mKHNvdXJjZVN0YXRlKSxcbiAgICAgICksXG4gICAgICBwdWJsaXNoUmVmKCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFN0YXRlV2l0aFdhdGNoZXIoKTogT2JzZXJ2YWJsZTxMb2FkU3RhdGU8Uj4+IHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VMb2FkU3RhdGUoKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKHNvdXJjZVN0YXRlID0+XG4gICAgICAgIHNvdXJjZVN0YXRlLmxvYWRTdWNjZXNzXG4gICAgICAgICAgPyB0aGlzLnBhcmFtcyQucGlwZShcbiAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKHBhcmFtcyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2F0Y2hQYXJhbXMgPSBwYXJzZUxpc3RQYXJhbXMoe1xuICAgICAgICAgICAgICAgICAga2V5d29yZDogcGFyYW1zLmtleXdvcmQsXG4gICAgICAgICAgICAgICAgICBleHRyYTogcGFyYW1zLmV4dHJhLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZldGNoUGFyYW1zID0gcGFyc2VMaXN0UGFyYW1zKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnXG4gICAgICAgICAgICAgICAgICAud2F0Y2hlcih3YXRjaFBhcmFtcy5saXN0UGFyYW1zLCB3YXRjaFBhcmFtcy5leHRyYVBhcmFtcylcbiAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKHsgdHlwZSwgb2JqZWN0IH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2F0Y2hFdmVudC5BZGRlZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hZGRlZFVpZC5oYXMob2JqZWN0Lm1ldGFkYXRhLnVpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRlZFVpZC5hZGQob2JqZWN0Lm1ldGFkYXRhLnVpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXYXRjaEV2ZW50LkRlbGV0ZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVsZXRlZFVpZC5oYXMob2JqZWN0Lm1ldGFkYXRhLnVpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkVWlkLmFkZChvYmplY3QubWV0YWRhdGEudWlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaFNjYW4oKHN0YXRlLCB7IHR5cGUsIG9iamVjdCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdhdGNoRXZlbnQuTW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogc3RhdGUuaXRlbXMubWFwKGl0ZW0gPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWV0YWRhdGEudWlkID09PSBvYmplY3QubWV0YWRhdGEudWlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2F0Y2hFdmVudC5BZGRlZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2F0Y2hFdmVudC5EZWxldGVkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mZXRjaGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hQYXJhbXMubGlzdFBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoUGFyYW1zLmV4dHJhUGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChsaXN0ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogbGlzdC5pdGVtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtczogbGlzdC5tZXRhZGF0YS50b3RhbEl0ZW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBORVZFUiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5FVkVSO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgc291cmNlU3RhdGUpLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHN0YXJ0V2l0aChzb3VyY2VTdGF0ZSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBvZihzb3VyY2VTdGF0ZSksXG4gICAgICApLFxuICAgICAgcHVibGlzaFJlZigpLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdlZExpc3RDb25maWc8UiwgUD4ge1xuICBwYXJhbXM6IFNpZ25hbDxMaXN0RmV0Y2hQYXJhbXM8UD4+IHwgT2JzZXJ2YWJsZTxMaXN0RmV0Y2hQYXJhbXM8UD4+O1xuICBmZXRjaGVyOiAoXG4gICAgbGlzdFBhcmFtczogRmV0Y2hTZWVkLFxuICAgIGV4dHJhUGFyYW1zOiBQLFxuICApID0+IE9ic2VydmFibGU8S3ViZXJuZXRlc1Jlc291cmNlTGlzdDxSPj47XG4gIHdhdGNoZXI/OiAoXG4gICAgbGlzdFBhcmFtczogRmV0Y2hTZWVkLFxuICAgIGV4dHJhUGFyYW1zOiBQLFxuICApID0+IE9ic2VydmFibGU8V2F0Y2hBUElSZXNwb25zZTxSPj47XG4gIHBvbGxpbmc/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEZldGNoUGFyYW1zPFAgPSBuZXZlcj4ge1xuICBwYWdlSW5kZXg/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHBhZ2VTaXplPzogbnVtYmVyIHwgc3RyaW5nO1xuICBzb3J0RmllbGQ/OiBzdHJpbmc7XG4gIHNvcnRPcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xuICBrZXl3b3JkPzogc3RyaW5nO1xuICBmaWVsZFNlbGVjdG9yPzogc3RyaW5nO1xuICBsYWJlbFNlbGVjdG9yPzogc3RyaW5nO1xuICBleHRyYT86IFA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hTZWVkIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGxpbWl0Pzogc3RyaW5nO1xuICBjb250aW51ZT86IHN0cmluZztcbiAgZmllbGRTZWxlY3Rvcj86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExvYWRTdGF0ZTxSPiB7XG4gIGl0ZW1zOiBSW107XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgbG9hZGluZzogYm9vbGVhbjtcbiAgbG9hZFN1Y2Nlc3M6IGJvb2xlYW47XG4gIGxvYWRFcnJvcj86IEh0dHBFcnJvclJlc3BvbnNlIHwgU3RhdHVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBhZ2VkTGlzdFBhcmFtczxQPihcbiAgZGVmYXVsdFBhcmFtczogTGlzdEZldGNoUGFyYW1zID0ge30sXG4gIGV4dHJhUGFyYW1zPzogKHF1ZXJ5UGFyYW1zOiBQYXJhbXMpID0+IFAsXG4pOiBSZWFkb25seTx7XG4gIHN0cmVhbTogKCkgPT4gT2JzZXJ2YWJsZTxMaXN0RmV0Y2hQYXJhbXM8UD4+O1xuICBzaWduYWw6ICgpID0+IFNpZ25hbDxMaXN0RmV0Y2hQYXJhbXM8UD4+O1xufT4ge1xuICBjb25zdCByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG4gIGNvbnN0IHBhcmFtcyQgPSByb3V0ZS5xdWVyeVBhcmFtcy5waXBlKFxuICAgIG1hcChwYXJhbXMgPT4gKHtcbiAgICAgIC4uLmRlZmF1bHRQYXJhbXMsXG4gICAgICAuLi57XG4gICAgICAgIHBhZ2VJbmRleDogcGFyYW1zLnBhZ2VJbmRleCB8fCBkZWZhdWx0UGFyYW1zLnBhZ2VJbmRleCB8fCAwLFxuICAgICAgICBwYWdlU2l6ZTogcGFyYW1zLnBhZ2VTaXplIHx8IGRlZmF1bHRQYXJhbXMucGFnZVNpemUgfHwgMjAsXG4gICAgICB9LFxuICAgICAgLi4uKHBhcmFtcy5rZXl3b3JkID8geyBrZXl3b3JkOiBwYXJhbXMua2V5d29yZCB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy5zb3J0RmllbGQgPyB7IHNvcnRGaWVsZDogcGFyYW1zLnNvcnRGaWVsZCB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy5zb3J0T3JkZXIgPyB7IHNvcnRPcmRlcjogcGFyYW1zLnNvcnRPcmRlciB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy5maWVsZFNlbGVjdG9yID8geyBmaWVsZFNlbGVjdG9yOiBwYXJhbXMuZmllbGRTZWxlY3RvciB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy5sYWJlbFNlbGVjdG9yID8geyBsYWJlbFNlbGVjdG9yOiBwYXJhbXMubGFiZWxTZWxlY3RvciB9IDoge30pLFxuICAgICAgLi4uKGV4dHJhUGFyYW1zID8geyBleHRyYTogZXh0cmFQYXJhbXMocGFyYW1zKSB9IDoge30pLFxuICAgIH0pKSxcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHN0cmVhbTogKCkgPT4gcGFyYW1zJCxcbiAgICBzaWduYWw6ICgpID0+IHRvU2lnbmFsKHBhcmFtcyQpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlMaXN0UGFyYW1zKCkge1xuICBjb25zdCByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgY29uc3Qgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuXG4gIHJldHVybiAocXVlcnlQYXJhbXM6IFBhcmFtcykgPT4ge1xuICAgIHJvdXRlci5uYXZpZ2F0ZShbJy4vJ10sIHtcbiAgICAgIHJlbGF0aXZlVG86IHJvdXRlLFxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgICAgIHF1ZXJ5UGFyYW1zLFxuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpc3RQYXJhbXM8UD4oe1xuICBwYWdlSW5kZXgsXG4gIHBhZ2VTaXplLFxuICBzb3J0RmllbGQsXG4gIHNvcnRPcmRlcixcbiAga2V5d29yZCxcbiAgZmllbGRTZWxlY3Rvcjogb3JpZ2luRmllbGRTZWxlY3RvcixcbiAgbGFiZWxTZWxlY3RvcixcbiAgZXh0cmE6IGV4dHJhUGFyYW1zLFxufTogTGlzdEZldGNoUGFyYW1zPFA+KSB7XG4gIGNvbnN0IHNlYXJjaCA9IGtleXdvcmQgPyBgc2VhcmNoPSR7a2V5d29yZH1gIDogJyc7XG4gIGNvbnN0IHNvcnRCeSA9IHNvcnRGaWVsZFxuICAgID8gYHNvcnRieT0ke3NvcnRPcmRlciA9PT0gJ2Rlc2MnID8gJy0nIDogJyd9JHtzb3J0RmllbGR9YFxuICAgIDogJyc7XG4gIGNvbnN0IGZpZWxkU2VsZWN0b3IgPSBbc2VhcmNoLCBzb3J0QnksIG9yaWdpbkZpZWxkU2VsZWN0b3JdXG4gICAgLmZpbHRlcih2ID0+ICEhdilcbiAgICAuam9pbignLCcpO1xuICByZXR1cm4ge1xuICAgIGxpc3RQYXJhbXM6IHtcbiAgICAgIGxpbWl0OiAocGFnZVNpemUgfHwgMjApICsgJycsXG4gICAgICBjb250aW51ZTogKyhwYWdlSW5kZXggfHwgMCkgKiArKHBhZ2VTaXplIHx8IDIwKSArICcnLFxuICAgICAgLi4uKGxhYmVsU2VsZWN0b3IgPyB7IGxhYmVsU2VsZWN0b3IgfSA6IHt9KSxcbiAgICAgIC4uLihmaWVsZFNlbGVjdG9yID8geyBmaWVsZFNlbGVjdG9yIH0gOiB7fSksXG4gICAgfSBhcyBGZXRjaFNlZWQsXG4gICAgZXh0cmFQYXJhbXMsXG4gIH07XG59XG4iXX0=