UNPKG

@ng-flexy/form

Version:

Flexy components and tools to build Angular 8+ applications

215 lines 27.7 kB
import { FormArray, FormControl } from '@angular/forms'; import { get, has, merge, set } from 'lodash'; import * as jsonata_ from 'jsonata'; const jsonata = jsonata_; const ifExpressionsCache = {}; const calculatedExpresionCache = {}; export var FlexyFormDataMode; (function (FlexyFormDataMode) { FlexyFormDataMode["All"] = "all"; FlexyFormDataMode["Dirty"] = "dirty"; FlexyFormDataMode["Touched"] = "toched"; })(FlexyFormDataMode || (FlexyFormDataMode = {})); export function findErrors(schema, currentData) { const errors = {}; for (const item of schema) { if (checkIf(item, currentData) && item.items) { item.items.forEach((aItem, index) => { const arrItemError = findErrors([aItem], currentData); if (arrItemError && Object.values(arrItemError).length) { errors[item.formName + '.' + index] = arrItemError; } }); } else if (checkIf(item, currentData) && item.formName && item.formControl && item.formControl.invalid) { errors[item.formName] = item.formControl.errors; } if (checkIf(item, currentData) && item.children) { Object.assign(errors, findErrors(item.children, currentData)); } } return errors; } export function findSchema(fieldName, schema) { for (const item of schema) { if (item.formName && item.formName === fieldName) { return item; } else if (item.children) { const childSchema = findSchema(fieldName, item.children); if (childSchema) { return childSchema; } } } return null; } export function calculate(calcExp, data) { let value; try { if (!calculatedExpresionCache[calcExp]) { calculatedExpresionCache[calcExp] = jsonata(calcExp); } value = calculatedExpresionCache[calcExp].evaluate(data); } catch (e) { // console.error(e); value = null; } return value; } export function getSchemaData(schemas, currentData, mode = FlexyFormDataMode.All) { let data = {}; if (schemas) { schemas.forEach(schema => { const fieldSchema = schema; if (checkIf(fieldSchema, currentData)) { const isFormControl = fieldSchema.formControl && fieldSchema.formName; if (isFormControl && fieldSchema.formControl instanceof FormControl) { if (checkSchemaData(fieldSchema.formControl, mode)) { set(data, fieldSchema.formName, fieldSchema.formControl.value); } } else if (isFormControl && fieldSchema.formControl instanceof FormArray) { const arrayData = getArrayData(fieldSchema, currentData, mode, data); if (mode === FlexyFormDataMode.All) { set(data, fieldSchema.formName, Object.values(arrayData)); } else if (!isInputEmpty(arrayData)) { set(data, fieldSchema.formName, arrayData); } } if (checkIf(fieldSchema, currentData)) { data = merge(data, getSchemaData(fieldSchema.children, currentData, mode)); } } }); } return data; } export function findRemoved(allData, originalData) { const removed = {}; if (originalData) { Object.keys(originalData).forEach(key => { const path = key; if (!isInputEmpty(originalData[key]) && isInputEmpty(allData[key])) { set(removed, path, null); } else if (originalData[key] && Array.isArray(originalData[key])) { originalData[key].forEach((item, index) => { if (!isInputEmpty(item) && isInputEmpty(allData[key][index])) { if (!has(removed, path)) { set(removed, path, {}); } const v = get(removed, path); v['' + index] = null; } else if (item && isObject(item)) { const founded = findRemoved(allData[key][index], item); if (founded && !isInputEmpty(founded)) { if (!has(removed, path)) { set(removed, path, {}); } const v = get(removed, path); v['' + index] = founded; } } }); } else if (originalData[key] && isObject(originalData[key])) { const founded = findRemoved(allData[key], originalData[key]); if (founded && !isInputEmpty(founded)) { set(removed, path, founded); } } }); } return removed; } export function clearEmptyArrayAndObjects(data) { if (data) { if (isObject(data)) { Object.keys(data).forEach(key => { if (isEmptyStructure(data[key])) { delete data[key]; } else if (isObject(data[key])) { clearEmptyArrayAndObjects(data[key]); } }); } } } function isObject(a) { return !!a && a.constructor === Object; } function checkIf(fieldSchema, currentData) { if (!fieldSchema.if) { return true; } const ifName = 'IF_' + fieldSchema.if; let ret; try { if (!ifExpressionsCache[ifName]) { ifExpressionsCache[ifName] = jsonata(fieldSchema.if); } ret = ifExpressionsCache[ifName].evaluate(currentData ? currentData : {}); } catch (e) { // console.error(e); ret = null; } return !!ret; } function getArrayData(fieldSchema, currentData, mode, data) { const arrayData = {}; fieldSchema.items.forEach((item, index) => { const itemFormControl = item.formControl; if (!itemFormControl || checkSchemaData(itemFormControl, mode)) { if (item.children) { const itemData = getSchemaData(item.children, currentData, mode); if (!isInputEmpty(itemData)) { arrayData['' + index] = itemData; } } else { arrayData['' + index] = item.formControl.value; } } }); return arrayData; } function checkSchemaData(control, mode) { return (control && (mode === FlexyFormDataMode.All || (mode === FlexyFormDataMode.Dirty && control.dirty) || (mode === FlexyFormDataMode.Touched && control.touched))); } function isInputEmpty(v) { return v === void 0 || v === ''; } function isEmptyStructure(data) { let ret = true; if (Array.isArray(data)) { if (data.length > 0) { data.forEach(item => { ret = ret && isEmptyStructure(item); }); } } else if (isObject(data)) { if (Object.keys(data).length > 0) { Object.keys(data).forEach(key => { ret = ret && isEmptyStructure(data[key]); }); } } else { return isInputEmpty(data); } return ret; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9tb2RlbHMvZm9ybS51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQW1CLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxRQUFRLE1BQU0sU0FBUyxDQUFDO0FBRXBDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUV6QixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUVwQyxNQUFNLENBQU4sSUFBWSxpQkFJWDtBQUpELFdBQVksaUJBQWlCO0lBQzNCLGdDQUFXLENBQUE7SUFDWCxvQ0FBZSxDQUFBO0lBQ2YsdUNBQWtCLENBQUE7QUFDcEIsQ0FBQyxFQUpXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFJNUI7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLE1BQStCLEVBQUUsV0FBMEI7SUFDcEYsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO1FBQ3pCLElBQUksT0FBTyxDQUFDLElBQWtDLEVBQUUsV0FBVyxDQUFDLElBQUssSUFBbUMsQ0FBQyxLQUFLLEVBQUU7WUFDekcsSUFBbUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNsRSxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxZQUFZLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENB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QU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDOUIsR0FBRyxHQUFHLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxDQUFDLENBQUMsQ0FBQztTQUNKO0tBQ0Y7U0FBTTtRQUNMLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzNCO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEsIEZsZXh5Rm9ybUxheW91dFNjaGVtYSB9IGZyb20gJy4vbGF5b3V0LXNjaGVtYS5tb2RlbCc7XG5pbXBvcnQgeyBGbGV4eUZvcm1EYXRhIH0gZnJvbSAnLi9mb3JtLmRhdGEnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZ2V0LCBoYXMsIG1lcmdlLCBzZXQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMganNvbmF0YV8gZnJvbSAnanNvbmF0YSc7XG5cbmNvbnN0IGpzb25hdGEgPSBqc29uYXRhXztcblxuY29uc3QgaWZFeHByZXNzaW9uc0NhY2hlID0ge307XG5jb25zdCBjYWxjdWxhdGVkRXhwcmVzaW9uQ2FjaGUgPSB7fTtcblxuZXhwb3J0IGVudW0gRmxleHlGb3JtRGF0YU1vZGUge1xuICBBbGwgPSAnYWxsJyxcbiAgRGlydHkgPSAnZGlydHknLFxuICBUb3VjaGVkID0gJ3RvY2hlZCdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRFcnJvcnMoc2NoZW1hOiBGbGV4eUZvcm1MYXlvdXRTY2hlbWFbXSwgY3VycmVudERhdGE6IEZsZXh5Rm9ybURhdGEpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgY29uc3QgZXJyb3JzID0ge307XG4gIGZvciAoY29uc3QgaXRlbSBvZiBzY2hlbWEpIHtcbiAgICBpZiAoY2hlY2tJZihpdGVtIGFzIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hLCBjdXJyZW50RGF0YSkgJiYgKGl0ZW0gYXMgRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEpLml0ZW1zKSB7XG4gICAgICAoaXRlbSBhcyBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSkuaXRlbXMuZm9yRWFjaCgoYUl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGFyckl0ZW1FcnJvciA9IGZpbmRFcnJvcnMoW2FJdGVtXSwgY3VycmVudERhdGEpO1xuICAgICAgICBpZiAoYXJySXRlbUVycm9yICYmIE9iamVjdC52YWx1ZXMoYXJySXRlbUVycm9yKS5sZW5ndGgpIHtcbiAgICAgICAgICBlcnJvcnNbKGl0ZW0gYXMgRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEpLmZvcm1OYW1lICsgJy4nICsgaW5kZXhdID0gYXJySXRlbUVycm9yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY2hlY2tJZihpdGVtIGFzIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hLCBjdXJyZW50RGF0YSkgJiZcbiAgICAgIChpdGVtIGFzIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hKS5mb3JtTmFtZSAmJlxuICAgICAgKGl0ZW0gYXMgRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEpLmZvcm1Db250cm9sICYmXG4gICAgICAoaXRlbSBhcyBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSkuZm9ybUNvbnRyb2wuaW52YWxpZFxuICAgICkge1xuICAgICAgZXJyb3JzWyhpdGVtIGFzIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hKS5mb3JtTmFtZV0gPSAoaXRlbSBhcyBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSkuZm9ybUNvbnRyb2wuZXJyb3JzO1xuICAgIH1cbiAgICBpZiAoY2hlY2tJZihpdGVtIGFzIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hLCBjdXJyZW50RGF0YSkgJiYgaXRlbS5jaGlsZHJlbikge1xuICAgICAgT2JqZWN0LmFzc2lnbihlcnJvcnMsIGZpbmRFcnJvcnMoaXRlbS5jaGlsZHJlbiwgY3VycmVudERhdGEpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTY2hlbWEoZmllbGROYW1lOiBzdHJpbmcsIHNjaGVtYTogRmxleHlGb3JtTGF5b3V0U2NoZW1hW10pOiBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSB7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBzY2hlbWEpIHtcbiAgICBpZiAoKGl0ZW0gYXMgRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEpLmZvcm1OYW1lICYmIChpdGVtIGFzIEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hKS5mb3JtTmFtZSA9PT0gZmllbGROYW1lKSB7XG4gICAgICByZXR1cm4gaXRlbSBhcyBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkU2NoZW1hID0gZmluZFNjaGVtYShmaWVsZE5hbWUsIGl0ZW0uY2hpbGRyZW4pO1xuICAgICAgaWYgKGNoaWxkU2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBjaGlsZFNjaGVtYTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGUoY2FsY0V4cDogc3RyaW5nLCBkYXRhOiBhbnkpIHtcbiAgbGV0IHZhbHVlO1xuICB0cnkge1xuICAgIGlmICghY2FsY3VsYXRlZEV4cHJlc2lvbkNhY2hlW2NhbGNFeHBdKSB7XG4gICAgICBjYWxjdWxhdGVkRXhwcmVzaW9uQ2FjaGVbY2FsY0V4cF0gPSBqc29uYXRhKGNhbGNFeHApO1xuICAgIH1cbiAgICB2YWx1ZSA9IGNhbGN1bGF0ZWRFeHByZXNpb25DYWNoZVtjYWxjRXhwXS5ldmFsdWF0ZShkYXRhKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgdmFsdWUgPSBudWxsO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaGVtYURhdGEoc2NoZW1hczogRmxleHlGb3JtTGF5b3V0U2NoZW1hW10sIGN1cnJlbnREYXRhOiBGbGV4eUZvcm1EYXRhLCBtb2RlID0gRmxleHlGb3JtRGF0YU1vZGUuQWxsKTogRmxleHlGb3JtRGF0YSB7XG4gIGxldCBkYXRhOiBGbGV4eUZvcm1EYXRhID0ge307XG4gIGlmIChzY2hlbWFzKSB7XG4gICAgc2NoZW1hcy5mb3JFYWNoKHNjaGVtYSA9PiB7XG4gICAgICBjb25zdCBmaWVsZFNjaGVtYTogRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEgPSBzY2hlbWEgYXMgRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWE7XG4gICAgICBpZiAoY2hlY2tJZihmaWVsZFNjaGVtYSwgY3VycmVudERhdGEpKSB7XG4gICAgICAgIGNvbnN0IGlzRm9ybUNvbnRyb2wgPSBmaWVsZFNjaGVtYS5mb3JtQ29udHJvbCAmJiBmaWVsZFNjaGVtYS5mb3JtTmFtZTtcbiAgICAgICAgaWYgKGlzRm9ybUNvbnRyb2wgJiYgZmllbGRTY2hlbWEuZm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgICAgIGlmIChjaGVja1NjaGVtYURhdGEoZmllbGRTY2hlbWEuZm9ybUNvbnRyb2wsIG1vZGUpKSB7XG4gICAgICAgICAgICBzZXQoZGF0YSwgZmllbGRTY2hlbWEuZm9ybU5hbWUsIGZpZWxkU2NoZW1hLmZvcm1Db250cm9sLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNGb3JtQ29udHJvbCAmJiBmaWVsZFNjaGVtYS5mb3JtQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgIGNvbnN0IGFycmF5RGF0YSA9IGdldEFycmF5RGF0YShmaWVsZFNjaGVtYSwgY3VycmVudERhdGEsIG1vZGUsIGRhdGEpO1xuXG4gICAgICAgICAgaWYgKG1vZGUgPT09IEZsZXh5Rm9ybURhdGFNb2RlLkFsbCkge1xuICAgICAgICAgICAgc2V0KGRhdGEsIGZpZWxkU2NoZW1hLmZvcm1OYW1lLCBPYmplY3QudmFsdWVzKGFycmF5RGF0YSkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWlzSW5wdXRFbXB0eShhcnJheURhdGEpKSB7XG4gICAgICAgICAgICBzZXQoZGF0YSwgZmllbGRTY2hlbWEuZm9ybU5hbWUsIGFycmF5RGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrSWYoZmllbGRTY2hlbWEsIGN1cnJlbnREYXRhKSkge1xuICAgICAgICAgIGRhdGEgPSBtZXJnZShkYXRhLCBnZXRTY2hlbWFEYXRhKGZpZWxkU2NoZW1hLmNoaWxkcmVuLCBjdXJyZW50RGF0YSwgbW9kZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUmVtb3ZlZChhbGxEYXRhLCBvcmlnaW5hbERhdGEpIHtcbiAgY29uc3QgcmVtb3ZlZCA9IHt9O1xuICBpZiAob3JpZ2luYWxEYXRhKSB7XG4gICAgT2JqZWN0LmtleXMob3JpZ2luYWxEYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0ga2V5O1xuICAgICAgaWYgKCFpc0lucHV0RW1wdHkob3JpZ2luYWxEYXRhW2tleV0pICYmIGlzSW5wdXRFbXB0eShhbGxEYXRhW2tleV0pKSB7XG4gICAgICAgIHNldChyZW1vdmVkLCBwYXRoLCBudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAob3JpZ2luYWxEYXRhW2tleV0gJiYgQXJyYXkuaXNBcnJheShvcmlnaW5hbERhdGFba2V5XSkpIHtcbiAgICAgICAgb3JpZ2luYWxEYXRhW2tleV0uZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoIWlzSW5wdXRFbXB0eShpdGVtKSAmJiBpc0lucHV0RW1wdHkoYWxsRGF0YVtrZXldW2luZGV4XSkpIHtcbiAgICAgICAgICAgIGlmICghaGFzKHJlbW92ZWQsIHBhdGgpKSB7XG4gICAgICAgICAgICAgIHNldChyZW1vdmVkLCBwYXRoLCB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2ID0gZ2V0KHJlbW92ZWQsIHBhdGgpO1xuICAgICAgICAgICAgdlsnJyArIGluZGV4XSA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIGlmIChpdGVtICYmIGlzT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZGVkID0gZmluZFJlbW92ZWQoYWxsRGF0YVtrZXldW2luZGV4XSwgaXRlbSk7XG4gICAgICAgICAgICBpZiAoZm91bmRlZCAmJiAhaXNJbnB1dEVtcHR5KGZvdW5kZWQpKSB7XG4gICAgICAgICAgICAgIGlmICghaGFzKHJlbW92ZWQsIHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgc2V0KHJlbW92ZWQsIHBhdGgsIHt9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCB2ID0gZ2V0KHJlbW92ZWQsIHBhdGgpO1xuICAgICAgICAgICAgICB2WycnICsgaW5kZXhdID0gZm91bmRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbERhdGFba2V5XSAmJiBpc09iamVjdChvcmlnaW5hbERhdGFba2V5XSkpIHtcbiAgICAgICAgY29uc3QgZm91bmRlZCA9IGZpbmRSZW1vdmVkKGFsbERhdGFba2V5XSwgb3JpZ2luYWxEYXRhW2tleV0pO1xuICAgICAgICBpZiAoZm91bmRlZCAmJiAhaXNJbnB1dEVtcHR5KGZvdW5kZWQpKSB7XG4gICAgICAgICAgc2V0KHJlbW92ZWQsIHBhdGgsIGZvdW5kZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckVtcHR5QXJyYXlBbmRPYmplY3RzKGRhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgaWYgKGRhdGEpIHtcbiAgICBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKGlzRW1wdHlTdHJ1Y3R1cmUoZGF0YVtrZXldKSkge1xuICAgICAgICAgIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YVtrZXldKSkge1xuICAgICAgICAgIGNsZWFyRW1wdHlBcnJheUFuZE9iamVjdHMoZGF0YVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGEpIHtcbiAgcmV0dXJuICEhYSAmJiBhLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSWYoZmllbGRTY2hlbWE6IEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hLCBjdXJyZW50RGF0YTogRmxleHlGb3JtRGF0YSk6IGJvb2xlYW4ge1xuICBpZiAoIWZpZWxkU2NoZW1hLmlmKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgaWZOYW1lID0gJ0lGXycgKyBmaWVsZFNjaGVtYS5pZjtcbiAgbGV0IHJldDtcbiAgdHJ5IHtcbiAgICBpZiAoIWlmRXhwcmVzc2lvbnNDYWNoZVtpZk5hbWVdKSB7XG4gICAgICBpZkV4cHJlc3Npb25zQ2FjaGVbaWZOYW1lXSA9IGpzb25hdGEoZmllbGRTY2hlbWEuaWYpO1xuICAgIH1cbiAgICByZXQgPSBpZkV4cHJlc3Npb25zQ2FjaGVbaWZOYW1lXS5ldmFsdWF0ZShjdXJyZW50RGF0YSA/IGN1cnJlbnREYXRhIDoge30pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29uc29sZS5lcnJvcihlKTtcbiAgICByZXQgPSBudWxsO1xuICB9XG4gIHJldHVybiAhIXJldDtcbn1cblxuZnVuY3Rpb24gZ2V0QXJyYXlEYXRhKFxuICBmaWVsZFNjaGVtYTogRmxleHlGb3JtRmllbGRMYXlvdXRTY2hlbWEsXG4gIGN1cnJlbnREYXRhOiBGbGV4eUZvcm1EYXRhLFxuICBtb2RlOiBGbGV4eUZvcm1EYXRhTW9kZSxcbiAgZGF0YToge1tuYW1lOiBzdHJpbmddOiBhbnl9XG4pIHtcbiAgY29uc3QgYXJyYXlEYXRhID0ge307XG4gIGZpZWxkU2NoZW1hLml0ZW1zLmZvckVhY2goKGl0ZW06IEZsZXh5Rm9ybUxheW91dFNjaGVtYSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpdGVtRm9ybUNvbnRyb2wgPSAoaXRlbSBhcyBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSkuZm9ybUNvbnRyb2w7XG4gICAgaWYgKCFpdGVtRm9ybUNvbnRyb2wgfHwgY2hlY2tTY2hlbWFEYXRhKGl0ZW1Gb3JtQ29udHJvbCwgbW9kZSkpIHtcbiAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1EYXRhID0gZ2V0U2NoZW1hRGF0YShpdGVtLmNoaWxkcmVuLCBjdXJyZW50RGF0YSwgbW9kZSk7XG4gICAgICAgIGlmICghaXNJbnB1dEVtcHR5KGl0ZW1EYXRhKSkge1xuICAgICAgICAgIGFycmF5RGF0YVsnJyArIGluZGV4XSA9IGl0ZW1EYXRhO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheURhdGFbJycgKyBpbmRleF0gPSAoaXRlbSBhcyBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSkuZm9ybUNvbnRyb2wudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYXJyYXlEYXRhO1xufVxuXG5mdW5jdGlvbiBjaGVja1NjaGVtYURhdGEoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBtb2RlOiBGbGV4eUZvcm1EYXRhTW9kZSkge1xuICByZXR1cm4gKFxuICAgIGNvbnRyb2wgJiZcbiAgICAobW9kZSA9PT0gRmxleHlGb3JtRGF0YU1vZGUuQWxsIHx8XG4gICAgICAobW9kZSA9PT0gRmxleHlGb3JtRGF0YU1vZGUuRGlydHkgJiYgY29udHJvbC5kaXJ0eSkgfHxcbiAgICAgIChtb2RlID09PSBGbGV4eUZvcm1EYXRhTW9kZS5Ub3VjaGVkICYmIGNvbnRyb2wudG91Y2hlZCkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzSW5wdXRFbXB0eSh2KSB7XG4gIHJldHVybiB2ID09PSB2b2lkIDAgfHwgdiA9PT0gJyc7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlTdHJ1Y3R1cmUoZGF0YTogYW55KSB7XG4gIGxldCByZXQgPSB0cnVlO1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIGRhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgcmV0ID0gcmV0ICYmIGlzRW1wdHlTdHJ1Y3R1cmUoaXRlbSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgT2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICByZXQgPSByZXQgJiYgaXNFbXB0eVN0cnVjdHVyZShkYXRhW2tleV0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBpc0lucHV0RW1wdHkoZGF0YSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ==