UNPKG

@rangertechnologies/ngnxt

Version:

This library was used for creating dymanic UI based on the input JSON/data

350 lines 36.3 kB
// AP-11APR25 import { Injectable } from '@angular/core'; import { v4 as uuidv4 } from 'uuid'; import * as i0 from "@angular/core"; export class TemplateService { templates = [ { templateId: 1, templateName: 'Invoice', content: 'Invoice template with customer details', elements: [ { type: 'Text', questionText: 'Customer Name', style: { showLabel: true }, size: 12 }, { type: 'Date', questionText: 'Invoice Date', style: { showLabel: true } }, { type: 'Table', questionText: 'Items', fieldsMeta: JSON.stringify([ { label: 'Item', fieldName: 'item', type: 'Text', uniqueIdentifier: 'temp1' }, { label: 'Quantity', fieldName: 'qty', type: 'Number', uniqueIdentifier: 'temp2' } ]), tableConfig: { isNosIndicator: true, addInlineRecord: true, isPagination: true } } ] }, { templateId: 2, templateName: 'Registration', content: 'User registration form template', elements: [ { type: 'Text', questionText: 'Full Name', style: { showLabel: true }, size: 12 }, { type: 'Text', questionText: 'Email Address', style: { showLabel: true }, size: 12 }, { type: 'Date', questionText: 'Date of Birth', style: { showLabel: true } } ] }, { templateId: 3, templateName: 'Employee Detail', content: 'Template to capture employee details', elements: [ { type: 'Text', questionText: 'Employee ID', style: { showLabel: true }, size: 6 }, { type: 'Text', questionText: 'Employee Name', style: { showLabel: true }, size: 6 }, { type: 'Table', questionText: 'Previous Work Experience', fieldsMeta: JSON.stringify([ { label: 'Company Name', fieldName: 'company', type: 'Text', uniqueIdentifier: 'emp1' }, { label: 'Years Worked', fieldName: 'years', type: 'Number', uniqueIdentifier: 'emp2' } ]), tableConfig: { isNosIndicator: false, addInlineRecord: true, isPagination: true } } ] }, { templateId: 4, templateName: 'Feedback', content: 'Feedback form for services or products', elements: [ { type: 'Text', questionText: 'Your Name', style: { showLabel: true }, size: 12 }, { type: 'Text', questionText: 'Feedback', style: { showLabel: true }, size: 12 }, { type: 'Table', questionText: 'Service Ratings', fieldsMeta: JSON.stringify([ { label: 'Service', fieldName: 'service', type: 'Text', uniqueIdentifier: 'fb1' }, { label: 'Rating (1-5)', fieldName: 'rating', type: 'Number', uniqueIdentifier: 'fb2' } ]), tableConfig: { isNosIndicator: false, addInlineRecord: true, isPagination: false } } ] } ]; unique_id; book; formElements = []; constructor() { this.newBook(); } getTemplates() { return this.templates; } initializeElementFromTemplate(templateElement, index) { const unique_id = uuidv4(); const baseElement = { id: unique_id, uid: unique_id, type: templateElement.type, name: null, questionText: templateElement.questionText || null, question: templateElement.question || null, helpText: null, errorMessage: null, isReadOnly: false, isHidden: false, required: false, referenceField: null, additionalRichContent: null, groupName: null, isDateBackward: false, title: null, subTitle: null, size: templateElement.size || 12, isDateForward: false, isOptional: false, isTitle: false, nextQuestion: null, allowedFileExtensions: null, questionNumber: index + 1, order: index + 1, style: { labelClass: null, labelStyle: null, labelValueStyle: null, inputClass: null, inputStyle: null, showLabel: templateElement?.style?.showLabel ?? true, bookStyle: null, direction: 'ltr', questionStyle: null, }, subText: { endpoint: null, variable: null, field: null, defaultField: null, sourceQuestionId: null, valueField: null, labelField: null, isDependentField: false, dependentValue: null, queryField: null, queryValue: null, queryValueReference: null, uniqueKey: null, }, imageData: null, boolean: false, options: templateElement.options ? this.initializeOptions(templateElement.options) : null, imageSize: templateElement.type === 'Image' ? { width: 150, height: 150 } : null, tableConfig: templateElement.type === 'Table' ? { isNosIndicator: true, addInlineRecord: true, isPagination: true, actionButton: true, isDeleteRow: true, isEditRow: true, searchBar: true, isButtons: true, itemsPerPage: 10, } : null, fieldsMeta: templateElement.fieldsMeta ? this.initializeFieldsMeta(templateElement.fieldsMeta) : null, }; return { ...baseElement, ...templateElement }; } initializeOptions(options) { return options.map(option => ({ ...option, id: uuidv4() })); } initializeFieldsMeta(fieldsMeta) { try { const parsed = JSON.parse(fieldsMeta); return parsed.map((field) => ({ ...field, uniqueIdentifier: uuidv4() })); } catch (e) { console.error('Error parsing fieldsMeta:', e); return []; } } // In TemplateService download() { if (!this.formElements || !Array.isArray(this.formElements)) { console.error('Invalid formElements'); return null; } // Clean elements for export (same as FormBuilderService) this.formElements.forEach(element => { // Remove qbReferenceQuestions for 'book' type if (element.type === 'book') { delete element.qbReferenceQuestions; } // Process subText to match FormBuilderService's format if (element.subText) { try { // Convert subText to object if string element.subText = typeof element.subText === 'string' ? JSON.parse(element.subText) : { ...element.subText }; // Convert field to array if string if (typeof element.subText.field === 'string') { element.subText.field = element.subText.field.split(',').map(i => i.trim()); } // Stringify subText for storage element.subText = JSON.stringify(element.subText); } catch (e) { console.error('Error processing subText:', e); element.subText = '{}'; } } }); // Update book structure (same as FormBuilderService) if (!this.book) this.newBook(); // Ensure book exists if (this.book.bookQuestionsMap && this.unique_id) { this.book.bookQuestionsMap[this.unique_id].subQuestions = this.formElements; } // Prepare sqOptions (same format as FormBuilderService) const sqOptions = {}; this.formElements.forEach(element => { if (['Dropdown', 'Radio', 'Checkbox'].includes(element.type)) { sqOptions[element.id] = { ...element, options: element.options?.map(opt => ({ ...opt, // Ensure UUIDs are preserved id: opt.id || uuidv4(), uniqueIdentifier: opt.uniqueIdentifier || uuidv4() })) || [] }; } }); this.book.sqOptions = sqOptions; return JSON.parse(JSON.stringify(this.book)); // Return clean copy } // Add the newBook() method if missing newBook() { this.unique_id = uuidv4(); this.book = { bookQuestionsMap: { [this.unique_id]: { subQuestions: [], type: 'Book' } }, questionbook: { action: JSON.stringify([ { name: "Cancel", eventtoemit: "close" }, { name: "Save", eventtoemit: "submit", method: "POST" } ]) }, records: [{ id: this.unique_id, title: 'Untitled Template', subQuestions: [] }] }; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TemplateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TemplateService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TemplateService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9zZXJ2aWNlcy90ZW1wbGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWE7QUFDYixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUtwQyxNQUFNLE9BQU8sZUFBZTtJQUMxQixTQUFTLEdBQUc7UUFDVjtZQUNFLFVBQVUsRUFBRSxDQUFDO1lBQ2IsWUFBWSxFQUFFLFNBQVM7WUFDdkIsT0FBTyxFQUFFLHdDQUF3QztZQUNqRCxRQUFRLEVBQUU7Z0JBQ1I7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osWUFBWSxFQUFFLGVBQWU7b0JBQzdCLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUU7b0JBQzFCLElBQUksRUFBRSxFQUFFO2lCQUNUO2dCQUNEO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLFlBQVksRUFBRSxjQUFjO29CQUM1QixLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO2lCQUMzQjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBTztvQkFDYixZQUFZLEVBQUUsT0FBTztvQkFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ3pCOzRCQUNFLEtBQUssRUFBRSxNQUFNOzRCQUNiLFNBQVMsRUFBRSxNQUFNOzRCQUNqQixJQUFJLEVBQUUsTUFBTTs0QkFDWixnQkFBZ0IsRUFBRSxPQUFPO3lCQUMxQjt3QkFDRDs0QkFDRSxLQUFLLEVBQUUsVUFBVTs0QkFDakIsU0FBUyxFQUFFLEtBQUs7NEJBQ2hCLElBQUksRUFBRSxRQUFROzRCQUNkLGdCQUFnQixFQUFFLE9BQU87eUJBQzFCO3FCQUNGLENBQUM7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ZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBUC0xMUFQUjI1XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVTZXJ2aWNlIHtcbiAgdGVtcGxhdGVzID0gW1xuICAgIHtcbiAgICAgIHRlbXBsYXRlSWQ6IDEsXG4gICAgICB0ZW1wbGF0ZU5hbWU6ICdJbnZvaWNlJyxcbiAgICAgIGNvbnRlbnQ6ICdJbnZvaWNlIHRlbXBsYXRlIHdpdGggY3VzdG9tZXIgZGV0YWlscycsXG4gICAgICBlbGVtZW50czogW1xuICAgICAgICB7IFxuICAgICAgICAgIHR5cGU6ICdUZXh0JywgXG4gICAgICAgICAgcXVlc3Rpb25UZXh0OiAnQ3VzdG9tZXIgTmFtZScsXG4gICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH0sXG4gICAgICAgICAgc2l6ZTogMTJcbiAgICAgICAgfSxcbiAgICAgICAgeyBcbiAgICAgICAgICB0eXBlOiAnRGF0ZScsIFxuICAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ0ludm9pY2UgRGF0ZScsXG4gICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdUYWJsZScsXG4gICAgICAgICAgcXVlc3Rpb25UZXh0OiAnSXRlbXMnLFxuICAgICAgICAgIGZpZWxkc01ldGE6IEpTT04uc3RyaW5naWZ5KFtcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIGxhYmVsOiAnSXRlbScsIFxuICAgICAgICAgICAgICBmaWVsZE5hbWU6ICdpdGVtJywgXG4gICAgICAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgICAgICAgICAgICAgdW5pcXVlSWRlbnRpZmllcjogJ3RlbXAxJyBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnUXVhbnRpdHknLFxuICAgICAgICAgICAgICBmaWVsZE5hbWU6ICdxdHknLFxuICAgICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgICAgICAgICAgICAgdW5pcXVlSWRlbnRpZmllcjogJ3RlbXAyJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pLFxuICAgICAgICAgIHRhYmxlQ29uZmlnOiB7XG4gICAgICAgICAgICBpc05vc0luZGljYXRvcjogdHJ1ZSxcbiAgICAgICAgICAgIGFkZElubGluZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgIGlzUGFnaW5hdGlvbjogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgdGVtcGxhdGVJZDogMixcbiAgICAgIHRlbXBsYXRlTmFtZTogJ1JlZ2lzdHJhdGlvbicsXG4gICAgICBjb250ZW50OiAnVXNlciByZWdpc3RyYXRpb24gZm9ybSB0ZW1wbGF0ZScsXG4gICAgICBlbGVtZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RleHQnLFxuICAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ0Z1bGwgTmFtZScsXG4gICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH0sXG4gICAgICAgICAgc2l6ZTogMTJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgICAgICAgICBxdWVzdGlvblRleHQ6ICdFbWFpbCBBZGRyZXNzJyxcbiAgICAgICAgICBzdHlsZTogeyBzaG93TGFiZWw6IHRydWUgfSxcbiAgICAgICAgICBzaXplOiAxMlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ0RhdGUnLFxuICAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ0RhdGUgb2YgQmlydGgnLFxuICAgICAgICAgIHN0eWxlOiB7IHNob3dMYWJlbDogdHJ1ZSB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIHRlbXBsYXRlSWQ6IDMsXG4gICAgICB0ZW1wbGF0ZU5hbWU6ICdFbXBsb3llZSBEZXRhaWwnLFxuICAgICAgY29udGVudDogJ1RlbXBsYXRlIHRvIGNhcHR1cmUgZW1wbG95ZWUgZGV0YWlscycsXG4gICAgICBlbGVtZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RleHQnLFxuICAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ0VtcGxveWVlIElEJyxcbiAgICAgICAgICBzdHlsZTogeyBzaG93TGFiZWw6IHRydWUgfSxcbiAgICAgICAgICBzaXplOiA2XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnVGV4dCcsXG4gICAgICAgICAgcXVlc3Rpb25UZXh0OiAnRW1wbG95ZWUgTmFtZScsXG4gICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH0sXG4gICAgICAgICAgc2l6ZTogNlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RhYmxlJyxcbiAgICAgICAgICBxdWVzdGlvblRleHQ6ICdQcmV2aW91cyBXb3JrIEV4cGVyaWVuY2UnLFxuICAgICAgICAgIGZpZWxkc01ldGE6IEpTT04uc3RyaW5naWZ5KFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdDb21wYW55IE5hbWUnLFxuICAgICAgICAgICAgICBmaWVsZE5hbWU6ICdjb21wYW55JyxcbiAgICAgICAgICAgICAgdHlwZTogJ1RleHQnLFxuICAgICAgICAgICAgICB1bmlxdWVJZGVudGlmaWVyOiAnZW1wMSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnWWVhcnMgV29ya2VkJyxcbiAgICAgICAgICAgICAgZmllbGROYW1lOiAneWVhcnMnLFxuICAgICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgICAgICAgICAgICAgdW5pcXVlSWRlbnRpZmllcjogJ2VtcDInXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSksXG4gICAgICAgICAgdGFibGVDb25maWc6IHtcbiAgICAgICAgICAgIGlzTm9zSW5kaWNhdG9yOiBmYWxzZSxcbiAgICAgICAgICAgIGFkZElubGluZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgIGlzUGFnaW5hdGlvbjogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgdGVtcGxhdGVJZDogNCxcbiAgICAgIHRlbXBsYXRlTmFtZTogJ0ZlZWRiYWNrJyxcbiAgICAgIGNvbnRlbnQ6ICdGZWVkYmFjayBmb3JtIGZvciBzZXJ2aWNlcyBvciBwcm9kdWN0cycsXG4gICAgICBlbGVtZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1RleHQnLFxuICAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ1lvdXIgTmFtZScsXG4gICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH0sXG4gICAgICAgICAgc2l6ZTogMTJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgICAgICAgICBxdWVzdGlvblRleHQ6ICdGZWVkYmFjaycsXG4gICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH0sXG4gICAgICAgICAgc2l6ZTogMTJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdUYWJsZScsXG4gICAgICAgICAgcXVlc3Rpb25UZXh0OiAnU2VydmljZSBSYXRpbmdzJyxcbiAgICAgICAgICBmaWVsZHNNZXRhOiBKU09OLnN0cmluZ2lmeShbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnU2VydmljZScsXG4gICAgICAgICAgICAgIGZpZWxkTmFtZTogJ3NlcnZpY2UnLFxuICAgICAgICAgICAgICB0eXBlOiAnVGV4dCcsXG4gICAgICAgICAgICAgIHVuaXF1ZUlkZW50aWZpZXI6ICdmYjEnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ1JhdGluZyAoMS01KScsXG4gICAgICAgICAgICAgIGZpZWxkTmFtZTogJ3JhdGluZycsXG4gICAgICAgICAgICAgIHR5cGU6ICdOdW1iZXInLFxuICAgICAgICAgICAgICB1bmlxdWVJZGVudGlmaWVyOiAnZmIyJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pLFxuICAgICAgICAgIHRhYmxlQ29uZmlnOiB7XG4gICAgICAgICAgICBpc05vc0luZGljYXRvcjogZmFsc2UsXG4gICAgICAgICAgICBhZGRJbmxpbmVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBpc1BhZ2luYXRpb246IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICBdO1xuICB1bmlxdWVfaWQ6IGFueTtcbiAgYm9vazogYW55O1xuICBmb3JtRWxlbWVudHM6IGFueVtdID0gW107XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubmV3Qm9vaygpOyBcbiAgfVxuICBnZXRUZW1wbGF0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVzO1xuICB9XG4gIGluaXRpYWxpemVFbGVtZW50RnJvbVRlbXBsYXRlKHRlbXBsYXRlRWxlbWVudDogYW55LCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCB1bmlxdWVfaWQgPSB1dWlkdjQoKTtcbiAgICBjb25zdCBiYXNlRWxlbWVudCA9IHtcbiAgICAgIGlkOiB1bmlxdWVfaWQsXG4gICAgICB1aWQ6IHVuaXF1ZV9pZCxcbiAgICAgIHR5cGU6IHRlbXBsYXRlRWxlbWVudC50eXBlLFxuICAgICAgbmFtZTogbnVsbCxcbiAgICAgIHF1ZXN0aW9uVGV4dDogdGVtcGxhdGVFbGVtZW50LnF1ZXN0aW9uVGV4dCB8fCBudWxsLFxuICAgICAgcXVlc3Rpb246IHRlbXBsYXRlRWxlbWVudC5xdWVzdGlvbiB8fCBudWxsLFxuICAgICAgaGVscFRleHQ6IG51bGwsXG4gICAgICBlcnJvck1lc3NhZ2U6IG51bGwsXG4gICAgICBpc1JlYWRPbmx5OiBmYWxzZSxcbiAgICAgIGlzSGlkZGVuOiBmYWxzZSxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIHJlZmVyZW5jZUZpZWxkOiBudWxsLFxuICAgICAgYWRkaXRpb25hbFJpY2hDb250ZW50OiBudWxsLFxuICAgICAgZ3JvdXBOYW1lOiBudWxsLFxuICAgICAgaXNEYXRlQmFja3dhcmQ6IGZhbHNlLFxuICAgICAgdGl0bGU6IG51bGwsXG4gICAgICBzdWJUaXRsZTogbnVsbCxcbiAgICAgIHNpemU6IHRlbXBsYXRlRWxlbWVudC5zaXplIHx8IDEyLFxuICAgICAgaXNEYXRlRm9yd2FyZDogZmFsc2UsXG4gICAgICBpc09wdGlvbmFsOiBmYWxzZSxcbiAgICAgIGlzVGl0bGU6IGZhbHNlLFxuICAgICAgbmV4dFF1ZXN0aW9uOiBudWxsLFxuICAgICAgYWxsb3dlZEZpbGVFeHRlbnNpb25zOiBudWxsLFxuICAgICAgcXVlc3Rpb25OdW1iZXI6IGluZGV4ICsgMSxcbiAgICAgIG9yZGVyOiBpbmRleCArIDEsXG4gICAgICBzdHlsZToge1xuICAgICAgICBsYWJlbENsYXNzOiBudWxsLFxuICAgICAgICBsYWJlbFN0eWxlOiBudWxsLFxuICAgICAgICBsYWJlbFZhbHVlU3R5bGU6IG51bGwsXG4gICAgICAgIGlucHV0Q2xhc3M6IG51bGwsXG4gICAgICAgIGlucHV0U3R5bGU6IG51bGwsXG4gICAgICAgIHNob3dMYWJlbDogdGVtcGxhdGVFbGVtZW50Py5zdHlsZT8uc2hvd0xhYmVsID8/IHRydWUsXG4gICAgICAgIGJvb2tTdHlsZTogbnVsbCxcbiAgICAgICAgZGlyZWN0aW9uOiAnbHRyJyxcbiAgICAgICAgcXVlc3Rpb25TdHlsZTogbnVsbCxcbiAgICAgIH0sXG4gICAgICBzdWJUZXh0OiB7XG4gICAgICAgIGVuZHBvaW50OiBudWxsLFxuICAgICAgICB2YXJpYWJsZTogbnVsbCxcbiAgICAgICAgZmllbGQ6IG51bGwsXG4gICAgICAgIGRlZmF1bHRGaWVsZDogbnVsbCxcbiAgICAgICAgc291cmNlUXVlc3Rpb25JZDogbnVsbCxcbiAgICAgICAgdmFsdWVGaWVsZDogbnVsbCxcbiAgICAgICAgbGFiZWxGaWVsZDogbnVsbCxcbiAgICAgICAgaXNEZXBlbmRlbnRGaWVsZDogZmFsc2UsXG4gICAgICAgIGRlcGVuZGVudFZhbHVlOiBudWxsLFxuICAgICAgICBxdWVyeUZpZWxkOiBudWxsLFxuICAgICAgICBxdWVyeVZhbHVlOiBudWxsLFxuICAgICAgICBxdWVyeVZhbHVlUmVmZXJlbmNlOiBudWxsLFxuICAgICAgICB1bmlxdWVLZXk6IG51bGwsXG4gICAgICB9LFxuICAgICAgaW1hZ2VEYXRhOiBudWxsLFxuICAgICAgYm9vbGVhbjogZmFsc2UsXG4gICAgICBvcHRpb25zOiB0ZW1wbGF0ZUVsZW1lbnQub3B0aW9uc1xuICAgICAgICA/IHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnModGVtcGxhdGVFbGVtZW50Lm9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIGltYWdlU2l6ZTpcbiAgICAgICAgdGVtcGxhdGVFbGVtZW50LnR5cGUgPT09ICdJbWFnZScgPyB7IHdpZHRoOiAxNTAsIGhlaWdodDogMTUwIH0gOiBudWxsLFxuICAgICAgdGFibGVDb25maWc6IHRlbXBsYXRlRWxlbWVudC50eXBlID09PSAnVGFibGUnID8ge1xuICAgICAgICBpc05vc0luZGljYXRvcjogdHJ1ZSxcbiAgICAgICAgYWRkSW5saW5lUmVjb3JkOiB0cnVlLFxuICAgICAgICBpc1BhZ2luYXRpb246IHRydWUsXG4gICAgICAgIGFjdGlvbkJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgaXNEZWxldGVSb3c6IHRydWUsXG4gICAgICAgIGlzRWRpdFJvdzogdHJ1ZSxcbiAgICAgICAgc2VhcmNoQmFyOiB0cnVlLFxuICAgICAgICBpc0J1dHRvbnM6IHRydWUsXG4gICAgICAgIGl0ZW1zUGVyUGFnZTogMTAsXG4gICAgICB9IDogbnVsbCxcbiAgICAgIGZpZWxkc01ldGE6IHRlbXBsYXRlRWxlbWVudC5maWVsZHNNZXRhXG4gICAgICAgID8gdGhpcy5pbml0aWFsaXplRmllbGRzTWV0YSh0ZW1wbGF0ZUVsZW1lbnQuZmllbGRzTWV0YSlcbiAgICAgICAgOiBudWxsLFxuICAgIH07XG5cbiAgICByZXR1cm4geyAuLi5iYXNlRWxlbWVudCwgLi4udGVtcGxhdGVFbGVtZW50IH07XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVPcHRpb25zKG9wdGlvbnM6IGFueVtdKTogYW55W10ge1xuICAgIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICAgIC4uLm9wdGlvbixcbiAgICAgIGlkOiB1dWlkdjQoKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZpZWxkc01ldGEoZmllbGRzTWV0YTogc3RyaW5nKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShmaWVsZHNNZXRhKTtcbiAgICAgIHJldHVybiBwYXJzZWQubWFwKChmaWVsZDogYW55KSA9PiAoe1xuICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgdW5pcXVlSWRlbnRpZmllcjogdXVpZHY0KClcbiAgICAgIH0pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGZpZWxkc01ldGE6JywgZSk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4vLyBJbiBUZW1wbGF0ZVNlcnZpY2VcbmRvd25sb2FkKCkge1xuICBpZiAoIXRoaXMuZm9ybUVsZW1lbnRzIHx8ICFBcnJheS5pc0FycmF5KHRoaXMuZm9ybUVsZW1lbnRzKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZm9ybUVsZW1lbnRzJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBDbGVhbiBlbGVtZW50cyBmb3IgZXhwb3J0IChzYW1lIGFzIEZvcm1CdWlsZGVyU2VydmljZSlcbiAgdGhpcy5mb3JtRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAvLyBSZW1vdmUgcWJSZWZlcmVuY2VRdWVzdGlvbnMgZm9yICdib29rJyB0eXBlXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2Jvb2snKSB7XG4gICAgICBkZWxldGUgZWxlbWVudC5xYlJlZmVyZW5jZVF1ZXN0aW9ucztcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIHN1YlRleHQgdG8gbWF0Y2ggRm9ybUJ1aWxkZXJTZXJ2aWNlJ3MgZm9ybWF0XG4gICAgaWYgKGVsZW1lbnQuc3ViVGV4dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ29udmVydCBzdWJUZXh0IHRvIG9iamVjdCBpZiBzdHJpbmdcbiAgICAgICAgZWxlbWVudC5zdWJUZXh0ID0gdHlwZW9mIGVsZW1lbnQuc3ViVGV4dCA9PT0gJ3N0cmluZycgXG4gICAgICAgICAgPyBKU09OLnBhcnNlKGVsZW1lbnQuc3ViVGV4dCkgXG4gICAgICAgICAgOiB7Li4uZWxlbWVudC5zdWJUZXh0fTtcblxuICAgICAgICAvLyBDb252ZXJ0IGZpZWxkIHRvIGFycmF5IGlmIHN0cmluZ1xuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQuc3ViVGV4dC5maWVsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBlbGVtZW50LnN1YlRleHQuZmllbGQgPSBlbGVtZW50LnN1YlRleHQuZmllbGQuc3BsaXQoJywnKS5tYXAoaSA9PiBpLnRyaW0oKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdHJpbmdpZnkgc3ViVGV4dCBmb3Igc3RvcmFnZVxuICAgICAgICBlbGVtZW50LnN1YlRleHQgPSBKU09OLnN0cmluZ2lmeShlbGVtZW50LnN1YlRleHQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIHN1YlRleHQ6JywgZSk7XG4gICAgICAgIGVsZW1lbnQuc3ViVGV4dCA9ICd7fSc7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBVcGRhdGUgYm9vayBzdHJ1Y3R1cmUgKHNhbWUgYXMgRm9ybUJ1aWxkZXJTZXJ2aWNlKVxuICBpZiAoIXRoaXMuYm9vaykgdGhpcy5uZXdCb29rKCk7IC8vIEVuc3VyZSBib29rIGV4aXN0c1xuICBcbiAgaWYgKHRoaXMuYm9vay5ib29rUXVlc3Rpb25zTWFwICYmIHRoaXMudW5pcXVlX2lkKSB7XG4gICAgdGhpcy5ib29rLmJvb2tRdWVzdGlvbnNNYXBbdGhpcy51bmlxdWVfaWRdLnN1YlF1ZXN0aW9ucyA9IHRoaXMuZm9ybUVsZW1lbnRzO1xuICB9XG5cbiAgLy8gUHJlcGFyZSBzcU9wdGlvbnMgKHNhbWUgZm9ybWF0IGFzIEZvcm1CdWlsZGVyU2VydmljZSlcbiAgY29uc3Qgc3FPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIHRoaXMuZm9ybUVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgaWYgKFsnRHJvcGRvd24nLCAnUmFkaW8nLCAnQ2hlY2tib3gnXS5pbmNsdWRlcyhlbGVtZW50LnR5cGUpKSB7XG4gICAgICBzcU9wdGlvbnNbZWxlbWVudC5pZF0gPSB7XG4gICAgICAgIC4uLmVsZW1lbnQsXG4gICAgICAgIG9wdGlvbnM6IGVsZW1lbnQub3B0aW9ucz8ubWFwKG9wdCA9PiAoe1xuICAgICAgICAgIC4uLm9wdCxcbiAgICAgICAgICAvLyBFbnN1cmUgVVVJRHMgYXJlIHByZXNlcnZlZFxuICAgICAgICAgIGlkOiBvcHQuaWQgfHwgdXVpZHY0KCksXG4gICAgICAgICAgdW5pcXVlSWRlbnRpZmllcjogb3B0LnVuaXF1ZUlkZW50aWZpZXIgfHwgdXVpZHY0KClcbiAgICAgICAgfSkpIHx8IFtdXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5ib29rLnNxT3B0aW9ucyA9IHNxT3B0aW9ucztcbiAgXG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuYm9vaykpOyAvLyBSZXR1cm4gY2xlYW4gY29weVxufVxuXG4vLyBBZGQgdGhlIG5ld0Jvb2soKSBtZXRob2QgaWYgbWlzc2luZ1xucHJpdmF0ZSBuZXdCb29rKCkge1xuICB0aGlzLnVuaXF1ZV9pZCA9IHV1aWR2NCgpO1xuICB0aGlzLmJvb2sgPSB7XG4gICAgYm9va1F1ZXN0aW9uc01hcDoge1xuICAgICAgW3RoaXMudW5pcXVlX2lkXToge1xuICAgICAgICBzdWJRdWVzdGlvbnM6IFtdLFxuICAgICAgICB0eXBlOiAnQm9vaydcbiAgICAgIH1cbiAgICB9LFxuICAgIHF1ZXN0aW9uYm9vazoge1xuICAgICAgYWN0aW9uOiBKU09OLnN0cmluZ2lmeShbXG4gICAgICAgIHsgbmFtZTogXCJDYW5jZWxcIiwgZXZlbnR0b2VtaXQ6IFwiY2xvc2VcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiU2F2ZVwiLCBldmVudHRvZW1pdDogXCJzdWJtaXRcIiwgbWV0aG9kOiBcIlBPU1RcIiB9XG4gICAgICBdKVxuICAgIH0sXG4gICAgcmVjb3JkczogW3tcbiAgICAgIGlkOiB0aGlzLnVuaXF1ZV9pZCxcbiAgICAgIHRpdGxlOiAnVW50aXRsZWQgVGVtcGxhdGUnLFxuICAgICAgc3ViUXVlc3Rpb25zOiBbXVxuICAgIH1dXG4gIH07XG59XG4gIFxuICBcbn1cbiJdfQ==