@formql/core
Version:
FormQL - A framework for building dynamic forms
308 lines • 43.9 kB
JavaScript
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