@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.
- package/README.md +2 -0
- package/lib/api.js +23 -7
- package/lib/api.mjs +41 -0
- package/lib/bugs/acteur-00010/plugin.test.js +139 -33
- package/lib/bugs/acteur-00010/plugin.test.mjs +33 -0
- package/lib/bugs/acteur-00010.js +166 -24
- package/lib/bugs/acteur-00010.mjs +31 -0
- package/lib/bugs/agenda-00002/plugin.test.js +178 -52
- package/lib/bugs/agenda-00002/plugin.test.mjs +52 -0
- package/lib/bugs/agenda-00002.js +507 -143
- package/lib/bugs/agenda-00002.mjs +197 -0
- package/lib/bugs/agenda-00008/plugin.test.js +143 -31
- package/lib/bugs/agenda-00008/plugin.test.mjs +31 -0
- package/lib/bugs/agenda-00008.js +180 -25
- package/lib/bugs/agenda-00008.mjs +30 -0
- package/lib/bugs/agenda-00011/plugin.test.js +371 -156
- package/lib/bugs/agenda-00011/plugin.test.mjs +156 -0
- package/lib/bugs/agenda-00011.js +416 -117
- package/lib/bugs/agenda-00011.mjs +150 -0
- package/lib/bugs.js +591 -54
- package/lib/bugs.mjs +93 -0
- package/lib/cleaners/actes_legislatifs.js +149 -61
- package/lib/cleaners/actes_legislatifs.mjs +311 -0
- package/lib/cleaners/acteurs.js +255 -123
- package/lib/cleaners/acteurs.mjs +211 -0
- package/lib/cleaners/amendements.js +242 -117
- package/lib/cleaners/amendements.mjs +292 -0
- package/lib/cleaners/documents.js +147 -62
- package/lib/cleaners/documents.mjs +162 -0
- package/lib/cleaners/dossiers_legislatifs.js +132 -45
- package/lib/cleaners/dossiers_legislatifs.mjs +123 -0
- package/lib/cleaners/index.js +64 -8
- package/lib/cleaners/index.mjs +8 -0
- package/lib/cleaners/organes.js +54 -21
- package/lib/cleaners/organes.mjs +64 -0
- package/lib/cleaners/reunions.js +237 -127
- package/lib/cleaners/reunions.mjs +318 -0
- package/lib/cleaners/scrutins.js +261 -99
- package/lib/cleaners/scrutins.mjs +254 -0
- package/lib/cleaners/xml.js +81 -16
- package/lib/cleaners/xml.mjs +42 -0
- package/lib/datasets.js +284 -153
- package/lib/datasets.mjs +596 -0
- package/lib/dates.js +93 -34
- package/lib/dates.mjs +98 -0
- package/lib/dossiers_legislatifs.js +107 -33
- package/lib/dossiers_legislatifs.mjs +215 -0
- package/lib/file_systems.js +203 -35
- package/lib/file_systems.mjs +64 -0
- package/lib/git.js +139 -41
- package/lib/git.mjs +114 -0
- package/lib/index.js +310 -16
- package/lib/index.mjs +16 -0
- package/lib/inserters.js +355 -131
- package/lib/inserters.mjs +413 -0
- package/lib/loaders.js +900 -440
- package/lib/loaders.mjs +678 -0
- package/lib/organes.js +15 -5
- package/lib/organes.mjs +18 -0
- package/lib/parsers/documents.js +241 -89
- package/lib/parsers/documents.mjs +433 -0
- package/lib/parsers/index.js +36 -3
- package/lib/parsers/index.mjs +3 -0
- package/lib/parsers/recherche_amendements.js +616 -173
- package/lib/parsers/recherche_amendements.mjs +189 -0
- package/lib/raw_types/acteurs_et_organes.d.ts +36 -148
- package/lib/raw_types/acteurs_et_organes.js +228 -506
- package/lib/raw_types/acteurs_et_organes.mjs +1240 -0
- package/lib/raw_types/agendas.js +165 -75
- package/lib/raw_types/agendas.mjs +944 -0
- package/lib/raw_types/amendements.js +165 -77
- package/lib/raw_types/amendements.mjs +1040 -0
- package/lib/raw_types/dossiers_legislatifs.d.ts +1 -43
- package/lib/raw_types/dossiers_legislatifs.js +181 -143
- package/lib/raw_types/dossiers_legislatifs.mjs +1792 -0
- package/lib/raw_types/scrutins.js +144 -61
- package/lib/raw_types/scrutins.mjs +645 -0
- package/lib/scripts/bugs_helper.js +657 -155
- package/lib/scripts/bugs_helper.mjs +286 -0
- package/lib/scripts/clean_data.js +380 -145
- package/lib/scripts/clean_data.mjs +190 -0
- package/lib/scripts/clean_reorganized_data.js +627 -331
- package/lib/scripts/clean_reorganized_data.mjs +520 -0
- package/lib/scripts/diff_amendements.js +159 -73
- package/lib/scripts/diff_amendements.mjs +234 -0
- package/lib/scripts/document_dossiers_legislatifs.js +570 -288
- package/lib/scripts/document_dossiers_legislatifs.mjs +494 -0
- package/lib/scripts/get_today_reunions.js +37 -20
- package/lib/scripts/get_today_reunions.mjs +41 -0
- package/lib/scripts/merge_scrutins.js +121 -39
- package/lib/scripts/merge_scrutins.mjs +69 -0
- package/lib/scripts/parse_textes_lois.js +179 -125
- package/lib/scripts/parse_textes_lois.mjs +215 -0
- package/lib/scripts/raw_types_from_amendements.js +276 -77
- package/lib/scripts/raw_types_from_amendements.mjs +118 -0
- package/lib/scripts/reorganize_data.js +867 -446
- package/lib/scripts/reorganize_data.mjs +712 -0
- package/lib/scripts/retrieve_deputes_photos.js +378 -157
- package/lib/scripts/retrieve_deputes_photos.mjs +230 -0
- package/lib/scripts/retrieve_documents.js +648 -172
- package/lib/scripts/retrieve_documents.mjs +292 -0
- package/lib/scripts/retrieve_open_data.js +286 -85
- package/lib/scripts/retrieve_open_data.mjs +125 -0
- package/lib/scripts/retrieve_pending_amendments.js +302 -69
- package/lib/scripts/retrieve_pending_amendments.mjs +130 -0
- package/lib/scripts/retrieve_senateurs_photos.js +374 -198
- package/lib/scripts/retrieve_senateurs_photos.mjs +277 -0
- package/lib/scripts/retrieve_textes_lois.js +343 -89
- package/lib/scripts/retrieve_textes_lois.mjs +168 -0
- package/lib/scripts/test_load.js +30 -11
- package/lib/scripts/test_load.mjs +26 -0
- package/lib/scripts/test_load_big_files.js +30 -11
- package/lib/scripts/test_load_big_files.mjs +26 -0
- package/lib/scripts/validate_json.js +370 -120
- package/lib/scripts/validate_json.mjs +216 -0
- package/lib/shared_types/codes_actes.js +50 -15
- package/lib/shared_types/codes_actes.mjs +228 -0
- package/lib/strings.js +16 -3
- package/lib/strings.mjs +7 -0
- package/lib/types/acteurs_et_organes.js +156 -71
- package/lib/types/acteurs_et_organes.mjs +918 -0
- package/lib/types/agendas.js +154 -67
- package/lib/types/agendas.mjs +623 -0
- package/lib/types/amendements.js +166 -77
- package/lib/types/amendements.mjs +885 -0
- package/lib/types/dossiers_legislatifs.d.ts +1 -42
- package/lib/types/dossiers_legislatifs.js +182 -143
- package/lib/types/dossiers_legislatifs.mjs +1120 -0
- package/lib/types/legislatures.js +12 -3
- package/lib/types/legislatures.mjs +9 -0
- package/lib/types/scrutins.js +144 -61
- package/lib/types/scrutins.mjs +528 -0
- package/lib/urls.js +44 -25
- package/lib/urls.mjs +201 -0
- package/package.json +33 -12
|
@@ -1,21 +1,107 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
74
|
-
Date.prototype.toJSON = patchedDateToJson;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
options.categories.map(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
174
|
+
try {
|
|
175
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
176
|
+
var dataset = _step.value;
|
|
100
177
|
|
|
101
|
-
|
|
102
|
-
const acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
|
|
178
|
+
var datasetName = _path["default"].basename(dataset.filename, ".json");
|
|
103
179
|
|
|
104
|
-
if (
|
|
180
|
+
if (options.dataset && datasetName !== options.dataset) {
|
|
105
181
|
continue;
|
|
106
182
|
}
|
|
107
183
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
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
|
-
|
|
131
|
-
const organeFilename = organeSplitPath[organeSplitPath.length - 1];
|
|
195
|
+
var datasetRawDir = _path["default"].join(dataDir, datasetName);
|
|
132
196
|
|
|
133
|
-
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
197
|
+
var datasetCleanDir = datasetRawDir + "_nettoye";
|
|
136
198
|
|
|
137
|
-
|
|
199
|
+
var _iterator2 = _createForOfIteratorHelper((0, _file_systems.walkDir)(datasetRawDir, ["acteurs"])),
|
|
200
|
+
_step2;
|
|
138
201
|
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
144
|
-
|
|
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
|
-
|
|
160
|
-
error = true;
|
|
161
|
-
}
|
|
211
|
+
var acteurRawFilePath = _path["default"].join.apply(_path["default"], [datasetRawDir].concat(_toConsumableArray(acteurSplitPath)));
|
|
162
212
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
167
|
-
}
|
|
213
|
+
if (options.verbose) {
|
|
214
|
+
console.log(" Cleaning file: ".concat(acteurRawFilePath, "\u2026"));
|
|
215
|
+
}
|
|
168
216
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
217
|
+
var acteurRawJson = _fsExtra["default"].readFileSync(acteurRawFilePath, {
|
|
218
|
+
encoding: "utf8"
|
|
219
|
+
});
|
|
172
220
|
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
|
|
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
|
-
|
|
187
|
-
const datasetRawDir = path.join(dataDir, datasetName);
|
|
188
|
-
const datasetCleanDir = datasetRawDir + "_nettoye";
|
|
227
|
+
var acteurCleanJson = _acteurs_et_organes.Convert.acteurToJson(acteurClean);
|
|
189
228
|
|
|
190
|
-
|
|
191
|
-
const reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
|
|
229
|
+
var acteurCleanFilePath = _path["default"].join.apply(_path["default"], [datasetCleanDir].concat(_toConsumableArray(acteurSplitPath)));
|
|
192
230
|
|
|
193
|
-
|
|
194
|
-
|
|
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
|
-
|
|
243
|
+
var _iterator3 = _createForOfIteratorHelper((0, _file_systems.walkDir)(datasetRawDir, ["organes"])),
|
|
244
|
+
_step3;
|
|
198
245
|
|
|
199
|
-
|
|
200
|
-
|
|
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
|
-
|
|
204
|
-
|
|
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
|
-
|
|
220
|
-
error = true;
|
|
221
|
-
}
|
|
255
|
+
var organeRawFilePath = _path["default"].join.apply(_path["default"], [datasetRawDir].concat(_toConsumableArray(organeSplitPath)));
|
|
222
256
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
}
|
|
227
|
-
}
|
|
257
|
+
if (options.verbose) {
|
|
258
|
+
console.log(" Cleaning file: ".concat(organeRawFilePath, "\u2026"));
|
|
259
|
+
}
|
|
228
260
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
261
|
+
var organeRawJson = _fsExtra["default"].readFileSync(organeRawFilePath, {
|
|
262
|
+
encoding: "utf8"
|
|
263
|
+
});
|
|
232
264
|
|
|
233
|
-
|
|
234
|
-
|
|
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
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
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
|
-
|
|
247
|
-
|
|
248
|
-
|
|
302
|
+
if (enabledDatasets & _datasets.EnabledDatasets.Agendas) {
|
|
303
|
+
var _iterator4 = _createForOfIteratorHelper(_datasets.datasets.agendas),
|
|
304
|
+
_step4;
|
|
249
305
|
|
|
250
|
-
|
|
251
|
-
|
|
306
|
+
try {
|
|
307
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
308
|
+
var _dataset = _step4.value;
|
|
252
309
|
|
|
253
|
-
|
|
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
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
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
|
-
|
|
280
|
-
error = true;
|
|
281
|
-
}
|
|
327
|
+
var _datasetRawDir = _path["default"].join(dataDir, _datasetName);
|
|
282
328
|
|
|
283
|
-
|
|
284
|
-
error = true;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
}
|
|
329
|
+
var _datasetCleanDir = _datasetRawDir + "_nettoye";
|
|
288
330
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
const datasetName = path.basename(dataset.filename, ".json");
|
|
331
|
+
var _iterator5 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_datasetRawDir)),
|
|
332
|
+
_step5;
|
|
292
333
|
|
|
293
|
-
|
|
294
|
-
|
|
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
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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
|
-
|
|
307
|
-
|
|
308
|
-
|
|
390
|
+
if (enabledDatasets & _datasets.EnabledDatasets.Amendements) {
|
|
391
|
+
var _iterator6 = _createForOfIteratorHelper(_datasets.datasets.amendements),
|
|
392
|
+
_step6;
|
|
309
393
|
|
|
310
|
-
|
|
311
|
-
|
|
394
|
+
try {
|
|
395
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
396
|
+
var _dataset2 = _step6.value;
|
|
312
397
|
|
|
313
|
-
|
|
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
|
-
|
|
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
|
-
|
|
320
|
-
|
|
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
|
-
|
|
324
|
-
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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
|
-
|
|
340
|
-
const dossierFilename = dossierSplitPath[dossierSplitPath.length - 1];
|
|
486
|
+
var _datasetName3 = _path["default"].basename(_dataset3.filename, ".json");
|
|
341
487
|
|
|
342
|
-
if (
|
|
488
|
+
if (options.dataset && _datasetName3 !== options.dataset) {
|
|
343
489
|
continue;
|
|
344
490
|
}
|
|
345
491
|
|
|
346
|
-
|
|
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
|
-
|
|
349
|
-
|
|
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
|
-
|
|
353
|
-
|
|
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
|
-
|
|
369
|
-
|
|
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
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
}
|
|
376
|
-
}
|
|
559
|
+
if (!dossierFilename.endsWith(".json")) {
|
|
560
|
+
continue;
|
|
561
|
+
}
|
|
377
562
|
|
|
378
|
-
|
|
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
|
-
|
|
383
|
-
|
|
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
|
-
|
|
387
|
-
|
|
388
|
-
|
|
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
|
-
|
|
396
|
-
|
|
397
|
-
|
|
610
|
+
if (enabledDatasets & _datasets.EnabledDatasets.Scrutins) {
|
|
611
|
+
var _iterator11 = _createForOfIteratorHelper(_datasets.datasets.scrutins),
|
|
612
|
+
_step11;
|
|
398
613
|
|
|
399
|
-
|
|
400
|
-
|
|
614
|
+
try {
|
|
615
|
+
for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
|
|
616
|
+
var _dataset4 = _step11.value;
|
|
401
617
|
|
|
402
|
-
|
|
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
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
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
|
-
|
|
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
|
-
|
|
429
|
-
|
|
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
|
-
|
|
433
|
-
|
|
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
|
-
|
|
445
|
-
|
|
446
|
-
|
|
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(
|
|
711
|
+
console.log("Cleaning directory: ".concat(datasetCleanDir, "\u2026"));
|
|
450
712
|
}
|
|
451
713
|
|
|
452
|
-
|
|
714
|
+
_fsExtra["default"].ensureDirSync(datasetCleanDir);
|
|
453
715
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
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
|
-
|
|
460
|
-
|
|
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
|
-
|
|
739
|
+
var error = false;
|
|
466
740
|
|
|
467
741
|
if (options.commit) {
|
|
468
742
|
git.commit(repositoryDir, "Nouvelle moisson");
|
|
469
743
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
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
|
-
|
|
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
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
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
|
-
|
|
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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
|