@linid-dm/directory-manager-client-core
Version:
Core package by providing a set of angular components for the Directory Manager app.
273 lines • 47.4 kB
JavaScript
/**
* Copyright (C) 2020-2024 Linagora
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version, provided you comply with the Additional Terms applicable for
* LinID Directory Manager software by LINAGORA pursuant to Section 7 of the GNU
* Affero General Public License, subsections (b), (c), and (e), pursuant to
* which these Appropriate Legal Notices must notably (i) retain the display of
* the "LinID™" trademark/logo at the top of the interface window, the display
* of the “You are using the Open Source and free version of LinID™, powered by
* Linagora © 2009–2013. Contribute to LinID R&D by subscribing to an Enterprise
* offer!” infobox and in the e-mails sent with the Program, notice appended to
* any type of outbound messages (e.g. e-mail and meeting requests) as well as
* in the LinID Directory Manager user interface, (ii) retain all hypertext
* links between LinID Directory Manager and https://linid.org/, as well as
* between LINAGORA and LINAGORA.com, and (iii) refrain from infringing LINAGORA
* intellectual property rights over its trademarks and commercial brands. Other
* Additional Terms apply, see <http://www.linagora.com/licenses/> for more
* details.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License and
* its applicable Additional Terms for LinID Directory Manager along with this
* program. If not, see <http://www.gnu.org/licenses/> for the GNU Affero
* General Public License version 3 and <http://www.linagora.com/licenses/> for
* the Additional Terms applicable to the LinID Directory Manager software.
*/
import { MatTableDataSource } from '@angular/material/table';
import _ from 'lodash';
import { catchError } from 'rxjs';
import { setActionsTitlesVariables } from '../helpers/configs.helper';
import { DataViewProperties, canDeleteEntries, getViewPropertiesArrayAttribute, } from '../helpers/data-table.helper';
import { EUserAction, } from '../interfaces/data.interface';
import * as Error from '../states/error/error.actions';
import { getResponseAttributesIds, getRouterLinkValue, } from './resources.helper';
export class DisplayedDetailArray {
constructor(selectedResourceTypeId, configs, attributeAsArray, resourcesTypesIds, dataResourcesAsFlatArray, editableArrayProperties, isEditableAttribute) {
this.canDeleteEntries = false;
const attributeConfig = configs.byId[selectedResourceTypeId].attributes.find((attribute) => attribute.modelRef === attributeAsArray.idField);
const arrayResourceTypeId = attributeAsArray.getDataListParams?.requestResourceTypeId;
const isClickableRow = !!attributeAsArray.getDataListParams;
const attributeViewProperties = new DataViewProperties(getViewPropertiesArrayAttribute(attributeConfig, isClickableRow));
let actions = configs.byId[selectedResourceTypeId].actions;
this.actions = {
search: actions.attributes[attributeAsArray.idField].search,
};
attributeViewProperties.setDataSource(new MatTableDataSource(dataResourcesAsFlatArray));
this.attributeId = attributeAsArray.idField;
this.initialSource = dataResourcesAsFlatArray || [];
this.requestsParams = attributeAsArray.getDataListParams;
this.isEditableArray =
attributeConfig.props.isEditable &&
(isEditableAttribute || attributeConfig.props.isAddedAttributeArray);
this.label = attributeConfig.value.label.value.long;
this.emptyArrayPlaceholder =
attributeConfig.value.field.props.emptyArrayPlaceholder;
this.viewProperties = attributeViewProperties;
this.icon = attributeConfig.value.icon.value;
if (arrayResourceTypeId) {
this.icon = configs.byId[arrayResourceTypeId].icon;
if (isClickableRow) {
this.endpoint = attributeAsArray.getDataListParams?.requestTarget;
}
}
if (this.isEditableArray) {
this.selectedElementsUiIds = [];
this.succeededElements = [];
this.failedElements404 = [];
this.updateAffectAnotherResourceType =
attributeConfig.updateArrayAttributeParams
?.updateAffectAnotherResourceType || false;
this.fieldForUpdate = attributeConfig.getDataListParams.fieldForUpdate;
this.updateParams = attributeAsArray.updateArrayAttributeParams;
this.actions = {
...this.actions,
...setActionsTitlesVariables([
editableArrayProperties.selectedEntryExternalId,
editableArrayProperties.selectedEntryParentExternalId,
], actions.attributes[attributeAsArray.idField]),
};
this.canDeleteEntries = canDeleteEntries(this.actions, dataResourcesAsFlatArray?.some((row) => row.meta?.isDeletable));
}
this.resourceTypeConfig = configs.byId[arrayResourceTypeId];
this.typesLabels =
resourcesTypesIds.length > 1
? this.label
: configs.byId[resourcesTypesIds[0]].label;
}
}
//TODO Adapat this method for IClickableDataTableCellElement with more than two columns
export function convertDataNodeToDataSourceRow(node, columns, resourceTypes, isClickable = true) {
const columnsResourcesTypesIds = _.intersection(columns.map((column) => column.id), resourceTypes.allIds);
return columnsResourcesTypesIds.reduce((acc, columnId, index) => ({
...acc,
[columnId]: [
{
id: index === 0 && columnsResourcesTypesIds.length > 1
? node.parentIds.id
: node.ids.id,
value: index === 0 && columnsResourcesTypesIds.length > 1
? node.parentIds.externalId
: node.ids.externalId,
isClickable,
routerLinkValue: getRouterLinkValue(resourceTypes.byId[columnsResourcesTypesIds[index]].endpoint, node.ids.externalId, index > 0
? resourceTypes.byId[columnsResourcesTypesIds[index - 1]].endpoint
: null, index > 0 ? node.parentIds.externalId : null),
},
],
}), {
selectionIds: { ...node.ids, label: node.name },
isRowEditable: false,
});
}
export function getArrayAttributeDoingRequestsDetail(attributeConfig, data) {
return {
idField: attributeConfig.modelRef,
attributeConfig,
getDataListParams: attributeConfig.getDataListParams || null,
updateArrayAttributeParams: attributeConfig.updateArrayAttributeParams || null,
data,
};
}
export function getArrayAttributeResourcesTypesIds(attributeConfig) {
let resourceTypesIds;
if ('getDataListParams' in attributeConfig) {
resourceTypesIds = [
attributeConfig.getDataListParams.requestResourceTypeId,
];
}
else {
resourceTypesIds = attributeConfig.value.field.props.columns.reduce((acc, column) => (column.type ? [...acc, column.type] : acc), []);
}
return resourceTypesIds;
}
export function getAttributeValues(requestsProperties, dataService, errorsHandlerService, attributeDoingRequestsDetails, store, attributeConfig) {
let responseAttributesIds = getResponseAttributesIds(null, requestsProperties.resourceTypeId, attributeConfig);
return dataService
.getDataListWithParameteredFilter(attributeDoingRequestsDetails.getDataListParams.requestTarget, requestsProperties.valueForFilterRegex, requestsProperties.filtersRegex, responseAttributesIds, attributeDoingRequestsDetails.updateArrayAttributeParams
?.updateAffectAnotherResourceType)
.pipe(catchError((err) => {
store.dispatch([
new Error.SetErrorDetail({
error: err,
userActionOnError: EUserAction.DETAIL_GET_ARRAY,
}),
new Error.IsHandlingError(true),
]);
return errorsHandlerService.handleError(err);
}));
}
export function getElementId(selectedElement) {
if (isDataNode(selectedElement)) {
return selectedElement.ids.id;
}
else if ('selectionIds' in selectedElement &&
selectedElement.selectionIds) {
return selectedElement.selectionIds.id;
}
else {
return selectedElement.id;
}
}
export function getDataSourceRowsWithAssociatedValue(rows, updateActionsParams, associatedValue) {
return rows.map((row) => ({
...row,
[updateActionsParams.edit.columnId]: associatedValue[getElementId(row)],
}));
}
export function isDataNode(element) {
if (typeof element !== 'object') {
return false;
}
const nbFields = Object.keys(element).length;
const hasRequiredProperties = 'ids' in element &&
'name' in element &&
'link' in element &&
'type' in element &&
'childrenType' in element &&
'canDelete' in element &&
'levelForPadding' in element &&
'parentIdForDisplay' in element &&
'parentIds' in element &&
'expandable' in element &&
'canDelete' in element;
const hasAllIDataNodeProperties = hasRequiredProperties && 'children' in element;
return ((hasRequiredProperties && nbFields === 11) ||
(hasAllIDataNodeProperties && nbFields === 12));
}
export function getElementExternalId(selectedElement) {
if (isDataNode(selectedElement)) {
return selectedElement.ids.externalId;
}
else if ('selectionIds' in selectedElement &&
selectedElement.selectionIds) {
return selectedElement.selectionIds.externalId;
}
else {
return selectedElement.externalId;
}
}
export function getNotSelectedRows(dataSource, selectedElementsIds) {
return dataSource.filter((row) => !selectedElementsIds.includes(row.selectionIds.id));
}
export function getSelectedElements(event) {
if ('selectedElementsUiIds' in event && !!event.selectedElementsUiIds) {
return event.selectedElementsUiIds;
}
else if ('selectedElements' in event && !!event.selectedElements) {
return event.selectedElements;
}
else {
return event;
}
}
export function getElementLabel(selectedElement) {
if (isDataNode(selectedElement)) {
return selectedElement.name;
}
else if ('selectionIds' in selectedElement &&
selectedElement.selectionIds) {
return selectedElement.selectionIds.label;
}
else {
return selectedElement.label;
}
}
export function setRequestsProperties(attributeDoingRequests, selectedEntryId) {
let resourceTypeId = attributeDoingRequests.getDataListParams.requestResourceTypeId;
let valueForFilterRegex = '"' + selectedEntryId + '"';
let filtersRegex = attributeDoingRequests.getDataListParams.regexFilter;
return {
resourceTypeId,
valueForFilterRegex,
filtersRegex,
};
}
export function getElementIds(selectedElement) {
return {
id: getElementId(selectedElement),
externalId: getElementExternalId(selectedElement),
label: getElementLabel(selectedElement),
};
}
function convertLinkToDataDetailResource(data, endpoint, isAuthorizedEndpoint) {
let dataDetailResource = {
id: data.id,
value: data.label,
isClickable: data.canBeRead && isAuthorizedEndpoint,
};
let clickableDataDetailResource = {
...dataDetailResource,
routerLinkValue: getRouterLinkValue(endpoint, data.label),
};
return dataDetailResource.isClickable
? clickableDataDetailResource
: dataDetailResource;
}
export function setLinkAttributeResource(data, endpoint, authorizedEndpoints) {
const isAuthorizedEndpoint = authorizedEndpoints.includes(endpoint);
if (Array.isArray(data)) {
return data.map((link) => convertLinkToDataDetailResource(link, endpoint, isAuthorizedEndpoint));
}
else {
return convertLinkToDataDetailResource(data, endpoint, isAuthorizedEndpoint);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1kZXRhaWwuaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbGlicy9jbGllbnQtY29yZS9zcmMvbGliL3NoYXJlZC9oZWxwZXJzL2RhdGEtZGV0YWlsLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFHSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQiwrQkFBK0IsR0FDaEMsTUFBTSw4QkFBOEIsQ0FBQztBQVd0QyxPQUFPLEVBQ0wsV0FBVyxHQWFaLE1BQU0sOEJBQThCLENBQUM7QUFNdEMsT0FBTyxLQUFLLEtBQUssTUFBTSwrQkFBK0IsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE1BQU0sT0FBTyxvQkFBb0I7SUFzRC9CLFlBQ0Usc0JBQThCLEVBQzlCLE9BQXlCLEVBQ3pCLGdCQUE2QyxFQUM3QyxpQkFBMkIsRUFDM0Isd0JBQWtELEVBQ2xELHVCQUFrRCxFQUNsRCxtQkFBNkI7UUF2Q3hCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQXlDOUIsTUFBTSxlQUFlLEdBQWUsT0FBTyxDQUFDLElBQUksQ0FDOUMsc0JBQXNCLENBQ3ZCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDZixDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENB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KlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXJcbiAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZVxuICogU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnlcbiAqIGxhdGVyIHZlcnNpb24sIHByb3ZpZGVkIHlvdSBjb21wbHkgd2l0aCB0aGUgQWRkaXRpb25hbCBUZXJtcyBhcHBsaWNhYmxlIGZvclxuICogTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgc29mdHdhcmUgYnkgTElOQUdPUkEgcHVyc3VhbnQgdG8gU2VjdGlvbiA3IG9mIHRoZSBHTlVcbiAqIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzdWJzZWN0aW9ucyAoYiksIChjKSwgYW5kIChlKSwgcHVyc3VhbnQgdG9cbiAqIHdoaWNoIHRoZXNlIEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMgbXVzdCBub3RhYmx5IChpKSByZXRhaW4gdGhlIGRpc3BsYXkgb2ZcbiAqIHRoZSBcIkxpbklE4oSiXCIgdHJhZGVtYXJrL2xvZ28gYXQgdGhlIHRvcCBvZiB0aGUgaW50ZXJmYWNlIHdpbmRvdywgdGhlIGRpc3BsYXlcbiAqIG9mIHRoZSDigJxZb3UgYXJlIHVzaW5nIHRoZSBPcGVuIFNvdXJjZSBhbmQgZnJlZSB2ZXJzaW9uIG9mIExpbklE4oSiLCBwb3dlcmVkIGJ5XG4gKiBMaW5hZ29yYSDCqSAyMDA54oCTMjAxMy4gQ29udHJpYnV0ZSB0byBMaW5JRCBSJkQgYnkgc3Vic2NyaWJpbmcgdG8gYW4gRW50ZXJwcmlzZVxuICogb2ZmZXIh4oCdIGluZm9ib3ggYW5kIGluIHRoZSBlLW1haWxzIHNlbnQgd2l0aCB0aGUgUHJvZ3JhbSwgbm90aWNlIGFwcGVuZGVkIHRvXG4gKiBhbnkgdHlwZSBvZiBvdXRib3VuZCBtZXNzYWdlcyAoZS5nLiBlLW1haWwgYW5kIG1lZXRpbmcgcmVxdWVzdHMpIGFzIHdlbGwgYXNcbiAqIGluIHRoZSBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciB1c2VyIGludGVyZmFjZSwgKGlpKSByZXRhaW4gYWxsIGh5cGVydGV4dFxuICogbGlua3MgYmV0d2VlbiBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBhbmQgaHR0cHM6Ly9saW5pZC5vcmcvLCBhcyB3ZWxsIGFzXG4gKiBiZXR3ZWVuIExJTkFHT1JBIGFuZCBMSU5BR09SQS5jb20sIGFuZCAoaWlpKSByZWZyYWluIGZyb20gaW5mcmluZ2luZyBMSU5BR09SQVxuICogaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvdmVyIGl0cyB0cmFkZW1hcmtzIGFuZCBjb21tZXJjaWFsIGJyYW5kcy4gT3RoZXJcbiAqIEFkZGl0aW9uYWwgVGVybXMgYXBwbHksIHNlZSA8aHR0cDovL3d3dy5saW5hZ29yYS5jb20vbGljZW5zZXMvPiBmb3IgbW9yZVxuICogZGV0YWlscy5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTXG4gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlXG4gKiBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmRcbiAqIGl0cyBhcHBsaWNhYmxlIEFkZGl0aW9uYWwgVGVybXMgZm9yIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIGFsb25nIHdpdGggdGhpc1xuICogcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+IGZvciB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgYW5kIDxodHRwOi8vd3d3LmxpbmFnb3JhLmNvbS9saWNlbnNlcy8+IGZvclxuICogdGhlIEFkZGl0aW9uYWwgVGVybXMgYXBwbGljYWJsZSB0byB0aGUgTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgc29mdHdhcmUuXG4gKi9cblxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzZXRBY3Rpb25zVGl0bGVzVmFyaWFibGVzIH0gZnJvbSAnLi4vaGVscGVycy9jb25maWdzLmhlbHBlcic7XG5pbXBvcnQge1xuICBEYXRhVmlld1Byb3BlcnRpZXMsXG4gIGNhbkRlbGV0ZUVudHJpZXMsXG4gIGdldFZpZXdQcm9wZXJ0aWVzQXJyYXlBdHRyaWJ1dGUsXG59IGZyb20gJy4uL2hlbHBlcnMvZGF0YS10YWJsZS5oZWxwZXInO1xuaW1wb3J0IHsgSnNUYWJsZSB9IGZyb20gJy4uL2hlbHBlcnMvanN0YWJsZS5oZWxwZXInO1xuaW1wb3J0IHtcbiAgSUFjdGlvbnMsXG4gIElBcnJheUF0dHJpYnV0ZVVwZGF0ZVBhcmFtcyxcbiAgSUF0dHJpYnV0ZSxcbiAgSUF0dHJpYnV0ZUFjdGlvbnMsXG4gIElDb2x1bW4sXG4gIElDb25maWcsXG4gIElHZXREYXRhTGlzdFBhcmFtcyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWdzLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBFVXNlckFjdGlvbixcbiAgSUFycmF5QXR0cmlidXRlRG9pbmdSZXF1ZXN0LFxuICBJQ2xpY2thYmxlRGF0YURldGFpbFJlc291cmNlLFxuICBJRGF0YSxcbiAgSURhdGFEZXRhaWxSZXNvdXJjZSxcbiAgSURhdGFOb2RlLFxuICBJRGF0YVNvdXJjZVJvdyxcbiAgSURhdGFUYWJsZVJvdyxcbiAgSUVkaXRhYmxlQXJyYXlQcm9wZXJ0aWVzLFxuICBJR2VuZXJpY0FycmF5Q29sdW1uLFxuICBJTGluayxcbiAgSVJlcXVlc3RzUHJvcGVydGllcyxcbiAgSVVpRW50cnlJZHMsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRm9ybUZpZWxkc0V4dGVuZGVkU2luZ2xlVHlwZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Zvcm0uaW50ZXJmYWNlJztcbmltcG9ydCB7IElSZXNvdXJjZVR5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Jlc291cmNlcy10eXBlcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUFzc2lnbkVsZW1lbnRzLCBJTW92ZUVsZW1lbnRzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy91aS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGF0YVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXJyb3JzSGFuZGxlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9lcnJvcnMtaGFuZGxlci5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIEVycm9yIGZyb20gJy4uL3N0YXRlcy9lcnJvci9lcnJvci5hY3Rpb25zJztcbmltcG9ydCB7XG4gIGdldFJlc3BvbnNlQXR0cmlidXRlc0lkcyxcbiAgZ2V0Um91dGVyTGlua1ZhbHVlLFxufSBmcm9tICcuL3Jlc291cmNlcy5oZWxwZXInO1xuXG5leHBvcnQgY2xhc3MgRGlzcGxheWVkRGV0YWlsQXJyYXkge1xuICBwdWJsaWMgYXR0cmlidXRlSWQ6IHN0cmluZztcbiAgcHVibGljIGlzRWRpdGFibGVBcnJheTogYm9vbGVhbjtcbiAgcHVibGljIGxhYmVsOiBzdHJpbmc7XG4gIHB1YmxpYyBpY29uOiBzdHJpbmc7XG4gIHB1YmxpYyBlbXB0eUFycmF5UGxhY2Vob2xkZXI6IHN0cmluZztcbiAgcHVibGljIHZpZXdQcm9wZXJ0aWVzOiBEYXRhVmlld1Byb3BlcnRpZXM7XG4gIHB1YmxpYyBhY3Rpb25zOiBJQXR0cmlidXRlQWN0aW9ucztcbiAgcHVibGljIHJlc291cmNlVHlwZUNvbmZpZzogSUNvbmZpZztcbiAgcHVibGljIHR5cGVzTGFiZWxzOiBzdHJpbmc7XG4gIHB1YmxpYyBzZWxlY3RlZEVsZW1lbnRzVWlJZHM6IElVaUVudHJ5SWRzW107XG4gIHB1YmxpYyBzdWNjZWVkZWRFbGVtZW50czogKElVaUVudHJ5SWRzIHwgSURhdGFTb3VyY2VSb3cgfCBJRGF0YU5vZGUpW107XG4gIHB1YmxpYyBmYWlsZWRFbGVtZW50czQwNDogKElVaUVudHJ5SWRzIHwgSURhdGFTb3VyY2VSb3cgfCBJRGF0YU5vZGUpW107XG4gIHB1YmxpYyBlbmRwb2ludDogc3RyaW5nO1xuICBwdWJsaWMgdXBkYXRlUGFyYW1zOiBJQXJyYXlBdHRyaWJ1dGVVcGRhdGVQYXJhbXM7XG4gIHB1YmxpYyBpbml0aWFsU291cmNlOiBhbnlbXTtcbiAgcHVibGljIGFzc29jaWF0ZWREYXRhOiB7XG4gICAgW2F0dHJpYnV0ZUlkOiBzdHJpbmddOiBJRGF0YTtcbiAgfTtcbiAgcHVibGljIHJlcXVlc3RzUGFyYW1zOiBJR2V0RGF0YUxpc3RQYXJhbXM7XG4gIHB1YmxpYyB1cGRhdGVBZmZlY3RBbm90aGVyUmVzb3VyY2VUeXBlOiBib29sZWFuO1xuICBwdWJsaWMgZmllbGRGb3JVcGRhdGU6IHN0cmluZztcbiAgcHVibGljIGNhbkRlbGV0ZUVudHJpZXMgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzZWxlY3RlZFJlc291cmNlVHlwZUlkOiBzdHJpbmcsXG4gICAgY29uZmlnczogSnNUYWJsZTxJQ29uZmlnPixcbiAgICBhdHRyaWJ1dGVBc0FycmF5OiBJQXJyYXlBdHRyaWJ1dGVEb2luZ1JlcXVlc3QsXG4gICAgcmVzb3VyY2VUeXBlSWQ6IHN0cmluZ1tdXG4gICk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHNlbGVjdGVkUmVzb3VyY2VUeXBlSWQ6IHN0cmluZyxcbiAgICBjb25maWdzOiBKc1RhYmxlPElDb25maWc+LFxuICAgIGF0dHJpYnV0ZUFzQXJyYXk6IElBcnJheUF0dHJpYnV0ZURvaW5nUmVxdWVzdCxcbiAgICByZXNvdXJjZXNUeXBlc0lkczogc3RyaW5nW10sXG4gICAgZGF0YVJlc291cmNlc0FzRmxhdEFycmF5OiBhbnlbXSB8IElEYXRhVGFibGVSb3dbXVxuICApO1xuICBjb25zdHJ1Y3RvcihcbiAgICBzZWxlY3RlZFJlc291cmNlVHlwZUlkOiBzdHJpbmcsXG4gICAgY29uZmlnczogSnNUYWJsZTxJQ29uZmlnPixcbiAgICBhdHRyaWJ1dGVBc0FycmF5OiBJQXJyYXlBdHRyaWJ1dGVEb2luZ1JlcXVlc3QsXG4gICAgcmVzb3VyY2VzVHlwZXNJZHM6IHN0cmluZ1tdLFxuICAgIGRhdGFSZXNvdXJjZXNBc0ZsYXRBcnJheTogYW55W10gfCBJRGF0YVRhYmxlUm93W10sXG4gICAgZWRpdGFibGVBcnJheVByb3BlcnRpZXM6IElFZGl0YWJsZUFycmF5UHJvcGVydGllc1xuICApO1xuICBjb25zdHJ1Y3RvcihcbiAgICBzZWxlY3RlZFJlc291cmNlVHlwZUlkOiBzdHJpbmcsXG4gICAgY29uZmlnczogSnNUYWJsZTxJQ29uZmlnPixcbiAgICBhdHRyaWJ1dGVBc0FycmF5OiBJQXJyYXlBdHRyaWJ1dGVEb2luZ1JlcXVlc3QsXG4gICAgcmVzb3VyY2VzVHlwZXNJZHM6IHN0cmluZ1tdLFxuICAgIGRhdGFSZXNvdXJjZXNBc0ZsYXRBcnJheTogYW55W10gfCBJRGF0YVRhYmxlUm93W10sXG4gICAgZWRpdGFibGVBcnJheVByb3BlcnRpZXM6IElFZGl0YWJsZUFycmF5UHJvcGVydGllcyxcbiAgICBpc0VkaXRhYmxlQXR0cmlidXRlOiBib29sZWFuXG4gICk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHNlbGVjdGVkUmVzb3VyY2VUeXBlSWQ6IHN0cmluZyxcbiAgICBjb25maWdzOiBKc1RhYmxlPElDb25maWc+LFxuICAgIGF0dHJpYnV0ZUFzQXJyYXk6IElBcnJheUF0dHJpYnV0ZURvaW5nUmVxdWVzdCxcbiAgICByZXNvdXJjZXNUeXBlc0lkczogc3RyaW5nW10sXG4gICAgZGF0YVJlc291cmNlc0FzRmxhdEFycmF5PzogYW55W10gfCBJRGF0YVRhYmxlUm93W10sXG4gICAgZWRpdGFibGVBcnJheVByb3BlcnRpZXM/OiBJRWRpdGFibGVBcnJheVByb3BlcnRpZXMsXG4gICAgaXNFZGl0YWJsZUF0dHJpYnV0ZT86IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3QgYXR0cmlidXRlQ29uZmlnOiBJQXR0cmlidXRlID0gY29uZmlncy5ieUlkW1xuICAgICAgc2VsZWN0ZWRSZXNvdXJjZVR5cGVJZFxuICAgIF0uYXR0cmlidXRlcy5maW5kKFxuICAgICAgKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm1vZGVsUmVmID09PSBhdHRyaWJ1dGVBc0FycmF5LmlkRmllbGRcbiAgICApO1xuXG4gICAgY29uc3QgYXJyYXlSZXNvdXJjZVR5cGVJZDogc3RyaW5nID1cbiAgICAgIGF0dHJpYnV0ZUFzQXJyYXkuZ2V0RGF0YUxpc3RQYXJhbXM/LnJlcXVlc3RSZXNvdXJjZVR5cGVJZDtcblxuICAgIGNvbnN0IGlzQ2xpY2thYmxlUm93ID0gISFhdHRyaWJ1dGVBc0FycmF5LmdldERhdGFMaXN0UGFyYW1zO1xuXG4gICAgY29uc3QgYXR0cmlidXRlVmlld1Byb3BlcnRpZXM6IERhdGFWaWV3UHJvcGVydGllcyA9IG5ldyBEYXRhVmlld1Byb3BlcnRpZXMoXG4gICAgICBnZXRWaWV3UHJvcGVydGllc0FycmF5QXR0cmlidXRlKGF0dHJpYnV0ZUNvbmZpZywgaXNDbGlja2FibGVSb3cpXG4gICAgKTtcblxuICAgIGxldCBhY3Rpb25zOiBJQWN0aW9ucyA9IGNvbmZpZ3MuYnlJZFtzZWxlY3RlZFJlc291cmNlVHlwZUlkXS5hY3Rpb25zO1xuICAgIHRoaXMuYWN0aW9ucyA9IHtcbiAgICAgIHNlYXJjaDogYWN0aW9ucy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUFzQXJyYXkuaWRGaWVsZF0uc2VhcmNoLFxuICAgIH07XG5cbiAgICBhdHRyaWJ1dGVWaWV3UHJvcGVydGllcy5zZXREYXRhU291cmNlKFxuICAgICAgbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShkYXRhUmVzb3VyY2VzQXNGbGF0QXJyYXkpXG4gICAgKTtcblxuICAgIHRoaXMuYXR0cmlidXRlSWQgPSBhdHRyaWJ1dGVBc0FycmF5LmlkRmllbGQ7XG4gICAgdGhpcy5pbml0aWFsU291cmNlID0gZGF0YVJlc291cmNlc0FzRmxhdEFycmF5IHx8IFtdO1xuICAgIHRoaXMucmVxdWVzdHNQYXJhbXMgPSBhdHRyaWJ1dGVBc0FycmF5LmdldERhdGFMaXN0UGFyYW1zO1xuXG4gICAgdGhpcy5pc0VkaXRhYmxlQXJyYXkgPVxuICAgICAgYXR0cmlidXRlQ29uZmlnLnByb3BzLmlzRWRpdGFibGUgJiZcbiAgICAgIChpc0VkaXRhYmxlQXR0cmlidXRlIHx8IGF0dHJpYnV0ZUNvbmZpZy5wcm9wcy5pc0FkZGVkQXR0cmlidXRlQXJyYXkpO1xuXG4gICAgdGhpcy5sYWJlbCA9IGF0dHJpYnV0ZUNvbmZpZy52YWx1ZS5sYWJlbC52YWx1ZS5sb25nO1xuICAgIHRoaXMuZW1wdHlBcnJheVBsYWNlaG9sZGVyID1cbiAgICAgIGF0dHJpYnV0ZUNvbmZpZy52YWx1ZS5maWVsZC5wcm9wcy5lbXB0eUFycmF5UGxhY2Vob2xkZXI7XG4gICAgdGhpcy52aWV3UHJvcGVydGllcyA9IGF0dHJpYnV0ZVZpZXdQcm9wZXJ0aWVzO1xuICAgIHRoaXMuaWNvbiA9IGF0dHJpYnV0ZUNvbmZpZy52YWx1ZS5pY29uLnZhbHVlO1xuXG4gICAgaWYgKGFycmF5UmVzb3VyY2VUeXBlSWQpIHtcbiAgICAgIHRoaXMuaWNvbiA9IGNvbmZpZ3MuYnlJZFthcnJheVJlc291cmNlVHlwZUlkXS5pY29uO1xuICAgICAgaWYgKGlzQ2xpY2thYmxlUm93KSB7XG4gICAgICAgIHRoaXMuZW5kcG9pbnQgPSBhdHRyaWJ1dGVBc0FycmF5LmdldERhdGFMaXN0UGFyYW1zPy5yZXF1ZXN0VGFyZ2V0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5pc0VkaXRhYmxlQXJyYXkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50c1VpSWRzID0gW107XG4gICAgICB0aGlzLnN1Y2NlZWRlZEVsZW1lbnRzID0gW107XG4gICAgICB0aGlzLmZhaWxlZEVsZW1lbnRzNDA0ID0gW107XG4gICAgICB0aGlzLnVwZGF0ZUFmZmVjdEFub3RoZXJSZXNvdXJjZVR5cGUgPVxuICAgICAgICBhdHRyaWJ1dGVDb25maWcudXBkYXRlQXJyYXlBdHRyaWJ1dGVQYXJhbXNcbiAgICAgICAgICA/LnVwZGF0ZUFmZmVjdEFub3RoZXJSZXNvdXJjZVR5cGUgfHwgZmFsc2U7XG4gICAgICB0aGlzLmZpZWxkRm9yVXBkYXRlID0gYXR0cmlidXRlQ29uZmlnLmdldERhdGFMaXN0UGFyYW1zLmZpZWxkRm9yVXBkYXRlO1xuICAgICAgdGhpcy51cGRhdGVQYXJhbXMgPSBhdHRyaWJ1dGVBc0FycmF5LnVwZGF0ZUFycmF5QXR0cmlidXRlUGFyYW1zO1xuICAgICAgdGhpcy5hY3Rpb25zID0ge1xuICAgICAgICAuLi50aGlzLmFjdGlvbnMsXG4gICAgICAgIC4uLnNldEFjdGlvbnNUaXRsZXNWYXJpYWJsZXMoXG4gICAgICAgICAgW1xuICAgICAgICAgICAgZWRpdGFibGVBcnJheVByb3BlcnRpZXMuc2VsZWN0ZWRFbnRyeUV4dGVybmFsSWQsXG4gICAgICAgICAgICBlZGl0YWJsZUFycmF5UHJvcGVydGllcy5zZWxlY3RlZEVudHJ5UGFyZW50RXh0ZXJuYWxJZCxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFjdGlvbnMuYXR0cmlidXRlc1thdHRyaWJ1dGVBc0FycmF5LmlkRmllbGRdXG4gICAgICAgICksXG4gICAgICB9O1xuICAgICAgdGhpcy5jYW5EZWxldGVFbnRyaWVzID0gY2FuRGVsZXRlRW50cmllcyhcbiAgICAgICAgdGhpcy5hY3Rpb25zLFxuICAgICAgICBkYXRhUmVzb3VyY2VzQXNGbGF0QXJyYXk/LnNvbWUoXG4gICAgICAgICAgKHJvdzogYW55IHwgSURhdGFUYWJsZVJvdykgPT4gcm93Lm1ldGE/LmlzRGVsZXRhYmxlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvdXJjZVR5cGVDb25maWcgPSBjb25maWdzLmJ5SWRbYXJyYXlSZXNvdXJjZVR5cGVJZF07XG5cbiAgICB0aGlzLnR5cGVzTGFiZWxzID1cbiAgICAgIHJlc291cmNlc1R5cGVzSWRzLmxlbmd0aCA+IDFcbiAgICAgICAgPyB0aGlzLmxhYmVsXG4gICAgICAgIDogY29uZmlncy5ieUlkW3Jlc291cmNlc1R5cGVzSWRzWzBdXS5sYWJlbDtcbiAgfVxufVxuXG4vL1RPRE8gQWRhcGF0IHRoaXMgbWV0aG9kIGZvciBJQ2xpY2thYmxlRGF0YVRhYmxlQ2VsbEVsZW1lbnQgd2l0aCBtb3JlIHRoYW4gdHdvIGNvbHVtbnNcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RGF0YU5vZGVUb0RhdGFTb3VyY2VSb3coXG4gIG5vZGU6IElEYXRhTm9kZSxcbiAgY29sdW1uczogSUdlbmVyaWNBcnJheUNvbHVtbltdLFxuICByZXNvdXJjZVR5cGVzOiBKc1RhYmxlPElSZXNvdXJjZVR5cGU+LFxuICBpc0NsaWNrYWJsZSA9IHRydWVcbik6IElEYXRhU291cmNlUm93IHtcbiAgY29uc3QgY29sdW1uc1Jlc291cmNlc1R5cGVzSWRzOiBzdHJpbmdbXSA9IF8uaW50ZXJzZWN0aW9uKFxuICAgIGNvbHVtbnMubWFwKChjb2x1bW46IElHZW5lcmljQXJyYXlDb2x1bW4pID0+IGNvbHVtbi5pZCksXG4gICAgcmVzb3VyY2VUeXBlcy5hbGxJZHNcbiAgKTtcbiAgcmV0dXJuIGNvbHVtbnNSZXNvdXJjZXNUeXBlc0lkcy5yZWR1Y2UoXG4gICAgKGFjYywgY29sdW1uSWQsIGluZGV4KSA9PiAoe1xuICAgICAgLi4uYWNjLFxuICAgICAgW2NvbHVtbklkXTogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6XG4gICAgICAgICAgICBpbmRleCA9PT0gMCAmJiBjb2x1bW5zUmVzb3VyY2VzVHlwZXNJZHMubGVuZ3RoID4gMVxuICAgICAgICAgICAgICA/IG5vZGUucGFyZW50SWRzLmlkXG4gICAgICAgICAgICAgIDogbm9kZS5pZHMuaWQsXG4gICAgICAgICAgdmFsdWU6XG4gICAgICAgICAgICBpbmRleCA9PT0gMCAmJiBjb2x1bW5zUmVzb3VyY2VzVHlwZXNJZHMubGVuZ3RoID4gMVxuICAgICAgICAgICAgICA/IG5vZGUucGFyZW50SWRzLmV4dGVybmFsSWRcbiAgICAgICAgICAgICAgOiBub2RlLmlkcy5leHRlcm5hbElkLFxuICAgICAgICAgIGlzQ2xpY2thYmxlLFxuICAgICAgICAgIHJvdXRlckxpbmtWYWx1ZTogZ2V0Um91dGVyTGlua1ZhbHVlKFxuICAgICAgICAgICAgcmVzb3VyY2VUeXBlcy5ieUlkW2NvbHVtbnNSZXNvdXJjZXNUeXBlc0lkc1tpbmRleF1dLmVuZHBvaW50LFxuICAgICAgICAgICAgbm9kZS5pZHMuZXh0ZXJuYWxJZCxcbiAgICAgICAgICAgIGluZGV4ID4gMFxuICAgICAgICAgICAgICA/IHJlc291cmNlVHlwZXMuYnlJZFtjb2x1bW5zUmVzb3VyY2VzVHlwZXNJZHNbaW5kZXggLSAxXV0uZW5kcG9pbnRcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgaW5kZXggPiAwID8gbm9kZS5wYXJlbnRJZHMuZXh0ZXJuYWxJZCA6IG51bGxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KSxcbiAgICB7XG4gICAgICBzZWxlY3Rpb25JZHM6IHsgLi4ubm9kZS5pZHMsIGxhYmVsOiBub2RlLm5hbWUgfSxcbiAgICAgIGlzUm93RWRpdGFibGU6IGZhbHNlLFxuICAgIH1cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFycmF5QXR0cmlidXRlRG9pbmdSZXF1ZXN0c0RldGFpbChcbiAgYXR0cmlidXRlQ29uZmlnOiBJQXR0cmlidXRlLFxuICBkYXRhOiBhbnlbXVxuKTogSUFycmF5QXR0cmlidXRlRG9pbmdSZXF1ZXN0IHtcbiAgcmV0dXJuIHtcbiAgICBpZEZpZWxkOiBhdHRyaWJ1dGVDb25maWcubW9kZWxSZWYsXG4gICAgYXR0cmlidXRlQ29uZmlnLFxuICAgIGdldERhdGFMaXN0UGFyYW1zOiBhdHRyaWJ1dGVDb25maWcuZ2V0RGF0YUxpc3RQYXJhbXMgfHwgbnVsbCxcbiAgICB1cGRhdGVBcnJheUF0dHJpYnV0ZVBhcmFtczpcbiAgICAgIGF0dHJpYnV0ZUNvbmZpZy51cGRhdGVBcnJheUF0dHJpYnV0ZVBhcmFtcyB8fCBudWxsLFxuICAgIGRhdGEsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcnJheUF0dHJpYnV0ZVJlc291cmNlc1R5cGVzSWRzKFxuICBhdHRyaWJ1dGVDb25maWc6IElBdHRyaWJ1dGVcbik6IHN0cmluZ1tdIHtcbiAgbGV0IHJlc291cmNlVHlwZXNJZHM6IHN0cmluZ1tdO1xuICBpZiAoJ2dldERhdGFMaXN0UGFyYW1zJyBpbiBhdHRyaWJ1dGVDb25maWcpIHtcbiAgICByZXNvdXJjZVR5cGVzSWRzID0gW1xuICAgICAgYXR0cmlidXRlQ29uZmlnLmdldERhdGFMaXN0UGFyYW1zLnJlcXVlc3RSZXNvdXJjZVR5cGVJZCxcbiAgICBdO1xuICB9IGVsc2Uge1xuICAgIHJlc291cmNlVHlwZXNJZHMgPSBhdHRyaWJ1dGVDb25maWcudmFsdWUuZmllbGQucHJvcHMuY29sdW1ucy5yZWR1Y2UoXG4gICAgICAoYWNjLCBjb2x1bW46IElDb2x1bW4pID0+IChjb2x1bW4udHlwZSA/IFsuLi5hY2MsIGNvbHVtbi50eXBlXSA6IGFjYyksXG4gICAgICBbXVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc291cmNlVHlwZXNJZHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZXMoXG4gIHJlcXVlc3RzUHJvcGVydGllczogSVJlcXVlc3RzUHJvcGVydGllcyxcbiAgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxuICBlcnJvcnNIYW5kbGVyU2VydmljZTogRXJyb3JzSGFuZGxlclNlcnZpY2UsXG4gIGF0dHJpYnV0ZURvaW5nUmVxdWVzdHNEZXRhaWxzOiBJQXJyYXlBdHRyaWJ1dGVEb2luZ1JlcXVlc3QsXG4gIHN0b3JlOiBTdG9yZSxcbiAgYXR0cmlidXRlQ29uZmlnOiBJQXR0cmlidXRlXG4pOiBPYnNlcnZhYmxlPElEYXRhIHwgRXJyb3IgfCBIdHRwRXJyb3JSZXNwb25zZT4ge1xuICBsZXQgcmVzcG9uc2VBdHRyaWJ1dGVzSWRzID0gZ2V0UmVzcG9uc2VBdHRyaWJ1dGVzSWRzKFxuICAgIG51bGwsXG4gICAgcmVxdWVzdHNQcm9wZXJ0aWVzLnJlc291cmNlVHlwZUlkLFxuICAgIGF0dHJpYnV0ZUNvbmZpZ1xuICApO1xuICByZXR1cm4gZGF0YVNlcnZpY2VcbiAgICAuZ2V0RGF0YUxpc3RXaXRoUGFyYW1ldGVyZWRGaWx0ZXIoXG4gICAgICBhdHRyaWJ1dGVEb2luZ1JlcXVlc3RzRGV0YWlscy5nZXREYXRhTGlzdFBhcmFtcy5yZXF1ZXN0VGFyZ2V0LFxuICAgICAgcmVxdWVzdHNQcm9wZXJ0aWVzLnZhbHVlRm9yRmlsdGVyUmVnZXgsXG4gICAgICByZXF1ZXN0c1Byb3BlcnRpZXMuZmlsdGVyc1JlZ2V4LFxuICAgICAgcmVzcG9uc2VBdHRyaWJ1dGVzSWRzLFxuICAgICAgYXR0cmlidXRlRG9pbmdSZXF1ZXN0c0RldGFpbHMudXBkYXRlQXJyYXlBdHRyaWJ1dGVQYXJhbXNcbiAgICAgICAgPy51cGRhdGVBZmZlY3RBbm90aGVyUmVzb3VyY2VUeXBlXG4gICAgKVxuICAgIC5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgIHN0b3JlLmRpc3BhdGNoKFtcbiAgICAgICAgICBuZXcgRXJyb3IuU2V0RXJyb3JEZXRhaWwoe1xuICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgIHVzZXJBY3Rpb25PbkVycm9yOiBFVXNlckFjdGlvbi5ERVRBSUxfR0VUX0FSUkFZLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG5ldyBFcnJvci5Jc0hhbmRsaW5nRXJyb3IodHJ1ZSksXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gZXJyb3JzSGFuZGxlclNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgIH0pXG4gICAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRJZChcbiAgc2VsZWN0ZWRFbGVtZW50OiBJVWlFbnRyeUlkcyB8IElEYXRhU291cmNlUm93IHwgSURhdGFOb2RlXG4pOiBzdHJpbmcge1xuICBpZiAoaXNEYXRhTm9kZShzZWxlY3RlZEVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIChzZWxlY3RlZEVsZW1lbnQgYXMgSURhdGFOb2RlKS5pZHMuaWQ7XG4gIH0gZWxzZSBpZiAoXG4gICAgJ3NlbGVjdGlvbklkcycgaW4gc2VsZWN0ZWRFbGVtZW50ICYmXG4gICAgc2VsZWN0ZWRFbGVtZW50LnNlbGVjdGlvbklkc1xuICApIHtcbiAgICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50LnNlbGVjdGlvbklkcy5pZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKHNlbGVjdGVkRWxlbWVudCBhcyBJVWlFbnRyeUlkcykuaWQ7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhU291cmNlUm93c1dpdGhBc3NvY2lhdGVkVmFsdWUoXG4gIHJvd3M6IElEYXRhU291cmNlUm93W10sXG4gIHVwZGF0ZUFjdGlvbnNQYXJhbXM6IElBcnJheUF0dHJpYnV0ZVVwZGF0ZVBhcmFtcyxcbiAgYXNzb2NpYXRlZFZhbHVlOiB7IFtpZDogc3RyaW5nXTogRm9ybUZpZWxkc0V4dGVuZGVkU2luZ2xlVHlwZXMgfVxuKTogSURhdGFTb3VyY2VSb3dbXSB7XG4gIHJldHVybiByb3dzLm1hcCgocm93OiBJRGF0YVNvdXJjZVJvdykgPT4gKHtcbiAgICAuLi5yb3csXG4gICAgW3VwZGF0ZUFjdGlvbnNQYXJhbXMuZWRpdC5jb2x1bW5JZF06IGFzc29jaWF0ZWRWYWx1ZVtnZXRFbGVtZW50SWQocm93KV0sXG4gIH0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YU5vZGUoZWxlbWVudDogYW55KTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBuYkZpZWxkczogbnVtYmVyID0gT2JqZWN0LmtleXMoZWxlbWVudCkubGVuZ3RoO1xuXG4gIGNvbnN0IGhhc1JlcXVpcmVkUHJvcGVydGllcyA9XG4gICAgJ2lkcycgaW4gZWxlbWVudCAmJlxuICAgICduYW1lJyBpbiBlbGVtZW50ICYmXG4gICAgJ2xpbmsnIGluIGVsZW1lbnQgJiZcbiAgICAndHlwZScgaW4gZWxlbWVudCAmJlxuICAgICdjaGlsZHJlblR5cGUnIGluIGVsZW1lbnQgJiZcbiAgICAnY2FuRGVsZXRlJyBpbiBlbGVtZW50ICYmXG4gICAgJ2xldmVsRm9yUGFkZGluZycgaW4gZWxlbWVudCAmJlxuICAgICdwYXJlbnRJZEZvckRpc3BsYXknIGluIGVsZW1lbnQgJiZcbiAgICAncGFyZW50SWRzJyBpbiBlbGVtZW50ICYmXG4gICAgJ2V4cGFuZGFibGUnIGluIGVsZW1lbnQgJiZcbiAgICAnY2FuRGVsZXRlJyBpbiBlbGVtZW50O1xuXG4gIGNvbnN0IGhhc0FsbElEYXRhTm9kZVByb3BlcnRpZXM6IGJvb2xlYW4gPVxuICAgIGhhc1JlcXVpcmVkUHJvcGVydGllcyAmJiAnY2hpbGRyZW4nIGluIGVsZW1lbnQ7XG5cbiAgcmV0dXJuIChcbiAgICAoaGFzUmVxdWlyZWRQcm9wZXJ0aWVzICYmIG5iRmllbGRzID09PSAxMSkgfHxcbiAgICAoaGFzQWxsSURhdGFOb2RlUHJvcGVydGllcyAmJiBuYkZpZWxkcyA9PT0gMTIpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50RXh0ZXJuYWxJZChcbiAgc2VsZWN0ZWRFbGVtZW50OiBJVWlFbnRyeUlkcyB8IElEYXRhU291cmNlUm93IHwgSURhdGFOb2RlXG4pOiBzdHJpbmcge1xuICBpZiAoaXNEYXRhTm9kZShzZWxlY3RlZEVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIChzZWxlY3RlZEVsZW1lbnQgYXMgSURhdGFOb2RlKS5pZHMuZXh0ZXJuYWxJZDtcbiAgfSBlbHNlIGlmIChcbiAgICAnc2VsZWN0aW9uSWRzJyBpbiBzZWxlY3RlZEVsZW1lbnQgJiZcbiAgICBzZWxlY3RlZEVsZW1lbnQuc2VsZWN0aW9uSWRzXG4gICkge1xuICAgIHJldHVybiBzZWxlY3RlZEVsZW1lbnQuc2VsZWN0aW9uSWRzLmV4dGVybmFsSWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChzZWxlY3RlZEVsZW1lbnQgYXMgSVVpRW50cnlJZHMpLmV4dGVybmFsSWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5vdFNlbGVjdGVkUm93cyhcbiAgZGF0YVNvdXJjZTogSURhdGFTb3VyY2VSb3dbXSxcbiAgc2VsZWN0ZWRFbGVtZW50c0lkczogc3RyaW5nW11cbik6IElEYXRhU291cmNlUm93W10ge1xuICByZXR1cm4gZGF0YVNvdXJjZS5maWx0ZXIoXG4gICAgKHJvdzogSURhdGFTb3VyY2VSb3cpID0+ICFzZWxlY3RlZEVsZW1lbnRzSWRzLmluY2x1ZGVzKHJvdy5zZWxlY3Rpb25JZHMuaWQpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICBldmVudDogSU1vdmVFbGVtZW50cyB8IElVaUVudHJ5SWRzW10gfCBJQXNzaWduRWxlbWVudHMgfCBJRGF0YVNvdXJjZVJvd1tdXG4pOiAoSVVpRW50cnlJZHMgfCBJRGF0YVNvdXJjZVJvdyB8IElEYXRhTm9kZSlbXSB7XG4gIGlmICgnc2VsZWN0ZWRFbGVtZW50c1VpSWRzJyBpbiBldmVudCAmJiAhIWV2ZW50LnNlbGVjdGVkRWxlbWVudHNVaUlkcykge1xuICAgIHJldHVybiBldmVudC5zZWxlY3RlZEVsZW1lbnRzVWlJZHM7XG4gIH0gZWxzZSBpZiAoJ3NlbGVjdGVkRWxlbWVudHMnIGluIGV2ZW50ICYmICEhZXZlbnQuc2VsZWN0ZWRFbGVtZW50cykge1xuICAgIHJldHVybiBldmVudC5zZWxlY3RlZEVsZW1lbnRzO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBldmVudCBhcyBJVWlFbnRyeUlkc1tdIHwgSURhdGFTb3VyY2VSb3dbXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudExhYmVsKFxuICBzZWxlY3RlZEVsZW1lbnQ6IElVaUVudHJ5SWRzIHwgSURhdGFTb3VyY2VSb3cgfCBJRGF0YU5vZGVcbik6IHN0cmluZyB7XG4gIGlmIChpc0RhdGFOb2RlKHNlbGVjdGVkRWxlbWVudCkpIHtcbiAgICByZXR1cm4gKHNlbGVjdGVkRWxlbWVudCBhcyBJRGF0YU5vZGUpLm5hbWU7XG4gIH0gZWxzZSBpZiAoXG4gICAgJ3NlbGVjdGlvbklkcycgaW4gc2VsZWN0ZWRFbGVtZW50ICYmXG4gICAgc2VsZWN0ZWRFbGVtZW50LnNlbGVjdGlvbklkc1xuICApIHtcbiAgICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50LnNlbGVjdGlvbklkcy5sYWJlbDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKHNlbGVjdGVkRWxlbWVudCBhcyBJVWlFbnRyeUlkcykubGFiZWw7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFJlcXVlc3RzUHJvcGVydGllcyhcbiAgYXR0cmlidXRlRG9pbmdSZXF1ZXN0czogSUFycmF5QXR0cmlidXRlRG9pbmdSZXF1ZXN0LFxuICBzZWxlY3RlZEVudHJ5SWQ6IHN0cmluZ1xuKTogSVJlcXVlc3RzUHJvcGVydGllcyB7XG4gIGxldCByZXNvdXJjZVR5cGVJZCA9XG4gICAgYXR0cmlidXRlRG9pbmdSZXF1ZXN0cy5nZXREYXRhTGlzdFBhcmFtcy5yZXF1ZXN0UmVzb3VyY2VUeXBlSWQ7XG4gIGxldCB2YWx1ZUZvckZpbHRlclJlZ2V4OiBzdHJpbmcgPSAnXCInICsgc2VsZWN0ZWRFbnRyeUlkICsgJ1wiJztcbiAgbGV0IGZpbHRlcnNSZWdleCA9IGF0dHJpYnV0ZURvaW5nUmVxdWVzdHMuZ2V0RGF0YUxpc3RQYXJhbXMucmVnZXhGaWx0ZXI7XG4gIHJldHVybiB7XG4gICAgcmVzb3VyY2VUeXBlSWQsXG4gICAgdmFsdWVGb3JGaWx0ZXJSZWdleCxcbiAgICBmaWx0ZXJzUmVnZXgsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50SWRzKFxuICBzZWxlY3RlZEVsZW1lbnQ6IElVaUVudHJ5SWRzIHwgSURhdGFTb3VyY2VSb3cgfCBJRGF0YU5vZGVcbik6IElVaUVudHJ5SWRzIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogZ2V0RWxlbWVudElkKHNlbGVjdGVkRWxlbWVudCksXG4gICAgZXh0ZXJuYWxJZDogZ2V0RWxlbWVudEV4dGVybmFsSWQoc2VsZWN0ZWRFbGVtZW50KSxcbiAgICBsYWJlbDogZ2V0RWxlbWVudExhYmVsKHNlbGVjdGVkRWxlbWVudCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRMaW5rVG9EYXRhRGV0YWlsUmVzb3VyY2UoXG4gIGRhdGE6IElMaW5rLFxuICBlbmRwb2ludDogc3RyaW5nLFxuICBpc0F1dGhvcml6ZWRFbmRwb2ludDogYm9vbGVhblxuKTogSURhdGFEZXRhaWxSZXNvdXJjZSB8IElDbGlja2FibGVEYXRhRGV0YWlsUmVzb3VyY2Uge1xuICBsZXQgZGF0YURldGFpbFJlc291cmNlOiBJRGF0YURldGFpbFJlc291cmNlID0ge1xuICAgIGlkOiBkYXRhLmlkLFxuICAgIHZhbHVlOiBkYXRhLmxhYmVsLFxuICAgIGlzQ2xpY2thYmxlOiBkYXRhLmNhbkJlUmVhZCAmJiBpc0F1dGhvcml6ZWRFbmRwb2ludCxcbiAgfTtcbiAgbGV0IGNsaWNrYWJsZURhdGFEZXRhaWxSZXNvdXJjZTogSUNsaWNrYWJsZURhdGFEZXRhaWxSZXNvdXJjZSA9IHtcbiAgICAuLi5kYXRhRGV0YWlsUmVzb3VyY2UsXG4gICAgcm91dGVyTGlua1ZhbHVlOiBnZXRSb3V0ZXJMaW5rVmFsdWUoZW5kcG9pbnQsIGRhdGEubGFiZWwpLFxuICB9O1xuICByZXR1cm4gZGF0YURldGFpbFJlc291cmNlLmlzQ2xpY2thYmxlXG4gICAgPyBjbGlja2FibGVEYXRhRGV0YWlsUmVzb3VyY2VcbiAgICA6IGRhdGFEZXRhaWxSZXNvdXJjZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldExpbmtBdHRyaWJ1dGVSZXNvdXJjZShcbiAgZGF0YTogSUxpbmsgfCBJTGlua1tdLFxuICBlbmRwb2ludDogc3RyaW5nLFxuICBhdXRob3JpemVkRW5kcG9pbnRzOiBzdHJpbmdbXVxuKTpcbiAgfCBJRGF0YURldGFpbFJlc291cmNlXG4gIHwgSUNsaWNrYWJsZURhdGFEZXRhaWxSZXNvdXJjZVxuICB8IChJRGF0YURldGFpbFJlc291cmNlIHwgSUNsaWNrYWJsZURhdGFEZXRhaWxSZXNvdXJjZSlbXSB7XG4gIGNvbnN0IGlzQXV0aG9yaXplZEVuZHBvaW50OiBib29sZWFuID0gYXV0aG9yaXplZEVuZHBvaW50cy5pbmNsdWRlcyhlbmRwb2ludCk7XG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgcmV0dXJuIGRhdGEubWFwKChsaW5rOiBJTGluaykgPT5cbiAgICAgIGNvbnZlcnRMaW5rVG9EYXRhRGV0YWlsUmVzb3VyY2UobGluaywgZW5kcG9pbnQsIGlzQXV0aG9yaXplZEVuZHBvaW50KVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnZlcnRMaW5rVG9EYXRhRGV0YWlsUmVzb3VyY2UoXG4gICAgICBkYXRhLFxuICAgICAgZW5kcG9pbnQsXG4gICAgICBpc0F1dGhvcml6ZWRFbmRwb2ludFxuICAgICk7XG4gIH1cbn1cbiJdfQ==