UNPKG

@formql/core

Version:

FormQL - A framework for building dynamic forms

308 lines 43.9 kB
import { __assign, __decorate, __read, __spread } from "tslib"; import { Injectable } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import * as i0 from "@angular/core"; var HelperService = /** @class */ (function () { function HelperService() { } HelperService_1 = HelperService; HelperService.evaluateCondition = function (condition, data) { 'use strict'; var response = { value: false, error: null }; if (condition && condition.trim() !== '' && condition !== 'false') { if (condition === 'true') { response.value = true; return response; } if (!data) return response; response = __assign({}, this.evaluate(condition, data)); if (response.value !== true) response.value = false; } return response; }; HelperService.evaluateValue = function (path, data) { 'use strict'; var response = { value: null, error: null }; if (!data) return response; response = __assign({}, this.evaluate(path, data)); if (Number.isNaN(response.value) || response.value === Infinity) response.value = null; else response.value = this.deepCopy(response.value); return response; }; HelperService.evaluate = function (path, data) { 'use strict'; var response = { value: null, error: null }; var props = Object.keys(data); var params = []; for (var i = 0; i < props.length; i++) params.push(data[props[i]]); params.push(path); props.push('path'); var expression = "\n 'use strict'\n let window = undefined;\n let document = undefined;\n let alert = undefined;\n let a = undefined;\n return " + path + ";\n "; props.push(expression); try { var evalFunc = new (Function.bind.apply(Function, __spread([void 0], props)))(); response.value = evalFunc.apply(void 0, __spread(params)); } catch (err) { response.error = err; } return response; }; HelperService.setValue = function (schema, value, data) { if (value === undefined) value = null; if (schema) { if (!data) data = {}; var key = schema; if (schema.indexOf('.') !== -1) { var arr = schema.split('.'); var item = data; for (var i = 0; i <= arr.length - 1; i++) { key = arr[i]; if (!item[key]) item[key] = {}; if (i !== arr.length - 1) item = item[key]; } item[key] = value; } else data[key] = value; } return data; }; HelperService.getValue = function (schema, data, type) { if (!schema || !data || (data && Object.keys(data).length === 0 && data.constructor === Object)) return; try { var evalFunc = new Function('data', "return data." + schema + ";"); return HelperService_1.resolveType(evalFunc(data), type); } catch (err) { return null; } }; HelperService.setValidators = function (componentResolverService, component, control) { var componentRef = componentResolverService.resolveComponent(component.componentName); if (!componentRef) return control; var type = componentRef.componentType; if (type && (!type['validators'] || (type['validators'] && type['validators'].length === 0))) return control; var validators = []; var rules = component.rules; if (rules != null) { var FormValidators_1 = type['validators']; Object.keys(rules).forEach(function (key) { var item = rules[key]; if (item.value && item.key !== 'readonly' && item.key !== 'hidden' && item.key !== 'value') { var validator = FormValidators_1.find(function (x) { return x.key === item.key; }); if (validator && validator.validator) validators.push(validator.validator); } else if (item.value && item.key === 'readonly' && control.enabled) control.disable(); }); if (control.disabled && (!rules || (rules && !rules.readonly) || (rules && rules.readonly && !rules.readonly.value))) control.enable(); } if (validators.length > 0) control.setValidators(validators); return control; }; HelperService.createReactiveFormStructure = function (form, initialiseData, data) { var _this = this; if (initialiseData === void 0) { initialiseData = true; } if (data === void 0) { data = null; } var formControls = {}; var components = {}; var pageGroup = new FormGroup({}); form.pages.forEach(function (page) { var sectionGroup = {}; if (page.sections != null) page.sections.forEach(function (section) { var componentGroup = {}; if (section.components != null) section.components.forEach(function (component) { components[component.componentId] = component; var singleComponentGroup = new FormControl(); formControls[component.componentId] = singleComponentGroup; componentGroup[component.componentId] = singleComponentGroup; if (initialiseData) { if (!data) data = {}; data = HelperService_1.instantiateData(data, component.schema); try { var value = _this.getValue(component.schema, data, component.type); if (value) { formControls[component.componentId].setValue(value); component.value = value; } } catch (err) { throw err; } } }); sectionGroup[section.sectionId] = new FormGroup(componentGroup); }); pageGroup[page.pageId] = new FormGroup(sectionGroup); }); return { pageGroup: pageGroup, formControls: formControls, components: components, data: data }; }; HelperService.instantiateData = function (data, schema) { if (schema && schema.indexOf('.') !== -1) { var arr = schema.split('.'); var item = data; var key = ''; for (var i = 0; i <= arr.length - 2; i++) { key = arr[i]; if (!item[key]) item[key] = {}; if (i !== arr.length - 2) item = item[key]; } } return data; }; HelperService.deepCopy = function (oldObj, ignoreProperty) { if (ignoreProperty === void 0) { ignoreProperty = null; } var newObj = oldObj; if (oldObj && typeof oldObj === 'object') { newObj = Object.prototype.toString.call(oldObj) === '[object Array]' ? [] : {}; var _loop_1 = function (i) { if (!ignoreProperty || (ignoreProperty && !ignoreProperty.find(function (p) { return p === i; }))) newObj[i] = this_1.deepCopy(oldObj[i]); }; var this_1 = this; for (var i in oldObj) { _loop_1(i); } } return newObj; }; HelperService.propertyCopy = function (source, target, ignoreProperties) { if (ignoreProperties === void 0) { ignoreProperties = null; } if (source && typeof source === 'object') { var _loop_2 = function (i) { if (!ignoreProperties || (ignoreProperties && !ignoreProperties.find(function (p) { return p === i; }))) if (source[i] && typeof source[i] === 'object') { if (!target[i]) target[i] = {}; target[i] = this_2.propertyCopy(source[i], target[i]); } else target[i] = source[i]; else console.log("propertyCopy function doesn't support primitives"); }; var this_2 = this; for (var i in source) { _loop_2(i); } } return target; }; HelperService.formatForGraphQl = function (obj) { var _this = this; var updatedData = this.deepCopy(obj); if (updatedData['__typename']) delete updatedData['__typename']; var dataForQuery = ''; Object.keys(updatedData).forEach(function (fieldName) { if (updatedData[fieldName] == null) dataForQuery += fieldName + ': null,'; else if (typeof updatedData[fieldName] === 'object') dataForQuery += _this.formatForGraphQl(updatedData[fieldName]); else if (typeof updatedData[fieldName] === 'number' || typeof updatedData[fieldName] === 'boolean') dataForQuery += fieldName + (":" + updatedData[fieldName] + ","); else dataForQuery += fieldName + (":\"" + updatedData[fieldName] + ","); }); dataForQuery = "{" + dataForQuery.slice(0, -1) + "}"; return dataForQuery; }; HelperService.formatError = function (error) { if (!error) return; if (error.error && error.error.message) error.message = error.error.message; return error; }; HelperService.resolveType = function (value, type) { if (value === null || value === undefined || value === '') return null; else if (Number.isNaN(value)) return 0; switch (type) { case 'number': if (typeof value === 'string') value = value.replace(/[^\d\.]/g, ''); return Number(value); default: return value; } }; HelperService.maskToArray = function (mask) { var result = []; if (mask) { var maskTrimmed = mask.trim().substring(1).slice(0, -1).replace('\\\\', '\\'); var arry = maskTrimmed.split(','); arry.forEach(function (item) { result.push(item.trim().replace(/\"/g, '').replace(/\'/g, '')); }); } return result; }; HelperService.updateTemplates = function (form) { form.pages.forEach(function (page) { page.template.reRender = false; page.template = HelperService_1.deepCopy(page.template); page.sections.forEach(function (section) { section.template.reRender = false; section.template = HelperService_1.deepCopy(section.template); }); }); return form; }; HelperService.resetValidators = function (components, formControls, componentResolverService) { if (components && Object.keys(components).length > 0) Object.keys(components).forEach(function (key) { var component = components[key]; if (component) { var componentControl = formControls[component.componentId]; if (componentControl) componentControl = HelperService_1.setValidators(componentResolverService, component, componentControl); } }); return formControls; }; HelperService.validateForm = function (formGroup) { var _this = this; Object.keys(formGroup.controls).forEach(function (field) { var control = formGroup.get(field); if (control instanceof FormControl) control.markAsTouched({ onlySelf: true }); else if (control instanceof FormGroup) _this.validateForm(control); }); }; var HelperService_1; HelperService.ɵprov = i0.ɵɵdefineInjectable({ factory: function HelperService_Factory() { return new HelperService(); }, token: HelperService, providedIn: "root" }); HelperService = HelperService_1 = __decorate([ Injectable({ providedIn: 'root' }) ], HelperService); return HelperService; }()); export { HelperService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZm9ybXFsL2NvcmUvIiwic291cmNlcyI6WyJzZXJ2aWNlcy9oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFVeEQ7SUFBQTtLQW1UQztzQkFuVFksYUFBYTtJQUNWLCtCQUFpQixHQUEvQixVQUFnQyxTQUFpQixFQUFFLElBQVM7UUFDMUQsWUFBWSxDQUFDO1FBQ2IsSUFBSSxRQUFRLEdBQWlCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFM0QsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ2pFLElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRTtnQkFDeEIsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLE9BQU8sUUFBUSxDQUFDO2FBQ2pCO1lBRUQsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTyxRQUFRLENBQUM7WUFFM0IsUUFBUSxnQkFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBRSxDQUFDO1lBRWpELElBQUksUUFBUSxDQUFDLEtBQUssS0FBSyxJQUFJO2dCQUFFLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3JEO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVhLDJCQUFhLEdBQTNCLFVBQTRCLElBQVksRUFBRSxJQUFTO1FBQ2pELFlBQVksQ0FBQztRQUViLElBQUksUUFBUSxHQUFpQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxD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LENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckMsSUFBSSxPQUFPLFlBQVksV0FBVztnQkFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ3pFLElBQUksT0FBTyxZQUFZLFNBQVM7Z0JBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OztJQWxUVSxhQUFhO1FBSHpCLFVBQVUsQ0FBQztZQUNWLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUM7T0FDVyxhQUFhLENBbVR6Qjt3QkE5VEQ7Q0E4VEMsQUFuVEQsSUFtVEM7U0FuVFksYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIENvbXBvbmVudCwgQ29tcG9uZW50RmFjdG9yeSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0tY29tcG9uZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgRm9ybUVycm9yLCBGb3JtV2luZG93LCBGb3JtQ29tcG9uZW50cywgRm9ybUNvbnRyb2xzIH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0td2luZG93Lm1vZGVsJztcclxuaW1wb3J0IHsgRXZhbFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3R5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBGb3JtVmFsaWRhdG9yIH0gZnJvbSAnLi4vbW9kZWxzL3J1bGUubW9kZWwnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRSZXNvbHZlclNlcnZpY2UgfSBmcm9tICcuL2NvbXBvbmVudC1yZXNvbHZlci5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEhlbHBlclNlcnZpY2Uge1xyXG4gIHB1YmxpYyBzdGF0aWMgZXZhbHVhdGVDb25kaXRpb24oY29uZGl0aW9uOiBzdHJpbmcsIGRhdGE6IGFueSk6IEV2YWxSZXNwb25zZSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcbiAgICBsZXQgcmVzcG9uc2UgPSA8RXZhbFJlc3BvbnNlPnsgdmFsdWU6IGZhbHNlLCBlcnJvcjogbnVsbCB9O1xyXG5cclxuICAgIGlmIChjb25kaXRpb24gJiYgY29uZGl0aW9uLnRyaW0oKSAhPT0gJycgJiYgY29uZGl0aW9uICE9PSAnZmFsc2UnKSB7XHJcbiAgICAgIGlmIChjb25kaXRpb24gPT09ICd0cnVlJykge1xyXG4gICAgICAgIHJlc3BvbnNlLnZhbHVlID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghZGF0YSkgcmV0dXJuIHJlc3BvbnNlO1xyXG5cclxuICAgICAgcmVzcG9uc2UgPSB7IC4uLnRoaXMuZXZhbHVhdGUoY29uZGl0aW9uLCBkYXRhKSB9O1xyXG5cclxuICAgICAgaWYgKHJlc3BvbnNlLnZhbHVlICE9PSB0cnVlKSByZXNwb25zZS52YWx1ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBldmFsdWF0ZVZhbHVlKHBhdGg6IHN0cmluZywgZGF0YTogYW55KTogRXZhbFJlc3BvbnNlIHtcclxuICAgICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgICBsZXQgcmVzcG9uc2UgPSA8RXZhbFJlc3BvbnNlPnsgdmFsdWU6IG51bGwsIGVycm9yOiBudWxsIH07XHJcblxyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gcmVzcG9uc2U7XHJcblxyXG4gICAgcmVzcG9uc2UgPSB7IC4uLnRoaXMuZXZhbHVhdGUocGF0aCwgZGF0YSkgfTtcclxuXHJcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHJlc3BvbnNlLnZhbHVlKSB8fCByZXNwb25zZS52YWx1ZSA9PT0gSW5maW5pdHkpIHJlc3BvbnNlLnZhbHVlID0gbnVsbDtcclxuICAgIGVsc2UgcmVzcG9uc2UudmFsdWUgPSB0aGlzLmRlZXBDb3B5KHJlc3BvbnNlLnZhbHVlKTtcclxuXHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBldmFsdWF0ZShwYXRoOiBzdHJpbmcsIGRhdGE6IGFueSk6IEV2YWxSZXNwb25zZSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSA8RXZhbFJlc3BvbnNlPnsgdmFsdWU6IG51bGwsIGVycm9yOiBudWxsIH07XHJcblxyXG4gICAgY29uc3QgcHJvcHMgPSBPYmplY3Qua2V5cyhkYXRhKTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHBhcmFtcy5wdXNoKGRhdGFbcHJvcHNbaV1dKTtcclxuXHJcbiAgICBwYXJhbXMucHVzaChwYXRoKTtcclxuXHJcbiAgICBwcm9wcy5wdXNoKCdwYXRoJyk7XHJcblxyXG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IGBcclxuICAgICAgICAgICAgJ3VzZSBzdHJpY3QnXHJcbiAgICAgICAgICAgIGxldCB3aW5kb3cgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGxldCBkb2N1bWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgbGV0IGFsZXJ0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBsZXQgYSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgcmV0dXJuICR7cGF0aH07XHJcbiAgICAgICAgYDtcclxuXHJcbiAgICBwcm9wcy5wdXNoKGV4cHJlc3Npb24pO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGV2YWxGdW5jID0gbmV3IEZ1bmN0aW9uKC4uLnByb3BzKTtcclxuICAgICAgcmVzcG9uc2UudmFsdWUgPSBldmFsRnVuYyguLi5wYXJhbXMpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHJlc3BvbnNlLmVycm9yID0gZXJyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBzZXRWYWx1ZTxULCBVPihzY2hlbWE6IHN0cmluZywgdmFsdWU6IFQsIGRhdGE6IFUpOiBVIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHZhbHVlID0gbnVsbDtcclxuICAgIGlmIChzY2hlbWEpIHtcclxuICAgICAgICBpZiAoIWRhdGEpXHJcbiAgICAgICAgICAgIGRhdGEgPSB7fSBhcyBVO1xyXG4gICAgICAgIGxldCBrZXkgPSBzY2hlbWE7XHJcbiAgICAgICAgaWYgKHNjaGVtYS5pbmRleE9mKCcuJykgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IHNjaGVtYS5zcGxpdCgnLicpO1xyXG4gICAgICAgICAgICBsZXQgaXRlbSA9IGRhdGE7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGFyci5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGtleSA9IGFycltpXTtcclxuICAgICAgICAgICAgICAgIGlmICghaXRlbVtrZXldKVxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1ba2V5XSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpICE9PSBhcnIubGVuZ3RoIC0gMSlcclxuICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbVtrZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGl0ZW1ba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhO1xyXG59XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0VmFsdWU8VCwgVT4oc2NoZW1hOiBzdHJpbmcsIGRhdGE6IFQsIHR5cGU6IHN0cmluZyk6IFUge1xyXG4gICAgaWYgKCFzY2hlbWEgfHwgIWRhdGEgfHwgKGRhdGEgJiYgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwICYmIGRhdGEuY29uc3RydWN0b3IgPT09IE9iamVjdCkpIHJldHVybjtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBldmFsRnVuYyA9IG5ldyBGdW5jdGlvbignZGF0YScsIGByZXR1cm4gZGF0YS4ke3NjaGVtYX07YCk7XHJcbiAgICAgIHJldHVybiBIZWxwZXJTZXJ2aWNlLnJlc29sdmVUeXBlKGV2YWxGdW5jKGRhdGEpLCB0eXBlKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmFsaWRhdG9ycyhcclxuICAgIGNvbXBvbmVudFJlc29sdmVyU2VydmljZTogQ29tcG9uZW50UmVzb2x2ZXJTZXJ2aWNlLFxyXG4gICAgY29tcG9uZW50OiBGb3JtQ29tcG9uZW50PGFueT4sXHJcbiAgICBjb250cm9sOiBGb3JtQ29udHJvbFxyXG4gICk6IEZvcm1Db250cm9sIHtcclxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGNvbXBvbmVudFJlc29sdmVyU2VydmljZS5yZXNvbHZlQ29tcG9uZW50KGNvbXBvbmVudC5jb21wb25lbnROYW1lKTtcclxuXHJcbiAgICBpZiAoIWNvbXBvbmVudFJlZikgcmV0dXJuIGNvbnRyb2w7XHJcblxyXG4gICAgY29uc3QgdHlwZSA9IGNvbXBvbmVudFJlZi5jb21wb25lbnRUeXBlO1xyXG5cclxuICAgIGlmICh0eXBlICYmICghdHlwZVsndmFsaWRhdG9ycyddIHx8ICh0eXBlWyd2YWxpZGF0b3JzJ10gJiYgdHlwZVsndmFsaWRhdG9ycyddLmxlbmd0aCA9PT0gMCkpKSByZXR1cm4gY29udHJvbDtcclxuXHJcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XHJcbiAgICBjb25zdCBydWxlcyA9IGNvbXBvbmVudC5ydWxlcztcclxuICAgIGlmIChydWxlcyAhPSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IEZvcm1WYWxpZGF0b3JzID0gPEFycmF5PEZvcm1WYWxpZGF0b3I+PnR5cGVbJ3ZhbGlkYXRvcnMnXTtcclxuICAgICAgT2JqZWN0LmtleXMocnVsZXMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBydWxlc1trZXldO1xyXG4gICAgICAgIGlmIChpdGVtLnZhbHVlICYmIGl0ZW0ua2V5ICE9PSAncmVhZG9ubHknICYmIGl0ZW0ua2V5ICE9PSAnaGlkZGVuJyAmJiBpdGVtLmtleSAhPT0gJ3ZhbHVlJykge1xyXG4gICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gRm9ybVZhbGlkYXRvcnMuZmluZCgoeCkgPT4geC5rZXkgPT09IGl0ZW0ua2V5KTtcclxuICAgICAgICAgIGlmICh2YWxpZGF0b3IgJiYgdmFsaWRhdG9yLnZhbGlkYXRvcikgdmFsaWRhdG9ycy5wdXNoKHZhbGlkYXRvci52YWxpZGF0b3IpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS52YWx1ZSAmJiBpdGVtLmtleSA9PT0gJ3JlYWRvbmx5JyAmJiBjb250cm9sLmVuYWJsZWQpIGNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGNvbnRyb2wuZGlzYWJsZWQgJiZcclxuICAgICAgICAoIXJ1bGVzIHx8IChydWxlcyAmJiAhcnVsZXMucmVhZG9ubHkpIHx8IChydWxlcyAmJiBydWxlcy5yZWFkb25seSAmJiAhcnVsZXMucmVhZG9ubHkudmFsdWUpKVxyXG4gICAgICApXHJcbiAgICAgICAgY29udHJvbC5lbmFibGUoKTtcclxuICAgIH1cclxuICAgIGlmICh2YWxpZGF0b3JzLmxlbmd0aCA+IDApIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcclxuXHJcbiAgICByZXR1cm4gY29udHJvbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlUmVhY3RpdmVGb3JtU3RydWN0dXJlPFQ+KGZvcm06IEZvcm1XaW5kb3csIGluaXRpYWxpc2VEYXRhID0gdHJ1ZSwgZGF0YTogVCA9IG51bGwpIHtcclxuICAgIGNvbnN0IGZvcm1Db250cm9scyA9IHt9IGFzIEZvcm1Db250cm9scztcclxuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB7fSBhcyBGb3JtQ29tcG9uZW50cztcclxuICAgIGNvbnN0IHBhZ2VHcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgZm9ybS5wYWdlcy5mb3JFYWNoKChwYWdlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlY3Rpb25Hcm91cDogYW55ID0ge307XHJcbiAgICAgIGlmIChwYWdlLnNlY3Rpb25zICE9IG51bGwpXHJcbiAgICAgICAgcGFnZS5zZWN0aW9ucy5mb3JFYWNoKChzZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRHcm91cDogYW55ID0ge307XHJcbiAgICAgICAgICBpZiAoc2VjdGlvbi5jb21wb25lbnRzICE9IG51bGwpXHJcbiAgICAgICAgICAgIHNlY3Rpb24uY29tcG9uZW50cy5mb3JFYWNoKChjb21wb25lbnQpID0+IHtcclxuICAgICAgICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudC5jb21wb25lbnRJZF0gPSBjb21wb25lbnQ7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc2luZ2xlQ29tcG9uZW50R3JvdXAgPSBuZXcgRm9ybUNvbnRyb2woKTtcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbHNbY29tcG9uZW50LmNvbXBvbmVudElkXSA9IHNpbmdsZUNvbXBvbmVudEdyb3VwO1xyXG4gICAgICAgICAgICAgIGNvbXBvbmVudEdyb3VwW2NvbXBvbmVudC5jb21wb25lbnRJZF0gPSBzaW5nbGVDb21wb25lbnRHcm91cDtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGluaXRpYWxpc2VEYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGRhdGEgPSB7fSBhcyBUO1xyXG5cclxuICAgICAgICAgICAgICAgIGRhdGEgPSBIZWxwZXJTZXJ2aWNlLmluc3RhbnRpYXRlRGF0YShkYXRhLCBjb21wb25lbnQuc2NoZW1hKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZShjb21wb25lbnQuc2NoZW1hLCBkYXRhLCBjb21wb25lbnQudHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sc1tjb21wb25lbnQuY29tcG9uZW50SWRdLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgc2VjdGlvbkdyb3VwW3NlY3Rpb24uc2VjdGlvbklkXSA9IG5ldyBGb3JtR3JvdXAoY29tcG9uZW50R3JvdXApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICBwYWdlR3JvdXBbcGFnZS5wYWdlSWRdID0gbmV3IEZvcm1Hcm91cChzZWN0aW9uR3JvdXApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4geyBwYWdlR3JvdXA6IHBhZ2VHcm91cCwgZm9ybUNvbnRyb2xzOiBmb3JtQ29udHJvbHMsIGNvbXBvbmVudHM6IGNvbXBvbmVudHMsIGRhdGE6IGRhdGEgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaW5zdGFudGlhdGVEYXRhPFQ+KGRhdGE6IFQsIHNjaGVtYTogc3RyaW5nKTogVCB7XHJcbiAgICBpZiAoc2NoZW1hICYmIHNjaGVtYS5pbmRleE9mKCcuJykgIT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IGFyciA9IHNjaGVtYS5zcGxpdCgnLicpO1xyXG4gICAgICBsZXQgaXRlbSA9IGRhdGE7XHJcbiAgICAgIGxldCBrZXkgPSAnJztcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gYXJyLmxlbmd0aCAtIDI7IGkrKykge1xyXG4gICAgICAgIGtleSA9IGFycltpXTtcclxuICAgICAgICBpZiAoIWl0ZW1ba2V5XSkgaXRlbVtrZXldID0ge307XHJcblxyXG4gICAgICAgIGlmIChpICE9PSBhcnIubGVuZ3RoIC0gMikgaXRlbSA9IGl0ZW1ba2V5XTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGRlZXBDb3B5KG9sZE9iajogYW55LCBpZ25vcmVQcm9wZXJ0eTogQXJyYXk8c3RyaW5nPiA9IG51bGwpIHtcclxuICAgIGxldCBuZXdPYmogPSBvbGRPYmo7XHJcbiAgICBpZiAob2xkT2JqICYmIHR5cGVvZiBvbGRPYmogPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIG5ld09iaiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvbGRPYmopID09PSAnW29iamVjdCBBcnJheV0nID8gW10gOiB7fTtcclxuICAgICAgZm9yIChjb25zdCBpIGluIG9sZE9iailcclxuICAgICAgICBpZiAoIWlnbm9yZVByb3BlcnR5IHx8IChpZ25vcmVQcm9wZXJ0eSAmJiAhaWdub3JlUHJvcGVydHkuZmluZCgocCkgPT4gcCA9PT0gaSkpKVxyXG4gICAgICAgICAgbmV3T2JqW2ldID0gdGhpcy5kZWVwQ29weShvbGRPYmpbaV0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld09iajtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcHJvcGVydHlDb3B5KHNvdXJjZTogYW55LCB0YXJnZXQ6IGFueSwgaWdub3JlUHJvcGVydGllczogQXJyYXk8c3RyaW5nPiA9IG51bGwpIHtcclxuICAgIGlmIChzb3VyY2UgJiYgdHlwZW9mIHNvdXJjZSA9PT0gJ29iamVjdCcpXHJcbiAgICAgIGZvciAoY29uc3QgaSBpbiBzb3VyY2UpXHJcbiAgICAgICAgaWYgKCFpZ25vcmVQcm9wZXJ0aWVzIHx8IChpZ25vcmVQcm9wZXJ0aWVzICYmICFpZ25vcmVQcm9wZXJ0aWVzLmZpbmQoKHApID0+IHAgPT09IGkpKSlcclxuICAgICAgICAgIGlmIChzb3VyY2VbaV0gJiYgdHlwZW9mIHNvdXJjZVtpXSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgaWYgKCF0YXJnZXRbaV0pIHRhcmdldFtpXSA9IHt9O1xyXG4gICAgICAgICAgICB0YXJnZXRbaV0gPSB0aGlzLnByb3BlcnR5Q29weShzb3VyY2VbaV0sIHRhcmdldFtpXSk7XHJcbiAgICAgICAgICB9IGVsc2UgdGFyZ2V0W2ldID0gc291cmNlW2ldO1xyXG4gICAgICAgIGVsc2UgY29uc29sZS5sb2coYHByb3BlcnR5Q29weSBmdW5jdGlvbiBkb2Vzbid0IHN1cHBvcnQgcHJpbWl0aXZlc2ApO1xyXG5cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGZvcm1hdEZvckdyYXBoUWwob2JqOiBhbnkpIHtcclxuICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gdGhpcy5kZWVwQ29weShvYmopO1xyXG5cclxuICAgIGlmICh1cGRhdGVkRGF0YVsnX190eXBlbmFtZSddKSBkZWxldGUgdXBkYXRlZERhdGFbJ19fdHlwZW5hbWUnXTtcclxuXHJcbiAgICBsZXQgZGF0YUZvclF1ZXJ5ID0gJyc7XHJcblxyXG4gICAgT2JqZWN0LmtleXModXBkYXRlZERhdGEpLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xyXG4gICAgICBpZiAodXBkYXRlZERhdGFbZmllbGROYW1lXSA9PSBudWxsKSBkYXRhRm9yUXVlcnkgKz0gZmllbGROYW1lICsgJzogbnVsbCwnO1xyXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdXBkYXRlZERhdGFbZmllbGROYW1lXSA9PT0gJ29iamVjdCcpXHJcbiAgICAgICAgZGF0YUZvclF1ZXJ5ICs9IHRoaXMuZm9ybWF0Rm9yR3JhcGhRbCh1cGRhdGVkRGF0YVtmaWVsZE5hbWVdKTtcclxuICAgICAgZWxzZSBpZiAodHlwZW9mIHVwZGF0ZWREYXRhW2ZpZWxkTmFtZV0gPT09ICdudW1iZXInIHx8IHR5cGVvZiB1cGRhdGVkRGF0YVtmaWVsZE5hbWVdID09PSAnYm9vbGVhbicpXHJcbiAgICAgICAgZGF0YUZvclF1ZXJ5ICs9IGZpZWxkTmFtZSArIGA6JHt1cGRhdGVkRGF0YVtmaWVsZE5hbWVdfSxgO1xyXG4gICAgICBlbHNlIGRhdGFGb3JRdWVyeSArPSBmaWVsZE5hbWUgKyBgOlxcXCIke3VwZGF0ZWREYXRhW2ZpZWxkTmFtZV19LGA7XHJcbiAgICB9KTtcclxuICAgIGRhdGFGb3JRdWVyeSA9IGB7JHtkYXRhRm9yUXVlcnkuc2xpY2UoMCwgLTEpfX1gO1xyXG4gICAgcmV0dXJuIGRhdGFGb3JRdWVyeTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZm9ybWF0RXJyb3IoZXJyb3I6IEZvcm1FcnJvcikge1xyXG4gICAgaWYgKCFlcnJvcikgcmV0dXJuO1xyXG5cclxuICAgIGlmIChlcnJvci5lcnJvciAmJiBlcnJvci5lcnJvci5tZXNzYWdlKSBlcnJvci5tZXNzYWdlID0gZXJyb3IuZXJyb3IubWVzc2FnZTtcclxuXHJcbiAgICByZXR1cm4gZXJyb3I7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlc29sdmVUeXBlKHZhbHVlOiBhbnksIHR5cGU6IHN0cmluZykge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gbnVsbDtcclxuICAgIGVsc2UgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHJldHVybiAwO1xyXG5cclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlICdudW1iZXInOlxyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1teXFxkXFwuXS9nLCAnJyk7XHJcblxyXG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIG1hc2tUb0FycmF5KG1hc2s6IHN0cmluZykge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gW107XHJcbiAgICBpZiAobWFzaykge1xyXG4gICAgICBjb25zdCBtYXNrVHJpbW1lZCA9IG1hc2sudHJpbSgpLnN1YnN0cmluZygxKS5zbGljZSgwLCAtMSkucmVwbGFjZSgnXFxcXFxcXFwnLCAnXFxcXCcpO1xyXG4gICAgICBjb25zdCBhcnJ5ID0gbWFza1RyaW1tZWQuc3BsaXQoJywnKTtcclxuICAgICAgYXJyeS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2goaXRlbS50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJykucmVwbGFjZSgvXFwnL2csICcnKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlVGVtcGxhdGVzKGZvcm06IEZvcm1XaW5kb3cpOiBGb3JtV2luZG93IHtcclxuICAgIGZvcm0ucGFnZXMuZm9yRWFjaCgocGFnZSkgPT4ge1xyXG4gICAgICBwYWdlLnRlbXBsYXRlLnJlUmVuZGVyID0gZmFsc2U7XHJcbiAgICAgIHBhZ2UudGVtcGxhdGUgPSBIZWxwZXJTZXJ2aWNlLmRlZXBDb3B5KHBhZ2UudGVtcGxhdGUpO1xyXG4gICAgICBwYWdlLnNlY3Rpb25zLmZvckVhY2goKHNlY3Rpb24pID0+IHtcclxuICAgICAgICBzZWN0aW9uLnRlbXBsYXRlLnJlUmVuZGVyID0gZmFsc2U7XHJcbiAgICAgICAgc2VjdGlvbi50ZW1wbGF0ZSA9IEhlbHBlclNlcnZpY2UuZGVlcENvcHkoc2VjdGlvbi50ZW1wbGF0ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZm9ybTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRWYWxpZGF0b3JzKFxyXG4gICAgY29tcG9uZW50czogRm9ybUNvbXBvbmVudHMsXHJcbiAgICBmb3JtQ29udHJvbHM6IEZvcm1Db250cm9scyxcclxuICAgIGNvbXBvbmVudFJlc29sdmVyU2VydmljZTogQ29tcG9uZW50UmVzb2x2ZXJTZXJ2aWNlXHJcbiAgKTogRm9ybUNvbnRyb2xzIHtcclxuICAgIGlmIChjb21wb25lbnRzICYmIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmxlbmd0aCA+IDApXHJcbiAgICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNba2V5XTtcclxuICAgICAgICBpZiAoY29tcG9uZW50KSB7XHJcbiAgICAgICAgICBsZXQgY29tcG9uZW50Q29udHJvbCA9IGZvcm1Db250cm9sc1tjb21wb25lbnQuY29tcG9uZW50SWRdO1xyXG4gICAgICAgICAgaWYgKGNvbXBvbmVudENvbnRyb2wpXHJcbiAgICAgICAgICAgIGNvbXBvbmVudENvbnRyb2wgPSBIZWxwZXJTZXJ2aWNlLnNldFZhbGlkYXRvcnMoY29tcG9uZW50UmVzb2x2ZXJTZXJ2aWNlLCBjb21wb25lbnQsIGNvbXBvbmVudENvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICByZXR1cm4gZm9ybUNvbnRyb2xzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB2YWxpZGF0ZUZvcm0oZm9ybUdyb3VwOiBGb3JtR3JvdXApIHtcclxuICAgIE9iamVjdC5rZXlzKGZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZmllbGQpO1xyXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSBjb250cm9sLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcclxuICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkgdGhpcy52YWxpZGF0ZUZvcm0oY29udHJvbCk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19