@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
253 lines (248 loc) • 30.7 kB
JavaScript
import assert from "assert";
import { cleanRapporteur } from "./acteurs.mjs";
import { cleanXmlArtefacts } from "./xml.mjs";
export function cleanActeLegislatif(acteLegislatif) {
cleanXmlArtefacts(acteLegislatif);
const xsiType = acteLegislatif["@xsi:type"];
if (xsiType !== undefined) {
acteLegislatif.xsiType = xsiType;
delete acteLegislatif["@xsi:type"];
}
//
let auteursRefs = acteLegislatif.auteurs;
if (auteursRefs !== undefined) {
auteursRefs = auteursRefs.acteurRef;
if (!Array.isArray(auteursRefs)) {
assert(auteursRefs);
auteursRefs = [auteursRefs];
}
acteLegislatif.auteursRefs = auteursRefs;
delete acteLegislatif.auteurs;
}
const casSaisine = acteLegislatif.casSaisine;
if (casSaisine !== undefined) {
cleanTypeDeclaration(casSaisine);
}
const contributionInternaute = acteLegislatif.contributionInternaute;
if (contributionInternaute !== undefined) {
cleanXmlArtefacts(contributionInternaute);
}
assert.strictEqual(acteLegislatif.dateRetrait, undefined);
const decision = acteLegislatif.decision;
if (decision !== undefined) {
cleanTypeDeclaration(decision);
}
const infoJo = acteLegislatif.infoJO;
if (infoJo !== undefined) {
cleanInfoJo(infoJo);
acteLegislatif.infoJo = infoJo;
delete acteLegislatif.infoJO;
}
const infoJoce = acteLegislatif.infoJOCE;
if (infoJoce !== undefined) {
acteLegislatif.infoJoce = infoJoce;
delete acteLegislatif.infoJOCE;
const refJoce = infoJoce.refJOCE;
if (refJoce !== undefined) {
infoJoce.refJoce = refJoce;
delete infoJoce.refJOCE;
}
const dateJoce = infoJoce.dateJOCE;
if (dateJoce !== undefined) {
infoJoce.dateJoce = dateJoce;
delete infoJoce.dateJOCE;
}
}
let infoJoRect = acteLegislatif.infoJORect;
if (infoJoRect !== undefined) {
if (!Array.isArray(infoJoRect)) {
infoJoRect = [infoJoRect];
}
acteLegislatif.infoJoRect = infoJoRect;
delete acteLegislatif.infoJORect;
for (const infoJoRectItem of infoJoRect) {
cleanInfoJo(infoJoRectItem);
}
}
// Convert acteLegislatif.initiateur and acteLegislatif.initiateurs to an Initiateur.
cleanActeOuDossierInitiateur(acteLegislatif);
let initiateur = acteLegislatif.initiateurs;
if (initiateur !== undefined) {
assert.strictEqual(acteLegislatif.initiateur, undefined);
if (initiateur.acteurRef === undefined) {
assert.notStrictEqual(initiateur.organeRef, undefined);
} else {
if (!Array.isArray(initiateur)) {
assert(initiateur);
initiateur = [initiateur];
}
initiateur = {
acteurs: initiateur
};
}
acteLegislatif.initiateur = initiateur;
delete acteLegislatif.initiateurs;
}
assert.strictEqual(acteLegislatif.odSeancejRef, undefined);
const provenanceRef = acteLegislatif.provenance;
if (provenanceRef !== undefined) {
delete acteLegislatif.provenance;
acteLegislatif.provenanceRef = provenanceRef;
}
let rapporteurs = acteLegislatif.rapporteurs;
if (rapporteurs !== undefined) {
rapporteurs = rapporteurs.rapporteur;
if (!Array.isArray(rapporteurs)) {
assert(rapporteurs);
rapporteurs = [rapporteurs];
}
acteLegislatif.rapporteurs = rapporteurs;
for (const rapporteur of rapporteurs) {
cleanRapporteur(rapporteur);
}
}
const referenceNor = acteLegislatif.referenceNOR;
if (referenceNor !== undefined) {
acteLegislatif.referenceNor = referenceNor;
delete acteLegislatif.referenceNOR;
}
assert.strictEqual(acteLegislatif.reunion, undefined);
const statutAdoption = acteLegislatif.statutAdoption;
if (statutAdoption !== undefined) {
cleanTypeDeclaration(statutAdoption);
}
const statutConclusion = acteLegislatif.statutConclusion;
if (statutConclusion !== undefined) {
cleanTypeDeclaration(statutConclusion);
if (statutConclusion.famCode === "TSORTFnull") {
// Occured once in https://git.en-root.org/tricoteuses/data/assemblee-brut/Dossiers_Legislatifs_XV/commit/8383800fe7d993da7b596c5b20fadc31c4df3835
delete acteLegislatif.statutConclusion;
}
}
const texteAdopteRef = acteLegislatif.texteAdopte;
if (texteAdopteRef !== undefined) {
delete acteLegislatif.texteAdopte;
acteLegislatif.texteAdopteRef = texteAdopteRef;
}
const texteAssocieRef = acteLegislatif.texteAssocie;
if (texteAssocieRef !== undefined) {
delete acteLegislatif.texteAssocie;
acteLegislatif.texteAssocieRef = texteAssocieRef;
}
let textesAssocies = acteLegislatif.textesAssocies;
if (textesAssocies !== undefined) {
textesAssocies = textesAssocies.texteAssocie;
if (!Array.isArray(textesAssocies)) {
assert(textesAssocies);
textesAssocies = [textesAssocies];
}
acteLegislatif.textesAssocies = textesAssocies;
for (const texteAssocie of textesAssocies) {
const texteAssocieRef = texteAssocie.refTexteAssocie;
if (texteAssocieRef !== undefined) {
delete texteAssocie.refTexteAssocie;
texteAssocie.texteAssocieRef = texteAssocieRef;
}
}
}
const typeDeclaration = acteLegislatif.typeDeclaration;
if (typeDeclaration !== undefined) {
cleanTypeDeclaration(typeDeclaration);
}
const typeMotion = acteLegislatif.typeMotion;
if (typeMotion !== undefined) {
cleanTypeDeclaration(typeMotion);
}
const typeMotionCensure = acteLegislatif.typeMotionCensure;
if (typeMotionCensure !== undefined) {
cleanTypeDeclaration(typeMotionCensure);
}
let voteRefs = acteLegislatif.voteRefs;
if (voteRefs !== undefined) {
voteRefs = voteRefs.voteRef;
if (!Array.isArray(voteRefs)) {
assert(voteRefs);
voteRefs = [voteRefs];
}
acteLegislatif.voteRefs = voteRefs;
}
//
let actesLegislatifs = acteLegislatif.actesLegislatifs;
if (actesLegislatifs !== undefined) {
actesLegislatifs = actesLegislatifs.acteLegislatif;
if (!Array.isArray(actesLegislatifs)) {
assert(actesLegislatifs);
actesLegislatifs = [actesLegislatifs];
}
acteLegislatif.actesLegislatifs = actesLegislatifs;
for (const acteLegislatif of actesLegislatifs) {
cleanActeLegislatif(acteLegislatif);
}
}
}
export function cleanActeOuDossierInitiateur(acteOuDossier) {
const initiateur = acteOuDossier.initiateur;
if (initiateur !== undefined) {
let acteurs = initiateur.acteurs;
if (acteurs !== undefined) {
acteurs = acteurs.acteur;
if (!Array.isArray(acteurs)) {
assert(acteurs);
acteurs = [acteurs];
}
if (acteurs.length > 0) {
initiateur.acteurs = acteurs;
} else {
delete initiateur.acteurs;
}
}
let organeRef = initiateur.organes;
if (organeRef !== undefined) {
organeRef = organeRef.organe.organeRef.uid;
assert.notStrictEqual(organeRef, undefined);
initiateur.organeRef = organeRef;
delete initiateur.organes;
}
if (initiateur.acteurs === undefined && initiateur.organeRef === undefined) {
delete acteOuDossier.initiateur;
}
}
}
function cleanInfoJo(infoJo) {
cleanXmlArtefacts(infoJo);
const typeJo = infoJo.typeJO;
if (typeJo !== undefined) {
infoJo.typeJo = typeJo;
delete infoJo.typeJO;
}
const dateJo = infoJo.dateJO;
if (dateJo !== undefined) {
infoJo.dateJo = dateJo;
delete infoJo.dateJO;
}
assert.strictEqual(infoJo.pageJO, undefined);
const numJo = infoJo.numJO;
if (numJo !== undefined) {
infoJo.numJo = numJo;
delete infoJo.numJO;
}
const referenceNor = infoJo.referenceNOR;
if (referenceNor !== undefined) {
infoJo.referenceNor = referenceNor;
delete infoJo.referenceNOR;
}
}
function cleanTypeDeclaration(typeDeclaration) {
typeDeclaration.famCode = typeDeclaration.fam_code;
delete typeDeclaration.fam_code;
assert(typeDeclaration.famCode);
if (!typeDeclaration.libelle) {
// Occured once in https://git.en-root.org/tricoteuses/data/assemblee-brut/Dossiers_Legislatifs_XV/commit/8383800fe7d993da7b596c5b20fadc31c4df3835:
// "statutConclusion": {
// "fam_code": "TSORTFnull"
// },
// This famCode is an error.
typeDeclaration.libelle = typeDeclaration.famCode;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjbGVhblJhcHBvcnRldXIiLCJjbGVhblhtbEFydGVmYWN0cyIsImNsZWFuQWN0ZUxlZ2lzbGF0aWYiLCJhY3RlTGVnaXNsYXRpZiIsInhzaVR5cGUiLCJ1bmRlZmluZWQiLCJhdXRldXJzUmVmcyIsImF1dGV1cnMiLCJhY3RldXJSZWYiLCJBcnJheSIsImlzQXJyYXkiLCJjYXNTYWlzaW5lIiwiY2xlYW5UeXBlRGVjbGFyYXRpb24iLCJjb250cmlidXRpb25JbnRlcm5hdXRlIiwic3RyaWN0RXF1YWwiLCJkYXRlUmV0cmFpdCIsImRlY2lzaW9uIiwiaW5mb0pvIiwiaW5mb0pPIiwiY2xlYW5JbmZvSm8iLCJpbmZvSm9jZSIsImluZm9KT0NFIiwicmVmSm9jZSIsInJlZkpPQ0UiLCJkYXRlSm9jZSIsImRhdGVKT0NFIiwiaW5mb0pvUmVjdCIsImluZm9KT1JlY3QiLCJpbmZvSm9SZWN0SXRlbSIsImNsZWFuQWN0ZU91RG9zc2llckluaXRpYXRldXIiLCJpbml0aWF0ZXVyIiwiaW5pdGlhdGV1cnMiLCJub3RTdHJpY3RFcXVhbCIsIm9yZ2FuZVJlZiIsImFjdGV1cnMiLCJvZFNlYW5jZWpSZWYiLCJwcm92ZW5hbmNlUmVmIiwicHJvdmVuYW5jZSIsInJhcHBvcnRldXJzIiwicmFwcG9ydGV1ciIsInJlZmVyZW5jZU5vciIsInJlZmVyZW5jZU5PUiIsInJldW5pb24iLCJzdGF0dXRBZG9wdGlvbiIsInN0YXR1dENvbmNsdXNpb24iLCJmYW1Db2RlIiwidGV4dGVBZG9wdGVSZWYiLCJ0ZXh0ZUFkb3B0ZSIsInRleHRlQXNzb2NpZVJlZiIsInRleHRlQXNzb2NpZSIsInRleHRlc0Fzc29jaWVzIiwicmVmVGV4dGVBc3NvY2llIiwidHlwZURlY2xhcmF0aW9uIiwidHlwZU1vdGlvbiIsInR5cGVNb3Rpb25DZW5zdXJlIiwidm90ZVJlZnMiLCJ2b3RlUmVmIiwiYWN0ZXNMZWdpc2xhdGlmcyIsImFjdGVPdURvc3NpZXIiLCJhY3RldXIiLCJsZW5ndGgiLCJvcmdhbmVzIiwib3JnYW5lIiwidWlkIiwidHlwZUpvIiwidHlwZUpPIiwiZGF0ZUpvIiwiZGF0ZUpPIiwicGFnZUpPIiwibnVtSm8iLCJudW1KTyIsImZhbV9jb2RlIiwibGliZWxsZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGVhbmVycy9hY3Rlc19sZWdpc2xhdGlmcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuXG5pbXBvcnQgeyBjbGVhblJhcHBvcnRldXIgfSBmcm9tIFwiLi9hY3RldXJzXCJcbmltcG9ydCB7IGNsZWFuWG1sQXJ0ZWZhY3RzIH0gZnJvbSBcIi4veG1sXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuQWN0ZUxlZ2lzbGF0aWYoYWN0ZUxlZ2lzbGF0aWY6IGFueSk6IHZvaWQge1xuICBjbGVhblhtbEFydGVmYWN0cyhhY3RlTGVnaXNsYXRpZilcblxuICBjb25zdCB4c2lUeXBlID0gYWN0ZUxlZ2lzbGF0aWZbXCJAeHNpOnR5cGVcIl1cbiAgaWYgKHhzaVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFjdGVMZWdpc2xhdGlmLnhzaVR5cGUgPSB4c2lUeXBlXG4gICAgZGVsZXRlIGFjdGVMZWdpc2xhdGlmW1wiQHhzaTp0eXBlXCJdXG4gIH1cblxuICAvL1xuXG4gIGxldCBhdXRldXJzUmVmcyA9IGFjdGVMZWdpc2xhdGlmLmF1dGV1cnNcbiAgaWYgKGF1dGV1cnNSZWZzICE9PSB1bmRlZmluZWQpIHtcbiAgICBhdXRldXJzUmVmcyA9IGF1dGV1cnNSZWZzLmFjdGV1clJlZlxuICAgIGlmICghQXJyYXkuaXNBcnJheShhdXRldXJzUmVmcykpIHtcbiAgICAgIGFzc2VydChhdXRldXJzUmVmcylcbiAgICAgIGF1dGV1cnNSZWZzID0gW2F1dGV1cnNSZWZzXVxuICAgIH1cbiAgICBhY3RlTGVnaXNsYXRpZi5hdXRldXJzUmVmcyA9IGF1dGV1cnNSZWZzXG4gICAgZGVsZXRlIGFjdGVMZWdpc2xhdGlmLmF1dGV1cnNcbiAgfVxuXG4gIGNvbnN0IGNhc1NhaXNpbmUgPSBhY3RlTGVnaXNsYXRpZi5jYXNTYWlzaW5lXG4gIGlmIChjYXNTYWlzaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhblR5cGVEZWNsYXJhdGlvbihjYXNTYWlzaW5lKVxuICB9XG5cbiAgY29uc3QgY29udHJpYnV0aW9uSW50ZXJuYXV0ZSA9IGFjdGVMZWdpc2xhdGlmLmNvbnRyaWJ1dGlvbkludGVybmF1dGVcbiAgaWYgKGNvbnRyaWJ1dGlvbkludGVybmF1dGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGNvbnRyaWJ1dGlvbkludGVybmF1dGUpXG4gIH1cblxuICBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0ZUxlZ2lzbGF0aWYuZGF0ZVJldHJhaXQsIHVuZGVmaW5lZClcblxuICBjb25zdCBkZWNpc2lvbiA9IGFjdGVMZWdpc2xhdGlmLmRlY2lzaW9uXG4gIGlmIChkZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY2xlYW5UeXBlRGVjbGFyYXRpb24oZGVjaXNpb24pXG4gIH1cblxuICBjb25zdCBpbmZvSm8gPSBhY3RlTGVnaXNsYXRpZi5pbmZvSk9cbiAgaWYgKGluZm9KbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY2xlYW5JbmZvSm8oaW5mb0pvKVxuICAgIGFjdGVMZWdpc2xhdGlmLmluZm9KbyA9IGluZm9Kb1xuICAgIGRlbGV0ZSBhY3RlTGVnaXNsYXRpZi5pbmZvSk9cbiAgfVxuXG4gIGNvbnN0IGluZm9Kb2NlID0gYWN0ZUxlZ2lzbGF0aWYuaW5mb0pPQ0VcbiAgaWYgKGluZm9Kb2NlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhY3RlTGVnaXNsYXRpZi5pbmZvSm9jZSA9IGluZm9Kb2NlXG4gICAgZGVsZXRlIGFjdGVMZWdpc2xhdGlmLmluZm9KT0NFXG5cbiAgICBjb25zdCByZWZKb2NlID0gaW5mb0pvY2UucmVmSk9DRVxuICAgIGlmIChyZWZKb2NlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGluZm9Kb2NlLnJlZkpvY2UgPSByZWZKb2NlXG4gICAgICBkZWxldGUgaW5mb0pvY2UucmVmSk9DRVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGVKb2NlID0gaW5mb0pvY2UuZGF0ZUpPQ0VcbiAgICBpZiAoZGF0ZUpvY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5mb0pvY2UuZGF0ZUpvY2UgPSBkYXRlSm9jZVxuICAgICAgZGVsZXRlIGluZm9Kb2NlLmRhdGVKT0NFXG4gICAgfVxuICB9XG5cbiAgbGV0IGluZm9Kb1JlY3QgPSBhY3RlTGVnaXNsYXRpZi5pbmZvSk9SZWN0XG4gIGlmIChpbmZvSm9SZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5mb0pvUmVjdCkpIHtcbiAgICAgIGluZm9Kb1JlY3QgPSBbaW5mb0pvUmVjdF1cbiAgICB9XG4gICAgYWN0ZUxlZ2lzbGF0aWYuaW5mb0pvUmVjdCA9IGluZm9Kb1JlY3RcbiAgICBkZWxldGUgYWN0ZUxlZ2lzbGF0aWYuaW5mb0pPUmVjdFxuXG4gICAgZm9yIChjb25zdCBpbmZvSm9SZWN0SXRlbSBvZiBpbmZvSm9SZWN0KSB7XG4gICAgICBjbGVhbkluZm9KbyhpbmZvSm9SZWN0SXRlbSlcbiAgICB9XG4gIH1cblxuICAvLyBDb252ZXJ0IGFjdGVMZWdpc2xhdGlmLmluaXRpYXRldXIgYW5kIGFjdGVMZWdpc2xhdGlmLmluaXRpYXRldXJzIHRvIGFuIEluaXRpYXRldXIuXG4gIGNsZWFuQWN0ZU91RG9zc2llckluaXRpYXRldXIoYWN0ZUxlZ2lzbGF0aWYpXG4gIGxldCBpbml0aWF0ZXVyID0gYWN0ZUxlZ2lzbGF0aWYuaW5pdGlhdGV1cnNcbiAgaWYgKGluaXRpYXRldXIgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhY3RlTGVnaXNsYXRpZi5pbml0aWF0ZXVyLCB1bmRlZmluZWQpXG4gICAgaWYgKGluaXRpYXRldXIuYWN0ZXVyUmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChpbml0aWF0ZXVyLm9yZ2FuZVJlZiwgdW5kZWZpbmVkKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5pdGlhdGV1cikpIHtcbiAgICAgICAgYXNzZXJ0KGluaXRpYXRldXIpXG4gICAgICAgIGluaXRpYXRldXIgPSBbaW5pdGlhdGV1cl1cbiAgICAgIH1cbiAgICAgIGluaXRpYXRldXIgPSB7XG4gICAgICAgIGFjdGV1cnM6IGluaXRpYXRldXIsXG4gICAgICB9XG4gICAgfVxuICAgIGFjdGVMZWdpc2xhdGlmLmluaXRpYXRldXIgPSBpbml0aWF0ZXVyXG4gICAgZGVsZXRlIGFjdGVMZWdpc2xhdGlmLmluaXRpYXRldXJzXG4gIH1cblxuICBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0ZUxlZ2lzbGF0aWYub2RTZWFuY2VqUmVmLCB1bmRlZmluZWQpXG5cbiAgY29uc3QgcHJvdmVuYW5jZVJlZiA9IGFjdGVMZWdpc2xhdGlmLnByb3ZlbmFuY2VcbiAgaWYgKHByb3ZlbmFuY2VSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgIGRlbGV0ZSBhY3RlTGVnaXNsYXRpZi5wcm92ZW5hbmNlXG4gICAgYWN0ZUxlZ2lzbGF0aWYucHJvdmVuYW5jZVJlZiA9IHByb3ZlbmFuY2VSZWZcbiAgfVxuXG4gIGxldCByYXBwb3J0ZXVycyA9IGFjdGVMZWdpc2xhdGlmLnJhcHBvcnRldXJzXG4gIGlmIChyYXBwb3J0ZXVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmFwcG9ydGV1cnMgPSByYXBwb3J0ZXVycy5yYXBwb3J0ZXVyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJhcHBvcnRldXJzKSkge1xuICAgICAgYXNzZXJ0KHJhcHBvcnRldXJzKVxuICAgICAgcmFwcG9ydGV1cnMgPSBbcmFwcG9ydGV1cnNdXG4gICAgfVxuICAgIGFjdGVMZWdpc2xhdGlmLnJhcHBvcnRldXJzID0gcmFwcG9ydGV1cnNcbiAgICBmb3IgKGNvbnN0IHJhcHBvcnRldXIgb2YgcmFwcG9ydGV1cnMpIHtcbiAgICAgIGNsZWFuUmFwcG9ydGV1cihyYXBwb3J0ZXVyKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlZmVyZW5jZU5vciA9IGFjdGVMZWdpc2xhdGlmLnJlZmVyZW5jZU5PUlxuICBpZiAocmVmZXJlbmNlTm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBhY3RlTGVnaXNsYXRpZi5yZWZlcmVuY2VOb3IgPSByZWZlcmVuY2VOb3JcbiAgICBkZWxldGUgYWN0ZUxlZ2lzbGF0aWYucmVmZXJlbmNlTk9SXG4gIH1cblxuICBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0ZUxlZ2lzbGF0aWYucmV1bmlvbiwgdW5kZWZpbmVkKVxuXG4gIGNvbnN0IHN0YXR1dEFkb3B0aW9uID0gYWN0ZUxlZ2lzbGF0aWYuc3RhdHV0QWRvcHRpb25cbiAgaWYgKHN0YXR1dEFkb3B0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhblR5cGVEZWNsYXJhdGlvbihzdGF0dXRBZG9wdGlvbilcbiAgfVxuXG4gIGNvbnN0IHN0YXR1dENvbmNsdXNpb24gPSBhY3RlTGVnaXNsYXRpZi5zdGF0dXRDb25jbHVzaW9uXG4gIGlmIChzdGF0dXRDb25jbHVzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhblR5cGVEZWNsYXJhdGlvbihzdGF0dXRDb25jbHVzaW9uKVxuICAgIGlmIChzdGF0dXRDb25jbHVzaW9uLmZhbUNvZGUgPT09IFwiVFNPUlRGbnVsbFwiKSB7XG4gICAgICAvLyBPY2N1cmVkIG9uY2UgaW4gaHR0cHM6Ly9naXQuZW4tcm9vdC5vcmcvdHJpY290ZXVzZXMvZGF0YS9hc3NlbWJsZWUtYnJ1dC9Eb3NzaWVyc19MZWdpc2xhdGlmc19YVi9jb21taXQvODM4MzgwMGZlN2Q5OTNkYTdiNTk2YzViMjBmYWRjMzFjNGRmMzgzNVxuICAgICAgZGVsZXRlIGFjdGVMZWdpc2xhdGlmLnN0YXR1dENvbmNsdXNpb25cbiAgICB9XG4gIH1cblxuICBjb25zdCB0ZXh0ZUFkb3B0ZVJlZiA9IGFjdGVMZWdpc2xhdGlmLnRleHRlQWRvcHRlXG4gIGlmICh0ZXh0ZUFkb3B0ZVJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVsZXRlIGFjdGVMZWdpc2xhdGlmLnRleHRlQWRvcHRlXG4gICAgYWN0ZUxlZ2lzbGF0aWYudGV4dGVBZG9wdGVSZWYgPSB0ZXh0ZUFkb3B0ZVJlZlxuICB9XG5cbiAgY29uc3QgdGV4dGVBc3NvY2llUmVmID0gYWN0ZUxlZ2lzbGF0aWYudGV4dGVBc3NvY2llXG4gIGlmICh0ZXh0ZUFzc29jaWVSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgIGRlbGV0ZSBhY3RlTGVnaXNsYXRpZi50ZXh0ZUFzc29jaWVcbiAgICBhY3RlTGVnaXNsYXRpZi50ZXh0ZUFzc29jaWVSZWYgPSB0ZXh0ZUFzc29jaWVSZWZcbiAgfVxuXG4gIGxldCB0ZXh0ZXNBc3NvY2llcyA9IGFjdGVMZWdpc2xhdGlmLnRleHRlc0Fzc29jaWVzXG4gIGlmICh0ZXh0ZXNBc3NvY2llcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGV4dGVzQXNzb2NpZXMgPSB0ZXh0ZXNBc3NvY2llcy50ZXh0ZUFzc29jaWVcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGV4dGVzQXNzb2NpZXMpKSB7XG4gICAgICBhc3NlcnQodGV4dGVzQXNzb2NpZXMpXG4gICAgICB0ZXh0ZXNBc3NvY2llcyA9IFt0ZXh0ZXNBc3NvY2llc11cbiAgICB9XG4gICAgYWN0ZUxlZ2lzbGF0aWYudGV4dGVzQXNzb2NpZXMgPSB0ZXh0ZXNBc3NvY2llc1xuXG4gICAgZm9yIChjb25zdCB0ZXh0ZUFzc29jaWUgb2YgdGV4dGVzQXNzb2NpZXMpIHtcbiAgICAgIGNvbnN0IHRleHRlQXNzb2NpZVJlZiA9IHRleHRlQXNzb2NpZS5yZWZUZXh0ZUFzc29jaWVcbiAgICAgIGlmICh0ZXh0ZUFzc29jaWVSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgdGV4dGVBc3NvY2llLnJlZlRleHRlQXNzb2NpZVxuICAgICAgICB0ZXh0ZUFzc29jaWUudGV4dGVBc3NvY2llUmVmID0gdGV4dGVBc3NvY2llUmVmXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdHlwZURlY2xhcmF0aW9uID0gYWN0ZUxlZ2lzbGF0aWYudHlwZURlY2xhcmF0aW9uXG4gIGlmICh0eXBlRGVjbGFyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNsZWFuVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbilcbiAgfVxuXG4gIGNvbnN0IHR5cGVNb3Rpb24gPSBhY3RlTGVnaXNsYXRpZi50eXBlTW90aW9uXG4gIGlmICh0eXBlTW90aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhblR5cGVEZWNsYXJhdGlvbih0eXBlTW90aW9uKVxuICB9XG5cbiAgY29uc3QgdHlwZU1vdGlvbkNlbnN1cmUgPSBhY3RlTGVnaXNsYXRpZi50eXBlTW90aW9uQ2Vuc3VyZVxuICBpZiAodHlwZU1vdGlvbkNlbnN1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNsZWFuVHlwZURlY2xhcmF0aW9uKHR5cGVNb3Rpb25DZW5zdXJlKVxuICB9XG5cbiAgbGV0IHZvdGVSZWZzID0gYWN0ZUxlZ2lzbGF0aWYudm90ZVJlZnNcbiAgaWYgKHZvdGVSZWZzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2b3RlUmVmcyA9IHZvdGVSZWZzLnZvdGVSZWZcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodm90ZVJlZnMpKSB7XG4gICAgICBhc3NlcnQodm90ZVJlZnMpXG4gICAgICB2b3RlUmVmcyA9IFt2b3RlUmVmc11cbiAgICB9XG4gICAgYWN0ZUxlZ2lzbGF0aWYudm90ZVJlZnMgPSB2b3RlUmVmc1xuICB9XG5cbiAgLy9cblxuICBsZXQgYWN0ZXNMZWdpc2xhdGlmcyA9IGFjdGVMZWdpc2xhdGlmLmFjdGVzTGVnaXNsYXRpZnNcbiAgaWYgKGFjdGVzTGVnaXNsYXRpZnMgIT09IHVuZGVmaW5lZCkge1xuICAgIGFjdGVzTGVnaXNsYXRpZnMgPSBhY3Rlc0xlZ2lzbGF0aWZzLmFjdGVMZWdpc2xhdGlmXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFjdGVzTGVnaXNsYXRpZnMpKSB7XG4gICAgICBhc3NlcnQoYWN0ZXNMZWdpc2xhdGlmcylcbiAgICAgIGFjdGVzTGVnaXNsYXRpZnMgPSBbYWN0ZXNMZWdpc2xhdGlmc11cbiAgICB9XG4gICAgYWN0ZUxlZ2lzbGF0aWYuYWN0ZXNMZWdpc2xhdGlmcyA9IGFjdGVzTGVnaXNsYXRpZnNcbiAgICBmb3IgKGNvbnN0IGFjdGVMZWdpc2xhdGlmIG9mIGFjdGVzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGNsZWFuQWN0ZUxlZ2lzbGF0aWYoYWN0ZUxlZ2lzbGF0aWYpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkFjdGVPdURvc3NpZXJJbml0aWF0ZXVyKGFjdGVPdURvc3NpZXI6IGFueSk6IHZvaWQge1xuICBjb25zdCBpbml0aWF0ZXVyID0gYWN0ZU91RG9zc2llci5pbml0aWF0ZXVyXG4gIGlmIChpbml0aWF0ZXVyICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgYWN0ZXVycyA9IGluaXRpYXRldXIuYWN0ZXVyc1xuICAgIGlmIChhY3RldXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFjdGV1cnMgPSBhY3RldXJzLmFjdGV1clxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFjdGV1cnMpKSB7XG4gICAgICAgIGFzc2VydChhY3RldXJzKVxuICAgICAgICBhY3RldXJzID0gW2FjdGV1cnNdXG4gICAgICB9XG4gICAgICBpZiAoYWN0ZXVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGluaXRpYXRldXIuYWN0ZXVycyA9IGFjdGV1cnNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBpbml0aWF0ZXVyLmFjdGV1cnNcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgb3JnYW5lUmVmID0gaW5pdGlhdGV1ci5vcmdhbmVzXG4gICAgaWYgKG9yZ2FuZVJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcmdhbmVSZWYgPSBvcmdhbmVSZWYub3JnYW5lLm9yZ2FuZVJlZi51aWRcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChvcmdhbmVSZWYsIHVuZGVmaW5lZClcbiAgICAgIGluaXRpYXRldXIub3JnYW5lUmVmID0gb3JnYW5lUmVmXG4gICAgICBkZWxldGUgaW5pdGlhdGV1ci5vcmdhbmVzXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgaW5pdGlhdGV1ci5hY3RldXJzID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGluaXRpYXRldXIub3JnYW5lUmVmID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBhY3RlT3VEb3NzaWVyLmluaXRpYXRldXJcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW5JbmZvSm8oaW5mb0pvOiBhbnkpOiB2b2lkIHtcbiAgY2xlYW5YbWxBcnRlZmFjdHMoaW5mb0pvKVxuXG4gIGNvbnN0IHR5cGVKbyA9IGluZm9Kby50eXBlSk9cbiAgaWYgKHR5cGVKbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaW5mb0pvLnR5cGVKbyA9IHR5cGVKb1xuICAgIGRlbGV0ZSBpbmZvSm8udHlwZUpPXG4gIH1cblxuICBjb25zdCBkYXRlSm8gPSBpbmZvSm8uZGF0ZUpPXG4gIGlmIChkYXRlSm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGluZm9Kby5kYXRlSm8gPSBkYXRlSm9cbiAgICBkZWxldGUgaW5mb0pvLmRhdGVKT1xuICB9XG5cbiAgYXNzZXJ0LnN0cmljdEVxdWFsKGluZm9Kby5wYWdlSk8sIHVuZGVmaW5lZClcblxuICBjb25zdCBudW1KbyA9IGluZm9Kby5udW1KT1xuICBpZiAobnVtSm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGluZm9Kby5udW1KbyA9IG51bUpvXG4gICAgZGVsZXRlIGluZm9Kby5udW1KT1xuICB9XG5cbiAgY29uc3QgcmVmZXJlbmNlTm9yID0gaW5mb0pvLnJlZmVyZW5jZU5PUlxuICBpZiAocmVmZXJlbmNlTm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbmZvSm8ucmVmZXJlbmNlTm9yID0gcmVmZXJlbmNlTm9yXG4gICAgZGVsZXRlIGluZm9Kby5yZWZlcmVuY2VOT1JcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhblR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb246IGFueSkge1xuICB0eXBlRGVjbGFyYXRpb24uZmFtQ29kZSA9IHR5cGVEZWNsYXJhdGlvbi5mYW1fY29kZVxuICBkZWxldGUgdHlwZURlY2xhcmF0aW9uLmZhbV9jb2RlXG4gIGFzc2VydCh0eXBlRGVjbGFyYXRpb24uZmFtQ29kZSlcblxuICBpZiAoIXR5cGVEZWNsYXJhdGlvbi5saWJlbGxlKSB7XG4gICAgLy8gT2NjdXJlZCBvbmNlIGluIGh0dHBzOi8vZ2l0LmVuLXJvb3Qub3JnL3RyaWNvdGV1c2VzL2RhdGEvYXNzZW1ibGVlLWJydXQvRG9zc2llcnNfTGVnaXNsYXRpZnNfWFYvY29tbWl0LzgzODM4MDBmZTdkOTkzZGE3YjU5NmM1YjIwZmFkYzMxYzRkZjM4MzU6XG4gICAgLy8gXCJzdGF0dXRDb25jbHVzaW9uXCI6IHtcbiAgICAvLyAgIFwiZmFtX2NvZGVcIjogXCJUU09SVEZudWxsXCJcbiAgICAvLyB9LFxuICAgIC8vIFRoaXMgZmFtQ29kZSBpcyBhbiBlcnJvci5cbiAgICB0eXBlRGVjbGFyYXRpb24ubGliZWxsZSA9IHR5cGVEZWNsYXJhdGlvbi5mYW1Db2RlXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFBQSxTQUVsQkMsZUFBZTtBQUFBLFNBQ2ZDLGlCQUFpQjtBQUUxQixPQUFPLFNBQVNDLG1CQUFtQkEsQ0FBQ0MsY0FBbUIsRUFBUTtFQUM3REYsaUJBQWlCLENBQUNFLGNBQWMsQ0FBQztFQUVqQyxNQUFNQyxPQUFPLEdBQUdELGNBQWMsQ0FBQyxXQUFXLENBQUM7RUFDM0MsSUFBSUMsT0FBTyxLQUFLQyxTQUFTLEVBQUU7SUFDekJGLGNBQWMsQ0FBQ0MsT0FBTyxHQUFHQSxPQUFPO0lBQ2hDLE9BQU9ELGNBQWMsQ0FBQyxXQUFXLENB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