@tricoteuses/assemblee 1.0.0-next.2 → 1.0.2

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.
Files changed (135) hide show
  1. package/README.md +2 -0
  2. package/lib/api.js +23 -7
  3. package/lib/api.mjs +41 -0
  4. package/lib/bugs/acteur-00010/plugin.test.js +139 -33
  5. package/lib/bugs/acteur-00010/plugin.test.mjs +33 -0
  6. package/lib/bugs/acteur-00010.js +166 -24
  7. package/lib/bugs/acteur-00010.mjs +31 -0
  8. package/lib/bugs/agenda-00002/plugin.test.js +178 -52
  9. package/lib/bugs/agenda-00002/plugin.test.mjs +52 -0
  10. package/lib/bugs/agenda-00002.js +507 -143
  11. package/lib/bugs/agenda-00002.mjs +197 -0
  12. package/lib/bugs/agenda-00008/plugin.test.js +143 -31
  13. package/lib/bugs/agenda-00008/plugin.test.mjs +31 -0
  14. package/lib/bugs/agenda-00008.js +180 -25
  15. package/lib/bugs/agenda-00008.mjs +30 -0
  16. package/lib/bugs/agenda-00011/plugin.test.js +371 -156
  17. package/lib/bugs/agenda-00011/plugin.test.mjs +156 -0
  18. package/lib/bugs/agenda-00011.js +416 -117
  19. package/lib/bugs/agenda-00011.mjs +150 -0
  20. package/lib/bugs.js +591 -54
  21. package/lib/bugs.mjs +93 -0
  22. package/lib/cleaners/actes_legislatifs.js +149 -61
  23. package/lib/cleaners/actes_legislatifs.mjs +311 -0
  24. package/lib/cleaners/acteurs.js +255 -123
  25. package/lib/cleaners/acteurs.mjs +211 -0
  26. package/lib/cleaners/amendements.js +242 -117
  27. package/lib/cleaners/amendements.mjs +292 -0
  28. package/lib/cleaners/documents.js +147 -62
  29. package/lib/cleaners/documents.mjs +162 -0
  30. package/lib/cleaners/dossiers_legislatifs.js +132 -45
  31. package/lib/cleaners/dossiers_legislatifs.mjs +123 -0
  32. package/lib/cleaners/index.js +64 -8
  33. package/lib/cleaners/index.mjs +8 -0
  34. package/lib/cleaners/organes.js +54 -21
  35. package/lib/cleaners/organes.mjs +64 -0
  36. package/lib/cleaners/reunions.js +237 -127
  37. package/lib/cleaners/reunions.mjs +318 -0
  38. package/lib/cleaners/scrutins.js +261 -99
  39. package/lib/cleaners/scrutins.mjs +254 -0
  40. package/lib/cleaners/xml.js +81 -16
  41. package/lib/cleaners/xml.mjs +42 -0
  42. package/lib/datasets.js +284 -153
  43. package/lib/datasets.mjs +596 -0
  44. package/lib/dates.js +93 -34
  45. package/lib/dates.mjs +98 -0
  46. package/lib/dossiers_legislatifs.js +107 -33
  47. package/lib/dossiers_legislatifs.mjs +215 -0
  48. package/lib/file_systems.js +203 -35
  49. package/lib/file_systems.mjs +64 -0
  50. package/lib/git.js +139 -41
  51. package/lib/git.mjs +114 -0
  52. package/lib/index.js +310 -16
  53. package/lib/index.mjs +16 -0
  54. package/lib/inserters.js +355 -131
  55. package/lib/inserters.mjs +413 -0
  56. package/lib/loaders.js +900 -440
  57. package/lib/loaders.mjs +678 -0
  58. package/lib/organes.js +15 -5
  59. package/lib/organes.mjs +18 -0
  60. package/lib/parsers/documents.js +241 -89
  61. package/lib/parsers/documents.mjs +433 -0
  62. package/lib/parsers/index.js +36 -3
  63. package/lib/parsers/index.mjs +3 -0
  64. package/lib/parsers/recherche_amendements.js +616 -173
  65. package/lib/parsers/recherche_amendements.mjs +189 -0
  66. package/lib/raw_types/acteurs_et_organes.d.ts +36 -148
  67. package/lib/raw_types/acteurs_et_organes.js +228 -506
  68. package/lib/raw_types/acteurs_et_organes.mjs +1240 -0
  69. package/lib/raw_types/agendas.js +165 -75
  70. package/lib/raw_types/agendas.mjs +944 -0
  71. package/lib/raw_types/amendements.js +165 -77
  72. package/lib/raw_types/amendements.mjs +1040 -0
  73. package/lib/raw_types/dossiers_legislatifs.d.ts +1 -43
  74. package/lib/raw_types/dossiers_legislatifs.js +181 -143
  75. package/lib/raw_types/dossiers_legislatifs.mjs +1792 -0
  76. package/lib/raw_types/scrutins.js +144 -61
  77. package/lib/raw_types/scrutins.mjs +645 -0
  78. package/lib/scripts/bugs_helper.js +657 -155
  79. package/lib/scripts/bugs_helper.mjs +286 -0
  80. package/lib/scripts/clean_data.js +380 -145
  81. package/lib/scripts/clean_data.mjs +190 -0
  82. package/lib/scripts/clean_reorganized_data.js +627 -331
  83. package/lib/scripts/clean_reorganized_data.mjs +520 -0
  84. package/lib/scripts/diff_amendements.js +159 -73
  85. package/lib/scripts/diff_amendements.mjs +234 -0
  86. package/lib/scripts/document_dossiers_legislatifs.js +570 -288
  87. package/lib/scripts/document_dossiers_legislatifs.mjs +494 -0
  88. package/lib/scripts/get_today_reunions.js +37 -20
  89. package/lib/scripts/get_today_reunions.mjs +41 -0
  90. package/lib/scripts/merge_scrutins.js +121 -39
  91. package/lib/scripts/merge_scrutins.mjs +69 -0
  92. package/lib/scripts/parse_textes_lois.js +179 -125
  93. package/lib/scripts/parse_textes_lois.mjs +215 -0
  94. package/lib/scripts/raw_types_from_amendements.js +276 -77
  95. package/lib/scripts/raw_types_from_amendements.mjs +118 -0
  96. package/lib/scripts/reorganize_data.js +867 -446
  97. package/lib/scripts/reorganize_data.mjs +712 -0
  98. package/lib/scripts/retrieve_deputes_photos.js +378 -157
  99. package/lib/scripts/retrieve_deputes_photos.mjs +230 -0
  100. package/lib/scripts/retrieve_documents.js +648 -172
  101. package/lib/scripts/retrieve_documents.mjs +292 -0
  102. package/lib/scripts/retrieve_open_data.js +286 -85
  103. package/lib/scripts/retrieve_open_data.mjs +125 -0
  104. package/lib/scripts/retrieve_pending_amendments.js +302 -69
  105. package/lib/scripts/retrieve_pending_amendments.mjs +130 -0
  106. package/lib/scripts/retrieve_senateurs_photos.js +374 -198
  107. package/lib/scripts/retrieve_senateurs_photos.mjs +277 -0
  108. package/lib/scripts/retrieve_textes_lois.js +343 -89
  109. package/lib/scripts/retrieve_textes_lois.mjs +168 -0
  110. package/lib/scripts/test_load.js +30 -11
  111. package/lib/scripts/test_load.mjs +26 -0
  112. package/lib/scripts/test_load_big_files.js +30 -11
  113. package/lib/scripts/test_load_big_files.mjs +26 -0
  114. package/lib/scripts/validate_json.js +370 -120
  115. package/lib/scripts/validate_json.mjs +216 -0
  116. package/lib/shared_types/codes_actes.js +50 -15
  117. package/lib/shared_types/codes_actes.mjs +228 -0
  118. package/lib/strings.js +16 -3
  119. package/lib/strings.mjs +7 -0
  120. package/lib/types/acteurs_et_organes.js +156 -71
  121. package/lib/types/acteurs_et_organes.mjs +918 -0
  122. package/lib/types/agendas.js +154 -67
  123. package/lib/types/agendas.mjs +623 -0
  124. package/lib/types/amendements.js +166 -77
  125. package/lib/types/amendements.mjs +885 -0
  126. package/lib/types/dossiers_legislatifs.d.ts +1 -42
  127. package/lib/types/dossiers_legislatifs.js +182 -143
  128. package/lib/types/dossiers_legislatifs.mjs +1120 -0
  129. package/lib/types/legislatures.js +12 -3
  130. package/lib/types/legislatures.mjs +9 -0
  131. package/lib/types/scrutins.js +144 -61
  132. package/lib/types/scrutins.mjs +528 -0
  133. package/lib/urls.js +44 -25
  134. package/lib/urls.mjs +201 -0
  135. package/package.json +33 -12
@@ -1,21 +1,107 @@
1
- import assert from "assert";
2
- import { execSync } from "child_process";
3
- import commandLineArgs from "command-line-args";
4
- import fs from "fs-extra";
5
- import path from "path";
6
- import { cleanActeur, cleanAmendement, cleanDocumentOrDivision, cleanDossierParlementaire, cleanOrgane, cleanReunion, cleanScrutin } from "../cleaners/index.js";
7
- import { datasets, EnabledDatasets } from "../datasets.js";
8
- import { existingDateToJson, patchedDateToJson } from "../dates.js";
9
- import { walkDir } from "../file_systems.js";
10
- import * as git from "../git.js";
11
- import { Convert as ActeursEtOrganesConvert } from "../types/acteurs_et_organes.js";
12
- import { Convert as AgendasConvert } from "../types/agendas.js";
13
- import { Convert as AmendementsConvert } from "../types/amendements.js";
14
- import { Convert as DossiersLegislatifsConvert } from "../types/dossiers_legislatifs.js";
15
- import { Convert as ScrutinsConvert } from "../types/scrutins.js";
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
+
5
+ require("core-js/modules/es.array.slice.js");
6
+
7
+ require("core-js/modules/es.function.name.js");
8
+
9
+ require("core-js/modules/es.array.from.js");
10
+
11
+ require("core-js/modules/es.string.iterator.js");
12
+
13
+ require("core-js/modules/es.symbol.js");
14
+
15
+ require("core-js/modules/es.symbol.description.js");
16
+
17
+ require("core-js/modules/es.symbol.iterator.js");
18
+
19
+ require("core-js/modules/es.array.iterator.js");
20
+
21
+ require("core-js/modules/web.dom-collections.iterator.js");
22
+
23
+ require("core-js/modules/es.array.is-array.js");
24
+
25
+ require("core-js/modules/es.weak-map.js");
26
+
27
+ require("core-js/modules/es.object.define-property.js");
28
+
29
+ require("core-js/modules/es.object.get-own-property-descriptor.js");
30
+
31
+ require("core-js/modules/es.date.to-json.js");
32
+
33
+ require("core-js/modules/es.date.to-string.js");
34
+
35
+ require("core-js/modules/es.regexp.exec.js");
36
+
37
+ require("core-js/modules/es.string.replace.js");
38
+
39
+ require("core-js/modules/es.string.trim.js");
40
+
41
+ require("core-js/modules/es.array.map.js");
42
+
43
+ require("core-js/modules/es.array.reduce.js");
44
+
45
+ require("core-js/modules/es.object.to-string.js");
46
+
47
+ require("core-js/modules/es.array.concat.js");
48
+
49
+ require("core-js/modules/es.array.join.js");
50
+
51
+ require("core-js/modules/es.string.ends-with.js");
52
+
53
+ var _assert = _interopRequireDefault(require("assert"));
54
+
55
+ var _child_process = require("child_process");
56
+
57
+ var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
58
+
59
+ var _fsExtra = _interopRequireDefault(require("fs-extra"));
60
+
61
+ var _path = _interopRequireDefault(require("path"));
62
+
63
+ var _cleaners = require("../cleaners");
64
+
65
+ var _datasets = require("../datasets");
66
+
67
+ var _dates = require("../dates");
68
+
69
+ var _file_systems = require("../file_systems");
70
+
71
+ var git = _interopRequireWildcard(require("../git"));
72
+
73
+ var _acteurs_et_organes = require("../types/acteurs_et_organes");
74
+
75
+ var _agendas = require("../types/agendas");
76
+
77
+ var _amendements = require("../types/amendements");
78
+
79
+ var _dossiers_legislatifs = require("../types/dossiers_legislatifs");
80
+
81
+ var _scrutins = require("../types/scrutins");
82
+
83
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
84
+
85
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
86
+
87
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
88
+
89
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
90
+
91
+ 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."); }
92
+
93
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
94
+
95
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
96
+
97
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
98
+
99
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
100
+
101
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
16
102
 
17
103
  function parseArgs(argv) {
18
- const optionsDefinitions = [{
104
+ var optionsDefinitions = [{
19
105
  alias: "C",
20
106
  help: "clone repositories from given group (or organization) git URL",
21
107
  name: "clone",
@@ -63,423 +149,622 @@ function parseArgs(argv) {
63
149
  name: "dataDir",
64
150
  type: String
65
151
  }];
66
- const options = commandLineArgs(optionsDefinitions, {
152
+ var options = (0, _commandLineArgs["default"])(optionsDefinitions, {
67
153
  argv: argv
68
154
  });
69
155
  return options;
70
156
  }
71
157
 
72
158
  function cleanReorganizedData(options) {
73
- const dataDir = options.dataDir;
74
- Date.prototype.toJSON = patchedDateToJson;
75
- let error = false;
76
- const gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined;
77
- options.categories.map(datasetName => assert.notStrictEqual(EnabledDatasets[datasetName], undefined, `Unknown name of dataset: ${datasetName}`));
78
- const enabledDatasets = options.categories.reduce((enabledDatasets, datasetName) => enabledDatasets | EnabledDatasets[datasetName], EnabledDatasets.None);
79
-
80
- if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
81
- for (const dataset of datasets.acteursEtOrganes) {
82
- const datasetName = path.basename(dataset.filename, ".json");
83
-
84
- if (options.dataset && datasetName !== options.dataset) {
85
- continue;
86
- }
159
+ var dataDir = options.dataDir;
160
+ Date.prototype.toJSON = _dates.patchedDateToJson;
161
+ var error = false;
162
+ var gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined;
163
+ options.categories.map(function (datasetName) {
164
+ return _assert["default"].notStrictEqual(_datasets.EnabledDatasets[datasetName], undefined, "Unknown name of dataset: ".concat(datasetName));
165
+ });
166
+ var enabledDatasets = options.categories.reduce(function (enabledDatasets, datasetName) {
167
+ return enabledDatasets | _datasets.EnabledDatasets[datasetName];
168
+ }, _datasets.EnabledDatasets.None);
87
169
 
88
- if (gitGroupUrl !== undefined) {
89
- execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
90
- cwd: dataDir,
91
- env: process.env,
92
- encoding: "utf-8",
93
- stdio: ["ignore", "ignore", "pipe"]
94
- });
95
- }
170
+ if (enabledDatasets & _datasets.EnabledDatasets.ActeursEtOrganes) {
171
+ var _iterator = _createForOfIteratorHelper(_datasets.datasets.acteursEtOrganes),
172
+ _step;
96
173
 
97
- analyzeAndRemove(datasetName, options);
98
- const datasetRawDir = path.join(dataDir, datasetName);
99
- const datasetCleanDir = datasetRawDir + "_nettoye";
174
+ try {
175
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
176
+ var dataset = _step.value;
100
177
 
101
- for (const acteurSplitPath of walkDir(datasetRawDir, ["acteurs"])) {
102
- const acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
178
+ var datasetName = _path["default"].basename(dataset.filename, ".json");
103
179
 
104
- if (!acteurFilename.endsWith(".json")) {
180
+ if (options.dataset && datasetName !== options.dataset) {
105
181
  continue;
106
182
  }
107
183
 
108
- const acteurRawFilePath = path.join(datasetRawDir, ...acteurSplitPath);
109
-
110
- if (options.verbose) {
111
- console.log(` Cleaning file: ${acteurRawFilePath}…`);
184
+ if (gitGroupUrl !== undefined) {
185
+ (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(datasetName, "_nettoye.git"), {
186
+ cwd: dataDir,
187
+ env: process.env,
188
+ encoding: "utf-8",
189
+ stdio: ["ignore", "ignore", "pipe"]
190
+ });
112
191
  }
113
192
 
114
- const acteurRawJson = fs.readFileSync(acteurRawFilePath, {
115
- encoding: "utf8"
116
- });
117
- const acteur = JSON.parse(acteurRawJson);
118
- cleanActeur(acteur);
119
- const acteurJson = JSON.stringify(acteur, null, 2); // Validate generated JSON.
120
-
121
- const acteurClean = ActeursEtOrganesConvert.toActeur(acteurJson);
122
- const acteurCleanJson = ActeursEtOrganesConvert.acteurToJson(acteurClean);
123
- const acteurCleanFilePath = path.join(datasetCleanDir, ...acteurSplitPath);
124
- fs.ensureDirSync(path.dirname(acteurCleanFilePath));
125
- fs.writeFileSync(acteurCleanFilePath, acteurCleanJson, {
126
- encoding: "utf8"
127
- });
128
- }
193
+ analyzeAndRemove(datasetName, options);
129
194
 
130
- for (const organeSplitPath of walkDir(datasetRawDir, ["organes"])) {
131
- const organeFilename = organeSplitPath[organeSplitPath.length - 1];
195
+ var datasetRawDir = _path["default"].join(dataDir, datasetName);
132
196
 
133
- if (!organeFilename.endsWith(".json")) {
134
- continue;
135
- }
197
+ var datasetCleanDir = datasetRawDir + "_nettoye";
136
198
 
137
- const organeRawFilePath = path.join(datasetRawDir, ...organeSplitPath);
199
+ var _iterator2 = _createForOfIteratorHelper((0, _file_systems.walkDir)(datasetRawDir, ["acteurs"])),
200
+ _step2;
138
201
 
139
- if (options.verbose) {
140
- console.log(` Cleaning file: ${organeRawFilePath}…`);
141
- }
202
+ try {
203
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
204
+ var acteurSplitPath = _step2.value;
205
+ var acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
142
206
 
143
- const organeRawJson = fs.readFileSync(organeRawFilePath, {
144
- encoding: "utf8"
145
- });
146
- const organe = JSON.parse(organeRawJson);
147
- cleanOrgane(organe);
148
- const organeJson = JSON.stringify(organe, null, 2); // Validate generated JSON.
149
-
150
- const organeClean = ActeursEtOrganesConvert.toOrgane(organeJson);
151
- const organeCleanJson = ActeursEtOrganesConvert.organeToJson(organeClean);
152
- const organeCleanFilePath = path.join(datasetCleanDir, ...organeSplitPath);
153
- fs.ensureDirSync(path.dirname(organeCleanFilePath));
154
- fs.writeFileSync(organeCleanFilePath, organeCleanJson, {
155
- encoding: "utf8"
156
- });
157
- }
207
+ if (!acteurFilename.endsWith(".json")) {
208
+ continue;
209
+ }
158
210
 
159
- if (commitAndPush(datasetCleanDir, options, options.remote)) {
160
- error = true;
161
- }
211
+ var acteurRawFilePath = _path["default"].join.apply(_path["default"], [datasetRawDir].concat(_toConsumableArray(acteurSplitPath)));
162
212
 
163
- if (commitAndPushUid(datasetCleanDir, options, ["acteurs", "organes"])) {
164
- error = true;
165
- }
166
- }
167
- }
213
+ if (options.verbose) {
214
+ console.log(" Cleaning file: ".concat(acteurRawFilePath, "\u2026"));
215
+ }
168
216
 
169
- if (enabledDatasets & EnabledDatasets.Agendas) {
170
- for (const dataset of datasets.agendas) {
171
- const datasetName = path.basename(dataset.filename, ".json");
217
+ var acteurRawJson = _fsExtra["default"].readFileSync(acteurRawFilePath, {
218
+ encoding: "utf8"
219
+ });
172
220
 
173
- if (options.dataset && datasetName !== options.dataset) {
174
- continue;
175
- }
221
+ var acteur = JSON.parse(acteurRawJson);
222
+ (0, _cleaners.cleanActeur)(acteur);
223
+ var acteurJson = JSON.stringify(acteur, null, 2); // Validate generated JSON.
176
224
 
177
- if (gitGroupUrl !== undefined) {
178
- execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
179
- cwd: dataDir,
180
- env: process.env,
181
- encoding: "utf-8",
182
- stdio: ["ignore", "ignore", "pipe"]
183
- });
184
- }
225
+ var acteurClean = _acteurs_et_organes.Convert.toActeur(acteurJson);
185
226
 
186
- analyzeAndRemove(datasetName, options);
187
- const datasetRawDir = path.join(dataDir, datasetName);
188
- const datasetCleanDir = datasetRawDir + "_nettoye";
227
+ var acteurCleanJson = _acteurs_et_organes.Convert.acteurToJson(acteurClean);
189
228
 
190
- for (const reunionSplitPath of walkDir(datasetRawDir)) {
191
- const reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
229
+ var acteurCleanFilePath = _path["default"].join.apply(_path["default"], [datasetCleanDir].concat(_toConsumableArray(acteurSplitPath)));
192
230
 
193
- if (!reunionFilename.endsWith(".json")) {
194
- continue;
231
+ _fsExtra["default"].ensureDirSync(_path["default"].dirname(acteurCleanFilePath));
232
+
233
+ _fsExtra["default"].writeFileSync(acteurCleanFilePath, acteurCleanJson, {
234
+ encoding: "utf8"
235
+ });
236
+ }
237
+ } catch (err) {
238
+ _iterator2.e(err);
239
+ } finally {
240
+ _iterator2.f();
195
241
  }
196
242
 
197
- const reunionRawFilePath = path.join(datasetRawDir, ...reunionSplitPath);
243
+ var _iterator3 = _createForOfIteratorHelper((0, _file_systems.walkDir)(datasetRawDir, ["organes"])),
244
+ _step3;
198
245
 
199
- if (options.verbose) {
200
- console.log(` Cleaning file: ${reunionRawFilePath}…`);
201
- }
246
+ try {
247
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
248
+ var organeSplitPath = _step3.value;
249
+ var organeFilename = organeSplitPath[organeSplitPath.length - 1];
202
250
 
203
- const reunionRawJson = fs.readFileSync(reunionRawFilePath, {
204
- encoding: "utf8"
205
- });
206
- const reunion = JSON.parse(reunionRawJson);
207
- cleanReunion(reunion);
208
- const reunionJson = JSON.stringify(reunion, null, 2); // Validate generated JSON.
209
-
210
- const reunionClean = AgendasConvert.toReunion(reunionJson);
211
- const reunionCleanJson = AgendasConvert.reunionToJson(reunionClean);
212
- const reunionCleanFilePath = path.join(datasetCleanDir, ...reunionSplitPath);
213
- fs.ensureDirSync(path.dirname(reunionCleanFilePath));
214
- fs.writeFileSync(reunionCleanFilePath, reunionCleanJson, {
215
- encoding: "utf8"
216
- });
217
- }
251
+ if (!organeFilename.endsWith(".json")) {
252
+ continue;
253
+ }
218
254
 
219
- if (commitAndPush(datasetCleanDir, options, options.remote)) {
220
- error = true;
221
- }
255
+ var organeRawFilePath = _path["default"].join.apply(_path["default"], [datasetRawDir].concat(_toConsumableArray(organeSplitPath)));
222
256
 
223
- if (commitAndPushUid(datasetCleanDir, options, ["."])) {
224
- error = true;
225
- }
226
- }
227
- }
257
+ if (options.verbose) {
258
+ console.log(" Cleaning file: ".concat(organeRawFilePath, "\u2026"));
259
+ }
228
260
 
229
- if (enabledDatasets & EnabledDatasets.Amendements) {
230
- for (const dataset of datasets.amendements) {
231
- const datasetName = path.basename(dataset.filename, ".json");
261
+ var organeRawJson = _fsExtra["default"].readFileSync(organeRawFilePath, {
262
+ encoding: "utf8"
263
+ });
232
264
 
233
- if (options.dataset && datasetName !== options.dataset) {
234
- continue;
235
- }
265
+ var organe = JSON.parse(organeRawJson);
266
+ (0, _cleaners.cleanOrgane)(organe);
267
+ var organeJson = JSON.stringify(organe, null, 2); // Validate generated JSON.
268
+
269
+ var organeClean = _acteurs_et_organes.Convert.toOrgane(organeJson);
236
270
 
237
- if (gitGroupUrl !== undefined) {
238
- execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
239
- cwd: dataDir,
240
- env: process.env,
241
- encoding: "utf-8",
242
- stdio: ["ignore", "ignore", "pipe"]
243
- });
271
+ var organeCleanJson = _acteurs_et_organes.Convert.organeToJson(organeClean);
272
+
273
+ var organeCleanFilePath = _path["default"].join.apply(_path["default"], [datasetCleanDir].concat(_toConsumableArray(organeSplitPath)));
274
+
275
+ _fsExtra["default"].ensureDirSync(_path["default"].dirname(organeCleanFilePath));
276
+
277
+ _fsExtra["default"].writeFileSync(organeCleanFilePath, organeCleanJson, {
278
+ encoding: "utf8"
279
+ });
280
+ }
281
+ } catch (err) {
282
+ _iterator3.e(err);
283
+ } finally {
284
+ _iterator3.f();
285
+ }
286
+
287
+ if (commitAndPush(datasetCleanDir, options, options.remote)) {
288
+ error = true;
289
+ }
290
+
291
+ if (commitAndPushUid(datasetCleanDir, options, ["acteurs", "organes"])) {
292
+ error = true;
293
+ }
244
294
  }
295
+ } catch (err) {
296
+ _iterator.e(err);
297
+ } finally {
298
+ _iterator.f();
299
+ }
300
+ }
245
301
 
246
- analyzeAndRemove(datasetName, options);
247
- const datasetRawDir = path.join(dataDir, datasetName);
248
- const datasetCleanDir = datasetRawDir + "_nettoye";
302
+ if (enabledDatasets & _datasets.EnabledDatasets.Agendas) {
303
+ var _iterator4 = _createForOfIteratorHelper(_datasets.datasets.agendas),
304
+ _step4;
249
305
 
250
- for (const amendementSplitPath of walkDir(datasetRawDir)) {
251
- const amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
306
+ try {
307
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
308
+ var _dataset = _step4.value;
252
309
 
253
- if (!amendementFilename.endsWith(".json")) {
310
+ var _datasetName = _path["default"].basename(_dataset.filename, ".json");
311
+
312
+ if (options.dataset && _datasetName !== options.dataset) {
254
313
  continue;
255
314
  }
256
315
 
257
- const amendementRawFilePath = path.join(datasetRawDir, ...amendementSplitPath);
258
-
259
- if (options.verbose) {
260
- console.log(` Cleaning file: ${amendementRawFilePath}…`);
316
+ if (gitGroupUrl !== undefined) {
317
+ (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(_datasetName, "_nettoye.git"), {
318
+ cwd: dataDir,
319
+ env: process.env,
320
+ encoding: "utf-8",
321
+ stdio: ["ignore", "ignore", "pipe"]
322
+ });
261
323
  }
262
324
 
263
- const amendementRawJson = fs.readFileSync(amendementRawFilePath, {
264
- encoding: "utf8"
265
- });
266
- const amendement = JSON.parse(amendementRawJson);
267
- cleanAmendement(amendement);
268
- const amendementJson = JSON.stringify(amendement, null, 2); // Validate generated JSON.
269
-
270
- const amendementClean = AmendementsConvert.toAmendement(amendementJson);
271
- const amendementCleanJson = AmendementsConvert.amendementToJson(amendementClean);
272
- const amendementCleanFilePath = path.join(datasetCleanDir, ...amendementSplitPath);
273
- fs.ensureDirSync(path.dirname(amendementCleanFilePath));
274
- fs.writeFileSync(amendementCleanFilePath, amendementCleanJson, {
275
- encoding: "utf8"
276
- });
277
- }
325
+ analyzeAndRemove(_datasetName, options);
278
326
 
279
- if (commitAndPush(datasetCleanDir, options, options.remote)) {
280
- error = true;
281
- }
327
+ var _datasetRawDir = _path["default"].join(dataDir, _datasetName);
282
328
 
283
- if (commitAndPushUid(datasetCleanDir, options, ["."])) {
284
- error = true;
285
- }
286
- }
287
- }
329
+ var _datasetCleanDir = _datasetRawDir + "_nettoye";
288
330
 
289
- if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
290
- for (const dataset of datasets.dossiersLegislatifs) {
291
- const datasetName = path.basename(dataset.filename, ".json");
331
+ var _iterator5 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetRawDir)),
332
+ _step5;
292
333
 
293
- if (options.dataset && datasetName !== options.dataset) {
294
- continue;
295
- }
334
+ try {
335
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
336
+ var reunionSplitPath = _step5.value;
337
+ var reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
338
+
339
+ if (!reunionFilename.endsWith(".json")) {
340
+ continue;
341
+ }
342
+
343
+ var reunionRawFilePath = _path["default"].join.apply(_path["default"], [_datasetRawDir].concat(_toConsumableArray(reunionSplitPath)));
344
+
345
+ if (options.verbose) {
346
+ console.log(" Cleaning file: ".concat(reunionRawFilePath, "\u2026"));
347
+ }
348
+
349
+ var reunionRawJson = _fsExtra["default"].readFileSync(reunionRawFilePath, {
350
+ encoding: "utf8"
351
+ });
352
+
353
+ var reunion = JSON.parse(reunionRawJson);
354
+ (0, _cleaners.cleanReunion)(reunion);
355
+ var reunionJson = JSON.stringify(reunion, null, 2); // Validate generated JSON.
356
+
357
+ var reunionClean = _agendas.Convert.toReunion(reunionJson);
296
358
 
297
- if (gitGroupUrl !== undefined) {
298
- execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
299
- cwd: dataDir,
300
- env: process.env,
301
- encoding: "utf-8",
302
- stdio: ["ignore", "ignore", "pipe"]
303
- });
359
+ var reunionCleanJson = _agendas.Convert.reunionToJson(reunionClean);
360
+
361
+ var reunionCleanFilePath = _path["default"].join.apply(_path["default"], [_datasetCleanDir].concat(_toConsumableArray(reunionSplitPath)));
362
+
363
+ _fsExtra["default"].ensureDirSync(_path["default"].dirname(reunionCleanFilePath));
364
+
365
+ _fsExtra["default"].writeFileSync(reunionCleanFilePath, reunionCleanJson, {
366
+ encoding: "utf8"
367
+ });
368
+ }
369
+ } catch (err) {
370
+ _iterator5.e(err);
371
+ } finally {
372
+ _iterator5.f();
373
+ }
374
+
375
+ if (commitAndPush(_datasetCleanDir, options, options.remote)) {
376
+ error = true;
377
+ }
378
+
379
+ if (commitAndPushUid(_datasetCleanDir, options, ["."])) {
380
+ error = true;
381
+ }
304
382
  }
383
+ } catch (err) {
384
+ _iterator4.e(err);
385
+ } finally {
386
+ _iterator4.f();
387
+ }
388
+ }
305
389
 
306
- analyzeAndRemove(datasetName, options);
307
- const datasetRawDir = path.join(dataDir, datasetName);
308
- const datasetCleanDir = datasetRawDir + "_nettoye";
390
+ if (enabledDatasets & _datasets.EnabledDatasets.Amendements) {
391
+ var _iterator6 = _createForOfIteratorHelper(_datasets.datasets.amendements),
392
+ _step6;
309
393
 
310
- for (const documentSplitPath of walkDir(datasetRawDir, ["documents"])) {
311
- const documentFilename = documentSplitPath[documentSplitPath.length - 1];
394
+ try {
395
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
396
+ var _dataset2 = _step6.value;
312
397
 
313
- if (!documentFilename.endsWith(".json")) {
398
+ var _datasetName2 = _path["default"].basename(_dataset2.filename, ".json");
399
+
400
+ if (options.dataset && _datasetName2 !== options.dataset) {
314
401
  continue;
315
402
  }
316
403
 
317
- const documentRawFilePath = path.join(datasetRawDir, ...documentSplitPath);
404
+ if (gitGroupUrl !== undefined) {
405
+ (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(_datasetName2, "_nettoye.git"), {
406
+ cwd: dataDir,
407
+ env: process.env,
408
+ encoding: "utf-8",
409
+ stdio: ["ignore", "ignore", "pipe"]
410
+ });
411
+ }
412
+
413
+ analyzeAndRemove(_datasetName2, options);
414
+
415
+ var _datasetRawDir2 = _path["default"].join(dataDir, _datasetName2);
416
+
417
+ var _datasetCleanDir2 = _datasetRawDir2 + "_nettoye";
418
+
419
+ var _iterator7 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetRawDir2)),
420
+ _step7;
421
+
422
+ try {
423
+ for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
424
+ var amendementSplitPath = _step7.value;
425
+ var amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
426
+
427
+ if (!amendementFilename.endsWith(".json")) {
428
+ continue;
429
+ }
430
+
431
+ var amendementRawFilePath = _path["default"].join.apply(_path["default"], [_datasetRawDir2].concat(_toConsumableArray(amendementSplitPath)));
432
+
433
+ if (options.verbose) {
434
+ console.log(" Cleaning file: ".concat(amendementRawFilePath, "\u2026"));
435
+ }
436
+
437
+ var amendementRawJson = _fsExtra["default"].readFileSync(amendementRawFilePath, {
438
+ encoding: "utf8"
439
+ });
440
+
441
+ var amendement = JSON.parse(amendementRawJson);
442
+ (0, _cleaners.cleanAmendement)(amendement);
443
+ var amendementJson = JSON.stringify(amendement, null, 2); // Validate generated JSON.
444
+
445
+ var amendementClean = _amendements.Convert.toAmendement(amendementJson);
446
+
447
+ var amendementCleanJson = _amendements.Convert.amendementToJson(amendementClean);
448
+
449
+ var amendementCleanFilePath = _path["default"].join.apply(_path["default"], [_datasetCleanDir2].concat(_toConsumableArray(amendementSplitPath)));
450
+
451
+ _fsExtra["default"].ensureDirSync(_path["default"].dirname(amendementCleanFilePath));
318
452
 
319
- if (options.verbose) {
320
- console.log(` Cleaning file: ${documentRawFilePath}…`);
453
+ _fsExtra["default"].writeFileSync(amendementCleanFilePath, amendementCleanJson, {
454
+ encoding: "utf8"
455
+ });
456
+ }
457
+ } catch (err) {
458
+ _iterator7.e(err);
459
+ } finally {
460
+ _iterator7.f();
321
461
  }
322
462
 
323
- const documentRawJson = fs.readFileSync(documentRawFilePath, {
324
- encoding: "utf8"
325
- });
326
- const document = JSON.parse(documentRawJson);
327
- cleanDocumentOrDivision(document);
328
- const documentJson = JSON.stringify(document, null, 2); // Validate generated JSON.
329
-
330
- const documentClean = DossiersLegislatifsConvert.toDocument(documentJson);
331
- const documentCleanJson = DossiersLegislatifsConvert.documentToJson(documentClean);
332
- const documentCleanFilePath = path.join(datasetCleanDir, ...documentSplitPath);
333
- fs.ensureDirSync(path.dirname(documentCleanFilePath));
334
- fs.writeFileSync(documentCleanFilePath, documentCleanJson, {
335
- encoding: "utf8"
336
- });
463
+ if (commitAndPush(_datasetCleanDir2, options, options.remote)) {
464
+ error = true;
465
+ }
466
+
467
+ if (commitAndPushUid(_datasetCleanDir2, options, ["."])) {
468
+ error = true;
469
+ }
337
470
  }
471
+ } catch (err) {
472
+ _iterator6.e(err);
473
+ } finally {
474
+ _iterator6.f();
475
+ }
476
+ }
477
+
478
+ if (enabledDatasets & _datasets.EnabledDatasets.DossiersLegislatifs) {
479
+ var _iterator8 = _createForOfIteratorHelper(_datasets.datasets.dossiersLegislatifs),
480
+ _step8;
481
+
482
+ try {
483
+ for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
484
+ var _dataset3 = _step8.value;
338
485
 
339
- for (const dossierSplitPath of walkDir(datasetRawDir, ["dossiers"])) {
340
- const dossierFilename = dossierSplitPath[dossierSplitPath.length - 1];
486
+ var _datasetName3 = _path["default"].basename(_dataset3.filename, ".json");
341
487
 
342
- if (!dossierFilename.endsWith(".json")) {
488
+ if (options.dataset && _datasetName3 !== options.dataset) {
343
489
  continue;
344
490
  }
345
491
 
346
- const dossierRawFilePath = path.join(datasetRawDir, ...dossierSplitPath);
492
+ if (gitGroupUrl !== undefined) {
493
+ (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(_datasetName3, "_nettoye.git"), {
494
+ cwd: dataDir,
495
+ env: process.env,
496
+ encoding: "utf-8",
497
+ stdio: ["ignore", "ignore", "pipe"]
498
+ });
499
+ }
500
+
501
+ analyzeAndRemove(_datasetName3, options);
502
+
503
+ var _datasetRawDir3 = _path["default"].join(dataDir, _datasetName3);
504
+
505
+ var _datasetCleanDir3 = _datasetRawDir3 + "_nettoye";
506
+
507
+ var _iterator9 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetRawDir3, ["documents"])),
508
+ _step9;
509
+
510
+ try {
511
+ for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
512
+ var documentSplitPath = _step9.value;
513
+ var documentFilename = documentSplitPath[documentSplitPath.length - 1];
347
514
 
348
- if (options.verbose) {
349
- console.log(` Cleaning file: ${dossierRawFilePath}…`);
515
+ if (!documentFilename.endsWith(".json")) {
516
+ continue;
517
+ }
518
+
519
+ var documentRawFilePath = _path["default"].join.apply(_path["default"], [_datasetRawDir3].concat(_toConsumableArray(documentSplitPath)));
520
+
521
+ if (options.verbose) {
522
+ console.log(" Cleaning file: ".concat(documentRawFilePath, "\u2026"));
523
+ }
524
+
525
+ var documentRawJson = _fsExtra["default"].readFileSync(documentRawFilePath, {
526
+ encoding: "utf8"
527
+ });
528
+
529
+ var document = JSON.parse(documentRawJson);
530
+ (0, _cleaners.cleanDocumentOrDivision)(document);
531
+ var documentJson = JSON.stringify(document, null, 2); // Validate generated JSON.
532
+
533
+ var documentClean = _dossiers_legislatifs.Convert.toDocument(documentJson);
534
+
535
+ var documentCleanJson = _dossiers_legislatifs.Convert.documentToJson(documentClean);
536
+
537
+ var documentCleanFilePath = _path["default"].join.apply(_path["default"], [_datasetCleanDir3].concat(_toConsumableArray(documentSplitPath)));
538
+
539
+ _fsExtra["default"].ensureDirSync(_path["default"].dirname(documentCleanFilePath));
540
+
541
+ _fsExtra["default"].writeFileSync(documentCleanFilePath, documentCleanJson, {
542
+ encoding: "utf8"
543
+ });
544
+ }
545
+ } catch (err) {
546
+ _iterator9.e(err);
547
+ } finally {
548
+ _iterator9.f();
350
549
  }
351
550
 
352
- const dossierRawJson = fs.readFileSync(dossierRawFilePath, {
353
- encoding: "utf8"
354
- });
355
- const dossier = JSON.parse(dossierRawJson);
356
- cleanDossierParlementaire(dossier);
357
- const dossierJson = JSON.stringify(dossier, null, 2); // Validate generated JSON.
358
-
359
- const dossierClean = DossiersLegislatifsConvert.toDossierParlementaire(dossierJson);
360
- const dossierCleanJson = DossiersLegislatifsConvert.dossierParlementaireToJson(dossierClean);
361
- const dossierCleanFilePath = path.join(datasetCleanDir, ...dossierSplitPath);
362
- fs.ensureDirSync(path.dirname(dossierCleanFilePath));
363
- fs.writeFileSync(dossierCleanFilePath, dossierCleanJson, {
364
- encoding: "utf8"
365
- });
366
- }
551
+ var _iterator10 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetRawDir3, ["dossiers"])),
552
+ _step10;
367
553
 
368
- if (commitAndPush(datasetCleanDir, options, options.remote)) {
369
- error = true;
370
- }
554
+ try {
555
+ for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
556
+ var dossierSplitPath = _step10.value;
557
+ var dossierFilename = dossierSplitPath[dossierSplitPath.length - 1];
371
558
 
372
- if (commitAndPushUid(datasetCleanDir, options, ["documents", "dossiers"])) {
373
- error = true;
374
- }
375
- }
376
- }
559
+ if (!dossierFilename.endsWith(".json")) {
560
+ continue;
561
+ }
377
562
 
378
- if (enabledDatasets & EnabledDatasets.Scrutins) {
379
- for (const dataset of datasets.scrutins) {
380
- const datasetName = path.basename(dataset.filename, ".json");
563
+ var dossierRawFilePath = _path["default"].join.apply(_path["default"], [_datasetRawDir3].concat(_toConsumableArray(dossierSplitPath)));
381
564
 
382
- if (options.dataset && datasetName !== options.dataset) {
383
- continue;
384
- }
565
+ if (options.verbose) {
566
+ console.log(" Cleaning file: ".concat(dossierRawFilePath, "\u2026"));
567
+ }
568
+
569
+ var dossierRawJson = _fsExtra["default"].readFileSync(dossierRawFilePath, {
570
+ encoding: "utf8"
571
+ });
572
+
573
+ var dossier = JSON.parse(dossierRawJson);
574
+ (0, _cleaners.cleanDossierParlementaire)(dossier);
575
+ var dossierJson = JSON.stringify(dossier, null, 2); // Validate generated JSON.
576
+
577
+ var dossierClean = _dossiers_legislatifs.Convert.toDossierParlementaire(dossierJson);
578
+
579
+ var dossierCleanJson = _dossiers_legislatifs.Convert.dossierParlementaireToJson(dossierClean);
580
+
581
+ var dossierCleanFilePath = _path["default"].join.apply(_path["default"], [_datasetCleanDir3].concat(_toConsumableArray(dossierSplitPath)));
582
+
583
+ _fsExtra["default"].ensureDirSync(_path["default"].dirname(dossierCleanFilePath));
584
+
585
+ _fsExtra["default"].writeFileSync(dossierCleanFilePath, dossierCleanJson, {
586
+ encoding: "utf8"
587
+ });
588
+ }
589
+ } catch (err) {
590
+ _iterator10.e(err);
591
+ } finally {
592
+ _iterator10.f();
593
+ }
594
+
595
+ if (commitAndPush(_datasetCleanDir3, options, options.remote)) {
596
+ error = true;
597
+ }
385
598
 
386
- if (gitGroupUrl !== undefined) {
387
- execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
388
- cwd: dataDir,
389
- env: process.env,
390
- encoding: "utf-8",
391
- stdio: ["ignore", "ignore", "pipe"]
392
- });
599
+ if (commitAndPushUid(_datasetCleanDir3, options, ["documents", "dossiers"])) {
600
+ error = true;
601
+ }
393
602
  }
603
+ } catch (err) {
604
+ _iterator8.e(err);
605
+ } finally {
606
+ _iterator8.f();
607
+ }
608
+ }
394
609
 
395
- analyzeAndRemove(datasetName, options);
396
- const datasetRawDir = path.join(dataDir, datasetName);
397
- const datasetCleanDir = datasetRawDir + "_nettoye";
610
+ if (enabledDatasets & _datasets.EnabledDatasets.Scrutins) {
611
+ var _iterator11 = _createForOfIteratorHelper(_datasets.datasets.scrutins),
612
+ _step11;
398
613
 
399
- for (const scrutinSplitPath of walkDir(datasetRawDir)) {
400
- const scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
614
+ try {
615
+ for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
616
+ var _dataset4 = _step11.value;
401
617
 
402
- if (!scrutinFilename.endsWith(".json")) {
618
+ var _datasetName4 = _path["default"].basename(_dataset4.filename, ".json");
619
+
620
+ if (options.dataset && _datasetName4 !== options.dataset) {
403
621
  continue;
404
622
  }
405
623
 
406
- const scrutinRawFilePath = path.join(datasetRawDir, ...scrutinSplitPath);
407
-
408
- if (options.verbose) {
409
- console.log(` Cleaning file: ${scrutinRawFilePath}…`);
624
+ if (gitGroupUrl !== undefined) {
625
+ (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(_datasetName4, "_nettoye.git"), {
626
+ cwd: dataDir,
627
+ env: process.env,
628
+ encoding: "utf-8",
629
+ stdio: ["ignore", "ignore", "pipe"]
630
+ });
410
631
  }
411
632
 
412
- const scrutinRawJson = fs.readFileSync(scrutinRawFilePath, {
413
- encoding: "utf8"
414
- });
415
- const scrutin = JSON.parse(scrutinRawJson);
416
- cleanScrutin(scrutin);
417
- const scrutinJson = JSON.stringify(scrutin, null, 2); // Validate generated JSON.
418
-
419
- const scrutinClean = ScrutinsConvert.toScrutin(scrutinJson);
420
- const scrutinCleanJson = ScrutinsConvert.scrutinToJson(scrutinClean);
421
- const scrutinCleanFilePath = path.join(datasetCleanDir, ...scrutinSplitPath);
422
- fs.ensureDirSync(path.dirname(scrutinCleanFilePath));
423
- fs.writeFileSync(scrutinCleanFilePath, scrutinCleanJson, {
424
- encoding: "utf8"
425
- });
426
- }
633
+ analyzeAndRemove(_datasetName4, options);
427
634
 
428
- if (commitAndPush(datasetCleanDir, options, options.remote)) {
429
- error = true;
430
- }
635
+ var _datasetRawDir4 = _path["default"].join(dataDir, _datasetName4);
636
+
637
+ var _datasetCleanDir4 = _datasetRawDir4 + "_nettoye";
638
+
639
+ var _iterator12 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetRawDir4)),
640
+ _step12;
641
+
642
+ try {
643
+ for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
644
+ var scrutinSplitPath = _step12.value;
645
+ var scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
646
+
647
+ if (!scrutinFilename.endsWith(".json")) {
648
+ continue;
649
+ }
650
+
651
+ var scrutinRawFilePath = _path["default"].join.apply(_path["default"], [_datasetRawDir4].concat(_toConsumableArray(scrutinSplitPath)));
431
652
 
432
- if (commitAndPushUid(datasetCleanDir, options, ["."])) {
433
- error = true;
653
+ if (options.verbose) {
654
+ console.log(" Cleaning file: ".concat(scrutinRawFilePath, "\u2026"));
655
+ }
656
+
657
+ var scrutinRawJson = _fsExtra["default"].readFileSync(scrutinRawFilePath, {
658
+ encoding: "utf8"
659
+ });
660
+
661
+ var scrutin = JSON.parse(scrutinRawJson);
662
+ (0, _cleaners.cleanScrutin)(scrutin);
663
+ var scrutinJson = JSON.stringify(scrutin, null, 2); // Validate generated JSON.
664
+
665
+ var scrutinClean = _scrutins.Convert.toScrutin(scrutinJson);
666
+
667
+ var scrutinCleanJson = _scrutins.Convert.scrutinToJson(scrutinClean);
668
+
669
+ var scrutinCleanFilePath = _path["default"].join.apply(_path["default"], [_datasetCleanDir4].concat(_toConsumableArray(scrutinSplitPath)));
670
+
671
+ _fsExtra["default"].ensureDirSync(_path["default"].dirname(scrutinCleanFilePath));
672
+
673
+ _fsExtra["default"].writeFileSync(scrutinCleanFilePath, scrutinCleanJson, {
674
+ encoding: "utf8"
675
+ });
676
+ }
677
+ } catch (err) {
678
+ _iterator12.e(err);
679
+ } finally {
680
+ _iterator12.f();
681
+ }
682
+
683
+ if (commitAndPush(_datasetCleanDir4, options, options.remote)) {
684
+ error = true;
685
+ }
686
+
687
+ if (commitAndPushUid(_datasetCleanDir4, options, ["."])) {
688
+ error = true;
689
+ }
434
690
  }
691
+ } catch (err) {
692
+ _iterator11.e(err);
693
+ } finally {
694
+ _iterator11.f();
435
695
  }
436
696
  } // Restore standard conversion of dates to JSON.
437
697
 
438
698
 
439
- Date.prototype.toJSON = existingDateToJson;
699
+ Date.prototype.toJSON = _dates.existingDateToJson;
440
700
  return error;
441
701
  }
442
702
 
443
703
  function analyzeAndRemove(datasetName, options) {
444
- const dataDir = options.dataDir;
445
- const datasetRawDir = path.join(dataDir, datasetName);
446
- const datasetCleanDir = datasetRawDir + "_nettoye";
704
+ var dataDir = options.dataDir;
705
+
706
+ var datasetRawDir = _path["default"].join(dataDir, datasetName);
707
+
708
+ var datasetCleanDir = datasetRawDir + "_nettoye";
447
709
 
448
710
  if (!options.silent) {
449
- console.log(`Cleaning directory: ${datasetCleanDir}…`);
711
+ console.log("Cleaning directory: ".concat(datasetCleanDir, "\u2026"));
450
712
  }
451
713
 
452
- fs.ensureDirSync(datasetCleanDir);
714
+ _fsExtra["default"].ensureDirSync(datasetCleanDir);
453
715
 
454
- for (const filename of fs.readdirSync(datasetCleanDir)) {
455
- if (filename[0] === ".") {
456
- continue;
457
- }
716
+ var _iterator13 = _createForOfIteratorHelper(_fsExtra["default"].readdirSync(datasetCleanDir)),
717
+ _step13;
718
+
719
+ try {
720
+ for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
721
+ var filename = _step13.value;
722
+
723
+ if (filename[0] === ".") {
724
+ continue;
725
+ }
458
726
 
459
- const pathname = path.join(datasetCleanDir, filename);
460
- fs.removeSync(pathname);
727
+ var pathname = _path["default"].join(datasetCleanDir, filename);
728
+
729
+ _fsExtra["default"].removeSync(pathname);
730
+ }
731
+ } catch (err) {
732
+ _iterator13.e(err);
733
+ } finally {
734
+ _iterator13.f();
461
735
  }
462
736
  }
463
737
 
464
738
  function commitAndPush(repositoryDir, options, remotes) {
465
- let error = false;
739
+ var error = false;
466
740
 
467
741
  if (options.commit) {
468
742
  git.commit(repositoryDir, "Nouvelle moisson");
469
743
 
470
- for (const remote of remotes || []) {
471
- try {
472
- execSync(`git push ${remote} master`, {
473
- cwd: repositoryDir,
474
- env: process.env,
475
- encoding: "utf-8",
476
- stdio: ["ignore", "ignore", "pipe"]
477
- });
478
- } catch (childProcess) {
479
- // Don't stop when push fails.
480
- console.error(childProcess.output);
481
- error = true;
744
+ var _iterator14 = _createForOfIteratorHelper(remotes || []),
745
+ _step14;
746
+
747
+ try {
748
+ for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
749
+ var remote = _step14.value;
750
+
751
+ try {
752
+ (0, _child_process.execSync)("git push ".concat(remote, " master"), {
753
+ cwd: repositoryDir,
754
+ env: process.env,
755
+ encoding: "utf-8",
756
+ stdio: ["ignore", "ignore", "pipe"]
757
+ });
758
+ } catch (childProcess) {
759
+ // Don't stop when push fails.
760
+ console.error(childProcess.output);
761
+ error = true;
762
+ }
482
763
  }
764
+ } catch (err) {
765
+ _iterator14.e(err);
766
+ } finally {
767
+ _iterator14.f();
483
768
  }
484
769
  }
485
770
 
@@ -487,17 +772,28 @@ function commitAndPush(repositoryDir, options, remotes) {
487
772
  }
488
773
 
489
774
  function commitAndPushUid(repositoryDir, options, subdirectories) {
490
- let error = false;
775
+ var error = false;
491
776
 
492
777
  if (options.commit) {
493
778
  git.uidBranchUpdate(repositoryDir, subdirectories, options["no-reset-after-commit"]);
494
779
 
495
- for (const remote of options.remote || []) {
496
- try {
497
- git.run(repositoryDir, `push --quiet ${remote} uid:uid`);
498
- } catch (childProcess) {
499
- error = true;
780
+ var _iterator15 = _createForOfIteratorHelper(options.remote || []),
781
+ _step15;
782
+
783
+ try {
784
+ for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
785
+ var remote = _step15.value;
786
+
787
+ try {
788
+ git.run(repositoryDir, "push --quiet ".concat(remote, " uid:uid"));
789
+ } catch (childProcess) {
790
+ error = true;
791
+ }
500
792
  }
793
+ } catch (err) {
794
+ _iterator15.e(err);
795
+ } finally {
796
+ _iterator15.f();
501
797
  }
502
798
  }
503
799
 
@@ -505,7 +801,7 @@ function commitAndPushUid(repositoryDir, options, subdirectories) {
505
801
  }
506
802
 
507
803
  function main(argv) {
508
- const options = parseArgs(argv);
804
+ var options = parseArgs(argv);
509
805
 
510
806
  if (cleanReorganizedData(options)) {
511
807
  return 1;
@@ -517,4 +813,4 @@ function main(argv) {
517
813
 
518
814
 
519
815
  if (process.argv[1].endsWith("clean_reorganized_data.ts")) process.exit(main(process.argv));
520
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImNsZWFuQWN0ZXVyIiwiY2xlYW5BbWVuZGVtZW50IiwiY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24iLCJjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiY2xlYW5PcmdhbmUiLCJjbGVhblJldW5pb24iLCJjbGVhblNjcnV0aW4iLCJkYXRhc2V0cyIsIkVuYWJsZWREYXRhc2V0cyIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInBhdGNoZWREYXRlVG9Kc29uIiwid2Fsa0RpciIsImdpdCIsIkNvbnZlcnQiLCJBY3RldXJzRXRPcmdhbmVzQ29udmVydCIsIkFnZW5kYXNDb252ZXJ0IiwiQW1lbmRlbWVudHNDb252ZXJ0IiwiRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQiLCJTY3J1dGluc0NvbnZlcnQiLCJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwibXVsdGlwbGUiLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsImNsZWFuUmVvcmdhbml6ZWREYXRhIiwiZGF0YURpciIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJlcnJvciIsImdpdEdyb3VwVXJsIiwiY2xvbmUiLCJ0cmltIiwicmVwbGFjZSIsInVuZGVmaW5lZCIsImNhdGVnb3JpZXMiLCJtYXAiLCJkYXRhc2V0TmFtZSIsIm5vdFN0cmljdEVxdWFsIiwiZW5hYmxlZERhdGFzZXRzIiwicmVkdWNlIiwiTm9uZSIsIkFjdGV1cnNFdE9yZ2FuZXMiLCJkYXRhc2V0IiwiYWN0ZXVyc0V0T3JnYW5lcyIsImJhc2VuYW1lIiwiZmlsZW5hbWUiLCJjd2QiLCJlbnYiLCJwcm9jZXNzIiwiZW5jb2RpbmciLCJzdGRpbyIsImFuYWx5emVBbmRSZW1vdmUiLCJkYXRhc2V0UmF3RGlyIiwiam9pbiIsImRhdGFzZXRDbGVhbkRpciIsImFjdGV1clNwbGl0UGF0aCIsImFjdGV1ckZpbGVuYW1lIiwibGVuZ3RoIiwiZW5kc1dpdGgiLCJhY3RldXJSYXdGaWxlUGF0aCIsInZlcmJvc2UiLCJjb25zb2xlIiwibG9nIiwiYWN0ZXVyUmF3SnNvbiIsInJlYWRGaWxlU3luYyIsImFjdGV1ciIsIkpTT04iLCJwYXJzZSIsImFjdGV1ckpzb24iLCJzdHJpbmdpZnkiLCJhY3RldXJDbGVhbiIsInRvQWN0ZXVyIiwiYWN0ZXVyQ2xlYW5Kc29uIiwiYWN0ZXVyVG9Kc29uIiwiYWN0ZXVyQ2xlYW5GaWxlUGF0aCIsImVuc3VyZURpclN5bmMiLCJkaXJuYW1lIiwid3JpdGVGaWxlU3luYyIsIm9yZ2FuZVNwbGl0UGF0aCIsIm9yZ2FuZUZpbGVuYW1lIiwib3JnYW5lUmF3RmlsZVBhdGgiLCJvcmdhbmVSYXdKc29uIiwib3JnYW5lIiwib3JnYW5lSnNvbiIsIm9yZ2FuZUNsZWFuIiwidG9PcmdhbmUiLCJvcmdhbmVDbGVhbkpzb24iLCJvcmdhbmVUb0pzb24iLCJvcmdhbmVDbGVhbkZpbGVQYXRoIiwiY29tbWl0QW5kUHVzaCIsInJlbW90ZSIsImNvbW1pdEFuZFB1c2hVaWQiLCJBZ2VuZGFzIiwiYWdlbmRhcyIsInJldW5pb25TcGxpdFBhdGgiLCJyZXVuaW9uRmlsZW5hbWUiLCJyZXVuaW9uUmF3RmlsZVBhdGgiLCJyZXVuaW9uUmF3SnNvbiIsInJldW5pb24iLCJyZXVuaW9uSnNvbiIsInJldW5pb25DbGVhbiIsInRvUmV1bmlvbiIsInJldW5pb25DbGVhbkpzb24iLCJyZXVuaW9uVG9Kc29uIiwicmV1bmlvbkNsZWFuRmlsZVBhdGgiLCJBbWVuZGVtZW50cyIsImFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsImFtZW5kZW1lbnRGaWxlbmFtZSIsImFtZW5kZW1lbnRSYXdGaWxlUGF0aCIsImFtZW5kZW1lbnRSYXdKc29uIiwiYW1lbmRlbWVudCIsImFtZW5kZW1lbnRKc29uIiwiYW1lbmRlbWVudENsZWFuIiwidG9BbWVuZGVtZW50IiwiYW1lbmRlbWVudENsZWFuSnNvbiIsImFtZW5kZW1lbnRUb0pzb24iLCJhbWVuZGVtZW50Q2xlYW5GaWxlUGF0aCIsIkRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9jdW1lbnRTcGxpdFBhdGgiLCJkb2N1bWVudEZpbGVuYW1lIiwiZG9jdW1lbnRSYXdGaWxlUGF0aCIsImRvY3VtZW50UmF3SnNvbiIsImRvY3VtZW50IiwiZG9jdW1lbnRKc29uIiwiZG9jdW1lbnRDbGVhbiIsInRvRG9jdW1lbnQiLCJkb2N1bWVudENsZWFuSnNvbiIsImRvY3VtZW50VG9Kc29uIiwiZG9jdW1lbnRDbGVhbkZpbGVQYXRoIiwiZG9zc2llclNwbGl0UGF0aCIsImRvc3NpZXJGaWxlbmFtZSIsImRvc3NpZXJSYXdGaWxlUGF0aCIsImRvc3NpZXJSYXdKc29uIiwiZG9zc2llciIsImRvc3NpZXJKc29uIiwiZG9zc2llckNsZWFuIiwidG9Eb3NzaWVyUGFybGVtZW50YWlyZSIsImRvc3NpZXJDbGVhbkpzb24iLCJkb3NzaWVyUGFybGVtZW50YWlyZVRvSnNvbiIsImRvc3NpZXJDbGVhbkZpbGVQYXRoIiwiU2NydXRpbnMiLCJzY3J1dGlucyIsInNjcnV0aW5TcGxpdFBhdGgiLCJzY3J1dGluRmlsZW5hbWUiLCJzY3J1dGluUmF3RmlsZVBhdGgiLCJzY3J1dGluUmF3SnNvbiIsInNjcnV0aW4iLCJzY3J1dGluSnNvbiIsInNjcnV0aW5DbGVhbiIsInRvU2NydXRpbiIsInNjcnV0aW5DbGVhbkpzb24iLCJzY3J1dGluVG9Kc29uIiwic2NydXRpbkNsZWFuRmlsZVBhdGgiLCJzaWxlbnQiLCJyZWFkZGlyU3luYyIsInBhdGhuYW1lIiwicmVtb3ZlU3luYyIsInJlcG9zaXRvcnlEaXIiLCJyZW1vdGVzIiwiY29tbWl0IiwiY2hpbGRQcm9jZXNzIiwib3V0cHV0Iiwic3ViZGlyZWN0b3JpZXMiLCJ1aWRCcmFuY2hVcGRhdGUiLCJydW4iLCJtYWluIiwiZXhpdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL2NsZWFuX3Jlb3JnYW5pemVkX2RhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmltcG9ydCB7XG4gIGNsZWFuQWN0ZXVyLFxuICBjbGVhbkFtZW5kZW1lbnQsXG4gIGNsZWFuRG9jdW1lbnRPckRpdmlzaW9uLFxuICBjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICBjbGVhbk9yZ2FuZSxcbiAgY2xlYW5SZXVuaW9uLFxuICBjbGVhblNjcnV0aW4sXG59IGZyb20gXCIuLi9jbGVhbmVyc1wiXG5pbXBvcnQgeyBkYXRhc2V0cywgRW5hYmxlZERhdGFzZXRzIH0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IGV4aXN0aW5nRGF0ZVRvSnNvbiwgcGF0Y2hlZERhdGVUb0pzb24gfSBmcm9tIFwiLi4vZGF0ZXNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHtcbiAgQWN0ZXVyLFxuICBDb252ZXJ0IGFzIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LFxuICBPcmdhbmUsXG59IGZyb20gXCIuLi90eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBZ2VuZGFzQ29udmVydCwgUmV1bmlvbiB9IGZyb20gXCIuLi90eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IEFtZW5kZW1lbnQsIENvbnZlcnQgYXMgQW1lbmRlbWVudHNDb252ZXJ0IH0gZnJvbSBcIi4uL3R5cGVzL2FtZW5kZW1lbnRzXCJcbmltcG9ydCB7XG4gIENvbnZlcnQgYXMgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQsXG4gIERvY3VtZW50LFxuICBEb3NzaWVyUGFybGVtZW50YWlyZSxcbn0gZnJvbSBcIi4uL3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgU2NydXRpbnNDb252ZXJ0LCBTY3J1dGluIH0gZnJvbSBcIi4uL3R5cGVzL3NjcnV0aW5zXCJcblxuZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ3Y6IHN0cmluZ1tdKTogYW55IHtcbiAgY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICAgIHtcbiAgICAgIGFsaWFzOiBcIkNcIixcbiAgICAgIGhlbHA6IFwiY2xvbmUgcmVwb3NpdG9yaWVzIGZyb20gZ2l2ZW4gZ3JvdXAgKG9yIG9yZ2FuaXphdGlvbikgZ2l0IFVSTFwiLFxuICAgICAgbmFtZTogXCJjbG9uZVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiY1wiLFxuICAgICAgaGVscDogXCJjb21taXQgY2xlYW4gZmlsZXNcIixcbiAgICAgIG5hbWU6IFwiY29tbWl0XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiZFwiLFxuICAgICAgaGVscDogXCJzaW5nbGUgZGF0YXNldCB0byByZW9yZ2FuaXplXCIsXG4gICAgICBuYW1lOiBcImRhdGFzZXRcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcImtcIixcbiAgICAgIGRlZmF1bHRWYWx1ZTogW1wiQWxsXCJdLFxuICAgICAgaGVscDogXCJjYXRlZ29yaWVzIG9mIGRhdGFzZXRzIHRvIHJlb3JnYW5pemVcIixcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbmFtZTogXCJjYXRlZ29yaWVzXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJyXCIsXG4gICAgICBoZWxwOiBcInB1c2ggY29tbWl0IHRvIGdpdmVuIHJlbW90ZVwiLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBuYW1lOiBcInJlbW90ZVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwic1wiLFxuICAgICAgaGVscDogXCJkb24ndCBsb2cgYW55dGhpbmdcIixcbiAgICAgIG5hbWU6IFwic2lsZW50XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgaGVscDogXCJkbyBub3QgcmVzZXQgLS1oYXJkIGFmdGVyIGNvbW1pdCB0byBzYXZlIEkvTyBpZiB0aGUgd29ya2luZyB0cmVlIGlzIHRvIGJlIGRpc2NhcmRlZFwiLFxuICAgICAgbmFtZTogXCJuby1yZXNldC1hZnRlci1jb21taXRcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJ2XCIsXG4gICAgICBoZWxwOiBcInZlcmJvc2UgbG9nc1wiLFxuICAgICAgbmFtZTogXCJ2ZXJib3NlXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICAgIGhlbHA6IFwiZGlyZWN0b3J5IGNvbnRhaW5pbmcgQXNzZW1ibMOpZSBvcGVuIGRhdGEgZmlsZXNcIixcbiAgICAgIG5hbWU6IFwiZGF0YURpclwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMsIHtcbiAgICBhcmd2OiBhcmd2LFxuICB9KVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBjbGVhblJlb3JnYW5pemVkRGF0YShvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgY29uc3QgZGF0YURpcjogc3RyaW5nID0gb3B0aW9ucy5kYXRhRGlyXG5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gcGF0Y2hlZERhdGVUb0pzb25cblxuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBjb25zdCBnaXRHcm91cFVybCA9IG9wdGlvbnMuY2xvbmVcbiAgICA/IG9wdGlvbnMuY2xvbmUudHJpbSgpLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgICA6IHVuZGVmaW5lZFxuXG4gIG9wdGlvbnMuY2F0ZWdvcmllcy5tYXAoKGRhdGFzZXROYW1lOiBzdHJpbmcpID0+XG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgICAgKEVuYWJsZWREYXRhc2V0cyBhcyBhbnkgYXMgeyBbbmFtZTogc3RyaW5nXTogRW5hYmxlZERhdGFzZXRzIH0pW1xuICAgICAgICBkYXRhc2V0TmFtZVxuICAgICAgXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGBVbmtub3duIG5hbWUgb2YgZGF0YXNldDogJHtkYXRhc2V0TmFtZX1gLFxuICAgICksXG4gIClcbiAgY29uc3QgZW5hYmxlZERhdGFzZXRzID0gb3B0aW9ucy5jYXRlZ29yaWVzLnJlZHVjZShcbiAgICAoZW5hYmxlZERhdGFzZXRzOiBFbmFibGVkRGF0YXNldHMsIGRhdGFzZXROYW1lOiBzdHJpbmcpOiBFbmFibGVkRGF0YXNldHMgPT5cbiAgICAgIGVuYWJsZWREYXRhc2V0cyB8XG4gICAgICAoRW5hYmxlZERhdGFzZXRzIGFzIGFueSBhcyB7IFtuYW1lOiBzdHJpbmddOiBFbmFibGVkRGF0YXNldHMgfSlbXG4gICAgICAgIGRhdGFzZXROYW1lXG4gICAgICBdLFxuICAgIEVuYWJsZWREYXRhc2V0cy5Ob25lLFxuICApXG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCBhY3RldXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCBbXCJhY3RldXJzXCJdKSkge1xuICAgICAgICBjb25zdCBhY3RldXJGaWxlbmFtZSA9IGFjdGV1clNwbGl0UGF0aFthY3RldXJTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFhY3RldXJGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3RldXJSYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5hY3RldXJTcGxpdFBhdGgpXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke2FjdGV1clJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0ZXVyUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGFjdGV1clJhd0ZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBhY3RldXIgPSBKU09OLnBhcnNlKGFjdGV1clJhd0pzb24pXG4gICAgICAgIGNsZWFuQWN0ZXVyKGFjdGV1cilcbiAgICAgICAgY29uc3QgYWN0ZXVySnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoYWN0ZXVyLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBhY3RldXJDbGVhbjogQWN0ZXVyID0gQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9BY3RldXIoYWN0ZXVySnNvbilcbiAgICAgICAgY29uc3QgYWN0ZXVyQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LmFjdGV1clRvSnNvbihhY3RldXJDbGVhbilcblxuICAgICAgICBjb25zdCBhY3RldXJDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmFjdGV1clNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShhY3RldXJDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhhY3RldXJDbGVhbkZpbGVQYXRoLCBhY3RldXJDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgb3JnYW5lU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpciwgW1wib3JnYW5lc1wiXSkpIHtcbiAgICAgICAgY29uc3Qgb3JnYW5lRmlsZW5hbWUgPSBvcmdhbmVTcGxpdFBhdGhbb3JnYW5lU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghb3JnYW5lRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JnYW5lUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4ub3JnYW5lU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtvcmdhbmVSYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yZ2FuZVJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhvcmdhbmVSYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3Qgb3JnYW5lID0gSlNPTi5wYXJzZShvcmdhbmVSYXdKc29uKVxuICAgICAgICBjbGVhbk9yZ2FuZShvcmdhbmUpXG4gICAgICAgIGNvbnN0IG9yZ2FuZUpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9yZ2FuZSwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3Qgb3JnYW5lQ2xlYW46IE9yZ2FuZSA9IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LnRvT3JnYW5lKG9yZ2FuZUpzb24pXG4gICAgICAgIGNvbnN0IG9yZ2FuZUNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBBY3RldXJzRXRPcmdhbmVzQ29udmVydC5vcmdhbmVUb0pzb24ob3JnYW5lQ2xlYW4pXG5cbiAgICAgICAgY29uc3Qgb3JnYW5lQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5vcmdhbmVTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUob3JnYW5lQ2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMob3JnYW5lQ2xlYW5GaWxlUGF0aCwgb3JnYW5lQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiYWN0ZXVyc1wiLCBcIm9yZ2FuZXNcIl0pKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3QgcmV1bmlvblNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIpKSB7XG4gICAgICAgIGNvbnN0IHJldW5pb25GaWxlbmFtZSA9IHJldW5pb25TcGxpdFBhdGhbcmV1bmlvblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIXJldW5pb25GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXVuaW9uUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4ucmV1bmlvblNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7cmV1bmlvblJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV1bmlvblJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhyZXVuaW9uUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHJldW5pb24gPSBKU09OLnBhcnNlKHJldW5pb25SYXdKc29uKVxuICAgICAgICBjbGVhblJldW5pb24ocmV1bmlvbilcbiAgICAgICAgY29uc3QgcmV1bmlvbkpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHJldW5pb24sIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IHJldW5pb25DbGVhbjogUmV1bmlvbiA9IEFnZW5kYXNDb252ZXJ0LnRvUmV1bmlvbihyZXVuaW9uSnNvbilcbiAgICAgICAgY29uc3QgcmV1bmlvbkNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBBZ2VuZGFzQ29udmVydC5yZXVuaW9uVG9Kc29uKHJldW5pb25DbGVhbilcblxuICAgICAgICBjb25zdCByZXVuaW9uQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5yZXVuaW9uU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKHJldW5pb25DbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZXVuaW9uQ2xlYW5GaWxlUGF0aCwgcmV1bmlvbkNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2goZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBvcHRpb25zLnJlbW90ZSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcIi5cIl0pKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQW1lbmRlbWVudHMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYW1lbmRlbWVudHMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpcikpIHtcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudEZpbGVuYW1lID1cbiAgICAgICAgICBhbWVuZGVtZW50U3BsaXRQYXRoW2FtZW5kZW1lbnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFhbWVuZGVtZW50RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudFJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgICAgLi4uYW1lbmRlbWVudFNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHthbWVuZGVtZW50UmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50UmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgIGFtZW5kZW1lbnRSYXdGaWxlUGF0aCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50ID0gSlNPTi5wYXJzZShhbWVuZGVtZW50UmF3SnNvbilcbiAgICAgICAgY2xlYW5BbWVuZGVtZW50KGFtZW5kZW1lbnQpXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShhbWVuZGVtZW50LCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBhbWVuZGVtZW50Q2xlYW46IEFtZW5kZW1lbnQgPVxuICAgICAgICAgIEFtZW5kZW1lbnRzQ29udmVydC50b0FtZW5kZW1lbnQoYW1lbmRlbWVudEpzb24pXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgQW1lbmRlbWVudHNDb252ZXJ0LmFtZW5kZW1lbnRUb0pzb24oYW1lbmRlbWVudENsZWFuKVxuXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmFtZW5kZW1lbnRTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoYW1lbmRlbWVudENsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGFtZW5kZW1lbnRDbGVhbkZpbGVQYXRoLCBhbWVuZGVtZW50Q2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCBkb2N1bWVudFNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIsIFtcImRvY3VtZW50c1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRGaWxlbmFtZSA9IGRvY3VtZW50U3BsaXRQYXRoW2RvY3VtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9jdW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb2N1bWVudFJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgICAgLi4uZG9jdW1lbnRTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7ZG9jdW1lbnRSYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvY3VtZW50UmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGRvY3VtZW50UmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRvY3VtZW50ID0gSlNPTi5wYXJzZShkb2N1bWVudFJhd0pzb24pXG4gICAgICAgIGNsZWFuRG9jdW1lbnRPckRpdmlzaW9uKGRvY3VtZW50KVxuICAgICAgICBjb25zdCBkb2N1bWVudEpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRvY3VtZW50LCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBkb2N1bWVudENsZWFuOiBEb2N1bWVudCA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb2N1bWVudChkb2N1bWVudEpzb24pXG4gICAgICAgIGNvbnN0IGRvY3VtZW50Q2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LmRvY3VtZW50VG9Kc29uKGRvY3VtZW50Q2xlYW4pXG5cbiAgICAgICAgY29uc3QgZG9jdW1lbnRDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmRvY3VtZW50U3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGRvY3VtZW50Q2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZG9jdW1lbnRDbGVhbkZpbGVQYXRoLCBkb2N1bWVudENsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBkb3NzaWVyU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpciwgW1wiZG9zc2llcnNcIl0pKSB7XG4gICAgICAgIGNvbnN0IGRvc3NpZXJGaWxlbmFtZSA9IGRvc3NpZXJTcGxpdFBhdGhbZG9zc2llclNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWRvc3NpZXJGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb3NzaWVyUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4uZG9zc2llclNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7ZG9zc2llclJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9zc2llclJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhkb3NzaWVyUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRvc3NpZXIgPSBKU09OLnBhcnNlKGRvc3NpZXJSYXdKc29uKVxuICAgICAgICBjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlKGRvc3NpZXIpXG4gICAgICAgIGNvbnN0IGRvc3NpZXJKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkb3NzaWVyLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBkb3NzaWVyQ2xlYW46IERvc3NpZXJQYXJsZW1lbnRhaXJlID1cbiAgICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0Rvc3NpZXJQYXJsZW1lbnRhaXJlKGRvc3NpZXJKc29uKVxuICAgICAgICBjb25zdCBkb3NzaWVyQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LmRvc3NpZXJQYXJsZW1lbnRhaXJlVG9Kc29uKGRvc3NpZXJDbGVhbilcblxuICAgICAgICBjb25zdCBkb3NzaWVyQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5kb3NzaWVyU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGRvc3NpZXJDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkb3NzaWVyQ2xlYW5GaWxlUGF0aCwgZG9zc2llckNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2goZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBvcHRpb25zLnJlbW90ZSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCJkb2N1bWVudHNcIiwgXCJkb3NzaWVyc1wiXSlcbiAgICAgICkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlNjcnV0aW5zKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLnNjcnV0aW5zKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3Qgc2NydXRpblNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIpKSB7XG4gICAgICAgIGNvbnN0IHNjcnV0aW5GaWxlbmFtZSA9IHNjcnV0aW5TcGxpdFBhdGhbc2NydXRpblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIXNjcnV0aW5GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY3J1dGluUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4uc2NydXRpblNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7c2NydXRpblJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NydXRpblJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhzY3J1dGluUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHNjcnV0aW4gPSBKU09OLnBhcnNlKHNjcnV0aW5SYXdKc29uKVxuICAgICAgICBjbGVhblNjcnV0aW4oc2NydXRpbilcbiAgICAgICAgY29uc3Qgc2NydXRpbkpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHNjcnV0aW4sIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IHNjcnV0aW5DbGVhbjogU2NydXRpbiA9IFNjcnV0aW5zQ29udmVydC50b1NjcnV0aW4oc2NydXRpbkpzb24pXG4gICAgICAgIGNvbnN0IHNjcnV0aW5DbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgU2NydXRpbnNDb252ZXJ0LnNjcnV0aW5Ub0pzb24oc2NydXRpbkNsZWFuKVxuXG4gICAgICAgIGNvbnN0IHNjcnV0aW5DbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLnNjcnV0aW5TcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoc2NydXRpbkNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHNjcnV0aW5DbGVhbkZpbGVQYXRoLCBzY3J1dGluQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdG9yZSBzdGFuZGFyZCBjb252ZXJzaW9uIG9mIGRhdGVzIHRvIEpTT04uXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGV4aXN0aW5nRGF0ZVRvSnNvblxuXG4gIHJldHVybiBlcnJvclxufVxuXG5mdW5jdGlvbiBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSB7XG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUubG9nKGBDbGVhbmluZyBkaXJlY3Rvcnk6ICR7ZGF0YXNldENsZWFuRGlyfeKApmApXG4gIH1cbiAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0Q2xlYW5EaXIpXG4gIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldENsZWFuRGlyKSkge1xuICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHBhdGhuYW1lID0gcGF0aC5qb2luKGRhdGFzZXRDbGVhbkRpciwgZmlsZW5hbWUpXG4gICAgZnMucmVtb3ZlU3luYyhwYXRobmFtZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBbmRQdXNoKFxuICByZXBvc2l0b3J5RGlyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSxcbiAgcmVtb3Rlcz86IHN0cmluZ1tdLFxuKTogYm9vbGVhbiB7XG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgIGdpdC5jb21taXQocmVwb3NpdG9yeURpciwgXCJOb3V2ZWxsZSBtb2lzc29uXCIpXG4gICAgZm9yIChjb25zdCByZW1vdGUgb2YgcmVtb3RlcyB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBwdXNoICR7cmVtb3RlfSBtYXN0ZXJgLCB7XG4gICAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICAvLyBEb24ndCBzdG9wIHdoZW4gcHVzaCBmYWlscy5cbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIGNvbW1pdEFuZFB1c2hVaWQoXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgb3B0aW9uczogYW55LFxuICBzdWJkaXJlY3RvcmllczogYW55LFxuKTogYm9vbGVhbiB7XG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgIGdpdC51aWRCcmFuY2hVcGRhdGUoXG4gICAgICByZXBvc2l0b3J5RGlyLFxuICAgICAgc3ViZGlyZWN0b3JpZXMsXG4gICAgICBvcHRpb25zW1wibm8tcmVzZXQtYWZ0ZXItY29tbWl0XCJdLFxuICAgIClcbiAgICBmb3IgKGNvbnN0IHJlbW90ZSBvZiBvcHRpb25zLnJlbW90ZSB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZ2l0LnJ1bihyZXBvc2l0b3J5RGlyLCBgcHVzaCAtLXF1aWV0ICR7cmVtb3RlfSB1aWQ6dWlkYClcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIG1haW4oYXJndjogYW55KTogbnVtYmVyIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlQXJncyhhcmd2KVxuICBpZiAoY2xlYW5SZW9yZ2FuaXplZERhdGEob3B0aW9ucykpIHtcbiAgICByZXR1cm4gMVxuICB9IGVsc2Uge1xuICAgIHJldHVybiAwXG4gIH1cbn1cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAocHJvY2Vzcy5hcmd2WzFdLmVuZHNXaXRoKFwiY2xlYW5fcmVvcmdhbml6ZWRfZGF0YS50c1wiKSlcbiAgcHJvY2Vzcy5leGl0KG1haW4ocHJvY2Vzcy5hcmd2KSlcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBUCxNQUFtQixRQUFuQjtBQUNBLFNBQVNDLFFBQVQsUUFBeUIsZUFBekI7QUFDQSxPQUFPQyxlQUFQLE1BQTRCLG1CQUE1QjtBQUNBLE9BQU9DLEVBQVAsTUFBZSxVQUFmO0FBQ0EsT0FBT0MsSUFBUCxNQUFpQixNQUFqQjtTQUdFQyxXLEVBQ0FDLGUsRUFDQUMsdUIsRUFDQUMseUIsRUFDQUMsVyxFQUNBQyxZLEVBQ0FDLFk7U0FFT0MsUSxFQUFVQyxlO1NBQ1ZDLGtCLEVBQW9CQyxpQjtTQUNwQkMsTztPQUNGLEtBQUtDLEc7U0FHVkMsT0FBTyxJQUFJQyx1QjtTQUdKRCxPQUFPLElBQUlFLGM7U0FDQ0YsT0FBTyxJQUFJRyxrQjtTQUU5QkgsT0FBTyxJQUFJSSwwQjtTQUlKSixPQUFPLElBQUlLLGU7O0FBRXBCLFNBQVNDLFNBQVQsQ0FBbUJDLElBQW5CLEVBQXdDO0VBQ3RDLE1BQU1DLGtCQUFrQixHQUFHLENBQ3pC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
816
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwibXVsdGlwbGUiLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsImNvbW1hbmRMaW5lQXJncyIsImNsZWFuUmVvcmdhbml6ZWREYXRhIiwiZGF0YURpciIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJwYXRjaGVkRGF0ZVRvSnNvbiIsImVycm9yIiwiZ2l0R3JvdXBVcmwiLCJjbG9uZSIsInRyaW0iLCJyZXBsYWNlIiwidW5kZWZpbmVkIiwiY2F0ZWdvcmllcyIsIm1hcCIsImRhdGFzZXROYW1lIiwiYXNzZXJ0Iiwibm90U3RyaWN0RXF1YWwiLCJFbmFibGVkRGF0YXNldHMiLCJlbmFibGVkRGF0YXNldHMiLCJyZWR1Y2UiLCJOb25lIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXRzIiwiYWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXQiLCJwYXRoIiwiYmFzZW5hbWUiLCJmaWxlbmFtZSIsImV4ZWNTeW5jIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJhbmFseXplQW5kUmVtb3ZlIiwiZGF0YXNldFJhd0RpciIsImpvaW4iLCJkYXRhc2V0Q2xlYW5EaXIiLCJ3YWxrRGlyIiwiYWN0ZXVyU3BsaXRQYXRoIiwiYWN0ZXVyRmlsZW5hbWUiLCJsZW5ndGgiLCJlbmRzV2l0aCIsImFjdGV1clJhd0ZpbGVQYXRoIiwidmVyYm9zZSIsImNvbnNvbGUiLCJsb2ciLCJhY3RldXJSYXdKc29uIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJhY3RldXIiLCJKU09OIiwicGFyc2UiLCJjbGVhbkFjdGV1ciIsImFjdGV1ckpzb24iLCJzdHJpbmdpZnkiLCJhY3RldXJDbGVhbiIsIkFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0IiwidG9BY3RldXIiLCJhY3RldXJDbGVhbkpzb24iLCJhY3RldXJUb0pzb24iLCJhY3RldXJDbGVhbkZpbGVQYXRoIiwiZW5zdXJlRGlyU3luYyIsImRpcm5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwib3JnYW5lU3BsaXRQYXRoIiwib3JnYW5lRmlsZW5hbWUiLCJvcmdhbmVSYXdGaWxlUGF0aCIsIm9yZ2FuZVJhd0pzb24iLCJvcmdhbmUiLCJjbGVhbk9yZ2FuZSIsIm9yZ2FuZUpzb24iLCJvcmdhbmVDbGVhbiIsInRvT3JnYW5lIiwib3JnYW5lQ2xlYW5Kc29uIiwib3JnYW5lVG9Kc29uIiwib3JnYW5lQ2xlYW5GaWxlUGF0aCIsImNvbW1pdEFuZFB1c2giLCJyZW1vdGUiLCJjb21taXRBbmRQdXNoVWlkIiwiQWdlbmRhcyIsImFnZW5kYXMiLCJyZXVuaW9uU3BsaXRQYXRoIiwicmV1bmlvbkZpbGVuYW1lIiwicmV1bmlvblJhd0ZpbGVQYXRoIiwicmV1bmlvblJhd0pzb24iLCJyZXVuaW9uIiwiY2xlYW5SZXVuaW9uIiwicmV1bmlvbkpzb24iLCJyZXVuaW9uQ2xlYW4iLCJBZ2VuZGFzQ29udmVydCIsInRvUmV1bmlvbiIsInJldW5pb25DbGVhbkpzb24iLCJyZXVuaW9uVG9Kc29uIiwicmV1bmlvbkNsZWFuRmlsZVBhdGgiLCJBbWVuZGVtZW50cyIsImFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsImFtZW5kZW1lbnRGaWxlbmFtZSIsImFtZW5kZW1lbnRSYXdGaWxlUGF0aCIsImFtZW5kZW1lbnRSYXdKc29uIiwiYW1lbmRlbWVudCIsImNsZWFuQW1lbmRlbWVudCIsImFtZW5kZW1lbnRKc29uIiwiYW1lbmRlbWVudENsZWFuIiwiQW1lbmRlbWVudHNDb252ZXJ0IiwidG9BbWVuZGVtZW50IiwiYW1lbmRlbWVudENsZWFuSnNvbiIsImFtZW5kZW1lbnRUb0pzb24iLCJhbWVuZGVtZW50Q2xlYW5GaWxlUGF0aCIsIkRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9jdW1lbnRTcGxpdFBhdGgiLCJkb2N1bWVudEZpbGVuYW1lIiwiZG9jdW1lbnRSYXdGaWxlUGF0aCIsImRvY3VtZW50UmF3SnNvbiIsImRvY3VtZW50IiwiY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24iLCJkb2N1bWVudEpzb24iLCJkb2N1bWVudENsZWFuIiwiRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQiLCJ0b0RvY3VtZW50IiwiZG9jdW1lbnRDbGVhbkpzb24iLCJkb2N1bWVudFRvSnNvbiIsImRvY3VtZW50Q2xlYW5GaWxlUGF0aCIsImRvc3NpZXJTcGxpdFBhdGgiLCJkb3NzaWVyRmlsZW5hbWUiLCJkb3NzaWVyUmF3RmlsZVBhdGgiLCJkb3NzaWVyUmF3SnNvbiIsImRvc3NpZXIiLCJjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiZG9zc2llckpzb24iLCJkb3NzaWVyQ2xlYW4iLCJ0b0Rvc3NpZXJQYXJsZW1lbnRhaXJlIiwiZG9zc2llckNsZWFuSnNvbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlVG9Kc29uIiwiZG9zc2llckNsZWFuRmlsZVBhdGgiLCJTY3J1dGlucyIsInNjcnV0aW5zIiwic2NydXRpblNwbGl0UGF0aCIsInNjcnV0aW5GaWxlbmFtZSIsInNjcnV0aW5SYXdGaWxlUGF0aCIsInNjcnV0aW5SYXdKc29uIiwic2NydXRpbiIsImNsZWFuU2NydXRpbiIsInNjcnV0aW5Kc29uIiwic2NydXRpbkNsZWFuIiwiU2NydXRpbnNDb252ZXJ0IiwidG9TY3J1dGluIiwic2NydXRpbkNsZWFuSnNvbiIsInNjcnV0aW5Ub0pzb24iLCJzY3J1dGluQ2xlYW5GaWxlUGF0aCIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInNpbGVudCIsInJlYWRkaXJTeW5jIiwicGF0aG5hbWUiLCJyZW1vdmVTeW5jIiwicmVwb3NpdG9yeURpciIsInJlbW90ZXMiLCJjb21taXQiLCJnaXQiLCJjaGlsZFByb2Nlc3MiLCJvdXRwdXQiLCJzdWJkaXJlY3RvcmllcyIsInVpZEJyYW5jaFVwZGF0ZSIsInJ1biIsIm1haW4iLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvY2xlYW5fcmVvcmdhbml6ZWRfZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHtcbiAgY2xlYW5BY3RldXIsXG4gIGNsZWFuQW1lbmRlbWVudCxcbiAgY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24sXG4gIGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUsXG4gIGNsZWFuT3JnYW5lLFxuICBjbGVhblJldW5pb24sXG4gIGNsZWFuU2NydXRpbixcbn0gZnJvbSBcIi4uL2NsZWFuZXJzXCJcbmltcG9ydCB7IGRhdGFzZXRzLCBFbmFibGVkRGF0YXNldHMgfSBmcm9tIFwiLi4vZGF0YXNldHNcIlxuaW1wb3J0IHsgZXhpc3RpbmdEYXRlVG9Kc29uLCBwYXRjaGVkRGF0ZVRvSnNvbiB9IGZyb20gXCIuLi9kYXRlc1wiXG5pbXBvcnQgeyB3YWxrRGlyIH0gZnJvbSBcIi4uL2ZpbGVfc3lzdGVtc1wiXG5pbXBvcnQgKiBhcyBnaXQgZnJvbSBcIi4uL2dpdFwiXG5pbXBvcnQge1xuICBBY3RldXIsXG4gIENvbnZlcnQgYXMgQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQsXG4gIE9yZ2FuZSxcbn0gZnJvbSBcIi4uL3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFnZW5kYXNDb252ZXJ0LCBSZXVuaW9uIH0gZnJvbSBcIi4uL3R5cGVzL2FnZW5kYXNcIlxuaW1wb3J0IHsgQW1lbmRlbWVudCwgQ29udmVydCBhcyBBbWVuZGVtZW50c0NvbnZlcnQgfSBmcm9tIFwiLi4vdHlwZXMvYW1lbmRlbWVudHNcIlxuaW1wb3J0IHtcbiAgQ29udmVydCBhcyBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydCxcbiAgRG9jdW1lbnQsXG4gIERvc3NpZXJQYXJsZW1lbnRhaXJlLFxufSBmcm9tIFwiLi4vdHlwZXMvZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBTY3J1dGluc0NvbnZlcnQsIFNjcnV0aW4gfSBmcm9tIFwiLi4vdHlwZXMvc2NydXRpbnNcIlxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiBhbnkge1xuICBjb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gICAge1xuICAgICAgYWxpYXM6IFwiQ1wiLFxuICAgICAgaGVscDogXCJjbG9uZSByZXBvc2l0b3JpZXMgZnJvbSBnaXZlbiBncm91cCAob3Igb3JnYW5pemF0aW9uKSBnaXQgVVJMXCIsXG4gICAgICBuYW1lOiBcImNsb25lXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJjXCIsXG4gICAgICBoZWxwOiBcImNvbW1pdCBjbGVhbiBmaWxlc1wiLFxuICAgICAgbmFtZTogXCJjb21taXRcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJkXCIsXG4gICAgICBoZWxwOiBcInNpbmdsZSBkYXRhc2V0IHRvIHJlb3JnYW5pemVcIixcbiAgICAgIG5hbWU6IFwiZGF0YXNldFwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwia1wiLFxuICAgICAgZGVmYXVsdFZhbHVlOiBbXCJBbGxcIl0sXG4gICAgICBoZWxwOiBcImNhdGVnb3JpZXMgb2YgZGF0YXNldHMgdG8gcmVvcmdhbml6ZVwiLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBuYW1lOiBcImNhdGVnb3JpZXNcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcInJcIixcbiAgICAgIGhlbHA6IFwicHVzaCBjb21taXQgdG8gZ2l2ZW4gcmVtb3RlXCIsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG5hbWU6IFwicmVtb3RlXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJzXCIsXG4gICAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgICAgbmFtZTogXCJzaWxlbnRcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBoZWxwOiBcImRvIG5vdCByZXNldCAtLWhhcmQgYWZ0ZXIgY29tbWl0IHRvIHNhdmUgSS9PIGlmIHRoZSB3b3JraW5nIHRyZWUgaXMgdG8gYmUgZGlzY2FyZGVkXCIsXG4gICAgICBuYW1lOiBcIm5vLXJlc2V0LWFmdGVyLWNvbW1pdFwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcInZcIixcbiAgICAgIGhlbHA6IFwidmVyYm9zZSBsb2dzXCIsXG4gICAgICBuYW1lOiBcInZlcmJvc2VcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWZhdWx0T3B0aW9uOiB0cnVlLFxuICAgICAgaGVscDogXCJkaXJlY3RvcnkgY29udGFpbmluZyBBc3NlbWJsw6llIG9wZW4gZGF0YSBmaWxlc1wiLFxuICAgICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgXVxuICBjb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucywge1xuICAgIGFyZ3Y6IGFyZ3YsXG4gIH0pXG4gIHJldHVybiBvcHRpb25zXG59XG5cbmZ1bmN0aW9uIGNsZWFuUmVvcmdhbml6ZWREYXRhKG9wdGlvbnM6IGFueSk6IGJvb2xlYW4ge1xuICBjb25zdCBkYXRhRGlyOiBzdHJpbmcgPSBvcHRpb25zLmRhdGFEaXJcblxuICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBwYXRjaGVkRGF0ZVRvSnNvblxuXG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGNvbnN0IGdpdEdyb3VwVXJsID0gb3B0aW9ucy5jbG9uZVxuICAgID8gb3B0aW9ucy5jbG9uZS50cmltKCkucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgb3B0aW9ucy5jYXRlZ29yaWVzLm1hcCgoZGF0YXNldE5hbWU6IHN0cmluZykgPT5cbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgICAoRW5hYmxlZERhdGFzZXRzIGFzIGFueSBhcyB7IFtuYW1lOiBzdHJpbmddOiBFbmFibGVkRGF0YXNldHMgfSlbXG4gICAgICAgIGRhdGFzZXROYW1lXG4gICAgICBdLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgYFVua25vd24gbmFtZSBvZiBkYXRhc2V0OiAke2RhdGFzZXROYW1lfWAsXG4gICAgKSxcbiAgKVxuICBjb25zdCBlbmFibGVkRGF0YXNldHMgPSBvcHRpb25zLmNhdGVnb3JpZXMucmVkdWNlKFxuICAgIChlbmFibGVkRGF0YXNldHM6IEVuYWJsZWREYXRhc2V0cywgZGF0YXNldE5hbWU6IHN0cmluZyk6IEVuYWJsZWREYXRhc2V0cyA9PlxuICAgICAgZW5hYmxlZERhdGFzZXRzIHxcbiAgICAgIChFbmFibGVkRGF0YXNldHMgYXMgYW55IGFzIHsgW25hbWU6IHN0cmluZ106IEVuYWJsZWREYXRhc2V0cyB9KVtcbiAgICAgICAgZGF0YXNldE5hbWVcbiAgICAgIF0sXG4gICAgRW5hYmxlZERhdGFzZXRzLk5vbmUsXG4gIClcblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IGFjdGV1clNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIsIFtcImFjdGV1cnNcIl0pKSB7XG4gICAgICAgIGNvbnN0IGFjdGV1ckZpbGVuYW1lID0gYWN0ZXVyU3BsaXRQYXRoW2FjdGV1clNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWFjdGV1ckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjdGV1clJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXRSYXdEaXIsIC4uLmFjdGV1clNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7YWN0ZXVyUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3RldXJSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoYWN0ZXVyUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGFjdGV1ciA9IEpTT04ucGFyc2UoYWN0ZXVyUmF3SnNvbilcbiAgICAgICAgY2xlYW5BY3RldXIoYWN0ZXVyKVxuICAgICAgICBjb25zdCBhY3RldXJKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShhY3RldXIsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGFjdGV1ckNsZWFuOiBBY3RldXIgPSBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b0FjdGV1cihhY3RldXJKc29uKVxuICAgICAgICBjb25zdCBhY3RldXJDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQuYWN0ZXVyVG9Kc29uKGFjdGV1ckNsZWFuKVxuXG4gICAgICAgIGNvbnN0IGFjdGV1ckNsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uYWN0ZXVyU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGFjdGV1ckNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGFjdGV1ckNsZWFuRmlsZVBhdGgsIGFjdGV1ckNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBvcmdhbmVTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCBbXCJvcmdhbmVzXCJdKSkge1xuICAgICAgICBjb25zdCBvcmdhbmVGaWxlbmFtZSA9IG9yZ2FuZVNwbGl0UGF0aFtvcmdhbmVTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFvcmdhbmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmdhbmVSYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5vcmdhbmVTcGxpdFBhdGgpXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke29yZ2FuZVJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JnYW5lUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKG9yZ2FuZVJhd0ZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBvcmdhbmUgPSBKU09OLnBhcnNlKG9yZ2FuZVJhd0pzb24pXG4gICAgICAgIGNsZWFuT3JnYW5lKG9yZ2FuZSlcbiAgICAgICAgY29uc3Qgb3JnYW5lSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBvcmdhbmVDbGVhbjogT3JnYW5lID0gQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9PcmdhbmUob3JnYW5lSnNvbilcbiAgICAgICAgY29uc3Qgb3JnYW5lQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0Lm9yZ2FuZVRvSnNvbihvcmdhbmVDbGVhbilcblxuICAgICAgICBjb25zdCBvcmdhbmVDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLm9yZ2FuZVNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShvcmdhbmVDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhvcmdhbmVDbGVhbkZpbGVQYXRoLCBvcmdhbmVDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjb21taXRBbmRQdXNoKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgb3B0aW9ucy5yZW1vdGUpKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCJhY3RldXJzXCIsIFwib3JnYW5lc1wiXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BZ2VuZGFzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFnZW5kYXMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCByZXVuaW9uU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpcikpIHtcbiAgICAgICAgY29uc3QgcmV1bmlvbkZpbGVuYW1lID0gcmV1bmlvblNwbGl0UGF0aFtyZXVuaW9uU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghcmV1bmlvbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldW5pb25SYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5yZXVuaW9uU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtyZXVuaW9uUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXVuaW9uUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHJldW5pb25SYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgcmV1bmlvbiA9IEpTT04ucGFyc2UocmV1bmlvblJhd0pzb24pXG4gICAgICAgIGNsZWFuUmV1bmlvbihyZXVuaW9uKVxuICAgICAgICBjb25zdCByZXVuaW9uSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocmV1bmlvbiwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3QgcmV1bmlvbkNsZWFuOiBSZXVuaW9uID0gQWdlbmRhc0NvbnZlcnQudG9SZXVuaW9uKHJldW5pb25Kc29uKVxuICAgICAgICBjb25zdCByZXVuaW9uQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIEFnZW5kYXNDb252ZXJ0LnJldW5pb25Ub0pzb24ocmV1bmlvbkNsZWFuKVxuXG4gICAgICAgIGNvbnN0IHJldW5pb25DbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLnJldW5pb25TcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUocmV1bmlvbkNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHJldW5pb25DbGVhbkZpbGVQYXRoLCByZXVuaW9uQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyKSkge1xuICAgICAgICBjb25zdCBhbWVuZGVtZW50RmlsZW5hbWUgPVxuICAgICAgICAgIGFtZW5kZW1lbnRTcGxpdFBhdGhbYW1lbmRlbWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWFtZW5kZW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50UmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgICAuLi5hbWVuZGVtZW50U3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke2FtZW5kZW1lbnRSYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgYW1lbmRlbWVudFJhd0ZpbGVQYXRoLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnQgPSBKU09OLnBhcnNlKGFtZW5kZW1lbnRSYXdKc29uKVxuICAgICAgICBjbGVhbkFtZW5kZW1lbnQoYW1lbmRlbWVudClcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudEpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGFtZW5kZW1lbnQsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRDbGVhbjogQW1lbmRlbWVudCA9XG4gICAgICAgICAgQW1lbmRlbWVudHNDb252ZXJ0LnRvQW1lbmRlbWVudChhbWVuZGVtZW50SnNvbilcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudENsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBBbWVuZGVtZW50c0NvbnZlcnQuYW1lbmRlbWVudFRvSnNvbihhbWVuZGVtZW50Q2xlYW4pXG5cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudENsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uYW1lbmRlbWVudFNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShhbWVuZGVtZW50Q2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoYW1lbmRlbWVudENsZWFuRmlsZVBhdGgsIGFtZW5kZW1lbnRDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjb21taXRBbmRQdXNoKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgb3B0aW9ucy5yZW1vdGUpKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCIuXCJdKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuZG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IGRvY3VtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpciwgW1wiZG9jdW1lbnRzXCJdKSkge1xuICAgICAgICBjb25zdCBkb2N1bWVudEZpbGVuYW1lID0gZG9jdW1lbnRTcGxpdFBhdGhbZG9jdW1lbnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFkb2N1bWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvY3VtZW50UmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgICAuLi5kb2N1bWVudFNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtkb2N1bWVudFJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9jdW1lbnRSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoZG9jdW1lbnRSYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBKU09OLnBhcnNlKGRvY3VtZW50UmF3SnNvbilcbiAgICAgICAgY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24oZG9jdW1lbnQpXG4gICAgICAgIGNvbnN0IGRvY3VtZW50SnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnQsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGRvY3VtZW50Q2xlYW46IERvY3VtZW50ID1cbiAgICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0RvY3VtZW50KGRvY3VtZW50SnNvbilcbiAgICAgICAgY29uc3QgZG9jdW1lbnRDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQuZG9jdW1lbnRUb0pzb24oZG9jdW1lbnRDbGVhbilcblxuICAgICAgICBjb25zdCBkb2N1bWVudENsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uZG9jdW1lbnRTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoZG9jdW1lbnRDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkb2N1bWVudENsZWFuRmlsZVBhdGgsIGRvY3VtZW50Q2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRvc3NpZXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCBbXCJkb3NzaWVyc1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9zc2llckZpbGVuYW1lID0gZG9zc2llclNwbGl0UGF0aFtkb3NzaWVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9zc2llckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvc3NpZXJSYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5kb3NzaWVyU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtkb3NzaWVyUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb3NzaWVyUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGRvc3NpZXJSYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9zc2llciA9IEpTT04ucGFyc2UoZG9zc2llclJhd0pzb24pXG4gICAgICAgIGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUoZG9zc2llcilcbiAgICAgICAgY29uc3QgZG9zc2llckpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRvc3NpZXIsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGRvc3NpZXJDbGVhbjogRG9zc2llclBhcmxlbWVudGFpcmUgPVxuICAgICAgICAgIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LnRvRG9zc2llclBhcmxlbWVudGFpcmUoZG9zc2llckpzb24pXG4gICAgICAgIGNvbnN0IGRvc3NpZXJDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQuZG9zc2llclBhcmxlbWVudGFpcmVUb0pzb24oZG9zc2llckNsZWFuKVxuXG4gICAgICAgIGNvbnN0IGRvc3NpZXJDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmRvc3NpZXJTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoZG9zc2llckNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRvc3NpZXJDbGVhbkZpbGVQYXRoLCBkb3NzaWVyQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tbWl0QW5kUHVzaChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIG9wdGlvbnMucmVtb3RlKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcImRvY3VtZW50c1wiLCBcImRvc3NpZXJzXCJdKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuU2NydXRpbnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuc2NydXRpbnMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICAgICAgZm9yIChjb25zdCBzY3J1dGluU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpcikpIHtcbiAgICAgICAgY29uc3Qgc2NydXRpbkZpbGVuYW1lID0gc2NydXRpblNwbGl0UGF0aFtzY3J1dGluU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghc2NydXRpbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjcnV0aW5SYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5zY3J1dGluU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtzY3J1dGluUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY3J1dGluUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHNjcnV0aW5SYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3Qgc2NydXRpbiA9IEpTT04ucGFyc2Uoc2NydXRpblJhd0pzb24pXG4gICAgICAgIGNsZWFuU2NydXRpbihzY3J1dGluKVxuICAgICAgICBjb25zdCBzY3J1dGluSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoc2NydXRpbiwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3Qgc2NydXRpbkNsZWFuOiBTY3J1dGluID0gU2NydXRpbnNDb252ZXJ0LnRvU2NydXRpbihzY3J1dGluSnNvbilcbiAgICAgICAgY29uc3Qgc2NydXRpbkNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBTY3J1dGluc0NvbnZlcnQuc2NydXRpblRvSnNvbihzY3J1dGluQ2xlYW4pXG5cbiAgICAgICAgY29uc3Qgc2NydXRpbkNsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uc2NydXRpblNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShzY3J1dGluQ2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2NydXRpbkNsZWFuRmlsZVBhdGgsIHNjcnV0aW5DbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjb21taXRBbmRQdXNoKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgb3B0aW9ucy5yZW1vdGUpKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCIuXCJdKSkge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXN0b3JlIHN0YW5kYXJkIGNvbnZlcnNpb24gb2YgZGF0ZXMgdG8gSlNPTi5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZXhpc3RpbmdEYXRlVG9Kc29uXG5cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWU6IHN0cmluZywgb3B0aW9uczogYW55KTogYW55IHtcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgY29uc29sZS5sb2coYENsZWFuaW5nIGRpcmVjdG9yeTogJHtkYXRhc2V0Q2xlYW5EaXJ94oCmYClcbiAgfVxuICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRDbGVhbkRpcilcbiAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0Q2xlYW5EaXIpKSB7XG4gICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgcGF0aG5hbWUgPSBwYXRoLmpvaW4oZGF0YXNldENsZWFuRGlyLCBmaWxlbmFtZSlcbiAgICBmcy5yZW1vdmVTeW5jKHBhdGhuYW1lKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEFuZFB1c2goXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgb3B0aW9uczogYW55LFxuICByZW1vdGVzPzogc3RyaW5nW10sXG4pOiBib29sZWFuIHtcbiAgbGV0IGVycm9yID0gZmFsc2VcbiAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgZ2l0LmNvbW1pdChyZXBvc2l0b3J5RGlyLCBcIk5vdXZlbGxlIG1vaXNzb25cIilcbiAgICBmb3IgKGNvbnN0IHJlbW90ZSBvZiByZW1vdGVzIHx8IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IHB1c2ggJHtyZW1vdGV9IG1hc3RlcmAsIHtcbiAgICAgICAgICBjd2Q6IHJlcG9zaXRvcnlEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIC8vIERvbid0IHN0b3Agd2hlbiBwdXNoIGZhaWxzLlxuICAgICAgICBjb25zb2xlLmVycm9yKChjaGlsZFByb2Nlc3MgYXMgYW55KS5vdXRwdXQpXG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZXJyb3Jcbn1cblxuZnVuY3Rpb24gY29tbWl0QW5kUHVzaFVpZChcbiAgcmVwb3NpdG9yeURpcjogc3RyaW5nLFxuICBvcHRpb25zOiBhbnksXG4gIHN1YmRpcmVjdG9yaWVzOiBhbnksXG4pOiBib29sZWFuIHtcbiAgbGV0IGVycm9yID0gZmFsc2VcbiAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgZ2l0LnVpZEJyYW5jaFVwZGF0ZShcbiAgICAgIHJlcG9zaXRvcnlEaXIsXG4gICAgICBzdWJkaXJlY3RvcmllcyxcbiAgICAgIG9wdGlvbnNbXCJuby1yZXNldC1hZnRlci1jb21taXRcIl0sXG4gICAgKVxuICAgIGZvciAoY29uc3QgcmVtb3RlIG9mIG9wdGlvbnMucmVtb3RlIHx8IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBnaXQucnVuKHJlcG9zaXRvcnlEaXIsIGBwdXNoIC0tcXVpZXQgJHtyZW1vdGV9IHVpZDp1aWRgKVxuICAgICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZXJyb3Jcbn1cblxuZnVuY3Rpb24gbWFpbihhcmd2OiBhbnkpOiBudW1iZXIge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VBcmdzKGFyZ3YpXG4gIGlmIChjbGVhblJlb3JnYW5pemVkRGF0YShvcHRpb25zKSkge1xuICAgIHJldHVybiAxXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDBcbiAgfVxufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChwcm9jZXNzLmFyZ3ZbMV0uZW5kc1dpdGgoXCJjbGVhbl9yZW9yZ2FuaXplZF9kYXRhLnRzXCIpKVxuICBwcm9jZXNzLmV4aXQobWFpbihwcm9jZXNzLmFyZ3YpKVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBU0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBS0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxTQUFTQSxTQUFULENBQW1CQyxJQUFuQixFQUF3QztFQUN0QyxJQUFNQyxrQkFBa0IsR0FBRyxDQUN6QjtJQUNFQyxLQUFLLEVBQUUsR0FEVDtJQUVFQyxJQUFJLEVBQUUsK0RBRlI7SUFHRUMsSUFBSSxFQUFFLE9BSFI7SUFJRUMsSUFBSSxFQUFFQztFQUpSLENBRHlCLEVBT3pCO0lBQ0VKLEtBQUssRUFBRSxHQURUO0lBRUVDLElBQUksRUFBRSxvQkFGUjtJQUdFQyxJQUFJLEVBQUUsUUFIUjtJQUlFQyxJQUFJLEVBQUVFO0VBSlIsQ0FQeUIsRUFhekI7SUFDRUws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