UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

299 lines 43.1 kB
import { Injectable } from '@angular/core'; import { ResourceProvider } from '../resource-provider.service'; import { filter, map } from 'rxjs/operators'; import { FilterType } from '../../filter/models/filter-type'; import { HttpEventType } from '@angular/common/http'; import { AbstractResourceService } from '../abstract-endpoint/abstract-resource.service'; import * as i0 from "@angular/core"; import * as i1 from "../resource-provider.service"; import * as i2 from "../../configuration/configuration.service"; import * as i3 from "../../task-content/services/field-converter.service"; import * as i4 from "../../logger/services/logger.service"; export class TaskResourceService extends AbstractResourceService { _fieldConverter; _logger; constructor(provider, configService, _fieldConverter, _logger) { super('task', provider, configService); this._fieldConverter = _fieldConverter; this._logger = _logger; } /** * Count tasks by provided criteria * POST * {{baseUrl}}/api/task/count */ count(filterParam) { if (filterParam.type !== FilterType.TASK) { throw new Error('Provided filter doesn\'t have type TASK'); } return this._resourceProvider.post$('task/count', this.SERVER_URL, filterParam.getRequestBody(), filterParam.getRequestParams()) .pipe(map(r => this.changeType(r, undefined))); } /** * Get all tasks * GET * {{baseUrl}}/api/task */ getAllTask() { return this._resourceProvider.get$('task', this.SERVER_URL) .pipe(map(r => this.changeType(r, 'tasks'))); } /** * Assign task * GET */ // {{baseUrl}}/api/task/assign/:id assignTask(taskId) { return this._resourceProvider.get$('task/assign/' + taskId, this.SERVER_URL) .pipe(map(r => this.changeType(r, undefined))); } /** * Cancel task * GET */ // {{baseUrl}}/api/task/cancel/:id cancelTask(taskId) { return this._resourceProvider.get$('task/cancel/' + taskId, this.SERVER_URL) .pipe(map(r => this.changeType(r, undefined))); } /** * Delegate task * POST */ // {{baseUrl}}/api/task/delegate/:id delegateTask(taskId, body) { return this._resourceProvider.post$('task/delegate/' + taskId, this.SERVER_URL, body, undefined, { 'Content-Type': 'text/plain' }) .pipe(map(r => this.changeType(r, undefined))); } /** * Finish task * GET */ // {{baseUrl}}/api/task/finish/:id finishTask(taskId) { return this._resourceProvider.get$('task/finish/' + taskId, this.SERVER_URL) .pipe(map(r => this.changeType(r, undefined))); } /** * Searches tasks trough the Elastic endpoint. * POST * @param filterParam filter used to search the tasks. Must be of type `TASK`. * @param params Additional parameters */ // {{baseUrl}}/api/task/search_es searchTask(filterParam, params) { if (filterParam.type !== FilterType.TASK) { throw new Error('Provided filter doesn\'t have type TASK'); } params = ResourceProvider.combineParams(filterParam.getRequestParams(), params); return this._resourceProvider.post$('task/search_es', this.SERVER_URL, filterParam.getRequestBody(), params) .pipe(map(r => this.getResourcePage(r, 'tasks'))); } /** * Searches tasks trough the Mongo endpoint. * POST * @param filterParam filter used to search the tasks. Must be of type `TASK`. * Note that the `query` attribute of the filter cannot be used with this endpoint. * Attempting to use it will display a warning and remove the attribute from the request. * @param params Additional request parameters */ // {{baseUrl}}/api/task/search getTasks(filterParam, params) { if (filterParam.type !== FilterType.TASK) { throw new Error('Provided filter doesn\'t have type TASK'); } if (filterParam.bodyContainsQuery()) { throw new Error('getTasks endpoint cannot be queried with filters that contain the \'query\' attribute'); } params = ResourceProvider.combineParams(filterParam.getRequestParams(), params); return this._resourceProvider.post$('task/search', this.SERVER_URL, filterParam.getRequestBody(), params) .pipe(map(r => this.getResourcePage(r, 'tasks'))); } // ----------- CASE ---------- /** * Get all tasks by cases * POST */ // {{baseUrl}}/api/task/case getAllTasksByCases(body) { return this._resourceProvider.post$('task/case', this.SERVER_URL, body) .pipe(map(r => this.changeType(r, 'tasks'))); } /** * Get tasks of the case * GET */ // {{baseUrl}}/api/task/case/:id getAllTasksByCase(caseId) { return this._resourceProvider.get$('task/case/' + caseId, this.SERVER_URL) .pipe(map(r => this.changeType(r, undefined))); } // ----------- MY Task ---------- /** * Get all tasks assigned to logged user * GET */ // {{baseUrl}}/api/task/my getAllMyTasks() { return this._resourceProvider.get$('task/my', this.SERVER_URL) .pipe(map(r => this.changeType(r, undefined))); } /** * Get all finished tasks by logged user * GET */ // {{baseUrl}}/api/task/my/finished getAllFinishedTask() { return this._resourceProvider.get$('task/my/finished', this.SERVER_URL) .pipe(map(r => this.changeType(r, undefined))); } /** * Get all task data * * GET * * If you don't want to parse the response yourself use [getData]{@link TaskResourceService#getData} instead. * * @returns the raw backend response without any additional processing */ // {{baseUrl}}/api/task/:id/data rawGetData(taskId) { return this._resourceProvider.get$('task/' + taskId + '/data', this.SERVER_URL) .pipe(map(r => this.changeType(r, undefined))); } /** * Get all task data * * GET * * If you want to process the raw backend response use [rawGetData]{@link TaskResourceService#rawGetData} instead. * * @param taskId ID of the task who's data should be retrieved from the server * @returns processed data groups of the given task. If the task has no data an empty array will be returned. */ getData(taskId) { return this.rawGetData(taskId).pipe(map((responseOutcome) => { if (responseOutcome.error) { throw new Error(responseOutcome.error); } const dataGroupsArray = this.changeType(responseOutcome.outcome.data, 'dataGroups'); if (!Array.isArray(dataGroupsArray)) { return []; } const result = []; dataGroupsArray.forEach(dataGroupResource => { const dataFields = []; if (!dataGroupResource.fields._embedded) { return; // continue } const fields = []; Object.keys(dataGroupResource.fields._embedded).forEach(localizedFields => { fields.push(...dataGroupResource.fields._embedded[localizedFields]); }); fields.sort((a, b) => a.order - b.order); dataFields.push(...fields.map(dataFieldResource => this._fieldConverter.toClass(dataFieldResource))); const dataGroupObject = { fields: dataFields, stretch: dataGroupResource.stretch, title: dataGroupResource.title, layout: dataGroupResource.layout, alignment: dataGroupResource.alignment, }; if (dataGroupResource.parentTaskId !== undefined) { dataGroupObject.parentTaskId = dataGroupResource.parentTaskId; dataGroupObject.parentTransitionId = dataGroupResource.parentTransitionId; dataGroupObject.parentTaskRefId = dataGroupResource.parentTaskRefId; dataGroupObject.nestingLevel = dataGroupResource.nestingLevel; } if (dataGroupResource.parentCaseId !== undefined) { dataGroupObject['parentCaseId'] = dataGroupResource.parentCaseId; } result.push(dataGroupObject); }); return result; })); } /** * Set task data * POST */ // {{baseUrl}}/api/task/:id/data setData(taskId, body) { return this._resourceProvider.post$('task/' + taskId + '/data', this.SERVER_URL, body) .pipe(map(r => this.changeType(r, undefined))); } // ------------- FILE ------------ /** * Download task file field value * GET */ // {{baseUrl}}/api/task/:id/file/:field - for file field // {{baseUrl}}/api/task/:id/file/:field/:name - for file list field downloadFile(taskId, params) { const url = `task/${taskId}/file${params?.has("fileName") ? '/named' : ''}`; return this._resourceProvider.getBlob$(url, this.SERVER_URL, params).pipe(map(event => { switch (event.type) { case HttpEventType.DownloadProgress: return ResourceProvider.getProgress(event); case HttpEventType.Response: return event.body; default: return undefined; } }), filter(value => !!value)); } /** * Upload file into the task * POST */ // {{baseUrl}}/api/task/:id/file/:field - for file field // {{baseUrl}}/api/task/:id/files/:field - for file list field uploadFile(taskId, body, multipleFiles) { const url = `task/${taskId}/${multipleFiles ? 'files' : 'file'}`; return this._resourceProvider.postWithEvent$(url, this.SERVER_URL, body).pipe(map(event => { switch (event.type) { case HttpEventType.UploadProgress: return ResourceProvider.getProgress(event); case HttpEventType.Response: return event.body; default: return undefined; } }), filter(value => !!value)); } /** * Delete file from the task * DELETE */ deleteFile(taskId, body) { const url = `task/${taskId}/file${body?.fileName ? '/named' : ''}`; return this._resourceProvider.delete$(url, this.SERVER_URL, {}, {}, 'json', body).pipe(map(r => this.changeType(r, undefined))); } /** * Download task file preview for field value * GET */ // {{baseUrl}}/api/task/:id/file_preview/:field downloadFilePreview(taskId, params) { const url = `task/${taskId}/file_preview`; return this._resourceProvider.getBlob$(url, this.SERVER_URL, params).pipe(map(event => { switch (event.type) { case HttpEventType.DownloadProgress: return ResourceProvider.getProgress(event); case HttpEventType.Response: return event.body; default: return undefined; } }), filter(value => !!value)); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskResourceService, deps: [{ token: i1.ResourceProvider }, { token: i2.ConfigurationService }, { token: i3.FieldConverterService }, { token: i4.LoggerService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskResourceService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskResourceService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.ResourceProvider }, { type: i2.ConfigurationService }, { type: i3.FieldConverterService }, { type: i4.LoggerService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1yZXNvdXJjZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L3Rhc2stcmVzb3VyY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBMkIsZ0JBQWdCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUl4RixPQUFPLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBSzNDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFLakUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sZ0RBQWdELENBQUM7Ozs7OztBQVN2RixNQUFNLE9BQU8sbUJBQW9CLFNBQVEsdUJBQXVCO0lBSXRDO0lBQ0E7SUFIdEIsWUFBWSxRQUEwQixFQUMxQixhQUFtQyxFQUN6QixlQUFzQyxFQUN0QyxPQUFzQjtRQUN4QyxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUZyQixvQkFBZSxHQUFmLGVBQWUsQ0FBdUI7UUFDdEMsWUFBTyxHQUFQLE9BQU8sQ0FBZTtJQUU1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxXQUFtQjtRQUM1QixJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRTtZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFV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QUN6RCxNQUFNLEdBQUcsR0FBRyxRQUFRLE1BQU0sZUFBZSxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3JFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNSLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRTtnQkFDaEIsS0FBSyxhQUFhLENBQUMsZ0JBQWdCO29CQUMvQixPQUFPLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0MsS0FBSyxhQUFhLENBQUMsUUFBUTtvQkFDdkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUN0QjtvQkFDSSxPQUFPLFNBQVMsQ0FBQzthQUN4QjtRQUNMLENBQUMsQ0FBQyxFQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FDM0IsQ0FBQztJQUNOLENBQUM7d0dBelRRLG1CQUFtQjs0R0FBbkIsbUJBQW1CLGNBRmhCLE1BQU07OzRGQUVULG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbmZpZ3VyYXRpb25TZXJ2aWNlfSBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uc2VydmljZSc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQYXJhbXMsIFByb3ZpZGVyUHJvZ3Jlc3MsIFJlc291cmNlUHJvdmlkZXJ9IGZyb20gJy4uL3Jlc291cmNlLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Q291bnR9IGZyb20gJy4uL2ludGVyZmFjZS9jb3VudCc7XG5pbXBvcnQge0V2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZSwgTWVzc2FnZVJlc291cmNlfSBmcm9tICcuLi9pbnRlcmZhY2UvbWVzc2FnZS1yZXNvdXJjZSc7XG5pbXBvcnQge2ZpbHRlciwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1Rhc2tSZWZlcmVuY2V9IGZyb20gJy4uL2ludGVyZmFjZS90YXNrLXJlZmVyZW5jZSc7XG5pbXBvcnQge1Rhc2t9IGZyb20gJy4uL2ludGVyZmFjZS90YXNrJztcbmltcG9ydCB7Q291bnRTZXJ2aWNlfSBmcm9tICcuLi9hYnN0cmFjdC1lbmRwb2ludC9jb3VudC1zZXJ2aWNlJztcbmltcG9ydCB7RmlsdGVyfSBmcm9tICcuLi8uLi9maWx0ZXIvbW9kZWxzL2ZpbHRlcic7XG5pbXBvcnQge0ZpbHRlclR5cGV9IGZyb20gJy4uLy4uL2ZpbHRlci9tb2RlbHMvZmlsdGVyLXR5cGUnO1xuaW1wb3J0IHsgSHR0cEV2ZW50VHlwZSwgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7UGFnZX0gZnJvbSAnLi4vaW50ZXJmYWNlL3BhZ2UnO1xuaW1wb3J0IHtGaWVsZENvbnZlcnRlclNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy9maWVsZC1jb252ZXJ0ZXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tTZXREYXRhUmVxdWVzdEJvZHl9IGZyb20gJy4uL2ludGVyZmFjZS90YXNrLXNldC1kYXRhLXJlcXVlc3QtYm9keSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge0Fic3RyYWN0UmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi9hYnN0cmFjdC1lbmRwb2ludC9hYnN0cmFjdC1yZXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7RGF0YUdyb3VwfSBmcm9tICcuLi9pbnRlcmZhY2UvZGF0YS1ncm91cHMnO1xuaW1wb3J0IHtEYXRhRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL21vZGVscy9hYnN0cmFjdC1kYXRhLWZpZWxkJztcbmltcG9ydCB7R2V0RGF0YUdyb3Vwc0V2ZW50T3V0Y29tZX0gZnJvbSAnLi4vLi4vZXZlbnQvbW9kZWwvZXZlbnQtb3V0Y29tZXMvZGF0YS1vdXRjb21lcy9nZXQtZGF0YS1ncm91cHMtZXZlbnQtb3V0Y29tZSc7XG5pbXBvcnQge0ZpbGVGaWVsZFJlcXVlc3R9IGZyb20gXCIuLi9pbnRlcmZhY2UvZmlsZS1maWVsZC1yZXF1ZXN0LWJvZHlcIjtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUYXNrUmVzb3VyY2VTZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZVNlcnZpY2UgaW1wbGVtZW50cyBDb3VudFNlcnZpY2Uge1xuXG4gICAgY29uc3RydWN0b3IocHJvdmlkZXI6IFJlc291cmNlUHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgY29uZmlnU2VydmljZTogQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9maWVsZENvbnZlcnRlcjogRmllbGRDb252ZXJ0ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCd0YXNrJywgcHJvdmlkZXIsIGNvbmZpZ1NlcnZpY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBDb3VudCB0YXNrcyBieSBwcm92aWRlZCBjcml0ZXJpYVxuICAgICAqICBQT1NUXG4gICAgICogIHt7YmFzZVVybH19L2FwaS90YXNrL2NvdW50XG4gICAgICovXG4gICAgcHVibGljIGNvdW50KGZpbHRlclBhcmFtOiBGaWx0ZXIpOiBPYnNlcnZhYmxlPENvdW50PiB7XG4gICAgICAgIGlmIChmaWx0ZXJQYXJhbS50eXBlICE9PSBGaWx0ZXJUeXBlLlRBU0spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZWQgZmlsdGVyIGRvZXNuXFwndCBoYXZlIHR5cGUgVEFTSycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVByb3ZpZGVyLnBvc3QkKCd0YXNrL2NvdW50JywgdGhpcy5TRVJWRVJfVVJMLCBmaWx0ZXJQYXJhbS5nZXRSZXF1ZXN0Qm9keSgpLCBmaWx0ZXJQYXJhbS5nZXRSZXF1ZXN0UGFyYW1zKCkpXG4gICAgICAgICAgICAucGlwZShtYXAociA9PiB0aGlzLmNoYW5nZVR5cGUociwgdW5kZWZpbmVkKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgdGFza3NcbiAgICAgKiBHRVRcbiAgICAgKiB7e2Jhc2VVcmx9fS9hcGkvdGFza1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBbGxUYXNrKCk6IE9ic2VydmFibGU8QXJyYXk8VGFzaz4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlUHJvdmlkZXIuZ2V0JCgndGFzaycsIHRoaXMuU0VSVkVSX1VSTClcbiAgICAgICAgICAgIC5waXBlKG1hcChyID0+IHRoaXMuY2hhbmdlVHlwZShyLCAndGFza3MnKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbiB0YXNrXG4gICAgICogR0VUXG4gICAgICovXG4gICAgLy8ge3tiYXNlVXJsfX0vYXBpL3Rhc2svYXNzaWduLzppZFxuICAgIHB1YmxpYyBhc3NpZ25UYXNrKHRhc2tJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlUHJvdmlkZXIuZ2V0JCgndGFzay9hc3NpZ24vJyArIHRhc2tJZCwgdGhpcy5TRVJWRVJfVVJMKVxuICAgICAgICAgICAgLnBpcGUobWFwKHIgPT4gdGhpcy5jaGFuZ2VUeXBlKHIsIHVuZGVmaW5lZCkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgdGFza1xuICAgICAqIEdFVFxuICAgICAqL1xuICAgIC8vIHt7YmFzZVVybH19L2FwaS90YXNrL2NhbmNlbC86aWRcbiAgICBwdWJsaWMgY2FuY2VsVGFzayh0YXNrSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8RXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVByb3ZpZGVyLmdldCQoJ3Rhc2svY2FuY2VsLycgKyB0YXNrSWQsIHRoaXMuU0VSVkVSX1VSTClcbiAgICAgICAgICAgIC5waXBlKG1hcChyID0+IHRoaXMuY2hhbmdlVHlwZShyLCB1bmRlZmluZWQpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZWdhdGUgdGFza1xuICAgICAqIFBPU1RcbiAgICAgKi9cbiAgICAvLyB7e2Jhc2VVcmx9fS9hcGkvdGFzay9kZWxlZ2F0ZS86aWRcbiAgICBwdWJsaWMgZGVsZWdhdGVUYXNrKHRhc2tJZDogc3RyaW5nLCBib2R5OiBvYmplY3QpOiBPYnNlcnZhYmxlPEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VQcm92aWRlci5wb3N0JCgndGFzay9kZWxlZ2F0ZS8nICsgdGFza0lkLCB0aGlzLlNFUlZFUl9VUkwsIGJvZHksIHVuZGVmaW5lZCwgeydDb250ZW50LVR5cGUnOiAndGV4dC9wbGFpbid9KVxuICAgICAgICAgICAgLnBpcGUobWFwKHIgPT4gdGhpcy5jaGFuZ2VUeXBlKHIsIHVuZGVmaW5lZCkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5pc2ggdGFza1xuICAgICAqIEdFVFxuICAgICAqL1xuICAgIC8vIHt7YmFzZVVybH19L2FwaS90YXNrL2ZpbmlzaC86aWRcbiAgICBwdWJsaWMgZmluaXNoVGFzayh0YXNrSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8RXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVByb3ZpZGVyLmdldCQoJ3Rhc2svZmluaXNoLycgKyB0YXNrSWQsIHRoaXMuU0VSVkVSX1VSTClcbiAgICAgICAgICAgIC5waXBlKG1hcChyID0+IHRoaXMuY2hhbmdlVHlwZShyLCB1bmRlZmluZWQpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VhcmNoZXMgdGFza3MgdHJvdWdoIHRoZSBFbGFzdGljIGVuZHBvaW50LlxuICAgICAqIFBPU1RcbiAgICAgKiBAcGFyYW0gZmlsdGVyUGFyYW0gZmlsdGVyIHVzZWQgdG8gc2VhcmNoIHRoZSB0YXNrcy4gTXVzdCBiZSBvZiB0eXBlIGBUQVNLYC5cbiAgICAgKiBAcGFyYW0gcGFyYW1zIEFkZGl0aW9uYWwgcGFyYW1ldGVyc1xuICAgICAqL1xuICAgIC8vIHt7YmFzZVVybH19L2FwaS90YXNrL3NlYXJjaF9lc1xuICAgIHB1YmxpYyBzZWFyY2hUYXNrKGZpbHRlclBhcmFtOiBGaWx0ZXIsIHBhcmFtcz86IFBhcmFtcyk6IE9ic2VydmFibGU8UGFnZTxUYXNrPj4ge1xuICAgICAgICBpZiAoZmlsdGVyUGFyYW0udHlwZSAhPT0gRmlsdGVyVHlwZS5UQVNLKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb3ZpZGVkIGZpbHRlciBkb2VzblxcJ3QgaGF2ZSB0eXBlIFRBU0snKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJhbXMgPSBSZXNvdXJjZVByb3ZpZGVyLmNvbWJpbmVQYXJhbXMoZmlsdGVyUGFyYW0uZ2V0UmVxdWVzdFBhcmFtcygpLCBwYXJhbXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VQcm92aWRlci5wb3N0JCgndGFzay9zZWFyY2hfZXMnLCB0aGlzLlNFUlZFUl9VUkwsIGZpbHRlclBhcmFtLmdldFJlcXVlc3RCb2R5KCksIHBhcmFtcylcbiAgICAgICAgICAgIC5waXBlKG1hcChyID0+IHRoaXMuZ2V0UmVzb3VyY2VQYWdlPFRhc2s+KHIsICd0YXNrcycpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VhcmNoZXMgdGFza3MgdHJvdWdoIHRoZSBNb25nbyBlbmRwb2ludC5cbiAgICAgKiBQT1NUXG4gICAgICogQHBhcmFtIGZpbHRlclBhcmFtIGZpbHRlciB1c2VkIHRvIHNlYXJjaCB0aGUgdGFza3MuIE11c3QgYmUgb2YgdHlwZSBgVEFTS2AuXG4gICAgICogTm90ZSB0aGF0IHRoZSBgcXVlcnlgIGF0dHJpYnV0ZSBvZiB0aGUgZmlsdGVyIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyBlbmRwb2ludC5cbiAgICAgKiBBdHRlbXB0aW5nIHRvIHVzZSBpdCB3aWxsIGRpc3BsYXkgYSB3YXJuaW5nIGFuZCByZW1vdmUgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBwYXJhbXMgQWRkaXRpb25hbCByZXF1ZXN0IHBhcmFtZXRlcnNcbiAgICAgKi9cbiAgICAvLyB7e2Jhc2VVcmx9fS9hcGkvdGFzay9zZWFyY2hcbiAgICBwdWJsaWMgZ2V0VGFza3MoZmlsdGVyUGFyYW06IEZpbHRlciwgcGFyYW1zPzogUGFyYW1zKTogT2JzZXJ2YWJsZTxQYWdlPFRhc2s+PiB7XG4gICAgICAgIGlmIChmaWx0ZXJQYXJhbS50eXBlICE9PSBGaWx0ZXJUeXBlLlRBU0spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZWQgZmlsdGVyIGRvZXNuXFwndCBoYXZlIHR5cGUgVEFTSycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlclBhcmFtLmJvZHlDb250YWluc1F1ZXJ5KCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0VGFza3MgZW5kcG9pbnQgY2Fubm90IGJlIHF1ZXJpZWQgd2l0aCBmaWx0ZXJzIHRoYXQgY29udGFpbiB0aGUgXFwncXVlcnlcXCcgYXR0cmlidXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJhbXMgPSBSZXNvdXJjZVByb3ZpZGVyLmNvbWJpbmVQYXJhbXMoZmlsdGVyUGFyYW0uZ2V0UmVxdWVzdFBhcmFtcygpLCBwYXJhbXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VQcm92aWRlci5wb3N0JCgndGFzay9zZWFyY2gnLCB0aGlzLlNFUlZFUl9VUkwsIGZpbHRlclBhcmFtLmdldFJlcXVlc3RCb2R5KCksIHBhcmFtcylcbiAgICAgICAgICAgIC5waXBlKG1hcChyID0+IHRoaXMuZ2V0UmVzb3VyY2VQYWdlPFRhc2s+KHIsICd0YXNrcycpKSk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0gQ0FTRSAtLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCB0YXNrcyBieSBjYXNlc1xuICAgICAqIFBPU1RcbiAgICAgKi9cbiAgICAvLyB7e2Jhc2VVcmx9fS9hcGkvdGFzay9jYXNlXG4gICAgcHVibGljIGdldEFsbFRhc2tzQnlDYXNlcyhib2R5OiBvYmplY3QpOiBPYnNlcnZhYmxlPEFycmF5PFRhc2s+PiB7IC8vIFRPRE86ID8/XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVByb3ZpZGVyLnBvc3QkKCd0YXNrL2Nhc2UnLCB0aGlzLlNFUlZFUl9VUkwsIGJvZHkpXG4gICAgICAgICAgICAucGlwZShtYXAociA9PiB0aGlzLmNoYW5nZVR5cGUociwgJ3Rhc2tzJykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGFza3Mgb2YgdGhlIGNhc2VcbiAgICAgKiBHRVRcbiAgICAgKi9cbiAgICAvLyB7e2Jhc2VVcmx9fS9hcGkvdGFzay9jYXNlLzppZFxuICAgIHB1YmxpYyBnZXRBbGxUYXNrc0J5Q2FzZShjYXNlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8VGFza1JlZmVyZW5jZT4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlUHJvdmlkZXIuZ2V0JCgndGFzay9jYXNlLycgKyBjYXNlSWQsIHRoaXMuU0VSVkVSX1VSTClcbiAgICAgICAgICAgIC5waXBlKG1hcChyID0+IHRoaXMuY2hhbmdlVHlwZShyLCB1bmRlZmluZWQpKSk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0gTVkgVGFzayAtLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCB0YXNrcyBhc3NpZ25lZCB0byBsb2dnZWQgdXNlclxuICAgICAqIEdFVFxuICAgICAqL1xuICAgIC8vIHt7YmFzZVVybH19L2FwaS90YXNrL215XG4gICAgcHVibGljIGdldEFsbE15VGFza3MoKTogT2JzZXJ2YWJsZTxBcnJheTxUYXNrPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VQcm92aWRlci5nZXQkKCd0YXNrL215JywgdGhpcy5TRVJWRVJfVVJMKVxuICAgICAgICAgICAgLnBpcGUobWFwKHIgPT4gdGhpcy5jaGFuZ2VUeXBlKHIsIHVuZGVmaW5lZCkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGZpbmlzaGVkIHRhc2tzIGJ5IGxvZ2dlZCB1c2VyXG4gICAgICogR0VUXG4gICAgICovXG4gICAgLy8ge3tiYXNlVXJsfX0vYXBpL3Rhc2svbXkvZmluaXNoZWRcbiAgICBwdWJsaWMgZ2V0QWxsRmluaXNoZWRUYXNrKCk6IE9ic2VydmFibGU8QXJyYXk8VGFzaz4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlUHJvdmlkZXIuZ2V0JCgndGFzay9teS9maW5pc2hlZCcsIHRoaXMuU0VSVkVSX1VSTClcbiAgICAgICAgICAgIC5waXBlKG1hcChyID0+IHRoaXMuY2hhbmdlVHlwZShyLCB1bmRlZmluZWQpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCB0YXNrIGRhdGFcbiAgICAgKlxuICAgICAqIEdFVFxuICAgICAqXG4gICAgICogSWYgeW91IGRvbid0IHdhbnQgdG8gcGFyc2UgdGhlIHJlc3BvbnNlIHlvdXJzZWxmIHVzZSBbZ2V0RGF0YV17QGxpbmsgVGFza1Jlc291cmNlU2VydmljZSNnZXREYXRhfSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgdGhlIHJhdyBiYWNrZW5kIHJlc3BvbnNlIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgcHJvY2Vzc2luZ1xuICAgICAqL1xuICAgIC8vIHt7YmFzZVVybH19L2FwaS90YXNrLzppZC9kYXRhXG4gICAgcHVibGljIHJhd0dldERhdGEodGFza0lkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VQcm92aWRlci5nZXQkKCd0YXNrLycgKyB0YXNrSWQgKyAnL2RhdGEnLCB0aGlzLlNFUlZFUl9VUkwpXG4gICAgICAgICAgICAucGlwZShtYXAociA9PiB0aGlzLmNoYW5nZVR5cGUociwgdW5kZWZpbmVkKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBHZXQgYWxsIHRhc2sgZGF0YVxuICAgICAqXG4gICAgICogIEdFVFxuICAgICAqXG4gICAgICogIElmIHlvdSB3YW50IHRvIHByb2Nlc3MgdGhlIHJhdyBiYWNrZW5kIHJlc3BvbnNlIHVzZSBbcmF3R2V0RGF0YV17QGxpbmsgVGFza1Jlc291cmNlU2VydmljZSNyYXdHZXREYXRhfSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhc2tJZCBJRCBvZiB0aGUgdGFzayB3aG8ncyBkYXRhIHNob3VsZCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICogQHJldHVybnMgcHJvY2Vzc2VkIGRhdGEgZ3JvdXBzIG9mIHRoZSBnaXZlbiB0YXNrLiBJZiB0aGUgdGFzayBoYXMgbm8gZGF0YSBhbiBlbXB0eSBhcnJheSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREYXRhKHRhc2tJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxBcnJheTxEYXRhR3JvdXA+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhd0dldERhdGEodGFza0lkKS5waXBlKFxuICAgICAgICAgICAgbWFwKChyZXNwb25zZU91dGNvbWU6IEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU91dGNvbWUuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlT3V0Y29tZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YUdyb3Vwc0FycmF5ID0gdGhpcy5jaGFuZ2VUeXBlKChyZXNwb25zZU91dGNvbWUub3V0Y29tZSBhcyBHZXREYXRhR3JvdXBzRXZlbnRPdXRjb21lKS5kYXRhLCAnZGF0YUdyb3VwcycpO1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhR3JvdXBzQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZGF0YUdyb3Vwc0FycmF5LmZvckVhY2goZGF0YUdyb3VwUmVzb3VyY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhRmllbGRzOiBBcnJheTxEYXRhRmllbGQ8YW55Pj4gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhR3JvdXBSZXNvdXJjZS5maWVsZHMuX2VtYmVkZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGRhdGFHcm91cFJlc291cmNlLmZpZWxkcy5fZW1iZWRkZWQpLmZvckVhY2gobG9jYWxpemVkRmllbGRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKC4uLmRhdGFHcm91cFJlc291cmNlLmZpZWxkcy5fZW1iZWRkZWRbbG9jYWxpemVkRmllbGRzXSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBmaWVsZHMuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xuICAgICAgICAgICAgICAgICAgICBkYXRhRmllbGRzLnB1c2goLi4uZmllbGRzLm1hcChkYXRhRmllbGRSZXNvdXJjZSA9PiB0aGlzLl9maWVsZENvbnZlcnRlci50b0NsYXNzKGRhdGFGaWVsZFJlc291cmNlKSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhR3JvdXBPYmplY3Q6IERhdGFHcm91cCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczogZGF0YUZpZWxkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmV0Y2g6IGRhdGFHcm91cFJlc291cmNlLnN0cmV0Y2gsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZGF0YUdyb3VwUmVzb3VyY2UudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ6IGRhdGFHcm91cFJlc291cmNlLmxheW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZGF0YUdyb3VwUmVzb3VyY2UuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YUdyb3VwUmVzb3VyY2UucGFyZW50VGFza0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFHcm91cE9iamVjdC5wYXJlbnRUYXNrSWQgPSBkYXRhR3JvdXBSZXNvdXJjZS5wYXJlbnRUYXNrSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhR3JvdXBPYmplY3QucGFyZW50VHJhbnNpdGlvbklkID0gZGF0YUdyb3VwUmVzb3VyY2UucGFyZW50VHJhbnNpdGlvbklkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUdyb3VwT2JqZWN0LnBhcmVudFRhc2tSZWZJZCA9IGRhdGFHcm91cFJlc291cmNlLnBhcmVudFRhc2tSZWZJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFHcm91cE9iamVjdC5uZXN0aW5nTGV2ZWwgPSBkYXRhR3JvdXBSZXNvdXJjZS5uZXN0aW5nTGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFHcm91cFJlc291cmNlLnBhcmVudENhc2VJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhR3JvdXBPYmplY3RbJ3BhcmVudENhc2VJZCddID0gZGF0YUdyb3VwUmVzb3VyY2UucGFyZW50Q2FzZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRhdGFHcm91cE9iamVjdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRhc2sgZGF0YVxuICAgICAqIFBPU1RcbiAgICAgKi9cbiAgICAvLyB7e2Jhc2VVcmx9fS9hcGkvdGFzay86aWQvZGF0YVxuICAgIHB1YmxpYyBzZXREYXRhKHRhc2tJZDogc3RyaW5nLCBib2R5OiBUYXNrU2V0RGF0YVJlcXVlc3RCb2R5KTogT2JzZXJ2YWJsZTxFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlUHJvdmlkZXIucG9zdCQoJ3Rhc2svJyArIHRhc2tJZCArICcvZGF0YScsIHRoaXMuU0VSVkVSX1VSTCwgYm9keSlcbiAgICAgICAgICAgIC5waXBlKG1hcChyID0+IHRoaXMuY2hhbmdlVHlwZShyLCB1bmRlZmluZWQpKSk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLSBGSUxFIC0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIERvd25sb2FkIHRhc2sgZmlsZSBmaWVsZCB2YWx1ZVxuICAgICAqIEdFVFxuICAgICAqL1xuICAgIC8vIHt7YmFzZVVybH19L2FwaS90YXNrLzppZC9maWxlLzpmaWVsZCAgICAgICAgIC0gZm9yIGZpbGUgZmllbGRcbiAgICAvLyB7e2Jhc2VVcmx9fS9hcGkvdGFzay86aWQvZmlsZS86ZmllbGQvOm5hbWUgICAtIGZvciBmaWxlIGxpc3QgZmllbGRcbiAgICBwdWJsaWMgZG93bmxvYWRGaWxlKHRhc2tJZDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMpOiBPYnNlcnZhYmxlPFByb3ZpZGVyUHJvZ3Jlc3MgfCBCbG9iPiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGB0YXNrLyR7dGFza0lkfS9maWxlJHtwYXJhbXM/LmhhcyhcImZpbGVOYW1lXCIpID8gJy9uYW1lZCcgOiAnJ31gO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VQcm92aWRlci5nZXRCbG9iJCh1cmwsIHRoaXMuU0VSVkVSX1VSTCwgcGFyYW1zKS5waXBlKFxuICAgICAgICAgICAgbWFwKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBIdHRwRXZlbnRUeXBlLkRvd25sb2FkUHJvZ3Jlc3M6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VQcm92aWRlci5nZXRQcm9ncmVzcyhldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5SZXNwb25zZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmVudC5ib2R5O1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiAhIXZhbHVlKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBmaWxlIGludG8gdGhlIHRhc2tcbiAgICAgKiBQT1NUXG4gICAgICovXG4gICAgLy8ge3tiYXNlVXJsfX0vYXBpL3Rhc2svOmlkL2ZpbGUvOmZpZWxkICAgICAtIGZvciBmaWxlIGZpZWxkXG4gICAgLy8ge3tiYXNlVXJsfX0vYXBpL3Rhc2svOmlkL2ZpbGVzLzpmaWVsZCAgICAtIGZvciBmaWxlIGxpc3QgZmllbGRcbiAgICBwdWJsaWMgdXBsb2FkRmlsZSh0YXNrSWQ6IHN0cmluZywgYm9keTogb2JqZWN0LCBtdWx0aXBsZUZpbGVzOiBib29sZWFuKTpcbiAgICAgICAgT2JzZXJ2YWJsZTxQcm92aWRlclByb2dyZXNzIHwgRXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlPiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGB0YXNrLyR7dGFza0lkfS8ke211bHRpcGxlRmlsZXMgPyAnZmlsZXMnIDogJ2ZpbGUnfWA7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVByb3ZpZGVyLnBvc3RXaXRoRXZlbnQkPEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZT4odXJsLCB0aGlzLlNFUlZFUl9VUkwsIGJvZHkpLnBpcGUoXG4gICAgICAgICAgICBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3M6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VQcm92aWRlci5nZXRQcm9ncmVzcyhldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5SZXNwb25zZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmVudC5ib2R5O1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiAhIXZhbHVlKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBmaWxlIGZyb20gdGhlIHRhc2tcbiAgICAgKiBERUxFVEVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlRmlsZSh0YXNrSWQ6IHN0cmluZywgYm9keT86IEZpbGVGaWVsZFJlcXVlc3QpOiBPYnNlcnZhYmxlPE1lc3NhZ2VSZXNvdXJjZT4ge1xuICAgICAgICBjb25zdCB1cmwgPSBgdGFzay8ke3Rhc2tJZH0vZmlsZSR7Ym9keT8uZmlsZU5hbWUgPyAnL25hbWVkJyA6ICcnfWA7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVByb3ZpZGVyLmRlbGV0ZSQodXJsLCB0aGlzLlNFUlZFUl9VUkwsIHt9LCB7fSwgJ2pzb24nLCBib2R5KS5waXBlKFxuICAgICAgICAgICAgbWFwKHIgPT4gdGhpcy5jaGFuZ2VUeXBlKHIsIHVuZGVmaW5lZCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG93bmxvYWQgdGFzayBmaWxlIHByZXZpZXcgZm9yIGZpZWxkIHZhbHVlXG4gICAgICogR0VUXG4gICAgICovXG4gICAgLy8ge3tiYXNlVXJsfX0vYXBpL3Rhc2svOmlkL2ZpbGVfcHJldmlldy86ZmllbGRcbiAgICBwdWJsaWMgZG93bmxvYWRGaWxlUHJldmlldyh0YXNrSWQ6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zKTogT2JzZXJ2YWJsZTxQcm92aWRlclByb2dyZXNzIHwgQmxvYj4ge1xuICAgICAgICBjb25zdCB1cmwgPSBgdGFzay8ke3Rhc2tJZH0vZmlsZV9wcmV2aWV3YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlUHJvdmlkZXIuZ2V0QmxvYiQodXJsLCB0aGlzLlNFUlZFUl9VUkwsIHBhcmFtcykucGlwZShcbiAgICAgICAgICAgIG1hcChldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5Eb3dubG9hZFByb2dyZXNzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlUHJvdmlkZXIuZ2V0UHJvZ3Jlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEh0dHBFdmVudFR5cGUuUmVzcG9uc2U6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQuYm9keTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gISF2YWx1ZSlcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=