@pazznetwork/ngx-chat
Version:
[](https://travis-ci.com/pazznetwork/ngx-chat) [](https://coveralls.io/github/pazzn
125 lines • 21.7 kB
JavaScript
import { jid as parseJid } from '@xmpp/jid';
import { xml } from '@xmpp/client';
// implements https://xmpp.org/extensions/xep-0004.html
export const FORM_NS = 'jabber:x:data';
function parseStringValue([valueEl]) {
return valueEl?.getText();
}
function parseMultipleStringValues(valueEls) {
return valueEls.map(el => parseStringValue([el]));
}
function parseJidValue([valueEl]) {
return valueEl && parseJid(valueEl.getText());
}
const valueParsers = {
fixed: parseStringValue,
boolean: ([valueEl]) => {
if (!valueEl) {
return false;
}
const value = valueEl.getText();
return value === '1' || value === 'true';
},
hidden: parseStringValue,
'jid-single': parseJidValue,
'jid-multi': (valueEls) => [
...new Set(valueEls.map(el => parseStringValue([el]))),
]
.map(jidStr => parseJid(jidStr)),
'list-single': parseStringValue,
'list-multi': parseMultipleStringValues,
'text-single': parseStringValue,
'text-private': parseStringValue,
'text-multi': parseMultipleStringValues,
};
export function parseForm(formEl) {
if (formEl.name !== 'x' || formEl.getNS() !== FORM_NS) {
throw new Error(`Provided element is not a form element: elementName=${formEl.name}, xmlns=${formEl.getNS()}, form=${formEl.toString()}`);
}
return {
type: formEl.attrs.type,
title: formEl.getChildText('title') ?? undefined,
instructions: formEl.getChildren('instructions').map(descEl => descEl.getText()),
fields: formEl.getChildren('field')
.map(fieldEl => {
const rawType = fieldEl.attrs.type;
const type = rawType in valueParsers ? rawType : 'text-single';
const { var: variable, label } = fieldEl.attrs;
let options;
if (type === 'list-single' || type === 'list-multi') {
options = fieldEl.getChildren('option').map(optionEl => ({
value: optionEl.getChildText('value'),
label: optionEl.attrs.label,
}));
}
return {
type,
variable,
label,
description: fieldEl.getChildText('desc') ?? undefined,
required: fieldEl.getChild('required') != null,
value: valueParsers[type](fieldEl.getChildren('value')),
options,
};
}),
};
}
export function getField(form, variable) {
return form.fields.find(field => field.variable === variable) ?? undefined;
}
export function setFieldValue(form, type, variable, value, createField = false) {
let field = form.fields
.find((f) => f.variable === variable);
if (field) {
if (field.type !== type) {
throw new Error(`type mismatch setting field value: variable=${field.variable}, field.type=${field.type}, requested type=${type}`);
}
field.value = value;
return;
}
if (createField) {
field = {
type,
variable,
value,
};
form.fields.push(field);
}
else {
throw new Error(`field for variable not found! variable=${variable}, type=${type}, value=${value}`);
}
}
function serializeTextualField(field) {
return field.value != null ? [field.value] : [];
}
function serializeTextualMultiField(field) {
return field.value;
}
const valueSerializers = {
fixed: serializeTextualField,
boolean: (field) => field.value != null ? [String(field.value)] : [],
hidden: serializeTextualField,
'jid-single': (field) => field.value ? [field.value.toString()] : [],
'jid-multi': (field) => field.value.map(jid => jid.toString()),
'list-single': serializeTextualField,
'list-multi': serializeTextualMultiField,
'text-single': serializeTextualField,
'text-private': serializeTextualField,
'text-multi': serializeTextualMultiField,
};
export function serializeToSubmitForm(form) {
const serializedFields = form.fields
.reduce((collectedFields, field) => {
const serializer = valueSerializers[field.type];
if (!serializer) {
throw new Error(`unknown field type: ${field.type}`);
}
const values = serializer(field);
if (field.variable != null && values.length > 0) {
collectedFields.push([field.variable, values]);
}
return collectedFields;
}, []);
return xml('x', { xmlns: FORM_NS, type: 'submit' }, ...serializedFields.map(([variable, values]) => xml('field', { var: variable }, ...values.map(value => xml('value', {}, value)))));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29yZS9mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxHQUFHLElBQUksUUFBUSxFQUFPLE1BQU0sV0FBVyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbkMsdURBQXVEO0FBRXZELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUM7QUErRXZDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQVk7SUFDMUMsT0FBTyxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQztBQUVELFNBQVMseUJBQXlCLENBQUMsUUFBbUI7SUFDbEQsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFZO0lBQ3ZDLE9BQU8sT0FBTyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsTUFBTSxZQUFZLEdBQUc7SUFDakIsS0FBSyxFQUFFLGdCQUFnQjtJQUN2QixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBWSxFQUFXLEVBQUU7UUFDdkMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLE9BQU8sS0FBSyxLQUFLLEdBQUcsSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDO0lBQzdDLENBQUM7SUFDRCxNQUFNLEVBQUUsZ0JBQWdCO0lBQ3hCLFlBQVksRUFBRSxhQUFhO0lBQzNCLFdBQVcsRUFBRSxDQUFD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QUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUNsRDtRQUVELE9BQU8sZUFBZSxDQUFDO0lBQzNCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVYLE9BQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxFQUM1QyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FDbkIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQ25CLEdBQUcsQ0FDQyxPQUFPLEVBQ1AsRUFBQyxHQUFHLEVBQUUsUUFBUSxFQUFDLEVBQ2YsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FDbEQsQ0FDUixDQUNKLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJ2x0eCc7XG5pbXBvcnQgeyBqaWQgYXMgcGFyc2VKaWQsIEpJRCB9IGZyb20gJ0B4bXBwL2ppZCc7XG5pbXBvcnQgeyB4bWwgfSBmcm9tICdAeG1wcC9jbGllbnQnO1xuXG4vLyBpbXBsZW1lbnRzIGh0dHBzOi8veG1wcC5vcmcvZXh0ZW5zaW9ucy94ZXAtMDAwNC5odG1sXG5cbmV4cG9ydCBjb25zdCBGT1JNX05TID0gJ2phYmJlcjp4OmRhdGEnO1xuXG5leHBvcnQgdHlwZSBGb3JtVHlwZSA9ICdmb3JtJyB8ICdzdWJtaXQnIHwgJ2NhbmNlbCcgfCAncmVzdWx0JztcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtIHtcbiAgICB0eXBlOiBGb3JtVHlwZTtcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICBpbnN0cnVjdGlvbnM6IHN0cmluZ1tdO1xuICAgIGZpZWxkczogRm9ybUZpZWxkW107XG59XG5cbmV4cG9ydCB0eXBlIEZpZWxkVHlwZSA9XG4gICAgfCAnZml4ZWQnXG4gICAgfCAnYm9vbGVhbidcbiAgICB8ICdoaWRkZW4nXG4gICAgfCAnamlkLXNpbmdsZSdcbiAgICB8ICdqaWQtbXVsdGknXG4gICAgfCAnbGlzdC1zaW5nbGUnXG4gICAgfCAnbGlzdC1tdWx0aSdcbiAgICB8ICd0ZXh0LXNpbmdsZSdcbiAgICB8ICd0ZXh0LXByaXZhdGUnXG4gICAgfCAndGV4dC1tdWx0aSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRWYWx1ZVR5cGUge1xuICAgIGZpeGVkOiBzdHJpbmc7XG4gICAgYm9vbGVhbjogYm9vbGVhbjtcbiAgICBoaWRkZW46IHN0cmluZztcbiAgICAnamlkLXNpbmdsZSc6IEpJRDtcbiAgICAnamlkLW11bHRpJzogSklEW107XG4gICAgJ2xpc3Qtc2luZ2xlJzogc3RyaW5nO1xuICAgICdsaXN0LW11bHRpJzogc3RyaW5nW107XG4gICAgJ3RleHQtc2luZ2xlJzogc3RyaW5nO1xuICAgICd0ZXh0LXByaXZhdGUnOiBzdHJpbmc7XG4gICAgJ3RleHQtbXVsdGknOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IHR5cGUgRm9ybUZpZWxkID1cbiAgICB8IEZpeGVkRm9ybUZpZWxkXG4gICAgfCBCb29sZWFuRm9ybUZpZWxkXG4gICAgfCBUZXh0dWFsRm9ybUZpZWxkXG4gICAgfCBKaWRTaW5nbGVGb3JtRmllbGRcbiAgICB8IEppZE11bHRpRm9ybUZpZWxkXG4gICAgfCBMaXN0U2luZ2xlRm9ybUZpZWxkXG4gICAgfCBMaXN0TXVsdGlGb3JtRmllbGRcbiAgICB8IFRleHRNdWx0aUZvcm1GaWVsZDtcblxuZXhwb3J0IGludGVyZmFjZSBGaXhlZEZvcm1GaWVsZCB7XG4gICAgdHlwZTogJ2ZpeGVkJztcbiAgICB2YXJpYWJsZT86IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRm9ybUZpZWxkQmFzZTxURmllbGRUeXBlIGV4dGVuZHMgRmllbGRUeXBlPiB7XG4gICAgdHlwZTogVEZpZWxkVHlwZTtcbiAgICB2YXJpYWJsZTogc3RyaW5nO1xuICAgIGxhYmVsPzogc3RyaW5nO1xuICAgIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB2YWx1ZT86IEZpZWxkVmFsdWVUeXBlW1RGaWVsZFR5cGVdO1xufVxuXG5leHBvcnQgdHlwZSBCb29sZWFuRm9ybUZpZWxkID0gRm9ybUZpZWxkQmFzZTwnYm9vbGVhbic+O1xuZXhwb3J0IHR5cGUgVGV4dHVhbEZvcm1GaWVsZCA9IEZvcm1GaWVsZEJhc2U8J2hpZGRlbicgfCAndGV4dC1zaW5nbGUnIHwgJ3RleHQtcHJpdmF0ZSc+O1xuZXhwb3J0IHR5cGUgSmlkU2luZ2xlRm9ybUZpZWxkID0gRm9ybUZpZWxkQmFzZTwnamlkLXNpbmdsZSc+O1xuZXhwb3J0IHR5cGUgSmlkTXVsdGlGb3JtRmllbGQgPSBGb3JtRmllbGRCYXNlPCdqaWQtbXVsdGknPjtcbmV4cG9ydCB0eXBlIFRleHRNdWx0aUZvcm1GaWVsZCA9IEZvcm1GaWVsZEJhc2U8J3RleHQtbXVsdGknPjtcblxuaW50ZXJmYWNlIExpc3RGb3JtRmllbGQ8VEZpZWxkVHlwZSBleHRlbmRzICdsaXN0LXNpbmdsZScgfCAnbGlzdC1tdWx0aSc+IGV4dGVuZHMgRm9ybUZpZWxkQmFzZTxURmllbGRUeXBlPiB7XG4gICAgb3B0aW9ucz86IEZpZWxkT3B0aW9uW107XG59XG5cbmV4cG9ydCB0eXBlIExpc3RTaW5nbGVGb3JtRmllbGQgPSBMaXN0Rm9ybUZpZWxkPCdsaXN0LXNpbmdsZSc+O1xuZXhwb3J0IHR5cGUgTGlzdE11bHRpRm9ybUZpZWxkID0gTGlzdEZvcm1GaWVsZDwnbGlzdC1tdWx0aSc+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkT3B0aW9uIHtcbiAgICBsYWJlbD86IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBwYXJzZVN0cmluZ1ZhbHVlKFt2YWx1ZUVsXTogRWxlbWVudFtdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWVFbD8uZ2V0VGV4dCgpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU11bHRpcGxlU3RyaW5nVmFsdWVzKHZhbHVlRWxzOiBFbGVtZW50W10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHZhbHVlRWxzLm1hcChlbCA9PiBwYXJzZVN0cmluZ1ZhbHVlKFtlbF0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VKaWRWYWx1ZShbdmFsdWVFbF06IEVsZW1lbnRbXSk6IEpJRCB7XG4gICAgcmV0dXJuIHZhbHVlRWwgJiYgcGFyc2VKaWQodmFsdWVFbC5nZXRUZXh0KCkpO1xufVxuXG5jb25zdCB2YWx1ZVBhcnNlcnMgPSB7XG4gICAgZml4ZWQ6IHBhcnNlU3RyaW5nVmFsdWUsXG4gICAgYm9vbGVhbjogKFt2YWx1ZUVsXTogRWxlbWVudFtdKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICghdmFsdWVFbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVFbC5nZXRUZXh0KCk7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gJzEnIHx8IHZhbHVlID09PSAndHJ1ZSc7XG4gICAgfSxcbiAgICBoaWRkZW46IHBhcnNlU3RyaW5nVmFsdWUsXG4gICAgJ2ppZC1zaW5nbGUnOiBwYXJzZUppZFZhbHVlLFxuICAgICdqaWQtbXVsdGknOiAodmFsdWVFbHM6IEVsZW1lbnRbXSk6IEpJRFtdID0+XG4gICAgICAgIFtcbiAgICAgICAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgICAgICAgICAgdmFsdWVFbHMubWFwKGVsID0+IHBhcnNlU3RyaW5nVmFsdWUoW2VsXSkpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgXVxuICAgICAgICAgICAgLm1hcChqaWRTdHIgPT4gcGFyc2VKaWQoamlkU3RyKSksXG4gICAgJ2xpc3Qtc2luZ2xlJzogcGFyc2VTdHJpbmdWYWx1ZSxcbiAgICAnbGlzdC1tdWx0aSc6IHBhcnNlTXVsdGlwbGVTdHJpbmdWYWx1ZXMsXG4gICAgJ3RleHQtc2luZ2xlJzogcGFyc2VTdHJpbmdWYWx1ZSxcbiAgICAndGV4dC1wcml2YXRlJzogcGFyc2VTdHJpbmdWYWx1ZSxcbiAgICAndGV4dC1tdWx0aSc6IHBhcnNlTXVsdGlwbGVTdHJpbmdWYWx1ZXMsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGb3JtKGZvcm1FbDogRWxlbWVudCk6IEZvcm0ge1xuICAgIGlmIChmb3JtRWwubmFtZSAhPT0gJ3gnIHx8IGZvcm1FbC5nZXROUygpICE9PSBGT1JNX05TKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvdmlkZWQgZWxlbWVudCBpcyBub3QgYSBmb3JtIGVsZW1lbnQ6IGVsZW1lbnROYW1lPSR7Zm9ybUVsLm5hbWV9LCB4bWxucz0ke2Zvcm1FbC5nZXROUygpfSwgZm9ybT0ke2Zvcm1FbC50b1N0cmluZygpfWApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGZvcm1FbC5hdHRycy50eXBlLFxuICAgICAgICB0aXRsZTogZm9ybUVsLmdldENoaWxkVGV4dCgndGl0bGUnKSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGluc3RydWN0aW9uczogZm9ybUVsLmdldENoaWxkcmVuKCdpbnN0cnVjdGlvbnMnKS5tYXAoZGVzY0VsID0+IGRlc2NFbC5nZXRUZXh0KCkpLFxuICAgICAgICBmaWVsZHM6IGZvcm1FbC5nZXRDaGlsZHJlbignZmllbGQnKVxuICAgICAgICAgICAgLm1hcChmaWVsZEVsID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByYXdUeXBlID0gZmllbGRFbC5hdHRycy50eXBlIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gcmF3VHlwZSBpbiB2YWx1ZVBhcnNlcnMgPyByYXdUeXBlIGFzIGtleW9mIHR5cGVvZiB2YWx1ZVBhcnNlcnMgOiAndGV4dC1zaW5nbGUnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHt2YXI6IHZhcmlhYmxlLCBsYWJlbH06IHsgdmFyPzogc3RyaW5nLCBsYWJlbD86IHN0cmluZyB9ID0gZmllbGRFbC5hdHRycztcbiAgICAgICAgICAgICAgICBsZXQgb3B0aW9uczogRmllbGRPcHRpb25bXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2xpc3Qtc2luZ2xlJyB8fCB0eXBlID09PSAnbGlzdC1tdWx0aScpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGZpZWxkRWwuZ2V0Q2hpbGRyZW4oJ29wdGlvbicpLm1hcChvcHRpb25FbCA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbkVsLmdldENoaWxkVGV4dCgndmFsdWUnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBvcHRpb25FbC5hdHRycy5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBmaWVsZEVsLmdldENoaWxkVGV4dCgnZGVzYycpID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZpZWxkRWwuZ2V0Q2hpbGQoJ3JlcXVpcmVkJykgIT0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlUGFyc2Vyc1t0eXBlXShmaWVsZEVsLmdldENoaWxkcmVuKCd2YWx1ZScpKSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICB9IGFzIEZvcm1GaWVsZDtcbiAgICAgICAgICAgIH0pLFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZChmb3JtOiBGb3JtLCB2YXJpYWJsZTogc3RyaW5nKTogRm9ybUZpZWxkIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZm9ybS5maWVsZHMuZmluZChmaWVsZCA9PiBmaWVsZC52YXJpYWJsZSA9PT0gdmFyaWFibGUpID8/IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpZWxkVmFsdWU8VEZpZWxkVHlwZSBleHRlbmRzIEZpZWxkVHlwZSwgVFZhbHVlIGV4dGVuZHMgRmllbGRWYWx1ZVR5cGVbVEZpZWxkVHlwZV0+KFxuICAgIGZvcm06IEZvcm0sXG4gICAgdHlwZTogVEZpZWxkVHlwZSxcbiAgICB2YXJpYWJsZTogc3RyaW5nLFxuICAgIHZhbHVlOiBUVmFsdWUsXG4gICAgY3JlYXRlRmllbGQgPSBmYWxzZSxcbikge1xuICAgIGxldCBmaWVsZCA9IGZvcm0uZmllbGRzXG4gICAgICAgIC5maW5kKChmKSA9PiBmLnZhcmlhYmxlID09PSB2YXJpYWJsZSk7XG5cbiAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgIT09IHR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdHlwZSBtaXNtYXRjaCBzZXR0aW5nIGZpZWxkIHZhbHVlOiB2YXJpYWJsZT0ke2ZpZWxkLnZhcmlhYmxlfSwgZmllbGQudHlwZT0ke2ZpZWxkLnR5cGV9LCByZXF1ZXN0ZWQgdHlwZT0ke3R5cGV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjcmVhdGVGaWVsZCkge1xuICAgICAgICBmaWVsZCA9IHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICB2YXJpYWJsZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICB9IGFzIEZvcm1GaWVsZDtcbiAgICAgICAgZm9ybS5maWVsZHMucHVzaChmaWVsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaWVsZCBmb3IgdmFyaWFibGUgbm90IGZvdW5kISB2YXJpYWJsZT0ke3ZhcmlhYmxlfSwgdHlwZT0ke3R5cGV9LCB2YWx1ZT0ke3ZhbHVlfWApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplVGV4dHVhbEZpZWxkKGZpZWxkOiBUZXh0dWFsRm9ybUZpZWxkIHwgTGlzdFNpbmdsZUZvcm1GaWVsZCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gZmllbGQudmFsdWUgIT0gbnVsbCA/IFtmaWVsZC52YWx1ZV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplVGV4dHVhbE11bHRpRmllbGQoZmllbGQ6IExpc3RNdWx0aUZvcm1GaWVsZCB8IFRleHRNdWx0aUZvcm1GaWVsZCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gZmllbGQudmFsdWU7XG59XG5cbmNvbnN0IHZhbHVlU2VyaWFsaXplcnM6IFJlY29yZDxGaWVsZFR5cGUsIChmaWVsZDogRm9ybUZpZWxkKSA9PiBzdHJpbmdbXT4gPSB7XG4gICAgZml4ZWQ6IHNlcmlhbGl6ZVRleHR1YWxGaWVsZCxcbiAgICBib29sZWFuOiAoZmllbGQ6IEJvb2xlYW5Gb3JtRmllbGQpID0+IGZpZWxkLnZhbHVlICE9IG51bGwgPyBbU3RyaW5nKGZpZWxkLnZhbHVlKV0gOiBbXSxcbiAgICBoaWRkZW46IHNlcmlhbGl6ZVRleHR1YWxGaWVsZCxcbiAgICAnamlkLXNpbmdsZSc6IChmaWVsZDogSmlkU2luZ2xlRm9ybUZpZWxkKSA9PiBmaWVsZC52YWx1ZSA/IFtmaWVsZC52YWx1ZS50b1N0cmluZygpXSA6IFtdLFxuICAgICdqaWQtbXVsdGknOiAoZmllbGQ6IEppZE11bHRpRm9ybUZpZWxkKSA9PiBmaWVsZC52YWx1ZS5tYXAoamlkID0+IGppZC50b1N0cmluZygpKSxcbiAgICAnbGlzdC1zaW5nbGUnOiBzZXJpYWxpemVUZXh0dWFsRmllbGQsXG4gICAgJ2xpc3QtbXVsdGknOiBzZXJpYWxpemVUZXh0dWFsTXVsdGlGaWVsZCxcbiAgICAndGV4dC1zaW5nbGUnOiBzZXJpYWxpemVUZXh0dWFsRmllbGQsXG4gICAgJ3RleHQtcHJpdmF0ZSc6IHNlcmlhbGl6ZVRleHR1YWxGaWVsZCxcbiAgICAndGV4dC1tdWx0aSc6IHNlcmlhbGl6ZVRleHR1YWxNdWx0aUZpZWxkLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVRvU3VibWl0Rm9ybShmb3JtOiBGb3JtKTogRWxlbWVudCB7XG4gICAgY29uc3Qgc2VyaWFsaXplZEZpZWxkcyA9IGZvcm0uZmllbGRzXG4gICAgICAgIC5yZWR1Y2U8W3N0cmluZywgc3RyaW5nW11dW10+KChjb2xsZWN0ZWRGaWVsZHMsIGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gdmFsdWVTZXJpYWxpemVyc1tmaWVsZC50eXBlXTtcbiAgICAgICAgICAgIGlmICghc2VyaWFsaXplcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBmaWVsZCB0eXBlOiAke2ZpZWxkLnR5cGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHNlcmlhbGl6ZXIoZmllbGQpO1xuXG4gICAgICAgICAgICBpZiAoZmllbGQudmFyaWFibGUgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbGxlY3RlZEZpZWxkcy5wdXNoKFtmaWVsZC52YXJpYWJsZSwgdmFsdWVzXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0ZWRGaWVsZHM7XG4gICAgICAgIH0sIFtdKTtcblxuICAgIHJldHVybiB4bWwoJ3gnLCB7eG1sbnM6IEZPUk1fTlMsIHR5cGU6ICdzdWJtaXQnfSxcbiAgICAgICAgLi4uc2VyaWFsaXplZEZpZWxkcy5tYXAoXG4gICAgICAgICAgICAoW3ZhcmlhYmxlLCB2YWx1ZXNdKSA9PlxuICAgICAgICAgICAgICAgIHhtbChcbiAgICAgICAgICAgICAgICAgICAgJ2ZpZWxkJyxcbiAgICAgICAgICAgICAgICAgICAge3ZhcjogdmFyaWFibGV9LFxuICAgICAgICAgICAgICAgICAgICAuLi52YWx1ZXMubWFwKHZhbHVlID0+IHhtbCgndmFsdWUnLCB7fSwgdmFsdWUpKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICk7XG59XG4iXX0=