UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

313 lines 62.5 kB
import { Injectable } from '@angular/core'; import { BooleanField } from '../../data-fields/boolean-field/models/boolean-field'; import { TextField } from '../../data-fields/text-field/models/text-field'; import { NumberField } from '../../data-fields/number-field/models/number-field'; import { EnumerationField } from '../../data-fields/enumeration-field/models/enumeration-field'; import { MultichoiceField } from '../../data-fields/multichoice-field/models/multichoice-field'; import { DateField } from '../../data-fields/date-field/models/date-field'; import { DateTimeField } from '../../data-fields/date-time-field/models/date-time-field'; import { UserField } from '../../data-fields/user-field/models/user-field'; import { ButtonField } from '../../data-fields/button-field/models/button-field'; import { FileField } from '../../data-fields/file-field/models/file-field'; import moment from 'moment'; import { UserValue } from '../../data-fields/user-field/models/user-value'; import { FieldTypeResource } from '../model/field-type-resource'; import { FileListField } from '../../data-fields/file-list-field/models/file-list-field'; import { TextAreaField } from '../../data-fields/text-field/models/text-area-field'; import { TaskRefField } from '../../data-fields/task-ref-field/model/task-ref-field'; import { DynamicEnumerationField } from '../../data-fields/enumeration-field/models/dynamic-enumeration-field'; import { FilterField } from '../../data-fields/filter-field/models/filter-field'; import { I18nField } from '../../data-fields/i18n-field/models/i18n-field'; import { UserListField } from '../../data-fields/user-list-field/models/user-list-field'; import { UserListValue } from '../../data-fields/user-list-field/models/user-list-value'; import { decodeBase64, encodeBase64 } from "../../utility/base64"; import { CaseRefField } from '../../data-fields/case-ref-field/model/case-ref-field'; import { StringCollectionField } from '../../data-fields/string-collection-field/models/string-collection-field'; import * as i0 from "@angular/core"; export class FieldConverterService { textFieldNames = ['richtextarea', 'htmltextarea', 'editor', 'htmlEditor']; constructor() { } toClass(item) { switch (item.type) { case FieldTypeResource.BOOLEAN: return new BooleanField(item.stringId, item.name, item.value, item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); case FieldTypeResource.TEXT: { if (this.textFieldNames?.includes(item.component?.name)) { return new TextAreaField(item.stringId, item.name, this.resolveTextValue(item, item.value), item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); } return new TextField(item.stringId, item.name, this.resolveTextValue(item, item.value), item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); } case FieldTypeResource.NUMBER: return new NumberField(item.stringId, item.name, item.value, item.behavior, item.validations, item.placeholder, item.description, item.layout, item.formatFilter, this.resolveNumberComponent(item), item.parentTaskId); case FieldTypeResource.ENUMERATION: case FieldTypeResource.ENUMERATION_MAP: return this.resolveEnumField(item); case FieldTypeResource.MULTICHOICE: return new MultichoiceField(item.stringId, item.name, item.value, this.resolveMultichoiceChoices(item), item.behavior, item.placeholder, item.description, item.layout, item.type, item.validations, item.component, item.parentTaskId); case FieldTypeResource.MULTICHOICE_MAP: return new MultichoiceField(item.stringId, item.name, item.value, this.resolveMultichoiceOptions(item), item.behavior, item.placeholder, item.description, item.layout, item.type, item.validations, item.component, item.parentTaskId); case FieldTypeResource.DATE: { let date; if (item.value) { date = moment(new Date(item.value[0], item.value[1] - 1, item.value[2])); } return new DateField(item.stringId, item.name, date, item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); } case FieldTypeResource.DATE_TIME: { let dateTime; if (item.value) { dateTime = moment(new Date(item.value[0], item.value[1] - 1, item.value[2], item.value[3], item.value[4])); } return new DateTimeField(item.stringId, item.name, dateTime, item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); } case FieldTypeResource.USER: { let user; if (item.value) { user = new UserValue(item.value.id, item.value.realmId, item.value.firstName, item.value.lastName, item.value.username); } return new UserField(item.stringId, item.name, item.behavior, user, item.roles, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); } case FieldTypeResource.USER_LIST: { let userListValue = new UserListValue(new Map()); if (item.value) { item.value.userValues.forEach(u => userListValue.addUserValue(new UserValue(u.id, u.realmId, u.firstName, u.lastName, u.username))); } return new UserListField(item.stringId, item.name, item.behavior, userListValue, item.roles, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); } case FieldTypeResource.BUTTON: return new ButtonField(item.stringId, item.name, item.behavior, item.value, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); case FieldTypeResource.FILE: return new FileField(item.stringId, item.name, item.behavior, item.value ? item.value : {}, item.placeholder, item.description, item.layout, this.resolveByteSize(item.component?.properties?.maxSize), this.resolveAllowedTypes(item.component?.properties?.allowTypes?.split(",")), item.validations, item.component, item.parentTaskId); case FieldTypeResource.FILE_LIST: return new FileListField(item.stringId, item.name, item.behavior, item.value ? item.value : {}, item.placeholder, item.description, item.layout, item.validations, this.resolveByteSize(item.component?.properties?.maxSize), this.resolveAllowedTypes(item.component?.properties?.allowTypes?.split(",")), item.component, item.parentTaskId); case FieldTypeResource.TASK_REF: return new TaskRefField(item.stringId, item.name, item.value ? item.value : [], item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); case FieldTypeResource.CASE_REF: return new CaseRefField(item.stringId, item.name, item.value ? item.value : [], item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); case FieldTypeResource.FILTER: return new FilterField(item.stringId, item.name, item.value ?? '', item.filterMetadata, item.allowedNets, item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); case FieldTypeResource.I18N: return new I18nField(item.stringId, item.name, item.value ?? { defaultValue: '' }, item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component); case FieldTypeResource.STRING_COLLECTION: return new StringCollectionField(item.stringId, item.name, item.value ? item.value : [], item.behavior, item.placeholder, item.description, item.layout, item.validations, item.component, item.parentTaskId); } } resolveType(item) { if (item instanceof BooleanField) { return FieldTypeResource.BOOLEAN; } else if (item instanceof ButtonField) { return FieldTypeResource.BUTTON; } else if (item instanceof TextField) { return FieldTypeResource.TEXT; } else if (item instanceof NumberField) { return FieldTypeResource.NUMBER; } else if (item instanceof DateField) { return FieldTypeResource.DATE; } else if (item instanceof DateTimeField) { return FieldTypeResource.DATE_TIME; } else if (item instanceof FileField) { return FieldTypeResource.FILE; } else if (item instanceof FileListField) { return FieldTypeResource.FILE_LIST; } else if (item instanceof UserField) { return FieldTypeResource.USER; } else if (item instanceof UserListField) { return FieldTypeResource.USER_LIST; } else if (item instanceof TaskRefField) { return FieldTypeResource.TASK_REF; } else if (item instanceof EnumerationField || item instanceof MultichoiceField) { return item.fieldType; } else if (item instanceof FilterField) { return FieldTypeResource.FILTER; } else if (item instanceof I18nField) { return FieldTypeResource.I18N; } else if (item instanceof CaseRefField) { return FieldTypeResource.CASE_REF; } else if (item instanceof StringCollectionField) { return FieldTypeResource.STRING_COLLECTION; } } formatValueForBackend(field, value) { if (this.resolveType(field) === FieldTypeResource.TEXT && value === null) { return null; } if (this.resolveType(field) === FieldTypeResource.TEXT && field.component && field.component.name === 'password') { return encodeBase64(value); } if (value === null) { return null; } if (value === undefined) { return; } if (this.resolveType(field) === FieldTypeResource.DATE) { if (moment.isMoment(value)) { return value.format('YYYY-MM-DD'); } } if (this.resolveType(field) === FieldTypeResource.USER) { return value.id; } if (this.resolveType(field) === FieldTypeResource.USER_LIST) { return [...value.userValues.keys()]; } if (this.resolveType(field) === FieldTypeResource.DATE_TIME) { if (moment.isMoment(value)) { return value.format('DD.MM.YYYY HH:mm:ss'); } } return value; } resolveNumberComponent(numberField) { let numberComponent = { name: 'default', properties: undefined }; if (numberField.component !== undefined) { numberComponent = { name: numberField.component.name, properties: numberField.component.properties }; } return numberComponent; } /** * Resolves `enumeration` and `eunumeration_map` fields into their appropriate class instances * @param enumField enumeration field resource */ resolveEnumField(enumField) { const options = enumField.type === FieldTypeResource.ENUMERATION ? this.resolveEnumChoices(enumField) : this.resolveEnumOptions(enumField); if (enumField.component && enumField.component.name === 'autocomplete_dynamic') { return new DynamicEnumerationField(enumField.stringId, enumField.name, enumField.value, options, enumField.behavior, enumField.placeholder, enumField.description, enumField.layout, enumField.type, enumField.validations, enumField.component, enumField.parentTaskId); } else { return new EnumerationField(enumField.stringId, enumField.name, enumField.value, options, enumField.behavior, enumField.placeholder, enumField.description, enumField.layout, enumField.type, enumField.validations, enumField.component, enumField.parentTaskId); } } /** * This function is used to parse enumeration options from the `choices` attribute * @param enumField enumeration field resource object who's choices we want to resolve * @returns the options for the enumeration field */ resolveEnumChoices(enumField) { const enumChoices = []; if (enumField.choices instanceof Array) { enumField.choices.forEach(it => { enumChoices.push({ key: it, value: it }); }); } else { Object.keys(enumField.choices).forEach(key => { enumChoices.push({ key, value: enumField.choices[key] }); }); } return enumChoices; } /** * This function is used to parse enumeration options from the `options` attribute * @param enumField enumeration field resource object who's options we want to resolve * @returns the options for the enumeration field */ resolveEnumOptions(enumField) { return Object.entries(enumField.options).map(entry => ({ key: entry[0], value: entry[1] })); } /** * This function is used to parse multichoice options from the `choices` attribute * @param multiField multichoice field resource object who's options we want to resolve * @returns the options for the multichoice field */ resolveMultichoiceChoices(multiField) { const choicesMulti = []; if (multiField.choices instanceof Array) { multiField.choices.forEach(it => { choicesMulti.push({ key: it, value: it }); }); } else { Object.keys(multiField.choices).forEach(key => { choicesMulti.push({ key, value: multiField.choices[key] }); }); } return choicesMulti; } /** * This function is used to parse enumeration options from the `options` attribute * @param multiField multichoice field resource object who's options we want to resolve * @returns the options for the multichoice field */ resolveMultichoiceOptions(multiField) { return Object.entries(multiField.options).map(entry => ({ key: entry[0], value: entry[1] })); } formatValueFromBackend(field, value) { if (value === null) { return null; } if (value === undefined) { return; } if (this.resolveType(field) === FieldTypeResource.TEXT && field.component && field.component.name === 'password') { return decodeBase64(value); } if (this.resolveType(field) === FieldTypeResource.DATE) { return moment(new Date(value[0], value[1] - 1, value[2])); } if (this.resolveType(field) === FieldTypeResource.USER) { return new UserValue(value.id, value.realmId, value.firstName, value.lastName, value.username); } if (this.resolveType(field) === FieldTypeResource.DATE_TIME) { return moment(new Date(value[0], value[1] - 1, value[2], value[3], value[4])); } if (this.resolveType(field) === FieldTypeResource.MULTICHOICE) { const array = []; value.forEach(v => { if (v.defaultValue) { array.push(v.defaultValue); } else { array.push(v); } }); return array; } if (this.resolveType(field) === FieldTypeResource.USER_LIST && !!value) { return new UserListValue(new Map(value.userValues.map(v => [v.id, v]))); } return value; } resolveTextValue(field, value) { if (field.component !== undefined && field.component.name === 'password' && value !== '' && value !== undefined) { return decodeBase64(value); } return value; } resolveAllowedTypes(allowTypes) { return allowTypes?.length > 0 ? (allowTypes.length > 1 ? allowTypes : allowTypes[0]) : null; } resolveByteSize(bytesSize) { return bytesSize !== undefined ? bytesSize : null; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FieldConverterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FieldConverterService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FieldConverterService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtY29udmVydGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3Rhc2stY29udGVudC9zZXJ2aWNlcy9maWVsZC1jb252ZXJ0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3pDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUNsRixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFDekUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQy9FLE9BQU8sRUFBQyxnQkFBZ0IsRUFBd0IsTUFBTSw4REFBOEQsQ0FBQztBQUNySCxPQUFPLEVBQUMsZ0JBQWdCLEVBQXdCLE1BQU0sOERBQThELENBQUM7QUFDckgsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUN2RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFDekUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQy9FLE9BQU8sRUFBQyxTQUFTLEVBQXFCLE1BQU0sZ0RBQWdELENBQUM7QUFDN0YsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDdkYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBRWxGLE9B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Q3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RGF0YUZpZWxkUmVzb3VyY2V9IGZyb20gJy4uL21vZGVsL3Jlc291cmNlLWludGVyZmFjZSc7XG5pbXBvcnQge0RhdGFGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvbW9kZWxzL2Fic3RyYWN0LWRhdGEtZmllbGQnO1xuaW1wb3J0IHtCb29sZWFuRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2Jvb2xlYW4tZmllbGQvbW9kZWxzL2Jvb2xlYW4tZmllbGQnO1xuaW1wb3J0IHtUZXh0RmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3RleHQtZmllbGQvbW9kZWxzL3RleHQtZmllbGQnO1xuaW1wb3J0IHtOdW1iZXJGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvbnVtYmVyLWZpZWxkL21vZGVscy9udW1iZXItZmllbGQnO1xuaW1wb3J0IHtFbnVtZXJhdGlvbkZpZWxkLCBFbnVtZXJhdGlvbkZpZWxkVmFsdWV9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2VudW1lcmF0aW9uLWZpZWxkL21vZGVscy9lbnVtZXJhdGlvbi1maWVsZCc7XG5pbXBvcnQge011bHRpY2hvaWNlRmllbGQsIE11bHRpY2hvaWNlRmllbGRWYWx1ZX0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvbXVsdGljaG9pY2UtZmllbGQvbW9kZWxzL211bHRpY2hvaWNlLWZpZWxkJztcbmltcG9ydCB7RGF0ZUZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9kYXRlLWZpZWxkL21vZGVscy9kYXRlLWZpZWxkJztcbmltcG9ydCB7RGF0ZVRpbWVGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvZGF0ZS10aW1lLWZpZWxkL21vZGVscy9kYXRlLXRpbWUtZmllbGQnO1xuaW1wb3J0IHtVc2VyRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3VzZXItZmllbGQvbW9kZWxzL3VzZXItZmllbGQnO1xuaW1wb3J0IHtCdXR0b25GaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvYnV0dG9uLWZpZWxkL21vZGVscy9idXR0b24tZmllbGQnO1xuaW1wb3J0IHtGaWxlRmllbGQsIEZpbGVVcGxvYWRNSU1FVHlwZX0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvZmlsZS1maWVsZC9tb2RlbHMvZmlsZS1maWVsZCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge1VzZXJWYWx1ZX0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvdXNlci1maWVsZC9tb2RlbHMvdXNlci12YWx1ZSc7XG5pbXBvcnQge0ZpZWxkVHlwZVJlc291cmNlfSBmcm9tICcuLi9tb2RlbC9maWVsZC10eXBlLXJlc291cmNlJztcbmltcG9ydCB7RmlsZUxpc3RGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvZmlsZS1saXN0LWZpZWxkL21vZGVscy9maWxlLWxpc3QtZmllbGQnO1xuaW1wb3J0IHtUZXh0QXJlYUZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy90ZXh0LWZpZWxkL21vZGVscy90ZXh0LWFyZWEtZmllbGQnO1xuaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL21vZGVscy9jb21wb25lbnQnO1xuaW1wb3J0IHtUYXNrUmVmRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWZpZWxkJztcbmltcG9ydCB7RHluYW1pY0VudW1lcmF0aW9uRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2VudW1lcmF0aW9uLWZpZWxkL21vZGVscy9keW5hbWljLWVudW1lcmF0aW9uLWZpZWxkJztcbmltcG9ydCB7RmlsdGVyRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2ZpbHRlci1maWVsZC9tb2RlbHMvZmlsdGVyLWZpZWxkJztcbmltcG9ydCB7STE4bkZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9pMThuLWZpZWxkL21vZGVscy9pMThuLWZpZWxkJztcbmltcG9ydCB7VXNlckxpc3RGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvdXNlci1saXN0LWZpZWxkL21vZGVscy91c2VyLWxpc3QtZmllbGQnO1xuaW1wb3J0IHtVc2VyTGlzdFZhbHVlfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy91c2VyLWxpc3QtZmllbGQvbW9kZWxzL3VzZXItbGlzdC12YWx1ZSc7XG5pbXBvcnQge2RlY29kZUJhc2U2NCwgZW5jb2RlQmFzZTY0fSBmcm9tIFwiLi4vLi4vdXRpbGl0eS9iYXNlNjRcIjtcbmltcG9ydCB7Q2FzZVJlZkZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9jYXNlLXJlZi1maWVsZC9tb2RlbC9jYXNlLXJlZi1maWVsZCc7XG5pbXBvcnQge1N0cmluZ0NvbGxlY3Rpb25GaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvc3RyaW5nLWNvbGxlY3Rpb24tZmllbGQvbW9kZWxzL3N0cmluZy1jb2xsZWN0aW9uLWZpZWxkJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBGaWVsZENvbnZlcnRlclNlcnZpY2Uge1xuICAgIHByaXZhdGUgdGV4dEZpZWxkTmFtZXMgPSBbICdyaWNodGV4dGFyZWEnLCAnaHRtbHRleHRhcmVhJywgJ2VkaXRvcicsICdodG1sRWRpdG9yJyBdXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9DbGFzcyhpdGVtOiBEYXRhRmllbGRSZXNvdXJjZSk6IERhdGFGaWVsZDxhbnk+IHtcbiAgICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuQk9PTEVBTjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW5GaWVsZChpdGVtLnN0cmluZ0lkLCBpdGVtLm5hbWUsIGl0ZW0udmFsdWUgYXMgYm9vbGVhbiwgaXRlbS5iZWhhdmlvcixcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5wbGFjZWhvbGRlciwgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLlRFWFQ6IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50ZXh0RmllbGROYW1lcz8uaW5jbHVkZXMoaXRlbS5jb21wb25lbnQ/Lm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dEFyZWFGaWVsZChpdGVtLnN0cmluZ0lkLCBpdGVtLm5hbWUsIHRoaXMucmVzb2x2ZVRleHRWYWx1ZShpdGVtLCBpdGVtLnZhbHVlKSwgaXRlbS5iZWhhdmlvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucGxhY2Vob2xkZXIsIGl0ZW0uZGVzY3JpcHRpb24sIGl0ZW0ubGF5b3V0LCBpdGVtLnZhbGlkYXRpb25zLCBpdGVtLmNvbXBvbmVudCwgaXRlbS5wYXJlbnRUYXNrSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRleHRGaWVsZChpdGVtLnN0cmluZ0lkLCBpdGVtLm5hbWUsIHRoaXMucmVzb2x2ZVRleHRWYWx1ZShpdGVtLCBpdGVtLnZhbHVlKSwgaXRlbS5iZWhhdmlvciwgaXRlbS5wbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLk5VTUJFUjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE51bWJlckZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgaXRlbS52YWx1ZSBhcyBudW1iZXIsIGl0ZW0uYmVoYXZpb3IsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0ucGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZGVzY3JpcHRpb24sIGl0ZW0ubGF5b3V0LCBpdGVtLmZvcm1hdEZpbHRlciwgdGhpcy5yZXNvbHZlTnVtYmVyQ29tcG9uZW50KGl0ZW0pLCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLkVOVU1FUkFUSU9OOlxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVSZXNvdXJjZS5FTlVNRVJBVElPTl9NQVA6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUVudW1GaWVsZChpdGVtKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuTVVMVElDSE9JQ0U6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aWNob2ljZUZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgaXRlbS52YWx1ZSwgdGhpcy5yZXNvbHZlTXVsdGljaG9pY2VDaG9pY2VzKGl0ZW0pLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLmJlaGF2aW9yLCBpdGVtLnBsYWNlaG9sZGVyLCBpdGVtLmRlc2NyaXB0aW9uLCBpdGVtLmxheW91dCwgaXRlbS50eXBlLCBpdGVtLnZhbGlkYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbXBvbmVudCwgaXRlbS5wYXJlbnRUYXNrSWQpO1xuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVSZXNvdXJjZS5NVUxUSUNIT0lDRV9NQVA6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aWNob2ljZUZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgaXRlbS52YWx1ZSwgdGhpcy5yZXNvbHZlTXVsdGljaG9pY2VPcHRpb25zKGl0ZW0pLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLmJlaGF2aW9yLCBpdGVtLnBsYWNlaG9sZGVyLCBpdGVtLmRlc2NyaXB0aW9uLCBpdGVtLmxheW91dCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbS50eXBlLCBpdGVtLnZhbGlkYXRpb25zLCBpdGVtLmNvbXBvbmVudCwgaXRlbS5wYXJlbnRUYXNrSWQpO1xuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVSZXNvdXJjZS5EQVRFOiB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGU7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IG1vbWVudChuZXcgRGF0ZShpdGVtLnZhbHVlWzBdLCBpdGVtLnZhbHVlWzFdIC0gMSwgaXRlbS52YWx1ZVsyXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGVGaWVsZChpdGVtLnN0cmluZ0lkLCBpdGVtLm5hbWUsIGRhdGUsIGl0ZW0uYmVoYXZpb3IsIGl0ZW0ucGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZGVzY3JpcHRpb24sIGl0ZW0ubGF5b3V0LCBpdGVtLnZhbGlkYXRpb25zLCBpdGVtLmNvbXBvbmVudCwgaXRlbS5wYXJlbnRUYXNrSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVSZXNvdXJjZS5EQVRFX1RJTUU6IHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0ZVRpbWU7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZVRpbWUgPSBtb21lbnQobmV3IERhdGUoaXRlbS52YWx1ZVswXSwgaXRlbS52YWx1ZVsxXSAtIDEsIGl0ZW0udmFsdWVbMl0sIGl0ZW0udmFsdWVbM10sIGl0ZW0udmFsdWVbNF0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZUZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgZGF0ZVRpbWUsIGl0ZW0uYmVoYXZpb3IsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucGxhY2Vob2xkZXIsIGl0ZW0uZGVzY3JpcHRpb24sIGl0ZW0ubGF5b3V0LCBpdGVtLnZhbGlkYXRpb25zLCBpdGVtLmNvbXBvbmVudCwgaXRlbS5wYXJlbnRUYXNrSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVSZXNvdXJjZS5VU0VSOiB7XG4gICAgICAgICAgICAgICAgbGV0IHVzZXI7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlciA9IG5ldyBVc2VyVmFsdWUoaXRlbS52YWx1ZS5pZCwgaXRlbS52YWx1ZS5yZWFsbUlkLCBpdGVtLnZhbHVlLmZpcnN0TmFtZSwgaXRlbS52YWx1ZS5sYXN0TmFtZSwgaXRlbS52YWx1ZS51c2VybmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVXNlckZpZWxkKGl0ZW0uc3RyaW5nSWQsIGl0ZW0ubmFtZSwgaXRlbS5iZWhhdmlvciwgdXNlcixcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5yb2xlcywgaXRlbS5wbGFjZWhvbGRlciwgaXRlbS5kZXNjcmlwdGlvbiwgaXRlbS5sYXlvdXQsIGl0ZW0udmFsaWRhdGlvbnMsIGl0ZW0uY29tcG9uZW50LCBpdGVtLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZVJlc291cmNlLlVTRVJfTElTVDoge1xuICAgICAgICAgICAgICAgIGxldCB1c2VyTGlzdFZhbHVlID0gbmV3IFVzZXJMaXN0VmFsdWUobmV3IE1hcDxzdHJpbmcsIFVzZXJWYWx1ZT4oKSk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS52YWx1ZS51c2VyVmFsdWVzLmZvckVhY2godSA9PiB1c2VyTGlzdFZhbHVlLmFkZFVzZXJWYWx1ZShuZXcgVXNlclZhbHVlKHUuaWQsIHUucmVhbG1JZCwgdS5maXJzdE5hbWUsIHUubGFzdE5hbWUsIHUudXNlcm5hbWUpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVXNlckxpc3RGaWVsZChpdGVtLnN0cmluZ0lkLCBpdGVtLm5hbWUsIGl0ZW0uYmVoYXZpb3IsIHVzZXJMaXN0VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucm9sZXMsIGl0ZW0ucGxhY2Vob2xkZXIsIGl0ZW0uZGVzY3JpcHRpb24sIGl0ZW0ubGF5b3V0LCBpdGVtLnZhbGlkYXRpb25zLCBpdGVtLmNvbXBvbmVudCwgaXRlbS5wYXJlbnRUYXNrSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVSZXNvdXJjZS5CVVRUT046XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdXR0b25GaWVsZChpdGVtLnN0cmluZ0lkLCBpdGVtLm5hbWUsIGl0ZW0uYmVoYXZpb3IsIGl0ZW0udmFsdWUgYXMgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnBsYWNlaG9sZGVyLCBpdGVtLmRlc2NyaXB0aW9uLCBpdGVtLmxheW91dCwgaXRlbS52YWxpZGF0aW9ucywgaXRlbS5jb21wb25lbnQsIGl0ZW0ucGFyZW50VGFza0lkKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuRklMRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVGaWVsZChpdGVtLnN0cmluZ0lkLCBpdGVtLm5hbWUsIGl0ZW0uYmVoYXZpb3IsIGl0ZW0udmFsdWUgPyBpdGVtLnZhbHVlIDoge30sXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucGxhY2Vob2xkZXIsIGl0ZW0uZGVzY3JpcHRpb24sIGl0ZW0ubGF5b3V0LCB0aGlzLnJlc29sdmVCeXRlU2l6ZShpdGVtLmNvbXBvbmVudD8ucHJvcGVydGllcz8ubWF4U2l6ZSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZUFsbG93ZWRUeXBlcyhpdGVtLmNvbXBvbmVudD8ucHJvcGVydGllcz8uYWxsb3dUeXBlcz8uc3BsaXQoXCIsXCIpKSwgaXRlbS52YWxpZGF0aW9ucywgaXRlbS5jb21wb25lbnQsIGl0ZW0ucGFyZW50VGFza0lkKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuRklMRV9MSVNUOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUxpc3RGaWVsZChpdGVtLnN0cmluZ0lkLCBpdGVtLm5hbWUsIGl0ZW0uYmVoYXZpb3IsIGl0ZW0udmFsdWUgPyBpdGVtLnZhbHVlIDoge30sXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucGxhY2Vob2xkZXIsIGl0ZW0uZGVzY3JpcHRpb24sIGl0ZW0ubGF5b3V0LCBpdGVtLnZhbGlkYXRpb25zLCB0aGlzLnJlc29sdmVCeXRlU2l6ZShpdGVtLmNvbXBvbmVudD8ucHJvcGVydGllcz8ubWF4U2l6ZSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZUFsbG93ZWRUeXBlcyhpdGVtLmNvbXBvbmVudD8ucHJvcGVydGllcz8uYWxsb3dUeXBlcz8uc3BsaXQoXCIsXCIpKSwgaXRlbS5jb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucGFyZW50VGFza0lkKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuVEFTS19SRUY6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYXNrUmVmRmllbGQoaXRlbS5zdHJpbmdJZCwgaXRlbS5uYW1lLCBpdGVtLnZhbHVlID8gaXRlbS52YWx1ZSA6IFtdLCBpdGVtLmJlaGF2aW9yLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnBsYWNlaG9sZGVyLCBpdGVtLmRlc2NyaXB0aW9uLCBpdGVtLmxheW91dCwgaXRlbS52YWxpZGF0aW9ucywgaXRlbS5jb21wb25lbnQsIGl0ZW0ucGFyZW50VGFza0lkKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuQ0FTRV9SRUY6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXNlUmVmRmllbGQoaXRlbS5zdHJpbmdJZCwgaXRlbS5uYW1lLCBpdGVtLnZhbHVlID8gaXRlbS52YWx1ZSA6IFtdLCBpdGVtLmJlaGF2aW9yLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnBsYWNlaG9sZGVyLCBpdGVtLmRlc2NyaXB0aW9uLCBpdGVtLmxheW91dCwgaXRlbS52YWxpZGF0aW9ucywgaXRlbS5jb21wb25lbnQsIGl0ZW0ucGFyZW50VGFza0lkKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuRklMVEVSOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsdGVyRmllbGQoaXRlbS5zdHJpbmdJZCwgaXRlbS5uYW1lLCBpdGVtLnZhbHVlID8/ICcnLCBpdGVtLmZpbHRlck1ldGFkYXRhLCBpdGVtLmFsbG93ZWROZXRzLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLmJlaGF2aW9yLCBpdGVtLnBsYWNlaG9sZGVyLCBpdGVtLmRlc2NyaXB0aW9uLCBpdGVtLmxheW91dCwgaXRlbS52YWxpZGF0aW9ucywgaXRlbS5jb21wb25lbnQsIGl0ZW0ucGFyZW50VGFza0lkKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlUmVzb3VyY2UuSTE4TjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEkxOG5GaWVsZChpdGVtLnN0cmluZ0lkLCBpdGVtLm5hbWUsIGl0ZW0udmFsdWUgPz8ge2RlZmF1bHRWYWx1ZTogJyd9LCBpdGVtLmJlaGF2aW9yLCBpdGVtLnBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgICBpdGVtLmRlc2NyaXB0aW9uLCBpdGVtLmxheW91dCwgaXRlbS52YWxpZGF0aW9ucywgaXRlbS5jb21wb25lbnQpO1xuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVSZXNvdXJjZS5TVFJJTkdfQ09MTEVDVElPTjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0NvbGxlY3Rpb25GaWVsZChpdGVtLnN0cmlu