UNPKG

@tricoteuses/assemblee

Version:

Retrieve, clean up & handle French Assemblée nationale's open data

180 lines (177 loc) 24.3 kB
import assert from "assert"; import { cleanXmlArtefacts } from "./xml.mjs"; export function cleanActeur(acteur) { cleanXmlArtefacts(acteur); assert.strictEqual(acteur.uid["@xsi:type"], "IdActeur_type"); acteur.uid = acteur.uid["#text"]; assert(acteur.uid); const etatCivil = acteur.etatCivil; { cleanXmlArtefacts(etatCivil); const ident = etatCivil.ident; { cleanXmlArtefacts(ident); const infoNaissance = etatCivil.infoNaissance; { cleanXmlArtefacts(infoNaissance); } } } const profession = acteur.profession; if (profession !== undefined) { cleanXmlArtefacts(profession); const socProcInsee = profession.socProcINSEE; assert(socProcInsee); cleanXmlArtefacts(socProcInsee); delete profession.socProcINSEE; profession.socProcInsee = socProcInsee; } const uriHatvp = acteur.uri_hatvp; if (uriHatvp !== undefined) { acteur.uriHatvp = uriHatvp; delete acteur.uri_hatvp; } let adresses = acteur.adresses; if (adresses !== undefined) { adresses = adresses.adresse; if (adresses === undefined) { delete acteur.adresses; adresses = undefined; } else if (Array.isArray(adresses)) { acteur.adresses = adresses; } else { assert.notStrictEqual(adresses, null); assert.strictEqual(typeof adresses, "object"); acteur.adresses = adresses = [adresses]; } if (adresses !== undefined) { for (const adresse of adresses) { cleanXmlArtefacts(adresse); const xsiType = adresse["@xsi:type"]; assert(["AdresseMail_Type", "AdressePostale_Type", "AdresseSiteWeb_Type", "AdresseTelephonique_Type"].includes(xsiType), `Unexpected "@xsi:type": ${xsiType}`); adresse.xsiType = xsiType; delete adresse["@xsi:type"]; assert.notStrictEqual(adresse.uid, undefined); assert.notStrictEqual(adresse.type, undefined); assert.notStrictEqual(adresse.typeLibelle, undefined); if (xsiType === "AdressePostale_Type") { assert.strictEqual(adresse.adresseDeRattachement, undefined); } } } } let mandats = acteur.mandats; if (mandats !== undefined) { let mandat = mandats.mandat; if (Array.isArray(mandat)) { mandats = acteur.mandats = mandat; } else if (typeof mandat === "object") { mandats = acteur.mandats = [mandat]; } for (const mandat of mandats) { cleanXmlArtefacts(mandat); const xsiType = mandat["@xsi:type"]; if (xsiType !== undefined) { mandat.xsiType = xsiType; delete mandat["@xsi:type"]; } const infosQualite = mandat.infosQualite; { cleanXmlArtefacts(infosQualite); } const organes = mandat.organes; delete mandat.organes; let organesRefs = organes.organeRef; assert(organesRefs); if (!Array.isArray(organesRefs)) { organesRefs = [organesRefs]; } mandat.organesRefs = organesRefs; let suppleant = mandat.suppleants; delete mandat.suppleants; if (suppleant) { suppleant = suppleant.suppleant; assert(suppleant); mandat.suppleant = suppleant; cleanXmlArtefacts(suppleant); } const election = mandat.election; if (election !== undefined) { cleanXmlArtefacts(election); const lieu = election.lieu; cleanXmlArtefacts(lieu); } const mandature = mandat.mandature; if (mandature !== undefined) { cleanXmlArtefacts(mandature); } assert.strictEqual(mandat.chambre, undefined); // Replace collaborateurs with an array of collaborateurs. let collaborateurs = mandat.collaborateurs; if (collaborateurs !== undefined) { const collaborateursArray = Array.isArray(collaborateurs) ? collaborateurs.filter(collaborateur => collaborateur !== null) : [collaborateurs]; collaborateurs = []; collaborateursArray.map(({ collaborateur }) => { if (Array.isArray(collaborateur)) { for (const collaborateurItem of collaborateur) { if (collaborateurItem !== null) { collaborateurs.push(collaborateurItem); } } } else if (collaborateur) { collaborateurs.push(collaborateur); } }); if (collaborateurs.length === 0) { delete mandat.collaborateurs; collaborateurs = undefined; } else { mandat.collaborateurs = collaborateurs; } for (const collaborateur of collaborateurs || []) { cleanXmlArtefacts(collaborateur); assert.strictEqual(collaborateur.dateDebut, undefined); assert.strictEqual(collaborateur.dateFin, undefined); } } const infosHorsSian = mandat.InfosHorsSIAN; if (infosHorsSian !== undefined) { cleanXmlArtefacts(infosHorsSian); assert.strictEqual(infosHorsSian.HATVP_URI, undefined); assert.strictEqual(Object.keys(infosHorsSian).length, 0); delete mandat.InfosHorsSIAN; } } // Sort mandats to ease comparison of different open data files. mandats.sort((a, b) => a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length); } let deports = acteur.deports; if (deports !== undefined) { let deport = deports.deport; if (Array.isArray(deport)) { deports = acteur.deports = deport; } else if (typeof deport === "object") { deports = acteur.deports = [deport]; } for (const deport of deports) { cleanXmlArtefacts(deport); const cible = deport.cible; { cleanXmlArtefacts(cible); assert.strictEqual(cible.references, undefined); } } // Sort deports to ease comparison of different open data files. deports.sort((a, b) => a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length); } } export function cleanRapporteur(rapporteur) { const etudePlfRef = rapporteur.etudePLFRef; if (rapporteur.etudePLFRef !== undefined) { delete rapporteur.etudePLFRef; rapporteur.etudePlfRef = etudePlfRef; } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjbGVhblhtbEFydGVmYWN0cyIsImNsZWFuQWN0ZXVyIiwiYWN0ZXVyIiwic3RyaWN0RXF1YWwiLCJ1aWQiLCJldGF0Q2l2aWwiLCJpZGVudCIsImluZm9OYWlzc2FuY2UiLCJwcm9mZXNzaW9uIiwidW5kZWZpbmVkIiwic29jUHJvY0luc2VlIiwic29jUHJvY0lOU0VFIiwidXJpSGF0dnAiLCJ1cmlfaGF0dnAiLCJhZHJlc3NlcyIsImFkcmVzc2UiLCJBcnJheSIsImlzQXJyYXkiLCJub3RTdHJpY3RFcXVhbCIsInhzaVR5cGUiLCJpbmNsdWRlcyIsInR5cGUiLCJ0eXBlTGliZWxsZSIsImFkcmVzc2VEZVJhdHRhY2hlbWVudCIsIm1hbmRhdHMiLCJtYW5kYXQiLCJpbmZvc1F1YWxpdGUiLCJvcmdhbmVzIiwib3JnYW5lc1JlZnMiLCJvcmdhbmVSZWYiLCJzdXBwbGVhbnQiLCJzdXBwbGVhbnRzIiwiZWxlY3Rpb24iLCJsaWV1IiwibWFuZGF0dXJlIiwiY2hhbWJyZSIsImNvbGxhYm9yYXRldXJzIiwiY29sbGFib3JhdGV1cnNBcnJheSIsImZpbHRlciIsImNvbGxhYm9yYXRldXIiLCJtYXAiLCJjb2xsYWJvcmF0ZXVySXRlbSIsInB1c2giLCJsZW5ndGgiLCJkYXRlRGVidXQiLCJkYXRlRmluIiwiaW5mb3NIb3JzU2lhbiIsIkluZm9zSG9yc1NJQU4iLCJIQVRWUF9VUkkiLCJPYmplY3QiLCJrZXlzIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImRlcG9ydHMiLCJkZXBvcnQiLCJjaWJsZSIsInJlZmVyZW5jZXMiLCJjbGVhblJhcHBvcnRldXIiLCJyYXBwb3J0ZXVyIiwiZXR1ZGVQbGZSZWYiLCJldHVkZVBMRlJlZiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGVhbmVycy9hY3RldXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5cbmltcG9ydCB7IGNsZWFuWG1sQXJ0ZWZhY3RzIH0gZnJvbSBcIi4veG1sXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuQWN0ZXVyKGFjdGV1cjogYW55KTogdm9pZCB7XG4gIGNsZWFuWG1sQXJ0ZWZhY3RzKGFjdGV1cilcblxuICBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0ZXVyLnVpZFtcIkB4c2k6dHlwZVwiXSwgXCJJZEFjdGV1cl90eXBlXCIpXG4gIGFjdGV1ci51aWQgPSBhY3RldXIudWlkW1wiI3RleHRcIl1cbiAgYXNzZXJ0KGFjdGV1ci51aWQpXG5cbiAgY29uc3QgZXRhdENpdmlsID0gYWN0ZXVyLmV0YXRDaXZpbFxuICB7XG4gICAgY2xlYW5YbWxBcnRlZmFjdHMoZXRhdENpdmlsKVxuXG4gICAgY29uc3QgaWRlbnQgPSBldGF0Q2l2aWwuaWRlbnRcbiAgICB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhpZGVudClcblxuICAgICAgY29uc3QgaW5mb05haXNzYW5jZSA9IGV0YXRDaXZpbC5pbmZvTmFpc3NhbmNlXG4gICAgICB7XG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGluZm9OYWlzc2FuY2UpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvZmVzc2lvbiA9IGFjdGV1ci5wcm9mZXNzaW9uXG4gIGlmIChwcm9mZXNzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhblhtbEFydGVmYWN0cyhwcm9mZXNzaW9uKVxuXG4gICAgY29uc3Qgc29jUHJvY0luc2VlID0gcHJvZmVzc2lvbi5zb2NQcm9jSU5TRUVcbiAgICBhc3NlcnQoc29jUHJvY0luc2VlKVxuICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKHNvY1Byb2NJbnNlZSlcbiAgICBkZWxldGUgcHJvZmVzc2lvbi5zb2NQcm9jSU5TRUVcbiAgICBwcm9mZXNzaW9uLnNvY1Byb2NJbnNlZSA9IHNvY1Byb2NJbnNlZVxuICB9XG5cbiAgY29uc3QgdXJpSGF0dnAgPSBhY3RldXIudXJpX2hhdHZwXG4gIGlmICh1cmlIYXR2cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWN0ZXVyLnVyaUhhdHZwID0gdXJpSGF0dnBcbiAgICBkZWxldGUgYWN0ZXVyLnVyaV9oYXR2cFxuICB9XG5cbiAgbGV0IGFkcmVzc2VzID0gYWN0ZXVyLmFkcmVzc2VzXG4gIGlmIChhZHJlc3NlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWRyZXNzZXMgPSBhZHJlc3Nlcy5hZHJlc3NlXG4gICAgaWYgKGFkcmVzc2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBhY3RldXIuYWRyZXNzZXNcbiAgICAgIGFkcmVzc2VzID0gdW5kZWZpbmVkXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFkcmVzc2VzKSkge1xuICAgICAgYWN0ZXVyLmFkcmVzc2VzID0gYWRyZXNzZXNcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFkcmVzc2VzLCBudWxsKVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBhZHJlc3NlcywgXCJvYmplY3RcIilcbiAgICAgIGFjdGV1ci5hZHJlc3NlcyA9IGFkcmVzc2VzID0gW2FkcmVzc2VzXVxuICAgIH1cbiAgICBpZiAoYWRyZXNzZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBhZHJlc3NlIG9mIGFkcmVzc2VzKSB7XG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGFkcmVzc2UpXG5cbiAgICAgICAgY29uc3QgeHNpVHlwZSA9IGFkcmVzc2VbXCJAeHNpOnR5cGVcIl1cbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIFwiQWRyZXNzZU1haWxfVHlwZVwiLFxuICAgICAgICAgICAgXCJBZHJlc3NlUG9zdGFsZV9UeXBlXCIsXG4gICAgICAgICAgICBcIkFkcmVzc2VTaXRlV2ViX1R5cGVcIixcbiAgICAgICAgICAgIFwiQWRyZXNzZVRlbGVwaG9uaXF1ZV9UeXBlXCIsXG4gICAgICAgICAgXS5pbmNsdWRlcyh4c2lUeXBlKSxcbiAgICAgICAgICBgVW5leHBlY3RlZCBcIkB4c2k6dHlwZVwiOiAke3hzaVR5cGV9YCxcbiAgICAgICAgKVxuICAgICAgICBhZHJlc3NlLnhzaVR5cGUgPSB4c2lUeXBlXG4gICAgICAgIGRlbGV0ZSBhZHJlc3NlW1wiQHhzaTp0eXBlXCJdXG5cbiAgICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFkcmVzc2UudWlkLCB1bmRlZmluZWQpXG4gICAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhZHJlc3NlLnR5cGUsIHVuZGVmaW5lZClcbiAgICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFkcmVzc2UudHlwZUxpYmVsbGUsIHVuZGVmaW5lZClcblxuICAgICAgICBpZiAoeHNpVHlwZSA9PT0gXCJBZHJlc3NlUG9zdGFsZV9UeXBlXCIpIHtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWRyZXNzZS5hZHJlc3NlRGVSYXR0YWNoZW1lbnQsIHVuZGVmaW5lZClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBtYW5kYXRzID0gYWN0ZXVyLm1hbmRhdHNcbiAgaWYgKG1hbmRhdHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBtYW5kYXQgPSBtYW5kYXRzLm1hbmRhdFxuICAgIGlmIChBcnJheS5pc0FycmF5KG1hbmRhdCkpIHtcbiAgICAgIG1hbmRhdHMgPSBhY3RldXIubWFuZGF0cyA9IG1hbmRhdFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1hbmRhdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgbWFuZGF0cyA9IGFjdGV1ci5tYW5kYXRzID0gW21hbmRhdF1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1hbmRhdCBvZiBtYW5kYXRzKSB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhtYW5kYXQpXG5cbiAgICAgIGNvbnN0IHhzaVR5cGUgPSBtYW5kYXRbXCJAeHNpOnR5cGVcIl1cbiAgICAgIGlmICh4c2lUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWFuZGF0LnhzaVR5cGUgPSB4c2lUeXBlXG4gICAgICAgIGRlbGV0ZSBtYW5kYXRbXCJAeHNpOnR5cGVcIl1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5mb3NRdWFsaXRlID0gbWFuZGF0LmluZm9zUXVhbGl0ZVxuICAgICAge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhpbmZvc1F1YWxpdGUpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yZ2FuZXMgPSBtYW5kYXQub3JnYW5lc1xuICAgICAgZGVsZXRlIG1hbmRhdC5vcmdhbmVzXG4gICAgICBsZXQgb3JnYW5lc1JlZnMgPSBvcmdhbmVzLm9yZ2FuZVJlZlxuICAgICAgYXNzZXJ0KG9yZ2FuZXNSZWZzKVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9yZ2FuZXNSZWZzKSkge1xuICAgICAgICBvcmdhbmVzUmVmcyA9IFtvcmdhbmVzUmVmc11cbiAgICAgIH1cbiAgICAgIG1hbmRhdC5vcmdhbmVzUmVmcyA9IG9yZ2FuZXNSZWZzXG5cbiAgICAgIGxldCBzdXBwbGVhbnQgPSBtYW5kYXQuc3VwcGxlYW50c1xuICAgICAgZGVsZXRlIG1hbmRhdC5zdXBwbGVhbnRzXG4gICAgICBpZiAoc3VwcGxlYW50KSB7XG4gICAgICAgIHN1cHBsZWFudCA9IHN1cHBsZWFudC5zdXBwbGVhbnRcbiAgICAgICAgYXNzZXJ0KHN1cHBsZWFudClcbiAgICAgICAgbWFuZGF0LnN1cHBsZWFudCA9IHN1cHBsZWFudFxuXG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKHN1cHBsZWFudClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlY3Rpb24gPSBtYW5kYXQuZWxlY3Rpb25cbiAgICAgIGlmIChlbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGVsZWN0aW9uKVxuXG4gICAgICAgIGNvbnN0IGxpZXUgPSBlbGVjdGlvbi5saWV1XG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGxpZXUpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hbmRhdHVyZSA9IG1hbmRhdC5tYW5kYXR1cmVcbiAgICAgIGlmIChtYW5kYXR1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhtYW5kYXR1cmUpXG4gICAgICB9XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtYW5kYXQuY2hhbWJyZSwgdW5kZWZpbmVkKVxuXG4gICAgICAvLyBSZXBsYWNlIGNvbGxhYm9yYXRldXJzIHdpdGggYW4gYXJyYXkgb2YgY29sbGFib3JhdGV1cnMuXG4gICAgICBsZXQgY29sbGFib3JhdGV1cnMgPSBtYW5kYXQuY29sbGFib3JhdGV1cnNcbiAgICAgIGlmIChjb2xsYWJvcmF0ZXVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGNvbGxhYm9yYXRldXJzQXJyYXkgPSBBcnJheS5pc0FycmF5KGNvbGxhYm9yYXRldXJzKVxuICAgICAgICAgID8gY29sbGFib3JhdGV1cnMuZmlsdGVyKChjb2xsYWJvcmF0ZXVyKSA9PiBjb2xsYWJvcmF0ZXVyICE9PSBudWxsKVxuICAgICAgICAgIDogW2NvbGxhYm9yYXRldXJzXVxuICAgICAgICBjb2xsYWJvcmF0ZXVycyA9IFtdXG4gICAgICAgIGNvbGxhYm9yYXRldXJzQXJyYXkubWFwKCh7IGNvbGxhYm9yYXRldXIgfSkgPT4ge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbGxhYm9yYXRldXIpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbGxhYm9yYXRldXJJdGVtIG9mIGNvbGxhYm9yYXRldXIpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbGxhYm9yYXRldXJJdGVtICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29sbGFib3JhdGV1cnMucHVzaChjb2xsYWJvcmF0ZXVySXRlbSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoY29sbGFib3JhdGV1cikge1xuICAgICAgICAgICAgY29sbGFib3JhdGV1cnMucHVzaChjb2xsYWJvcmF0ZXVyKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGNvbGxhYm9yYXRldXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGRlbGV0ZSBtYW5kYXQuY29sbGFib3JhdGV1cnNcbiAgICAgICAgICBjb2xsYWJvcmF0ZXVycyA9IHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hbmRhdC5jb2xsYWJvcmF0ZXVycyA9IGNvbGxhYm9yYXRldXJzXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNvbGxhYm9yYXRldXIgb2YgY29sbGFib3JhdGV1cnMgfHwgW10pIHtcbiAgICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhjb2xsYWJvcmF0ZXVyKVxuXG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNvbGxhYm9yYXRldXIuZGF0ZURlYnV0LCB1bmRlZmluZWQpXG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNvbGxhYm9yYXRldXIuZGF0ZUZpbiwgdW5kZWZpbmVkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluZm9zSG9yc1NpYW4gPSBtYW5kYXQuSW5mb3NIb3JzU0lBTlxuICAgICAgaWYgKGluZm9zSG9yc1NpYW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhpbmZvc0hvcnNTaWFuKVxuXG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbmZvc0hvcnNTaWFuLkhBVFZQX1VSSSwgdW5kZWZpbmVkKVxuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoT2JqZWN0LmtleXMoaW5mb3NIb3JzU2lhbikubGVuZ3RoLCAwKVxuICAgICAgICBkZWxldGUgbWFuZGF0LkluZm9zSG9yc1NJQU5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IG1hbmRhdHMgdG8gZWFzZSBjb21wYXJpc29uIG9mIGRpZmZlcmVudCBvcGVuIGRhdGEgZmlsZXMuXG4gICAgbWFuZGF0cy5zb3J0KChhOiB7IHVpZDogc3RyaW5nIH0sIGI6IHsgdWlkOiBzdHJpbmcgfSkgPT5cbiAgICAgIGEudWlkLmxlbmd0aCA9PT0gYi51aWQubGVuZ3RoXG4gICAgICAgID8gYS51aWQubG9jYWxlQ29tcGFyZShiLnVpZClcbiAgICAgICAgOiBhLnVpZC5sZW5ndGggLSBiLnVpZC5sZW5ndGgsXG4gICAgKVxuICB9XG5cbiAgbGV0IGRlcG9ydHMgPSBhY3RldXIuZGVwb3J0c1xuICBpZiAoZGVwb3J0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IGRlcG9ydCA9IGRlcG9ydHMuZGVwb3J0XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwb3J0KSkge1xuICAgICAgZGVwb3J0cyA9IGFjdGV1ci5kZXBvcnRzID0gZGVwb3J0XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGVwb3J0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBkZXBvcnRzID0gYWN0ZXVyLmRlcG9ydHMgPSBbZGVwb3J0XVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwb3J0IG9mIGRlcG9ydHMpIHtcbiAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGRlcG9ydClcblxuICAgICAgY29uc3QgY2libGUgPSBkZXBvcnQuY2libGVcbiAgICAgIHtcbiAgICAgICAgY2xlYW5YbWxBcnRlZmFjdHMoY2libGUpXG5cbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNpYmxlLnJlZmVyZW5jZXMsIHVuZGVmaW5lZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IGRlcG9ydHMgdG8gZWFzZSBjb21wYXJpc29uIG9mIGRpZmZlcmVudCBvcGVuIGRhdGEgZmlsZXMuXG4gICAgZGVwb3J0cy5zb3J0KChhOiB7IHVpZDogc3RyaW5nIH0sIGI6IHsgdWlkOiBzdHJpbmcgfSkgPT5cbiAgICAgIGEudWlkLmxlbmd0aCA9PT0gYi51aWQubGVuZ3RoXG4gICAgICAgID8gYS51aWQubG9jYWxlQ29tcGFyZShiLnVpZClcbiAgICAgICAgOiBhLnVpZC5sZW5ndGggLSBiLnVpZC5sZW5ndGgsXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblJhcHBvcnRldXIocmFwcG9ydGV1cjogYW55KSB7XG4gIGNvbnN0IGV0dWRlUGxmUmVmID0gcmFwcG9ydGV1ci5ldHVkZVBMRlJlZlxuICBpZiAocmFwcG9ydGV1ci5ldHVkZVBMRlJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVsZXRlIHJhcHBvcnRldXIuZXR1ZGVQTEZSZWZcbiAgICByYXBwb3J0ZXVyLmV0dWRlUGxmUmVmID0gZXR1ZGVQbGZSZWZcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxNQUFNLE1BQU0sUUFBUTtBQUFBLFNBRWxCQyxpQkFBaUI7QUFFMUIsT0FBTyxTQUFTQyxXQUFXQSxDQUFDQyxNQUFXLEVBQVE7RUFDN0NGLGlCQUFpQixDQUFDRSxNQUFNLENBQUM7RUFFekJILE1BQU0sQ0FBQ0ksV0FBVyxDQUFDRCxNQUFNLENBQUNFLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxlQUFlLENBQUM7RUFDNURGLE1BQU0sQ0FBQ0UsR0FBRyxHQUFHRixNQUFNLENBQUNFLEdBQUcsQ0FBQyxPQUFPLENBQUM7RUFDaENMLE1BQU0sQ0FBQ0csTUFBTSxDQUFDRSxHQUFHLENBQUM7RUFFbEIsTUFBTUMsU0FBUyxHQUFHSCxNQUFNLENBQUNHLFNBQVM7RUFDbEM7SUFDRUwsaUJBQWlCLENBQUNLLFNBQVMsQ0FBQztJQUU1QixNQUFNQyxLQUFLLEdBQUdELFNBQVMsQ0FBQ0MsS0FBSztJQUM3QjtNQUNFTixpQkFBaUIsQ0FBQ00sS0FBSyxDQUFDO01BRXhCLE1BQU1DLGFBQWEsR0FBR0YsU0FBUyxDQUFDRSxhQUFhO01BQzdDO1FBQ0VQLGlCQUFpQixDQUFDTyxhQUFhLENBQUM7TUFDbEM7SUFDRjtFQUNGO0VBRUEsTUFBTUMsVUFBVSxHQUFHTixNQUFNLENBQUNNLFVBQVU7RUFDcEMsSUFBSUEsVUFBVSxLQUFLQyxTQUFTLEVB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