Repository URL to install this package:
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ViewChild, Input } from '@angular/core';
import { PluginView } from 'web-console-core';
import { NGXLogger } from 'web-console-core';
import { SecurityService } from '@wa-motif-open-api/security-service';
import { GridComponent } from '@progress/kendo-angular-grid';
import { MotifQuerySort, MotifQueryResults } from 'web-console-core';
import { ApplicationsService } from '@wa-motif-open-api/platform-service';
import { ComboBoxComponent } from '@progress/kendo-angular-dropdowns';
import * as _ from 'lodash';
import { DomainSelectorComboBoxComponent } from '../../../components/UI/selectors/domain-selector-combobox-component';
import { WCNotificationCenter, NotificationType } from 'web-console-ui-kit';
import { WCSubscriptionHandler } from '../../../components/Commons/wc-subscription-handler';
/** @type {?} */
const LOG_TAG = '[SessionsSection]';
let SessionsSectionComponent = class SessionsSectionComponent {
/**
* @param {?} logger
* @param {?} securityService
* @param {?} notificationCenter
* @param {?} applicationsService
*/
constructor(logger, securityService, notificationCenter, applicationsService) {
this.logger = logger;
this.securityService = securityService;
this.notificationCenter = notificationCenter;
this.applicationsService = applicationsService;
// Grid Options
this.sort = [];
this.groups = [];
this.type = 'numeric';
this.pageSize = 15;
this.skip = 0;
this.currentPage = 1;
this.totalPages = 0;
this.totalRecords = 0;
this.isFieldSortable = false;
this.applicationsList = [];
this._subHandler = new WCSubscriptionHandler();
this.loading = false;
this._sessionRows = [];
this.logger.debug(LOG_TAG, 'Opening...');
}
/**
* Angular ngOnInit
* @return {?}
*/
ngOnInit() {
this.logger.debug(LOG_TAG, 'Initializing...');
}
/**
* @return {?}
*/
ngOnDestroy() {
this.logger.debug(LOG_TAG, 'ngOnDestroy ');
this.freeMem();
}
/**
* @return {?}
*/
freeMem() {
this.sort = null;
this.groups = null;
this.gridView = null;
this.applicationsList = null;
this._selectedApplication = null;
this._sessionRows = null;
this._subHandler.unsubscribe();
this._subHandler = null;
}
/**
* @private
* @param {?} domain
* @param {?} application
* @param {?} pageIndex
* @param {?} pageSize
* @return {?}
*/
loadData(domain, application, pageIndex, pageSize) {
// tslint:disable-next-line:max-line-length
this.logger.debug(LOG_TAG, 'loadData domain=\'' + domain + '\' application=\'' + application + '\' pageIndex=', pageIndex, ' pageSize=', pageSize);
this.loading = true;
/** @type {?} */
const sort = this.buildQuerySort();
/** @type {?} */
const domainName = (domain ? domain.name : null);
/** @type {?} */
const applicationName = (application ? application.name : null);
this._subHandler.add(this.securityService.getSessions(null, null, domainName, applicationName, null, null, pageIndex, pageSize, 'response').subscribe((/**
* @param {?} response
* @return {?}
*/
(response) => {
/** @type {?} */
const results = MotifQueryResults.fromHttpResponse(response);
this.logger.debug(LOG_TAG, 'Get session list query results:', results);
this._sessionRows = _.forEach(results.data, (/**
* @param {?} element
* @return {?}
*/
function (element) {
element.lastAccess = new Date(element.lastAccess);
}));
this.totalPages = results.totalPages;
this.totalRecords = results.totalRecords;
this.currentPage = results.pageIndex;
this.gridView = {
data: this._sessionRows,
total: results.totalRecords
};
this.loading = false;
}), (/**
* @param {?} error
* @return {?}
*/
error => {
this.logger.error(LOG_TAG, 'Get session list failed: ', error);
this.loading = false;
this.notificationCenter.post({
name: 'LoadSessionsError',
title: 'Load Sessions',
message: 'Error loading Sessions:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
}
/**
* @param {?} __0
* @return {?}
*/
pageChange({ skip, take }) {
this.logger.debug(LOG_TAG, 'pageChange skip=', skip, ' take=', take);
this.skip = skip;
this.pageSize = take;
/** @type {?} */
const newPageIndex = this.calculatePageIndex(skip, take);
this.loadData(this.domainSelector.selectedDomain, this._selectedApplication, newPageIndex, this.pageSize);
}
/**
* @private
* @param {?} skip
* @param {?} take
* @return {?}
*/
calculatePageIndex(skip, take) {
return (skip / take) + 1;
}
/**
* @private
* @return {?}
*/
buildQuerySort() {
this.logger.debug(LOG_TAG, 'buildQuerySort: ', this.sort);
/** @type {?} */
const querySort = new MotifQuerySort();
if (this.sort) {
for (let i = 0; i < this.sort.length; i++) {
/** @type {?} */
const sortInfo = this.sort[i];
if (sortInfo.dir && sortInfo.dir === 'asc') {
querySort.orderAscendingBy(sortInfo.field);
}
else if (sortInfo.dir && sortInfo.dir === 'desc') {
querySort.orderDescendingBy(sortInfo.field);
}
}
}
return querySort;
}
/**
* Set the selcted application
* @param {?} application
* @return {?}
*/
set selectedApplication(application) {
this._selectedApplication = application;
this.loadData(this.domainSelector.selectedDomain, this._selectedApplication, 1, this.pageSize);
}
/**
* Reload the list of the current sessions
* @return {?}
*/
refreshData() {
this.loadData(this.selectedDomain, this._selectedApplication, this.currentPage, this.pageSize);
}
/**
* @param {?} dataItem
* @return {?}
*/
onDeleteOKPressed(dataItem) {
this.logger.debug(LOG_TAG, 'onDeleteOKPressed dataItem=', dataItem);
this._subHandler.add(this.securityService.closeSession(dataItem.id).subscribe((/**
* @param {?} data
* @return {?}
*/
(data) => {
this.logger.debug(LOG_TAG, 'onDeleteOKPressed OK:', data);
this.refreshData();
this.notificationCenter.post({
name: 'CloseSessionSuccess',
title: 'Close Session',
message: 'Session closed successfully.',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
(error) => {
this.logger.error(LOG_TAG, 'onDeleteOKPressed error:', error);
this.notificationCenter.post({
name: 'CloseSessionError',
title: 'Close Session',
message: 'Error closing session:',
type: NotificationType.Error,
error: error,
closable: true
});
})));
}
/**
* @return {?}
*/
onRefreshClicked() {
this.refreshData();
}
};
SessionsSectionComponent.decorators = [
{ type: Component, args: [{
selector: 'wa-sessions-section',
template: "<wc-dashboard-header [title]=\"'Sessions'\"></wc-dashboard-header>\n<wc-loading-overlay [visible]='loading'></wc-loading-overlay>\n\n<div class=\"row spread\">\n <div class=\"flex-toolbar\" style=\"display:flex;align-items: center;\">\n <div style=\"margin-right:10px;width:60%;max-width: 400px;min-width: 250px;\">\n <label>Domain</label>\n <wc-domain-selector-combobox #domainSelector [(ngModel)]=\"selectedDomain\"></wc-domain-selector-combobox>\n </div>\n\n <div style=\"margin-left: 40px;margin-right:10px;width:60%;max-width: 400px;min-width: 250px;\">\n <label>Application</label>\n <wc-application-selector-combobox #applicationSelector [domain]=\"(selectedDomain ? selectedDomain.name : null)\" [(ngModel)]=\"selectedApplication\"></wc-application-selector-combobox>\n </div>\n\n\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 <kendo-grid [data]=\"gridView\" [columnMenu]=\"true\" [scrollable]=\"true\" [resizable]=\"true\"\n [reorderable]=\"true\" [pageSize]=\"pageSize\" [skip]=\"skip\" [pageable]=\"{\n buttonCount: 5,\n info: true,\n type: type,\n pageSizes: true,\n previousNext: true\n }\"\n [scrollable]=\"'none'\" (pageChange)=\"pageChange($event)\">\n >\n\n\n <kendo-grid-column field=\"clientIp\" title=\"Client IP\" width=\"160\">\n </kendo-grid-column>\n\n <kendo-grid-column field=\"user\" title=\"User\" width=\"160\">\n </kendo-grid-column>\n\n <kendo-grid-column field=\"secure\" title=\"Secure\" width=\"40\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <label class=\"k-icon grid-cell-checkbox grid-cell-checkbox-{{dataItem.secure}}\"></label>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"shared\" title=\"Shared\" width=\"40\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <label class=\"k-icon grid-cell-checkbox grid-cell-checkbox-{{dataItem.shared}}\"></label>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"domain\" title=\"Domain\">\n </kendo-grid-column>\n\n <kendo-grid-column field=\"application\" title=\"Application\">\n </kendo-grid-column>\n\n <kendo-grid-column field=\"service\" title=\"Service\">\n </kendo-grid-column>\n\n <kendo-grid-column field=\"channel\" title=\"Channel\">\n </kendo-grid-column>\n\n <kendo-grid-column field=\"lastAccess\" title=\"Last Access\" format=\"{0:dd/MM/yyyy HH:mm:ss}\">\n </kendo-grid-column>\n\n <kendo-grid-column field=\"lastRequestID\" title=\"Last Request ID\">\n </kendo-grid-column>\n\n <kendo-grid-column field=\"expiry\" title=\"Expiry\">\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.platform.api.rest.SecurityApi:DELETE:closeSession\"\n motif-acl-hidden=\"true\"\n [alignMode]=\"'end'\"\n [hasConfirmation]=\"true\"\n [confirmationTitle]=\"'Delete ?'\"\n [rowIndex]=\"rowIndex\" \n [columnIndex]=\"columnIndex\" \n [column]=\"column\" \n [commandIcon]=\"'wa-ico-no'\"\n [dataItem]=\"dataItem\"\n (commandConfirm)=\"onDeleteOKPressed(dataItem)\" \n >\n </wc-grid-editor-command>\n </ng-template>\n </kendo-grid-column>\n\n </kendo-grid>\n\n\n\n</div>\n",
styles: [":host{display:flex;flex:1;flex-direction:column}:host ::ng-deep .grid-btn-editor.wc-table-delete-command{justify-content:center}"]
}] }
];
/** @nocollapse */
SessionsSectionComponent.ctorParameters = () => [
{ type: NGXLogger },
{ type: SecurityService },
{ type: WCNotificationCenter },
{ type: ApplicationsService }
];
SessionsSectionComponent.propDecorators = {
_grid: [{ type: ViewChild, args: [GridComponent,] }],
_appComboBox: [{ type: ViewChild, args: ['applicationsCombo',] }],
domainSelector: [{ type: ViewChild, args: ['domainSelector',] }],
selectedDomain: [{ type: Input }],
selectedApplication: [{ type: Input }]
};
SessionsSectionComponent = tslib_1.__decorate([
PluginView('Sessions', {
iconName: 'wa-ico-sessions',
userData: {
acl: {
permissions: ['com.vipera.osgi.core.platform.api.rest.PlatformApi:READ:getDomains',
'com.vipera.osgi.core.platform.api.rest.PlatformApi:READ:getApplications',
'com.vipera.osgi.core.platform.api.rest.SecurityApi:READ:getSessions']
}
}
}),
tslib_1.__metadata("design:paramtypes", [NGXLogger,
SecurityService,
WCNotificationCenter,
ApplicationsService])
], SessionsSectionComponent);
export { SessionsSectionComponent };
if (false) {
/** @type {?} */
SessionsSectionComponent.prototype._grid;
/** @type {?} */
SessionsSectionComponent.prototype._appComboBox;
/** @type {?} */
SessionsSectionComponent.prototype.domainSelector;
/** @type {?} */
SessionsSectionComponent.prototype.sort;
/** @type {?} */
SessionsSectionComponent.prototype.groups;
/** @type {?} */
SessionsSectionComponent.prototype.gridView;
/** @type {?} */
SessionsSectionComponent.prototype.type;
/** @type {?} */
SessionsSectionComponent.prototype.pageSize;
/** @type {?} */
SessionsSectionComponent.prototype.skip;
/** @type {?} */
SessionsSectionComponent.prototype.currentPage;
/** @type {?} */
SessionsSectionComponent.prototype.totalPages;
/** @type {?} */
SessionsSectionComponent.prototype.totalRecords;
/** @type {?} */
SessionsSectionComponent.prototype.isFieldSortable;
/** @type {?} */
SessionsSectionComponent.prototype.applicationsList;
/** @type {?} */
SessionsSectionComponent.prototype._selectedApplication;
/** @type {?} */
SessionsSectionComponent.prototype.selectedDomain;
/**
* @type {?}
* @private
*/
SessionsSectionComponent.prototype._subHandler;
/** @type {?} */
SessionsSectionComponent.prototype.loading;
/**
* @type {?}
* @private
*/
SessionsSectionComponent.prototype._sessionRows;
/**
* @type {?}
* @private
*/
SessionsSectionComponent.prototype.logger;
/**
* @type {?}
* @private
*/
SessionsSectionComponent.prototype.securityService;
/**
* @type {?}
* @private
*/
SessionsSectionComponent.prototype.notificationCenter;
/**
* @type {?}
* @private
*/
SessionsSectionComponent.prototype.applicationsService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbnMtc2VjdGlvbi1jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tb3RpZi13ZWItYWRtaW4tY29yZS8iLCJzb3VyY2VzIjpbImxpYi9zZWN0aW9ucy9TZXNzaW9ucy9jb21wb25lbnRzL3Nlc3Npb25zLXNlY3Rpb24tY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFBO0FBRXJFLE9BQU8sRUFBRSxhQUFhLEVBQW1CLE1BQU0sOEJBQThCLENBQUM7QUFFOUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JFLE9BQU8sRUFBVSxtQkFBbUIsRUFBZSxNQUFNLHFDQUFxQyxDQUFBO0FBQzlGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3RFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHFFQUFxRSxDQUFBO0FBQ3JILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDOztNQUd0RixPQUFPLEdBQUcsbUJBQW1CO0lBaUJ0Qix3QkFBd0IsU0FBeEIsd0JBQXdCOzs7Ozs7O0lBMkJqQyxZQUFvQixNQUFpQixFQUN6QixlQUFnQyxFQUNoQyxrQkFBd0MsRUFDeEMsbUJBQXdDO1FBSGhDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDekIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBc0I7UUFDeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjs7UUF2QjdDLFNBQUksR0FBcUIsRUFBRSxDQUFDO1FBQzVCLFdBQU0sR0FBc0IsRUFBRSxDQUFDO1FBRS9CLFNBQUksR0FBd0IsU0FBUyxDQUFDO1FBQ3RDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBRXhCLHFCQUFnQixHQUF1QixFQUFFLENBQUM7UUFHekMsZ0JBQVcsR0FBMEIsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBRWxFLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFZixpQkFBWSxHQUFpQixFQUFFLENBQUM7UUFNcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzdDLENBQUM7Ozs7O0lBS0QsUUFBUTtRQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFHLGNBQWMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDOzs7O0lBRUQsT0FBTztRQUNILElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7Ozs7Ozs7OztJQUVPLFFBQVEsQ0FBQyxNQUFjLEVBQUUsV0FBd0IsRUFBRSxTQUFpQixFQUFFLFFBQWdCO1FBQzFGLDJDQUEyQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLEdBQUcsTUFBTSxHQUFHLG1CQUFtQixHQUFHLFdBQVcsR0FBRyxlQUFlLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVuSixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQzs7Y0FFZCxJQUFJLEdBQW1CLElBQUksQ0FBQyxjQUFjLEVBQUU7O2NBRTVDLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOztjQUMxQyxlQUFlLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUvRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFDeEUsZUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTs7a0JBRS9FLE9BQU8sR0FBc0IsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1lBRS9FLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUV2RSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUk7Ozs7WUFBRSxVQUFVLE9BQU87Z0JBQ3pELE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3RELENBQUMsRUFBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRztnQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQ3ZCLEtBQUssRUFBRSxPQUFPLENBQUMsWUFBWTthQUM5QixDQUFDO1lBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFekIsQ0FBQzs7OztRQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1AsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBRXJCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksRUFBRSxtQkFBbUI7Z0JBQ3pCLEtBQUssRUFBRSxlQUFlO2dCQUN0QixPQUFPLEVBQUUseUJBQXlCO2dCQUNsQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsS0FBSztnQkFDNUIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osUUFBUSxFQUFFLElBQUk7YUFDakIsQ0FBQyxDQUFDO1FBRVAsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7Ozs7O0lBRU0sVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBbUI7UUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7O2NBQ2YsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1FBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUcsQ0FBQzs7Ozs7OztJQUVPLGtCQUFrQixDQUFDLElBQVksRUFBRSxJQUFZO1FBQ2pELE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUM7Ozs7O0lBRU8sY0FBYztRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOztjQUNwRCxTQUFTLEdBQUcsSUFBSSxjQUFjLEVBQUU7UUFDdEMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztzQkFDakMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLFFBQVEsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLEdBQUcsS0FBSyxLQUFLLEVBQUU7b0JBQ3hDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzlDO3FCQUFNLElBQUksUUFBUSxDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsR0FBRyxLQUFLLE1BQU0sRUFBRTtvQkFDaEQsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDL0M7YUFDSjtTQUNKO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQzs7Ozs7O0lBTUQsSUFDVyxtQkFBbUIsQ0FBQyxXQUF3QjtRQUNuRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsV0FBVyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkcsQ0FBQzs7Ozs7SUFLTSxXQUFXO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRyxDQUFDOzs7OztJQUdELGlCQUFpQixDQUFDLFFBQWE7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNuRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBR25CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksRUFBRSxxQkFBcUI7Z0JBQzNCLEtBQUssRUFBRSxlQUFlO2dCQUN0QixPQUFPLEVBQUUsOEJBQThCO2dCQUN2QyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsT0FBTzthQUNqQyxDQUFDLENBQUM7UUFFUCxDQUFDOzs7O1FBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNULElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUU5RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2dCQUN6QixJQUFJLEVBQUUsbUJBQW1CO2dCQUN6QixLQUFLLEVBQUUsZUFBZTtnQkFDdEIsT0FBTyxFQUFFLHdCQUF3QjtnQkFDakMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLEtBQUs7Z0JBQzVCLEtBQUssRUFBRSxLQUFLO2dCQUNaLFFBQVEsRUFBRSxJQUFJO2FBQ2pCLENBQUMsQ0FBQztRQUVQLENBQUMsRUFBQyxDQUFDLENBQUM7SUFDUixDQUFDOzs7O0lBRU0sZ0JBQWdCO1FBQ25CLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0NBR0osQ0FBQTs7WUF4TUEsU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxxQkFBcUI7Z0JBRS9CLDZvSUFBZ0Q7O2FBQ25EOzs7O1lBcEJRLFNBQVM7WUFDVCxlQUFlO1lBU2Ysb0JBQW9CO1lBSlosbUJBQW1COzs7b0JBMkIvQixTQUFTLFNBQUMsYUFBYTsyQkFDdkIsU0FBUyxTQUFDLG1CQUFtQjs2QkFDN0IsU0FBUyxTQUFDLGdCQUFnQjs2QkFnQjFCLEtBQUs7a0NBcUhMLEtBQUs7O0FBeklHLHdCQUF3QjtJQVZwQyxVQUFVLENBQUMsVUFBVSxFQUFFO1FBQ3BCLFFBQVEsRUFBRSxpQkFBaUI7UUFDM0IsUUFBUSxFQUFFO1lBQ04sR0FBRyxFQUFFO2dCQUNELFdBQVcsRUFBRSxDQUFDLG9FQUFvRTtvQkFDbEUseUVBQXlFO29CQUN6RSxxRUFBcUUsQ0FBQzthQUN6RjtTQUNKO0tBQ0osQ0FBQzs2Q0E0QjhCLFNBQVM7UUFDUixlQUFlO1FBQ1osb0JBQW9CO1FBQ25CLG1CQUFtQjtHQTlCM0Msd0JBQXdCLENBeUxwQztTQXpMWSx3QkFBd0I7OztJQUVqQyx5Q0FBK0M7O0lBQy9DLGdEQUFnRTs7SUFDaEUsa0RBQTZFOztJQUc3RSx3Q0FBbUM7O0lBQ25DLDBDQUFzQzs7SUFDdEMsNENBQTRCOztJQUM1Qix3Q0FBNkM7O0lBQzdDLDRDQUFxQjs7SUFDckIsd0NBQWdCOztJQUNoQiwrQ0FBdUI7O0lBQ3ZCLDhDQUFzQjs7SUFDdEIsZ0RBQXdCOztJQUN4QixtREFBK0I7O0lBRS9CLG9EQUFpRDs7SUFDakQsd0RBQXlDOztJQUN6QyxrREFBdUM7Ozs7O0lBQ3ZDLCtDQUF5RTs7SUFFekUsMkNBQXVCOzs7OztJQUV2QixnREFBd0M7Ozs7O0lBRTVCLDBDQUF5Qjs7Ozs7SUFDakMsbURBQXdDOzs7OztJQUN4QyxzREFBZ0Q7Ozs7O0lBQ2hELHVEQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIElucHV0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBsdWdpblZpZXcgfSBmcm9tICd3ZWItY29uc29sZS1jb3JlJ1xuaW1wb3J0IHsgTkdYTG9nZ2VyIH0gZnJvbSAnd2ViLWNvbnNvbGUtY29yZSdcbmltcG9ydCB7IFNlY3VyaXR5U2VydmljZSB9IGZyb20gJ0B3YS1tb3RpZi1vcGVuLWFwaS9zZWN1cml0eS1zZXJ2aWNlJ1xuaW1wb3J0IHsgU2Vzc2lvblJvdyB9IGZyb20gJy4uL2RhdGEvbW9kZWwnXG5pbXBvcnQgeyBHcmlkQ29tcG9uZW50LCBQYWdlQ2hhbmdlRXZlbnQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1ncmlkJztcbmltcG9ydCB7IFNvcnREZXNjcmlwdG9yLCBHcm91cERlc2NyaXB0b3IsIERhdGFSZXN1bHQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeSc7XG5pbXBvcnQgeyBNb3RpZlF1ZXJ5U29ydCwgTW90aWZRdWVyeVJlc3VsdHMgfSBmcm9tICd3ZWItY29uc29sZS1jb3JlJztcbmltcG9ydCB7IERvbWFpbiwgQXBwbGljYXRpb25zU2VydmljZSwgQXBwbGljYXRpb24gfSBmcm9tICdAd2EtbW90aWYtb3Blbi1hcGkvcGxhdGZvcm0tc2VydmljZSdcbmltcG9ydCB7IENvbWJvQm94Q29tcG9uZW50IH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZHJvcGRvd25zJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IERvbWFpblNlbGVjdG9yQ29tYm9Cb3hDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL1VJL3NlbGVjdG9ycy9kb21haW4tc2VsZWN0b3ItY29tYm9ib3gtY29tcG9uZW50J1xuaW1wb3J0IHsgV0NOb3RpZmljYXRpb25DZW50ZXIsIE5vdGlmaWNhdGlvblR5cGUgfSBmcm9tICd3ZWItY29uc29sZS11aS1raXQnXG5pbXBvcnQgeyBXQ1N1YnNjcmlwdGlvbkhhbmRsZXIgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL0NvbW1vbnMvd2Mtc3Vic2NyaXB0aW9uLWhhbmRsZXInO1xuXG5cbmNvbnN0IExPR19UQUcgPSAnW1Nlc3Npb25zU2VjdGlvbl0nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3dhLXNlc3Npb25zLXNlY3Rpb24nLFxuICAgIHN0eWxlVXJsczogWycuL3Nlc3Npb25zLXNlY3Rpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2Vzc2lvbnMtc2VjdGlvbi5jb21wb25lbnQuaHRtbCdcbn0pXG5AUGx1Z2luVmlldygnU2Vzc2lvbnMnLCB7XG4gICAgaWNvbk5hbWU6ICd3YS1pY28tc2Vzc2lvbnMnLFxuICAgIHVzZXJEYXRhOiB7XG4gICAgICAgIGFjbDoge1xuICAgICAgICAgICAgcGVybWlzc2lvbnM6IFsnY29tLnZpcGVyYS5vc2dpLmNvcmUucGxhdGZvcm0uYXBpLnJlc3QuUGxhdGZvcm1BcGk6UkVBRDpnZXREb21haW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tLnZpcGVyYS5vc2dpLmNvcmUucGxhdGZvcm0uYXBpLnJlc3QuUGxhdGZvcm1BcGk6UkVBRDpnZXRBcHBsaWNhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb20udmlwZXJhLm9zZ2kuY29yZS5wbGF0Zm9ybS5hcGkucmVzdC5TZWN1cml0eUFwaTpSRUFEOmdldFNlc3Npb25zJ11cbiAgICAgICAgfVxuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgU2Vzc2lvbnNTZWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQFZpZXdDaGlsZChHcmlkQ29tcG9uZW50KSBfZ3JpZDogR3JpZENvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCdhcHBsaWNhdGlvbnNDb21ibycpIF9hcHBDb21ib0JveDogQ29tYm9Cb3hDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgnZG9tYWluU2VsZWN0b3InKSBkb21haW5TZWxlY3RvcjogRG9tYWluU2VsZWN0b3JDb21ib0JveENvbXBvbmVudDtcblxuICAgIC8vIEdyaWQgT3B0aW9uc1xuICAgIHB1YmxpYyBzb3J0OiBTb3J0RGVzY3JpcHRvcltdID0gW107XG4gICAgcHVibGljIGdyb3VwczogR3JvdXBEZXNjcmlwdG9yW10gPSBbXTtcbiAgICBwdWJsaWMgZ3JpZFZpZXc6IERhdGFSZXN1bHQ7XG4gICAgcHVibGljIHR5cGU6ICdudW1lcmljJyB8ICdpbnB1dCcgPSAnbnVtZXJpYyc7XG4gICAgcHVibGljIHBhZ2VTaXplID0gMTU7XG4gICAgcHVibGljIHNraXAgPSAwO1xuICAgIHB1YmxpYyBjdXJyZW50UGFnZSA9IDE7XG4gICAgcHVibGljIHRvdGFsUGFnZXMgPSAwO1xuICAgIHB1YmxpYyB0b3RhbFJlY29yZHMgPSAwO1xuICAgIHB1YmxpYyBpc0ZpZWxkU29ydGFibGUgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBhcHBsaWNhdGlvbnNMaXN0OiBBcnJheTxBcHBsaWNhdGlvbj4gPSBbXTtcbiAgICBwdWJsaWMgX3NlbGVjdGVkQXBwbGljYXRpb246IEFwcGxpY2F0aW9uOyAvLyBjb21ibyBib3ggc2VsZWN0aW9uXG4gICAgQElucHV0KCkgcHVibGljIHNlbGVjdGVkRG9tYWluOiBEb21haW47XG4gICAgcHJpdmF0ZSBfc3ViSGFuZGxlcjogV0NTdWJzY3JpcHRpb25IYW5kbGVyID0gbmV3IFdDU3Vic2NyaXB0aW9uSGFuZGxlcigpO1xuXG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgX3Nlc3Npb25Sb3dzOiBTZXNzaW9uUm93W10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nZ2VyOiBOR1hMb2dnZXIsXG4gICAgICAgIHByaXZhdGUgc2VjdXJpdHlTZXJ2aWNlOiBTZWN1cml0eVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbm90aWZpY2F0aW9uQ2VudGVyOiBXQ05vdGlmaWNhdGlvbkNlbnRlcixcbiAgICAgICAgcHJpdmF0ZSBhcHBsaWNhdGlvbnNTZXJ2aWNlOiBBcHBsaWNhdGlvbnNTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdPcGVuaW5nLi4uJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW5ndWxhciBuZ09uSW5pdFxuICAgICAqL1xuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnSW5pdGlhbGl6aW5nLi4uJyk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnbmdPbkRlc3Ryb3kgJyk7XG4gICAgICAgIHRoaXMuZnJlZU1lbSgpO1xuICAgIH1cblxuICAgIGZyZWVNZW0oKSB7XG4gICAgICAgIHRoaXMuc29ydCA9IG51bGw7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gbnVsbDtcbiAgICAgICAgdGhpcy5ncmlkVmlldyA9IG51bGw7XG4gICAgICAgIHRoaXMuYXBwbGljYXRpb25zTGlzdCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQXBwbGljYXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLl9zZXNzaW9uUm93cyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fc3ViSGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkRGF0YShkb21haW46IERvbWFpbiwgYXBwbGljYXRpb246IEFwcGxpY2F0aW9uLCBwYWdlSW5kZXg6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcikge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdsb2FkRGF0YSBkb21haW49XFwnJyArIGRvbWFpbiArICdcXCcgYXBwbGljYXRpb249XFwnJyArIGFwcGxpY2F0aW9uICsgJ1xcJyBwYWdlSW5kZXg9JywgcGFnZUluZGV4LCAnIHBhZ2VTaXplPScsIHBhZ2VTaXplKTtcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHNvcnQ6IE1vdGlmUXVlcnlTb3J0ID0gdGhpcy5idWlsZFF1ZXJ5U29ydCgpO1xuXG4gICAgICAgIGNvbnN0IGRvbWFpbk5hbWUgPSAoZG9tYWluID8gZG9tYWluLm5hbWUgOiBudWxsKTtcbiAgICAgICAgY29uc3QgYXBwbGljYXRpb25OYW1lID0gKGFwcGxpY2F0aW9uID8gYXBwbGljYXRpb24ubmFtZSA6IG51bGwpO1xuXG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMuc2VjdXJpdHlTZXJ2aWNlLmdldFNlc3Npb25zKG51bGwsIG51bGwsIGRvbWFpbk5hbWUsIFxuICAgICAgICAgICAgYXBwbGljYXRpb25OYW1lLCBudWxsLCBudWxsLCBwYWdlSW5kZXgsIHBhZ2VTaXplLCAncmVzcG9uc2UnKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IE1vdGlmUXVlcnlSZXN1bHRzID0gTW90aWZRdWVyeVJlc3VsdHMuZnJvbUh0dHBSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdHZXQgc2Vzc2lvbiBsaXN0IHF1ZXJ5IHJlc3VsdHM6JywgcmVzdWx0cyk7XG5cbiAgICAgICAgICAgIHRoaXMuX3Nlc3Npb25Sb3dzID0gXy5mb3JFYWNoKHJlc3VsdHMuZGF0YSwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50Lmxhc3RBY2Nlc3MgPSBuZXcgRGF0ZShlbGVtZW50Lmxhc3RBY2Nlc3MpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudG90YWxQYWdlcyA9IHJlc3VsdHMudG90YWxQYWdlcztcbiAgICAgICAgICAgIHRoaXMudG90YWxSZWNvcmRzID0gcmVzdWx0cy50b3RhbFJlY29yZHM7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcmVzdWx0cy5wYWdlSW5kZXg7XG4gICAgICAgICAgICB0aGlzLmdyaWRWaWV3ID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuX3Nlc3Npb25Sb3dzLFxuICAgICAgICAgICAgICAgIHRvdGFsOiByZXN1bHRzLnRvdGFsUmVjb3Jkc1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoTE9HX1RBRywgJ0dldCBzZXNzaW9uIGxpc3QgZmFpbGVkOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0xvYWRTZXNzaW9uc0Vycm9yJyxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0xvYWQgU2Vzc2lvbnMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdFcnJvciBsb2FkaW5nIFNlc3Npb25zOicsXG4gICAgICAgICAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFnZUNoYW5nZSh7IHNraXAsIHRha2UgfTogUGFnZUNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdwYWdlQ2hhbmdlIHNraXA9Jywgc2tpcCwgJyB0YWtlPScsIHRha2UpO1xuICAgICAgICB0aGlzLnNraXAgPSBza2lwO1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gdGFrZTtcbiAgICAgICAgY29uc3QgbmV3UGFnZUluZGV4ID0gdGhpcy5jYWxjdWxhdGVQYWdlSW5kZXgoc2tpcCwgdGFrZSk7XG4gICAgICAgIHRoaXMubG9hZERhdGEodGhpcy5kb21haW5TZWxlY3Rvci5zZWxlY3RlZERvbWFpbiwgdGhpcy5fc2VsZWN0ZWRBcHBsaWNhdGlvbiwgbmV3UGFnZUluZGV4LCB0aGlzLnBhZ2VTaXplKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVBhZ2VJbmRleChza2lwOiBudW1iZXIsIHRha2U6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAoc2tpcCAvIHRha2UpICsgMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkUXVlcnlTb3J0KCk6IE1vdGlmUXVlcnlTb3J0IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ2J1aWxkUXVlcnlTb3J0OiAnLCB0aGlzLnNvcnQpO1xuICAgICAgICBjb25zdCBxdWVyeVNvcnQgPSBuZXcgTW90aWZRdWVyeVNvcnQoKTtcbiAgICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvcnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0SW5mbyA9IHRoaXMuc29ydFtpXTtcbiAgICAgICAgICAgICAgICBpZiAoc29ydEluZm8uZGlyICYmIHNvcnRJbmZvLmRpciA9PT0gJ2FzYycpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlTb3J0Lm9yZGVyQXNjZW5kaW5nQnkoc29ydEluZm8uZmllbGQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc29ydEluZm8uZGlyICYmIHNvcnRJbmZvLmRpciA9PT0gJ2Rlc2MnKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5U29ydC5vcmRlckRlc2NlbmRpbmdCeShzb3J0SW5mby5maWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWVyeVNvcnQ7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAqIFNldCB0aGUgc2VsY3RlZCBhcHBsaWNhdGlvblxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkQXBwbGljYXRpb24oYXBwbGljYXRpb246IEFwcGxpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjtcbiAgICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmRvbWFpblNlbGVjdG9yLnNlbGVjdGVkRG9tYWluLCB0aGlzLl9zZWxlY3RlZEFwcGxpY2F0aW9uLCAxLCB0aGlzLnBhZ2VTaXplKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxvYWQgdGhlIGxpc3Qgb2YgdGhlIGN1cnJlbnQgc2Vzc2lvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVmcmVzaERhdGEoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9hZERhdGEodGhpcy5zZWxlY3RlZERvbWFpbiwgdGhpcy5fc2VsZWN0ZWRBcHBsaWNhdGlvbiwgdGhpcy5jdXJyZW50UGFnZSwgdGhpcy5wYWdlU2l6ZSk7XG4gICAgfVxuXG5cbiAgICBvbkRlbGV0ZU9LUHJlc3NlZChkYXRhSXRlbTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdvbkRlbGV0ZU9LUHJlc3NlZCBkYXRhSXRlbT0nLCBkYXRhSXRlbSk7XG4gICAgICAgIHRoaXMuX3N1YkhhbmRsZXIuYWRkKHRoaXMuc2VjdXJpdHlTZXJ2aWNlLmNsb3NlU2Vzc2lvbihkYXRhSXRlbS5pZCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnb25EZWxldGVPS1ByZXNzZWQgT0s6JywgZGF0YSk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XG5cblxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0Nsb3NlU2Vzc2lvblN1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2xvc2UgU2Vzc2lvbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1Nlc3Npb24gY2xvc2VkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2Vzc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihMT0dfVEFHLCAnb25EZWxldGVPS1ByZXNzZWQgZXJyb3I6JywgZXJyb3IpO1xuXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ2xvc2VTZXNzaW9uRXJyb3InLFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnQ2xvc2UgU2Vzc2lvbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGNsb3Npbmcgc2Vzc2lvbjonLFxuICAgICAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuRXJyb3IsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgIGNsb3NhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUmVmcmVzaENsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcbiAgICB9XG5cblxufVxuIl19