Repository URL to install this package:
Version:
0.3.1 ▾
|
motif-web-admin-core
/
esm2015
/
lib
/
sections
/
Plugins
/
components
/
plugins-section-component.js
|
---|
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ViewChild } from '@angular/core';
import { PluginView } from 'web-console-core';
import { NGXLogger } from 'web-console-core';
import { RegistryService } from '@wa-motif-open-api/plugin-registry-service';
import { process } from '@progress/kendo-data-query';
import { WCSubscriptionHandler } from '../../../components/Commons/wc-subscription-handler';
import * as _ from 'lodash';
import { WCNotificationCenter, NotificationType } from 'web-console-ui-kit';
import { faPuzzlePiece } from '@fortawesome/free-solid-svg-icons';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import { UninstallConfirmationDialogComponent } from '../dialogs/uninstall-confirmation-dialog-component';
/** @type {?} */
const LOG_TAG = '[PluginsSection]';
let PluginsSectionComponent = class PluginsSectionComponent {
/**
* @param {?} logger
* @param {?} registryService
* @param {?} notificationCenter
*/
constructor(logger, registryService, notificationCenter) {
this.logger = logger;
this.registryService = registryService;
this.notificationCenter = notificationCenter;
this.faPuzzlePiece = faPuzzlePiece;
this._subHandler = new WCSubscriptionHandler();
this.statsModel = { items: [] };
this.state = {};
this.logger.debug(LOG_TAG, 'Opening...');
}
/**
* Angular ngOnInit
* @return {?}
*/
ngOnInit() {
this.logger.debug(LOG_TAG, 'Initializing...');
this.refreshData();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.logger.debug(LOG_TAG, 'ngOnDestroy ');
this.freeMem();
}
/**
* @return {?}
*/
freeMem() {
this.data = null;
this.gridData = null;
this._subHandler.unsubscribe();
this._subHandler = null;
}
/**
* @return {?}
*/
onRefreshClicked() {
this.logger.debug(LOG_TAG, 'Refresh clicked');
this.refreshData();
}
/**
* @return {?}
*/
refreshData() {
this.logger.debug(LOG_TAG, 'refreshData called.');
this.loading = true;
this._subHandler.add(this.registryService.getPlugins(true, 'REGISTERED').subscribe((/**
* @param {?} data
* @return {?}
*/
(data) => {
this.data = data;
this.displayData();
this.rebuildStatsInfo();
this.loading = false;
// console.log("refreshData: ", data);
}), (/**
* @param {?} error
* @return {?}
*/
(error) => {
this.clearStatsInfo();
// console.error("refreshData error: ", error);
this.gridData = process([], this.state);
this.loading = false;
})));
}
/**
* @private
* @return {?}
*/
clearStatsInfo() {
this.statsModel = { items: [] };
}
/**
* @private
* @return {?}
*/
rebuildStatsInfo() {
/** @type {?} */
const active = _.sumBy(this.data, (/**
* @param {?} __0
* @return {?}
*/
({ status }) => Number(status === "ACTIVE")));
/** @type {?} */
const inactive = _.sumBy(this.data, (/**
* @param {?} __0
* @return {?}
*/
({ status }) => Number(status === "RESOLVED")));
/** @type {?} */
const inError = _.sumBy(this.data, (/**
* @param {?} __0
* @return {?}
*/
({ status }) => Number(status === "INSTALLED")));
this.statsModel = {
//cssClass:"green-stats-info"
items: [
{ label: "active", value: active, cssClass: "stats-info-primary" },
{ label: "inactive", value: inactive, cssClass: "stats-info-default" },
{ label: "in error", value: inError, cssClass: "stats-info-ko" }
]
};
}
/**
* @param {?} plugin
* @return {?}
*/
statusColorCode(plugin) {
if (plugin.status === 'ACTIVE') {
return '#1ab31a';
}
else {
return 'inherit';
}
}
/**
* @param {?} event
* @return {?}
*/
onFilterChange(event) {
this.filterValue = event.srcElement['value'];
this.displayData();
}
/**
* @private
* @return {?}
*/
displayData() {
this.logger.debug(LOG_TAG, 'displayData called.');
/** @type {?} */
let filteredData;
if (this.filterValue) {
filteredData = _.filter(this.data, (/**
* @param {?} o
* @return {?}
*/
(o) => {
/** @type {?} */
const matcher = this.buildRegExp(this.filterValue);
return matcher.test(o.name);
}));
}
else {
filteredData = this.data;
}
this.gridData = process(filteredData, this.state);
}
/**
* @private
* @param {?} filter
* @return {?}
*/
buildRegExp(filter) {
/** @type {?} */
const wildcarded = '*' + filter + '*';
return new RegExp('^' + wildcarded.split('*').join('.*') + '$');
}
/**
* @param {?} event
* @return {?}
*/
onUninstallOKPressed(event) {
this.logger.debug(LOG_TAG, 'onUninstallOKPressed pressed for: ', event);
/** @type {?} */
let pluginName = event.name;
/** @type {?} */
let version = event.version;
this._uninstallConfirmationDialog.show(pluginName, version);
}
/**
* @param {?} pluginName
* @param {?} deleteConfig
* @return {?}
*/
doUninstallPlugin(pluginName, deleteConfig) {
this.logger.debug(LOG_TAG, 'doUninstallPlugin called for:', pluginName);
this.loading = true;
this._subHandler.add(this.registryService.uninstallPlugin(pluginName, { removeConfig: true }).subscribe((/**
* @param {?} results
* @return {?}
*/
(results) => {
this.displayData();
this.rebuildStatsInfo();
this.loading = false; // console.log("refreshData: ", data);
}), (/**
* @param {?} error
* @return {?}
*/
(error) => {
this.gridData = process([], this.state);
this.loading = false;
})));
}
/**
* @param {?} event
* @return {?}
*/
onUninstallConfirmed(event) {
this.doUninstallPlugin(event.pluginName, event.deleteConfig);
}
/**
* @param {?} event
* @return {?}
*/
onInstallPlugin(event) {
this.logger.debug(LOG_TAG, 'onInstallPlugin event:', event);
this.notificationCenter.post({
name: 'InstallPlugin',
title: 'Plugin Install',
message: 'Installing plugin...',
type: NotificationType.Info
});
this._subHandler.add(this.registryService.installPlugin(event.file, this.overwriteExisting).subscribe((/**
* @param {?} data
* @return {?}
*/
(data) => {
this.logger.info(LOG_TAG, 'Plugin installation done:', data);
this.notificationCenter.post({
name: 'InstallPlugin',
title: 'Plugin Install',
message: 'Plugin installed successfully.',
type: NotificationType.Success
});
this.refreshData();
}), (/**
* @param {?} error
* @return {?}
*/
(error) => {
this.logger.error(LOG_TAG, 'Import license error:', error);
this.notificationCenter.post({
name: 'InstallPluginError',
title: 'Plugin Install',
message: 'Error installing plugin:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
}
/**
* @param {?} error
* @return {?}
*/
onInstallPluginError(error) {
this.logger.error(LOG_TAG, 'onInstallPluginError error:', error);
this.notificationCenter.post({
name: 'InstallPluginError',
title: 'Install Plugin',
message: 'Error installing plugin:',
type: NotificationType.Error,
error: error,
closable: true
});
}
};
PluginsSectionComponent.decorators = [
{ type: Component, args: [{
selector: 'app-plugins-section',
template: "<wc-dashboard-header [title]=\"'Plugins'\"></wc-dashboard-header>\n\n<wc-stats-info-component [model]=\"statsModel\"></wc-stats-info-component>\n\n<wa-uninstall-confirmation-dialog-component #uninstallConfirmationDialog (confirm)=\"onUninstallConfirmed($event)\"></wa-uninstall-confirmation-dialog-component>\n\n<wc-loading-overlay [visible]='loading'></wc-loading-overlay>\n\n<div class=\"row spread\" >\n\n <div class=\"flex-toolbar\" style=\"display:flex;align-items: center;\">\n <kendo-textbox-container floatingLabel=\"Filter\">\n <input #filterInput kendoTextBox (afterValueChanged)=\"onFilterChange($event)\"/>\n </kendo-textbox-container>\n <div>\n <label> </label>\n <kendo-buttongroup look=\"flat\">\n <button kendoButton \n motif-acl=\"com.vipera.osgi.core.registry.api.rest.RegistryApi:UPDATE:installPlugin\"\n [toggleable]=\"false\" \n (click)=\"installPluginSlideDownPanel.toggle()\">\n <fa-icon [icon]=\"faPuzzlePiece\"></fa-icon>Install Plugin\n </button>\n </kendo-buttongroup>\n </div>\n </div>\n\n <div class=\"flex-cmd\">\n <kendo-buttongroup look=\"flat\">\n <button kendoButton [toggleable]=\"false\" [icon]=\"'refresh'\" (click)=\"onRefreshClicked()\">Refresh</button>\n </kendo-buttongroup>\n </div>\n\n</div>\n\n<div class=\"row fill\">\n\n <div style=\"height: 98%;\">\n\n <wc-upload-panel #installPluginSlideDownPanel [confirmationTitle]=\"'Do install plugin?'\" (upload)=\"onInstallPlugin($event)\" (uploadError)=\"onInstallPluginError($event)\">\n <div style=\"padding-top:8px;display: flex;\">\n <label class=\"switch-control-label\" style=\"padding-top: 0.3rem;padding-right: 10px;\"> \n Overwrite Existing\n </label>\n <p-inputSwitch [styleClass]=\"'mini-switch'\" [(ngModel)]=\"overwriteExisting\"></p-inputSwitch>\n </div>\n </wc-upload-panel>\n\n <kendo-grid #datagrid [data]=\"gridData\" style=\"height: 100%;\"> \n\n <kendo-grid-column\n field=\"name\" title=\"Name\" >\n </kendo-grid-column>\n\n <kendo-grid-column field=\"version\" title=\"Version\" width=\"150\">\n </kendo-grid-column>\n\n <kendo-grid-column field=\"status\" title=\"Status\" width=\"150\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <span class=\"whole-cell\" [style.color]=\"statusColorCode(dataItem)\">\n {{ dataItem.status }}\n </span>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column title=\"\" width=\"150\" minResizableWidth=\"140\">\n <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\" let-column=\"column\">\n <wc-grid-editor-command \n motif-acl=\"com.vipera.osgi.core.registry.api.rest.RegistryApi:DELETE:uninstallPlugin\"\n motif-acl-hidden=\"true\"\n [alignMode]=\"'end'\"\n [hasConfirmation]=\"true\"\n [confirmationTitle]=\"'Uninstall ?'\"\n [rowIndex]=\"rowIndex\" \n [columnIndex]=\"columnIndex\" \n [column]=\"column\" \n [commandIcon]=\"'wa-ico-no'\"\n [dataItem]=\"dataItem\"\n (commandConfirm)=\"onUninstallOKPressed(dataItem)\" \n >\n </wc-grid-editor-command>\n </ng-template>\n </kendo-grid-column>\n \n \n </kendo-grid>\n </div>\n\n</div>",
styles: [":host{display:flex;flex:1;flex-direction:column}.log-pane{white-space:pre}.editor.slidedown>div>kendo-daterange>div>label,.editor.slidedown>div>label{padding-bottom:5px}"]
}] }
];
/** @nocollapse */
PluginsSectionComponent.ctorParameters = () => [
{ type: NGXLogger },
{ type: RegistryService },
{ type: WCNotificationCenter }
];
PluginsSectionComponent.propDecorators = {
_uninstallConfirmationDialog: [{ type: ViewChild, args: ['uninstallConfirmationDialog',] }]
};
PluginsSectionComponent = tslib_1.__decorate([
PluginView('Plugins', {
iconName: 'wa-ico-plugins',
userData: {
acl: {
permissions: ["com.vipera.osgi.core.registry.api.rest.RegistryApi:READ:getPlugins"]
}
}
}),
tslib_1.__metadata("design:paramtypes", [NGXLogger,
RegistryService,
WCNotificationCenter])
], PluginsSectionComponent);
export { PluginsSectionComponent };
if (false) {
/** @type {?} */
PluginsSectionComponent.prototype.faPuzzlePiece;
/** @type {?} */
PluginsSectionComponent.prototype.data;
/** @type {?} */
PluginsSectionComponent.prototype.gridData;
/** @type {?} */
PluginsSectionComponent.prototype.loading;
/**
* @type {?}
* @private
*/
PluginsSectionComponent.prototype.filterValue;
/**
* @type {?}
* @private
*/
PluginsSectionComponent.prototype._subHandler;
/** @type {?} */
PluginsSectionComponent.prototype.overwriteExisting;
/** @type {?} */
PluginsSectionComponent.prototype._uninstallConfirmationDialog;
/** @type {?} */
PluginsSectionComponent.prototype.statsModel;
/** @type {?} */
PluginsSectionComponent.prototype.state;
/**
* @type {?}
* @private
*/
PluginsSectionComponent.prototype.logger;
/**
* @type {?}
* @private
*/
PluginsSectionComponent.prototype.registryService;
/**
* @type {?}
* @private
*/
PluginsSectionComponent.prototype.notificationCenter;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy1zZWN0aW9uLWNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vdGlmLXdlYi1hZG1pbi1jb3JlLyIsInNvdXJjZXMiOlsibGliL3NlY3Rpb25zL1BsdWdpbnMvY29tcG9uZW50cy9wbHVnaW5zLXNlY3Rpb24tY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBVSxNQUFNLDRDQUE0QyxDQUFDO0FBRXJGLE9BQU8sRUFBRSxPQUFPLEVBQVMsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUM1RixPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQTtBQUMzQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFJbEUsT0FBTyxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLHdDQUF3QyxDQUFDO0FBT2hELE9BQU8sRUFBRSxvQ0FBb0MsRUFBeUIsTUFBTSxvREFBb0QsQ0FBQzs7TUFHM0gsT0FBTyxHQUFHLGtCQUFrQjtJQWVyQix1QkFBdUIsU0FBdkIsdUJBQXVCOzs7Ozs7SUFrQmhDLFlBQW9CLE1BQWlCLEVBQ3pCLGVBQWdDLEVBQ2hDLGtCQUF3QztRQUZoQyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ3pCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCO1FBbEJwRCxrQkFBYSxHQUFHLGFBQWEs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WC9CLHVCQUF1QjtJQVJqQyxVQUFVLENBQUMsU0FBUyxFQUFFO1FBQ3JCLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIsUUFBUSxFQUFFO1lBQ04sR0FBRyxFQUFFO2dCQUNELFdBQVcsRUFBRSxDQUFDLG9FQUFvRSxDQUFDO2FBQ3RGO1NBQ0o7S0FDSixDQUFDOzZDQW1COEIsU0FBUztRQUNSLGVBQWU7UUFDWixvQkFBb0I7R0FwQjNDLHVCQUF1QixDQWdNbkM7U0FoTVksdUJBQXVCOzs7SUFFaEMsZ0RBQThCOztJQUU5Qix1Q0FBMkI7O0lBQzNCLDJDQUFnQzs7SUFDaEMsMENBQXdCOzs7OztJQUN4Qiw4Q0FBNEI7Ozs7O0lBQzVCLDhDQUF5RTs7SUFDekUsb0RBQTJCOztJQUUzQiwrREFBNkc7O0lBRTdHLDZDQUE2Qzs7SUFFN0Msd0NBQ0U7Ozs7O0lBRVUseUNBQXlCOzs7OztJQUNqQyxrREFBd0M7Ozs7O0lBQ3hDLHFEQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGx1Z2luVmlldyB9IGZyb20gJ3dlYi1jb25zb2xlLWNvcmUnO1xuaW1wb3J0IHsgTkdYTG9nZ2VyfSBmcm9tICd3ZWItY29uc29sZS1jb3JlJztcbmltcG9ydCB7IFJlZ2lzdHJ5U2VydmljZSwgUGx1Z2luIH0gZnJvbSAnQHdhLW1vdGlmLW9wZW4tYXBpL3BsdWdpbi1yZWdpc3RyeS1zZXJ2aWNlJztcbmltcG9ydCB7IFNhZmVTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgcHJvY2VzcywgU3RhdGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeSc7XG5pbXBvcnQgeyBXQ1N1YnNjcmlwdGlvbkhhbmRsZXIgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL0NvbW1vbnMvd2Mtc3Vic2NyaXB0aW9uLWhhbmRsZXInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBXQ05vdGlmaWNhdGlvbkNlbnRlciwgTm90aWZpY2F0aW9uVHlwZSB9IGZyb20gJ3dlYi1jb25zb2xlLXVpLWtpdCc7XG5pbXBvcnQgeyBmYVB1enpsZVBpZWNlIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcblxuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcy9TdWJqZWN0JztcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvZGVib3VuY2VUaW1lJztcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvZGlzdGluY3RVbnRpbENoYW5nZWQnO1xuXG5pbXBvcnQge1xuICAgIEdyaWREYXRhUmVzdWx0XG59IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWQnO1xuXG5pbXBvcnQgeyBXQ1N0YXRzSW5mb01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9TdGF0cy9zdGF0cy1pbmZvLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBVbmluc3RhbGxDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIFVuaW5zdGFsbERpYWxvZ1Jlc3VsdCB9IGZyb20gJy4uL2RpYWxvZ3MvdW5pbnN0YWxsLWNvbmZpcm1hdGlvbi1kaWFsb2ctY29tcG9uZW50JztcbmltcG9ydCB7IFdDVXBsb2FkUGFuZWxFdmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMnO1xuXG5jb25zdCBMT0dfVEFHID0gJ1tQbHVnaW5zU2VjdGlvbl0nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1wbHVnaW5zLXNlY3Rpb24nLFxuICAgIHN0eWxlVXJsczogWyAnLi9wbHVnaW5zLXNlY3Rpb24tY29tcG9uZW50LnNjc3MnIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3BsdWdpbnMtc2VjdGlvbi1jb21wb25lbnQuaHRtbCdcbiAgfSlcbiAgQFBsdWdpblZpZXcoJ1BsdWdpbnMnLCB7XG4gICAgaWNvbk5hbWU6ICd3YS1pY28tcGx1Z2lucycsXG4gICAgdXNlckRhdGE6IHtcbiAgICAgICAgYWNsOiB7XG4gICAgICAgICAgICBwZXJtaXNzaW9uczogW1wiY29tLnZpcGVyYS5vc2dpLmNvcmUucmVnaXN0cnkuYXBpLnJlc3QuUmVnaXN0cnlBcGk6UkVBRDpnZXRQbHVnaW5zXCJdXG4gICAgICAgIH1cbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIFBsdWdpbnNTZWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgZmFQdXp6bGVQaWVjZSA9IGZhUHV6emxlUGllY2U7XG5cbiAgICBwdWJsaWMgZGF0YTogQXJyYXk8UGx1Z2luPjtcbiAgICBwdWJsaWMgZ3JpZERhdGE6IEdyaWREYXRhUmVzdWx0OyAvLyA9IHByb2Nlc3Moc2FtcGxlUHJvZHVjdHMsIHRoaXMuc3RhdGUpO1xuICAgIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmlsdGVyVmFsdWU6IHN0cmluZztcbiAgICBwcml2YXRlIF9zdWJIYW5kbGVyOiBXQ1N1YnNjcmlwdGlvbkhhbmRsZXIgPSBuZXcgV0NTdWJzY3JpcHRpb25IYW5kbGVyKCk7XG4gICAgb3ZlcndyaXRlRXhpc3Rpbmc6IGJvb2xlYW47XG5cbiAgICBAVmlld0NoaWxkKCd1bmluc3RhbGxDb25maXJtYXRpb25EaWFsb2cnKSBfdW5pbnN0YWxsQ29uZmlybWF0aW9uRGlhbG9nOiBVbmluc3RhbGxDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQ7XG5cbiAgICBzdGF0c01vZGVsOiBXQ1N0YXRzSW5mb01vZGVsID0geyBpdGVtczogW10gfTtcblxuICAgIHB1YmxpYyBzdGF0ZTogU3RhdGUgPSB7XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nZ2VyOiBOR1hMb2dnZXIsXG4gICAgICAgIHByaXZhdGUgcmVnaXN0cnlTZXJ2aWNlOiBSZWdpc3RyeVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbm90aWZpY2F0aW9uQ2VudGVyOiBXQ05vdGlmaWNhdGlvbkNlbnRlcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ09wZW5pbmcuLi4nKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuZ3VsYXIgbmdPbkluaXRcbiAgICAgKi9cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdJbml0aWFsaXppbmcuLi4nKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSgpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHICwgJ25nT25EZXN0cm95ICcpO1xuICAgICAgICB0aGlzLmZyZWVNZW0oKTtcbiAgICB9XG5cbiAgICBmcmVlTWVtKCkge1xuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLmdyaWREYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc3ViSGFuZGxlci51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25SZWZyZXNoQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdSZWZyZXNoIGNsaWNrZWQnKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWZyZXNoRGF0YSgpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdyZWZyZXNoRGF0YSBjYWxsZWQuJyk7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMucmVnaXN0cnlTZXJ2aWNlLmdldFBsdWdpbnModHJ1ZSwgJ1JFR0lTVEVSRUQnKS5zdWJzY3JpYmUoKGRhdGE6IEFycmF5PFBsdWdpbj4pID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhKCk7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRTdGF0c0luZm8oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZWZyZXNoRGF0YTogXCIsIGRhdGEpO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGF0c0luZm8oKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoXCJyZWZyZXNoRGF0YSBlcnJvcjogXCIsIGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBwcm9jZXNzKFtdLCB0aGlzLnN0YXRlKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhclN0YXRzSW5mbygpe1xuICAgICAgICB0aGlzLnN0YXRzTW9kZWwgPSB7IGl0ZW1zOiBbXSB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVidWlsZFN0YXRzSW5mbygpe1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBfLnN1bUJ5KFxuICAgICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgICAgKHsgc3RhdHVzIH0pID0+IE51bWJlcihzdGF0dXMgPT09IFwiQUNUSVZFXCIpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluYWN0aXZlID0gXy5zdW1CeShcbiAgICAgICAgICAgIHRoaXMuZGF0YSxcbiAgICAgICAgICAgICh7IHN0YXR1cyB9KSA9PiBOdW1iZXIoc3RhdHVzID09PSBcIlJFU09MVkVEXCIpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluRXJyb3IgPSBfLnN1bUJ5KFxuICAgICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgICAgKHsgc3RhdHVzIH0pID0+IE51bWJlcihzdGF0dXMgPT09IFwiSU5TVEFMTEVEXCIpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RhdHNNb2RlbCA9IHsgLy9jc3NDbGFzczpcImdyZWVuLXN0YXRzLWluZm9cIlxuICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiBcImFjdGl2ZVwiLCB2YWx1ZTogYWN0aXZlLCBjc3NDbGFzczpcInN0YXRzLWluZm8tcHJpbWFyeVwiIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogXCJpbmFjdGl2ZVwiLCB2YWx1ZTogaW5hY3RpdmUsIGNzc0NsYXNzOlwic3RhdHMtaW5mby1kZWZhdWx0XCIgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiBcImluIGVycm9yXCIsIHZhbHVlOiBpbkVycm9yLCBjc3NDbGFzczpcInN0YXRzLWluZm8ta29cIiB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0gXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXR1c0NvbG9yQ29kZShwbHVnaW46IFBsdWdpbik6IFNhZmVTdHlsZSB7XG4gICAgICAgIGlmIChwbHVnaW4uc3RhdHVzID09PSAnQUNUSVZFJykge1xuICAgICAgICAgICAgcmV0dXJuICcjMWFiMzFhJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnaW5oZXJpdCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25GaWx0ZXJDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZmlsdGVyVmFsdWUgPSBldmVudC5zcmNFbGVtZW50Wyd2YWx1ZSddO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNwbGF5RGF0YSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdkaXNwbGF5RGF0YSBjYWxsZWQuJyk7XG4gICAgICAgIGxldCBmaWx0ZXJlZERhdGE7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlclZhbHVlKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBfLmZpbHRlcih0aGlzLmRhdGEsIChvKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlciA9IHRoaXMuYnVpbGRSZWdFeHAodGhpcy5maWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIudGVzdChvLm5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkRGF0YSA9IHByb2Nlc3MoZmlsdGVyZWREYXRhLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkUmVnRXhwKGZpbHRlcjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHdpbGRjYXJkZWQgPSAnKicgKyBmaWx0ZXIgKyAnKic7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKCdeJyArIHdpbGRjYXJkZWQuc3BsaXQoJyonKS5qb2luKCcuKicpICsgJyQnKTtcbiAgICB9XG5cbiAgICBvblVuaW5zdGFsbE9LUHJlc3NlZChldmVudCl7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnb25Vbmluc3RhbGxPS1ByZXNzZWQgcHJlc3NlZCBmb3I6ICcsIGV2ZW50KTtcbiAgICAgICAgbGV0IHBsdWdpbk5hbWUgPSBldmVudC5uYW1lO1xuICAgICAgICBsZXQgdmVyc2lvbiA9IGV2ZW50LnZlcnNpb247XG4gICAgICAgIHRoaXMuX3VuaW5zdGFsbENvbmZpcm1hdGlvbkRpYWxvZy5zaG93KHBsdWdpbk5hbWUsIHZlcnNpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBkb1VuaW5zdGFsbFBsdWdpbihwbHVnaW5OYW1lOnN0cmluZywgZGVsZXRlQ29uZmlnOmJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdkb1VuaW5zdGFsbFBsdWdpbiBjYWxsZWQgZm9yOicsIHBsdWdpbk5hbWUpO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9zdWJIYW5kbGVyLmFkZCh0aGlzLnJlZ2lzdHJ5U2VydmljZS51bmluc3RhbGxQbHVnaW4ocGx1Z2luTmFtZSwgeyByZW1vdmVDb25maWc6IHRydWUgfSkuc3Vic2NyaWJlKChyZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhKCk7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRTdGF0c0luZm8oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlOyAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVmcmVzaERhdGE6IFwiLCBkYXRhKTtcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gcHJvY2VzcyhbXSwgdGhpcy5zdGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9uVW5pbnN0YWxsQ29uZmlybWVkKGV2ZW50OiBVbmluc3RhbGxEaWFsb2dSZXN1bHQpe1xuICAgICAgICB0aGlzLmRvVW5pbnN0YWxsUGx1Z2luKGV2ZW50LnBsdWdpbk5hbWUsIGV2ZW50LmRlbGV0ZUNvbmZpZyk7XG4gICAgfVxuXG5cbiAgICBvbkluc3RhbGxQbHVnaW4oZXZlbnQ6IFdDVXBsb2FkUGFuZWxFdmVudCl7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnb25JbnN0YWxsUGx1Z2luIGV2ZW50OicsIGV2ZW50KTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICBuYW1lOiAnSW5zdGFsbFBsdWdpbicsXG4gICAgICAgICAgICB0aXRsZTogJ1BsdWdpbiBJbnN0YWxsJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnN0YWxsaW5nIHBsdWdpbi4uLicsXG4gICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkluZm9cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMucmVnaXN0cnlTZXJ2aWNlLmluc3RhbGxQbHVnaW4oZXZlbnQuZmlsZSwgdGhpcy5vdmVyd3JpdGVFeGlzdGluZykuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKExPR19UQUcgLCAnUGx1Z2luIGluc3RhbGxhdGlvbiBkb25lOicsIGRhdGEpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxQbHVnaW4nLFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnUGx1Z2luIEluc3RhbGwnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQbHVnaW4gaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2Vzc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihMT0dfVEFHLCAnSW1wb3J0IGxpY2Vuc2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxQbHVnaW5FcnJvcicsXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdQbHVnaW4gSW5zdGFsbCcsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGluc3RhbGxpbmcgcGx1Z2luOicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7ICAgIFxuICAgIH0gXG4gICAgXG4gICAgb25JbnN0YWxsUGx1Z2luRXJyb3IoZXJyb3Ipe1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihMT0dfVEFHICwgJ29uSW5zdGFsbFBsdWdpbkVycm9yIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICBuYW1lOiAnSW5zdGFsbFBsdWdpbkVycm9yJyxcbiAgICAgICAgICAgIHRpdGxlOiAnSW5zdGFsbCBQbHVnaW4nLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGluc3RhbGxpbmcgcGx1Z2luOicsXG4gICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG59XG4iXX0=