UNPKG

@pazznetwork/ngx-chat

Version:

[![Build status](https://api.travis-ci.com/pazznetwork/ngx-chat.svg?branch=master)](https://travis-ci.com/pazznetwork/ngx-chat) [![Coverage](https://coveralls.io/repos/github/pazznetwork/ngx-chat/badge.svg?branch=master)](https://coveralls.io/github/pazzn

125 lines 21.7 kB
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=