UNPKG

@skireal/form-builder

Version:
133 lines 20.6 kB
import { __decorate } from "tslib"; import { Injectable } from '@angular/core'; import { FormArray, FormBuilder, FormControl, FormGroup } from '@angular/forms'; import { booleanFields, controlsMap, defaultValuesMap, fieldsByType } from '../constants/ui-constants'; import { BehaviorSubject } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; let UiFormService = class UiFormService { constructor(fb) { this.fb = fb; this.fieldsToCreate = []; this.fieldsToCreateSubject = new BehaviorSubject(this.fieldsToCreate); } createFormGroup(addedFields) { const formGroupConfig = this.generateFormGroupConfig(addedFields); return this.fb.group(formGroupConfig); } generateFormGroupConfig(addedFields) { const formGroupConfig = {}; for (const field of addedFields) { formGroupConfig[field.id] = this.createControlForField(field); } return formGroupConfig; } createControlForField(field) { if (field.isArray) { return this.createFormArray(); } else if (field.isObject && field.objectFields) { return this.createFormGroupForObject(field.objectFields); } else { return this.createControl(field.defaultValue); } } createFormGroupForObject(objectFields) { const formGroupConfig = {}; for (const field of objectFields) { formGroupConfig[field.id] = this.createControlForField(field); } return this.fb.group(formGroupConfig); } createControl(defaultValue = '') { return this.fb.control(defaultValue); } createFormArray() { return this.fb.array([]); } addControlToFormArray(formArray, arrayName, nestedArrayConfig) { const newGroup = this.createGroupForArray(arrayName, nestedArrayConfig); formArray.push(newGroup); } removeControlFromFormArray(formArray, index) { formArray.removeAt(index); } createGroupForArray(arrayName, nestedArrayConfig) { const group = this.fb.group({}); const controlFields = controlsMap[arrayName] || []; if (controlFields) { controlFields.forEach((fieldName) => { var _a; if (nestedArrayConfig && fieldName in nestedArrayConfig) { group.addControl(fieldName, nestedArrayConfig[fieldName]); } else { const defaultValue = ((_a = defaultValuesMap[arrayName]) === null || _a === void 0 ? void 0 : _a[fieldName]) || ''; group.addControl(fieldName, this.createControl(defaultValue)); } }); } else { console.log(`Invalid controlName: ${arrayName}`); } return group; } saveFieldProperties(form, fieldType) { var _a, _b; const fieldOptions = Object.assign(Object.assign({}, form.value), { validators: (_a = form.value.validators) === null || _a === void 0 ? void 0 : _a.filter((validator) => Object.values(validator).some((property) => property !== '')), type: fieldType, id: this.generateUniqueId().toString(), options: (_b = form.value.options) === null || _b === void 0 ? void 0 : _b.map((option) => (Object.assign(Object.assign({}, option), { id: this.generateUniqueId().toString() }))) }); booleanFields.forEach((field) => { if (typeof fieldOptions[field] !== 'boolean') { fieldOptions[field] = false; } }); if (fieldType === 'nps' && form.value.comment) { const isCommentEmpty = Object.values(fieldOptions.comment || {}).every((value) => value === '' || value === null || value === undefined); if (!isCommentEmpty) { fieldOptions.comment = Object.assign(Object.assign({}, fieldOptions.comment), { commentId: this.generateUniqueId().toString() }); } } if (fieldType === 'qe' && form.value.qeScales) { fieldOptions.qeScales = form.value.qeScales.map((scale) => { var _a; return (Object.assign(Object.assign({}, scale), { id: this.generateUniqueId().toString(), qeScaleChildren: (_a = scale.qeScaleChildren) === null || _a === void 0 ? void 0 : _a.map((child) => (Object.assign(Object.assign({}, child), { id: this.generateUniqueId().toString() }))) })); }); } if (fieldType === 'likert' && form.value.rows) { fieldOptions.rows = form.value.rows.map((row) => (Object.assign(Object.assign({}, row), { id: this.generateUniqueId().toString() }))); } return fieldOptions; } generateUniqueId() { return Math.floor(Math.random() * 100000000).toString(); } setFieldsToCreate(fieldType) { this.fieldsToCreate = fieldsByType[fieldType]; this.fieldsToCreateSubject.next(this.fieldsToCreate); } getFieldsToCreate() { return this.fieldsToCreateSubject.asObservable(); } getRequiredFields(fieldType) { const baseFields = ['title', 'analyticsTitle']; const typeSpecificFields = { select: ['options'], 'checkbox-group': ['options'], radio: ['options'], likert: ['options', 'rows'], qe: ['qeScales'] }; return [...baseFields, ...(typeSpecificFields[fieldType] || [])]; } }; UiFormService.ctorParameters = () => [ { type: FormBuilder } ]; UiFormService.ɵprov = i0.ɵɵdefineInjectable({ factory: function UiFormService_Factory() { return new UiFormService(i0.ɵɵinject(i1.FormBuilder)); }, token: UiFormService, providedIn: "root" }); UiFormService = __decorate([ Injectable({ providedIn: 'root' }) ], UiFormService); export { UiFormService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZm9ybS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNraXJlYWwvZm9ybS1idWlsZGVyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3VpLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFTaEYsT0FBTyxFQUVMLGFBQWEsRUFDYixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDYixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7OztBQUtuRCxJQUFhLGFBQWEsR0FBMUIsTUFBYSxhQUFhO0lBSXhCLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBSDNCLG1CQUFjLEdBQWdCLEVBQUUsQ0FBQztRQUNqQywwQkFBcUIsR0FBRyxJQUFJLGVBQWUsQ0FBYyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFaEQsQ0FBQztJQUV2QyxlQUFlLENBQUMsV0FBd0I7UUFDdEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELHVCQUF1QixDQUNyQixXQUF3QjtRQUV4QixNQUFNLGVBQWUsR0FBd0QsRUFBRSxDQUFDO1FBRWhGLEtBQUssTUFBTSxLQUFLLElBQUksV0FBVyxFQUFFO1lBQy9CLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsT0FBTyxlQUFlLENBQUM7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bkQsQ0FBQztJQUVELGlCQUFpQixDQUFDLFNBQWlCO1FBQ2pDLE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDL0MsTUFBTSxrQkFBa0IsR0FBNkI7WUFDbkQsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ25CLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUFDO1lBQzdCLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUNsQixNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDO1lBQzNCLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQztTQUNqQixDQUFDO1FBRUYsT0FBTyxDQUFDLEdBQUcsVUFBVSxFQUFFLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7Q0FDRixDQUFBOztZQW5LeUIsV0FBVzs7O0FBSnhCLGFBQWE7SUFIekIsVUFBVSxDQUFDO1FBQ1YsVUFBVSxFQUFFLE1BQU07S0FDbkIsQ0FBQztHQUNXLGFBQWEsQ0F1S3pCO1NBdktZLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgRm9ybUZpZWxkLFxuICBWYWxpZGF0b3IsXG4gIE9wdGlvbixcbiAgUWVTY2FsZSxcbiAgUWVTY2FsZUNoaWxkLFxuICBSb3dcbn0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0tY29uc3RydWN0b3IubW9kZWwnO1xuaW1wb3J0IHtcbiAgRm9ybUZpZWxkVHlwZSxcbiAgYm9vbGVhbkZpZWxkcyxcbiAgY29udHJvbHNNYXAsXG4gIGRlZmF1bHRWYWx1ZXNNYXAsXG4gIGZpZWxkc0J5VHlwZVxufSBmcm9tICcuLi9jb25zdGFudHMvdWktY29uc3RhbnRzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBVaUZvcm1TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBmaWVsZHNUb0NyZWF0ZTogRm9ybUZpZWxkW10gPSBbXTtcbiAgcHJpdmF0ZSBmaWVsZHNUb0NyZWF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZvcm1GaWVsZFtdPih0aGlzLmZpZWxkc1RvQ3JlYXRlKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge31cblxuICBjcmVhdGVGb3JtR3JvdXAoYWRkZWRGaWVsZHM6IEZvcm1GaWVsZFtdKTogRm9ybUdyb3VwIHtcbiAgICBjb25zdCBmb3JtR3JvdXBDb25maWcgPSB0aGlzLmdlbmVyYXRlRm9ybUdyb3VwQ29uZmlnKGFkZGVkRmllbGRzKTtcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cChmb3JtR3JvdXBDb25maWcpO1xuICB9XG5cbiAgZ2VuZXJhdGVGb3JtR3JvdXBDb25maWcoXG4gICAgYWRkZWRGaWVsZHM6IEZvcm1GaWVsZFtdXG4gICk6IFJlY29yZDxzdHJpbmcsIEZvcm1Hcm91cCB8IEZvcm1BcnJheSB8IEZvcm1Db250cm9sPiB7XG4gICAgY29uc3QgZm9ybUdyb3VwQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBGb3JtR3JvdXAgfCBGb3JtQXJyYXkgfCBGb3JtQ29udHJvbD4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgYWRkZWRGaWVsZHMpIHtcbiAgICAgIGZvcm1Hcm91cENvbmZpZ1tmaWVsZC5pZF0gPSB0aGlzLmNyZWF0ZUNvbnRyb2xGb3JGaWVsZChmaWVsZCk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtR3JvdXBDb25maWc7XG4gIH1cblxuICBjcmVhdGVDb250cm9sRm9yRmllbGQoZmllbGQ6IEZvcm1GaWVsZCk6IEZvcm1Hcm91cCB8IEZvcm1BcnJheSB8IEZvcm1Db250cm9sIHtcbiAgICBpZiAoZmllbGQuaXNBcnJheSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRm9ybUFycmF5KCk7XG4gICAgfSBlbHNlIGlmIChmaWVsZC5pc09iamVjdCAmJiBmaWVsZC5vYmplY3RGaWVsZHMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUZvcm1Hcm91cEZvck9iamVjdChmaWVsZC5vYmplY3RGaWVsZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVDb250cm9sKGZpZWxkLmRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlRm9ybUdyb3VwRm9yT2JqZWN0KG9iamVjdEZpZWxkczogRm9ybUZpZWxkW10pOiBGb3JtR3JvdXAge1xuICAgIGNvbnN0IGZvcm1Hcm91cENvbmZpZzogUmVjb3JkPHN0cmluZywgRm9ybUdyb3VwIHwgRm9ybUFycmF5IHwgRm9ybUNvbnRyb2w+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIG9iamVjdEZpZWxkcykge1xuICAgICAgZm9ybUdyb3VwQ29uZmlnW2ZpZWxkLmlkXSA9IHRoaXMuY3JlYXRlQ29udHJvbEZvckZpZWxkKGZpZWxkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cChmb3JtR3JvdXBDb25maWcpO1xuICB9XG5cbiAgY3JlYXRlQ29udHJvbChkZWZhdWx0VmFsdWU6IHN0cmluZyA9ICcnKTogRm9ybUNvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLmZiLmNvbnRyb2woZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIGNyZWF0ZUZvcm1BcnJheSgpOiBGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmZiLmFycmF5KFtdKTtcbiAgfVxuXG4gIGFkZENvbnRyb2xUb0Zvcm1BcnJheShcbiAgICBmb3JtQXJyYXk6IEZvcm1BcnJheSxcbiAgICBhcnJheU5hbWU6IHN0cmluZyxcbiAgICBuZXN0ZWRBcnJheUNvbmZpZz86IFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sIHwgRm9ybUdyb3VwIHwgRm9ybUFycmF5IHwgc3RyaW5nPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuZXdHcm91cCA9IHRoaXMuY3JlYXRlR3JvdXBGb3JBcnJheShcbiAgICAgIGFycmF5TmFtZSxcbiAgICAgIG5lc3RlZEFycmF5Q29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sIHwgRm9ybUdyb3VwIHwgRm9ybUFycmF5IHwgc3RyaW5nPlxuICAgICk7XG4gICAgZm9ybUFycmF5LnB1c2gobmV3R3JvdXApO1xuICB9XG5cbiAgcmVtb3ZlQ29udHJvbEZyb21Gb3JtQXJyYXkoZm9ybUFycmF5OiBGb3JtQXJyYXksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgY3JlYXRlR3JvdXBGb3JBcnJheShcbiAgICBhcnJheU5hbWU6IHN0cmluZyxcbiAgICBuZXN0ZWRBcnJheUNvbmZpZz86IFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sIHwgRm9ybUdyb3VwIHwgRm9ybUFycmF5IHwgc3RyaW5nPlxuICApOiBGb3JtR3JvdXAge1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgY29uc3QgY29udHJvbEZpZWxkcyA9IGNvbnRyb2xzTWFwW2FycmF5TmFtZV0gfHwgW107XG4gICAgaWYgKGNvbnRyb2xGaWVsZHMpIHtcbiAgICAgIGNvbnRyb2xGaWVsZHMuZm9yRWFjaCgoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKG5lc3RlZEFycmF5Q29uZmlnICYmIGZpZWxkTmFtZSBpbiBuZXN0ZWRBcnJheUNvbmZpZykge1xuICAgICAgICAgIGdyb3VwLmFkZENvbnRyb2woZmllbGROYW1lLCBuZXN0ZWRBcnJheUNvbmZpZ1tmaWVsZE5hbWVdIGFzIEZvcm1Hcm91cCB8IEZvcm1BcnJheSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlc01hcFthcnJheU5hbWVdPy5bZmllbGROYW1lXSB8fCAnJztcbiAgICAgICAgICBncm91cC5hZGRDb250cm9sKGZpZWxkTmFtZSwgdGhpcy5jcmVhdGVDb250cm9sKGRlZmF1bHRWYWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coYEludmFsaWQgY29udHJvbE5hbWU6ICR7YXJyYXlOYW1lfWApO1xuICAgIH1cblxuICAgIHJldHVybiBncm91cDtcbiAgfVxuXG4gIHNhdmVGaWVsZFByb3BlcnRpZXMoZm9ybTogRm9ybUdyb3VwLCBmaWVsZFR5cGU6IHN0cmluZyk6IEZvcm1GaWVsZCB7XG4gICAgY29uc3QgZmllbGRPcHRpb25zOiBGb3JtRmllbGQgPSB7XG4gICAgICAuLi5mb3JtLnZhbHVlLFxuICAgICAgdmFsaWRhdG9yczogZm9ybS52YWx1ZS52YWxpZGF0b3JzPy5maWx0ZXIoKHZhbGlkYXRvcjogVmFsaWRhdG9yKSA9PlxuICAgICAgICBPYmplY3QudmFsdWVzKHZhbGlkYXRvcikuc29tZSgocHJvcGVydHkpID0+IHByb3BlcnR5ICE9PSAnJylcbiAgICAgICksXG4gICAgICB0eXBlOiBmaWVsZFR5cGUsXG4gICAgICBpZDogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCkudG9TdHJpbmcoKSxcbiAgICAgIG9wdGlvbnM6IGZvcm0udmFsdWUub3B0aW9ucz8ubWFwKChvcHRpb246IE9wdGlvbikgPT4gKHtcbiAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICBpZDogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCkudG9TdHJpbmcoKVxuICAgICAgfSkpXG4gICAgfTtcblxuICAgIGJvb2xlYW5GaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZmllbGRPcHRpb25zW2ZpZWxkXSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGZpZWxkT3B0aW9uc1tmaWVsZF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChmaWVsZFR5cGUgPT09ICducHMnICYmIGZvcm0udmFsdWUuY29tbWVudCkge1xuICAgICAgY29uc3QgaXNDb21tZW50RW1wdHkgPSBPYmplY3QudmFsdWVzKGZpZWxkT3B0aW9ucy5jb21tZW50IHx8IHt9KS5ldmVyeShcbiAgICAgICAgKHZhbHVlKSA9PiB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgKTtcblxuICAgICAgaWYgKCFpc0NvbW1lbnRFbXB0eSkge1xuICAgICAgICBmaWVsZE9wdGlvbnMuY29tbWVudCA9IHtcbiAgICAgICAgICAuLi5maWVsZE9wdGlvbnMuY29tbWVudCxcbiAgICAgICAgICBjb21tZW50SWQ6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgpLnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmllbGRUeXBlID09PSAncWUnICYmIGZvcm0udmFsdWUucWVTY2FsZXMpIHtcbiAgICAgIGZpZWxkT3B0aW9ucy5xZVNjYWxlcyA9IGZvcm0udmFsdWUucWVTY2FsZXMubWFwKChzY2FsZTogUWVTY2FsZSkgPT4gKHtcbiAgICAgICAgLi4uc2NhbGUsXG4gICAgICAgIGlkOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoKS50b1N0cmluZygpLFxuICAgICAgICBxZVNjYWxlQ2hpbGRyZW46IHNjYWxlLnFlU2NhbGVDaGlsZHJlbj8ubWFwKChjaGlsZDogUWVTY2FsZUNoaWxkKSA9PiAoe1xuICAgICAgICAgIC4uLmNoaWxkLFxuICAgICAgICAgIGlkOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoKS50b1N0cmluZygpXG4gICAgICAgIH0pKVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGlmIChmaWVsZFR5cGUgPT09ICdsaWtlcnQnICYmIGZvcm0udmFsdWUucm93cykge1xuICAgICAgZmllbGRPcHRpb25zLnJvd3MgPSBmb3JtLnZhbHVlLnJvd3MubWFwKChyb3c6IFJvdykgPT4gKHtcbiAgICAgICAgLi4ucm93LFxuICAgICAgICBpZDogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCkudG9TdHJpbmcoKVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZE9wdGlvbnM7XG4gIH1cblxuICBnZW5lcmF0ZVVuaXF1ZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMCkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldEZpZWxkc1RvQ3JlYXRlKGZpZWxkVHlwZTogRm9ybUZpZWxkVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuZmllbGRzVG9DcmVhdGUgPSBmaWVsZHNCeVR5cGVbZmllbGRUeXBlXTtcbiAgICB0aGlzLmZpZWxkc1RvQ3JlYXRlU3ViamVjdC5uZXh0KHRoaXMuZmllbGRzVG9DcmVhdGUpO1xuICB9XG5cbiAgZ2V0RmllbGRzVG9DcmVhdGUoKTogT2JzZXJ2YWJsZTxGb3JtRmllbGRbXT4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkc1RvQ3JlYXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFJlcXVpcmVkRmllbGRzKGZpZWxkVHlwZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGJhc2VGaWVsZHMgPSBbJ3RpdGxlJywgJ2FuYWx5dGljc1RpdGxlJ107XG4gICAgY29uc3QgdHlwZVNwZWNpZmljRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7XG4gICAgICBzZWxlY3Q6IFsnb3B0aW9ucyddLFxuICAgICAgJ2NoZWNrYm94LWdyb3VwJzogWydvcHRpb25zJ10sXG4gICAgICByYWRpbzogWydvcHRpb25zJ10sXG4gICAgICBsaWtlcnQ6IFsnb3B0aW9ucycsICdyb3dzJ10sXG4gICAgICBxZTogWydxZVNjYWxlcyddXG4gICAgfTtcblxuICAgIHJldHVybiBbLi4uYmFzZUZpZWxkcywgLi4uKHR5cGVTcGVjaWZpY0ZpZWxkc1tmaWVsZFR5cGVdIHx8IFtdKV07XG4gIH1cbn1cbiJdfQ==