UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

170 lines 27.9 kB
/** * @packageDocumentation * @module utils */ import { DialogService, MessageService } from '@alauda/ui'; import { Injectable, Injector } from '@angular/core'; import { get } from 'lodash-es'; import { from, throwError, of, catchError, switchMap, tap, } from 'rxjs'; import { K8sApiService, } from '../../api/public-api'; import { TranslateService } from '../../translate/public-api'; import { SPACE, TOKEN_BASE_DOMAIN } from '../constants/public-api'; import { catchPromise, skipError, ifExist, wrapText, } from '../utils/public-api'; import * as i0 from "@angular/core"; export const METADATA = 'metadata'; export const NAMESPACE = 'namespace'; export const NAME = 'name'; export const CREATION_TIMESTAMP = 'creationTimestamp'; export const ANNOTATIONS = 'annotations'; export const LABELS = 'labels'; export const DISPLAY_NAME = 'display-name'; export const DESCRIPTION = 'description'; export const CREATOR = 'creator'; export const UPDATED__AT = 'updated-at'; export const PROJECT = 'project'; export const CLUSTER = 'cluster'; export class K8sUtilService { constructor(injector) { this.injector = injector; this.dialog = injector.get(DialogService); this.message = injector.get(MessageService); this.k8sApi = injector.get((K8sApiService)); this.translate = injector.get(TranslateService); this.baseDomain = injector.get(TOKEN_BASE_DOMAIN); } /** * @param type - 对应资源的翻译 key */ deleteResource(params, typeOrOptions) { const { type, content } = typeof typeOrOptions === 'string' ? { type: typeOrOptions, content: null } : typeOrOptions; return catchPromise(this.dialog.confirm({ title: this.translate.get('confirm_delete_resource', { type: this.translate.get(type), name: 'name' in params ? params.name : this.getName(params.resource), }), content, confirmText: this.translate.get('delete'), cancelText: this.translate.get('cancel'), beforeConfirm: () => ('cluster' in params ? this.k8sApi.deleteResource(params) : this.k8sApi.deleteGlobalResource(params)).pipe(tap(() => this.message.success(this.translate.get('delete_success'))), skipError()), })); } updateResource({ type, definition, cluster, resource, silent, }) { const put = (res) => this.k8sApi.putResource({ type, definition, cluster, resource: res, notifyOnError: !silent, }); const get = () => this.k8sApi.getResource({ type, definition, cluster, namespace: resource.metadata.namespace, name: resource.metadata.name, }); return this.retryUpdate(put, get, resource, silent); } updateGlobalResource({ type, definition, namespaced, resource, namespace, silent, }) { const put = (res) => this.k8sApi.putGlobalResource({ type, definition, namespaced, resource: res, namespace, notifyOnError: !silent, }); const get = () => this.k8sApi.getGlobalResource({ type, definition, namespaced, name: resource.metadata.name, namespace, }); return this.retryUpdate(put, get, resource, silent); } normalizeType(typeOrParams, prefix) { if (typeof typeOrParams === 'string') { return `${ifExist(prefix, prefix + '.')}${this.baseDomain}/${typeOrParams}`; } return `${ifExist(typeOrParams.prefix, typeOrParams.prefix + '.')}${typeOrParams.baseDomain}/${typeOrParams.type}`; } getAnnotation(resource, paramsOrType, prefix) { return get(resource, [ METADATA, ANNOTATIONS, this.normalizeType(paramsOrType, prefix), ]); } getNamespace(resource) { return get(resource, [METADATA, NAMESPACE]); } getName(resource) { return get(resource, [METADATA, NAME]); } getCreationTimestamp(resource) { return get(resource, [METADATA, CREATION_TIMESTAMP]); } getDisplayName(resource, prefix) { return this.getAnnotation(resource, DISPLAY_NAME, prefix); } getUnionDisplayName(resource, namePrefix, displayNamePrefix) { if (!resource) { return; } const name = (namePrefix !== false && this.getAnnotation(resource, NAME, namePrefix)) || this.getName(resource); const displayName = this.getDisplayName(resource, displayNamePrefix); return name + ifExist(displayName, SPACE + wrapText(displayName)); } getDescription(resource, prefix) { return this.getAnnotation(resource, DESCRIPTION, prefix); } getCreator(resource, prefix) { return this.getAnnotation(resource, CREATOR, prefix); } getUpdatedAt(resource, prefix) { return this.getAnnotation(resource, UPDATED__AT, prefix); } getLabel(resource, paramsOrType, prefix) { return get(resource, [ METADATA, LABELS, this.normalizeType(paramsOrType, prefix), ]); } getProject(resource) { return this.getLabel(resource, PROJECT); } retryUpdate(put, get, resource, silent) { const waitUserConfirmRetry = (err) => (silent ? of(null) : from(this.dialog.confirm({ title: this.translate.get('resource_version_conflict'), content: this.translate.get('confirm_retry_with_latest_version'), confirmText: this.translate.get('confirm'), cancelText: this.translate.get('cancel'), }))).pipe(switchMap(() => get().pipe(switchMap(newResource => put({ ...resource, metadata: { ...resource.metadata, resourceVersion: newResource.metadata.resourceVersion, }, })), catchError(() => this.retryUpdate(put, get, resource, silent)))), catchError(() => throwError(() => err))); return put(resource).pipe(catchError((err) => err.code === 409 ? waitUserConfirmRetry(err) : throwError(() => err))); } static { this.ɵfac = function K8sUtilService_Factory(t) { return new (t || K8sUtilService)(i0.ɵɵinject(i0.Injector)); }; } static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: K8sUtilService, factory: K8sUtilService.ɵfac, providedIn: 'root' }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(K8sUtilService, [{ type: Injectable, args: [{ providedIn: 'root', }] }], () => [{ type: i0.Injector }], null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiazhzLXV0aWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jb3JlL3NlcnZpY2VzL2s4cy11dGlsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBRUwsSUFBSSxFQUNKLFVBQVUsRUFDVixFQUFFLEVBQ0YsVUFBVSxFQUNWLFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQ0wsYUFBYSxHQUdkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5FLE9BQU8sRUFDTCxZQUFZLEVBQ1osU0FBUyxFQUNULE9BQU8sRUFDUCxRQUFRLEdBQ1QsTUFBTSxxQkFBcUIsQ0FBQzs7QUFFN0IsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztBQUNuQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUM7QUFDM0IsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7QUFDdEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQztBQUN6QyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLFlBQVks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QUMsR0FBVyxFQUFFLEVBQUUsQ0FDekIsR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQ3JFLENBQ0YsQ0FBQztJQUNKLENBQUM7K0VBOVFVLGNBQWM7dUVBQWQsY0FBYyxXQUFkLGNBQWMsbUJBRmIsTUFBTTs7aUZBRVAsY0FBYztjQUgxQixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSB1dGlsc1xuICovXG5cbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIGZyb20sXG4gIHRocm93RXJyb3IsXG4gIG9mLFxuICBjYXRjaEVycm9yLFxuICBzd2l0Y2hNYXAsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIEs4c0FwaVNlcnZpY2UsXG4gIEs4c1Jlc291cmNlRGVmaW5pdGlvbixcbiAgUmVzb3VyY2VEZWxldGVQYXJhbXMsXG59IGZyb20gJy4uLy4uL2FwaS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi90cmFuc2xhdGUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBTUEFDRSwgVE9LRU5fQkFTRV9ET01BSU4gfSBmcm9tICcuLi9jb25zdGFudHMvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBLdWJlcm5ldGVzUmVzb3VyY2UsIFN0YXR1cyB9IGZyb20gJy4uL3R5cGVzL3B1YmxpYy1hcGknO1xuaW1wb3J0IHtcbiAgY2F0Y2hQcm9taXNlLFxuICBza2lwRXJyb3IsXG4gIGlmRXhpc3QsXG4gIHdyYXBUZXh0LFxufSBmcm9tICcuLi91dGlscy9wdWJsaWMtYXBpJztcblxuZXhwb3J0IGNvbnN0IE1FVEFEQVRBID0gJ21ldGFkYXRhJztcbmV4cG9ydCBjb25zdCBOQU1FU1BBQ0UgPSAnbmFtZXNwYWNlJztcbmV4cG9ydCBjb25zdCBOQU1FID0gJ25hbWUnO1xuZXhwb3J0IGNvbnN0IENSRUFUSU9OX1RJTUVTVEFNUCA9ICdjcmVhdGlvblRpbWVzdGFtcCc7XG5leHBvcnQgY29uc3QgQU5OT1RBVElPTlMgPSAnYW5ub3RhdGlvbnMnO1xuZXhwb3J0IGNvbnN0IExBQkVMUyA9ICdsYWJlbHMnO1xuZXhwb3J0IGNvbnN0IERJU1BMQVlfTkFNRSA9ICdkaXNwbGF5LW5hbWUnO1xuZXhwb3J0IGNvbnN0IERFU0NSSVBUSU9OID0gJ2Rlc2NyaXB0aW9uJztcbmV4cG9ydCBjb25zdCBDUkVBVE9SID0gJ2NyZWF0b3InO1xuZXhwb3J0IGNvbnN0IFVQREFURURfX0FUID0gJ3VwZGF0ZWQtYXQnO1xuZXhwb3J0IGNvbnN0IFBST0pFQ1QgPSAncHJvamVjdCc7XG5leHBvcnQgY29uc3QgQ0xVU1RFUiA9ICdjbHVzdGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlTm9ybWFsaXplVHlwZVBhcmFtcyB7XG4gIHR5cGU6IHN0cmluZztcbiAgYmFzZURvbWFpbjogc3RyaW5nO1xuICBwcmVmaXg/OiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBLOHNVdGlsU2VydmljZTxSIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIHByb3RlY3RlZCBkaWFsb2c6IERpYWxvZ1NlcnZpY2U7XG4gIHByb3RlY3RlZCBtZXNzYWdlOiBNZXNzYWdlU2VydmljZTtcbiAgcHJvdGVjdGVkIGs4c0FwaTogSzhzQXBpU2VydmljZTxSPjtcbiAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZTtcbiAgcHJvdGVjdGVkIGJhc2VEb21haW46IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5kaWFsb2cgPSBpbmplY3Rvci5nZXQoRGlhbG9nU2VydmljZSBhcyBUeXBlPERpYWxvZ1NlcnZpY2U+KTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBpbmplY3Rvci5nZXQoTWVzc2FnZVNlcnZpY2UgYXMgVHlwZTxNZXNzYWdlU2VydmljZT4pO1xuICAgIHRoaXMuazhzQXBpID0gaW5qZWN0b3IuZ2V0KEs4c0FwaVNlcnZpY2U8Uj4gYXMgVHlwZTxLOHNBcGlTZXJ2aWNlPik7XG4gICAgdGhpcy50cmFuc2xhdGUgPSBpbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSBhcyBUeXBlPFRyYW5zbGF0ZVNlcnZpY2U+KTtcbiAgICB0aGlzLmJhc2VEb21haW4gPSBpbmplY3Rvci5nZXQoVE9LRU5fQkFTRV9ET01BSU4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0eXBlIC0g5a+55bqU6LWE5rqQ55qE57+76K+RIGtleVxuICAgKi9cbiAgZGVsZXRlUmVzb3VyY2U8VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4oXG4gICAgcGFyYW1zOiBSZXNvdXJjZURlbGV0ZVBhcmFtczxSLCBUPixcbiAgICB0eXBlT3JPcHRpb25zOiBzdHJpbmcgfCB7IHR5cGU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0sXG4gICkge1xuICAgIGNvbnN0IHsgdHlwZSwgY29udGVudCB9ID1cbiAgICAgIHR5cGVvZiB0eXBlT3JPcHRpb25zID09PSAnc3RyaW5nJ1xuICAgICAgICA/IHsgdHlwZTogdHlwZU9yT3B0aW9ucywgY29udGVudDogbnVsbCB9XG4gICAgICAgIDogdHlwZU9yT3B0aW9ucztcbiAgICByZXR1cm4gY2F0Y2hQcm9taXNlKFxuICAgICAgdGhpcy5kaWFsb2cuY29uZmlybSh7XG4gICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5nZXQoJ2NvbmZpcm1fZGVsZXRlX3Jlc291cmNlJywge1xuICAgICAgICAgIHR5cGU6IHRoaXMudHJhbnNsYXRlLmdldCh0eXBlKSxcbiAgICAgICAgICBuYW1lOiAnbmFtZScgaW4gcGFyYW1zID8gcGFyYW1zLm5hbWUgOiB0aGlzLmdldE5hbWUocGFyYW1zLnJlc291cmNlKSxcbiAgICAgICAgfSksXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZS5nZXQoJ2RlbGV0ZScpLFxuICAgICAgICBjYW5jZWxUZXh0OiB0aGlzLnRyYW5zbGF0ZS5nZXQoJ2NhbmNlbCcpLFxuICAgICAgICBiZWZvcmVDb25maXJtOiAoKSA9PlxuICAgICAgICAgICgnY2x1c3RlcicgaW4gcGFyYW1zXG4gICAgICAgICAgICA/IHRoaXMuazhzQXBpLmRlbGV0ZVJlc291cmNlKHBhcmFtcylcbiAgICAgICAgICAgIDogdGhpcy5rOHNBcGkuZGVsZXRlR2xvYmFsUmVzb3VyY2UocGFyYW1zKVxuICAgICAgICAgICkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PlxuICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uuc3VjY2Vzcyh0aGlzLnRyYW5zbGF0ZS5nZXQoJ2RlbGV0ZV9zdWNjZXNzJykpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHNraXBFcnJvcigpLFxuICAgICAgICAgICksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlUmVzb3VyY2U8VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4oe1xuICAgIHR5cGUsXG4gICAgZGVmaW5pdGlvbixcbiAgICBjbHVzdGVyLFxuICAgIHJlc291cmNlLFxuICAgIHNpbGVudCxcbiAgfToge1xuICAgIHR5cGU/OiBSO1xuICAgIGRlZmluaXRpb24/OiBLOHNSZXNvdXJjZURlZmluaXRpb247XG4gICAgY2x1c3Rlcjogc3RyaW5nO1xuICAgIHJlc291cmNlOiBUO1xuICAgIHNpbGVudD86IGJvb2xlYW47XG4gIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBjb25zdCBwdXQgPSAocmVzOiBUKSA9PlxuICAgICAgdGhpcy5rOHNBcGkucHV0UmVzb3VyY2Uoe1xuICAgICAgICB0eXBlLFxuICAgICAgICBkZWZpbml0aW9uLFxuICAgICAgICBjbHVzdGVyLFxuICAgICAgICByZXNvdXJjZTogcmVzLFxuICAgICAgICBub3RpZnlPbkVycm9yOiAhc2lsZW50LFxuICAgICAgfSk7XG4gICAgY29uc3QgZ2V0ID0gKCkgPT5cbiAgICAgIHRoaXMuazhzQXBpLmdldFJlc291cmNlPFQ+KHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgZGVmaW5pdGlvbixcbiAgICAgICAgY2x1c3RlcixcbiAgICAgICAgbmFtZXNwYWNlOiByZXNvdXJjZS5tZXRhZGF0YS5uYW1lc3BhY2UsXG4gICAgICAgIG5hbWU6IHJlc291cmNlLm1ldGFkYXRhLm5hbWUsXG4gICAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLnJldHJ5VXBkYXRlKHB1dCwgZ2V0LCByZXNvdXJjZSwgc2lsZW50KTtcbiAgfVxuXG4gIHVwZGF0ZUdsb2JhbFJlc291cmNlPFQgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+KHtcbiAgICB0eXBlLFxuICAgIGRlZmluaXRpb24sXG4gICAgbmFtZXNwYWNlZCxcbiAgICByZXNvdXJjZSxcbiAgICBuYW1lc3BhY2UsXG4gICAgc2lsZW50LFxuICB9OiB7XG4gICAgdHlwZT86IFI7XG4gICAgZGVmaW5pdGlvbj86IEs4c1Jlc291cmNlRGVmaW5pdGlvbjtcbiAgICBuYW1lc3BhY2VkPzogYm9vbGVhbjtcbiAgICByZXNvdXJjZTogVDtcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gICAgc2lsZW50PzogYm9vbGVhbjtcbiAgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgIGNvbnN0IHB1dCA9IChyZXM6IFQpID0+XG4gICAgICB0aGlzLms4c0FwaS5wdXRHbG9iYWxSZXNvdXJjZSh7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGRlZmluaXRpb24sXG4gICAgICAgIG5hbWVzcGFjZWQsXG4gICAgICAgIHJlc291cmNlOiByZXMsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgbm90aWZ5T25FcnJvcjogIXNpbGVudCxcbiAgICAgIH0pO1xuICAgIGNvbnN0IGdldCA9ICgpID0+XG4gICAgICB0aGlzLms4c0FwaS5nZXRHbG9iYWxSZXNvdXJjZTxUPih7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGRlZmluaXRpb24sXG4gICAgICAgIG5hbWVzcGFjZWQsXG4gICAgICAgIG5hbWU6IHJlc291cmNlLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMucmV0cnlVcGRhdGUocHV0LCBnZXQsIHJlc291cmNlLCBzaWxlbnQpO1xuICB9XG5cbiAgLy8gcmVmZXJlbmNlOiBodHRwOi8vY29uZmx1ZW5jZS5hbGF1ZGF0ZWNoLmNvbS9wYWdlcy92aWV3cGFnZS5hY3Rpb24/cGFnZUlkPTI3MTY2OTQ2XG4gIG5vcm1hbGl6ZVR5cGUodHlwZTogc3RyaW5nLCBwcmVmaXg/OiBzdHJpbmcpOiBzdHJpbmc7XG4gIG5vcm1hbGl6ZVR5cGUocGFyYW1zOiBCYXNlTm9ybWFsaXplVHlwZVBhcmFtcyk6IHN0cmluZztcbiAgbm9ybWFsaXplVHlwZShcbiAgICB0eXBlT3JQYXJhbXM6IHN0cmluZyB8IEJhc2VOb3JtYWxpemVUeXBlUGFyYW1zLFxuICAgIHByZWZpeD86IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIHR5cGVPclBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBgJHtpZkV4aXN0KHByZWZpeCwgcHJlZml4ICsgJy4nKX0ke1xuICAgICAgICB0aGlzLmJhc2VEb21haW5cbiAgICAgIH0vJHt0eXBlT3JQYXJhbXN9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7aWZFeGlzdCh0eXBlT3JQYXJhbXMucHJlZml4LCB0eXBlT3JQYXJhbXMucHJlZml4ICsgJy4nKX0ke1xuICAgICAgdHlwZU9yUGFyYW1zLmJhc2VEb21haW5cbiAgICB9LyR7dHlwZU9yUGFyYW1zLnR5cGV9YDtcbiAgfVxuXG4gIGdldEFubm90YXRpb248VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4oXG4gICAgcmVzb3VyY2U6IFQsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHByZWZpeD86IHN0cmluZyxcbiAgKTogc3RyaW5nO1xuXG4gIGdldEFubm90YXRpb248VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4oXG4gICAgcmVzb3VyY2U6IFQsXG4gICAgcGFyYW1zOiBCYXNlTm9ybWFsaXplVHlwZVBhcmFtcyxcbiAgKTogc3RyaW5nO1xuXG4gIGdldEFubm90YXRpb248VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4oXG4gICAgcmVzb3VyY2U6IFQsXG4gICAgcGFyYW1zT3JUeXBlOiBzdHJpbmcgfCBCYXNlTm9ybWFsaXplVHlwZVBhcmFtcyxcbiAgICBwcmVmaXg/OiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldChyZXNvdXJjZSwgW1xuICAgICAgTUVUQURBVEEsXG4gICAgICBBTk5PVEFUSU9OUyxcbiAgICAgIHRoaXMubm9ybWFsaXplVHlwZShwYXJhbXNPclR5cGUgYXMgc3RyaW5nLCBwcmVmaXgpLFxuICAgIF0pO1xuICB9XG5cbiAgZ2V0TmFtZXNwYWNlPFQgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+KHJlc291cmNlOiBUKSB7XG4gICAgcmV0dXJuIGdldChyZXNvdXJjZSwgW01FVEFEQVRBLCBOQU1FU1BBQ0VdKTtcbiAgfVxuXG4gIGdldE5hbWU8VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4ocmVzb3VyY2U6IFQpIHtcbiAgICByZXR1cm4gZ2V0KHJlc291cmNlLCBbTUVUQURBVEEsIE5BTUVdKTtcbiAgfVxuXG4gIGdldENyZWF0aW9uVGltZXN0YW1wPFQgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+KHJlc291cmNlOiBUKSB7XG4gICAgcmV0dXJuIGdldChyZXNvdXJjZSwgW01FVEFEQVRBLCBDUkVBVElPTl9USU1FU1RBTVBdKTtcbiAgfVxuXG4gIGdldERpc3BsYXlOYW1lPFQgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+KHJlc291cmNlOiBULCBwcmVmaXg/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uKHJlc291cmNlLCBESVNQTEFZX05BTUUsIHByZWZpeCk7XG4gIH1cblxuICBnZXRVbmlvbkRpc3BsYXlOYW1lPFQgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+KFxuICAgIHJlc291cmNlOiBULFxuICAgIG5hbWVQcmVmaXg/OiBzdHJpbmcgfCBmYWxzZSxcbiAgICBkaXNwbGF5TmFtZVByZWZpeD86IHN0cmluZyxcbiAgKSB7XG4gICAgaWYgKCFyZXNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID1cbiAgICAgIChuYW1lUHJlZml4ICE9PSBmYWxzZSAmJlxuICAgICAgICB0aGlzLmdldEFubm90YXRpb24ocmVzb3VyY2UsIE5BTUUsIG5hbWVQcmVmaXgpKSB8fFxuICAgICAgdGhpcy5nZXROYW1lKHJlc291cmNlKTtcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IHRoaXMuZ2V0RGlzcGxheU5hbWUocmVzb3VyY2UsIGRpc3BsYXlOYW1lUHJlZml4KTtcbiAgICByZXR1cm4gbmFtZSArIGlmRXhpc3QoZGlzcGxheU5hbWUsIFNQQUNFICsgd3JhcFRleHQoZGlzcGxheU5hbWUpKTtcbiAgfVxuXG4gIGdldERlc2NyaXB0aW9uPFQgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+KHJlc291cmNlOiBULCBwcmVmaXg/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uKHJlc291cmNlLCBERVNDUklQVElPTiwgcHJlZml4KTtcbiAgfVxuXG4gIGdldENyZWF0b3I8VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4ocmVzb3VyY2U6IFQsIHByZWZpeD86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmdldEFubm90YXRpb24ocmVzb3VyY2UsIENSRUFUT1IsIHByZWZpeCk7XG4gIH1cblxuICBnZXRVcGRhdGVkQXQ8VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4ocmVzb3VyY2U6IFQsIHByZWZpeD86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmdldEFubm90YXRpb24ocmVzb3VyY2UsIFVQREFURURfX0FULCBwcmVmaXgpO1xuICB9XG5cbiAgZ2V0TGFiZWw8VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4oXG4gICAgcmVzb3VyY2U6IFQsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHByZWZpeD86IHN0cmluZyxcbiAgKTogc3RyaW5nO1xuXG4gIGdldExhYmVsPFQgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+KFxuICAgIHJlc291cmNlOiBULFxuICAgIHBhcmFtczogQmFzZU5vcm1hbGl6ZVR5cGVQYXJhbXMsXG4gICk6IHN0cmluZztcblxuICBnZXRMYWJlbDxUIGV4dGVuZHMgS3ViZXJuZXRlc1Jlc291cmNlPihcbiAgICByZXNvdXJjZTogVCxcbiAgICBwYXJhbXNPclR5cGU6IHN0cmluZyB8IEJhc2VOb3JtYWxpemVUeXBlUGFyYW1zLFxuICAgIHByZWZpeD86IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0KHJlc291cmNlLCBbXG4gICAgICBNRVRBREFUQSxcbiAgICAgIExBQkVMUyxcbiAgICAgIHRoaXMubm9ybWFsaXplVHlwZShwYXJhbXNPclR5cGUgYXMgc3RyaW5nLCBwcmVmaXgpLFxuICAgIF0pO1xuICB9XG5cbiAgZ2V0UHJvamVjdDxUIGV4dGVuZHMgS3ViZXJuZXRlc1Jlc291cmNlPihyZXNvdXJjZTogVCkge1xuICAgIHJldHVybiB0aGlzLmdldExhYmVsKHJlc291cmNlLCBQUk9KRUNUKTtcbiAgfVxuXG4gIHByaXZhdGUgcmV0cnlVcGRhdGU8VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4oXG4gICAgcHV0OiAocmVzb3VyY2U6IFQpID0+IE9ic2VydmFibGU8VD4sXG4gICAgZ2V0OiAoKSA9PiBPYnNlcnZhYmxlPFQ+LFxuICAgIHJlc291cmNlOiBULFxuICAgIHNpbGVudD86IGJvb2xlYW4sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIGNvbnN0IHdhaXRVc2VyQ29uZmlybVJldHJ5ID0gKGVycjogU3RhdHVzKSA9PlxuICAgICAgKHNpbGVudFxuICAgICAgICA/IG9mKG51bGwpXG4gICAgICAgIDogZnJvbShcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLmNvbmZpcm0oe1xuICAgICAgICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGUuZ2V0KCdyZXNvdXJjZV92ZXJzaW9uX2NvbmZsaWN0JyksXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlLmdldCgnY29uZmlybV9yZXRyeV93aXRoX2xhdGVzdF92ZXJzaW9uJyksXG4gICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiB0aGlzLnRyYW5zbGF0ZS5nZXQoJ2NvbmZpcm0nKSxcbiAgICAgICAgICAgICAgY2FuY2VsVGV4dDogdGhpcy50cmFuc2xhdGUuZ2V0KCdjYW5jZWwnKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgZ2V0KCkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcChuZXdSZXNvdXJjZSA9PlxuICAgICAgICAgICAgICBwdXQoe1xuICAgICAgICAgICAgICAgIC4uLnJlc291cmNlLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAuLi5yZXNvdXJjZS5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgIHJlc291cmNlVmVyc2lvbjogbmV3UmVzb3VyY2UubWV0YWRhdGEucmVzb3VyY2VWZXJzaW9uLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gdGhpcy5yZXRyeVVwZGF0ZShwdXQsIGdldCwgcmVzb3VyY2UsIHNpbGVudCkpLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gdGhyb3dFcnJvcigoKSA9PiBlcnIpKSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcHV0KHJlc291cmNlKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyOiBTdGF0dXMpID0+XG4gICAgICAgIGVyci5jb2RlID09PSA0MDkgPyB3YWl0VXNlckNvbmZpcm1SZXRyeShlcnIpIDogdGhyb3dFcnJvcigoKSA9PiBlcnIpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG59XG4iXX0=