@tricoteuses/assemblee 1.10.5 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/lib/amendements-79bwpkvR.js +154 -0
- package/lib/amendements-CV3s5a0M.js +667 -0
- package/lib/cleaners/index.d.ts +9 -9
- package/lib/cleaners.js +564 -0
- package/lib/datasets.d.ts +3 -3
- package/lib/dossiers_legislatifs.d.ts +2 -2
- package/lib/index.d.ts +17 -22
- package/lib/index.js +1542 -314
- package/lib/inserters.d.ts +5 -5
- package/lib/loaders-9mHdTl9L.js +4158 -0
- package/lib/loaders.d.ts +12 -12
- package/lib/loaders.js +29 -1689
- package/lib/organes.d.ts +1 -1
- package/lib/parse-Ccs6wcUg.js +2512 -0
- package/lib/parsers/index.d.ts +2 -3
- package/lib/parsers/plf.d.ts +1 -0
- package/lib/parsers/recherche_amendements.d.ts +2 -2
- package/lib/parsers/textes_lois.d.ts +1 -23
- package/lib/parsers.js +398 -0
- package/lib/raw_types/debats.d.ts +2 -2
- package/lib/raw_types/dossiers_legislatifs.d.ts +1 -1
- package/lib/schemas/acteurs_et_organes.json +1166 -0
- package/lib/schemas/agendas.json +1745 -0
- package/lib/schemas/amendements.json +2085 -0
- package/lib/schemas/debats.json +842 -0
- package/lib/schemas/dossiers_legislatifs.json +3874 -0
- package/lib/schemas/legislatures.json +17 -0
- package/lib/schemas/questions.json +704 -0
- package/lib/schemas/scrutins.json +701 -0
- package/lib/scripts/retrieve_deputes_photos.d.ts +1 -1
- package/lib/types/acteurs_et_organes.d.ts +340 -0
- package/lib/types/agendas.d.ts +236 -10
- package/lib/types/amendements.d.ts +276 -1
- package/lib/types/debats.d.ts +52 -2
- package/lib/types/dossiers_legislatifs.d.ts +403 -9
- package/lib/types/questions.d.ts +99 -2
- package/lib/types/scrutins.d.ts +101 -0
- package/lib/urls.d.ts +2 -2
- package/package.json +32 -94
- package/lib/api.js +0 -52
- package/lib/api.mjs +0 -45
- package/lib/bugs/acteur-00010/plugin.test.js +0 -90
- package/lib/bugs/acteur-00010/plugin.test.mjs +0 -33
- package/lib/bugs/acteur-00010.d.ts +0 -7
- package/lib/bugs/acteur-00010.js +0 -116
- package/lib/bugs/acteur-00010.mjs +0 -26
- package/lib/bugs/agenda-00002/plugin.test.js +0 -124
- package/lib/bugs/agenda-00002/plugin.test.mjs +0 -50
- package/lib/bugs/agenda-00002.d.ts +0 -15
- package/lib/bugs/agenda-00002.js +0 -406
- package/lib/bugs/agenda-00002.mjs +0 -172
- package/lib/bugs/agenda-00008/plugin.test.js +0 -92
- package/lib/bugs/agenda-00008/plugin.test.mjs +0 -31
- package/lib/bugs/agenda-00008.d.ts +0 -7
- package/lib/bugs/agenda-00008.js +0 -123
- package/lib/bugs/agenda-00008.mjs +0 -26
- package/lib/bugs/agenda-00011/plugin.test.d.ts +0 -1
- package/lib/bugs/agenda-00011/plugin.test.js +0 -263
- package/lib/bugs/agenda-00011/plugin.test.mjs +0 -152
- package/lib/bugs/agenda-00011.d.ts +0 -16
- package/lib/bugs/agenda-00011.js +0 -333
- package/lib/bugs/agenda-00011.mjs +0 -125
- package/lib/bugs.d.ts +0 -21
- package/lib/bugs.js +0 -452
- package/lib/bugs.mjs +0 -70
- package/lib/cleaners/actes_legislatifs.js +0 -315
- package/lib/cleaners/actes_legislatifs.mjs +0 -253
- package/lib/cleaners/acteurs.js +0 -265
- package/lib/cleaners/acteurs.mjs +0 -180
- package/lib/cleaners/amendements.js +0 -294
- package/lib/cleaners/amendements.mjs +0 -227
- package/lib/cleaners/debats.js +0 -12
- package/lib/cleaners/debats.mjs +0 -5
- package/lib/cleaners/documents.js +0 -205
- package/lib/cleaners/documents.mjs +0 -133
- package/lib/cleaners/dossiers_legislatifs.js +0 -131
- package/lib/cleaners/dossiers_legislatifs.mjs +0 -70
- package/lib/cleaners/index.js +0 -70
- package/lib/cleaners/index.mjs +0 -10
- package/lib/cleaners/organes.js +0 -65
- package/lib/cleaners/organes.mjs +0 -48
- package/lib/cleaners/questions.js +0 -12
- package/lib/cleaners/questions.mjs +0 -5
- package/lib/cleaners/reunions.js +0 -312
- package/lib/cleaners/reunions.mjs +0 -255
- package/lib/cleaners/scrutins.js +0 -340
- package/lib/cleaners/scrutins.mjs +0 -221
- package/lib/cleaners/xml.js +0 -74
- package/lib/cleaners/xml.mjs +0 -59
- package/lib/datasets.js +0 -837
- package/lib/datasets.mjs +0 -755
- package/lib/dates.js +0 -124
- package/lib/dates.mjs +0 -100
- package/lib/dossiers_legislatifs.js +0 -346
- package/lib/dossiers_legislatifs.mjs +0 -208
- package/lib/file_systems.js +0 -162
- package/lib/file_systems.mjs +0 -62
- package/lib/git.js +0 -223
- package/lib/git.mjs +0 -151
- package/lib/index.mjs +0 -17
- package/lib/inserters.js +0 -521
- package/lib/inserters.mjs +0 -337
- package/lib/loaders.mjs +0 -886
- package/lib/logger.js +0 -35
- package/lib/logger.mjs +0 -26
- package/lib/organes.js +0 -22
- package/lib/organes.mjs +0 -15
- package/lib/parsers/documents.d.ts +0 -62
- package/lib/parsers/documents.js +0 -453
- package/lib/parsers/documents.mjs +0 -370
- package/lib/parsers/index.js +0 -40
- package/lib/parsers/index.mjs +0 -4
- package/lib/parsers/recherche_amendements.js +0 -403
- package/lib/parsers/recherche_amendements.mjs +0 -167
- package/lib/parsers/textes_lois.js +0 -307
- package/lib/parsers/textes_lois.mjs +0 -264
- package/lib/raw_types/acteurs_et_organes.js +0 -1215
- package/lib/raw_types/acteurs_et_organes.mjs +0 -1148
- package/lib/raw_types/agendas.js +0 -777
- package/lib/raw_types/agendas.mjs +0 -724
- package/lib/raw_types/amendements.js +0 -1052
- package/lib/raw_types/amendements.mjs +0 -993
- package/lib/raw_types/debats.js +0 -630
- package/lib/raw_types/debats.mjs +0 -573
- package/lib/raw_types/dossiers_legislatifs.js +0 -1529
- package/lib/raw_types/dossiers_legislatifs.mjs +0 -1471
- package/lib/raw_types/questions.js +0 -469
- package/lib/raw_types/questions.mjs +0 -416
- package/lib/raw_types/scrutins.js +0 -651
- package/lib/raw_types/scrutins.mjs +0 -598
- package/lib/schemas/acteur/Acteur.json +0 -56
- package/lib/schemas/acteur/AdresseElectronique.json +0 -52
- package/lib/schemas/acteur/AdressePostale.json +0 -75
- package/lib/schemas/acteur/Civ.json +0 -14
- package/lib/schemas/acteur/Collaborateur.json +0 -29
- package/lib/schemas/acteur/EtatCivil.json +0 -51
- package/lib/schemas/acteur/Ident.json +0 -40
- package/lib/schemas/acteur/Lieu.json +0 -66
- package/lib/schemas/acteur/Mandat.json +0 -192
- package/lib/schemas/acteur/Profession.json +0 -46
- package/lib/schemas/agenda/Agenda.json +0 -318
- package/lib/schemas/agenda/CycleDeVie.json +0 -45
- package/lib/schemas/agenda/PointOdj.json +0 -82
- package/lib/schemas/amendement/Amendement.json +0 -246
- package/lib/schemas/amendement/Diff.json +0 -25
- package/lib/schemas/amendement/DispositifAmdtCredit.json +0 -85
- package/lib/schemas/amendement/Identifiant.json +0 -62
- package/lib/schemas/amendement/PointeurFragmentTexte.json +0 -127
- package/lib/schemas/amendement/Representation.json +0 -67
- package/lib/schemas/amendement/Total.json +0 -26
- package/lib/schemas/converted_from_type/acteurs_et_organes.json +0 -666
- package/lib/schemas/converted_from_type/agendas.json +0 -1100
- package/lib/schemas/converted_from_type/amendements.json +0 -3191
- package/lib/schemas/converted_from_type/debats.json +0 -682
- package/lib/schemas/converted_from_type/deputes.json +0 -26
- package/lib/schemas/converted_from_type/dossiers_legislatifs.json +0 -2918
- package/lib/schemas/converted_from_type/legislatures.json +0 -16
- package/lib/schemas/converted_from_type/questions.json +0 -328
- package/lib/schemas/converted_from_type/scrutins.json +0 -393
- package/lib/schemas/debat/Contenu.json +0 -75
- package/lib/schemas/debat/Debat.json +0 -40
- package/lib/schemas/debat/Metadonnees.json +0 -75
- package/lib/schemas/debat/Orateur.json +0 -60
- package/lib/schemas/debat/Point.json +0 -169
- package/lib/schemas/debat/Sommaire.json +0 -71
- package/lib/schemas/debat/SommaireElement.json +0 -108
- package/lib/schemas/debat/Texte.json +0 -34
- package/lib/schemas/document/CodeLibelle.json +0 -25
- package/lib/schemas/document/Document.json +0 -385
- package/lib/schemas/document/Indexation.json +0 -38
- package/lib/schemas/dossier/ActeLegislatif.json +0 -211
- package/lib/schemas/dossier/ActeLegislatifBase.json +0 -62
- package/lib/schemas/dossier/Agenda.json +0 -23
- package/lib/schemas/dossier/ConseilConstitutionnel.json +0 -35
- package/lib/schemas/dossier/Decision.json +0 -25
- package/lib/schemas/dossier/Dossier.json +0 -124
- package/lib/schemas/dossier/EtudeImpact.json +0 -29
- package/lib/schemas/dossier/EtudePlf.json +0 -105
- package/lib/schemas/dossier/Europe.json +0 -42
- package/lib/schemas/dossier/FamCodeLibelle.json +0 -25
- package/lib/schemas/dossier/InfoJO.json +0 -23
- package/lib/schemas/dossier/Initiateur.json +0 -36
- package/lib/schemas/dossier/Motion.json +0 -27
- package/lib/schemas/dossier/Promulgation.json +0 -62
- package/lib/schemas/dossier/Rapporteur.json +0 -36
- package/lib/schemas/dossier/Texte.json +0 -47
- package/lib/schemas/organe/CodeTypeOrgane.json +0 -43
- package/lib/schemas/organe/Organe.json +0 -136
- package/lib/schemas/organe/ViMoDe.json +0 -28
- package/lib/schemas/question/Auteur.json +0 -58
- package/lib/schemas/question/Cloture.json +0 -28
- package/lib/schemas/question/InfoJO.json +0 -40
- package/lib/schemas/question/MinAttribElement.json +0 -30
- package/lib/schemas/question/Question.json +0 -172
- package/lib/schemas/question/Renouvellement.json +0 -17
- package/lib/schemas/question/Signalement.json +0 -21
- package/lib/schemas/question/Texte.json +0 -24
- package/lib/schemas/scrutin/DecompteVoix.json +0 -35
- package/lib/schemas/scrutin/Dysfonctionnement.json +0 -50
- package/lib/schemas/scrutin/MiseAuPoint.json +0 -53
- package/lib/schemas/scrutin/OrganeVotant.json +0 -88
- package/lib/schemas/scrutin/Scrutin.json +0 -187
- package/lib/schemas/scrutin/Votant.json +0 -37
- package/lib/scripts/bugs_helper.d.ts +0 -13
- package/lib/scripts/bugs_helper.js +0 -595
- package/lib/scripts/bugs_helper.mjs +0 -251
- package/lib/scripts/clean_reorganized_data.js +0 -613
- package/lib/scripts/clean_reorganized_data.mjs +0 -276
- package/lib/scripts/diff_amendements.js +0 -249
- package/lib/scripts/diff_amendements.mjs +0 -202
- package/lib/scripts/document_dossiers_legislatifs.js +0 -655
- package/lib/scripts/document_dossiers_legislatifs.mjs +0 -414
- package/lib/scripts/get_today_reunions.js +0 -37
- package/lib/scripts/get_today_reunions.mjs +0 -31
- package/lib/scripts/merge_scrutins.js +0 -97
- package/lib/scripts/merge_scrutins.mjs +0 -47
- package/lib/scripts/parse_textes_lois.d.ts +0 -1
- package/lib/scripts/parse_textes_lois.js +0 -171
- package/lib/scripts/parse_textes_lois.mjs +0 -140
- package/lib/scripts/process_open_dataset.js +0 -301
- package/lib/scripts/process_open_dataset.mjs +0 -134
- package/lib/scripts/raw_types_from_amendements.js +0 -135
- package/lib/scripts/raw_types_from_amendements.mjs +0 -134
- package/lib/scripts/reorganize_data.js +0 -805
- package/lib/scripts/reorganize_data.mjs +0 -517
- package/lib/scripts/retrieve_deputes_photos.js +0 -310
- package/lib/scripts/retrieve_deputes_photos.mjs +0 -158
- package/lib/scripts/retrieve_documents.js +0 -547
- package/lib/scripts/retrieve_documents.mjs +0 -242
- package/lib/scripts/retrieve_open_data.js +0 -107
- package/lib/scripts/retrieve_open_data.mjs +0 -26
- package/lib/scripts/retrieve_pending_amendments.js +0 -206
- package/lib/scripts/retrieve_pending_amendments.mjs +0 -57
- package/lib/scripts/retrieve_senateurs_photos.js +0 -234
- package/lib/scripts/retrieve_senateurs_photos.mjs +0 -116
- package/lib/scripts/retrieve_textes_lois.d.ts +0 -1
- package/lib/scripts/retrieve_textes_lois.js +0 -240
- package/lib/scripts/retrieve_textes_lois.mjs +0 -85
- package/lib/scripts/shared/cli_helpers.js +0 -89
- package/lib/scripts/shared/cli_helpers.mjs +0 -81
- package/lib/scripts/test_iter_load.js +0 -155
- package/lib/scripts/test_iter_load.mjs +0 -72
- package/lib/scripts/test_load.js +0 -26
- package/lib/scripts/test_load.mjs +0 -16
- package/lib/scripts/test_load_big_files.js +0 -26
- package/lib/scripts/test_load_big_files.mjs +0 -16
- package/lib/scripts/validate_json.js +0 -353
- package/lib/scripts/validate_json.mjs +0 -184
- package/lib/shared_types/codes_actes.js +0 -231
- package/lib/shared_types/codes_actes.mjs +0 -224
- package/lib/strings.js +0 -16
- package/lib/strings.mjs +0 -7
- package/lib/types/acteurs_et_organes.js +0 -965
- package/lib/types/acteurs_et_organes.mjs +0 -906
- package/lib/types/agendas.js +0 -628
- package/lib/types/agendas.mjs +0 -575
- package/lib/types/amendements.js +0 -899
- package/lib/types/amendements.mjs +0 -842
- package/lib/types/debats.js +0 -619
- package/lib/types/debats.mjs +0 -562
- package/lib/types/dossiers_legislatifs.js +0 -1188
- package/lib/types/dossiers_legislatifs.mjs +0 -1130
- package/lib/types/legislatures.js +0 -17
- package/lib/types/legislatures.mjs +0 -10
- package/lib/types/questions.js +0 -454
- package/lib/types/questions.mjs +0 -401
- package/lib/types/scrutins.js +0 -556
- package/lib/types/scrutins.mjs +0 -503
- package/lib/urls.js +0 -325
- package/lib/urls.mjs +0 -258
- /package/lib/{bugs/acteur-00010/plugin.test.d.ts → scripts/add_links_to_documents.d.ts} +0 -0
- /package/lib/{bugs/agenda-00002/plugin.test.d.ts → scripts/copy-schemas.d.ts} +0 -0
- /package/lib/{bugs/agenda-00008/plugin.test.d.ts → scripts/generate-json-schemas.d.ts} +0 -0
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
import commandLineArgs from "command-line-args";
|
|
2
|
-
import fs from "fs-extra";
|
|
3
|
-
import path from "path";
|
|
4
|
-
import { cleanActeur, cleanAmendement, cleanDocumentOrDivision, cleanDossierParlementaire, cleanOrgane, cleanReunion, cleanScrutin, cleanQuestion, cleanCompteRendu } from "../cleaners/index.mjs";
|
|
5
|
-
import { datasets, EnabledDatasets, getEnabledDatasets, filterByLegislature } from "../datasets.mjs";
|
|
6
|
-
import { downloadAndParse } from "./retrieve_documents.mjs";
|
|
7
|
-
import { existingDateToJson, patchedDateToJson } from "../dates.mjs";
|
|
8
|
-
import { walkDir } from "../file_systems.mjs";
|
|
9
|
-
import * as git from "../git.mjs";
|
|
10
|
-
import { Convert as ActeursEtOrganesConvert } from "../types/acteurs_et_organes.mjs";
|
|
11
|
-
import { Convert as AgendasConvert } from "../types/agendas.mjs";
|
|
12
|
-
import { Convert as AmendementsConvert } from "../types/amendements.mjs";
|
|
13
|
-
import { Convert as DossiersLegislatifsConvert } from "../types/dossiers_legislatifs.mjs";
|
|
14
|
-
import { Convert as ScrutinsConvert } from "../types/scrutins.mjs";
|
|
15
|
-
import { Convert as QuestionsConvert } from "../types/questions.mjs";
|
|
16
|
-
import { Convert as ComptesRendusConvert } from "../types/debats.mjs";
|
|
17
|
-
import { cloneOption, commitOption, remoteOption, legislatureOption, categoriesOption, dataDirDefaultOption, silentOption, verboseOption, pullOption, fetchDocumentsOption, parseDocumentsOption, documentFormatOption } from "./shared/cli_helpers.mjs";
|
|
18
|
-
function parseArgs(argv) {
|
|
19
|
-
const optionsDefinitions = [cloneOption, commitOption, remoteOption, legislatureOption, categoriesOption, silentOption, verboseOption, dataDirDefaultOption, pullOption, fetchDocumentsOption, parseDocumentsOption, documentFormatOption, {
|
|
20
|
-
alias: "d",
|
|
21
|
-
help: "single dataset to reorganize",
|
|
22
|
-
name: "dataset",
|
|
23
|
-
type: String
|
|
24
|
-
}, {
|
|
25
|
-
help: "do not reset --hard after commit to save I/O if the working tree is to be discarded",
|
|
26
|
-
name: "no-reset-after-commit",
|
|
27
|
-
type: Boolean
|
|
28
|
-
}, {
|
|
29
|
-
alias: "V",
|
|
30
|
-
help: "don't validate data",
|
|
31
|
-
name: "no-validate",
|
|
32
|
-
type: Boolean
|
|
33
|
-
}];
|
|
34
|
-
const options = commandLineArgs(optionsDefinitions, {
|
|
35
|
-
argv: argv
|
|
36
|
-
});
|
|
37
|
-
return options;
|
|
38
|
-
}
|
|
39
|
-
function cloneGit(gitGroupUrl, datasetName, dataDir) {
|
|
40
|
-
git.clone(gitGroupUrl, `${datasetName}_nettoye`, dataDir);
|
|
41
|
-
}
|
|
42
|
-
function commitGit(datasetCleanDir, options, exitCode, subdirectories) {
|
|
43
|
-
if (options.commit) {
|
|
44
|
-
const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
|
|
45
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
46
|
-
exitCode = errorCode;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
if (commitAndPushUid(datasetCleanDir, options, subdirectories) && (exitCode === 0 || exitCode === 10)) {
|
|
50
|
-
exitCode = 1;
|
|
51
|
-
}
|
|
52
|
-
return exitCode;
|
|
53
|
-
}
|
|
54
|
-
function cleanAndValidateData(data, cleaner, fromJson, toJson, noValidate) {
|
|
55
|
-
cleaner(data);
|
|
56
|
-
if (typeof data === "object" && Object.keys(data).length === 0) {
|
|
57
|
-
// By convention: an empty object must be deleted.
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
const jsonData = JSON.stringify(data, null, 2);
|
|
61
|
-
if (!noValidate) {
|
|
62
|
-
return jsonData;
|
|
63
|
-
} else {
|
|
64
|
-
const validatedData = fromJson(jsonData);
|
|
65
|
-
return toJson(validatedData);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
async function processFiles(datasetRawDir, datasetCleanDir, walkDirParams, cleaner, dataConverter, options, postProcessor) {
|
|
69
|
-
for (const filePathArray of walkDir(datasetRawDir, walkDirParams)) {
|
|
70
|
-
const filename = filePathArray[filePathArray.length - 1];
|
|
71
|
-
if (!filename.endsWith(".json")) continue;
|
|
72
|
-
const rawFilePath = path.join(datasetRawDir, ...filePathArray);
|
|
73
|
-
const rawJson = fs.readFileSync(rawFilePath, {
|
|
74
|
-
encoding: "utf8"
|
|
75
|
-
});
|
|
76
|
-
if (options.verbose) console.log(`Cleaning file: ${rawFilePath}...`);
|
|
77
|
-
const data = JSON.parse(rawJson);
|
|
78
|
-
const validateData = !options["no-validate"];
|
|
79
|
-
const cleanJson = cleanAndValidateData(data, cleaner, dataConverter.fromJson, dataConverter.toJson, validateData);
|
|
80
|
-
if (cleanJson !== null) {
|
|
81
|
-
const cleanFilePath = path.join(datasetCleanDir, ...filePathArray);
|
|
82
|
-
fs.ensureDirSync(path.dirname(cleanFilePath));
|
|
83
|
-
fs.writeFileSync(cleanFilePath, cleanJson, {
|
|
84
|
-
encoding: "utf8"
|
|
85
|
-
});
|
|
86
|
-
if (postProcessor) {
|
|
87
|
-
await postProcessor(data, datasetCleanDir, options);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
async function cleanReorganizedData(options) {
|
|
93
|
-
const dataDir = options.dataDir;
|
|
94
|
-
Date.prototype.toJSON = patchedDateToJson;
|
|
95
|
-
let exitCode = options.commit ? 10 : 0;
|
|
96
|
-
const gitGroupUrl = options.clone?.trim().replace(/\/+$/, "");
|
|
97
|
-
const enabledDatasets = getEnabledDatasets(options.categories);
|
|
98
|
-
let chosenDatasets = filterByLegislature(datasets, options.legislature);
|
|
99
|
-
if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
|
|
100
|
-
for (const dataset of chosenDatasets.acteursEtOrganes) {
|
|
101
|
-
const datasetName = path.basename(dataset.filename, ".json");
|
|
102
|
-
if (options.dataset && datasetName !== options.dataset) {
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
106
|
-
const datasetRawDir = path.join(dataDir, datasetName);
|
|
107
|
-
const datasetCleanDir = `${datasetRawDir}_nettoye`;
|
|
108
|
-
if (options.pull) {
|
|
109
|
-
git.resetAndPull(datasetCleanDir);
|
|
110
|
-
}
|
|
111
|
-
analyzeAndRemove(datasetName, options);
|
|
112
|
-
await processFiles(datasetRawDir, datasetCleanDir, ["acteurs"], cleanActeur, {
|
|
113
|
-
fromJson: ActeursEtOrganesConvert.toActeur,
|
|
114
|
-
toJson: ActeursEtOrganesConvert.acteurToJson
|
|
115
|
-
}, options);
|
|
116
|
-
await processFiles(datasetRawDir, datasetCleanDir, ["organes"], cleanOrgane, {
|
|
117
|
-
fromJson: ActeursEtOrganesConvert.toOrgane,
|
|
118
|
-
toJson: ActeursEtOrganesConvert.organeToJson
|
|
119
|
-
}, options);
|
|
120
|
-
exitCode = commitGit(datasetCleanDir, options, exitCode, ["acteurs", "organes"]);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
if (enabledDatasets & EnabledDatasets.Agendas) {
|
|
124
|
-
for (const dataset of chosenDatasets.agendas) {
|
|
125
|
-
const datasetName = path.basename(dataset.filename, ".json");
|
|
126
|
-
if (options.dataset && datasetName !== options.dataset) {
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
130
|
-
analyzeAndRemove(datasetName, options);
|
|
131
|
-
const datasetRawDir = path.join(dataDir, datasetName);
|
|
132
|
-
const datasetCleanDir = `${datasetRawDir}_nettoye`;
|
|
133
|
-
await processFiles(datasetRawDir, datasetCleanDir, [], cleanReunion, {
|
|
134
|
-
fromJson: AgendasConvert.toReunion,
|
|
135
|
-
toJson: AgendasConvert.reunionToJson
|
|
136
|
-
}, options);
|
|
137
|
-
exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
if (enabledDatasets & EnabledDatasets.Amendements) {
|
|
141
|
-
for (const dataset of chosenDatasets.amendements) {
|
|
142
|
-
const datasetName = path.basename(dataset.filename, ".json");
|
|
143
|
-
if (options.dataset && datasetName !== options.dataset) {
|
|
144
|
-
continue;
|
|
145
|
-
}
|
|
146
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
147
|
-
analyzeAndRemove(datasetName, options);
|
|
148
|
-
const datasetRawDir = path.join(dataDir, datasetName);
|
|
149
|
-
const datasetCleanDir = `${datasetRawDir}_nettoye`;
|
|
150
|
-
await processFiles(datasetRawDir, datasetCleanDir, [], cleanAmendement, {
|
|
151
|
-
fromJson: AmendementsConvert.toAmendement,
|
|
152
|
-
toJson: AmendementsConvert.amendementToJson
|
|
153
|
-
}, options);
|
|
154
|
-
exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
|
|
158
|
-
for (const dataset of chosenDatasets.dossiersLegislatifs) {
|
|
159
|
-
const datasetName = path.basename(dataset.filename, ".json");
|
|
160
|
-
if (options.dataset && datasetName !== options.dataset) {
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
164
|
-
analyzeAndRemove(datasetName, options);
|
|
165
|
-
const datasetRawDir = path.join(dataDir, datasetName);
|
|
166
|
-
const datasetCleanDir = `${datasetRawDir}_nettoye`;
|
|
167
|
-
await processFiles(datasetRawDir, datasetCleanDir, ["documents"], cleanDocumentOrDivision, {
|
|
168
|
-
fromJson: DossiersLegislatifsConvert.toDocument,
|
|
169
|
-
toJson: DossiersLegislatifsConvert.documentToJson
|
|
170
|
-
}, options, downloadAndParse);
|
|
171
|
-
await processFiles(datasetRawDir, datasetCleanDir, ["dossiers"], cleanDossierParlementaire, {
|
|
172
|
-
fromJson: DossiersLegislatifsConvert.toDossierParlementaire,
|
|
173
|
-
toJson: DossiersLegislatifsConvert.dossierParlementaireToJson
|
|
174
|
-
}, options);
|
|
175
|
-
exitCode = commitGit(datasetCleanDir, options, exitCode, ["documents", "dossiers"]);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
if (enabledDatasets & EnabledDatasets.Scrutins) {
|
|
179
|
-
for (const dataset of chosenDatasets.scrutins) {
|
|
180
|
-
const datasetName = path.basename(dataset.filename, ".json");
|
|
181
|
-
if (options.dataset && datasetName !== options.dataset) {
|
|
182
|
-
continue;
|
|
183
|
-
}
|
|
184
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
185
|
-
analyzeAndRemove(datasetName, options);
|
|
186
|
-
const datasetRawDir = path.join(dataDir, datasetName);
|
|
187
|
-
const datasetCleanDir = `${datasetRawDir}_nettoye`;
|
|
188
|
-
await processFiles(datasetRawDir, datasetCleanDir, [], cleanScrutin, {
|
|
189
|
-
fromJson: ScrutinsConvert.toScrutin,
|
|
190
|
-
toJson: ScrutinsConvert.scrutinToJson
|
|
191
|
-
}, options);
|
|
192
|
-
exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
if (enabledDatasets & EnabledDatasets.Questions) {
|
|
196
|
-
for (const dataset of datasets.questions) {
|
|
197
|
-
const datasetName = path.basename(dataset.filename, ".json");
|
|
198
|
-
if (options.dataset && datasetName !== options.dataset) {
|
|
199
|
-
continue;
|
|
200
|
-
}
|
|
201
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
202
|
-
analyzeAndRemove(datasetName, options);
|
|
203
|
-
const datasetRawDir = path.join(dataDir, datasetName);
|
|
204
|
-
const datasetCleanDir = `${datasetRawDir}_nettoye`;
|
|
205
|
-
await processFiles(datasetRawDir, datasetCleanDir, [], cleanQuestion, {
|
|
206
|
-
fromJson: QuestionsConvert.toQuestion,
|
|
207
|
-
toJson: QuestionsConvert.questionToJson
|
|
208
|
-
}, options);
|
|
209
|
-
exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
if (enabledDatasets & EnabledDatasets.ComptesRendusSeances) {
|
|
213
|
-
for (const dataset of datasets.comptesRendusSeances) {
|
|
214
|
-
const datasetName = path.basename(dataset.filename, ".xml");
|
|
215
|
-
if (options.dataset && datasetName !== options.dataset) {
|
|
216
|
-
continue;
|
|
217
|
-
}
|
|
218
|
-
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
219
|
-
analyzeAndRemove(datasetName, options);
|
|
220
|
-
const datasetRawDir = path.join(dataDir, datasetName);
|
|
221
|
-
const datasetCleanDir = `${datasetRawDir}_nettoye`;
|
|
222
|
-
await processFiles(datasetRawDir, datasetCleanDir, [], cleanCompteRendu, {
|
|
223
|
-
fromJson: ComptesRendusConvert.toCompteRendu,
|
|
224
|
-
toJson: ComptesRendusConvert.compteRenduToJson
|
|
225
|
-
}, options);
|
|
226
|
-
exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// Restore standard conversion of dates to JSON.
|
|
231
|
-
Date.prototype.toJSON = existingDateToJson;
|
|
232
|
-
if (!options.silent) {
|
|
233
|
-
console.log("Finished !");
|
|
234
|
-
}
|
|
235
|
-
return exitCode;
|
|
236
|
-
}
|
|
237
|
-
function analyzeAndRemove(datasetName, options) {
|
|
238
|
-
const dataDir = options.dataDir;
|
|
239
|
-
const datasetRawDir = path.join(dataDir, datasetName);
|
|
240
|
-
const datasetCleanDir = `${datasetRawDir}_nettoye`;
|
|
241
|
-
if (!options.silent) {
|
|
242
|
-
console.log(`Cleaning directory: ${datasetCleanDir}…`);
|
|
243
|
-
}
|
|
244
|
-
fs.ensureDirSync(datasetCleanDir);
|
|
245
|
-
for (const filename of fs.readdirSync(datasetCleanDir)) {
|
|
246
|
-
if (filename[0] === ".") {
|
|
247
|
-
continue;
|
|
248
|
-
}
|
|
249
|
-
const pathname = path.join(datasetCleanDir, filename);
|
|
250
|
-
fs.removeSync(pathname);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
function commitAndPushUid(repositoryDir, options, subdirectories) {
|
|
254
|
-
let error = false;
|
|
255
|
-
if (options.commit) {
|
|
256
|
-
git.uidBranchUpdate(repositoryDir, subdirectories, options["no-reset-after-commit"]);
|
|
257
|
-
for (const remote of options.remote || []) {
|
|
258
|
-
try {
|
|
259
|
-
git.run(repositoryDir, `push --quiet ${remote} uid:uid`);
|
|
260
|
-
} catch (childProcess) {
|
|
261
|
-
error = true;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
return error;
|
|
266
|
-
}
|
|
267
|
-
function main(argv) {
|
|
268
|
-
const options = parseArgs(argv);
|
|
269
|
-
return cleanReorganizedData(options);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/* istanbul ignore if */
|
|
273
|
-
if (process.argv[1].endsWith("clean_reorganized_data.ts")) {
|
|
274
|
-
main(process.argv).then(process.exit);
|
|
275
|
-
}
|
|
276
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kTGluZUFyZ3MiLCJmcyIsInBhdGgiLCJjbGVhbkFjdGV1ciIsImNsZWFuQW1lbmRlbWVudCIsImNsZWFuRG9jdW1lbnRPckRpdmlzaW9uIiwiY2xlYW5Eb3NzaWVyUGFybGVtZW50YWlyZSIsImNsZWFuT3JnYW5lIiwiY2xlYW5SZXVuaW9uIiwiY2xlYW5TY3J1dGluIiwiY2xlYW5RdWVzdGlvbiIsImNsZWFuQ29tcHRlUmVuZHUiLCJkYXRhc2V0cyIsIkVuYWJsZWREYXRhc2V0cyIsImdldEVuYWJsZWREYXRhc2V0cyIsImZpbHRlckJ5TGVnaXNsYXR1cmUiLCJkb3dubG9hZEFuZFBhcnNlIiwiZXhpc3RpbmdEYXRlVG9Kc29uIiwicGF0Y2hlZERhdGVUb0pzb24iLCJ3YWxrRGlyIiwiZ2l0IiwiQ29udmVydCIsIkFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0IiwiQWdlbmRhc0NvbnZlcnQiLCJBbWVuZGVtZW50c0NvbnZlcnQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydCIsIlNjcnV0aW5zQ29udmVydCIsIlF1ZXN0aW9uc0NvbnZlcnQiLCJDb21wdGVzUmVuZHVzQ29udmVydCIsImNsb25lT3B0aW9uIiwiY29tbWl0T3B0aW9uIiwicmVtb3RlT3B0aW9uIiwibGVnaXNsYXR1cmVPcHRpb24iLCJjYXRlZ29yaWVzT3B0aW9uIiwiZGF0YURpckRlZmF1bHRPcHRpb24iLCJzaWxlbnRPcHRpb24iLCJ2ZXJib3NlT3B0aW9uIiwicHVsbE9wdGlvbiIsImZldGNoRG9jdW1lbnRzT3B0aW9uIiwicGFyc2VEb2N1bWVudHNPcHRpb24iLCJkb2N1bWVudEZvcm1hdE9wdGlvbiIsInBhcnNlQXJncyIsImFyZ3YiLCJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIlN0cmluZyIsIkJvb2xlYW4iLCJvcHRpb25zIiwiY2xvbmVHaXQiLCJnaXRHcm91cFVybCIsImRhdGFzZXROYW1lIiwiZGF0YURpciIsImNsb25lIiwiY29tbWl0R2l0IiwiZGF0YXNldENsZWFuRGlyIiwiZXhpdENvZGUiLCJzdWJkaXJlY3RvcmllcyIsImNvbW1pdCIsImVycm9yQ29kZSIsImNvbW1pdEFuZFB1c2giLCJyZW1vdGUiLCJjb21taXRBbmRQdXNoVWlkIiwiY2xlYW5BbmRWYWxpZGF0ZURhdGEiLCJkYXRhIiwiY2xlYW5lciIsImZyb21Kc29uIiwidG9Kc29uIiwibm9WYWxpZGF0ZSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJqc29uRGF0YSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2YWxpZGF0ZWREYXRhIiwicHJvY2Vzc0ZpbGVzIiwiZGF0YXNldFJhd0RpciIsIndhbGtEaXJQYXJhbXMiLCJkYXRhQ29udmVydGVyIiwicG9zdFByb2Nlc3NvciIsImZpbGVQYXRoQXJyYXkiLCJmaWxlbmFtZSIsImVuZHNXaXRoIiwicmF3RmlsZVBhdGgiLCJqb2luIiwicmF3SnNvbiIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwidmVyYm9zZSIsImNvbnNvbGUiLCJsb2ciLCJwYXJzZSIsInZhbGlkYXRlRGF0YSIsImNsZWFuSnNvbiIsImNsZWFuRmlsZVBhdGgiLCJlbnN1cmVEaXJTeW5jIiwiZGlybmFtZSIsIndyaXRlRmlsZVN5bmMiLCJjbGVhblJlb3JnYW5pemVkRGF0YSIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJ0cmltIiwicmVwbGFjZSIsImVuYWJsZWREYXRhc2V0cyIsImNhdGVnb3JpZXMiLCJjaG9zZW5EYXRhc2V0cyIsImxlZ2lzbGF0dXJlIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXQiLCJhY3RldXJzRXRPcmdhbmVzIiwiYmFzZW5hbWUiLCJwdWxsIiwicmVzZXRBbmRQdWxsIiwiYW5hbHl6ZUFuZFJlbW92ZSIsInRvQWN0ZXVyIiwiYWN0ZXVyVG9Kc29uIiwidG9PcmdhbmUiLCJvcmdhbmVUb0pzb24iLCJBZ2VuZGFzIiwiYWdlbmRhcyIsInRvUmV1bmlvbiIsInJldW5pb25Ub0pzb24iLCJBbWVuZGVtZW50cyIsImFtZW5kZW1lbnRzIiwidG9BbWVuZGVtZW50IiwiYW1lbmRlbWVudFRvSnNvbiIsIkRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb3NzaWVyc0xlZ2lzbGF0aWZzIiwidG9Eb2N1bWVudCIsImRvY3VtZW50VG9Kc29uIiwidG9Eb3NzaWVyUGFybGVtZW50YWlyZSIsImRvc3NpZXJQYXJsZW1lbnRhaXJlVG9Kc29uIiwiU2NydXRpbnMiLCJzY3J1dGlucyIsInRvU2NydXRpbiIsInNjcnV0aW5Ub0pzb24iLCJRdWVzdGlvbnMiLCJxdWVzdGlvbnMiLCJ0b1F1ZXN0aW9uIiwicXVlc3Rpb25Ub0pzb24iLCJDb21wdGVzUmVuZHVzU2VhbmNlcyIsImNvbXB0ZXNSZW5kdXNTZWFuY2VzIiwidG9Db21wdGVSZW5kdSIsImNvbXB0ZVJlbmR1VG9Kc29uIiwic2lsZW50IiwicmVhZGRpclN5bmMiLCJwYXRobmFtZSIsInJlbW92ZVN5bmMiLCJyZXBvc2l0b3J5RGlyIiwiZXJyb3IiLCJ1aWRCcmFuY2hVcGRhdGUiLCJydW4iLCJjaGlsZFByb2Nlc3MiLCJtYWluIiwicHJvY2VzcyIsInRoZW4iLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvY2xlYW5fcmVvcmdhbml6ZWRfZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7XG4gIGNsZWFuQWN0ZXVyLFxuICBjbGVhbkFtZW5kZW1lbnQsXG4gIGNsZWFuRG9jdW1lbnRPckRpdmlzaW9uLFxuICBjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICBjbGVhbk9yZ2FuZSxcbiAgY2xlYW5SZXVuaW9uLFxuICBjbGVhblNjcnV0aW4sXG4gIGNsZWFuUXVlc3Rpb24sXG4gIGNsZWFuQ29tcHRlUmVuZHUsXG59IGZyb20gXCIuLi9jbGVhbmVyc1wiXG5pbXBvcnQge1xuICBkYXRhc2V0cyxcbiAgRW5hYmxlZERhdGFzZXRzLFxuICBnZXRFbmFibGVkRGF0YXNldHMsXG4gIGZpbHRlckJ5TGVnaXNsYXR1cmUsXG59IGZyb20gXCIuLi9kYXRhc2V0c1wiXG5pbXBvcnQgeyBkb3dubG9hZEFuZFBhcnNlIH0gZnJvbSBcIi4vcmV0cmlldmVfZG9jdW1lbnRzXCJcbmltcG9ydCB7IGV4aXN0aW5nRGF0ZVRvSnNvbiwgcGF0Y2hlZERhdGVUb0pzb24gfSBmcm9tIFwiLi4vZGF0ZXNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHtcbiAgQWN0ZXVyLFxuICBDb252ZXJ0IGFzIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LFxuICBPcmdhbmUsXG59IGZyb20gXCIuLi90eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBZ2VuZGFzQ29udmVydCwgUmV1bmlvbiB9IGZyb20gXCIuLi90eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IEFtZW5kZW1lbnQsIENvbnZlcnQgYXMgQW1lbmRlbWVudHNDb252ZXJ0IH0gZnJvbSBcIi4uL3R5cGVzL2FtZW5kZW1lbnRzXCJcbmltcG9ydCB7XG4gIENvbnZlcnQgYXMgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQsXG4gIERvY3VtZW50LFxuICBEb3NzaWVyUGFybGVtZW50YWlyZSxcbn0gZnJvbSBcIi4uL3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgU2NydXRpbnNDb252ZXJ0LCBTY3J1dGluIH0gZnJvbSBcIi4uL3R5cGVzL3NjcnV0aW5zXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgUXVlc3Rpb25zQ29udmVydCwgUXVlc3Rpb24gfSBmcm9tIFwiLi4vdHlwZXMvcXVlc3Rpb25zXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQ29tcHRlc1JlbmR1c0NvbnZlcnQsIENvbXB0ZVJlbmR1IH0gZnJvbSBcIi4uL3R5cGVzL2RlYmF0c1wiXG5pbXBvcnQge1xuICBjbG9uZU9wdGlvbixcbiAgY29tbWl0T3B0aW9uLFxuICByZW1vdGVPcHRpb24sXG4gIGxlZ2lzbGF0dXJlT3B0aW9uLFxuICBjYXRlZ29yaWVzT3B0aW9uLFxuICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbiAgc2lsZW50T3B0aW9uLFxuICB2ZXJib3NlT3B0aW9uLFxuICBwdWxsT3B0aW9uLFxuICBmZXRjaERvY3VtZW50c09wdGlvbixcbiAgcGFyc2VEb2N1bWVudHNPcHRpb24sXG4gIGRvY3VtZW50Rm9ybWF0T3B0aW9uLFxufSBmcm9tIFwiLi9zaGFyZWQvY2xpX2hlbHBlcnNcIlxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiBhbnkge1xuICBjb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gICAgY2xvbmVPcHRpb24sXG4gICAgY29tbWl0T3B0aW9uLFxuICAgIHJlbW90ZU9wdGlvbixcbiAgICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgICBjYXRlZ29yaWVzT3B0aW9uLFxuICAgIHNpbGVudE9wdGlvbixcbiAgICB2ZXJib3NlT3B0aW9uLFxuICAgIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICAgIHB1bGxPcHRpb24sXG4gICAgZmV0Y2hEb2N1bWVudHNPcHRpb24sXG4gICAgcGFyc2VEb2N1bWVudHNPcHRpb24sXG4gICAgZG9jdW1lbnRGb3JtYXRPcHRpb24sXG4gICAge1xuICAgICAgYWxpYXM6IFwiZFwiLFxuICAgICAgaGVscDogXCJzaW5nbGUgZGF0YXNldCB0byByZW9yZ2FuaXplXCIsXG4gICAgICBuYW1lOiBcImRhdGFzZXRcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHA6IFwiZG8gbm90IHJlc2V0IC0taGFyZCBhZnRlciBjb21taXQgdG8gc2F2ZSBJL08gaWYgdGhlIHdvcmtpbmcgdHJlZSBpcyB0byBiZSBkaXNjYXJkZWRcIixcbiAgICAgIG5hbWU6IFwibm8tcmVzZXQtYWZ0ZXItY29tbWl0XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiVlwiLFxuICAgICAgaGVscDogXCJkb24ndCB2YWxpZGF0ZSBkYXRhXCIsXG4gICAgICBuYW1lOiBcIm5vLXZhbGlkYXRlXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMsIHtcbiAgICBhcmd2OiBhcmd2LFxuICB9KVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBjbG9uZUdpdChcbiAgZ2l0R3JvdXBVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGF0YXNldE5hbWU6IHN0cmluZyxcbiAgZGF0YURpcjogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGdpdC5jbG9uZShnaXRHcm91cFVybCwgYCR7ZGF0YXNldE5hbWV9X25ldHRveWVgLCBkYXRhRGlyKVxufVxuXG5mdW5jdGlvbiBjb21taXRHaXQoXG4gIGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nLFxuICBvcHRpb25zOiBhbnksXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN1YmRpcmVjdG9yaWVzOiBhbnksXG4pOiBudW1iZXIge1xuICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgIFwiTm91dmVsbGUgbW9pc3NvblwiLFxuICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgKVxuICAgIGlmIChcbiAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgIChleGl0Q29kZSA9PT0gMCAmJiBlcnJvckNvZGUgIT09IDAgJiYgZXJyb3JDb2RlICE9PSAxMClcbiAgICApIHtcbiAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgfVxuICB9XG4gIGlmIChcbiAgICBjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgc3ViZGlyZWN0b3JpZXMpICYmXG4gICAgKGV4aXRDb2RlID09PSAwIHx8IGV4aXRDb2RlID09PSAxMClcbiAgKSB7XG4gICAgZXhpdENvZGUgPSAxXG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlXG59XG5cbmZ1bmN0aW9uIGNsZWFuQW5kVmFsaWRhdGVEYXRhPFQ+KFxuICBkYXRhOiBhbnksXG4gIGNsZWFuZXI6IChkYXRhOiBUKSA9PiB2b2lkLFxuICBmcm9tSnNvbjogKGpzb246IHN0cmluZykgPT4gVCxcbiAgdG9Kc29uOiAoZGF0YTogVCkgPT4gc3RyaW5nLFxuICBub1ZhbGlkYXRlOiBCb29sZWFuLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNsZWFuZXIoZGF0YSlcbiAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIEJ5IGNvbnZlbnRpb246IGFuIGVtcHR5IG9iamVjdCBtdXN0IGJlIGRlbGV0ZWQuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCBqc29uRGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpXG4gIGlmICghbm9WYWxpZGF0ZSkge1xuICAgIHJldHVybiBqc29uRGF0YVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHZhbGlkYXRlZERhdGE6IFQgPSBmcm9tSnNvbihqc29uRGF0YSlcbiAgICByZXR1cm4gdG9Kc29uKHZhbGlkYXRlZERhdGEpXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ZpbGVzPFQ+KFxuICBkYXRhc2V0UmF3RGlyOiBzdHJpbmcsXG4gIGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nLFxuICB3YWxrRGlyUGFyYW1zOiBhbnlbXSxcbiAgY2xlYW5lcjogYW55LFxuICBkYXRhQ29udmVydGVyOiB7IGZyb21Kc29uOiBhbnk7IHRvSnNvbjogYW55IH0sXG4gIG9wdGlvbnM6IGFueSxcbiAgcG9zdFByb2Nlc3Nvcj86IGFueSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoQXJyYXkgb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCB3YWxrRGlyUGFyYW1zKSkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZmlsZVBhdGhBcnJheVtmaWxlUGF0aEFycmF5Lmxlbmd0aCAtIDFdXG4gICAgaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSBjb250aW51ZVxuICAgIGNvbnN0IHJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXRSYXdEaXIsIC4uLmZpbGVQYXRoQXJyYXkpXG4gICAgY29uc3QgcmF3SnNvbiA9IGZzLnJlYWRGaWxlU3luYyhyYXdGaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICBpZiAob3B0aW9ucy52ZXJib3NlKSBjb25zb2xlLmxvZyhgQ2xlYW5pbmcgZmlsZTogJHtyYXdGaWxlUGF0aH0uLi5gKVxuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhd0pzb24pXG4gICAgY29uc3QgdmFsaWRhdGVEYXRhID0gIW9wdGlvbnNbXCJuby12YWxpZGF0ZVwiXVxuICAgIGNvbnN0IGNsZWFuSnNvbiA9IGNsZWFuQW5kVmFsaWRhdGVEYXRhPFQ+KFxuICAgICAgZGF0YSxcbiAgICAgIGNsZWFuZXIsXG4gICAgICBkYXRhQ29udmVydGVyLmZyb21Kc29uLFxuICAgICAgZGF0YUNvbnZlcnRlci50b0pzb24sXG4gICAgICB2YWxpZGF0ZURhdGEsXG4gICAgKVxuXG4gICAgaWYgKGNsZWFuSnNvbiAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgY2xlYW5GaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0Q2xlYW5EaXIsIC4uLmZpbGVQYXRoQXJyYXkpXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShjbGVhbkZpbGVQYXRoKSlcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY2xlYW5GaWxlUGF0aCwgY2xlYW5Kc29uLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KVxuXG4gICAgICBpZiAocG9zdFByb2Nlc3Nvcikge1xuICAgICAgICBhd2FpdCBwb3N0UHJvY2Vzc29yKGRhdGEsIGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW5SZW9yZ2FuaXplZERhdGEob3B0aW9uczogYW55KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgZGF0YURpcjogc3RyaW5nID0gb3B0aW9ucy5kYXRhRGlyXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IHBhdGNoZWREYXRlVG9Kc29uXG4gIGxldCBleGl0Q29kZSA9IG9wdGlvbnMuY29tbWl0ID8gMTAgOiAwXG4gIGNvbnN0IGdpdEdyb3VwVXJsID0gb3B0aW9ucy5jbG9uZT8udHJpbSgpLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgY29uc3QgZW5hYmxlZERhdGFzZXRzID0gZ2V0RW5hYmxlZERhdGFzZXRzKG9wdGlvbnMuY2F0ZWdvcmllcylcbiAgbGV0IGNob3NlbkRhdGFzZXRzID0gZmlsdGVyQnlMZWdpc2xhdHVyZShkYXRhc2V0cywgb3B0aW9ucy5sZWdpc2xhdHVyZSlcblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGAke2RhdGFzZXRSYXdEaXJ9X25ldHRveWVgXG4gICAgICBpZiAob3B0aW9ucy5wdWxsKSB7XG4gICAgICAgIGdpdC5yZXNldEFuZFB1bGwoZGF0YXNldENsZWFuRGlyKVxuICAgICAgfVxuXG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgYXdhaXQgcHJvY2Vzc0ZpbGVzPEFjdGV1cj4oXG4gICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgW1wiYWN0ZXVyc1wiXSxcbiAgICAgICAgY2xlYW5BY3RldXIsXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9BY3RldXIsXG4gICAgICAgICAgdG9Kc29uOiBBY3RldXJzRXRPcmdhbmVzQ29udmVydC5hY3RldXJUb0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG4gICAgICBhd2FpdCBwcm9jZXNzRmlsZXM8T3JnYW5lPihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXCJvcmdhbmVzXCJdLFxuICAgICAgICBjbGVhbk9yZ2FuZSxcbiAgICAgICAge1xuICAgICAgICAgIGZyb21Kc29uOiBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b09yZ2FuZSxcbiAgICAgICAgICB0b0pzb246IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0Lm9yZ2FuZVRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcblxuICAgICAgZXhpdENvZGUgPSBjb21taXRHaXQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBleGl0Q29kZSwgW1xuICAgICAgICBcImFjdGV1cnNcIixcbiAgICAgICAgXCJvcmdhbmVzXCIsXG4gICAgICBdKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGAke2RhdGFzZXRSYXdEaXJ9X25ldHRveWVgXG5cbiAgICAgIGF3YWl0IHByb2Nlc3NGaWxlczxSZXVuaW9uPihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXSxcbiAgICAgICAgY2xlYW5SZXVuaW9uLFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbUpzb246IEFnZW5kYXNDb252ZXJ0LnRvUmV1bmlvbixcbiAgICAgICAgICB0b0pzb246IEFnZW5kYXNDb252ZXJ0LnJldW5pb25Ub0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG5cbiAgICAgIGV4aXRDb2RlID0gY29tbWl0R2l0KGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgZXhpdENvZGUsIFtcIi5cIl0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjbG9uZUdpdChnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBgJHtkYXRhc2V0UmF3RGlyfV9uZXR0b3llYFxuXG4gICAgICBhd2FpdCBwcm9jZXNzRmlsZXM8QW1lbmRlbWVudD4oXG4gICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgW10sXG4gICAgICAgIGNsZWFuQW1lbmRlbWVudCxcbiAgICAgICAge1xuICAgICAgICAgIGZyb21Kc29uOiBBbWVuZGVtZW50c0NvbnZlcnQudG9BbWVuZGVtZW50LFxuICAgICAgICAgIHRvSnNvbjogQW1lbmRlbWVudHNDb252ZXJ0LmFtZW5kZW1lbnRUb0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG5cbiAgICAgIGV4aXRDb2RlID0gY29tbWl0R2l0KGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgZXhpdENvZGUsIFtcIi5cIl0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gYCR7ZGF0YXNldFJhd0Rpcn1fbmV0dG95ZWBcblxuICAgICAgYXdhaXQgcHJvY2Vzc0ZpbGVzPERvY3VtZW50PihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXCJkb2N1bWVudHNcIl0sXG4gICAgICAgIGNsZWFuRG9jdW1lbnRPckRpdmlzaW9uLFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbUpzb246IERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LnRvRG9jdW1lbnQsXG4gICAgICAgICAgdG9Kc29uOiBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC5kb2N1bWVudFRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgZG93bmxvYWRBbmRQYXJzZSxcbiAgICAgIClcbiAgICAgIGF3YWl0IHByb2Nlc3NGaWxlczxEb3NzaWVyUGFybGVtZW50YWlyZT4oXG4gICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgW1wiZG9zc2llcnNcIl0sXG4gICAgICAgIGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUsXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgICAgICAgICB0b0pzb246IERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LmRvc3NpZXJQYXJsZW1lbnRhaXJlVG9Kc29uLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKVxuXG4gICAgICBleGl0Q29kZSA9IGNvbW1pdEdpdChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIGV4aXRDb2RlLCBbXG4gICAgICAgIFwiZG9jdW1lbnRzXCIsXG4gICAgICAgIFwiZG9zc2llcnNcIixcbiAgICAgIF0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5TY3J1dGlucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5zY3J1dGlucykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjbG9uZUdpdChnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBgJHtkYXRhc2V0UmF3RGlyfV9uZXR0b3llYFxuXG4gICAgICBhd2FpdCBwcm9jZXNzRmlsZXM8U2NydXRpbj4oXG4gICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgW10sXG4gICAgICAgIGNsZWFuU2NydXRpbixcbiAgICAgICAge1xuICAgICAgICAgIGZyb21Kc29uOiBTY3J1dGluc0NvbnZlcnQudG9TY3J1dGluLFxuICAgICAgICAgIHRvSnNvbjogU2NydXRpbnNDb252ZXJ0LnNjcnV0aW5Ub0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG5cbiAgICAgIGV4aXRDb2RlID0gY29tbWl0R2l0KGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgZXhpdENvZGUsIFtcIi5cIl0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5RdWVzdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMucXVlc3Rpb25zKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGAke2RhdGFzZXRSYXdEaXJ9X25ldHRveWVgXG5cbiAgICAgIGF3YWl0IHByb2Nlc3NGaWxlczxRdWVzdGlvbj4oXG4gICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgW10sXG4gICAgICAgIGNsZWFuUXVlc3Rpb24sXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogUXVlc3Rpb25zQ29udmVydC50b1F1ZXN0aW9uLFxuICAgICAgICAgIHRvSnNvbjogUXVlc3Rpb25zQ29udmVydC5xdWVzdGlvblRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcblxuICAgICAgZXhpdENvZGUgPSBjb21taXRHaXQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBleGl0Q29kZSwgW1wiLlwiXSlcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkNvbXB0ZXNSZW5kdXNTZWFuY2VzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmNvbXB0ZXNSZW5kdXNTZWFuY2VzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIueG1sXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gYCR7ZGF0YXNldFJhd0Rpcn1fbmV0dG95ZWBcblxuICAgICAgYXdhaXQgcHJvY2Vzc0ZpbGVzPENvbXB0ZVJlbmR1PihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXSxcbiAgICAgICAgY2xlYW5Db21wdGVSZW5kdSxcbiAgICAgICAge1xuICAgICAgICAgIGZyb21Kc29uOiBDb21wdGVzUmVuZHVzQ29udmVydC50b0NvbXB0ZVJlbmR1LFxuICAgICAgICAgIHRvSnNvbjogQ29tcHRlc1JlbmR1c0NvbnZlcnQuY29tcHRlUmVuZHVUb0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG5cbiAgICAgIGV4aXRDb2RlID0gY29tbWl0R2l0KGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgZXhpdENvZGUsIFtcIi5cIl0pXG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdG9yZSBzdGFuZGFyZCBjb252ZXJzaW9uIG9mIGRhdGVzIHRvIEpTT04uXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGV4aXN0aW5nRGF0ZVRvSnNvblxuXG4gIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICBjb25zb2xlLmxvZyhcIkZpbmlzaGVkICFcIilcbiAgfVxuXG4gIHJldHVybiBleGl0Q29kZVxufVxuXG5mdW5jdGlvbiBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSB7XG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGAke2RhdGFzZXRSYXdEaXJ9X25ldHRveWVgXG4gIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICBjb25zb2xlLmxvZyhgQ2xlYW5pbmcgZGlyZWN0b3J5OiAke2RhdGFzZXRDbGVhbkRpcn3igKZgKVxuICB9XG4gIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldENsZWFuRGlyKVxuICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRDbGVhbkRpcikpIHtcbiAgICBpZiAoZmlsZW5hbWVbMF0gPT09IFwiLlwiKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBwYXRobmFtZSA9IHBhdGguam9pbihkYXRhc2V0Q2xlYW5EaXIsIGZpbGVuYW1lKVxuICAgIGZzLnJlbW92ZVN5bmMocGF0aG5hbWUpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QW5kUHVzaFVpZChcbiAgcmVwb3NpdG9yeURpcjogc3RyaW5nLFxuICBvcHRpb25zOiBhbnksXG4gIHN1YmRpcmVjdG9yaWVzOiBhbnksXG4pOiBib29sZWFuIHtcbiAgbGV0IGVycm9yID0gZmFsc2VcbiAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgZ2l0LnVpZEJyYW5jaFVwZGF0ZShcbiAgICAgIHJlcG9zaXRvcnlEaXIsXG4gICAgICBzdWJkaXJlY3RvcmllcyxcbiAgICAgIG9wdGlvbnNbXCJuby1yZXNldC1hZnRlci1jb21taXRcIl0sXG4gICAgKVxuICAgIGZvciAoY29uc3QgcmVtb3RlIG9mIG9wdGlvbnMucmVtb3RlIHx8IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBnaXQucnVuKHJlcG9zaXRvcnlEaXIsIGBwdXNoIC0tcXVpZXQgJHtyZW1vdGV9IHVpZDp1aWRgKVxuICAgICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZXJyb3Jcbn1cblxuZnVuY3Rpb24gbWFpbihhcmd2OiBhbnkpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VBcmdzKGFyZ3YpXG4gIHJldHVybiBjbGVhblJlb3JnYW5pemVkRGF0YShvcHRpb25zKVxufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChwcm9jZXNzLmFyZ3ZbMV0uZW5kc1dpdGgoXCJjbGVhbl9yZW9yZ2FuaXplZF9kYXRhLnRzXCIpKSB7XG4gIG1haW4ocHJvY2Vzcy5hcmd2KS50aGVuKHByb2Nlc3MuZXhpdClcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsZUFBZSxNQUFNLG1CQUFtQjtBQUMvQyxPQUFPQyxFQUFFLE1BQU0sVUFBVTtBQUN6QixPQUFPQyxJQUFJLE1BQU0sTUFBTTtBQUFBLFNBRXJCQyxXQUFXLEVBQ1hDLGVBQWUsRUFDZkMsdUJBQXVCLEVBQ3ZCQyx5QkFBeUIsRUFDekJDLFdBQVcsRUFDWEMsWUFBWSxFQUNaQyxZQUFZLEVBQ1pDLGFBQWEsRUFDYkMsZ0JBQWdCO0FBQUEsU0FHaEJDLFFBQVEsRUFDUkMsZUFBZSxFQUNmQyxrQkFBa0IsRUFDbEJDLG1CQUFtQjtBQUFBLFNBRVpDLGdCQUFnQjtBQUFBLFNBQ2hCQyxrQkFBa0IsRUFBRUMsaUJBQWlCO0FBQUEsU0FDckNDLE9BQU87QUFBQSxPQUNULEtBQUtDLEdBQUc7QUFBQSxTQUdiQyxPQUFPLElBQUlDLHVCQUF1QjtBQUFBLFNBRzNCRCxPQUFPLElBQUlFLGNBQWM7QUFBQSxTQUNiRixPQUFPLElBQUlHLGtCQUFrQjtBQUFBLFNBRWhESCxPQUFPLElBQUlJLDBCQUEwQjtBQUFBLFNBSTlCSixPQUFPLElBQUlLLGVBQWU7QUFBQSxTQUMxQkwsT0FBTyxJQUFJTSxnQkFBZ0I7QUFBQSxTQUMzQk4sT0FBTyxJQUFJTyxvQkFBb0I7QUFBQSxTQUV0Q0MsV0FBVyxFQUNYQyxZQUFZLEVBQ1pDLFlBQVksRUFDWkMsaUJBQWlCLEVBQ2pCQyxnQkFBZ0IsRUFDaEJDLG9CQUFvQixFQUNwQkMsWUFBWSxFQUNaQyxhQUFh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
|
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
require("core-js/modules/es.symbol.js");
|
|
4
|
-
require("core-js/modules/es.symbol.description.js");
|
|
5
|
-
require("core-js/modules/es.symbol.iterator.js");
|
|
6
|
-
require("core-js/modules/es.array.from.js");
|
|
7
|
-
require("core-js/modules/es.array.is-array.js");
|
|
8
|
-
require("core-js/modules/es.array.iterator.js");
|
|
9
|
-
require("core-js/modules/es.array.slice.js");
|
|
10
|
-
require("core-js/modules/es.date.to-string.js");
|
|
11
|
-
require("core-js/modules/es.function.name.js");
|
|
12
|
-
require("core-js/modules/es.regexp.to-string.js");
|
|
13
|
-
require("core-js/modules/es.string.iterator.js");
|
|
14
|
-
require("core-js/modules/web.dom-collections.iterator.js");
|
|
15
|
-
require("core-js/modules/es.array.for-each.js");
|
|
16
|
-
require("core-js/modules/es.array.join.js");
|
|
17
|
-
require("core-js/modules/es.date.to-json.js");
|
|
18
|
-
require("core-js/modules/es.object.keys.js");
|
|
19
|
-
require("core-js/modules/es.object.to-string.js");
|
|
20
|
-
require("core-js/modules/es.regexp.exec.js");
|
|
21
|
-
require("core-js/modules/es.string.replace.js");
|
|
22
|
-
var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
|
|
23
|
-
var _fsExtra = _interopRequireDefault(require("fs-extra"));
|
|
24
|
-
var _path = _interopRequireDefault(require("path"));
|
|
25
|
-
var _deepObjectDiff = require("deep-object-diff");
|
|
26
|
-
var _datasets = require("../datasets");
|
|
27
|
-
var _file_systems = require("../file_systems");
|
|
28
|
-
var _cli_helpers = require("./shared/cli_helpers");
|
|
29
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
30
|
-
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
31
|
-
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
32
|
-
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
33
|
-
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
34
|
-
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
35
|
-
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
36
|
-
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
37
|
-
var diffedAmendments = [];
|
|
38
|
-
var newAmendments = [];
|
|
39
|
-
var optionsDefinitions = [_cli_helpers.silentOption, _cli_helpers.verboseOption, _cli_helpers.dataDirDefaultOption, {
|
|
40
|
-
alias: "m",
|
|
41
|
-
help: "Diff modes.",
|
|
42
|
-
name: "mode",
|
|
43
|
-
defaultValue: "merged",
|
|
44
|
-
type: String
|
|
45
|
-
}, {
|
|
46
|
-
alias: "p",
|
|
47
|
-
help: "Directory containing the previous dump of amendments",
|
|
48
|
-
name: "previous",
|
|
49
|
-
type: String
|
|
50
|
-
}, {
|
|
51
|
-
alias: "o",
|
|
52
|
-
help: "Output directory for diff files",
|
|
53
|
-
name: "output",
|
|
54
|
-
defaultValue: "./diff_outputs/",
|
|
55
|
-
type: String
|
|
56
|
-
}];
|
|
57
|
-
var options = (0, _commandLineArgs["default"])(optionsDefinitions);
|
|
58
|
-
function diffAmendements(dataDir) {
|
|
59
|
-
if (!options.previous) {
|
|
60
|
-
console.error("No previous data folder specified. You must provide one with the -p or --previous option. Exiting...");
|
|
61
|
-
process.exit();
|
|
62
|
-
}
|
|
63
|
-
if (!_fsExtra["default"].existsSync(options.output)) {
|
|
64
|
-
console.error("The output dir does not exists. You must provide an existing directory. Default directory is ./diff_outputs/");
|
|
65
|
-
process.exit();
|
|
66
|
-
}
|
|
67
|
-
var _iterator = _createForOfIteratorHelper(_datasets.datasets.amendements),
|
|
68
|
-
_step;
|
|
69
|
-
try {
|
|
70
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
71
|
-
var dataset = _step.value;
|
|
72
|
-
switch (dataset.structure) {
|
|
73
|
-
case _datasets.DatasetStructure.SegmentedFiles:
|
|
74
|
-
{
|
|
75
|
-
var originalJsonDir = _path["default"].join(dataDir, dataset.filename);
|
|
76
|
-
if (!options.silent) {
|
|
77
|
-
console.log("Diffing ".concat(originalJsonDir, " folder..."));
|
|
78
|
-
}
|
|
79
|
-
var _iterator2 = _createForOfIteratorHelper((0, _file_systems.walkDir)(originalJsonDir)),
|
|
80
|
-
_step2;
|
|
81
|
-
try {
|
|
82
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
83
|
-
var amendementSplitPath = _step2.value;
|
|
84
|
-
var newFilePath = originalJsonDir + "/" + amendementSplitPath.join("/");
|
|
85
|
-
var newFile = JSON.parse(_fsExtra["default"].readFileSync(newFilePath).toLocaleString());
|
|
86
|
-
var oldFilePath = options.previous + dataset.filename + "/" + amendementSplitPath.join("/");
|
|
87
|
-
var oldFileExists = _fsExtra["default"].existsSync(oldFilePath);
|
|
88
|
-
if (!oldFileExists) {
|
|
89
|
-
// If file found does not exist in the previous dump
|
|
90
|
-
if (!options.silent) {
|
|
91
|
-
console.log("File did not exists previously. Guessing it's a new amendment. Adding to the diff list for new objects");
|
|
92
|
-
}
|
|
93
|
-
addToQueueForNewAmendments(newFile, amendementSplitPath);
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// File already existed in previous dump
|
|
98
|
-
var oldFile = JSON.parse("{}");
|
|
99
|
-
try {
|
|
100
|
-
// Gather data of the file and retranscript as a Json object
|
|
101
|
-
oldFile = JSON.parse(_fsExtra["default"].readFileSync(oldFilePath).toLocaleString());
|
|
102
|
-
} catch (e) {
|
|
103
|
-
// Skip the process to the next iteration in case of corrupt JSON data
|
|
104
|
-
continue;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Generate the diff beetween the two JSON objects (old & new dump)
|
|
108
|
-
var diff = (0, _deepObjectDiff.detailedDiff)(oldFile, newFile);
|
|
109
|
-
|
|
110
|
-
// If no changes beetween the two dumps
|
|
111
|
-
if (Object.keys(diff.added).length === 0 && Object.keys(diff.updated).length === 0 && Object.keys(diff.deleted).length === 0) {
|
|
112
|
-
// Skip to next iteration as there is no need to generate a file
|
|
113
|
-
continue;
|
|
114
|
-
} else {
|
|
115
|
-
if (!options.silent) {
|
|
116
|
-
console.log("Changes found !");
|
|
117
|
-
}
|
|
118
|
-
addToQueueForDiffedAmendments(diff, amendementSplitPath);
|
|
119
|
-
}
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
} catch (err) {
|
|
123
|
-
_iterator2.e(err);
|
|
124
|
-
} finally {
|
|
125
|
-
_iterator2.f();
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
if (!options.silent) {
|
|
130
|
-
console.log("Generating output(s)");
|
|
131
|
-
}
|
|
132
|
-
generateDiffFiles();
|
|
133
|
-
}
|
|
134
|
-
} catch (err) {
|
|
135
|
-
_iterator.e(err);
|
|
136
|
-
} finally {
|
|
137
|
-
_iterator.f();
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* General process for output of diffs.
|
|
143
|
-
* The script handles two different modes :
|
|
144
|
-
* - merged : Will output a single file for new amendements and a single file
|
|
145
|
-
* for updated amendements
|
|
146
|
-
* - splitted : Will output a single file for each amendments, either its new or updated.
|
|
147
|
-
*
|
|
148
|
-
*/
|
|
149
|
-
function generateDiffFiles() {
|
|
150
|
-
// Handles merged mode
|
|
151
|
-
if (options.mode === "merged") {
|
|
152
|
-
if (!options.silent) {
|
|
153
|
-
console.log("Generating merged files");
|
|
154
|
-
}
|
|
155
|
-
if (diffedAmendments.length > 0) {
|
|
156
|
-
if (!options.silent) {
|
|
157
|
-
console.log("Generating diffed amendments files");
|
|
158
|
-
}
|
|
159
|
-
_fsExtra["default"].writeFileSync(options.output + "amendements_XV_diffed.json", JSON.stringify(diffedAmendments), {
|
|
160
|
-
encoding: "utf8",
|
|
161
|
-
flag: "w"
|
|
162
|
-
});
|
|
163
|
-
} else {
|
|
164
|
-
if (!options.silent) {
|
|
165
|
-
console.log("No diff in the already existing amendments");
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
if (newAmendments.length > 0) {
|
|
169
|
-
if (!options.silent) {
|
|
170
|
-
console.log("Generating new amendments file");
|
|
171
|
-
}
|
|
172
|
-
_fsExtra["default"].writeFileSync(options.output + "amendements_XV_new.json", JSON.stringify(newAmendments), {
|
|
173
|
-
encoding: "utf8",
|
|
174
|
-
flag: "w"
|
|
175
|
-
});
|
|
176
|
-
} else {
|
|
177
|
-
if (!options.silent) {
|
|
178
|
-
console.log("No new amendement. Skipping file generation");
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
} else if (options.mode === "splitted") {
|
|
182
|
-
// Handles splitted mode
|
|
183
|
-
if (!options.silent) {
|
|
184
|
-
console.log("Generating separated files");
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Process the copy action of the new and diffed amendments
|
|
189
|
-
*/
|
|
190
|
-
|
|
191
|
-
diffedAmendments.forEach(function (diffedAmendment) {
|
|
192
|
-
generateSingleDiffedAmendment(diffedAmendment);
|
|
193
|
-
});
|
|
194
|
-
newAmendments.forEach(function (newAmendment) {
|
|
195
|
-
generateSingleNewAmendment(newAmendment);
|
|
196
|
-
});
|
|
197
|
-
} else {
|
|
198
|
-
console.error("Unknown output mode. Aborting...");
|
|
199
|
-
process.exit();
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// Pushes an amendment to the queue that will be processed to copy new amendments files
|
|
204
|
-
function addToQueueForNewAmendments(file, path) {
|
|
205
|
-
var amendment = {
|
|
206
|
-
path: path,
|
|
207
|
-
data: file
|
|
208
|
-
};
|
|
209
|
-
newAmendments.push(amendment);
|
|
210
|
-
}
|
|
211
|
-
// Pushes an amendment to the queue that will be processed to copy updated amendments files
|
|
212
|
-
function addToQueueForDiffedAmendments(diffedData, path) {
|
|
213
|
-
var amendment = {
|
|
214
|
-
path: path,
|
|
215
|
-
data: diffedData
|
|
216
|
-
};
|
|
217
|
-
diffedAmendments.push(amendment);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// generates a file with a copy of the new amendement
|
|
221
|
-
function generateSingleNewAmendment(newAmendment) {
|
|
222
|
-
newAmendment.path.shift();
|
|
223
|
-
var shortDir = _toConsumableArray(newAmendment.path);
|
|
224
|
-
shortDir.pop();
|
|
225
|
-
console.log(options.output + shortDir.join("/"));
|
|
226
|
-
_fsExtra["default"].mkdirSync(options.output + shortDir.join("/"), {
|
|
227
|
-
recursive: true
|
|
228
|
-
});
|
|
229
|
-
_fsExtra["default"].writeFileSync(options.output + newAmendment.path.join("/").replace(/(\.json)/, ".new$1"), JSON.stringify(newAmendment.data), {
|
|
230
|
-
encoding: "utf8",
|
|
231
|
-
flag: "w"
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// generates a file with a copy of the modified data of the previously existing amendment;
|
|
236
|
-
function generateSingleDiffedAmendment(diffedAmendment) {
|
|
237
|
-
diffedAmendment.path.shift();
|
|
238
|
-
var shortDir = _toConsumableArray(diffedAmendment.path);
|
|
239
|
-
shortDir.pop();
|
|
240
|
-
_fsExtra["default"].mkdirSync(options.output + shortDir.join("/"), {
|
|
241
|
-
recursive: true
|
|
242
|
-
});
|
|
243
|
-
_fsExtra["default"].writeFileSync(options.output + diffedAmendment.path.join("/").replace(/(\.json)/, ".diff$1"), JSON.stringify(diffedAmendment.data), {
|
|
244
|
-
encoding: "utf8",
|
|
245
|
-
flag: "w"
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
diffAmendements(options.dataDir);
|
|
249
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29tbWFuZExpbmVBcmdzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZnNFeHRyYSIsIl9wYXRoIiwiX2RlZXBPYmplY3REaWZmIiwiX2RhdGFzZXRzIiwiX2ZpbGVfc3lzdGVtcyIsIl9jbGlfaGVscGVycyIsImUiLCJfX2VzTW9kdWxlIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiciIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJUeXBlRXJyb3IiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiZnJvbSIsImlzQXJyYXkiLCJfYXJyYXlMaWtlVG9BcnJheSIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwidCIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsInRlc3QiLCJkaWZmZWRBbWVuZG1lbnRzIiwibmV3QW1lbmRtZW50cyIsIm9wdGlvbnNEZWZpbml0aW9ucyIsInNpbGVudE9wdGlvbiIsInZlcmJvc2VPcHRpb24iLCJkYXRhRGlyRGVmYXVsdE9wdGlvbiIsImFsaWFzIiwiaGVscCIsImRlZmF1bHRWYWx1ZSIsInR5cGUiLCJTdHJpbmciLCJvcHRpb25zIiwiY29tbWFuZExpbmVBcmdzIiwiZGlmZkFtZW5kZW1lbnRzIiwiZGF0YURpciIsInByZXZpb3VzIiwiY29uc29sZSIsImVycm9yIiwicHJvY2VzcyIsImV4aXQiLCJmcyIsImV4aXN0c1N5bmMiLCJvdXRwdXQiLCJfaXRlcmF0b3IiLCJkYXRhc2V0cyIsImFtZW5kZW1lbnRzIiwiX3N0ZXAiLCJkYXRhc2V0Iiwic3RydWN0dXJlIiwiRGF0YXNldFN0cnVjdHVyZSIsIlNlZ21lbnRlZEZpbGVzIiwib3JpZ2luYWxKc29uRGlyIiwicGF0aCIsImpvaW4iLCJmaWxlbmFtZSIsInNpbGVudCIsImxvZyIsImNvbmNhdCIsIl9pdGVyYXRvcjIiLCJ3YWxrRGlyIiwiX3N0ZXAyIiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsIm5ld0ZpbGVQYXRoIiwibmV3RmlsZSIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsInRvTG9jYWxlU3RyaW5nIiwib2xkRmlsZVBhdGgiLCJvbGRGaWxlRXhpc3RzIiwiYWRkVG9RdWV1ZUZvck5ld0FtZW5kbWVudHMiLCJvbGRGaWxlIiwiZGlmZiIsImRldGFpbGVkRGlmZiIsIk9iamVjdCIsImtleXMiLCJhZGRlZCIsInVwZGF0ZWQiLCJkZWxldGVkIiwiYWRkVG9RdWV1ZUZvckRpZmZlZEFtZW5kbWVudHMiLCJlcnIiLCJnZW5lcmF0ZURpZmZGaWxlcyIsIm1vZGUiLCJ3cml0ZUZpbGVTeW5jIiwic3RyaW5naWZ5IiwiZW5jb2RpbmciLCJmbGFnIiwiZm9yRWFjaCIsImRpZmZlZEFtZW5kbWVudCIsImdlbmVyYXRlU2luZ2xlRGlmZmVkQW1lbmRtZW50IiwibmV3QW1lbmRtZW50IiwiZ2VuZXJhdGVTaW5nbGVOZXdBbWVuZG1lbnQiLCJmaWxlIiwiYW1lbmRtZW50IiwiZGF0YSIsInB1c2giLCJkaWZmZWREYXRhIiwic2hpZnQiLCJzaG9ydERpciIsInBvcCIsIm1rZGlyU3luYyIsInJlY3Vyc2l2ZSIsInJlcGxhY2UiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9kaWZmX2FtZW5kZW1lbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgZGV0YWlsZWREaWZmIH0gZnJvbSBcImRlZXAtb2JqZWN0LWRpZmZcIlxuaW1wb3J0IHsgZGF0YXNldHMsIERhdGFzZXRTdHJ1Y3R1cmUgfSBmcm9tIFwiLi4vZGF0YXNldHNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0IHtcbiAgc2lsZW50T3B0aW9uLFxuICB2ZXJib3NlT3B0aW9uLFxuICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbn0gZnJvbSBcIi4vc2hhcmVkL2NsaV9oZWxwZXJzXCJcbmNvbnN0IGRpZmZlZEFtZW5kbWVudHM6IEFycmF5PGFueT4gPSBbXVxuY29uc3QgbmV3QW1lbmRtZW50czogQXJyYXk8YW55PiA9IFtdXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAgc2lsZW50T3B0aW9uLFxuICB2ZXJib3NlT3B0aW9uLFxuICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbiAge1xuICAgIGFsaWFzOiBcIm1cIixcbiAgICBoZWxwOiBcIkRpZmYgbW9kZXMuXCIsXG4gICAgbmFtZTogXCJtb2RlXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIm1lcmdlZFwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInBcIixcbiAgICBoZWxwOiBcIkRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwcmV2aW91cyBkdW1wIG9mIGFtZW5kbWVudHNcIixcbiAgICBuYW1lOiBcInByZXZpb3VzXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwib1wiLFxuICAgIGhlbHA6IFwiT3V0cHV0IGRpcmVjdG9yeSBmb3IgZGlmZiBmaWxlc1wiLFxuICAgIG5hbWU6IFwib3V0cHV0XCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIi4vZGlmZl9vdXRwdXRzL1wiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbl1cbmNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zKVxuXG5mdW5jdGlvbiBkaWZmQW1lbmRlbWVudHMoZGF0YURpcjogc3RyaW5nKSB7XG4gIGlmICghb3B0aW9ucy5wcmV2aW91cykge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIk5vIHByZXZpb3VzIGRhdGEgZm9sZGVyIHNwZWNpZmllZC4gWW91IG11c3QgcHJvdmlkZSBvbmUgd2l0aCB0aGUgLXAgb3IgLS1wcmV2aW91cyBvcHRpb24uIEV4aXRpbmcuLi5cIixcbiAgICApXG4gICAgcHJvY2Vzcy5leGl0KClcbiAgfVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhvcHRpb25zLm91dHB1dCkpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJUaGUgb3V0cHV0IGRpciBkb2VzIG5vdCBleGlzdHMuIFlvdSBtdXN0IHByb3ZpZGUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiBEZWZhdWx0IGRpcmVjdG9yeSBpcyAuL2RpZmZfb3V0cHV0cy9cIixcbiAgICApXG4gICAgcHJvY2Vzcy5leGl0KClcbiAgfVxuXG4gIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczoge1xuICAgICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0LmZpbGVuYW1lKVxuICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYERpZmZpbmcgJHtvcmlnaW5hbEpzb25EaXJ9IGZvbGRlci4uLmApXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihvcmlnaW5hbEpzb25EaXIpKSB7XG4gICAgICAgICAgY29uc3QgbmV3RmlsZVBhdGggPVxuICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyICsgXCIvXCIgKyBhbWVuZGVtZW50U3BsaXRQYXRoLmpvaW4oXCIvXCIpXG4gICAgICAgICAgY29uc3QgbmV3RmlsZSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMobmV3RmlsZVBhdGgpLnRvTG9jYWxlU3RyaW5nKCksXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY29uc3Qgb2xkRmlsZVBhdGggPVxuICAgICAgICAgICAgb3B0aW9ucy5wcmV2aW91cyArXG4gICAgICAgICAgICBkYXRhc2V0LmZpbGVuYW1lICtcbiAgICAgICAgICAgIFwiL1wiICtcbiAgICAgICAgICAgIGFtZW5kZW1lbnRTcGxpdFBhdGguam9pbihcIi9cIilcbiAgICAgICAgICBjb25zdCBvbGRGaWxlRXhpc3RzID0gZnMuZXhpc3RzU3luYyhvbGRGaWxlUGF0aClcbiAgICAgICAgICBpZiAoIW9sZEZpbGVFeGlzdHMpIHtcbiAgICAgICAgICAgIC8vIElmIGZpbGUgZm91bmQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHByZXZpb3VzIGR1bXBcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgXCJGaWxlIGRpZCBub3QgZXhpc3RzIHByZXZpb3VzbHkuIEd1ZXNzaW5nIGl0J3MgYSBuZXcgYW1lbmRtZW50LiBBZGRpbmcgdG8gdGhlIGRpZmYgbGlzdCBmb3IgbmV3IG9iamVjdHNcIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkVG9RdWV1ZUZvck5ld0FtZW5kbWVudHMobmV3RmlsZSwgYW1lbmRlbWVudFNwbGl0UGF0aClcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRmlsZSBhbHJlYWR5IGV4aXN0ZWQgaW4gcHJldmlvdXMgZHVtcFxuICAgICAgICAgIGxldCBvbGRGaWxlOiBKU09OID0gSlNPTi5wYXJzZShcInt9XCIpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEdhdGhlciBkYXRhIG9mIHRoZSBmaWxlIGFuZCByZXRyYW5zY3JpcHQgYXMgYSBKc29uIG9iamVjdFxuICAgICAgICAgICAgb2xkRmlsZSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG9sZEZpbGVQYXRoKS50b0xvY2FsZVN0cmluZygpKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHByb2Nlc3MgdG8gdGhlIG5leHQgaXRlcmF0aW9uIGluIGNhc2Ugb2YgY29ycnVwdCBKU09OIGRhdGFcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gR2VuZXJhdGUgdGhlIGRpZmYgYmVldHdlZW4gdGhlIHR3byBKU09OIG9iamVjdHMgKG9sZCAmIG5ldyBkdW1wKVxuICAgICAgICAgIGNvbnN0IGRpZmY6IGFueSA9IGRldGFpbGVkRGlmZihvbGRGaWxlLCBuZXdGaWxlKVxuXG4gICAgICAgICAgLy8gSWYgbm8gY2hhbmdlcyBiZWV0d2VlbiB0aGUgdHdvIGR1bXBzXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlmZi5hZGRlZCkubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkaWZmLnVwZGF0ZWQpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlmZi5kZWxldGVkKS5sZW5ndGggPT09IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFNraXAgdG8gbmV4dCBpdGVyYXRpb24gYXMgdGhlcmUgaXMgbm8gbmVlZCB0byBnZW5lcmF0ZSBhIGZpbGVcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDaGFuZ2VzIGZvdW5kICFcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZFRvUXVldWVGb3JEaWZmZWRBbWVuZG1lbnRzKGRpZmYsIGFtZW5kZW1lbnRTcGxpdFBhdGgpXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgb3V0cHV0KHMpXCIpXG4gICAgfVxuXG4gICAgZ2VuZXJhdGVEaWZmRmlsZXMoKVxuICB9XG59XG5cbi8qKlxuICogR2VuZXJhbCBwcm9jZXNzIGZvciBvdXRwdXQgb2YgZGlmZnMuXG4gKiBUaGUgc2NyaXB0IGhhbmRsZXMgdHdvIGRpZmZlcmVudCBtb2RlcyA6XG4gKiAtIG1lcmdlZCA6IFdpbGwgb3V0cHV0IGEgc2luZ2xlIGZpbGUgZm9yIG5ldyBhbWVuZGVtZW50cyBhbmQgYSBzaW5nbGUgZmlsZVxuICogICAgICAgICAgICBmb3IgdXBkYXRlZCBhbWVuZGVtZW50c1xuICogLSBzcGxpdHRlZCA6IFdpbGwgb3V0cHV0IGEgc2luZ2xlIGZpbGUgZm9yIGVhY2ggYW1lbmRtZW50cywgZWl0aGVyIGl0cyBuZXcgb3IgdXBkYXRlZC5cbiAqXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRGlmZkZpbGVzKCkge1xuICAvLyBIYW5kbGVzIG1lcmdlZCBtb2RlXG4gIGlmIChvcHRpb25zLm1vZGUgPT09IFwibWVyZ2VkXCIpIHtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgbWVyZ2VkIGZpbGVzXCIpXG4gICAgfVxuXG4gICAgaWYgKGRpZmZlZEFtZW5kbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgZGlmZmVkIGFtZW5kbWVudHMgZmlsZXNcIilcbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgIG9wdGlvbnMub3V0cHV0ICsgXCJhbWVuZGVtZW50c19YVl9kaWZmZWQuanNvblwiLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShkaWZmZWRBbWVuZG1lbnRzKSxcbiAgICAgICAgeyBlbmNvZGluZzogXCJ1dGY4XCIsIGZsYWc6IFwid1wiIH0sXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJObyBkaWZmIGluIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFtZW5kbWVudHNcIilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV3QW1lbmRtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiR2VuZXJhdGluZyBuZXcgYW1lbmRtZW50cyBmaWxlXCIpXG4gICAgICB9XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBvcHRpb25zLm91dHB1dCArIFwiYW1lbmRlbWVudHNfWFZfbmV3Lmpzb25cIixcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkobmV3QW1lbmRtZW50cyksXG4gICAgICAgIHsgZW5jb2Rpbmc6IFwidXRmOFwiLCBmbGFnOiBcIndcIiB9LFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTm8gbmV3IGFtZW5kZW1lbnQuIFNraXBwaW5nIGZpbGUgZ2VuZXJhdGlvblwiKVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChvcHRpb25zLm1vZGUgPT09IFwic3BsaXR0ZWRcIikge1xuICAgIC8vIEhhbmRsZXMgc3BsaXR0ZWQgbW9kZVxuICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiR2VuZXJhdGluZyBzZXBhcmF0ZWQgZmlsZXNcIilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBjb3B5IGFjdGlvbiBvZiB0aGUgbmV3IGFuZCBkaWZmZWQgYW1lbmRtZW50c1xuICAgICAqL1xuXG4gICAgZGlmZmVkQW1lbmRtZW50cy5mb3JFYWNoKChkaWZmZWRBbWVuZG1lbnQ6IGFueSkgPT4ge1xuICAgICAgZ2VuZXJhdGVTaW5nbGVEaWZmZWRBbWVuZG1lbnQoZGlmZmVkQW1lbmRtZW50KVxuICAgIH0pXG5cbiAgICBuZXdBbWVuZG1lbnRzLmZvckVhY2goKG5ld0FtZW5kbWVudDogYW55KSA9PiB7XG4gICAgICBnZW5lcmF0ZVNpbmdsZU5ld0FtZW5kbWVudChuZXdBbWVuZG1lbnQpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKFwiVW5rbm93biBvdXRwdXQgbW9kZS4gQWJvcnRpbmcuLi5cIilcbiAgICBwcm9jZXNzLmV4aXQoKVxuICB9XG59XG5cbi8vIFB1c2hlcyBhbiBhbWVuZG1lbnQgdG8gdGhlIHF1ZXVlIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQgdG8gY29weSBuZXcgYW1lbmRtZW50cyBmaWxlc1xuZnVuY3Rpb24gYWRkVG9RdWV1ZUZvck5ld0FtZW5kbWVudHMoZmlsZTogYW55LCBwYXRoOiBhbnkpOiB2b2lkIHtcbiAgY29uc3QgYW1lbmRtZW50OiBhbnkgPSB7XG4gICAgcGF0aDogcGF0aCxcbiAgICBkYXRhOiBmaWxlLFxuICB9XG4gIG5ld0FtZW5kbWVudHMucHVzaChhbWVuZG1lbnQpXG59XG4vLyBQdXNoZXMgYW4gYW1lbmRtZW50IHRvIHRoZSBxdWV1ZSB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIHRvIGNvcHkgdXBkYXRlZCBhbWVuZG1lbnRzIGZpbGVzXG5mdW5jdGlvbiBhZGRUb1F1ZXVlRm9yRGlmZmVkQW1lbmRtZW50cyhkaWZmZWREYXRhOiBhbnksIHBhdGg6IGFueSk6IHZvaWQge1xuICBjb25zdCBhbWVuZG1lbnQ6IGFueSA9IHtcbiAgICBwYXRoOiBwYXRoLFxuICAgIGRhdGE6IGRpZmZlZERhdGEsXG4gIH1cbiAgZGlmZmVkQW1lbmRtZW50cy5wdXNoKGFtZW5kbWVudClcbn1cblxuLy8gZ2VuZXJhdGVzIGEgZmlsZSB3aXRoIGEgY29weSBvZiB0aGUgbmV3IGFtZW5kZW1lbnRcbmZ1bmN0aW9uIGdlbmVyYXRlU2luZ2xlTmV3QW1lbmRtZW50KG5ld0FtZW5kbWVudDoge1xuICBwYXRoOiBBcnJheTxzdHJpbmc+XG4gIGRhdGE6IGFueVxufSkge1xuICBuZXdBbWVuZG1lbnQucGF0aC5zaGlmdCgpXG5cbiAgY29uc3Qgc2hvcnREaXI6IEFycmF5PGFueT4gPSBbLi4ubmV3QW1lbmRtZW50LnBhdGhdXG4gIHNob3J0RGlyLnBvcCgpXG4gIGNvbnNvbGUubG9nKG9wdGlvbnMub3V0cHV0ICsgc2hvcnREaXIuam9pbihcIi9cIikpXG4gIGZzLm1rZGlyU3luYyhvcHRpb25zLm91dHB1dCArIHNob3J0RGlyLmpvaW4oXCIvXCIpLCB7XG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICB9KVxuICBmcy53cml0ZUZpbGVTeW5jKFxuICAgIG9wdGlvbnMub3V0cHV0ICsgbmV3QW1lbmRtZW50LnBhdGguam9pbihcIi9cIikucmVwbGFjZSgvKFxcLmpzb24pLywgXCIubmV3JDFcIiksXG4gICAgSlNPTi5zdHJpbmdpZnkobmV3QW1lbmRtZW50LmRhdGEpLFxuICAgIHsgZW5jb2Rpbmc6IFwidXRmOFwiLCBmbGFnOiBcIndcIiB9LFxuICApXG59XG5cbi8vIGdlbmVyYXRlcyBhIGZpbGUgd2l0aCBhIGNvcHkgb2YgdGhlIG1vZGlmaWVkIGRhdGEgb2YgdGhlIHByZXZpb3VzbHkgZXhpc3RpbmcgYW1lbmRtZW50O1xuZnVuY3Rpb24gZ2VuZXJhdGVTaW5nbGVEaWZmZWRBbWVuZG1lbnQoZGlmZmVkQW1lbmRtZW50OiB7XG4gIHBhdGg6IEFycmF5PHN0cmluZz5cbiAgZGF0YTogYW55XG59KSB7XG4gIGRpZmZlZEFtZW5kbWVudC5wYXRoLnNoaWZ0KClcblxuICBjb25zdCBzaG9ydERpcjogQXJyYXk8YW55PiA9IFsuLi5kaWZmZWRBbWVuZG1lbnQucGF0aF1cbiAgc2hvcnREaXIucG9wKClcbiAgZnMubWtkaXJTeW5jKG9wdGlvbnMub3V0cHV0ICsgc2hvcnREaXIuam9pbihcIi9cIiksIHtcbiAgICByZWN1cnNpdmU6IHRydWUsXG4gIH0pXG5cbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBvcHRpb25zLm91dHB1dCArXG4gICAgICBkaWZmZWRBbWVuZG1lbnQucGF0aC5qb2luKFwiL1wiKS5yZXBsYWNlKC8oXFwuanNvbikvLCBcIi5kaWZmJDFcIiksXG4gICAgSlNPTi5zdHJpbmdpZnkoZGlmZmVkQW1lbmRtZW50LmRhdGEpLFxuICAgIHsgZW5jb2Rpbmc6IFwidXRmOFwiLCBmbGFnOiBcIndcIiB9LFxuICApXG59XG5cbmRpZmZBbWVuZGVtZW50cyhvcHRpb25zLmRhdGFEaXIpXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLGdCQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxlQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxTQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxhQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxZQUFBLEdBQUFOLE9BQUE7QUFJNkIsU0FBQUQsdUJBQUFRLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxnQkFBQUEsQ0FBQTtBQUFBLFNBQUFFLG1CQUFBQyxDQUFBLFdBQUFDLGtCQUFBLENBQUFELENBQUEsS0FBQUUsZ0JBQUEsQ0FBQUYsQ0FBQSxLQUFBRywyQkFBQSxDQUFBSCxDQUFBLEtBQUFJLGtCQUFBO0FBQUEsU0FBQUEsbUJBQUEsY0FBQUMsU0FBQTtBQUFBLFNBQUFILGlCQUFBRixDQUFBLDhCQUFBTSxNQUFBLFlBQUFOLENBQUEsQ0FBQU0sTUFBQSxDQUFBQyxRQUFBLGFBQUFQLENBQUEsdUJBQUFRLEtBQUEsQ0FBQUMsSUFBQSxDQUFBVCxDQUFBO0FBQUEsU0FBQUMsbUJBQUFELENBQUEsUUFBQVEsS0FBQSxDQUFBRSxPQUFBLENBQUFWLENBQUEsVUFBQVcsaUJBQUEsQ0FBQVgsQ0FBQTtBQUFBLFNBQUFZLDJCQUFBWixDQUFBLEVBQUFILENBQUEsUUFBQWdCLENBQUEseUJBQUFQLE1BQUEsSUFBQU4sQ0FBQSxDQUFBTSxNQUFBLENBQUFDLFFBQUEsS0FBQVAsQ0FBQSxxQkFBQWEsQ0FBQSxRQUFBTCxLQUFBLENBQUFFLE9BQUEsQ0FBQVYsQ0FBQSxNQUFBYSxDQUFBLEdBQUFWLDJCQUFBLENBQUFILENBQUEsTUFBQUgsQ0FBQSxJQUFBRyxDQUFBLHVCQUFBQSxDQUFBLENBQUFjLE1BQUEsSUFBQUQsQ0FBQSxLQUFBYixDQUFBLEdBQUFhLENBQUEsT0FBQUUsRUFBQSxNQUFBQyxDQUFBLFlBQUFBLEVBQUEsZUFBQUMsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUEsRUFBQSxXQUFBSCxFQUFBLElBQUFmLENBQUEsQ0FBQWMsTUFBQSxLQUFBSyxJQUFBLFdBQUFBLElBQUEsTUFBQUMsS0FBQSxFQUFBcEIsQ0FBQSxDQUFBZSxFQUFBLFVBQUFsQixDQUFBLFdBQUFBLEVBQUFHLENBQUEsVUFBQUEsQ0FBQSxLQUFBcUIsQ0FBQSxFQUFBTCxDQUFBLGdCQUFBWCxTQUFBLGlKQUFBaUIsQ0FBQSxFQUFBQyxDQUFBLE9BQUFDLENBQUEsZ0JBQUFQLENBQUEsV0FBQUEsRUFBQSxJQUFBSixDQUFBLEdBQUFBLENBQUEsQ0FBQVksSUFBQSxDQUFBekIsQ0FBQSxNQUFBa0IsQ0FBQSxXQUFBQSxFQUFBLFFBQUFsQixDQUFBLEdBQUFhLENBQUEsQ0FBQWEsSUFBQSxXQUFBSCxDQUFBLEdBQUF2QixDQUFBLENBQUFtQixJQUFBLEVBQUFuQixDQUFBLEtBQUFILENBQUEsV0FBQUEsRUFBQUcsQ0FBQSxJQUFBd0IsQ0FBQSxPQUFBRixDQUFBLEdBQUF0QixDQUFBLEtBQUFxQixDQUFBLFdBQUFBLEVBQUEsVUFBQUUsQ0FBQSxZQUFBVixDQUFBLGNBQUFBLENBQUEsOEJBQUFXLENBQUEsUUFBQUYsQ0FBQTtBQUFBLFNBQUFuQiw0QkFBQUgsQ0FBQSxFQUFBdUIsQ0FBQSxRQUFBdkIsQ0FBQSwyQkFBQUEsQ0FBQSxTQUFBVyxpQkFBQSxDQUFBWCxDQUFBLEVBQUF1QixDQUFBLE9BQUFWLENBQUEsTUFBQWMsUUFBQSxDQUFBRixJQUFBLENBQUF6QixDQUFBLEVBQUE0QixLQUFBLDZCQUFBZixDQUFBLElBQUFiLENBQUEsQ0FBQTZCLFdBQUEsS0FBQWhCLENBQUEsR0FBQWIsQ0FBQSxDQUFBNkIsV0FBQSxDQUFBQyxJQUFBLGFBQUFqQixDQUFBLGNBQUFBLENBQUEsR0FBQUwsS0FBQSxDQUFBQyxJQUFBLENBQUFULENBQUEsb0JBQUFhLENBQUEsK0NBQUFrQixJQUFBLENBQUFsQixDQUFBLElBQUFGLGlCQUFBLENBQUFYLENBQUEsRUFBQXVCLENBQUE7QUFBQSxTQUFBWixrQkFBQVgsQ0FBQSxFQUFBdUIsQ0FBQSxhQUFBQSxDQUFBLElBQUFBLENBQUEsR0FBQXZCLENBQUEsQ0FBQWMsTUFBQSxNQUFBUyxDQUFBLEdBQUF2QixDQUFBLENBQUFjLE1BQUEsWUFBQWpCLENBQUEsTUFBQXFCLENBQUEsR0FBQVYsS0FBQSxDQUFBZSxDQUFBLEdBQUExQixDQUFBLEdBQUEwQixDQUFBLEVBQUExQixDQUFBLElBQUFxQixDQUFBLENBQUFyQixDQUFBLElBQUFHLENBQUEsQ0FBQUgsQ0FBQSxVQUFBcUIsQ0FBQTtBQUM3QixJQUFNYyxnQkFBNEIsR0FBRyxFQUFFO0FBQ3ZDLElBQU1DLGFBQXlCLEdBQUcsRUFBRTtBQUVwQyxJQUFNQyxrQkFBa0IsR0FBRyxDQUN6QkMseUJBQVksRUFDWkMsMEJBQWEsRUFDYkMsaUNBQW9CLEVBQ3BCO0VBQ0VDLEtBQUssRUFBRSxHQUFHO0VBQ1ZDLElBQUksRUFBRSxhQUFhO0VBQ25CVCxJQUFJLEVBQUUsTUFBTTtFQUNaVSxZQUFZLEVBQUUsUUFBUTtFQUN0QkMsSUFBSSxFQUFFQztBQUNSLENBQUMsRUFDRDtFQUNFSixLQUFLLEVBQUUsR0FBRztFQUNWQyxJQUFJLEVBQUUsc0RBQXNEO0VBQzVEVCxJQUFJLEVBQUUsVUFBVTtFQUNoQlcsSUFBSSxFQUFFQztBQUNSLENBQUMsRUFDRDtFQUNFSixLQUFLLEVBQUUsR0FBRztFQUNWQyxJQUFJLEVBQUUsaUNBQWlDO0VBQ3ZDVCxJQUFJLEVBQUUsUUFBUTtFQUNkVSxZQUFZLEVBQUUsaUJBQWlCO0VBQy9CQyxJQUFJLEVBQUVDO0FBQ1IsQ0FBQyxDQUNGO0FBQ0QsSUFBTUMsT0FBTyxHQUFHLElBQUFDLDJCQUFlLEVBQUNWLGtCQUFrQixDQUFDO0FBRW5ELFNBQVNXLGVBQWVBLENBQUNDLE9BQWUsRUFBRTtFQUN4QyxJQUFJLENBQUNILE9BQU8sQ0FBQ0ksUUFBUSxFQUFFO0lBQ3JCQyxPQUFPLENBQUNDLEtBQUssQ0FDWCxzR0FDRixDQUFDO0lBQ0RDLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLENBQUM7RUFDaEI7RUFFQSxJQUFJLENBQUNDLG1CQUFFLENBQUNDLFVBQVUsQ0FBQ1YsT0FBTyxDQUFDVyxNQUFNLENBQUMsRUFBRTtJQUNsQ04sT0FBTyxDQUFDQyxLQUFLLENBQ1gsOEdBQ0YsQ0FBQztJQUNEQyxPQUFPLENBQUNDLElBQUksQ0FBQyxDQUFDO0VBQ2hCO0VBQUMsSUFBQUksU0FBQSxHQUFBM0MsMEJBQUEsQ0FFcUI0QyxrQkFBUSxDQUFDQyxXQUFXO0lBQUFDLEtBQUE7RUFBQTtJQUExQyxLQUFBSCxTQUFBLENBQUF0QyxDQUFBLE1BQUF5QyxLQUFBLEdBQUFILFNBQUEsQ0FBQXJDLENBQUEsSUFBQUMsSUFBQSxHQUE0QztNQUFBLElBQWpDd0MsT0FBTyxHQUFBRCxLQUFBLENBQUF0QyxLQUFBO01BQ2hCLFFBQVF1QyxPQUFPLENBQUNDLFNBQVM7UUFDdkIsS0FBS0MsMEJBQWdCLENBQUNDLGNBQWM7VUFBRTtZQUNwQyxJQUFNQyxlQUF1QixHQUFHQyxnQkFBSSxDQUFDQyxJQUFJLENBQUNuQixPQUFPLEVBQUVhLE9BQU8sQ0FBQ08sUUFBUSxDQUFDO1lBQ3BFLElBQUksQ0FBQ3ZCLE9BQU8sQ0FBQ3dCLE1BQU0sRUFBRTtjQUNuQm5CLE9BQU8sQ0FBQ29CLEdBQUcsWUFBQUMsTUFBQSxDQUFZTixlQUFlLGVBQVksQ0FBQztZQUNyRDtZQUFDLElBQUFPLFVBQUEsR0FBQTFELDBCQUFBLENBRWlDLElBQUEyRCxxQkFBTyxFQUFDUixlQUFlLENBQUM7Y0FBQVMsTUFBQTtZQUFBO2NBQTFELEtBQUFGLFVBQUEsQ0FBQXJELENBQUEsTUFBQXVELE1BQUEsR0FBQUYsVUFBQSxDQUFBcEQsQ0FBQSxJQUFBQyxJQUFBLEdBQTREO2dCQUFBLElBQWpEc0QsbUJBQW1CLEdBQUFELE1BQUEsQ0FBQXBELEtBQUE7Z0JBQzVCLElBQU1zRCxXQUFXLEdBQ2ZYLGVBQWUsR0FBRyxHQUFHLEdBQUdVLG1CQUFtQixDQUFDUixJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUN2RCxJQUFNVSxPQUFPLEdBQUdDLElBQUksQ0FBQ0MsS0FBSyxDQUN4QnpCLG1CQUFFLENBQUMwQixZQUFZLENBQUNKLFdBQVcsQ0FBQyxDQUFDSyxjQUFjLENBQUMsQ0FDOUMsQ0FBQztnQkFFRCxJQUFNQyxXQUFXLEdBQ2ZyQyxPQUFPLENBQUNJLFFBQVEsR0FDaEJZLE9BQU8sQ0FBQ08sUUFBUSxHQUNoQixHQUFHLEdBQ0hPLG1CQUFtQixDQUFDUixJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUMvQixJQUFNZ0IsYUFBYSxHQUFHN0IsbUJBQUUsQ0FBQ0MsVUFBVSxDQUFDMkIsV0FBVyxDQUFDO2dCQUNoRCxJQUFJLENBQUNDLGFBQWEsRUFBRTtrQkFDbEI7a0JBQ0EsSUFBSSxDQUFDdEMsT0FBTyxDQUFDd0IsTUFBTSxFQUFFO29CQUNuQm5CLE9BQU8sQ0FBQ29CLEdBQUcsQ0FDVCx3R0FDRixDQUFDO2tCQUNIO2tCQUNBYywwQkFBMEIsQ0FBQ1AsT0FBTyxFQUFFRixtQkFBbUIsQ0FBQztrQkFDeEQ7Z0JBQ0Y7O2dCQUVBO2dCQUNBLElBQUlVLE9BQWEsR0FBR1AsSUFBSSxDQUFDQyxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUNwQyxJQUFJO2tCQUNGO2tCQUNBTSxPQUFPLEdBQUdQLElBQUksQ0FBQ0MsS0FBSyxDQUFDekIsbUJBQUUsQ0FBQzBCLFlBQVksQ0FBQ0UsV0FBVyxDQUFDLENBQUNELGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLENBQUMsQ0FBQyxPQUFPbEYsQ0FBQyxFQUFFO2tCQUNWO2tCQUNBO2dCQUNGOztnQkFFQTtnQkFDQSxJQUFNdUYsSUFBUyxHQUFHLElBQUFDLDRCQUFZLEVBQUNGLE9BQU8sRUFBRVIsT0FBTyxDQUFDOztnQkFFaEQ7Z0JBQ0EsSUFDRVcsTUFBTSxDQUFDQyxJQUFJLENBQUNILElBQUksQ0FBQ0ksS0FBSyxDQUFDLENBQUMxRSxNQUFNLEtBQUssQ0FBQyxJQUNwQ3dFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSCxJQUFJLENBQUNLLE9BQU8sQ0FBQyxDQUFDM0UsTUFBTSxLQUFLLENBQUMsSUFDdEN3RSxNQUFNLENBQUNDLElBQUksQ0FBQ0gsSUFBSSxDQUFDTSxPQUFPLENBQUMsQ0FBQzVFLE1BQU0sS0FBSyxDQUFDLEVBQ3RDO2tCQUNBO2tCQUNBO2dCQUNGLENBQUMsTUFBTTtrQkFDTCxJQUFJLENBQUM2QixPQUFPLENBQUN3QixNQUFNLEVBQUU7b0JBQ25CbkIsT0FBTyxDQUFDb0IsR0FBRyxDQUFDLGlCQUFpQixDQUFDO2tCQUNoQztrQkFDQXVCLDZCQUE2QixDQUFDUCxJQUFJLEVBQUVYLG1CQUFtQixDQUFDO2dCQUMxRDtnQkFDQTtjQUNGO1lBQUMsU0FBQW1CLEdBQUE7Y0FBQXRCLFVBQUEsQ0FBQXpFLENBQUEsQ0FBQStGLEdBQUE7WUFBQTtjQUFBdEIsVUFBQSxDQUFBakQsQ0FBQTtZQUFBO1VBQ0g7TUFDRjtNQUVBLElBQUksQ0FBQ3NCLE9BQU8sQ0FBQ3dCLE1BQU0sRUFBRTtRQUNuQm5CLE9BQU8sQ0FBQ29CLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztNQUNyQztNQUVBeUIsaUJBQWlCLENBQUMsQ0FBQztJQUNyQjtFQUFDLFNBQUFELEdBQUE7SUFBQXJDLFNBQUEsQ0FBQTFELENBQUEsQ0FBQStGLEdBQUE7RUFBQTtJQUFBckMsU0FBQSxDQUFBbEMsQ0FBQTtFQUFBO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVN3RSxpQkFBaUJBLENBQUEsRUFBRztFQUMzQjtFQUNBLElBQUlsRCxPQUFPLENBQUNtRCxJQUFJLEtBQUssUUFBUSxFQUFFO0lBQzdCLElBQUksQ0FBQ25ELE9BQU8sQ0FBQ3dCLE1BQU0sRUFBRTtNQUNuQm5CLE9BQU8sQ0FBQ29CLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQztJQUN4QztJQUVBLElBQUlwQyxnQkFBZ0IsQ0FBQ2xCLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDL0IsSUFBSSxDQUFDNkIsT0FBTyxDQUFDd0IsTUFBTSxFQUFFO1FBQ25CbkIsT0FBTyxDQUFDb0IsR0FBRyxDQUFDLG9DQUFvQyxDQUFDO01BQ25EO01BQ0FoQixtQkFBRSxDQUFDMkMsYUFBYSxDQUNkcEQsT0FBTyxDQUFDVyxNQUFNLEdBQUcsNEJBQTRCLEVBQzdDc0IsSUFBSSxDQUFDb0IsU0FBUyxDQUFDaEUsZ0JBQWdCLENBQUMsRUFDaEM7UUFBRWlFLFFBQVEsRUFBRSxNQUFNO1FBQUVDLElBQUksRUFBRTtNQUFJLENBQ2hDLENBQUM7SUFDSCxDQUFDLE1BQU07TUFDTCxJQUFJLENBQUN2RCxPQUFPLENBQUN3QixNQUFNLEVBQUU7UUFDbkJuQixPQUFPLENBQUNvQixHQUFHLENBQUMsNENBQTRDLENBQUM7TUFDM0Q7SUFDRjtJQUVBLElBQUluQyxhQUFhLENBQUNuQixNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQzVCLElBQUksQ0FBQzZCLE9BQU8sQ0FBQ3dCLE1BQU0sRUFBRTtRQUNuQm5CLE9BQU8sQ0FBQ29CLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQztNQUMvQztNQUNBaEIsbUJBQUUsQ0FBQzJDLGFBQWEsQ0FDZHBELE9BQU8sQ0FBQ1csTUFBTSxHQUFHLHlCQUF5QixFQUMxQ3NCLElBQUksQ0FBQ29CLFNBQVMsQ0FBQy9ELGFBQWEsQ0FBQyxFQUM3QjtRQUFFZ0UsUUFBUSxFQUFFLE1BQU07UUFBRUMsSUFBSSxFQUFFO01BQUksQ0FDaEMsQ0FBQztJQUNILENBQUMsTUFBTTtNQUNMLElBQUksQ0FBQ3ZELE9BQU8sQ0FBQ3dCLE1BQU0sRUFBRTtRQUNuQm5CLE9BQU8sQ0FBQ29CLEdBQUcsQ0FBQyw2Q0FBNkMsQ0FBQztNQUM1RDtJQUNGO0VBQ0YsQ0FBQyxNQUFNLElBQUl6QixPQUFPLENBQUNtRCxJQUFJLEtBQUssVUFBVSxFQUFFO0lBQ3RDO0lBQ0EsSUFBSSxDQUFDbkQsT0FBTyxDQUFDd0IsTUFBTSxFQUFFO01BQ25CbkIsT0FBTyxDQUFDb0IsR0FBRyxDQUFDLDRCQUE0QixDQUFDO0lBQzNDOztJQUVBO0FBQ0o7QUFDQTs7SUFFSXBDLGdCQUFnQixDQUFDbUUsT0FBTyxDQUFDLFVBQUNDLGVBQW9CLEVBQUs7TUFDakRDLDZCQUE2QixDQUFDRCxlQUFlLENBQUM7SUFDaEQsQ0FBQyxDQUFDO0lBRUZuRSxhQUFhLENBQUNrRSxPQUFPLENBQUMsVUFBQ0csWUFBaUIsRUFBSztNQUMzQ0MsMEJBQTBCLENBQUNELFlBQVksQ0FBQztJQUMxQyxDQUFDLENBQUM7RUFDSixDQUFDLE1BQU07SUFDTHRELE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLGtDQUFrQyxDQUFDO0lBQ2pEQyxPQUFPLENBQUNDLElBQUksQ0FBQyxDQUFDO0VBQ2hCO0FBQ0Y7O0FBRUE7QUFDQSxTQUFTK0IsMEJBQTBCQSxDQUFDc0IsSUFBUyxFQUFFeEMsSUFBUyxFQUFRO0VBQzlELElBQU15QyxTQUFjLEdBQUc7SUFDckJ6QyxJQUFJLEVBQUVBLElBQUk7SUFDVjBDLElBQUksRUFBRUY7RUFDUixDQUFDO0VBQ0R2RSxhQUFhLENBQUMwRSxJQUFJLENBQUNGLFNBQVMsQ0FBQztBQUMvQjtBQUNBO0FBQ0EsU0FBU2QsNkJBQTZCQSxDQUFDaUIsVUFBZSxFQUFFNUMsSUFBUyxFQUFRO0VBQ3ZFLElBQU15QyxTQUFjLEdBQUc7SUFDckJ6QyxJQUFJLEVBQUVBLElBQUk7SUFDVjBDLElBQUksRUFBRUU7RUFDUixDQUFDO0VBQ0Q1RSxnQkFBZ0IsQ0FBQzJFLElBQUksQ0FBQ0YsU0FBUyxDQUFDO0FBQ2xDOztBQUVBO0FBQ0EsU0FBU0YsMEJBQTBCQSxDQUFDRCxZQUduQyxFQUFFO0VBQ0RBLFlBQVksQ0FBQ3RDLElBQUksQ0FBQzZDLEtBQUssQ0FBQyxDQUFDO0VBRXpCLElBQU1DLFFBQW9CLEdBQUEvRyxrQkFBQSxDQUFPdUcsWUFBWSxDQUFDdEMsSUFBSSxDQUFDO0VBQ25EOEMsUUFBUSxDQUFDQyxHQUFHLENBQUMsQ0FBQztFQUNkL0QsT0FBTyxDQUFDb0IsR0FBRyxDQUFDekIsT0FBTyxDQUFDVyxNQUFNLEdBQUd3RCxRQUFRLENBQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDaERiLG1CQUFFLENBQUM0RCxTQUFTLENBQUNyRSxPQUFPLENBQUNXLE1BQU0sR0FBR3dELFFBQVEsQ0FBQzdDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUNoRGdELFNBQVMsRUFBRTtFQUNiLENBQUMsQ0FBQztFQUNGN0QsbUJBQUUsQ0FBQzJDLGFBQWEsQ0FDZHBELE9BQU8sQ0FBQ1csTUFBTSxHQUFHZ0QsWUFBWSxDQUFDdEMsSUFBSSxDQUFDQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUNpRCxPQUFPLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxFQUMxRXRDLElBQUksQ0FBQ29CLFNBQVMsQ0FBQ00sWUFBWSxDQUFDSSxJQUFJLENBQUMsRUFDakM7SUFBRVQsUUFBUSxFQUFFLE1BQU07SUFBRUMsSUFBSSxFQUFFO0VBQUksQ0FDaEMsQ0FBQztBQUNIOztBQUVBO0FBQ0EsU0FBU0csNkJBQTZCQSxDQUFDRCxlQUd0QyxFQUFFO0VBQ0RBLGVBQWUsQ0FBQ3BDLElBQUksQ0FBQzZDLEtBQUssQ0FBQyxDQUFDO0VBRTVCLElBQU1DLFFBQW9CLEdBQUEvRyxrQkFBQSxDQUFPcUcsZUFBZSxDQUFDcEMsSUFBSSxDQUFDO0VBQ3REOEMsUUFBUSxDQUFDQyxHQUFHLENBQUMsQ0FBQztFQUNkM0QsbUJBQUUsQ0FBQzRELFNBQVMsQ0FBQ3JFLE9BQU8sQ0FBQ1csTUFBTSxHQUFHd0QsUUFBUSxDQUFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ2hEZ0QsU0FBUyxFQUFFO0VBQ2IsQ0FBQyxDQUFDO0VBRUY3RCxtQkFBRSxDQUFDMkMsYUFBYSxDQUNkcEQsT0FBTyxDQUFDVyxNQUFNLEdBQ1o4QyxlQUFlLENBQUNwQyxJQUFJLENBQUNDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQ2lELE9BQU8sQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQy9EdEMsSUFBSSxDQUFDb0IsU0FBUyxDQUFDSSxlQUFlLENBQUNNLElBQUksQ0FBQyxFQUNwQztJQUFFVCxRQUFRLEVBQUUsTUFBTTtJQUFFQyxJQUFJLEVBQUU7RUFBSSxDQUNoQyxDQUFDO0FBQ0g7QUFFQXJELGVBQWUsQ0FBQ0YsT0FBTyxDQUFDRyxPQUFPLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|